@iseoane/agent-depot 0.4.1 → 0.5.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.es.md +969 -0
  3. package/README.md +244 -23
  4. package/dist/src/app-flow.js +52 -51
  5. package/dist/src/app-recipe-removal.js +63 -0
  6. package/dist/src/cli.js +122 -11
  7. package/dist/src/executable-resolution.js +54 -0
  8. package/dist/src/git-source.js +129 -6
  9. package/dist/src/package-bundles.js +614 -0
  10. package/dist/src/package-cli.js +412 -0
  11. package/dist/src/package-content.js +158 -0
  12. package/dist/src/package-flow.js +636 -0
  13. package/dist/src/package-host-plans.js +240 -0
  14. package/dist/src/package-host-state.js +349 -0
  15. package/dist/src/package-model.js +33 -0
  16. package/dist/src/package-owned-skills.js +122 -0
  17. package/dist/src/package-state.js +404 -0
  18. package/dist/src/profile-cli.js +15 -9
  19. package/dist/src/profile-export.js +44 -9
  20. package/dist/src/profile-import.js +80 -17
  21. package/dist/src/profile.js +78 -3
  22. package/dist/src/skill-discovery.js +2 -2
  23. package/dist/src/skill-install.js +16 -0
  24. package/dist/src/sources.js +11 -0
  25. package/dist/src/tui/app-actions.js +1 -1
  26. package/dist/src/tui/app.js +5 -6
  27. package/dist/src/tui/catalog-browse.js +10 -3
  28. package/dist/src/tui/catalog-panel.js +7 -3
  29. package/dist/src/tui/catalog-state.js +57 -6
  30. package/dist/src/tui/catalog-tree.js +52 -10
  31. package/dist/src/tui/catalog-view.js +27 -4
  32. package/dist/src/tui/environment.js +8 -1
  33. package/dist/src/tui/installations-browse.js +20 -2
  34. package/dist/src/tui/installations-rows.js +2 -1
  35. package/dist/src/tui/installations-tree.js +14 -1
  36. package/dist/src/tui/installations-view.js +8 -2
  37. package/dist/src/tui/installations.js +12 -2
  38. package/dist/src/tui/manage-actions.js +2 -0
  39. package/dist/src/tui/manage-panel.js +5 -0
  40. package/dist/src/tui/package-actions.js +165 -0
  41. package/dist/src/tui/package-rows.js +87 -0
  42. package/dist/src/tui/profile-view.js +36 -14
  43. package/dist/src/tui/sources-mode.js +2 -0
  44. package/dist/src/tui/sources-recipes.js +116 -53
  45. package/dist/src/tui/sources-view.js +57 -19
  46. package/dist/src/tui/tree.js +3 -4
  47. package/dist/src/tui/updates-flow.js +4 -1
  48. package/dist/src/tui/updates-panel.js +2 -2
  49. package/dist/src/tui/updates.js +72 -4
  50. package/dist/src/user-global-skill-inventory.js +7 -2
  51. package/package.json +2 -1
  52. package/skills/agent-depot-apprecipe/SKILL.md +29 -5
package/README.es.md ADDED
@@ -0,0 +1,969 @@
1
+ # Agent Depot
2
+
3
+ [English](README.md) · **Español**
4
+
5
+ Agent Depot es un gestor multiplataforma de los recursos reutilizables que usan los
6
+ agentes de programación. Descubre Skills a partir de Sources de Git, las instala en
7
+ uno o varios Hosts (Pi, Claude Code, Codex y OpenCode), gestiona Apps globales de
8
+ usuario y Packages nativos del Host, registra lo que ha instalado y lo actualiza de
9
+ forma segura, todo desde una CLI o una TUI interactiva.
10
+
11
+ Qué hace:
12
+
13
+ - **Sources y catálogo**: registra repositorios Git (además de la Source integrada
14
+ `builtin:agent-depot`) y descubre los Skills que contienen.
15
+ - **Instalar Skills** a nivel global de usuario o por proyecto, en varios Hosts a la
16
+ vez, fijados a una versión o siguiendo la última. Un manifiesto de proyecto permite
17
+ que un checkout nuevo reinstale los mismos Skills.
18
+ - **Actualizaciones**: comprueba y aplica actualizaciones por lotes; cada cambio se
19
+ previsualiza antes y requiere confirmación explícita.
20
+ - **Instalaciones existentes**: informa de los Skills no gestionados que ya hay en
21
+ disco, adopta los que coinciden exactamente con una Source o los elimina mediante
22
+ una ruta explícita.
23
+ - **Apps**: instala, actualiza y desinstala aplicaciones globales de usuario mediante
24
+ App recipes escritas por el usuario que deben aprobarse antes de ejecutarse.
25
+ - **Packages**: instala, actualiza y desinstala bundles nativos del Host (paquetes de
26
+ Pi y plugins de Claude Code) delegando el ciclo de vida en la CLI de cada Host y
27
+ leyendo la versión instalada de los propios archivos de estado del Host. Un bundle
28
+ reserva sus Skills solo mientras lo hayas seleccionado o un Host demuestre que está
29
+ instalado, así que los Skills de un bundle no seleccionado siguen siendo instalables
30
+ por separado.
31
+ - **Profiles**: exporta tus Sources, selecciones de Skills, App recipes y selecciones
32
+ de Packages globales de usuario a un archivo portable e impórtalos, solo añadiendo,
33
+ en otra máquina.
34
+
35
+ Agent Depot nunca sobrescribe ni elimina contenido sin una previsualización y una
36
+ confirmación, y rechaza rutas y enlaces inseguros.
37
+
38
+ Requiere Node.js >= 24 (Active LTS). La [TUI interactiva](#tui-interactiva)
39
+ necesita un terminal interactivo.
40
+
41
+ ## Instalación
42
+
43
+ Agent Depot se publica como el paquete con ámbito `@iseoane/agent-depot` y expone el
44
+ comando `agent-depot`. Requiere Node.js >= 24.
45
+
46
+ ```sh
47
+ # Ejecutar sin instalar
48
+ npx @iseoane/agent-depot --version
49
+ npx @iseoane/agent-depot tui
50
+ pnpm dlx @iseoane/agent-depot tui
51
+
52
+ # O instalar globalmente
53
+ npm install --global @iseoane/agent-depot
54
+ pnpm add --global @iseoane/agent-depot
55
+ agent-depot --version
56
+ ```
57
+
58
+ Los ejemplos siguientes usan el comando `agent-depot`; `npx @iseoane/agent-depot <args>`
59
+ funciona igual sin instalación global.
60
+
61
+ ### Actualización
62
+
63
+ `npx` puede reutilizar una copia en caché de una versión anterior. Añade `@latest`
64
+ para forzar la versión más reciente:
65
+
66
+ ```sh
67
+ npx @iseoane/agent-depot@latest tui
68
+ pnpm dlx @iseoane/agent-depot@latest tui
69
+ ```
70
+
71
+ Una instalación global se actualiza con el gestor de paquetes que la instaló:
72
+
73
+ ```sh
74
+ npm install --global @iseoane/agent-depot@latest
75
+ pnpm add --global @iseoane/agent-depot@latest
76
+ ```
77
+
78
+ Un Agent Depot en ejecución nunca degrada los Skills integrados: un Skill instalado
79
+ por un Agent Depot más reciente se notifica como no actualizable (actualiza primero
80
+ Agent Depot).
81
+
82
+ ## Uso
83
+
84
+ Con el paquete instalado (o mediante `npx @iseoane/agent-depot`). `agent-depot --help`
85
+ (también `-h` o `help`) muestra el uso y termina con código 0; ejecutarlo sin
86
+ argumentos o con un comando desconocido es un error de uso y termina con código 1.
87
+
88
+ ```sh
89
+ agent-depot source list
90
+ agent-depot source add https://github.com/example/skills.git
91
+ agent-depot source refresh git:<source-id>
92
+ agent-depot source refresh git:<source-id> --yes
93
+ agent-depot source remove git:<source-id> --yes
94
+ agent-depot source remove git:<source-id> --skill <id|path> --yes
95
+ agent-depot source migrate git:<old-source-id> git:<new-source-id> --skill <path> --yes
96
+ agent-depot discover builtin:agent-depot git:<source-id>
97
+ agent-depot install --scope project --source builtin:agent-depot --skill architecture --host pi --version latest --portable-v1 --yes
98
+ agent-depot install --scope user-global --source builtin:agent-depot --skill architecture --host pi --version latest --portable-v1 --yes
99
+ # Only for an explicitly reviewed, untracked real-directory conflict:
100
+ agent-depot install --scope project --source builtin:agent-depot --skill architecture --host pi --version latest --portable-v1 --overwrite --yes
101
+ agent-depot install --scope project --manifest --portable-v1 --yes
102
+ agent-depot update check --scope project
103
+ agent-depot update apply --scope project --all --yes
104
+ agent-depot update apply --scope user-global --skill 0 --yes
105
+ agent-depot skill remove <id|path>... --yes
106
+ agent-depot skill remove <id|path> --host <host>... --yes
107
+ agent-depot skill host add <id|path> --host <host>... --yes --confirm-additional-host
108
+ agent-depot uninstall --cli
109
+ agent-depot uninstall --skills --yes
110
+ agent-depot uninstall --unmanaged-skill <exact-global-path> --yes
111
+ agent-depot uninstall --data --yes
112
+ agent-depot app list
113
+ agent-depot app approve <name> --yes
114
+ agent-depot app install <name> --yes
115
+ agent-depot package list
116
+ agent-depot package discover <source-id>
117
+ agent-depot package inspect <source-id>::<bundle-path> --host <host>
118
+ agent-depot package approve <source-id>::<bundle-path> --host <host> --action install
119
+ agent-depot package install <source-id>::<bundle-path> --host <host> --yes
120
+ agent-depot package forget <source-id>::<bundle-path> --host <host> --yes
121
+ agent-depot update check --scope user-global --package <selection>
122
+ agent-depot export --out profile.json
123
+ agent-depot import profile.json --yes
124
+ agent-depot tui
125
+ agent-depot --version
126
+ ```
127
+
128
+ También se admiten URLs de directorios de GitHub, como
129
+ `https://github.com/cursor/plugins/tree/main/pstack`: Agent Depot clona el
130
+ repositorio, lee la referencia de la URL y solo descubre Skills dentro de ese
131
+ directorio. Las rutas de los Skills siguen siendo relativas al repositorio.
132
+ La URL completa conserva la identidad de la Source; si ya está registrada,
133
+ basta con refrescarla. La referencia ocupa un segmento de la URL: codifica los
134
+ `/` del nombre de una rama como `%2F` (por ejemplo `tree/release%2Fstable/pstack`).
135
+ Una referencia explícita de versión fija sustituye la de la URL, pero mantiene
136
+ el directorio seleccionado.
137
+
138
+ Los grupos del Catálogo muestran nombres de repositorios en lugar de IDs Git.
139
+ Catálogo e Installations empiezan con todos los grupos contraídos; usa Enter o
140
+ la flecha derecha para abrirlos. Un filtro del Catálogo expande automáticamente
141
+ las Sources con coincidencias.
142
+
143
+ El Catálogo de la TUI avisa por cada Source no disponible y permite seguir
144
+ navegando por las demás. Para crear una caché ausente, ve a Sources (`1`) y
145
+ refresca con `r`; abrir el Catálogo no inicia acceso a la red.
146
+
147
+ `refresh` primero muestra como previsualización la URL registrada. Requiere
148
+ confirmación explícita con `--yes` antes de cualquier acceso a la red y, en caso
149
+ contrario, falla de forma cerrada. La Source `builtin:agent-depot`, propiedad del
150
+ paquete, se lista como de solo lectura y no puede refrescarse.
151
+
152
+ La eliminación de una Source es solo global de usuario y nunca lee manifiestos de
153
+ proyecto ni borra cachés de Sources. Previsualiza todos los Skills globales de
154
+ usuario dependientes y mantiene todos ellos registrados por defecto. Pasa
155
+ `--skill <id|path>` para un subconjunto seleccionado o `--all` para todos los Skills
156
+ dependientes. Se aceptan índices numéricos para la lista de dependientes, pero una
157
+ ruta de Skill literal compuesta solo por dígitos tiene prioridad sobre su índice
158
+ numérico. El borrado de Skills siempre requiere `--yes`; el contenido adoptado y el
159
+ contenido modificado localmente (o que carece de una línea base de confianza)
160
+ reciben advertencias.
161
+ La comprobación previa rechaza rutas inseguras, enlaces inesperados, instalaciones
162
+ inexistentes, destinos seleccionados que se solapan y otros fallos de inspección
163
+ antes de cambiar el estado de la Source o de borrar ningún Skill. Una segunda
164
+ comprobación previa compara el resumen del contenido de cada destino, el indicador
165
+ de adopción y el estado de modificación antes del primer borrado.
166
+
167
+ `skill remove <id|path>...` elimina los Skills gestionados globales de usuario
168
+ seleccionados sin tocar su Source. Cada `<id|path>` es la ruta exacta del Skill o su
169
+ último segmento de ruta cuando es único; las selecciones desconocidas o ambiguas
170
+ fallan antes de cambiar nada. Previsualiza cada borrado (con advertencias de
171
+ adoptado/modificado), requiere `--yes`, vuelve a comprobar los destinos y después
172
+ borra los archivos y sus registros de instalación. Es solo global de usuario: las
173
+ instalaciones y manifiestos de proyecto nunca se leen ni se modifican, y la caché de
174
+ Git se conserva.
175
+
176
+ `skill host add <id|path> --host <host>... [--yes] [--confirm-additional-host]`
177
+ expone un Skill global de usuario ya instalado a más Hosts sin cambiar su contenido
178
+ ni su versión, y después registra los nuevos Hosts. Los Hosts distintos de Claude
179
+ comparten la ubicación canónica `~/.agents/skills/<skill>` y Claude es un enlace
180
+ simbólico a ella, por lo que solo se crea, como mucho, el enlace simbólico de Claude
181
+ que falte. La previsualización lista las nuevas ubicaciones; como expone el Skill a
182
+ más Hosts, necesita tanto `--yes` como `--confirm-additional-host`. Rechaza una
183
+ ubicación de Claude que ya contenga algo distinto del enlace simbólico gestionado, y
184
+ un Skill que no esté instalado en la ubicación canónica (exponerlo requeriría
185
+ copiarlo).
186
+
187
+ `skill remove <id|path> --host <host>... [--yes]` elimina únicamente esos Hosts. Por
188
+ esta vía solo se puede borrar el enlace simbólico gestionado de Claude; el
189
+ directorio canónico respalda a todos los Hosts restantes (incluido el enlace
190
+ simbólico de Claude) y permanece hasta que se elimina el último Host. Eliminar todos
191
+ los Hosts registrados es una eliminación completa con las advertencias habituales de
192
+ adoptado/modificado. Los destinos se vuelven a comprobar antes de borrar y el
193
+ registro se actualiza después. Las instalaciones de proyecto no se ven afectadas.
194
+
195
+ Para sustituir la URL de una Source, registra primero la nueva Source Git y después
196
+ migra explícitamente las identidades globales de usuario con `source migrate <old-id> <new-id> (--skill <path>... |
197
+ --all) [--yes]`. La migración reescribe solo los registros globales de usuario
198
+ seleccionados: nunca mueve instalaciones físicas ni reescribe manifiestos de
199
+ proyecto. Las colisiones de identidad se rechazan. Las políticas de versión fija se
200
+ conservan solo cuando la Source de reemplazo aporta evidencia de commit coincidente;
201
+ en caso contrario se elimina la evidencia de la Source resuelta anterior. Las líneas
202
+ base de contenido siguen ligadas a la instalación sin cambios, y los métodos
203
+ proporcionados por el usuario se conservan para su revisión en lugar de reescribirse.
204
+
205
+ ## Opciones de desinstalación
206
+
207
+ La desinstalación es solo global de usuario y nunca lee ni cambia manifiestos de
208
+ proyecto. Las opciones son independientes: `--skills` elimina todos los Skills
209
+ gestionados globales de usuario, `--unmanaged-skill <exact-global-path>` elimina
210
+ únicamente directorios reales no gestionados seleccionados explícitamente bajo
211
+ `~/.agents/skills` o `~/.claude/skills`, `--data` elimina el archivo de estado de
212
+ catálogo/configuración y `--cli` muestra el traspaso al gestor de paquetes para
213
+ eliminar la CLI persistente. La eliminación de no gestionados nunca busca ni infiere
214
+ una Source, rechaza enlaces simbólicos, rutas transitorias/de copia de seguridad,
215
+ árboles inválidos, rutas gestionadas y solapamientos, y solo borra de forma
216
+ permanente después de mover el árbol sin cambios a un área de preparación del mismo
217
+ directorio padre. Los Skills y los datos del catálogo se conservan cuando se omiten
218
+ sus indicadores. Eliminar Skills reconcilia sus registros de instalación; eliminar
219
+ los datos conservando los Skills deja esos Skills sin registrar. Todo borrado del
220
+ sistema de archivos requiere `--yes` tras la previsualización completa, y la
221
+ previsualización de no gestionados advierte de que Agent Depot no puede garantizar la
222
+ recuperación sin una Source resoluble. Inmediatamente antes de cada eliminación
223
+ destructiva, Agent Depot vuelve a leer los registros de instalación gestionados y
224
+ falla de forma cerrada si han cambiado o si ahora reclaman la ruta seleccionada. El
225
+ almacén de estado de las Sources serializa las actualizaciones cooperantes, pero un
226
+ proceso no cooperante aún puede provocar una condición de carrera entre la última
227
+ comprobación y el renombrado/borrado en el sistema de archivos; los fallos de
228
+ preparación restauran la ruta original cuando se conoce el resultado y, en caso
229
+ contrario, conservan la ruta de preparación con un error de estado incierto. Agent
230
+ Depot nunca invoca ni infiere un gestor de paquetes, y las cachés de las Sources Git
231
+ se conservan. `uninstall --cli` muestra los comandos exactos
232
+ (`npm uninstall --global @iseoane/agent-depot`, `pnpm remove --global @iseoane/agent-depot`);
233
+ las ejecuciones con `npx`/`pnpm dlx` no necesitan desinstalación, solo dejan una
234
+ entrada de caché.
235
+
236
+ ## Actualizaciones por lotes
237
+
238
+ Comprueba cualquiera de los dos ámbitos de instalación independientes antes de
239
+ aplicar actualizaciones:
240
+
241
+ ```sh
242
+ agent-depot update check --scope project
243
+ agent-depot update check --scope user-global
244
+ ```
245
+
246
+ La comprobación informa por separado de los Skills gestionados `Updateable`,
247
+ `Current` y `Unknown`. `Unknown` significa que una selección gestionada registrada
248
+ no pudo evaluarse de forma segura (por ejemplo, porque no está disponible la
249
+ evidencia de su Source o de su versión); sigue siendo gestionada, pero no es
250
+ actualizable. Solo para `--scope user-global`, la comprobación también informa de los
251
+ directorios de Skill reales `Unmanaged` encontrados en ubicaciones absolutas exactas
252
+ bajo las raíces globales de usuario admitidas. Estos no son candidatos a
253
+ actualización, no se incluyen en los recuentos de estado de los gestionados y nunca
254
+ se buscan a través de una Source. Las comprobaciones de proyecto no inventarían ni
255
+ informan de directorios no gestionados.
256
+
257
+ Las entradas globales omitidas o inseguras se muestran por separado con
258
+ orientaciones y no son entradas Unmanaged ni candidatas a eliminación. Pueden ser
259
+ enlaces simbólicos, raíces o archivos de Skill inseguros, o rutas transitorias de
260
+ Agent Depot; inspecciónalas manualmente. El flujo posterior de eliminación de no
261
+ gestionados requiere su propia previsualización de ruta exacta y confirmación
262
+ explícita.
263
+
264
+ Aplica todos los Skills actualizables o selecciona uno o varios por su ID de
265
+ actualización impreso, su índice numérico o una ruta de Skill inequívoca:
266
+
267
+ ```sh
268
+ agent-depot update apply --scope project --all --yes
269
+ agent-depot update apply --scope user-global --skill 0 --yes
270
+ agent-depot update apply --scope user-global --package git:<source-id>::pi:. --yes
271
+ ```
272
+
273
+ Solo para `--scope user-global`, la comprobación también evalúa cada Package
274
+ registrado y `update apply` acepta `--package <selection>` repetible o incluye los
275
+ Packages actualizables con `--all`. Un Package con estado de versión `unknown`
276
+ nunca se ofrece como actualización. Los Packages se ejecutan después de los Skills
277
+ y las Apps, cada Package seleccionado previsualiza su plan congelado y se aprueba
278
+ mediante `package approve --action update` el recibo de actualización que falte antes de ejecutar desde la CLI. El ámbito de proyecto nunca lee ni
279
+ selecciona un Package.
280
+
281
+ Un Skill registrado en una ruta de proyecto no canónica (fuera de
282
+ `.agents/skills/<name>` y `.claude/skills/<name>`) está controlado por el
283
+ repositorio, por lo que `--yes` por sí solo no lo actualiza. La previsualización
284
+ imprime la ruta relativa; repite el comando con `--confirm-path` (una vez por cada
285
+ ruta de ese tipo):
286
+
287
+ ```sh
288
+ agent-depot update apply --scope project --all --yes --confirm-path vendor/alpha
289
+ ```
290
+
291
+ Aplicar siempre previsualiza primero cada candidato seleccionado. `--yes` es
292
+ obligatorio y confirma cada candidato de forma independiente; sin él no se cambian
293
+ archivos ni estado. Las instalaciones modificadas se señalan y nunca se sobrescriben
294
+ sin esa confirmación explícita. Los comandos de actualización externos muestran su
295
+ vector de argumentos exacto, el directorio de trabajo, el destino, los cambios
296
+ declarados y una advertencia de que los efectos secundarios no pueden verificarse ni
297
+ revertirse. Los Skills de versión desconocida se notifican pero no pueden
298
+ seleccionarse para su aplicación, y los fallos independientes se resumen después de
299
+ que terminen los candidatos restantes.
300
+
301
+ `discover` requiere uno o más ID de Source en cada invocación. Usa `source list` para
302
+ encontrar los ID registrados. Lee el HEAD actual del espejo Git en caché sin
303
+ refrescarlo, así que ejecuta primero `source refresh <id> --yes` cuando un espejo no
304
+ esté disponible o esté obsoleto. Imprime una línea `Candidate:` separada por
305
+ tabuladores por cada Skill reconocido con este formato:
306
+
307
+ ```text
308
+ Candidate: <source-id>\t<skill-path>\t<name>\t<description>
309
+ ```
310
+
311
+ El descubrimiento solo presenta candidatos. No persiste la selección de Sources, no
312
+ selecciona candidatos ni instala nada automáticamente.
313
+
314
+ ## Instalación global de usuario
315
+
316
+ Las instalaciones globales de usuario usan las mismas ubicaciones canónicas de Host
317
+ bajo el directorio personal del usuario (`.agents/skills/<skill>` y, cuando se
318
+ solicita, un enlace simbólico de Claude en `.claude/skills/<skill>`). Son
319
+ independientes de los manifiestos de proyecto y se registran en el estado compartido
320
+ de Sources por usuario, de modo que distintas invocaciones de la CLI reutilizan los
321
+ mismos registros de instalación. La Source, el Skill, los Hosts y la ubicación real
322
+ adoptada o instalada seleccionados se previsualizan antes de la confirmación con
323
+ `--yes`.
324
+
325
+ Una instalación directa de proyecto o global de usuario puede configurar su método de
326
+ instalación antes de la primera instalación con `--method <json>`. El valor debe ser
327
+ un único objeto de método JSON estricto, por ejemplo:
328
+
329
+ ```sh
330
+ agent-depot install --scope user-global --source builtin:agent-depot \
331
+ --skill architecture --host pi --version latest \
332
+ --method '{"kind":"command","argv":["node","scripts/install.mjs"],"cwd":"tools"}' \
333
+ --portable-v1 --yes
334
+ ```
335
+
336
+ El método se almacena como `methods.install`, tiene prioridad sobre los metadatos de
337
+ la Source y se ejecuta a partir de un vector de argumentos sin shell. El comando y
338
+ los cambios previstos se previsualizan antes de la confirmación. Esta opción solo
339
+ configura el método de instalación; la ejecución de actualizaciones no forma parte de
340
+ este ciclo de vida.
341
+
342
+ ## Instalación de proyecto
343
+
344
+ La instalación de proyecto requiere un `--scope project` explícito, un ID de Source,
345
+ la ruta del Skill, uno o más valores de `--host` (`pi`, `claude`, `codex` u
346
+ `opencode`) y una política de versión (`--version latest` o
347
+ `--version fixed:<value>`). Las Sources externas requieren un commit de Git fijo de
348
+ 40 o 64 caracteres. Para la Source integrada, `latest` sigue el paquete de Agent
349
+ Depot instalado, mientras que una política fija solo se acepta cuando su valor es
350
+ exactamente igual a la versión actual de ese paquete; los demás valores fallan de
351
+ forma cerrada porque la versión de paquete solicitada no puede reproducirse. Un
352
+ manifiesto escrito por otro Agent Depot sigue siendo cargable: un Skill integrado
353
+ fijado a una versión distinta aparece como desconocido en `update check` ("pinned to
354
+ Agent Depot X; running Y") y `install --manifest` lo omite, mientras que los demás
355
+ Skills siguen funcionando. La Source integrada no admite `--ref`, y la CLI lo rechaza
356
+ explícitamente. Un `latest` externo puede seguir una ref mutable segura explícita,
357
+ pero una ref de commit inmutable debe usar una política fija que coincida con ese
358
+ commit. El indicador `--portable-v1` exige la regla de formato portable validada; la
359
+ compatibilidad se deriva de los bytes de origen y de las exclusiones en lugar de
360
+ confiar en una afirmación del llamante. Se admite un directorio `agents/` relativo
361
+ al Skill: sus archivos permanecen dentro del árbol del Skill seleccionado y se
362
+ instalan en `.agents/skills/<skill>/agents/`, en lugar de tratarse como un
363
+ directorio `agents/` a nivel de Host. Otros directorios de primer nivel específicos
364
+ de Host, como `.claude`, `.codex`, `.opencode`, `.pi`, `extensions`, `plugins` y
365
+ `mcp`, quedan fuera del formato portable V1.
366
+
367
+ La CLI lee el árbol inmutable del Skill seleccionado antes de pedir `--yes`. Las
368
+ incompatibilidades con el formato portable se rechazan antes de la confirmación o de
369
+ cualquier escritura, mostrando en el error la ruta de origen rechazada y el motivo.
370
+ La identidad y el contenido del destino inspeccionados se arrastran a través de la
371
+ confirmación y se comprueban de nuevo inmediatamente antes del reemplazo; si hay
372
+ deriva, se aborta sin mover el destino. Una previsualización correcta lista los
373
+ archivos seleccionados exactos, incluidos los archivos de agents relativos al Skill
374
+ admitidos, y solo un `--yes` confirmado procede a la instalación.
375
+
376
+ Una instalación confirmada escribe `agent-depot.json` en la raíz del proyecto. El
377
+ manifiesto almacena la identidad integrada o una URL canónica externa, la ruta del
378
+ Skill, la política de versión y los Hosts, de modo que
379
+ `install --scope project --manifest` pueda resolverlo sin el catálogo global de
380
+ Sources. Los manifiestos portables rechazan las Sources de ruta local porque su
381
+ identidad no es resoluble de forma independiente. Las Sources Git externas solo se
382
+ refrescan tras la confirmación.
383
+
384
+ El árbol completo del Skill se copia byte a byte y se conservan los modos
385
+ ejecutables. Antes de la confirmación se inspeccionan las ubicaciones de Host
386
+ existentes y se muestran los conflictos. El contenido idéntico se adopta en su sitio;
387
+ un Skill ya registrado como gestionado debe cambiarse con `update apply`, no con una
388
+ nueva instalación. Por defecto no se sobrescribe ninguna ruta existente. Para un
389
+ directorio real sin registrar cuyo contenido difiere, el reemplazo requiere tanto
390
+ `--overwrite` como `--yes`:
391
+
392
+ ```sh
393
+ agent-depot install --scope project --source builtin:agent-depot \
394
+ --skill architecture --host pi --version latest --portable-v1 --overwrite --yes
395
+ ```
396
+
397
+ La previsualización es explícita sobre esta distinción: sin `--yes` no se modifica
398
+ ningún archivo ni estado de instalación; con ambos indicadores, informa de que el
399
+ destino será reemplazado y muestra el patrón de copia de seguridad
400
+ `.agent-depot-backup-<generated-suffix>`. El mismo contrato se aplica a
401
+ `--scope user-global`. Los enlaces simbólicos, los archivos especiales, los árboles
402
+ inseguros, las ubicaciones ambiguas de Claude y las condiciones de carrera entre la
403
+ previsualización y la mutación fallan de forma cerrada. El reemplazo primero mueve el
404
+ directorio original exacto a una copia de seguridad persistente junto a la
405
+ instalación y después instala el árbol inmutable de la previsualización. La CLI
406
+ imprime la ruta de la copia de seguridad; las copias de seguridad correctas nunca se
407
+ borran automáticamente. Los fallos de reemplazo en el sistema de archivos y de
408
+ manifiesto/estado global se restauran dentro del proceso antes de devolver el error.
409
+ La reversión verifica la copia de seguridad retenida y el contenido de reemplazo
410
+ antes de borrar el reemplazo y falla de forma cerrada cuando alguno de los dos ha
411
+ cambiado. Estas son las comprobaciones portables del sistema de archivos más fuertes
412
+ disponibles, no un compare-and-swap atómico entre procesos: un escritor externo aún
413
+ puede provocar una condición de carrera tras la comprobación final, por lo que Agent
414
+ Depot no afirma serializar escritores concurrentes. Esto no es una recuperación ante
415
+ caídas: una caída del proceso después de mover el original puede dejar el directorio
416
+ `.agent-depot-backup-*` retenido sin un estado de reemplazo garantizado. Detén la
417
+ CLI, inspecciona la copia de seguridad y el destino, y renombra manualmente la copia
418
+ de seguridad retenida a la ruta de instalación prevista cuando sea necesaria la
419
+ recuperación; después vuelve a ejecutar la instalación. Los métodos de instalación
420
+ externos solo se ejecutan después de que la transacción del sistema de archivos y del
421
+ estado del ámbito seleccionado haya tenido éxito.
422
+ Claude se expone mediante un enlace simbólico a la instalación canónica
423
+ `.agents/skills/<skill>`.
424
+
425
+ ## Métodos de instalación proporcionados por el usuario
426
+
427
+ Una selección de proyecto puede persistir métodos portables de instalación y de
428
+ futura actualización en su campo `methods`:
429
+
430
+ ```json
431
+ {
432
+ "source": { "kind": "external", "url": "https://example.com/skills.git", "ref": "main" },
433
+ "path": "portable/example",
434
+ "version": { "policy": "latest" },
435
+ "hosts": ["pi"],
436
+ "methods": {
437
+ "install": { "kind": "command", "argv": ["node", "scripts/install.mjs"], "cwd": "tools" },
438
+ "update": { "kind": "command", "argv": ["node", "scripts/update.mjs"] }
439
+ }
440
+ }
441
+ ```
442
+
443
+ La misma forma de selección se almacena bajo `userGlobalInstallations` en el estado
444
+ compartido `sources.json` global de usuario. `methods.install` tiene prioridad sobre
445
+ un método declarado por la Source seleccionada; el método de la Source solo se usa
446
+ cuando no existe un método de instalación configurado. El método `update` configurado
447
+ actualmente solo se persiste; la ejecución de actualizaciones pertenece al flujo de
448
+ actualización.
449
+
450
+ Antes de ejecutar cualquier método configurado o de la Source, la CLI previsualiza el
451
+ argv exacto, el cwd resuelto del proyecto o global de usuario, los archivos
452
+ seleccionados y las ubicaciones de instalación previstas. Requiere `--yes`
453
+ explícito; rechazar la previsualización no realiza ninguna instalación ni ejecuta
454
+ ningún método. Los métodos son vectores de argumentos, nunca cadenas de shell: deben
455
+ usar un único comando portable sin variantes específicas del sistema operativo, y se
456
+ rechazan los intérpretes de shell y la sintaxis de shell. La configuración no debe
457
+ contener credenciales literales. La validación rechaza patrones evidentes de
458
+ credenciales con el mejor esfuerzo posible; no puede detectar todos los secretos, por
459
+ lo que los usuarios siguen siendo responsables de evitar secretos en los argumentos o
460
+ en los archivos del repositorio.
461
+
462
+ Un método confirmado se ejecuta como código arbitrario de un proceso hijo, sin
463
+ sandbox. Puede cambiar cualquier ubicación del sistema de archivos o sistema externo
464
+ disponible para ese proceso; Agent Depot no puede previsualizar ni revertir esos
465
+ efectos secundarios. La instalación gestionada del Skill y el manifiesto/estado se
466
+ persisten antes de la ejecución del método, y un fallo del método conserva esos
467
+ registros. Los metadatos de la Source se leen de la misma instantánea de árbol
468
+ inmutable mostrada en la previsualización, no de una relectura mutable de la última
469
+ versión.
470
+
471
+ Una Source puede declarar un método de instalación únicamente mediante un archivo de
472
+ metadatos JSON explícito dentro del Skill seleccionado (`.agent-depot.json`,
473
+ `agent-depot-method.json` o `installation-method.json`), nunca a partir de la prosa
474
+ de `SKILL.md`. El archivo puede contener el objeto de método o
475
+ `{ "method": { "kind": "command", "argv": ["executable", "arg", ...],
476
+ "cwd": "optional/project-relative-directory" } }`. El ejecutable debe ser un nombre
477
+ de comando simple y seguro, y `cwd` debe permanecer por debajo de la raíz del
478
+ proyecto tras resolver el realpath. Un método confirmado sigue pasando por la
479
+ validación de compatibilidad, la instalación canónica y la ruta del enlace simbólico
480
+ de Claude. Se rechazan las instalaciones por lotes que contengan métodos porque los
481
+ efectos secundarios de procesos hijos arbitrarios no se pueden revertir. Las entradas
482
+ de manifiesto que identifican una ruta local externa son rechazadas por el
483
+ resolvedor exclusivo de Git con un error accionable de Source no admitida; las
484
+ Sources por URL siguen siendo autocontenidas y resolubles en una máquina nueva.
485
+
486
+ ## TUI interactiva
487
+
488
+ ```sh
489
+ agent-depot tui
490
+ ```
491
+
492
+ La TUI es un front end de [Ink](https://github.com/vadimdemedes/ink) (React para
493
+ terminales) sobre las mismas operaciones que la CLI. Necesita Node.js >= 24 y un
494
+ terminal interactivo; en caso contrario, `tui` falla con un error. Cambia de vista
495
+ con `1`-`5` y sal con `q` (no mientras haya un aviso abierto). Toda lista se
496
+ desplaza cuando es más alta que el terminal. `j`/`k` o las flechas mueven la
497
+ selección.
498
+
499
+ | Vista | Propósito |
500
+ | --- | --- |
501
+ | 1 Sources | Sources de Git (sus skills y Packages) y recetas App del usuario en una sola lista, con tipos `skills`/`app` y acciones contextuales. |
502
+ | 2 Catalog | Skills que se pueden instalar: los que aún no están instalados, como Source y luego Skills. Cada Source muestra además un grupo Packages, y los Skills que posee un bundle se marcan y se atenúan. |
503
+ | 3 Installations | Lo que hay en disco: instalaciones gestionadas (globales de usuario y de proyecto), selecciones de Packages y skills globales de usuario no gestionados. |
504
+ | 4 Updates | Skills y Packages gestionados con una versión más reciente disponible, para el ámbito global de usuario y de proyecto. |
505
+ | 5 Import/Export | Transferir las elecciones portables de Sources globales de usuario, las selecciones de Skills, las App recipes y las selecciones de Packages. |
506
+
507
+ Teclas por vista (los avisos también aceptan `Esc` para cancelar y `y`/`n` para
508
+ confirmar):
509
+
510
+ | Vista | Teclas |
511
+ | --- | --- |
512
+ | Sources | `j`/`k` recorren Sources de Git y recetas App, sin cambiar de sección con Tab. `Enter` abre el Catálogo de una Source de Git (sus skills y Packages) o previsualiza/aprueba una receta. `n` añade una Source de Git reutilizable o guía la creación de recetas; `r` refresca Sources o recarga el estado de recetas; `d` elimina. `space`/`a` solo marcan Sources de Git. |
513
+ | Catalog | `Enter`/flechas expandir y contraer, `space` marcar, `a` marcar todos los listados, `i` instalar las Skills marcadas (o el skill resaltado) o previsualizar el bundle de Package resaltado, `/` filtrar, `s` alternar entre una Source o todas (cuando se abre desde una Source) |
514
+ | Installations | `Enter`/flechas expandir y contraer, `u` desinstalar (todos los Hosts o los Hosts elegidos) o eliminar un skill no gestionado, `h` o `i` añadir Hosts a una instalación, `A` o `Enter` adoptar un skill no gestionado, `space` marca una hoja y `a` marca todas las hojas visibles: con marcas, `u` y `h` actúan sobre todas ellas con una única previsualización combinada y una única confirmación (las instalaciones de proyecto se omiten con un motivo). En una fila de Package: `i` previsualiza el plan de instalación congelado y lo ejecuta, aprobando antes el recibo si falta; `Enter` solo aprueba la declaración de instalación; `U` actualiza, `u` desinstala, `f` olvida el registro de selección. Las filas de Package no se pueden marcar para acciones por lotes. |
515
+ | Updates | `space` marcar, `a` marcar todo, `t`/`p`/`g` mostrar todo, proyecto o global de usuario, `Enter` previsualizar las marcas, `r` comprobar de nuevo, las flechas pliegan la línea "cannot assess". Un Package marcado se une al lote y se aprueba antes de ejecutar su actualización. |
516
+ | Import/Export | `e` exportar, `i` importar; introduce una ruta de archivo, `space` alterna opciones, `a` alterna todas, `Enter` previsualiza, `y` aplica; `j`/`k` desplazan las previsualizaciones y los resultados |
517
+
518
+ Al eliminar una receta App se comprueban su comando de versión aprobado y su
519
+ seguimiento. Si la App está instalada o sigue registrada, la TUI ofrece el flujo
520
+ existente de desinstalación: `n` cancela la eliminación y un fallo conserva la
521
+ receta. Tras verificar la desinstalación —o si no está instalada— se confirma por
522
+ separado el borrado exclusivo del archivo o enlace de la receta. No se eliminan
523
+ implícitamente datos de la App ni configuración de Hosts. Las recetas inválidas
524
+ deben repararse antes de poder comprobar el estado de su App.
525
+
526
+ Modelo de seguridad:
527
+
528
+ - No se escribe nada antes de una previsualización y un `y` explícito. Exponer un
529
+ skill a un Host adicional necesita una segunda confirmación, separada, como
530
+ `--confirm-additional-host`.
531
+ - Una instalación refresca su Source Git antes de la previsualización, de modo que el
532
+ contenido que confirmas es el contenido que se aplica. La vista Updates refresca
533
+ las Sources Git en uso cuando entras en ella y con `r`.
534
+ - Una acción de Package previsualiza la declaración congelada y los comandos exactos
535
+ del Host. Si falta el recibo de la acción, el primer `y` lo aprueba y un segundo `y`
536
+ ejecuta el comando del Host; una acción ya aprobada se ejecuta con el primer `y`.
537
+ `n` o `Esc` en cualquiera de las dos puertas cancela sin aprobar ni ejecutar nada.
538
+ Listar y recargar Packages nunca ejecuta un comando del Host.
539
+ - La Source integrada es fija: se muestra como una fila no seleccionable y no puede
540
+ refrescarse ni eliminarse.
541
+ - La eliminación es solo global de usuario. Las instalaciones de proyecto se listan,
542
+ pero la desinstalación de proyecto no está admitida (`u` sobre una fila de proyecto
543
+ muestra un mensaje).
544
+ - Los skills no gestionados se eliminan solo desde las rutas listadas en la
545
+ previsualización. Un enlace simbólico se elimina como enlace; su destino nunca se
546
+ toca.
547
+ - Las instalaciones y eliminaciones por lotes se aplican elemento a elemento; un
548
+ fallo no detiene a los demás y cada elemento informa de su propio resultado.
549
+
550
+ Consulta [CONTEXT.md](https://github.com/iseoane/agent-depot/blob/main/CONTEXT.md) para ver los términos del dominio y [docs/adr](https://github.com/iseoane/agent-depot/tree/main/docs/adr) para ver las decisiones que hay detrás de la TUI.
551
+
552
+ ## Configuración y caché
553
+
554
+ El catálogo de Sources y los registros de instalación globales de usuario se
555
+ almacenan juntos en:
556
+
557
+ - Linux y otras plataformas Unix: `$XDG_STATE_HOME/agent-depot/sources.json`,
558
+ o `~/.local/state/agent-depot/sources.json` cuando `XDG_STATE_HOME` no está
559
+ definida.
560
+ - Windows: `%APPDATA%/Agent Depot/sources.json` (con respaldo en el directorio
561
+ `AppData/Roaming` del usuario).
562
+
563
+ Los espejos Git se almacenan en caché por separado del catálogo:
564
+
565
+ - Linux y otras plataformas Unix: `$XDG_CACHE_HOME/agent-depot/git-sources`,
566
+ o `~/.cache/agent-depot/git-sources`.
567
+ - Windows: `%LOCALAPPDATA%/Agent Depot/git-sources`.
568
+
569
+ ## Limitaciones
570
+
571
+ Los Packages están limitados a los Hosts Pi y Claude Code en V1. El empaquetado de
572
+ Codex y OpenCode, los paquetes de Pi procedentes de npm, los Packages de ámbito de
573
+ proyecto y los marketplace de Claude externos quedan aplazados, y una selección de
574
+ Claude de versión fija se rechaza; consulta [Packages](#packages).
575
+
576
+ Solo se aceptan URL de repositorios Git que usen `git:`, `http:`, `https:` o `ssh:`.
577
+ `refresh` usa la URL registrada y ejecuta Git con matrices de argumentos, sin shell.
578
+ Crea u obtiene un espejo bare, sincroniza explícitamente todas las refs y poda las
579
+ refs eliminadas; no hace checkout de archivos, no instala skills ni elige Sources
580
+ automáticamente. Se requiere acceso a la red para un refresh confirmado.
581
+
582
+ ## Desarrollo
583
+
584
+ Desde un checkout de código fuente, compila y ejecuta la CLI directamente:
585
+
586
+ ```sh
587
+ pnpm install
588
+ pnpm build
589
+ node dist/src/cli.js --version
590
+ ```
591
+
592
+ ## Análisis estático
593
+
594
+ [Fallow](https://docs.fallow.tools) 3.30.0 se ejecuta mediante `npx --yes fallow@3.30.0`
595
+ (fijado, sin instalar ninguna dependencia) y lee `.fallowrc.json`, que define los
596
+ puntos de entrada y los límites de las capas de módulos (`cli` -> `tui` -> `application`
597
+ -> `core` -> `infrastructure`; las importaciones solo pueden apuntar hacia abajo, y
598
+ `cli` también puede usar directamente las capas inferiores). `scripts/**` forma una
599
+ zona aislada `tooling`. Todo archivo fuente debe pertenecer a una zona; los módulos
600
+ de App y Profile están en `application`, excepto `atomic-file.ts`, que está en
601
+ `infrastructure`.
602
+
603
+ - `pnpm audit:dead-code`: archivos, exportaciones y dependencias sin usar, además de
604
+ violaciones de límites. Debe salir limpio.
605
+ - `pnpm audit:dupes`: duplicación de código (umbral del 6%).
606
+ - `pnpm audit:health`: complejidad y puntuaciones CRAP usando cobertura real; falla
607
+ cuando la puntuación de salud cae por debajo de 85.
608
+ - `pnpm audit:all`: ejecuta las tres comprobaciones en orden.
609
+ - `pnpm test:coverage`: ejecuta los tests con la cobertura V8 integrada
610
+ (`NODE_V8_COVERAGE`, source maps) en `coverage/v8`, que Fallow lee.
611
+ Recompila `dist/` con source maps; no se necesitan dependencias adicionales.
612
+
613
+ ## App recipes globales de usuario
614
+
615
+ Coloca recipes JSON propiedad del usuario en `apps/`, junto al `sources.json` por
616
+ usuario (Linux/WSL: `${XDG_STATE_HOME:-~/.local/state}/agent-depot/apps`; Windows:
617
+ `%APPDATA%\Agent Depot\apps`). Las recipes nunca se reescriben ni las suministran las
618
+ Sources.
619
+
620
+ ```sh
621
+ agent-depot app schema
622
+ agent-depot app validate /path/to/example.json
623
+ agent-depot app list
624
+ agent-depot app approve example --yes
625
+ ```
626
+
627
+ La validación previsualiza cada argv declarado y su ejecutable resuelto, pero nunca
628
+ aprueba recipes (`validate --yes` se rechaza). Revisa la previsualización antes de
629
+ usar `app approve <name> --yes`: la aprobación autoriza los comandos de versión, no
630
+ solo un comportamiento de solo lectura. Los recibos de aprobación privados y escritos
631
+ de forma atómica viven en el directorio hermano `app-approvals/` y están ligados a la
632
+ ruta canónica del archivo y al hash exacto de su contenido. Si cambian los bytes, se
633
+ requiere una nueva aprobación; restaurar los bytes aprobados restaura la aprobación.
634
+ `app list` nunca aprueba recipes. Las recipes inválidas se muestran con sus motivos;
635
+ la validación termina con código distinto de cero para recipes inválidas. Las recipes
636
+ de otras plataformas se notifican como no aplicables y nunca se ejecutan. WSL cuenta
637
+ como Linux y nunca ejecuta ejecutables cuyo realpath esté bajo `/mnt/<drive>/`; omite
638
+ esos candidatos del PATH mientras busca ejecutables de Linux. Los comandos lanzan el
639
+ candidato del PATH en lugar del realpath para que los shims y los binarios multicall
640
+ conserven su identidad.
641
+
642
+ Los campos obligatorios son `name`, `install`, `update`, `uninstall` y `version`. Los
643
+ pasos del ciclo de vida contienen `argv`, `manual` o ambos; el texto manual nunca se
644
+ ejecuta. `version` contiene un `argv` seguro sin shell y un `pattern` de expresión
645
+ regular de JavaScript con un grupo de captura. Los comandos se ejecutan desde el
646
+ directorio personal del usuario. Una comprobación de versión sin éxito o no
647
+ resoluble significa no instalado. El esquema describe la estructura; `app validate`
648
+ además impone la seguridad del argv y la semántica de la expresión regular.
649
+
650
+ ### Instalar, actualizar y desinstalar
651
+
652
+ ```sh
653
+ agent-depot app install example # solo previsualización; termina con código distinto de cero hasta que se confirma
654
+ agent-depot app install example --yes
655
+ agent-depot app update example --yes
656
+ agent-depot app uninstall example --yes
657
+ agent-depot app setup example --host pi --host codex --yes
658
+ agent-depot app teardown example --host pi --yes
659
+ ```
660
+
661
+ Cada paso previsualiza su texto argv/manual, el ejecutable resuelto, el directorio de
662
+ trabajo (el personal del usuario) y el entorno. El recurso manual solo se produce
663
+ cuando un proceso no puede lanzarse, nunca tras una salida con código distinto de
664
+ cero (que se notifica con stdout/stderr). Ejecuta tú mismo las instrucciones manuales
665
+ mostradas y después certifica la finalización sin volver a ejecutar el argv:
666
+
667
+ ```sh
668
+ agent-depot app install example --manual-done --yes
669
+ agent-depot app uninstall example --manual-done --yes
670
+ ```
671
+
672
+ `--yes` por sí solo no certifica la finalización manual. La instalación registra una
673
+ versión solo cuando la comprobación de versión tiene éxito. La desinstalación
674
+ mantiene el seguimiento mientras la versión siga teniendo éxito;
675
+ `agent-depot app uninstall example --forget --yes` elimina explícitamente el
676
+ seguimiento sin ejecutar ningún comando de la recipe, incluso si la recipe ya no
677
+ existe. Los registros atómicos por App viven en el directorio hermano
678
+ `app-installations/`. La desinstalación no ejecuta implícitamente el teardown de Host.
679
+
680
+ `app list` y `update check --scope user-global` resuelven las últimas versiones desde
681
+ GitHub Releases, npm o un `latest.argv` aprobado. Las consultas ausentes o fallidas
682
+ son desconocidas y nunca se ofrecen como actualizaciones. Las peticiones HTTP
683
+ públicas no envían credenciales, rechazan redirecciones, limitan las respuestas a
684
+ 1 MiB y expiran a los cinco segundos.
685
+
686
+ ```sh
687
+ agent-depot update apply --scope user-global --all --yes
688
+ agent-depot update apply --scope user-global --skill 0 --app example --yes
689
+ agent-depot app update example --manual-done --yes
690
+ ```
691
+
692
+ `--all` incluye Apps y Skills; repite `--app <name>` para seleccionar Apps junto con
693
+ Skills. Las actualizaciones de Apps se ejecutan **después de los Skills** en el mismo
694
+ lote. Las Apps son solo globales de usuario; `--all --scope project` omite las Apps.
695
+ Cada paso seleccionado se previsualiza antes de la confirmación del lote; los fallos
696
+ independientes no detienen las actualizaciones restantes. Los resultados manuales del
697
+ lote se completan por separado con `app update --manual-done`. Las actualizaciones
698
+ registran la versión confirmada por el comando de versión de la recipe, no la
699
+ respuesta del registro. Las actualizaciones requieren un cambio de versión; las
700
+ versiones sin cambios fallan sin reescribir el seguimiento de lo instalado. Una `v`
701
+ inicial y los cambios de SemVer que solo afectan a los metadatos de compilación
702
+ cuentan como sin cambios, igual que en las comprobaciones de disponibilidad. Los
703
+ resultados correctos muestran `installed <old> -> <new> (latest <latest>)`, incluso
704
+ cuando new difiere de latest. Una previsualización/recurso manual de actualización
705
+ confirmado guarda evidencia privada de versión en el directorio hermano
706
+ `app-pending-updates/`, de modo que una invocación posterior de `--manual-done` pueda
707
+ comparar con la versión previa a la actualización. Una finalización manual
708
+ certificada consume esta evidencia incluso en caso de fallo; obtén una nueva
709
+ previsualización confirmada antes de reintentar.
710
+
711
+ La comparación estricta de SemVer ignora una `v` inicial, ordena las prereleases y no
712
+ ofrece una degradación cuando la versión instalada es igual o posterior a la última.
713
+ Las versiones que no son SemVer usan una desigualdad opaca y **pueden ofrecer una
714
+ degradación**. GitHub `/releases/latest` excluye borradores y prereleases; npm usa
715
+ `dist-tags.latest` de los metadatos del paquete. `app list` comprueba las Apps de
716
+ forma concurrente, conservando el orden del listado. El fallo de la comprobación de
717
+ una App no oculta otras Apps ni las actualizaciones de Skills. Los fallos de consulta
718
+ muestran sus motivos (redirección, límite de peticiones, estado HTTP, tiempo de
719
+ espera agotado, respuesta demasiado grande o inválida).
720
+
721
+
722
+ Los comandos del ciclo de vida de las Apps no son interactivos: stdin se ignora
723
+ (EOF), como en el ejecutor de comandos de Skills existente, y no hay tiempo límite de
724
+ ejecución. Las recipes deben usar indicadores no interactivos; los instaladores que
725
+ requieren un terminal pertenecen a los pasos `manual`. EOF hace que los avisos
726
+ basados en stdin fallen en lugar de esperar una entrada, pero un proceso que ignore
727
+ EOF aún puede quedarse colgado; cancélalo manualmente. Los stdout y stderr
728
+ capturados de las Apps están limitados cada uno a 1 MiB; los fallos muestran solo
729
+ sus últimos 4 KiB.
730
+
731
+ El setup/teardown de Apps solo acepta Hosts declarados para esa acción. Todos los
732
+ pasos seleccionados se previsualizan antes de la ejecución; cada Host obtiene un
733
+ resultado y los fallos no detienen a los Hosts restantes. Para la finalización
734
+ manual, vuelve a ejecutar el Host seleccionado con `--manual-done --yes`. Esto
735
+ comprueba la versión de la App, no la integración con el Host. Las acciones de Host
736
+ nunca cambian el seguimiento de Apps instaladas.
737
+
738
+ ## Packages
739
+
740
+ Un Package es un bundle nativo del Host descubierto dentro de una Source registrada:
741
+ un paquete de Pi (un `package.json` con una clave `pi`, o los directorios
742
+ convencionales `extensions/`, `skills/`, `prompts/` y `themes/`) o un plugin de Claude
743
+ Code (un `.claude-plugin/plugin.json` vinculado por un
744
+ `.claude-plugin/marketplace.json` dentro del repositorio). Un mismo repositorio puede
745
+ ser ambas cosas, como `pstack-claude`. V1 solo admite los Hosts Pi y Claude Code; el
746
+ empaquetado de Codex y OpenCode, los paquetes de Pi procedentes de npm y los Packages
747
+ de ámbito de proyecto quedan aplazados.
748
+
749
+ Agent Depot no copia el contenido de un bundle. Lee el manifiesto del bundle en un
750
+ inventario de componentes tipado, deriva los comandos propios del Host a partir de esa
751
+ declaración, los ejecuta mediante el ejecutor de comandos sin shell tras la aprobación
752
+ y lee la versión instalada de los archivos de estado del Host. El Host posee lo que
753
+ está instalado. Agent Depot posee el registro de selección y el recibo de lo que
754
+ delegó. Los Skills propios de un bundle nunca se ofrecen para adopción ni se instalan
755
+ por segunda vez, porque el Host posee sus archivos y ubicaciones.
756
+
757
+ ### Añadir una Source y descubrir sus bundles
758
+
759
+ El descubrimiento lee el espejo Git en caché y nunca lo refresca. El primer
760
+ descubrimiento de una Source cuyo espejo falta falla hasta que refresques esa Source:
761
+
762
+ ```sh
763
+ agent-depot source add https://github.com/michael-denyer/pstack-claude.git
764
+ agent-depot source list
765
+ agent-depot source refresh git:<source-id> --yes
766
+ agent-depot package discover git:<source-id>
767
+ ```
768
+
769
+ `package discover` imprime una línea por bundle de la Source junto con su inventario
770
+ de componentes. `pstack-claude` produce un bundle de Pi en la raíz del repositorio y
771
+ un bundle de Claude desde su marketplace dentro del repositorio:
772
+
773
+ ```text
774
+ Package git:<source-id>::pi:.: pstack
775
+ Package git:<source-id>::claude:.#pstack: pstack
776
+ ```
777
+
778
+ Cada línea de componente indica un tipo, una propiedad (`skill-category` o
779
+ `host-only`), un efecto y las rutas declaradas. Las definiciones de agente y los
780
+ servidores MCP aparecen como `host-only`: Agent Depot los informa y los deja al Host.
781
+
782
+ ### Seleccionar, aprobar y ejecutar una acción de ciclo de vida
783
+
784
+ Una selección es `<source-id>::<bundle-path>` más `--host`, o una selección
785
+ cualificada por Host `<source-id>::<host>:<bundle-path>`. La ruta de un bundle de
786
+ Claude termina en `#<plugin-name>` cuando la Source ofrece más de un plugin.
787
+
788
+ `approve` es por acción. Escribe el recibo de la declaración exacta de esa única
789
+ acción, por lo que aprobar `install` no autoriza `update`. `--yes` confirma la
790
+ ejecución y nunca sustituye a la aprobación. Planificar una acción de ciclo de vida
791
+ refresca primero la Source Git de la selección, de modo que el manifiesto
792
+ previsualizado es el que usan los comandos.
793
+
794
+ ```sh
795
+ # Paquete de Pi en la raíz del repositorio
796
+ agent-depot package inspect git:<source-id>::pi:. --host pi
797
+ agent-depot package install git:<source-id>::pi:. --host pi
798
+ agent-depot package approve git:<source-id>::pi:. --host pi --action install
799
+ agent-depot package install git:<source-id>::pi:. --host pi --yes
800
+
801
+ # Plugin de Claude Code desde el marketplace dentro del repositorio
802
+ agent-depot package inspect git:<source-id>::claude:.#pstack --host claude
803
+ agent-depot package approve git:<source-id>::claude:.#pstack --host claude --action install
804
+ agent-depot package install git:<source-id>::claude:.#pstack --host claude --yes
805
+ ```
806
+
807
+ Los comandos `install`, `update` y `uninstall` imprimen la previsualización completa y
808
+ después terminan con código distinto de cero hasta que exista el recibo de la acción
809
+ y se indique `--yes`. La previsualización muestra el origen y el commit resueltos, el
810
+ descriptor, el inventario de componentes con su propiedad y efecto, cada comando del
811
+ Host con el nombre de su ejecutable, las coordenadas registradas que la acción puede
812
+ cambiar (`affects`), el directorio de trabajo, el entorno y cualquier advertencia.
813
+ Inmediatamente antes de la ejecución, Agent Depot vuelve a derivar la declaración y se
814
+ detiene con `stale plan` si el manifiesto, el commit, la identidad de instalación o
815
+ los comandos ordenados cambiaron desde la previsualización. Cuando el Host ya informa
816
+ del bundle como instalado, el plan no ejecuta ningún comando y solo registra la
817
+ selección.
818
+
819
+ Los comandos del Host para los dos Hosts de V1:
820
+
821
+ | Host | Instalar | Actualizar | Desinstalar |
822
+ | --- | --- | --- | --- |
823
+ | Pi | `pi install <source>` | `pi update <source>` | `pi remove <source>` |
824
+ | Claude Code | `claude plugin marketplace add <source>`, después `claude plugin install <plugin>@<marketplace>` | `claude plugin marketplace update <marketplace>`, después `claude plugin update <plugin>@<marketplace>` | `claude plugin uninstall <plugin>@<marketplace>` |
825
+
826
+ Agent Depot omite el paso `marketplace add` cuando el Host ya conoce el marketplace y
827
+ siempre nombra el marketplace en el verbo de actualización con ámbito. Cada acción de
828
+ V1 afecta solo a su propia selección.
829
+
830
+ ### Estado instalado, versiones y eliminación
831
+
832
+ `package list` muestra cada selección registrada con su ID de instalación y la
833
+ evidencia de versión que Agent Depot registró. La evidencia en vivo procede de
834
+ `~/.pi/agent/settings.json` y `~/.claude/plugins/installed_plugins.json`, que Agent
835
+ Depot lee y nunca escribe. Un archivo de Host ausente es una vista vacía. Un archivo
836
+ desviado o ilegible deja la búsqueda afectada en `unknown` y nunca lanza una
837
+ excepción. Un paquete git de Pi sin versión se informa como `unknown`, nunca como
838
+ `current`.
839
+
840
+ Una actualización registra una versión nueva solo cuando el estado del Host cambió de
841
+ una forma que Agent Depot puede verificar, es decir, cuando las dos observaciones
842
+ coinciden en una versión o en un commit hexadecimal y difieren, o cuando el Host pasó
843
+ de no tener nada instalado a instalado. Una actualización no verificable falla y deja
844
+ el registro intacto. `uninstall` delega el comando del Host y después elimina el
845
+ registro de selección:
846
+
847
+ ```sh
848
+ agent-depot package approve git:<source-id>::pi:. --host pi --action uninstall
849
+ agent-depot package uninstall git:<source-id>::pi:. --host pi --yes
850
+ agent-depot package forget git:<source-id>::pi:. --host pi --yes
851
+ ```
852
+
853
+ `forget` elimina solo el registro de selección de Agent Depot. No ejecuta ningún
854
+ comando del Host y deja la instalación del Host tal cual.
855
+
856
+ ### Límites de los Packages
857
+
858
+ - Una selección de Claude de versión fija no puede delegarse. `claude plugin install`
859
+ toma `<plugin>@<marketplace>` y no tiene hueco para un pin, así que planificar un
860
+ `install` o `update` de Claude con una política de versión `fixed` falla en cerrado
861
+ en lugar de reclamar un pin que el Host ignoraría. Usa `latest` para una selección
862
+ de Claude, o un pin fijo para una selección de Pi, hasta que se verifique una forma
863
+ de pin admitida por Claude.
864
+ - Un plugin de Claude sin vinculación a un marketplace dentro del repositorio se
865
+ informa pero no es instalable.
866
+ - Agent Depot no lee la salida en prosa de la CLI del Host, incluido `pi list`. La
867
+ evidencia instalada procede solo de los archivos de estado del Host.
868
+
869
+ ## Exportar un Profile global de usuario
870
+
871
+ Exporta las elecciones portables a otra máquina o guárdalas en git:
872
+
873
+ ```sh
874
+ agent-depot export > profile.json
875
+ agent-depot export --out profile.json
876
+ agent-depot export --no-apps --source <source-id> --skill doctor-md-agents
877
+ agent-depot export --no-sources --no-skills --app my-tool --app another-tool
878
+ agent-depot export --package git:<source-id>::pi:.
879
+ ```
880
+
881
+ Todo lo portable se selecciona por defecto. `--no-sources`, `--no-skills`,
882
+ `--no-apps` y `--no-packages` excluyen bloques; `--source <id|url>`,
883
+ `--skill <path|name>`, `--app <name>` y `--package <selection>`, que son repetibles,
884
+ restringen cada bloque de forma independiente. Las selecciones desconocidas y
885
+ combinar el filtro de inclusión de un bloque con su indicador `--no-*` son errores.
886
+
887
+ La salida estándar contiene solo JSON; stderr muestra la previsualización y los
888
+ motivos de exclusión. `--out` requiere un archivo nuevo (los archivos existentes y
889
+ los enlaces simbólicos no se reemplazan). Los Profiles contienen URL de Git
890
+ canónicas con su inclusión en el descubrimiento, las políticas de versión/Hosts/
891
+ métodos de usuario registrados de los Skills, recipes de App completas, incluidas
892
+ las recipes de otras plataformas, y selecciones de Package solo como declaraciones:
893
+ su Source, coordenadas de Host y política de versión. La exportación por CLI siempre
894
+ escribe
895
+ `included: true`; las elecciones de descubrimiento son transitorias, mientras que la
896
+ TUI puede pasar elecciones de inclusión explícitas al núcleo de exportación
897
+ compartido. La exportación no refresca Sources ni ejecuta comandos de Apps, y un
898
+ recibo de Package nunca viaja en un Profile.
899
+
900
+ Las rutas locales y las credenciales evidentes no son portables. Los elementos no
901
+ portables o inválidos se excluyen con sus motivos, al igual que los Skills no
902
+ gestionados, propiedad de Apps y de proyecto, las ubicaciones/evidencia de
903
+ instalación, los recibos de aprobación, el estado de las Apps instaladas, las
904
+ actualizaciones pendientes y los recibos/estado instalado de los Packages. Las
905
+ comprobaciones de portabilidad del texto libre de las
906
+ recipes son conservadoras; revisa los Profiles antes de compartirlos: los secretos
907
+ arbitrarios no pueden detectarse automáticamente.
908
+
909
+ ## Importar un Profile global de usuario
910
+
911
+ Primero previsualiza y después confirma explícitamente la misma selección:
912
+
913
+ ```sh
914
+ agent-depot import profile.json
915
+ agent-depot import profile.json --yes
916
+ agent-depot import profile.json --no-apps --skill doctor-md-agents --yes
917
+ ```
918
+
919
+ La importación usa los mismos filtros independientes por bloque/nombre que la
920
+ exportación, incluidos `--no-packages` y `--package <selection>`. Informa de **add**
921
+ (añadir), **same** (igual, omitido) y **conflict**
922
+ (conflicto, con la diferencia mostrada, omitido). Sin `--yes` no se escribe nada. Las
923
+ elecciones existentes y los archivos en conflicto nunca se reemplazan. Un Profile
924
+ producido por una versión más reciente de Agent Depot genera una advertencia, no un
925
+ error.
926
+
927
+ Las adiciones confirmadas se ejecutan en orden: registro de Sources, Skills globales
928
+ de usuario mediante las previsualizaciones de instalación refrescadas y las
929
+ comprobaciones de seguridad normales, después las App recipes y a continuación las
930
+ selecciones de Packages. Se conservan los
931
+ Hosts, las políticas de versión y los métodos de usuario registrados. Incluso sin
932
+ `--yes`, la previsualización de cada Skill a añadir muestra su Source, Hosts,
933
+ política de versión y el argv completo de cada método proporcionado por el usuario,
934
+ marcado como que se ejecuta solo tras la confirmación. La previsualización de
935
+ instalación normal sigue apareciendo antes de la ejecución. Cada fallo se notifica
936
+ de forma independiente y los elementos restantes continúan; cualquier elemento
937
+ fallido hace que el comando termine con código distinto de cero.
938
+
939
+ Una selección de Package es solo una selección. La importación la reproduce mediante
940
+ la acción `select` del flujo, que escribe un recibo solo para esa acción, cuya
941
+ declaración no contiene ningún argv. No autoriza ninguna instalación ni actualización
942
+ y no ejecuta ningún comando del Host, así que la importación nunca instala un Package.
943
+
944
+ Las recipes, incluidas las de otras plataformas, llegan **sin aprobar** a `apps/`.
945
+ Una recipe de destino con el mismo nombre bloquea la importación solo cuando su
946
+ plataforma se solapa con la de la recipe entrante: las plataformas iguales se
947
+ solapan, y una plataforma ausente se solapa con todas las plataformas. Las recipes
948
+ de plataformas disjuntas pueden añadirse ambas. El JSON de recipe inválido usa su
949
+ nombre y plataforma en bruto para la misma comprobación; los archivos de nombre
950
+ desconocido se notifican con detalles de lectura/análisis sin bloquear Apps no
951
+ relacionadas. Un Profile no puede contener recipes del mismo nombre cuya aplicabilidad
952
+ de plataforma se solape. La importación nunca instala Apps ni ejecuta comandos de
953
+ recipes. Revisa y aprueba las recipes aplicables con
954
+ `agent-depot app approve <name> --yes` antes de usar sus comandos de ciclo de vida.
955
+ La inclusión de una Source en el descubrimiento sigue siendo una elección transitoria
956
+ del frontend, no un cambio persistente en una Source existente. Los Skills llevan su
957
+ propia identidad de Source, por lo que omitir su bloque de Sources no fuerza el
958
+ registro; la previsualización nombra las Sources no registradas que se obtendrán sin
959
+ registrarse. Las filas de Sources existentes explican cuándo la inclusión en el
960
+ descubrimiento difiere pero no se importa.
961
+
962
+ La pestaña **5 Import/Export** de la TUI ofrece listas de verificación agrupadas y
963
+ las mismas previsualizaciones del núcleo compartido que la CLI. Las exclusiones y los
964
+ conflictos no pueden seleccionarse. La exportación solo crea un archivo nuevo; las
965
+ exportaciones vacías no escriben nada (la CLI informa de un error). La importación
966
+ añade las elecciones que faltan sin reemplazar las existentes. Las recipes importadas
967
+ permanecen sin aprobar y la importación nunca instala Apps. Las selecciones de Package
968
+ importadas se registran sin instalar ningún bundle y sin ejecutar ningún comando del
969
+ Host.