skillctl 0.0.6 → 0.0.7
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 +70 -188
- package/package.json +7 -1
- package/scripts/install.js +1 -1
- package/.github/workflows/release.yml +0 -42
- package/BOOTSTRAP.md +0 -308
- package/Cargo.toml +0 -26
- package/EXAMPLES.md +0 -236
- package/src/main.rs +0 -227
package/README.md
CHANGED
|
@@ -1,236 +1,118 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SkillCtl: The Agent Skill Manager ⬢
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**SkillCtl** is the professional standard for managing AI Agent Skills. It allows you to discover, install, and synchronize robust agent behaviors across multiple AI editors (Cursor, Windsurf, Antigravity, VS Code, and more).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
> **Concept**: Think of it as `npm` or `cargo`, but for your AI's brain. Instead of packages, you install **skills**—specialized prompts and instructions that give your agent new capabilities.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
---
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## 🚀 Key Features
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
- **🛡️ Secure by Design**: Integrity checks (SHA-256) ensure the skills you install are exactly what you expect. No silent changes.
|
|
12
|
+
- **🌐 Universal Compatibility**: One tool to rule them all. Works with:
|
|
13
|
+
- Cursor (`.cursorrules`)
|
|
14
|
+
- Windsurf (`.windsurfrules`)
|
|
15
|
+
- Antigravity (`.agent/`)
|
|
16
|
+
- VS Code, GitHub Copilot, Cline, Roo, OpenHands, and more.
|
|
17
|
+
- **⚡ Supercharged Workflow**:
|
|
18
|
+
- `search`: Find skills from the community registry instantly.
|
|
19
|
+
- `add`: Install skills directly from GitHub URLs.
|
|
20
|
+
- `list`: Keep track of your installed capabilities.
|
|
21
|
+
- **✨ Zero Config**: Smart defaults that just work.
|
|
14
22
|
|
|
15
|
-
|
|
16
|
-
npx skillctl add https://github.com/wshobson/agents --skill typescript
|
|
23
|
+
---
|
|
17
24
|
|
|
18
|
-
|
|
19
|
-
npx skillctl list
|
|
25
|
+
## 📦 Installation
|
|
20
26
|
|
|
21
|
-
|
|
22
|
-
npx skillctl update
|
|
23
|
-
|
|
24
|
-
# 5. Sincronizar con editores
|
|
25
|
-
npx skillctl sync --editors cursor,antigravity
|
|
26
|
-
```
|
|
27
|
+
You don't need to install anything globally. Run it directly with `npx` (Node.js) or `cargo` (Rust).
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
### Using Node.js (Recommended)
|
|
29
30
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
agent-skill/
|
|
34
|
-
├── src/ # Código Rust
|
|
35
|
-
│ └── main.rs
|
|
36
|
-
├── bin/ # Wrapper Node.js
|
|
37
|
-
│ └── run.js
|
|
38
|
-
├── scripts/ # Scripts de instalación
|
|
39
|
-
│ └── install.js
|
|
40
|
-
├── Cargo.toml # Configuración Rust
|
|
41
|
-
└── package.json # Configuración NPM
|
|
31
|
+
```bash
|
|
32
|
+
npx skillctl init
|
|
42
33
|
```
|
|
43
34
|
|
|
44
|
-
###
|
|
35
|
+
### Using Rust
|
|
45
36
|
|
|
46
37
|
```bash
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
# Compilar en modo release
|
|
51
|
-
cargo build --release
|
|
52
|
-
|
|
53
|
-
# El binario estará en: target/release/skillctl
|
|
38
|
+
cargo install skillctl
|
|
39
|
+
skillctl init
|
|
54
40
|
```
|
|
55
41
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
1. **Asegúrate de que `Cargo.toml` tenga la versión `0.0.1`**
|
|
59
|
-
2. **Compila el binario** (paso anterior)
|
|
60
|
-
3. **Sube tus cambios a GitHub:**
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
git add .
|
|
64
|
-
git commit -m "Initial release v0.0.1"
|
|
65
|
-
git push origin main
|
|
66
|
-
```
|
|
42
|
+
---
|
|
67
43
|
|
|
68
|
-
|
|
69
|
-
- Ve a tu repositorio en GitHub
|
|
70
|
-
- Click en "Releases" → "Draft a new release"
|
|
71
|
-
- Tag: `v0.0.1`
|
|
72
|
-
- Title: `v0.0.1 - Initial Release`
|
|
73
|
-
- **Sube los binarios compilados:**
|
|
74
|
-
- `target/release/skillctl` → Renombrar a `skillctl-linux`
|
|
75
|
-
- Para Windows: `target/release/skillctl.exe` → Renombrar a `skillctl-win.exe`
|
|
76
|
-
- Para macOS: compilar en Mac y renombrar a `skillctl-macos`
|
|
77
|
-
- Publica la Release
|
|
44
|
+
## 📖 Usage Guide
|
|
78
45
|
|
|
79
|
-
###
|
|
46
|
+
### 1. Initialize your Project
|
|
80
47
|
|
|
81
|
-
|
|
48
|
+
Sets up the necessary configuration files and detects your AI editor automatically.
|
|
82
49
|
|
|
83
50
|
```bash
|
|
84
|
-
|
|
85
|
-
node scripts/install.js
|
|
86
|
-
|
|
87
|
-
# Verificar que se descargó el binario
|
|
88
|
-
ls -la bin/
|
|
89
|
-
|
|
90
|
-
# Probar el comando
|
|
91
|
-
node bin/run.js init
|
|
92
|
-
node bin/run.js list
|
|
51
|
+
npx skillctl init
|
|
93
52
|
```
|
|
94
53
|
|
|
95
|
-
###
|
|
54
|
+
### 2. Discover Capabilities
|
|
96
55
|
|
|
97
|
-
|
|
98
|
-
# Login en NPM (primera vez)
|
|
99
|
-
npm login
|
|
56
|
+
Search the decentralized registry for new skills.
|
|
100
57
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
### Paso 5: Automatización con GitHub Actions
|
|
106
|
-
|
|
107
|
-
El archivo `.github/workflows/release.yml` automatiza la compilación y publicación:
|
|
108
|
-
|
|
109
|
-
```yaml
|
|
110
|
-
name: Release
|
|
111
|
-
|
|
112
|
-
on:
|
|
113
|
-
push:
|
|
114
|
-
tags:
|
|
115
|
-
- "v*"
|
|
116
|
-
|
|
117
|
-
jobs:
|
|
118
|
-
build:
|
|
119
|
-
strategy:
|
|
120
|
-
matrix:
|
|
121
|
-
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
122
|
-
runs-on: ${{ matrix.os }}
|
|
123
|
-
|
|
124
|
-
steps:
|
|
125
|
-
- uses: actions/checkout@v3
|
|
126
|
-
|
|
127
|
-
- name: Install Rust
|
|
128
|
-
uses: actions-rs/toolchain@v1
|
|
129
|
-
with:
|
|
130
|
-
toolchain: stable
|
|
131
|
-
|
|
132
|
-
- name: Build
|
|
133
|
-
run: cargo build --release
|
|
134
|
-
|
|
135
|
-
- name: Upload Release Asset
|
|
136
|
-
uses: actions/upload-release-asset@v1
|
|
137
|
-
env:
|
|
138
|
-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
139
|
-
with:
|
|
140
|
-
upload_url: ${{ github.event.release.upload_url }}
|
|
141
|
-
asset_path: ./target/release/skill-cli${{ matrix.os == 'windows-latest' && '.exe' || '' }}
|
|
142
|
-
asset_name: skill-cli-${{ matrix.os == 'ubuntu-latest' && 'linux' || matrix.os == 'windows-latest' && 'win.exe' || 'macos' }}
|
|
143
|
-
asset_content_type: application/octet-stream
|
|
58
|
+
```bash
|
|
59
|
+
npx skillctl search
|
|
144
60
|
```
|
|
145
61
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
1. **Actualiza la versión en ambos archivos:**
|
|
149
|
-
- `Cargo.toml`: `version = "0.0.2"`
|
|
150
|
-
- `package.json`: `"version": "0.0.2"`
|
|
151
|
-
- `scripts/install.js`: `const VERSION = "v0.0.2"`
|
|
62
|
+
> _Select a skill from the list to install it immediately._
|
|
152
63
|
|
|
153
|
-
|
|
64
|
+
### 3. Add a Skill Manually
|
|
154
65
|
|
|
155
|
-
|
|
156
|
-
cargo build --release
|
|
157
|
-
git add .
|
|
158
|
-
git commit -m "Bump version to 0.0.2"
|
|
159
|
-
git tag v0.0.2
|
|
160
|
-
git push origin main --tags
|
|
161
|
-
```
|
|
66
|
+
Install a skill directly from a Git repository or URL.
|
|
162
67
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
```bash
|
|
167
|
-
npm publish
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
## 📦 Comandos Disponibles
|
|
68
|
+
```bash
|
|
69
|
+
npx skillctl add <url> --skill <name>
|
|
70
|
+
```
|
|
171
71
|
|
|
172
|
-
|
|
173
|
-
| ---------------------------- | ----------------------------------------------------- |
|
|
174
|
-
| `init` | Inicializa un nuevo proyecto (crea `skills.toml`) |
|
|
175
|
-
| `add <url> --skill <nombre>` | Añade una nueva skill |
|
|
176
|
-
| `list` | Lista todas las skills instaladas |
|
|
177
|
-
| `update` | Actualiza todas las skills desde sus URLs |
|
|
178
|
-
| `sync --editors <lista>` | Sincroniza con editores (cursor, antigravity, vscode) |
|
|
72
|
+
### 4. Verify Installation
|
|
179
73
|
|
|
180
|
-
|
|
74
|
+
See what skills are currently active in your environment.
|
|
181
75
|
|
|
182
76
|
```bash
|
|
183
|
-
|
|
184
|
-
cargo build
|
|
185
|
-
|
|
186
|
-
# Ejecutar directamente
|
|
187
|
-
cargo run -- init
|
|
188
|
-
cargo run -- list
|
|
189
|
-
|
|
190
|
-
# Probar el wrapper NPM
|
|
191
|
-
node bin/run.js init
|
|
77
|
+
npx skillctl list
|
|
192
78
|
```
|
|
193
79
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
- **El binario debe estar en GitHub Releases** antes de que el script de NPM pueda descargarlo
|
|
197
|
-
- **La versión en `scripts/install.js`** debe coincidir con el tag de GitHub
|
|
198
|
-
- **Los nombres de los binarios** deben seguir el formato: `skill-cli-{platform}.exe`
|
|
199
|
-
- Linux: `skill-cli-linux`
|
|
200
|
-
- Windows: `skill-cli-win.exe`
|
|
201
|
-
- macOS: `skill-cli-macos`
|
|
80
|
+
### 5. Restore & Sync
|
|
202
81
|
|
|
203
|
-
|
|
82
|
+
Downloading a project? Restore all skills defined in `skills.json` with a single command.
|
|
204
83
|
|
|
205
|
-
|
|
84
|
+
```bash
|
|
85
|
+
npx skillctl install
|
|
86
|
+
```
|
|
206
87
|
|
|
207
|
-
|
|
208
|
-
2. Al contribuir, aceptas que tu código se licenciará bajo la misma licencia propietaria
|
|
209
|
-
3. No se permite el uso de contribuciones en proyectos competidores
|
|
210
|
-
4. Contacta con el titular de los derechos antes de realizar contribuciones significativas
|
|
88
|
+
---
|
|
211
89
|
|
|
212
|
-
|
|
90
|
+
## 🔧 Architecture
|
|
213
91
|
|
|
214
|
-
|
|
215
|
-
2. Fork el proyecto (solo para desarrollo autorizado)
|
|
216
|
-
3. Crea una rama para tu feature (`git checkout -b feature/AmazingFeature`)
|
|
217
|
-
4. Commit tus cambios (`git commit -m 'Add some AmazingFeature'`)
|
|
218
|
-
5. Push a la rama (`git push origin feature/AmazingFeature`)
|
|
219
|
-
6. Abre un Pull Request (sujeto a revisión y aceptación de términos)
|
|
92
|
+
SkillCtl creates a `.agent/skills` (or editor-specific) directory and injects a reference into your editor's rule file.
|
|
220
93
|
|
|
221
|
-
|
|
94
|
+
**Directory Structure:**
|
|
222
95
|
|
|
223
|
-
|
|
96
|
+
```
|
|
97
|
+
my-project/
|
|
98
|
+
├── .agent/
|
|
99
|
+
│ ├── skills/
|
|
100
|
+
│ │ └── find-files/
|
|
101
|
+
│ │ └── SKILL.md <-- The Brain
|
|
102
|
+
│ └── rules/
|
|
103
|
+
│ └── rules.md <-- The Context Linker
|
|
104
|
+
├── skills.json <-- Lockfile (Registry & Integrity)
|
|
105
|
+
└── src/
|
|
106
|
+
```
|
|
224
107
|
|
|
225
|
-
|
|
108
|
+
---
|
|
226
109
|
|
|
227
|
-
|
|
110
|
+
## 🤝 Contributing
|
|
228
111
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
- ❌ No se permite ingeniería inversa
|
|
232
|
-
- ✅ Uso personal y no comercial permitido
|
|
112
|
+
We welcome contributions to the **Registry**!
|
|
113
|
+
To add your skill, submit a PR to `registry.json` with your skill's details.
|
|
233
114
|
|
|
234
|
-
|
|
115
|
+
## 📄 License
|
|
235
116
|
|
|
236
|
-
|
|
117
|
+
Proprietary Software. See [LICENSE](LICENSE) for details.
|
|
118
|
+
Built with ❤️ for the AI Engineering Community.
|
package/package.json
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skillctl",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "Gestor de Skills para Agentes de IA",
|
|
5
5
|
"bin": {
|
|
6
6
|
"skillctl": "bin/run.js"
|
|
7
7
|
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin",
|
|
10
|
+
"scripts",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
8
14
|
"scripts": {
|
|
9
15
|
"postinstall": "node scripts/install.js"
|
|
10
16
|
},
|
package/scripts/install.js
CHANGED
|
@@ -5,7 +5,7 @@ const os = require('os');
|
|
|
5
5
|
|
|
6
6
|
// Configuración
|
|
7
7
|
const REPO = "joeldevz/agent-skill";
|
|
8
|
-
const VERSION = "v0.0.
|
|
8
|
+
const VERSION = "v0.0.7"; // ¡CAMBIA ESTO PARA QUE COINCIDA CON TU TAG DE GITHUB!
|
|
9
9
|
const BIN_NAME = "skillctl";
|
|
10
10
|
|
|
11
11
|
// Detectar plataforma
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
name: Release
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
tags:
|
|
6
|
-
- 'v*' # Se activa cuando subes un tag como v0.0.1
|
|
7
|
-
permissions:
|
|
8
|
-
contents: write
|
|
9
|
-
jobs:
|
|
10
|
-
build:
|
|
11
|
-
name: Build for ${{ matrix.os }}
|
|
12
|
-
runs-on: ${{ matrix.os }}
|
|
13
|
-
strategy:
|
|
14
|
-
matrix:
|
|
15
|
-
include:
|
|
16
|
-
- os: ubuntu-latest
|
|
17
|
-
artifact_name: skillctl
|
|
18
|
-
asset_name: skillctl-linux
|
|
19
|
-
- os: macos-latest
|
|
20
|
-
artifact_name: skillctl
|
|
21
|
-
asset_name: skillctl-macos
|
|
22
|
-
- os: windows-latest
|
|
23
|
-
artifact_name: skillctl.exe
|
|
24
|
-
asset_name: skillctl-win.exe
|
|
25
|
-
|
|
26
|
-
steps:
|
|
27
|
-
- uses: actions/checkout@v3
|
|
28
|
-
|
|
29
|
-
- name: Install Rust
|
|
30
|
-
uses: dtolnay/rust-toolchain@stable
|
|
31
|
-
|
|
32
|
-
- name: Build
|
|
33
|
-
run: cargo build --release --verbose
|
|
34
|
-
|
|
35
|
-
- name: Upload binaries to Release
|
|
36
|
-
uses: svenstaro/upload-release-action@v2
|
|
37
|
-
with:
|
|
38
|
-
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
|
39
|
-
file: target/release/${{ matrix.artifact_name }}
|
|
40
|
-
asset_name: ${{ matrix.asset_name }}
|
|
41
|
-
tag: ${{ github.ref }}
|
|
42
|
-
overwrite: true
|
package/BOOTSTRAP.md
DELETED
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
# Guía de Bootstrap: Primera Publicación
|
|
2
|
-
|
|
3
|
-
Esta guía te ayudará a publicar la primera versión del proyecto y resolver el problema del "huevo y la gallina".
|
|
4
|
-
|
|
5
|
-
## 🎯 Objetivo
|
|
6
|
-
|
|
7
|
-
Publicar la versión `v0.0.1` del proyecto para que los usuarios puedan ejecutar:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npx skillctl init
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## 📋 Pre-requisitos
|
|
14
|
-
|
|
15
|
-
- [x] Cuenta de GitHub
|
|
16
|
-
- [x] Cuenta de NPM (crear en https://www.npmjs.com/signup)
|
|
17
|
-
- [x] Rust instalado (`curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`)
|
|
18
|
-
- [x] Node.js instalado
|
|
19
|
-
- [x] Git configurado
|
|
20
|
-
|
|
21
|
-
## 🚀 Pasos para la Primera Publicación
|
|
22
|
-
|
|
23
|
-
### Paso 1: Compilar el Binario Rust
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
# Asegúrate de estar en la raíz del proyecto
|
|
27
|
-
cd /home/clasing/proyects/umibu/agent-skill
|
|
28
|
-
|
|
29
|
-
# Compilar en modo release
|
|
30
|
-
cargo build --release
|
|
31
|
-
|
|
32
|
-
# Verificar que el binario se creó correctamente
|
|
33
|
-
ls -lh target/release/skill-cli
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
**Resultado esperado:**
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
-rwxr-xr-x 1 user user 3.2M Feb 8 22:30 target/release/skillctl
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Paso 2: Probar el Binario Localmente
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
# Ejecutar el binario directamente
|
|
46
|
-
./target/release/skillctl --help
|
|
47
|
-
|
|
48
|
-
# Probar el comando init
|
|
49
|
-
./target/release/skillctl init
|
|
50
|
-
|
|
51
|
-
# Verificar que se creó skills.toml
|
|
52
|
-
cat skills.toml
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Paso 3: Preparar el Repositorio
|
|
56
|
-
|
|
57
|
-
```bash
|
|
58
|
-
# Asegúrate de que todos los cambios están commiteados
|
|
59
|
-
git status
|
|
60
|
-
|
|
61
|
-
# Si hay cambios pendientes:
|
|
62
|
-
git add .
|
|
63
|
-
git commit -m "Prepare for v0.0.1 release"
|
|
64
|
-
|
|
65
|
-
# Subir a GitHub
|
|
66
|
-
git push origin main
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Paso 4: Crear el Release en GitHub (CRÍTICO)
|
|
70
|
-
|
|
71
|
-
Este es el paso más importante. **Sin este paso, el script de NPM no podrá descargar el binario.**
|
|
72
|
-
|
|
73
|
-
#### Opción A: Manual (Recomendado para la primera vez)
|
|
74
|
-
|
|
75
|
-
1. Ve a tu repositorio: https://github.com/joeldevz/agent-skill
|
|
76
|
-
2. Click en "Releases" (en la barra lateral derecha)
|
|
77
|
-
3. Click en "Draft a new release"
|
|
78
|
-
4. Completa el formulario:
|
|
79
|
-
- **Tag version:** `v0.0.1`
|
|
80
|
-
- **Release title:** `v0.0.1 - Initial Release`
|
|
81
|
-
- **Description:**
|
|
82
|
-
|
|
83
|
-
````markdown
|
|
84
|
-
## 🎉 Primera versión de Skill CLI Tool
|
|
85
|
-
|
|
86
|
-
Gestor de Skills para Agentes de IA.
|
|
87
|
-
|
|
88
|
-
### Características
|
|
89
|
-
|
|
90
|
-
- ✅ Comando `init` para inicializar proyectos
|
|
91
|
-
- ✅ Comando `list` para listar skills
|
|
92
|
-
- ✅ Soporte para Cursor, Antigravity y VSCode
|
|
93
|
-
|
|
94
|
-
### Instalación
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
npx skillctl init
|
|
98
|
-
```
|
|
99
|
-
````
|
|
100
|
-
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
5. **IMPORTANTE: Subir los binarios**
|
|
106
|
-
- Click en "Attach binaries by dropping them here or selecting them"
|
|
107
|
-
- Sube el archivo: `target/release/skillctl`
|
|
108
|
-
- **RENOMBRA el archivo a:** `skillctl-linux` (sin extensión)
|
|
109
|
-
|
|
110
|
-
> **Nota:** Para Windows y macOS, necesitarás compilar en esas plataformas o usar GitHub Actions (ver Opción B)
|
|
111
|
-
|
|
112
|
-
6. Click en "Publish release"
|
|
113
|
-
|
|
114
|
-
#### Opción B: Automático con GitHub Actions
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
# Crear y subir el tag
|
|
118
|
-
git tag v0.0.1
|
|
119
|
-
git push origin v0.0.1
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
Esto activará el workflow `.github/workflows/release.yml` que:
|
|
123
|
-
|
|
124
|
-
1. Compilará el binario en Linux, Windows y macOS
|
|
125
|
-
2. Subirá automáticamente los binarios al release
|
|
126
|
-
|
|
127
|
-
**Espera a que termine el workflow** (ve a la pestaña "Actions" en GitHub)
|
|
128
|
-
|
|
129
|
-
### Paso 5: Verificar que el Release está Correcto
|
|
130
|
-
|
|
131
|
-
1. Ve a: https://github.com/joeldevz/agent-skill/releases/tag/v0.0.1
|
|
132
|
-
2. Verifica que aparezcan los binarios:
|
|
133
|
-
- `skill-cli-linux`
|
|
134
|
-
- `skill-cli-win.exe` (si usaste GitHub Actions)
|
|
135
|
-
- `skill-cli-macos` (si usaste GitHub Actions)
|
|
136
|
-
|
|
137
|
-
3. **Prueba la URL de descarga:**
|
|
138
|
-
|
|
139
|
-
```bash
|
|
140
|
-
# Debería descargar el binario (no dar error 404)
|
|
141
|
-
curl -L https://github.com/joeldevz/agent-skill/releases/download/v0.0.1/skillctl-linux -o test-binary
|
|
142
|
-
|
|
143
|
-
# Verificar que se descargó
|
|
144
|
-
ls -lh test-binary
|
|
145
|
-
|
|
146
|
-
# Limpiar
|
|
147
|
-
rm test-binary
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### Paso 6: Probar el Script de Instalación NPM
|
|
151
|
-
|
|
152
|
-
```bash
|
|
153
|
-
# Probar el script de descarga
|
|
154
|
-
node scripts/install.js
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
**Resultado esperado:**
|
|
158
|
-
|
|
159
|
-
```
|
|
160
|
-
⬇️ Descargando skillctl desde: https://github.com/joeldevz/agent-skill/releases/download/v0.0.1/skillctl-linux
|
|
161
|
-
✅ Instalación completada.
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
**Verificar:**
|
|
165
|
-
|
|
166
|
-
```bash
|
|
167
|
-
ls -lh bin/skillctl
|
|
168
|
-
# Debería mostrar el binario descargado
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
### Paso 7: Probar el Wrapper Completo
|
|
172
|
-
|
|
173
|
-
```bash
|
|
174
|
-
# Probar el wrapper de Node.js
|
|
175
|
-
node bin/run.js --help
|
|
176
|
-
node bin/run.js init
|
|
177
|
-
node bin/run.js list
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### Paso 8: Publicar en NPM
|
|
181
|
-
|
|
182
|
-
```bash
|
|
183
|
-
# Login en NPM (primera vez)
|
|
184
|
-
npm login
|
|
185
|
-
# Introduce tu usuario, contraseña y email
|
|
186
|
-
|
|
187
|
-
# Verificar que estás logueado
|
|
188
|
-
npm whoami
|
|
189
|
-
|
|
190
|
-
# Publicar el paquete
|
|
191
|
-
npm publish
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
**Resultado esperado:**
|
|
195
|
-
|
|
196
|
-
```
|
|
197
|
-
+ skillctl@0.0.1
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
### Paso 9: Probar la Instalación desde NPM
|
|
201
|
-
|
|
202
|
-
```bash
|
|
203
|
-
# Crear una carpeta de prueba
|
|
204
|
-
mkdir /tmp/test-skill-cli
|
|
205
|
-
cd /tmp/test-skill-cli
|
|
206
|
-
|
|
207
|
-
# Probar con npx (sin instalar)
|
|
208
|
-
npx skillctl init
|
|
209
|
-
|
|
210
|
-
# Verificar que funcionó
|
|
211
|
-
ls -la
|
|
212
|
-
# Debería mostrar skills.toml y .cursor/
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
## ✅ Checklist de Verificación
|
|
216
|
-
|
|
217
|
-
- [ ] Binario compilado correctamente
|
|
218
|
-
- [ ] Release v0.0.1 creado en GitHub
|
|
219
|
-
- [ ] Binarios subidos al release (al menos Linux)
|
|
220
|
-
- [ ] URL de descarga funciona (no da 404)
|
|
221
|
-
- [ ] Script `install.js` descarga correctamente
|
|
222
|
-
- [ ] Wrapper `run.js` ejecuta el binario
|
|
223
|
-
- [ ] Publicado en NPM
|
|
224
|
-
- [ ] `npx skill-cli-tool init` funciona
|
|
225
|
-
|
|
226
|
-
## 🐛 Troubleshooting
|
|
227
|
-
|
|
228
|
-
### Error: "404 Not Found" al descargar
|
|
229
|
-
|
|
230
|
-
**Causa:** El release no existe o los binarios no están subidos.
|
|
231
|
-
|
|
232
|
-
**Solución:**
|
|
233
|
-
|
|
234
|
-
1. Verifica que el release existe: https://github.com/joeldevz/agent-skill/releases
|
|
235
|
-
2. Verifica que el tag es exactamente `v0.0.1`
|
|
236
|
-
3. Verifica que el binario se llama exactamente `skillctl-linux`
|
|
237
|
-
|
|
238
|
-
### Error: "Permission denied" al ejecutar el binario
|
|
239
|
-
|
|
240
|
-
**Causa:** El binario no tiene permisos de ejecución.
|
|
241
|
-
|
|
242
|
-
**Solución:**
|
|
243
|
-
|
|
244
|
-
```bash
|
|
245
|
-
chmod +x bin/skillctl
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
### Error: "Package name already exists" en NPM
|
|
249
|
-
|
|
250
|
-
**Causa:** El nombre `skill-cli-tool` ya está tomado.
|
|
251
|
-
|
|
252
|
-
**Solución:**
|
|
253
|
-
|
|
254
|
-
1. Cambia el nombre en `package.json`:
|
|
255
|
-
```json
|
|
256
|
-
"name": "@tu-usuario/skillctl"
|
|
257
|
-
```
|
|
258
|
-
2. Publica de nuevo:
|
|
259
|
-
```bash
|
|
260
|
-
npm publish --access public
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
### Error: "GITHUB_TOKEN" en GitHub Actions
|
|
264
|
-
|
|
265
|
-
**Causa:** El token no tiene permisos suficientes.
|
|
266
|
-
|
|
267
|
-
**Solución:**
|
|
268
|
-
|
|
269
|
-
1. Ve a Settings → Actions → General
|
|
270
|
-
2. En "Workflow permissions", selecciona "Read and write permissions"
|
|
271
|
-
3. Guarda y vuelve a ejecutar el workflow
|
|
272
|
-
|
|
273
|
-
## 🎉 ¡Éxito!
|
|
274
|
-
|
|
275
|
-
Si llegaste aquí, tu proyecto está publicado y funcionando. Los usuarios ahora pueden ejecutar:
|
|
276
|
-
|
|
277
|
-
```bash
|
|
278
|
-
npx skillctl init
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
## 📚 Próximos Pasos
|
|
282
|
-
|
|
283
|
-
1. **Implementar el comando `add`** para añadir skills
|
|
284
|
-
2. **Añadir tests** para asegurar calidad
|
|
285
|
-
3. **Mejorar la documentación** con más ejemplos
|
|
286
|
-
4. **Crear un video tutorial** de uso
|
|
287
|
-
5. **Compartir en redes sociales** y comunidades
|
|
288
|
-
|
|
289
|
-
## 🔄 Para Futuras Versiones
|
|
290
|
-
|
|
291
|
-
Cuando quieras publicar `v0.0.2`:
|
|
292
|
-
|
|
293
|
-
1. Actualiza las versiones:
|
|
294
|
-
- `Cargo.toml`: `version = "0.0.2"`
|
|
295
|
-
- `package.json`: `"version": "0.0.2"`
|
|
296
|
-
- `scripts/install.js`: `const VERSION = "v0.0.2"`
|
|
297
|
-
|
|
298
|
-
2. Compila y publica:
|
|
299
|
-
```bash
|
|
300
|
-
cargo build --release
|
|
301
|
-
git add .
|
|
302
|
-
git commit -m "Bump version to 0.0.2"
|
|
303
|
-
git tag v0.0.2
|
|
304
|
-
git push origin main --tags
|
|
305
|
-
npm publish
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
El workflow de GitHub Actions se encargará del resto automáticamente.
|
package/Cargo.toml
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
[package]
|
|
2
|
-
name = "skillctl"
|
|
3
|
-
version = "0.0.6"
|
|
4
|
-
edition = "2021"
|
|
5
|
-
authors = ["Your Name <your.email@example.com>"]
|
|
6
|
-
description = "Gestor de Skills para Agentes de IA"
|
|
7
|
-
license-file = "LICENSE"
|
|
8
|
-
|
|
9
|
-
[[bin]]
|
|
10
|
-
name = "skillctl"
|
|
11
|
-
path = "src/main.rs"
|
|
12
|
-
|
|
13
|
-
[dependencies]
|
|
14
|
-
clap = { version = "4.4", features = ["derive"] }
|
|
15
|
-
colored = "2.0"
|
|
16
|
-
anyhow = "1.0"
|
|
17
|
-
reqwest = { version = "0.11", features = ["blocking", "json"] }
|
|
18
|
-
serde = { version = "1.0", features = ["derive"] }
|
|
19
|
-
serde_json = "1.0"
|
|
20
|
-
dialoguer = "0.11"
|
|
21
|
-
|
|
22
|
-
[profile.release]
|
|
23
|
-
opt-level = "z" # Optimizar para tamaño
|
|
24
|
-
lto = true # Link Time Optimization
|
|
25
|
-
codegen-units = 1 # Mejor optimización
|
|
26
|
-
strip = true # Eliminar símbolos de debug
|
package/EXAMPLES.md
DELETED
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
# Ejemplo de Uso: Skillctl
|
|
2
|
-
|
|
3
|
-
## Escenario: Configurar un Proyecto Nuevo
|
|
4
|
-
|
|
5
|
-
### 1. Inicializar el Proyecto
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
# Crear una nueva carpeta para tu proyecto
|
|
9
|
-
mkdir mi-proyecto-ia
|
|
10
|
-
cd mi-proyecto-ia
|
|
11
|
-
|
|
12
|
-
# Inicializar el gestor de skills
|
|
13
|
-
npx skill-cli-tool init
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
**Resultado:**
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
✅ Proyecto inicializado. Se ha creado 'skills.toml'.
|
|
20
|
-
🚀 Prueba ahora: npx skillctl add <url> --skill <nombre>
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
**Archivos creados:**
|
|
24
|
-
|
|
25
|
-
- `skills.toml` - Manifiesto de skills
|
|
26
|
-
- `.cursor/skills/` - Carpeta para skills descargadas
|
|
27
|
-
|
|
28
|
-
### 2. Añadir Skills
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
# Añadir skill de TypeScript
|
|
32
|
-
npx skillctl add https://github.com/wshobson/agents --skill typescript
|
|
33
|
-
|
|
34
|
-
# Añadir skill de Python
|
|
35
|
-
npx skillctl add https://github.com/wshobson/agents --skill python
|
|
36
|
-
|
|
37
|
-
# Añadir skill personalizada
|
|
38
|
-
npx skillctl add https://github.com/tu-usuario/tu-repo --skill custom-skill
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### 3. Ver Skills Instaladas
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
npx agent-skill list
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**Resultado:**
|
|
48
|
-
|
|
49
|
-
```
|
|
50
|
-
📦 Skills instaladas (2):
|
|
51
|
-
• typescript (https://github.com/wshobson/agents)
|
|
52
|
-
└─ Branch: main | Path: .cursor/skills/typescript/SKILL.md
|
|
53
|
-
• python (https://github.com/wshobson/agents)
|
|
54
|
-
└─ Branch: main | Path: .cursor/skills/python/SKILL.md
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### 4. Sincronizar con Editores
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
# Sincronizar con Cursor
|
|
61
|
-
npx agent-skill sync --editors cursor
|
|
62
|
-
|
|
63
|
-
# Sincronizar con múltiples editores
|
|
64
|
-
npx agent-skill sync --editors cursor,antigravity,vscode
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Archivos generados:**
|
|
68
|
-
|
|
69
|
-
- `.cursorrules` - Configuración para Cursor
|
|
70
|
-
- `.antigravity` - Configuración para Antigravity
|
|
71
|
-
- `.github/copilot-instructions.md` - Instrucciones para GitHub Copilot
|
|
72
|
-
|
|
73
|
-
### 5. Actualizar Skills
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
# Actualizar todas las skills a sus últimas versiones
|
|
77
|
-
npx agent-skill update
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**Resultado:**
|
|
81
|
-
|
|
82
|
-
```
|
|
83
|
-
🔄 Buscando actualizaciones para 2 skills...
|
|
84
|
-
⬇️ Actualizando typescript...
|
|
85
|
-
⬇️ Actualizando python...
|
|
86
|
-
✅ Todas las skills están al día.
|
|
87
|
-
✅ .cursorrules actualizado.
|
|
88
|
-
✅ .antigravity actualizado.
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Estructura del Proyecto Resultante
|
|
92
|
-
|
|
93
|
-
```
|
|
94
|
-
mi-proyecto-ia/
|
|
95
|
-
├── .cursor/
|
|
96
|
-
│ └── skills/
|
|
97
|
-
│ ├── typescript/
|
|
98
|
-
│ │ └── SKILL.md
|
|
99
|
-
│ └── python/
|
|
100
|
-
│ └── SKILL.md
|
|
101
|
-
├── .github/
|
|
102
|
-
│ └── copilot-instructions.md
|
|
103
|
-
├── .cursorrules
|
|
104
|
-
├── .antigravity
|
|
105
|
-
└── skills.toml
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
## Contenido de `skills.toml`
|
|
109
|
-
|
|
110
|
-
```toml
|
|
111
|
-
# Manifiesto de Skills
|
|
112
|
-
version = "1.0"
|
|
113
|
-
|
|
114
|
-
[skills.typescript]
|
|
115
|
-
url = "https://github.com/wshobson/agents"
|
|
116
|
-
branch = "main"
|
|
117
|
-
local_path = ".cursor/skills/typescript/SKILL.md"
|
|
118
|
-
last_updated = "2026-02-08T22:30:00Z"
|
|
119
|
-
|
|
120
|
-
[skills.python]
|
|
121
|
-
url = "https://github.com/wshobson/agents"
|
|
122
|
-
branch = "main"
|
|
123
|
-
local_path = ".cursor/skills/python/SKILL.md"
|
|
124
|
-
last_updated = "2026-02-08T22:30:00Z"
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Integración con Cursor
|
|
128
|
-
|
|
129
|
-
Una vez sincronizado, Cursor automáticamente:
|
|
130
|
-
|
|
131
|
-
1. Lee el archivo `.cursorrules`
|
|
132
|
-
2. Carga las skills referenciadas
|
|
133
|
-
3. Usa las instrucciones de las skills en sus respuestas
|
|
134
|
-
|
|
135
|
-
**Ejemplo de `.cursorrules` generado:**
|
|
136
|
-
|
|
137
|
-
```markdown
|
|
138
|
-
# Rules generadas por Skillctl
|
|
139
|
-
|
|
140
|
-
## Skill: typescript
|
|
141
|
-
|
|
142
|
-
Reference: .cursor/skills/typescript/SKILL.md
|
|
143
|
-
|
|
144
|
-
## Skill: python
|
|
145
|
-
|
|
146
|
-
Reference: .cursor/skills/python/SKILL.md
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
## Flujo de Trabajo Diario
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
# Mañana: Actualizar skills
|
|
153
|
-
npx skillctl update
|
|
154
|
-
|
|
155
|
-
# Durante el día: Añadir nueva skill si es necesario
|
|
156
|
-
npx skillctl add <url> --skill <nombre>
|
|
157
|
-
|
|
158
|
-
# Verificar configuración
|
|
159
|
-
npx skillctl list
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
## Compartir Configuración con el Equipo
|
|
163
|
-
|
|
164
|
-
1. **Commitear `skills.toml`** al repositorio:
|
|
165
|
-
|
|
166
|
-
```bash
|
|
167
|
-
git add skills.toml
|
|
168
|
-
git commit -m "Add skill configuration"
|
|
169
|
-
git push
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
2. **Otros miembros del equipo** solo necesitan:
|
|
173
|
-
```bash
|
|
174
|
-
git pull
|
|
175
|
-
npx agent-skill update # Descarga todas las skills del manifiesto
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
## Troubleshooting
|
|
179
|
-
|
|
180
|
-
### Problema: "El binario no se encuentra"
|
|
181
|
-
|
|
182
|
-
```bash
|
|
183
|
-
# Solución: Reinstalar el paquete
|
|
184
|
-
npm install --force skill-cli-tool
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### Problema: "No se encontró skills.toml"
|
|
188
|
-
|
|
189
|
-
```bash
|
|
190
|
-
# Solución: Inicializar el proyecto
|
|
191
|
-
npx skill-cli-tool init
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### Problema: Skills desactualizadas
|
|
195
|
-
|
|
196
|
-
```bash
|
|
197
|
-
# Solución: Forzar actualización
|
|
198
|
-
npx skill-cli-tool update
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
## Casos de Uso Avanzados
|
|
202
|
-
|
|
203
|
-
### Usar diferentes branches
|
|
204
|
-
|
|
205
|
-
```bash
|
|
206
|
-
# Editar skills.toml manualmente
|
|
207
|
-
[skills.typescript-beta]
|
|
208
|
-
url = "https://github.com/wshobson/agents"
|
|
209
|
-
branch = "beta" # <-- Cambiar branch
|
|
210
|
-
local_path = ".cursor/skills/typescript-beta/SKILL.md"
|
|
211
|
-
last_updated = "2026-02-08T22:30:00Z"
|
|
212
|
-
|
|
213
|
-
# Actualizar
|
|
214
|
-
npx skill-cli-tool update
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
### Crear skills personalizadas
|
|
218
|
-
|
|
219
|
-
1. Crear un repositorio con la estructura:
|
|
220
|
-
|
|
221
|
-
```
|
|
222
|
-
mi-skill/
|
|
223
|
-
└── SKILL.md
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
2. Añadir la skill:
|
|
227
|
-
```bash
|
|
228
|
-
npx skill-cli-tool add https://github.com/mi-usuario/mi-skill --skill mi-skill
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
## Próximos Pasos
|
|
232
|
-
|
|
233
|
-
- Explorar skills disponibles en GitHub
|
|
234
|
-
- Crear tus propias skills personalizadas
|
|
235
|
-
- Compartir configuración con tu equipo
|
|
236
|
-
- Automatizar actualizaciones en CI/CD
|
package/src/main.rs
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
use clap::{Parser, Subcommand};
|
|
2
|
-
use colored::*;
|
|
3
|
-
use anyhow::{Context, Result};
|
|
4
|
-
use std::fs;
|
|
5
|
-
use std::path::Path;
|
|
6
|
-
use serde::{Deserialize, Serialize};
|
|
7
|
-
use dialoguer::{Select, theme::ColorfulTheme};
|
|
8
|
-
use std::collections::HashMap;
|
|
9
|
-
|
|
10
|
-
// --- MODELO DE DATOS (JSON) ---
|
|
11
|
-
#[derive(Serialize, Deserialize, Debug)]
|
|
12
|
-
struct SkillConfig {
|
|
13
|
-
editor: String, // "cursor", "antigravity", "vscode"
|
|
14
|
-
skills: HashMap<String, SkillEntry>,
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
#[derive(Serialize, Deserialize, Debug)]
|
|
18
|
-
struct SkillEntry {
|
|
19
|
-
url: String,
|
|
20
|
-
local_path: String,
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
impl Default for SkillConfig {
|
|
24
|
-
fn default() -> Self {
|
|
25
|
-
Self {
|
|
26
|
-
editor: "cursor".to_string(),
|
|
27
|
-
skills: HashMap::new(),
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// --- CLI ARGUMENTS ---
|
|
33
|
-
#[derive(Parser)]
|
|
34
|
-
#[command(name = "skillctl")]
|
|
35
|
-
#[command(version = "1.0.0")]
|
|
36
|
-
#[command(about = "Gestor de Skills tipo Vercel", long_about = None)]
|
|
37
|
-
struct Cli {
|
|
38
|
-
#[command(subcommand)]
|
|
39
|
-
command: Commands,
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
#[derive(Subcommand)]
|
|
43
|
-
enum Commands {
|
|
44
|
-
/// Inicializa el proyecto y elige editor
|
|
45
|
-
Init,
|
|
46
|
-
/// Añade una skill. Uso: skillctl add <URL> --skill <NOMBRE>
|
|
47
|
-
Add {
|
|
48
|
-
url: String,
|
|
49
|
-
/// Nombre de la skill a extraer
|
|
50
|
-
#[arg(long)] // Esto hace que sea --skill <nombre>
|
|
51
|
-
skill: String,
|
|
52
|
-
},
|
|
53
|
-
/// Instala todas las skills definidas en skills.json
|
|
54
|
-
Install,
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
fn main() -> Result<()> {
|
|
58
|
-
let cli = Cli::parse();
|
|
59
|
-
|
|
60
|
-
match &cli.command {
|
|
61
|
-
Commands::Init => init_project()?,
|
|
62
|
-
Commands::Add { url, skill } => add_skill(url, skill)?,
|
|
63
|
-
Commands::Install => install_all()?,
|
|
64
|
-
}
|
|
65
|
-
Ok(())
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// --- COMANDO: INIT (Interactivo) ---
|
|
69
|
-
fn init_project() -> Result<()> {
|
|
70
|
-
let config_path = Path::new("skills.json");
|
|
71
|
-
if config_path.exists() {
|
|
72
|
-
println!("⚠️ Ya existe 'skills.json'.");
|
|
73
|
-
return Ok(());
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
println!("{}", "🚀 Inicializando Skill Controller...".bold().cyan());
|
|
77
|
-
|
|
78
|
-
// Menú interactivo
|
|
79
|
-
let editors = vec!["Cursor (.cursor/skills)", "Antigravity (.antigravity)", "VSCode (.vscode)"];
|
|
80
|
-
let selection = Select::with_theme(&ColorfulTheme::default())
|
|
81
|
-
.with_prompt("¿Qué editor vas a usar?")
|
|
82
|
-
.default(0)
|
|
83
|
-
.items(&editors)
|
|
84
|
-
.interact()
|
|
85
|
-
.unwrap();
|
|
86
|
-
|
|
87
|
-
let editor_key = match selection {
|
|
88
|
-
0 => "cursor",
|
|
89
|
-
1 => "antigravity",
|
|
90
|
-
_ => "vscode",
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
let config = SkillConfig {
|
|
94
|
-
editor: editor_key.to_string(),
|
|
95
|
-
skills: HashMap::new(),
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
save_config(&config)?;
|
|
99
|
-
|
|
100
|
-
// Crear carpeta base según editor
|
|
101
|
-
let base_dir = get_skills_dir(editor_key);
|
|
102
|
-
fs::create_dir_all(&base_dir)?;
|
|
103
|
-
|
|
104
|
-
println!("✅ Configuración guardada en 'skills.json'. Editor: {}", editor_key.green());
|
|
105
|
-
Ok(())
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// --- COMANDO: ADD ---
|
|
109
|
-
fn add_skill(repo_url: &str, skill_name: &str) -> Result<()> {
|
|
110
|
-
// 1. Cargar config para saber dónde guardar
|
|
111
|
-
let mut config = load_config()?;
|
|
112
|
-
let skills_dir = get_skills_dir(&config.editor);
|
|
113
|
-
|
|
114
|
-
println!("{} {}...", "📦 Añadiendo skill:".blue(), skill_name);
|
|
115
|
-
|
|
116
|
-
// 2. Lógica de descarga (GitHub Raw)
|
|
117
|
-
let raw_base = repo_url
|
|
118
|
-
.replace("github.com", "raw.githubusercontent.com")
|
|
119
|
-
.trim_end_matches('/')
|
|
120
|
-
.to_string();
|
|
121
|
-
|
|
122
|
-
// URL: .../main/skills/{nombre}/SKILL.md (Ajustar según estructura real del repo)
|
|
123
|
-
let target_url = format!("{}/main/skills/{}/SKILL.md", raw_base, skill_name);
|
|
124
|
-
|
|
125
|
-
// 3. Descargar
|
|
126
|
-
let content = download_file(&target_url)?;
|
|
127
|
-
|
|
128
|
-
// 4. Guardar archivo
|
|
129
|
-
let skill_folder = skills_dir.join(skill_name);
|
|
130
|
-
fs::create_dir_all(&skill_folder)?;
|
|
131
|
-
let file_path = skill_folder.join("SKILL.md");
|
|
132
|
-
fs::write(&file_path, &content)?;
|
|
133
|
-
|
|
134
|
-
println!("✅ Skill guardada en: {:?}", file_path);
|
|
135
|
-
|
|
136
|
-
// 5. Actualizar JSON
|
|
137
|
-
config.skills.insert(skill_name.to_string(), SkillEntry {
|
|
138
|
-
url: repo_url.to_string(),
|
|
139
|
-
local_path: file_path.to_string_lossy().to_string(),
|
|
140
|
-
});
|
|
141
|
-
save_config(&config)?;
|
|
142
|
-
|
|
143
|
-
// 6. Actualizar configuración del editor (Integración)
|
|
144
|
-
update_editor_config(&config.editor, skill_name, &file_path)?;
|
|
145
|
-
|
|
146
|
-
Ok(())
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// --- COMANDO: INSTALL ---
|
|
150
|
-
fn install_all() -> Result<()> {
|
|
151
|
-
let config = load_config().context("No se encontró skills.json. Ejecuta 'init' primero.")?;
|
|
152
|
-
|
|
153
|
-
println!("🔄 Restaurando {} skills para {}...", config.skills.len(), config.editor);
|
|
154
|
-
|
|
155
|
-
for (name, entry) in &config.skills {
|
|
156
|
-
// Re-usamos la lógica de add pero sin duplicar entradas en el json
|
|
157
|
-
// (Aquí simplificado: solo descargamos el archivo de nuevo)
|
|
158
|
-
|
|
159
|
-
let raw_base = entry.url
|
|
160
|
-
.replace("github.com", "raw.githubusercontent.com")
|
|
161
|
-
.trim_end_matches('/')
|
|
162
|
-
.to_string();
|
|
163
|
-
let target_url = format!("{}/main/skills/{}/SKILL.md", raw_base, name);
|
|
164
|
-
|
|
165
|
-
match download_file(&target_url) {
|
|
166
|
-
Ok(content) => {
|
|
167
|
-
let path = Path::new(&entry.local_path);
|
|
168
|
-
if let Some(parent) = path.parent() {
|
|
169
|
-
fs::create_dir_all(parent)?;
|
|
170
|
-
}
|
|
171
|
-
fs::write(path, content)?;
|
|
172
|
-
println!(" - ✅ {}", name);
|
|
173
|
-
},
|
|
174
|
-
Err(_) => println!(" - ❌ Error descargando {}", name),
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
println!("✨ Instalación completada.");
|
|
178
|
-
Ok(())
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// --- HELPERS ---
|
|
182
|
-
|
|
183
|
-
fn get_skills_dir(editor: &str) -> std::path::PathBuf {
|
|
184
|
-
match editor {
|
|
185
|
-
"antigravity" => Path::new(".antigravity/skills").to_path_buf(),
|
|
186
|
-
"vscode" => Path::new(".vscode/skills").to_path_buf(),
|
|
187
|
-
_ => Path::new(".cursor/skills").to_path_buf(), // Default
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
fn load_config() -> Result<SkillConfig> {
|
|
192
|
-
let content = fs::read_to_string("skills.json")?;
|
|
193
|
-
let config: SkillConfig = serde_json::from_str(&content)?;
|
|
194
|
-
Ok(config)
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
fn save_config(config: &SkillConfig) -> Result<()> {
|
|
198
|
-
let content = serde_json::to_string_pretty(config)?;
|
|
199
|
-
fs::write("skills.json", content)?;
|
|
200
|
-
Ok(())
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
fn download_file(url: &str) -> Result<String> {
|
|
204
|
-
let resp = reqwest::blocking::get(url)?;
|
|
205
|
-
if !resp.status().is_success() {
|
|
206
|
-
anyhow::bail!("404 Not Found");
|
|
207
|
-
}
|
|
208
|
-
Ok(resp.text()?)
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
fn update_editor_config(editor: &str, skill_name: &str, path: &Path) -> Result<()> {
|
|
212
|
-
// Aquí implementas la lógica específica para inyectar en .cursorrules o .antigravity
|
|
213
|
-
// Ejemplo simple para cursor:
|
|
214
|
-
if editor == "cursor" {
|
|
215
|
-
let rule_file = Path::new(".cursorrules");
|
|
216
|
-
let line = format!("\n# Skill: {}\nReference: {}\n", skill_name, path.display());
|
|
217
|
-
|
|
218
|
-
// Append
|
|
219
|
-
let mut file = fs::OpenOptions::new()
|
|
220
|
-
.create(true)
|
|
221
|
-
.append(true)
|
|
222
|
-
.open(rule_file)?;
|
|
223
|
-
use std::io::Write;
|
|
224
|
-
write!(file, "{}", line)?;
|
|
225
|
-
}
|
|
226
|
-
Ok(())
|
|
227
|
-
}
|