@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 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. Mantener mensajes de CLI en español (consistentes con README actual).
19
- 5. Si agregas o cambias comandos, actualiza:
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
+ ![demo](artifacts/skillbase-demo.gif)
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 instaladas globalmente en `~/.skillbase/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 migraciones, indica que el origen es `.agents/skills` del proyecto actual.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ariasbruno/skillbase",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "CLI para administrar skills locales y remotas entre proyectos",
5
5
  "type": "module",
6
6
  "bin": {
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 en ~/.skillbase/skills.
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 skills = await listGlobalSkills();
125
- if (!skills.length) {
126
- console.log(`No hay skills globales instaladas en ${getGlobalSkillsDir()}`);
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
- console.log(`Skills globales (${getGlobalSkillsDir()}):`);
129
- skills.forEach((skill) => console.log(`- ${skill}`));
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) return;
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