@ariasbruno/skillbase 0.1.1 → 0.2.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/AGENTS.md +7 -2
- package/README.md +4 -2
- package/package.json +1 -1
- package/src/cli.js +27 -12
- package/src/core.js +7 -1
package/AGENTS.md
CHANGED
|
@@ -15,8 +15,9 @@ Estas instrucciones aplican a todo el árbol del proyecto (`skillbase`).
|
|
|
15
15
|
1. Mantener el código en JavaScript ESM (`"type": "module"`).
|
|
16
16
|
2. Evitar dependencias externas salvo necesidad clara.
|
|
17
17
|
3. Toda lógica de negocio va en `src/core.js`; `src/cli.js` sólo parsea/coordina comandos.
|
|
18
|
-
4.
|
|
19
|
-
5.
|
|
18
|
+
4. Toda visualización de estado sucede en `src/cli.js`.
|
|
19
|
+
5. Mantener mensajes de CLI en español (consistentes con README actual).
|
|
20
|
+
6. Si agregas o cambias comandos, actualiza:
|
|
20
21
|
- ayuda en `src/cli.js`
|
|
21
22
|
- sección de comandos en `README.md`
|
|
22
23
|
|
|
@@ -25,6 +26,10 @@ Estas instrucciones aplican a todo el árbol del proyecto (`skillbase`).
|
|
|
25
26
|
- Basarse en señales del proyecto (`package.json`, `requirements.txt`, etc).
|
|
26
27
|
- Si cambias este comportamiento, documenta el motivo en README.
|
|
27
28
|
|
|
29
|
+
## Listado
|
|
30
|
+
- `skillbase ls` lista las skills globales.
|
|
31
|
+
- `skillbase ls --project` (o `-p`) lista las instaladas en el proyecto actual (`.agents/skills`).
|
|
32
|
+
|
|
28
33
|
## Migración
|
|
29
34
|
- `skillbase migrate` migra desde `~/.agents/skills` a `~/.skillbase/skills`.
|
|
30
35
|
- `skillbase migrate --project` migra desde `.agents/skills` del cwd al mismo destino global.
|
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
`skillbase` es un CLI de Node.js que te permite administrar las skills de tus agentes de Inteligencia Artificial utilizando enlaces simbólicos (symlinks) o instalaciones locales por cada workspace, evitando la saturación del contexto.
|
|
6
6
|
|
|
7
|
+

|
|
8
|
+
|
|
7
9
|
---
|
|
8
10
|
|
|
9
11
|
## 🤔 El Problema: Saturación de Contexto (Context Bloat)
|
|
@@ -59,7 +61,7 @@ skillbase install
|
|
|
59
61
|
|
|
60
62
|
| Comando | Alias | Descripción |
|
|
61
63
|
| :--- | :--- | :--- |
|
|
62
|
-
| `skillbase ls` | `l` | Lista skills
|
|
64
|
+
| `skillbase ls [--project]` | `l [-p]` | Lista skills globales o del proyecto con `-p`. |
|
|
63
65
|
| `skillbase init [--hard]` | | Detecta tecnologías y sugiere skills (usa `--hard` para analizar `tags` en `skill.json`). |
|
|
64
66
|
| `skillbase add [<skill>] [-s]` | `a` | Instalar skill global. Sin nombre, abre el **selector interactivo**. `-s` crea symlink. |
|
|
65
67
|
| `skillbase install` | `i` | Instala desde el manifiesto `skillbase.json`. Soporta `-r` (remotas) y `-f` (forzar). |
|
|
@@ -75,7 +77,7 @@ skillbase install
|
|
|
75
77
|
- `-r`, `--remote`: Indica que la operación debe consultar fuentes externas (GitHub o API de skills.sh).
|
|
76
78
|
- `-f`, `--force`: Ignora errores de "ya existe" y sobrescribe archivos/configuraciones.
|
|
77
79
|
- `-k`, `--skill`: Nombre de la skill específica a extraer cuando se instala desde un repositorio GitHub.
|
|
78
|
-
- `-p`, `--project`: En
|
|
80
|
+
- `-p`, `--project`: En `ls`, lista skills locales. En `migrate`, indica que el origen es `.agents/skills`.
|
|
79
81
|
- `--g`: Flag específica de `remove` para borrar una skill del registro global.
|
|
80
82
|
|
|
81
83
|
### ⌨️ Aliases de comandos
|
package/package.json
CHANGED
package/src/cli.js
CHANGED
|
@@ -3,10 +3,12 @@ import {
|
|
|
3
3
|
addSkill,
|
|
4
4
|
checkUpdates,
|
|
5
5
|
getGlobalSkillsDir,
|
|
6
|
+
getProjectSkillsDir,
|
|
6
7
|
initProject,
|
|
7
8
|
installFromManifest,
|
|
8
9
|
installRemoteSkillRef,
|
|
9
10
|
listGlobalSkills,
|
|
11
|
+
listProjectSkills,
|
|
10
12
|
migrateAgentsSkillsToSkillbase,
|
|
11
13
|
readManifest,
|
|
12
14
|
removeSkill,
|
|
@@ -19,8 +21,8 @@ function printHelp() {
|
|
|
19
21
|
Uso:
|
|
20
22
|
skillbase -h
|
|
21
23
|
skillbase h
|
|
22
|
-
skillbase ls
|
|
23
|
-
skillbase l
|
|
24
|
+
skillbase ls [--project]
|
|
25
|
+
skillbase l [-p]
|
|
24
26
|
skillbase init [--hard]
|
|
25
27
|
skillbase add <skill> [--sym]
|
|
26
28
|
skillbase add
|
|
@@ -38,7 +40,7 @@ Uso:
|
|
|
38
40
|
skillbase m [--project] [-f]
|
|
39
41
|
|
|
40
42
|
Descripción breve de comandos:
|
|
41
|
-
ls Lista skills instaladas globalmente
|
|
43
|
+
ls Lista skills instaladas globalmente (~/.skillbase/skills) o del proyecto con --project.
|
|
42
44
|
init Sugiere skills globales según tecnologías del proyecto.
|
|
43
45
|
add Instala una skill global (o abre selector interactivo sin argumentos).
|
|
44
46
|
install Instala desde skillbase.json o una skill remota con --remote.
|
|
@@ -63,8 +65,8 @@ Notas:
|
|
|
63
65
|
|
|
64
66
|
function printCommandList() {
|
|
65
67
|
console.log(`Comandos disponibles:
|
|
66
|
-
- skillbase ls
|
|
67
|
-
- skillbase l
|
|
68
|
+
- skillbase ls [--project]
|
|
69
|
+
- skillbase l [-p]
|
|
68
70
|
- skillbase init [--hard]
|
|
69
71
|
- skillbase add
|
|
70
72
|
- skillbase add <skill> [--sym]
|
|
@@ -121,12 +123,23 @@ export async function runCLI(argv) {
|
|
|
121
123
|
|
|
122
124
|
switch (command) {
|
|
123
125
|
case 'ls': {
|
|
124
|
-
const
|
|
125
|
-
if (
|
|
126
|
-
|
|
126
|
+
const showProject = hasFlag(args, '--project', '-p');
|
|
127
|
+
if (showProject) {
|
|
128
|
+
const skills = await listProjectSkills();
|
|
129
|
+
if (!skills.length) {
|
|
130
|
+
console.log(`No hay skills instaladas localmente en ${getProjectSkillsDir()}`);
|
|
131
|
+
} else {
|
|
132
|
+
console.log(`Skills del proyecto (${getProjectSkillsDir()}):`);
|
|
133
|
+
skills.forEach((skill) => console.log(`- ${skill}`));
|
|
134
|
+
}
|
|
127
135
|
} else {
|
|
128
|
-
|
|
129
|
-
skills.
|
|
136
|
+
const skills = await listGlobalSkills();
|
|
137
|
+
if (!skills.length) {
|
|
138
|
+
console.log(`No hay skills globales instaladas en ${getGlobalSkillsDir()}`);
|
|
139
|
+
} else {
|
|
140
|
+
console.log(`Skills globales (${getGlobalSkillsDir()}):`);
|
|
141
|
+
skills.forEach((skill) => console.log(`- ${skill}`));
|
|
142
|
+
}
|
|
130
143
|
}
|
|
131
144
|
return;
|
|
132
145
|
}
|
|
@@ -142,7 +155,6 @@ export async function runCLI(argv) {
|
|
|
142
155
|
console.log('No se encontraron skills compatibles en ~/.skillbase/skills.');
|
|
143
156
|
return;
|
|
144
157
|
}
|
|
145
|
-
console.log(`Skills sugeridas: ${result.suggested.join(', ')}`);
|
|
146
158
|
if (result.cancelled) {
|
|
147
159
|
console.log('Selección cancelada.');
|
|
148
160
|
return;
|
|
@@ -158,7 +170,10 @@ export async function runCLI(argv) {
|
|
|
158
170
|
case 'add': {
|
|
159
171
|
if (!maybeSkill) {
|
|
160
172
|
const result = await addSkillsInteractive({ sym: hasFlag(args, '--sym', '-s') });
|
|
161
|
-
if (result.cancelled)
|
|
173
|
+
if (result.cancelled) {
|
|
174
|
+
console.log('Selección cancelada.');
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
162
177
|
if (!result.selected.length) {
|
|
163
178
|
console.log('No se seleccionaron skills para instalar.');
|
|
164
179
|
return;
|
package/src/core.js
CHANGED
|
@@ -36,6 +36,13 @@ export async function listGlobalSkills() {
|
|
|
36
36
|
return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort();
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
export async function listProjectSkills(cwd = process.cwd()) {
|
|
40
|
+
const projectSkillsDir = getProjectSkillsDir(cwd);
|
|
41
|
+
if (!(await exists(projectSkillsDir))) return [];
|
|
42
|
+
const entries = await fs.readdir(projectSkillsDir, { withFileTypes: true });
|
|
43
|
+
return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name).sort();
|
|
44
|
+
}
|
|
45
|
+
|
|
39
46
|
async function copyDir(src, dst) {
|
|
40
47
|
await fs.cp(src, dst, { recursive: true, force: true });
|
|
41
48
|
}
|
|
@@ -237,7 +244,6 @@ async function selectSkillsFromList(skills, { title, requireTTYMessage } = {}) {
|
|
|
237
244
|
output.write('\n');
|
|
238
245
|
|
|
239
246
|
if (outcome.cancelled) {
|
|
240
|
-
output.write('\nSelección cancelada.\n');
|
|
241
247
|
return { selected: [], cancelled: true };
|
|
242
248
|
}
|
|
243
249
|
|