@supertiny99/easy-skill 1.0.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 supertiny99
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,121 @@
1
+ # easy-skill
2
+
3
+ 🛠️ TUI tool for managing skills - download, organize and create symlinks for `.claude` and `.trae`.
4
+
5
+ [![npm version](https://badge.fury.io/js/%40supertiny99%2Feasy-skill.svg)](https://www.npmjs.com/package/@supertiny99/easy-skill)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ ## ✨ Features
9
+
10
+ - 📥 **Smart Download** - Auto-detect branches and skill candidates from Git repos
11
+ - 🔍 **Repository Explorer** - Browse and multi-select skills from any repo
12
+ - 🔗 **Batch Link/Unlink** - Manage symlinks across multiple IDEs at once
13
+ - 📋 **Status Overview** - View all skills and their link status
14
+ - ⚡ **Quick Actions** - Toggle all, rename conflicts, skip duplicates
15
+
16
+ ## 🚀 Installation
17
+
18
+ ```bash
19
+ npm install -g @supertiny99/easy-skill
20
+ ```
21
+
22
+ ## 📖 Usage
23
+
24
+ ### Interactive TUI (Recommended)
25
+
26
+ ```bash
27
+ easy-skill
28
+ # or short alias
29
+ es
30
+ ```
31
+
32
+ ### TUI Flow
33
+
34
+ ```
35
+ 1. Select action (Download / Link / Unlink / List / Remove)
36
+ 2. For Git downloads:
37
+ - Enter repository URL
38
+ - Select branch from list
39
+ - Multi-select skills to download ([space] select, [a] toggle all)
40
+ - Handle conflicts (overwrite/rename/skip/reselect)
41
+ - Multi-select IDEs to create symlinks
42
+ ```
43
+
44
+ ### CLI Commands
45
+
46
+ ```bash
47
+ # Download from Git (with smart explore)
48
+ easy-skill download https://github.com/user/skills.git
49
+
50
+ # Download with options
51
+ easy-skill download https://github.com/user/skills.git \
52
+ --branch main \
53
+ --subdir my-skill \
54
+ --id custom-name \
55
+ --link
56
+
57
+ # Link/Unlink skills
58
+ easy-skill link my-skill --claude --trae
59
+ easy-skill unlink my-skill
60
+
61
+ # List all skills
62
+ easy-skill list # or: es ls
63
+
64
+ # Remove skill
65
+ easy-skill remove my-skill # or: es rm my-skill --force
66
+ ```
67
+
68
+ ## 📁 Directory Structure
69
+
70
+ ```
71
+ your-project/
72
+ ├── skills/ # Downloaded skills
73
+ │ ├── skill-1/
74
+ │ └── skill-2/
75
+ ├── .claude/skills/ # Claude symlinks
76
+ │ ├── skill-1 -> ../../skills/skill-1
77
+ │ └── skill-2 -> ../../skills/skill-2
78
+ └── .trae/skills/ # Trae symlinks
79
+ ├── skill-1 -> ../../skills/skill-1
80
+ └── skill-2 -> ../../skills/skill-2
81
+ ```
82
+
83
+ ## 🎯 Supported IDEs
84
+
85
+ | IDE | Skill Directory |
86
+ |-----|-----------------|
87
+ | 🤖 Claude | `.claude/skills/` |
88
+ | 🚀 Trae | `.trae/skills/` |
89
+
90
+ ## 🔧 Development
91
+
92
+ ```bash
93
+ # Clone and install
94
+ git clone https://github.com/supertiny99/easy-skill.git
95
+ cd easy-skill
96
+ npm install
97
+
98
+ # Build and link globally
99
+ npm run build
100
+ npm link
101
+
102
+ # Run in dev mode
103
+ npm run dev
104
+ ```
105
+
106
+ ## 📦 Release
107
+
108
+ ```bash
109
+ # Patch release (1.0.0 -> 1.0.1)
110
+ npm run release:patch
111
+
112
+ # Minor release (1.0.0 -> 1.1.0)
113
+ npm run release:minor
114
+
115
+ # Major release (1.0.0 -> 2.0.0)
116
+ npm run release:major
117
+ ```
118
+
119
+ ## 📄 License
120
+
121
+ MIT © [supertiny99](https://github.com/supertiny99)
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,248 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const commander_1 = require("commander");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const prompts_1 = __importDefault(require("prompts"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
+ const quick_select_1 = require("./ui/quick-select");
13
+ const downloader_1 = require("./lib/skill/downloader");
14
+ const linker_1 = require("./lib/skill/linker");
15
+ const SKILLS_DIR = 'skills';
16
+ const program = new commander_1.Command();
17
+ program
18
+ .name('easy-skill')
19
+ .description('TUI tool for managing skills - download, organize and create symlinks')
20
+ .version('1.0.0');
21
+ // Default action: TUI quick select
22
+ program
23
+ .action(async () => {
24
+ await (0, quick_select_1.quickSelect)();
25
+ });
26
+ // Download command
27
+ program
28
+ .command('download <url>')
29
+ .alias('dl')
30
+ .description('Download a skill from git repository')
31
+ .option('-b, --branch <branch>', 'Git branch')
32
+ .option('-s, --subdir <subdir>', 'Subdirectory in the repository')
33
+ .option('-i, --id <id>', 'Skill ID (folder name)')
34
+ .option('-l, --link', 'Create symlinks after download')
35
+ .action(async (url, options) => {
36
+ try {
37
+ const skillId = options.id || path_1.default.basename(url, '.git').replace(/^skill-/, '');
38
+ const targetDir = path_1.default.join(process.cwd(), SKILLS_DIR);
39
+ const source = {
40
+ type: 'git',
41
+ url,
42
+ branch: options.branch,
43
+ subdir: options.subdir
44
+ };
45
+ if (await (0, downloader_1.skillExists)(targetDir, skillId)) {
46
+ const { overwrite } = await (0, prompts_1.default)({
47
+ type: 'confirm',
48
+ name: 'overwrite',
49
+ message: `Skill "${skillId}" exists. Overwrite?`,
50
+ initial: false
51
+ });
52
+ if (!overwrite) {
53
+ console.log(chalk_1.default.yellow('Cancelled'));
54
+ return;
55
+ }
56
+ }
57
+ console.log(chalk_1.default.blue(`Downloading skill "${skillId}"...`));
58
+ const skill = await (0, downloader_1.downloadSkill)(source, targetDir, skillId);
59
+ console.log(chalk_1.default.green(`✓ Downloaded to: ${skill.localPath}`));
60
+ if (options.link) {
61
+ for (const ide of linker_1.SUPPORTED_IDES) {
62
+ try {
63
+ const link = await (0, linker_1.linkSkillToIDE)(skill.localPath, skillId, ide);
64
+ console.log(chalk_1.default.green(`✓ Linked to ${ide}: ${link.targetPath}`));
65
+ }
66
+ catch (err) {
67
+ console.error(chalk_1.default.red(`✗ Failed to link to ${ide}: ${err.message}`));
68
+ }
69
+ }
70
+ }
71
+ }
72
+ catch (err) {
73
+ console.error(chalk_1.default.red(`Error: ${err.message}`));
74
+ process.exit(1);
75
+ }
76
+ });
77
+ // Link command
78
+ program
79
+ .command('link <skill-id>')
80
+ .description('Create symlinks for a skill')
81
+ .option('--claude', 'Link to .claude/skills')
82
+ .option('--trae', 'Link to .trae/skills')
83
+ .option('-a, --all', 'Link to all supported IDEs')
84
+ .action(async (skillId, options) => {
85
+ try {
86
+ const targetDir = path_1.default.join(process.cwd(), SKILLS_DIR);
87
+ const skillPath = path_1.default.join(targetDir, skillId);
88
+ if (!(await fs_extra_1.default.pathExists(skillPath))) {
89
+ console.error(chalk_1.default.red(`Skill "${skillId}" not found in ${SKILLS_DIR}/`));
90
+ process.exit(1);
91
+ }
92
+ let ides = [];
93
+ if (options.all) {
94
+ ides = [...linker_1.SUPPORTED_IDES];
95
+ }
96
+ else {
97
+ if (options.claude)
98
+ ides.push('claude');
99
+ if (options.trae)
100
+ ides.push('trae');
101
+ }
102
+ if (ides.length === 0) {
103
+ ides = [...linker_1.SUPPORTED_IDES]; // Default to all
104
+ }
105
+ for (const ide of ides) {
106
+ try {
107
+ const link = await (0, linker_1.linkSkillToIDE)(skillPath, skillId, ide);
108
+ console.log(chalk_1.default.green(`✓ Linked to ${ide}: ${link.targetPath}`));
109
+ }
110
+ catch (err) {
111
+ console.error(chalk_1.default.red(`✗ Failed to link to ${ide}: ${err.message}`));
112
+ }
113
+ }
114
+ }
115
+ catch (err) {
116
+ console.error(chalk_1.default.red(`Error: ${err.message}`));
117
+ process.exit(1);
118
+ }
119
+ });
120
+ // Unlink command
121
+ program
122
+ .command('unlink <skill-id>')
123
+ .description('Remove symlinks for a skill')
124
+ .option('--claude', 'Unlink from .claude/skills')
125
+ .option('--trae', 'Unlink from .trae/skills')
126
+ .option('-a, --all', 'Unlink from all IDEs')
127
+ .action(async (skillId, options) => {
128
+ try {
129
+ let ides = [];
130
+ if (options.all) {
131
+ ides = [...linker_1.SUPPORTED_IDES];
132
+ }
133
+ else {
134
+ if (options.claude)
135
+ ides.push('claude');
136
+ if (options.trae)
137
+ ides.push('trae');
138
+ }
139
+ if (ides.length === 0) {
140
+ ides = [...linker_1.SUPPORTED_IDES];
141
+ }
142
+ for (const ide of ides) {
143
+ const status = await (0, linker_1.checkSymlinkStatus)(skillId, ide);
144
+ if (status.exists) {
145
+ await (0, linker_1.unlinkSkillFromIDE)(skillId, ide);
146
+ console.log(chalk_1.default.green(`✓ Unlinked from ${ide}`));
147
+ }
148
+ else {
149
+ console.log(chalk_1.default.gray(` Not linked to ${ide}`));
150
+ }
151
+ }
152
+ }
153
+ catch (err) {
154
+ console.error(chalk_1.default.red(`Error: ${err.message}`));
155
+ process.exit(1);
156
+ }
157
+ });
158
+ // List command
159
+ program
160
+ .command('list')
161
+ .alias('ls')
162
+ .description('List all skills and their links')
163
+ .action(async () => {
164
+ try {
165
+ const targetDir = path_1.default.join(process.cwd(), SKILLS_DIR);
166
+ const skills = await (0, downloader_1.listLocalSkills)(targetDir);
167
+ console.log(chalk_1.default.bold('\n📦 Local Skills:'));
168
+ if (skills.length === 0) {
169
+ console.log(chalk_1.default.gray(' No skills found'));
170
+ }
171
+ else {
172
+ for (const skillId of skills) {
173
+ console.log(` - ${chalk_1.default.cyan(skillId)}`);
174
+ for (const ide of linker_1.SUPPORTED_IDES) {
175
+ const status = await (0, linker_1.checkSymlinkStatus)(skillId, ide);
176
+ if (status.exists) {
177
+ const icon = status.valid ? chalk_1.default.green('✓') : chalk_1.default.red('✗');
178
+ console.log(chalk_1.default.gray(` ${icon} ${ide}`));
179
+ }
180
+ }
181
+ }
182
+ }
183
+ console.log(chalk_1.default.bold('\n🔗 IDE Links:'));
184
+ for (const ide of linker_1.SUPPORTED_IDES) {
185
+ const linkedSkills = await (0, linker_1.getLinkedSkills)(ide);
186
+ console.log(chalk_1.default.cyan(` ${ide}:`));
187
+ if (linkedSkills.length === 0) {
188
+ console.log(chalk_1.default.gray(' No skills linked'));
189
+ }
190
+ else {
191
+ for (const link of linkedSkills) {
192
+ const valid = link.sourcePath && await fs_extra_1.default.pathExists(link.sourcePath);
193
+ const icon = valid ? chalk_1.default.green('✓') : chalk_1.default.red('✗');
194
+ console.log(` ${icon} ${link.skillId}`);
195
+ }
196
+ }
197
+ }
198
+ console.log('');
199
+ }
200
+ catch (err) {
201
+ console.error(chalk_1.default.red(`Error: ${err.message}`));
202
+ process.exit(1);
203
+ }
204
+ });
205
+ // Remove command
206
+ program
207
+ .command('remove <skill-id>')
208
+ .alias('rm')
209
+ .description('Remove a skill and its symlinks')
210
+ .option('-f, --force', 'Skip confirmation')
211
+ .action(async (skillId, options) => {
212
+ try {
213
+ const targetDir = path_1.default.join(process.cwd(), SKILLS_DIR);
214
+ if (!(await (0, downloader_1.skillExists)(targetDir, skillId))) {
215
+ console.error(chalk_1.default.red(`Skill "${skillId}" not found`));
216
+ process.exit(1);
217
+ }
218
+ if (!options.force) {
219
+ const { confirm } = await (0, prompts_1.default)({
220
+ type: 'confirm',
221
+ name: 'confirm',
222
+ message: `Remove skill "${skillId}" and its symlinks?`,
223
+ initial: false
224
+ });
225
+ if (!confirm) {
226
+ console.log(chalk_1.default.yellow('Cancelled'));
227
+ return;
228
+ }
229
+ }
230
+ // Remove symlinks
231
+ for (const ide of linker_1.SUPPORTED_IDES) {
232
+ const status = await (0, linker_1.checkSymlinkStatus)(skillId, ide);
233
+ if (status.exists) {
234
+ await (0, linker_1.unlinkSkillFromIDE)(skillId, ide);
235
+ console.log(chalk_1.default.gray(` Unlinked from ${ide}`));
236
+ }
237
+ }
238
+ // Remove skill
239
+ await (0, downloader_1.removeSkill)(targetDir, skillId);
240
+ console.log(chalk_1.default.green(`✓ Removed skill "${skillId}"`));
241
+ }
242
+ catch (err) {
243
+ console.error(chalk_1.default.red(`Error: ${err.message}`));
244
+ process.exit(1);
245
+ }
246
+ });
247
+ program.parse();
248
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { SkillSource, SkillInfo } from './schema';
2
+ export declare function downloadSkill(source: SkillSource, targetDir: string, skillId: string): Promise<SkillInfo>;
3
+ export declare function skillExists(targetDir: string, skillId: string): Promise<boolean>;
4
+ export declare function removeSkill(targetDir: string, skillId: string): Promise<void>;
5
+ export declare function listLocalSkills(targetDir: string): Promise<string[]>;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.downloadSkill = downloadSkill;
7
+ exports.skillExists = skillExists;
8
+ exports.removeSkill = removeSkill;
9
+ exports.listLocalSkills = listLocalSkills;
10
+ const path_1 = __importDefault(require("path"));
11
+ const fs_extra_1 = __importDefault(require("fs-extra"));
12
+ const simple_git_1 = __importDefault(require("simple-git"));
13
+ const git = (0, simple_git_1.default)();
14
+ async function downloadSkill(source, targetDir, skillId) {
15
+ const skillPath = path_1.default.join(targetDir, skillId);
16
+ if (source.type === 'git') {
17
+ return downloadFromGit(source, skillPath, skillId);
18
+ }
19
+ else if (source.type === 'local') {
20
+ return copyFromLocal(source, skillPath, skillId);
21
+ }
22
+ else {
23
+ throw new Error(`Unsupported source type: ${source.type}`);
24
+ }
25
+ }
26
+ async function downloadFromGit(source, targetPath, skillId) {
27
+ // Ensure parent directory exists
28
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(targetPath));
29
+ // Remove existing if present
30
+ if (await fs_extra_1.default.pathExists(targetPath)) {
31
+ await fs_extra_1.default.remove(targetPath);
32
+ }
33
+ // Clone repository
34
+ const cloneOptions = ['--depth', '1'];
35
+ if (source.branch) {
36
+ cloneOptions.push('--branch', source.branch);
37
+ }
38
+ await git.clone(source.url, targetPath, cloneOptions);
39
+ // If subdir specified, move contents up
40
+ if (source.subdir) {
41
+ const subdirPath = path_1.default.join(targetPath, source.subdir);
42
+ if (await fs_extra_1.default.pathExists(subdirPath)) {
43
+ const tempPath = `${targetPath}_temp`;
44
+ await fs_extra_1.default.move(subdirPath, tempPath);
45
+ await fs_extra_1.default.remove(targetPath);
46
+ await fs_extra_1.default.move(tempPath, targetPath);
47
+ }
48
+ }
49
+ // Remove .git folder to save space
50
+ const gitDir = path_1.default.join(targetPath, '.git');
51
+ if (await fs_extra_1.default.pathExists(gitDir)) {
52
+ await fs_extra_1.default.remove(gitDir);
53
+ }
54
+ return {
55
+ id: skillId,
56
+ name: skillId,
57
+ source,
58
+ localPath: targetPath
59
+ };
60
+ }
61
+ async function copyFromLocal(source, targetPath, skillId) {
62
+ const sourcePath = source.subdir
63
+ ? path_1.default.join(source.url, source.subdir)
64
+ : source.url;
65
+ if (!(await fs_extra_1.default.pathExists(sourcePath))) {
66
+ throw new Error(`Source path not found: ${sourcePath}`);
67
+ }
68
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(targetPath));
69
+ if (await fs_extra_1.default.pathExists(targetPath)) {
70
+ await fs_extra_1.default.remove(targetPath);
71
+ }
72
+ await fs_extra_1.default.copy(sourcePath, targetPath);
73
+ return {
74
+ id: skillId,
75
+ name: skillId,
76
+ source,
77
+ localPath: targetPath
78
+ };
79
+ }
80
+ async function skillExists(targetDir, skillId) {
81
+ const skillPath = path_1.default.join(targetDir, skillId);
82
+ return fs_extra_1.default.pathExists(skillPath);
83
+ }
84
+ async function removeSkill(targetDir, skillId) {
85
+ const skillPath = path_1.default.join(targetDir, skillId);
86
+ if (await fs_extra_1.default.pathExists(skillPath)) {
87
+ await fs_extra_1.default.remove(skillPath);
88
+ }
89
+ }
90
+ async function listLocalSkills(targetDir) {
91
+ if (!(await fs_extra_1.default.pathExists(targetDir))) {
92
+ return [];
93
+ }
94
+ const entries = await fs_extra_1.default.readdir(targetDir, { withFileTypes: true });
95
+ return entries
96
+ .filter(entry => entry.isDirectory())
97
+ .map(entry => entry.name);
98
+ }
99
+ //# sourceMappingURL=downloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloader.js","sourceRoot":"","sources":["../../../src/lib/skill/downloader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface RemoteBranch {
2
+ name: string;
3
+ isDefault: boolean;
4
+ }
5
+ export interface SkillCandidate {
6
+ name: string;
7
+ path: string;
8
+ hasSkillFile: boolean;
9
+ description?: string;
10
+ }
11
+ export interface RepoExploreResult {
12
+ branches: RemoteBranch[];
13
+ skills: SkillCandidate[];
14
+ tempPath: string;
15
+ }
16
+ /**
17
+ * Get remote branches from a Git repository URL
18
+ */
19
+ export declare function getRemoteBranches(url: string): Promise<RemoteBranch[]>;
20
+ /**
21
+ * Clone repository to temp directory and explore its structure
22
+ */
23
+ export declare function exploreRepository(url: string, branch?: string): Promise<RepoExploreResult>;
24
+ /**
25
+ * Copy skill from temp explore directory to target
26
+ */
27
+ export declare function copySkillFromExplore(tempPath: string, skillPath: string, targetDir: string, skillId: string): Promise<string>;
28
+ /**
29
+ * Cleanup temp explore directory
30
+ */
31
+ export declare function cleanupExplore(tempPath: string): Promise<void>;