@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 +21 -0
- package/README.md +121 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +248 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/skill/downloader.d.ts +5 -0
- package/dist/lib/skill/downloader.js +99 -0
- package/dist/lib/skill/downloader.js.map +1 -0
- package/dist/lib/skill/explorer.d.ts +31 -0
- package/dist/lib/skill/explorer.js +218 -0
- package/dist/lib/skill/explorer.js.map +1 -0
- package/dist/lib/skill/linker.d.ts +18 -0
- package/dist/lib/skill/linker.js +115 -0
- package/dist/lib/skill/linker.js.map +1 -0
- package/dist/lib/skill/schema.d.ts +27 -0
- package/dist/lib/skill/schema.js +9 -0
- package/dist/lib/skill/schema.js.map +1 -0
- package/dist/ui/quick-select.d.ts +1 -0
- package/dist/ui/quick-select.js +618 -0
- package/dist/ui/quick-select.js.map +1 -0
- package/package.json +78 -0
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
|
+
[](https://www.npmjs.com/package/@supertiny99/easy-skill)
|
|
6
|
+
[](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)
|
package/dist/index.d.ts
ADDED
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>;
|