aioli-cli 0.1.48__tar.gz → 0.2.0__tar.gz

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 (137) hide show
  1. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/.gitignore +2 -0
  2. aioli_cli-0.2.0/PKG-INFO +160 -0
  3. aioli_cli-0.2.0/README.md +130 -0
  4. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/pyproject.toml +4 -12
  5. aioli_cli-0.2.0/src/aioli_cli/agent_guide.md +111 -0
  6. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_cli/backend_manager.py +155 -15
  7. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_cli/fetch_ui.py +20 -1
  8. aioli_cli-0.2.0/src/aioli_cli/lifecycle.py +207 -0
  9. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_cli/main.py +335 -93
  10. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_cli/readiness.py +104 -3
  11. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_cli/setup.py +159 -38
  12. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_cli/status.py +246 -41
  13. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_contract/advise.py +308 -8
  14. aioli_cli-0.2.0/src/aioli_contract/audiocpp.py +118 -0
  15. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_contract/config.py +16 -0
  16. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_contract/doctor.py +24 -3
  17. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_contract/fetch.py +56 -95
  18. aioli_cli-0.2.0/src/aioli_contract/journal.py +99 -0
  19. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/cli.py +14 -1
  20. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/config.py +1 -1
  21. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/data/models.toml +24 -0
  22. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/doctor.py +4 -9
  23. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/launcher.py +194 -25
  24. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/models.py +4 -2
  25. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/models_data.py +97 -24
  26. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/plugin.py +1 -1
  27. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/presets.py +7 -0
  28. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_master/doctor.py +3 -3
  29. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_master/plugin.py +3 -1
  30. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/backends/__init__.py +8 -0
  31. aioli_cli-0.2.0/src/aioli_music/backends/acestep_turbo.py +14 -0
  32. aioli_cli-0.2.0/src/aioli_music/backends/audiocpp_music.py +223 -0
  33. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/backends/base.py +4 -0
  34. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/backends/minimax_comfy.py +2 -8
  35. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/backends/yue2.py +11 -9
  36. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/cli_commands/generate_cmd.py +27 -4
  37. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/config.py +17 -34
  38. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/config_data/default.toml +1 -21
  39. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/doctor.py +10 -26
  40. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/models.py +51 -8
  41. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/models_data.py +107 -3
  42. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/paths.py +1 -1
  43. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/plugin.py +1 -1
  44. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_podcast/plugin.py +1 -1
  45. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_video/cli.py +14 -10
  46. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_video/doctor.py +5 -3
  47. aioli_cli-0.2.0/src/aioli_video/managed.py +287 -0
  48. aioli_cli-0.2.0/src/aioli_video/models_data.py +28 -0
  49. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_video/plugin.py +1 -1
  50. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_video/wgp.py +127 -15
  51. aioli_cli-0.2.0/src/aioli_video/worker.py +138 -0
  52. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/cli/doctor.py +10 -3
  53. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/cli/engines_cmd.py +2 -2
  54. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/cli/generate.py +10 -5
  55. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/cli/models_cmd.py +7 -3
  56. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/cli/profiles.py +4 -1
  57. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/config/settings.py +39 -4
  58. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/core/generation.py +26 -4
  59. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/core/model_manager.py +45 -1
  60. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/engines/__init__.py +12 -0
  61. aioli_cli-0.2.0/src/aioli_voice/engines/audiocpp.py +287 -0
  62. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/engines/chatterbox.py +4 -11
  63. aioli_cli-0.2.0/src/aioli_voice/engines/chatterbox_gguf.py +42 -0
  64. aioli_cli-0.2.0/src/aioli_voice/engines/pocket.py +21 -0
  65. aioli_cli-0.2.0/src/aioli_voice/engines/qwen3_tts.py +20 -0
  66. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/engines/voxcpm.py +4 -11
  67. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/models_data.py +165 -9
  68. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/plugin.py +1 -1
  69. aioli_cli-0.1.48/PKG-INFO +0 -147
  70. aioli_cli-0.1.48/README.md +0 -115
  71. aioli_cli-0.1.48/src/aioli_music/core/jobs.py +0 -262
  72. aioli_cli-0.1.48/src/aioli_video/models_data.py +0 -61
  73. aioli_cli-0.1.48/src/aioli_video/worker.py +0 -39
  74. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/LICENSE +0 -0
  75. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_cli/_plugins.py +0 -0
  76. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_cli/managed.py +0 -0
  77. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_cli/registry.py +0 -0
  78. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_contract/__init__.py +0 -0
  79. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_contract/model_ids.py +0 -0
  80. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_contract/probe.py +0 -0
  81. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_contract/readiness.py +0 -0
  82. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_contract/short_verb.py +0 -0
  83. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_contract/ui.py +0 -0
  84. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/__init__.py +0 -0
  85. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/companions.py +0 -0
  86. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/gpu.py +0 -0
  87. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/progress.py +0 -0
  88. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/stub.py +0 -0
  89. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_image/ui.py +0 -0
  90. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_master/cli.py +0 -0
  91. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_master/ops.py +0 -0
  92. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/__init__.py +0 -0
  93. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/backends/acestep.py +0 -0
  94. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/backends/llm_caption.py +0 -0
  95. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/backends/process.py +0 -0
  96. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/backends/stub.py +0 -0
  97. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/cli_commands/__init__.py +0 -0
  98. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/cli_commands/backend_cmd.py +0 -0
  99. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/cli_commands/inspire_cmd.py +0 -0
  100. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/cli_commands/models_cmd.py +0 -0
  101. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/client.py +0 -0
  102. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/core/__init__.py +0 -0
  103. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/core/formats.py +0 -0
  104. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/core/generate.py +0 -0
  105. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/core/layout.py +0 -0
  106. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/generator.py +0 -0
  107. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/history.py +0 -0
  108. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/jsonstore.py +0 -0
  109. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/presets.py +0 -0
  110. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/prompts.py +0 -0
  111. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/server.py +0 -0
  112. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/transport/__init__.py +0 -0
  113. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/transport/client.py +0 -0
  114. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_music/tui.py +0 -0
  115. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_podcast/cast.py +0 -0
  116. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_podcast/cli.py +0 -0
  117. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_podcast/doctor.py +0 -0
  118. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_podcast/episode.py +0 -0
  119. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_podcast/feed.py +0 -0
  120. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_podcast/script.py +0 -0
  121. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_video/__init__.py +0 -0
  122. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_video/paths.py +0 -0
  123. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_video/stub.py +0 -0
  124. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/__init__.py +0 -0
  125. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/config/__init__.py +0 -0
  126. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/core/__init__.py +0 -0
  127. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/core/profiles.py +0 -0
  128. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/core/registry.py +0 -0
  129. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/core/types.py +0 -0
  130. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/devices.py +0 -0
  131. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/doctor.py +0 -0
  132. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/engines/kokoro.py +0 -0
  133. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/engines/moss.py +0 -0
  134. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/engines/piper.py +0 -0
  135. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/engines/qwen3.py +0 -0
  136. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/engines/stub.py +0 -0
  137. {aioli_cli-0.1.48 → aioli_cli-0.2.0}/src/aioli_voice/engines/xtts.py +0 -0
@@ -15,6 +15,8 @@ coverage.xml
15
15
  web/node_modules/
16
16
  web/dist/
17
17
  web/.astro/
18
+ # copia de ../install.sh que hace `pnpm build`/`pnpm dev`
19
+ web/public/install.sh
18
20
 
19
21
  dist/
20
22
  .kaudit/
@@ -0,0 +1,160 @@
1
+ Metadata-Version: 2.5
2
+ Name: aioli-cli
3
+ Version: 0.2.0
4
+ Summary: aioli — local-first AI media suite CLI (images, video, music, voice, podcast)
5
+ Author: aioli contributors
6
+ License: MIT
7
+ License-File: LICENSE
8
+ Keywords: ai,generative,image,local-first,music,tts,video
9
+ Classifier: License :: OSI Approved :: MIT License
10
+ Classifier: Operating System :: POSIX :: Linux
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Topic :: Multimedia
13
+ Requires-Python: >=3.12
14
+ Requires-Dist: httpx>=0.27
15
+ Requires-Dist: huggingface-hub>=0.30
16
+ Requires-Dist: inquirerpy>=0.3.4
17
+ Requires-Dist: numpy>=1.26
18
+ Requires-Dist: pillow>=13.0
19
+ Requires-Dist: pydantic-settings>=2.3
20
+ Requires-Dist: pydantic>=2.7
21
+ Requires-Dist: pyyaml>=6.0
22
+ Requires-Dist: rich>=13.0
23
+ Requires-Dist: soundfile>=0.12
24
+ Requires-Dist: typer>=0.12
25
+ Provides-Extra: voice-kokoro
26
+ Requires-Dist: kokoro-onnx>=0.4; extra == 'voice-kokoro'
27
+ Provides-Extra: voice-piper
28
+ Requires-Dist: piper-tts>=1.2; extra == 'voice-piper'
29
+ Description-Content-Type: text/markdown
30
+
31
+ <p align="center">
32
+ <img src="assets/logo-transparent.png" width="220" alt="logo de aioli — ajo robot" />
33
+ </p>
34
+
35
+ <h1 align="center">🧄 aioli</h1>
36
+
37
+ <p align="center">
38
+ <em>Tu estudio de IA en casa: clona voces, compón canciones, dibuja imágenes,<br />genera vídeo y produce podcasts. Todo en tu máquina. Sin nube.</em>
39
+ </p>
40
+
41
+ <p align="center">
42
+ <a href="https://pypi.org/project/aioli-cli/"><img src="https://img.shields.io/pypi/v/aioli-cli" alt="versión en PyPI" /></a>
43
+ <img src="https://img.shields.io/badge/python-%3E%3D3.12-blue" alt="python >= 3.12" />
44
+ <img src="https://img.shields.io/badge/license-MIT-green" alt="MIT" />
45
+ <img src="https://img.shields.io/badge/GPU-NVIDIA%20recomendada-orange" alt="GPU NVIDIA recomendada" />
46
+ </p>
47
+
48
+ <p align="center">
49
+ 🎙️ Voz &nbsp;•&nbsp; 🎵 Música &nbsp;•&nbsp; 🖼️ Imagen &nbsp;•&nbsp; 🎬 Vídeo &nbsp;•&nbsp; 🎧 Master &nbsp;•&nbsp; 📻 Podcast
50
+ </p>
51
+
52
+ ---
53
+
54
+ ## Qué hace (con ejemplos reales)
55
+
56
+ | Plugin | Produce | Ejemplo |
57
+ | --- | --- | --- |
58
+ | 🎙️ `voice` | Voz clonada o sintética en WAV (español nativo con chatterbox, borradores gratis en CPU con piper) | `aioli voice "Hola mundo" --profile vega -o hola.wav` |
59
+ | 🎵 `music` | Canción completa (voz + instrumentos) a partir de un estilo y tu letra; canta en español | `aioli music --preset reggae-consciente -l mi-letra.txt -o tema.mp3` |
60
+ | 🖼️ `image` | Imagen desde texto, edición, inpainting o referencia de personaje (~9 s con FLUX-klein-4b) | `aioli image "un ajo robot"` |
61
+ | 🎬 `video` | Clip MP4 con audio sincronizado desde texto o imagen | `aioli video "un ajo robot bailando" --frames 81 -o ajo.mp4` |
62
+ | 🎧 `master` | Acabado de audio con ffmpeg: mezcla, ducking, reducción de ruido, `-16 LUFS` | `aioli master loudnorm mezcla.wav -o final.wav` |
63
+ | 📻 `podcast` | Episodio MP3 + notas del programa a partir de un guion (voces + cama musical + pausas) | `aioli podcast episode guion.md -o ./ep1` |
64
+
65
+ 19 canciones, sus carátulas y varios clips se hicieron así, en local,
66
+ con estos comandos. Sin cuentas ni suscripciones.
67
+
68
+ ## Cómo funciona
69
+
70
+ 1. `aioli install` inspecciona tu máquina y te dice qué cabe en tu GPU.
71
+ 2. `aioli models download` descarga pesos verificados (sha256, reanudables)
72
+ en `~/.local/share/aioli/models` (o donde apunte `AIOLI_MODELS_DIR`).
73
+ 3. Generas en local: ni un byte sale de tu máquina. Sin cuentas ni
74
+ suscripciones (ningún modelo del catálogo pide cuenta de HuggingFace).
75
+
76
+ ## Instalación
77
+
78
+ Tres pasos (Linux, Mac y Windows):
79
+
80
+ ```bash
81
+ # 1. uv, el instalador de Python de Astral (si no lo tienes ya)
82
+ curl -LsSf https://astral.sh/uv/install.sh | sh # Linux y Mac
83
+ # Windows (PowerShell): powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
84
+
85
+ # 2. aioli
86
+ uv tool install aioli-cli
87
+
88
+ # 3. el asistente: mira tu equipo, te recomienda qué cabe y descarga solo lo que elijas
89
+ aioli install
90
+ ```
91
+
92
+ Necesitas también `ffmpeg` (Linux: `sudo apt install ffmpeg` · Mac:
93
+ `brew install ffmpeg` · Windows: `winget install ffmpeg`). `aioli doctor`
94
+ te dice si falta algo y cómo arreglarlo. Para actualizar: `aioli update`.
95
+
96
+ > Próximamente: instalador de un solo comando que hace los tres pasos (y
97
+ > ffmpeg, preguntando antes). Ya está en `install.sh` del repo.
98
+
99
+ ### ¿No eres técnico? Pídeselo a tu asistente de IA
100
+
101
+ Si usas Claude Code (u otro asistente que ejecuta comandos):
102
+
103
+ ```bash
104
+ aioli agent install # le enseña a tu asistente a instalar y usar aioli
105
+ ```
106
+
107
+ Y luego pídele, sin más: *«instálame aioli para hacer canciones con mi letra»*.
108
+ El asistente mira tu equipo (`aioli status --json`), te propone qué instalar con
109
+ su tamaño y licencia, **pregunta antes de descargar** y nunca usa `sudo`.
110
+ Para otros asistentes, `aioli agent guide` imprime la misma guía.
111
+
112
+ ## Requisitos
113
+
114
+ | Qué | Mínimo | Recomendado |
115
+ | --- | --- | --- |
116
+ | SO | Linux (Ubuntu 22.04+), Mac | Ubuntu 24.04 |
117
+ | GPU | ninguna (voz en CPU con piper) | NVIDIA 12–16 GB de VRAM |
118
+ | Disco | 15 GB (un plugin) | 100 GB (el conjunto completo ≈ 60 GB) |
119
+ | Cuenta | — | — (sin cuentas: espejos públicos verificados) |
120
+
121
+ `aioli install` detecta tu máquina (nivel `patata/modesta/capaz/bicha`,
122
+ sí, de patata a bestia) y solo descarga lo que cabe. Los pesos se verifican
123
+ con sha256 y se reanudan si se corta tu conexión.
124
+
125
+ ## Uso
126
+
127
+ Camino feliz: `aioli install` → `aioli <plugin> "texto"` → `aioli doctor`
128
+ (solo si algo falla). Las recetas por modelo están en `docs/USAGE.md`.
129
+
130
+ ```bash
131
+ # imagen: texto → PNG (edición, inpainting y referencia disponibles)
132
+ aioli image "un faro en la niebla"
133
+ aioli image "un faro en la niebla" -m z-image-turbo -o faro.png
134
+
135
+ # música: estilo + tu letra → canción completa
136
+ aioli music "rumba alegre" -l mi-letra.txt -o tema.mp3
137
+ aioli music generate --preset reggae-consciente -l mi-letra.txt -o tema.mp3
138
+
139
+ # voz: crea un perfil, añade una muestra con su transcripción, genera
140
+ aioli voice profiles create vega --language es
141
+ aioli voice profiles add-sample vega ref.wav -t "transcripción exacta del audio"
142
+ aioli voice "Hola mundo" --profile vega --engine chatterbox -o hola.wav
143
+
144
+ # vídeo: texto o imagen → clip con audio
145
+ aioli video "un ajo robot bailando" --frames 81 -o ajo.mp4
146
+
147
+ # podcast: guion con [ROL], [MUSIC:] y [PAUSE:] → episodio + notas
148
+ aioli podcast episode guion.md -o ./ep1
149
+
150
+ # master: remata cualquier audio (mezcla, ducking, -16 LUFS…)
151
+ aioli master loudnorm mezcla.wav -o final.wav
152
+ ```
153
+
154
+ `aioli <plugin> --help` detalla cada comando; `aioli doctor` diagnostica
155
+ los fallos.
156
+
157
+ ## Licencia
158
+
159
+ MIT. Los pesos de terceros llevan su propia licencia (algunos no comerciales
160
+ o con aceptación previa en HuggingFace); `aioli models` te avisa.
@@ -0,0 +1,130 @@
1
+ <p align="center">
2
+ <img src="assets/logo-transparent.png" width="220" alt="logo de aioli — ajo robot" />
3
+ </p>
4
+
5
+ <h1 align="center">🧄 aioli</h1>
6
+
7
+ <p align="center">
8
+ <em>Tu estudio de IA en casa: clona voces, compón canciones, dibuja imágenes,<br />genera vídeo y produce podcasts. Todo en tu máquina. Sin nube.</em>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://pypi.org/project/aioli-cli/"><img src="https://img.shields.io/pypi/v/aioli-cli" alt="versión en PyPI" /></a>
13
+ <img src="https://img.shields.io/badge/python-%3E%3D3.12-blue" alt="python >= 3.12" />
14
+ <img src="https://img.shields.io/badge/license-MIT-green" alt="MIT" />
15
+ <img src="https://img.shields.io/badge/GPU-NVIDIA%20recomendada-orange" alt="GPU NVIDIA recomendada" />
16
+ </p>
17
+
18
+ <p align="center">
19
+ 🎙️ Voz &nbsp;•&nbsp; 🎵 Música &nbsp;•&nbsp; 🖼️ Imagen &nbsp;•&nbsp; 🎬 Vídeo &nbsp;•&nbsp; 🎧 Master &nbsp;•&nbsp; 📻 Podcast
20
+ </p>
21
+
22
+ ---
23
+
24
+ ## Qué hace (con ejemplos reales)
25
+
26
+ | Plugin | Produce | Ejemplo |
27
+ | --- | --- | --- |
28
+ | 🎙️ `voice` | Voz clonada o sintética en WAV (español nativo con chatterbox, borradores gratis en CPU con piper) | `aioli voice "Hola mundo" --profile vega -o hola.wav` |
29
+ | 🎵 `music` | Canción completa (voz + instrumentos) a partir de un estilo y tu letra; canta en español | `aioli music --preset reggae-consciente -l mi-letra.txt -o tema.mp3` |
30
+ | 🖼️ `image` | Imagen desde texto, edición, inpainting o referencia de personaje (~9 s con FLUX-klein-4b) | `aioli image "un ajo robot"` |
31
+ | 🎬 `video` | Clip MP4 con audio sincronizado desde texto o imagen | `aioli video "un ajo robot bailando" --frames 81 -o ajo.mp4` |
32
+ | 🎧 `master` | Acabado de audio con ffmpeg: mezcla, ducking, reducción de ruido, `-16 LUFS` | `aioli master loudnorm mezcla.wav -o final.wav` |
33
+ | 📻 `podcast` | Episodio MP3 + notas del programa a partir de un guion (voces + cama musical + pausas) | `aioli podcast episode guion.md -o ./ep1` |
34
+
35
+ 19 canciones, sus carátulas y varios clips se hicieron así, en local,
36
+ con estos comandos. Sin cuentas ni suscripciones.
37
+
38
+ ## Cómo funciona
39
+
40
+ 1. `aioli install` inspecciona tu máquina y te dice qué cabe en tu GPU.
41
+ 2. `aioli models download` descarga pesos verificados (sha256, reanudables)
42
+ en `~/.local/share/aioli/models` (o donde apunte `AIOLI_MODELS_DIR`).
43
+ 3. Generas en local: ni un byte sale de tu máquina. Sin cuentas ni
44
+ suscripciones (ningún modelo del catálogo pide cuenta de HuggingFace).
45
+
46
+ ## Instalación
47
+
48
+ Tres pasos (Linux, Mac y Windows):
49
+
50
+ ```bash
51
+ # 1. uv, el instalador de Python de Astral (si no lo tienes ya)
52
+ curl -LsSf https://astral.sh/uv/install.sh | sh # Linux y Mac
53
+ # Windows (PowerShell): powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
54
+
55
+ # 2. aioli
56
+ uv tool install aioli-cli
57
+
58
+ # 3. el asistente: mira tu equipo, te recomienda qué cabe y descarga solo lo que elijas
59
+ aioli install
60
+ ```
61
+
62
+ Necesitas también `ffmpeg` (Linux: `sudo apt install ffmpeg` · Mac:
63
+ `brew install ffmpeg` · Windows: `winget install ffmpeg`). `aioli doctor`
64
+ te dice si falta algo y cómo arreglarlo. Para actualizar: `aioli update`.
65
+
66
+ > Próximamente: instalador de un solo comando que hace los tres pasos (y
67
+ > ffmpeg, preguntando antes). Ya está en `install.sh` del repo.
68
+
69
+ ### ¿No eres técnico? Pídeselo a tu asistente de IA
70
+
71
+ Si usas Claude Code (u otro asistente que ejecuta comandos):
72
+
73
+ ```bash
74
+ aioli agent install # le enseña a tu asistente a instalar y usar aioli
75
+ ```
76
+
77
+ Y luego pídele, sin más: *«instálame aioli para hacer canciones con mi letra»*.
78
+ El asistente mira tu equipo (`aioli status --json`), te propone qué instalar con
79
+ su tamaño y licencia, **pregunta antes de descargar** y nunca usa `sudo`.
80
+ Para otros asistentes, `aioli agent guide` imprime la misma guía.
81
+
82
+ ## Requisitos
83
+
84
+ | Qué | Mínimo | Recomendado |
85
+ | --- | --- | --- |
86
+ | SO | Linux (Ubuntu 22.04+), Mac | Ubuntu 24.04 |
87
+ | GPU | ninguna (voz en CPU con piper) | NVIDIA 12–16 GB de VRAM |
88
+ | Disco | 15 GB (un plugin) | 100 GB (el conjunto completo ≈ 60 GB) |
89
+ | Cuenta | — | — (sin cuentas: espejos públicos verificados) |
90
+
91
+ `aioli install` detecta tu máquina (nivel `patata/modesta/capaz/bicha`,
92
+ sí, de patata a bestia) y solo descarga lo que cabe. Los pesos se verifican
93
+ con sha256 y se reanudan si se corta tu conexión.
94
+
95
+ ## Uso
96
+
97
+ Camino feliz: `aioli install` → `aioli <plugin> "texto"` → `aioli doctor`
98
+ (solo si algo falla). Las recetas por modelo están en `docs/USAGE.md`.
99
+
100
+ ```bash
101
+ # imagen: texto → PNG (edición, inpainting y referencia disponibles)
102
+ aioli image "un faro en la niebla"
103
+ aioli image "un faro en la niebla" -m z-image-turbo -o faro.png
104
+
105
+ # música: estilo + tu letra → canción completa
106
+ aioli music "rumba alegre" -l mi-letra.txt -o tema.mp3
107
+ aioli music generate --preset reggae-consciente -l mi-letra.txt -o tema.mp3
108
+
109
+ # voz: crea un perfil, añade una muestra con su transcripción, genera
110
+ aioli voice profiles create vega --language es
111
+ aioli voice profiles add-sample vega ref.wav -t "transcripción exacta del audio"
112
+ aioli voice "Hola mundo" --profile vega --engine chatterbox -o hola.wav
113
+
114
+ # vídeo: texto o imagen → clip con audio
115
+ aioli video "un ajo robot bailando" --frames 81 -o ajo.mp4
116
+
117
+ # podcast: guion con [ROL], [MUSIC:] y [PAUSE:] → episodio + notas
118
+ aioli podcast episode guion.md -o ./ep1
119
+
120
+ # master: remata cualquier audio (mezcla, ducking, -16 LUFS…)
121
+ aioli master loudnorm mezcla.wav -o final.wav
122
+ ```
123
+
124
+ `aioli <plugin> --help` detalla cada comando; `aioli doctor` diagnostica
125
+ los fallos.
126
+
127
+ ## Licencia
128
+
129
+ MIT. Los pesos de terceros llevan su propia licencia (algunos no comerciales
130
+ o con aceptación previa en HuggingFace); `aioli models` te avisa.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "aioli-cli"
3
- version = "0.1.48"
3
+ version = "0.2.0"
4
4
  description = "aioli — local-first AI media suite CLI (images, video, music, voice, podcast)"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -26,7 +26,7 @@ dependencies = [
26
26
  "pyyaml>=6.0",
27
27
  "numpy>=1.26",
28
28
  "soundfile>=0.12",
29
- "pillow>=10.0", # stubs de imagen (contrato: stub funciona sin GPU ni extras)
29
+ "pillow>=13.0", # 13.0: 35 CVE corregidos (pip-audit 2026-10-22). stubs de imagen (contrato: stub funciona sin GPU ni extras)
30
30
  ]
31
31
 
32
32
 
@@ -39,7 +39,6 @@ voice-piper = ["piper-tts>=1.2"] # binario + onnxruntime via pip
39
39
  # D13: kokoro-onnx fuera de la base (el motor lo importa lazy y el spec
40
40
  # declara el extra; antes pesaba en cada fresh install sin usarse).
41
41
  voice-kokoro = ["kokoro-onnx>=0.4"] # motor neural ES (CPU, sin clonar)
42
- music-storage = ["boto3>=1.34"]
43
42
 
44
43
  [project.scripts]
45
44
  aioli = "aioli_cli.main:main"
@@ -121,7 +120,7 @@ testpaths = [
121
120
  # dev dep). Sin `fail-under` ni exclusiones: medir no es un gate, y un umbral
122
121
  # inventado sin baseline sería ruido. Regresión de config:
123
122
  # `libs/contract/tests/test_bootstrap.py::TestCoverageConfig`.
124
- addopts = "-q --cov=src --cov-report=term-missing --cov-report=xml"
123
+ addopts = "-q -n auto --cov=src --cov-report=term-missing --cov-report=xml"
125
124
  # Markers: "network" sube a upstream real (gasta red y disco). Opt-in via
126
125
  # AIOLI_NET_TESTS=1, lo activa el job smoke-bundles de release.yml.
127
126
  markers = [
@@ -139,6 +138,7 @@ dev = [
139
138
  "ruff==0.16.8",
140
139
  "mypy==2.3.1",
141
140
  "pip-audit==2.10.1",
141
+ "pytest-xdist>=3.6",
142
142
  ]
143
143
 
144
144
  [tool.mypy]
@@ -186,14 +186,6 @@ ignore_missing_imports = true
186
186
  module = ["pytest", "pytest.*"]
187
187
  ignore_missing_imports = true
188
188
 
189
- # DEBT: aioli_music.core.jobs imports aioli_music.core.storage, which does not
190
- # exist (unimplemented object-storage feature); nothing imports jobs. Decide:
191
- # implement storage or delete the module. Until then its errors stay hidden
192
- # but listed here — not silently green.
193
- [[tool.mypy.overrides]]
194
- module = ["aioli_music.core.jobs"]
195
- ignore_errors = true
196
-
197
189
  [tool.ruff]
198
190
  line-length = 100
199
191
  target-version = "py312"
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: aioli
3
+ description: Instala, diagnostica y usa aioli (estudio de IA local - voz, música, imagen, vídeo, podcast) en el ordenador del usuario. Úsala cuando el usuario quiera instalar aioli o sus modelos, saber qué puede usar en su equipo, arreglar un fallo de aioli o generar voz, canciones, imágenes o vídeo con aioli.
4
+ ---
5
+
6
+ # aioli: guía para agentes
7
+
8
+ aioli genera voz, música, imagen y vídeo en local. El usuario puede no ser
9
+ técnico: tú ejecutas los comandos, él decide. Todo comando tiene salida
10
+ `--json` estable donde importa; léela en vez de interpretar tablas.
11
+
12
+ ## Reglas (no negociables)
13
+
14
+ 1. **Pregunta antes de descargar.** Di cuántos GB y para qué; espera un sí.
15
+ 2. **Nunca uses `sudo`.** Si falta algo del sistema (ffmpeg), dile al usuario
16
+ el comando exacto y que lo ejecute él.
17
+ 3. **Nunca pidas tokens ni contraseñas por el chat.** Ningún modelo del
18
+ catálogo necesita cuenta de HuggingFace; si alguna vez hiciera falta, el
19
+ usuario ejecuta `hf auth login` él mismo.
20
+ 4. **Respeta las licencias.** Cada motor trae `license`/`license_note` en
21
+ `aioli status --json`. Si es `no comercial` o `condicional`, avísalo antes
22
+ de instalarlo o de usarlo para algo que el usuario quiera publicar o vender.
23
+ 5. **No borres modelos ni configuración** sin que el usuario lo pida.
24
+ 6. **No compartas la GPU a ciegas:** si hay otras apps usándola, usa `--gpu`
25
+ (`aioli status --json` → `machine.gpus[].free_gb`).
26
+
27
+ ## 1. ¿Está instalado?
28
+
29
+ ```bash
30
+ aioli version # si falla: no está instalado
31
+ ```
32
+
33
+ Si no está: `uv tool install aioli-cli`. Si tampoco hay `uv`, instálalo
34
+ primero con el instalador oficial de Astral (Linux/Mac:
35
+ `curl -LsSf https://astral.sh/uv/install.sh | sh`; Windows PowerShell:
36
+ `irm https://astral.sh/uv/install.ps1 | iex`) — pide permiso antes. Falta
37
+ `ffmpeg`: dile al usuario el comando de su sistema (regla 2).
38
+
39
+ ## 2. Lee el equipo y lo que cabe
40
+
41
+ ```bash
42
+ aioli status --json
43
+ ```
44
+
45
+ - `machine`: sistema, nivel (`patata`/`modesta`/`capaz`/`bicha`), GPUs con
46
+ VRAM libre, RAM y disco libre.
47
+ - `engines[]`: por cada `plugin`/`engine` → `state` (`listo` | `instalable` |
48
+ `no_cabe`), `suggested` (el recomendado para este equipo), `download_gb`,
49
+ `fix` (comando exacto para dejarlo listo), licencia, calidad y velocidad.
50
+
51
+ Propón al usuario los `suggested` que le interesen, con su tamaño y licencia.
52
+
53
+ ## 3. Instala lo que el usuario apruebe
54
+
55
+ ```bash
56
+ aioli install --plugins voice,image --yes # usos completos (motor sugerido)
57
+ aioli models download music -b heartmula --yes # un motor concreto (el `fix`)
58
+ aioli backend install video longcat --yes # vídeo: instala WanGP y sus modelos
59
+ ```
60
+
61
+ Códigos de salida de `aioli install`: `0` hecho, `3` no se eligió nada,
62
+ cualquier otro = error (lee la salida y pasa al paso 5).
63
+
64
+ Comprueba con `aioli status --json` que el motor quedó en `state: "listo"`.
65
+
66
+ ## 4. Usarlo
67
+
68
+ ```bash
69
+ aioli voice "Hola, soy Aioli" -o hola.wav # voz (motor por defecto)
70
+ aioli voice profiles create vega --language es # clonar una voz:
71
+ aioli voice profiles add-sample vega muestra.wav # 5-30 s limpios
72
+ aioli voice "Texto" --profile vega -m chatterbox-gguf -o v.wav
73
+ aioli music "rumba alegre, guitarra española" -l letra.txt -o tema.mp3
74
+ aioli music "…" -m heartmula -l letra.txt --gpu auto # mejor dicción en español
75
+ aioli image "un faro en la niebla" -o faro.png
76
+ aioli image "el personaje en la playa" -m flux3-klein -r personaje.png -o p.png
77
+ aioli video "un ajo robot bailando" -o ajo.mp4 # vídeo con voz (NVIDIA)
78
+ aioli video generate "…" -m longcat -r cara.png --audio-guide voz.wav --frames 225 -o avatar.mp4
79
+ # avatar que habla con esa voz
80
+ ```
81
+
82
+ `aioli <plugin> --help` lista todas las opciones. Las letras de canciones van
83
+ en un fichero de texto con `[verse]`, `[chorus]`, etc.
84
+
85
+ ## 5. Si algo falla
86
+
87
+ ```bash
88
+ aioli doctor --json
89
+ ```
90
+
91
+ `checks[]` trae `name`, `ok` y `detail`. Los `extra:*` de voz en rojo son
92
+ motores opcionales sin instalar: no son un fallo si el usuario no los usa.
93
+ Para un motor concreto, aplica el `fix` de `aioli status --json`. Errores
94
+ típicos y qué hacer:
95
+
96
+ - «No hay espacio en disco»: dile cuánto falta; puede liberar espacio o
97
+ guardar los modelos en otro disco con `AIOLI_MODELS_DIR=/ruta`.
98
+ - «necesita unos N GB de RAM/memoria de vídeo»: ese motor no es para este
99
+ equipo; usa el `suggested`.
100
+ - «checksum mismatch»: repite la descarga; si persiste, avisa al usuario
101
+ (puede ser un problema de red o del repositorio).
102
+
103
+ ## 6. Actualizar o desinstalar (solo si lo pide)
104
+
105
+ ```bash
106
+ aioli update --yes # última versión, conserva motores y extras
107
+ aioli uninstall --yes # quita el programa; conserva modelos y creaciones
108
+ aioli uninstall --delete-models --yes # también los modelos (decenas de GB): pregunta antes
109
+ ```
110
+
111
+ `uninstall` nunca borra lo que el usuario ha creado ni `~/ai/models`.