Página para quien va a tocar el código. El repositorio trae material de sobra para ello —docs/architecture.md, CONTRIBUTING.md y un AGENTS.md de 15 KB con las convenciones completas— y esto recoge lo que hace falta saber antes de empezar.
El entorno de desarrollo
pip install -e ".[dev]"
pytest
ruff check . && ruff format .
mypy
bandit -r src/jaigent -ll
pip-audit
Consejo
docs/architecture.md, que recorre el conjunto en una sola página, y seguir por agent.py.Cómo está organizado el código
| Ruta | Qué es |
|---|---|
src/jaigent/agent.py |
El bucle de llamadas a herramientas. 21 KB |
src/jaigent/cli.py |
La interfaz de terminal. 163 KB, el fichero más grande del proyecto con diferencia |
src/jaigent/chatgpt.py |
El puente HTTP entrante protegido por OAuth hacia el gateway existente. 46 KB |
src/jaigent/mcp.py |
El núcleo JSON-RPC de MCP y el transporte stdio |
src/jaigent/config.py |
La configuración |
src/jaigent/memory.py |
Las notas opcionales del proyecto |
src/jaigent/plugins.py |
Los plugins de herramientas locales |
src/jaigent/branding.py |
El wordmark naranja de jAI |
src/jaigent/data/skills/ |
Los dos skills integrados: tope de gasto y compactado |
src/jaigent/llm/ |
Los adaptadores de proveedor |
src/jaigent/tools/ |
Espacio aislado, ficheros, web y shell |
Son 45 módulos .py bajo src/jaigent/ y 55 ficheros de pruebas en tests/. Las pruebas más grandes dicen dónde está el riesgo: test_cli_interactive.py (62 KB), test_updater.py (55 KB) y test_regressions.py (37 KB).
Probarlo sin gastar tokens
examples/mock_llm_server.py (5,9 KB) es un servidor diminuto compatible con OpenAI pensado exactamente para eso. Ignora la inteligencia del modelo y reproduce un plan fijo: listar el espacio de trabajo, escribir un resumen y responder. Admite peticiones con y sin streaming, así que ejercita los mismos caminos de código que un proveedor real.
python examples/mock_llm_server.py # escucha en :8000
Y en otra terminal:
JAIGENT_BASE_URL=http://localhost:8000/v1 \
JAIGENT_API_KEY=not-a-real-key \
jaigent "summarise notes.md into summary.md" --verbose
Nota
not-a-real-key no es un descuido: el servidor de simulación no la valida. Sirve para comprobar el flujo completo —aprobaciones, checkpoints, streaming, herramientas— sin que cueste dinero.examples/basic_usage.py (4,8 KB) es la otra cara: cómo usar jAIgent desde Python, con una clave real de por medio.
Los workflows y las releases
Lo que hay alrededor de la integración continua:
| Fichero | Tamaño | Qué es |
|---|---|---|
.github/workflows/ci.yml |
— | La suite en varias plataformas |
.github/workflows/release.yml |
— | Construcción de binarios y publicación |
docs/ci-and-releases.md |
7 KB | Los jobs de CI, cómo cortar una release, publicar en PyPI y republicar una etiqueta |
tests/test_workflows.py |
22 KB | Pruebas de regresión de los propios workflows |
scripts/activate-ci.sh |
7 KB | Coloca los workflows donde GitHub los lee y mantiene honestas sus rutas |
packaging/workflow-fixes-v0.5.1.patch |
3 KB | El parche con las reparaciones, para aplicarlo a mano |
docs/workflow-repair-v0.5.1.md |
4,5 KB | El registro de por qué hicieron falta |
En packaging/ están además los dos instaladores (install.sh e install.ps1), la receta de PyInstaller (jaigent.spec), un lanzador (launcher.py), el generador de iconos (make_icon.py) y las imágenes de las que derivan.
Por qué existe activate-ci.sh
GitHub rechaza cualquier push que cree o edite un fichero bajo .github/workflows/ si el token no lleva el ámbito workflows. La cuenta de automatización que escribe esos ficheros no lo tiene, así que no podía empujar sus propias correcciones. El script existe para ejecutarlo desde una máquina propia, con credenciales propias, que sí tienen ese ámbito. Es seguro ejecutarlo varias veces: solo hace commit cuando algo cambió de verdad.
Las tres reparaciones, y su estado actual
docs/workflow-repair-v0.5.1.md arranca diciendo que main trae workflows que fallan en todas las plataformas. Eso era cierto cuando se escribió; hoy las tres reparaciones están aplicadas en main. Merece la pena saber cuáles fueron, porque las tres son trampas del runner de Windows y no del código:
ci.yml, «Smoke test the CLI», fallaba en los dos runners de Windows. El paso decíadoctor || true. El shell por defecto en Windows espwsh, y el runner antepone$ErrorActionPreference = 'stop'a cada paso de pwsh.doctorsale con 1 si no hay clave de API, pwsh intentaba entonces ejecutartrue—que en Windows no es un comando— y el paso abortaba. Solución aplicada: el paso va fijado ashell: bash, con un comentario que explica por qué.release.yml, «Smoke test the binary (windows)», salía con 1 teniendo unjaigent.exebueno. El runner añade al finalif ((Test-Path -LiteralPath variable:\LASTEXITCODE)) { exit $LASTEXITCODE }a cada paso de pwsh, y el último comando nativo del paso eradoctor, que sale con 1 por diseño. El paso publicaba ese 1 como propio y el binario se descartaba. Solución aplicada:$PSNativeCommandUseErrorActionPreference = $falseal principio yexit 0al final; losthrowsiguen fallando ante problemas reales.release.yml, el jobmacos-x64nunca salía de la cola.macos-13se retiró el 4 de diciembre de 2025 y los jobs sobre imágenes retiradas se quedan en cola para siempre. Solución aplicada:macos-15-intel, el sucesor x86_64 designado por GitHub.
Importante
tests/test_workflows.py.Dónde seguir
- Seguridad — el modelo de amenazas y las versiones con soporte.
- Referencia de tools — la API de Python y cómo añadir una herramienta propia.
- Skills, plugins y horarios — las cuatro formas de ampliarlo con ficheros locales.