CLI para gestionar tickets de Jira usando lenguaje natural, con arquitectura hexagonal y LLM local (llama.cpp) como intérprete.
| Comando | Descripción |
|---|---|
search |
Buscar tickets con lenguaje natural (traduce a JQL) |
check |
Evaluar calidad de tickets (componente, story points, descripción, título) |
estimate |
Estimar esfuerzo en puntos Fibonacci usando contexto de repositorio GitHub |
- Node.js >= 22.0.0
- llama.cpp server corriendo localmente con API compatible OpenAI (por defecto en
http://localhost:8080) - Jira Cloud con API Token
El proyecto usa LangChain con la API compatible OpenAI. Asegúrate de que llama.cpp server esté corriendo:
./llama-server -m tu-modelo.gguf --host 0.0.0.0 --port 8080La API OpenAI-compatible estará disponible automáticamente en /v1/chat/completions.
# Clonar repositorio
git clone <repository-url>
cd ai-ticket-agent
# Instalar dependencias
npm install
# Configurar variables de entorno
cp .env.example .envEdita .env con tus credenciales:
# Jira Cloud (requerido)
JIRA_BASE_URL=https://tu-empresa.atlassian.net
[email protected]
JIRA_API_TOKEN=tu-api-token
# llama.cpp (requerido)
LLAMA_BASE_URL=http://localhost:8080
# GitHub (opcional, para repos privados)
GITHUB_TOKEN=ghp_xxxxActualiza data/dictionary.json con tus proyectos, componentes y estados de Jira:
{
"projects": [
{
"key": "TRD",
"name": "Transformación digital",
"aliases": ["plataforma del dato", "pgi", "CRM"]
}
],
"issueTypes": [
{
"name": "Bug",
"aliases": ["bug", "error", "problema"]
}
],
"statuses": [
{
"name": "Open",
"aliases": ["abierto", "nuevo"]
}
],
"components": [
{
"name": "API",
"description": "APIs y servicios",
"aliases": ["api", "servicios"]
}
]
}Configura data/github-sources.json para estimación con contexto:
{
"sources": [
{
"owner": "org-name",
"repo": "repo-name",
"files": ["README.md", "docs/architecture.md"],
"ref": "main"
}
]
}# Búsqueda básica
npm start -- search "bugs abiertos de la plataforma del dato"
# Más ejemplos
npm start -- search "tareas en progreso del proyecto TRD"
npm start -- search "issues cerrados del componente Ingestion"
# Opciones disponibles
npm start -- search "bugs abiertos" --verbose # Información detallada
npm start -- search "bugs abiertos" --jql # Mostrar JQL generado
npm start -- search "bugs abiertos" -l 50 # Limitar resultados# Evaluar calidad de un ticket
npm start -- check TRD-123
# Opciones
npm start -- check TRD-123 --verbose # Información detallada# Estimar esfuerzo con contexto de GitHub
npm start -- estimate TRD-456
# Opciones
npm start -- estimate TRD-456 --verbose # Información detalladaEl proyecto sigue Arquitectura Hexagonal (Ports & Adapters) para desacoplar la lógica de negocio de la infraestructura.
- Dominio en el centro: La lógica de negocio no depende de frameworks, bases de datos o APIs externas.
- Dependencias hacia adentro: Los adaptadores dependen de los puertos, nunca al revés.
- Puertos como contratos: Interfaces que definen cómo el dominio interactúa con el exterior.
- Adaptadores intercambiables: Implementaciones concretas que pueden sustituirse sin afectar el dominio.
src/
├── domain/ # Núcleo de la aplicación (sin dependencias externas)
│ ├── models/ # Entidades y objetos de valor
│ ├── ports/ # Interfaces (contratos)
│ │ ├── input/ # Puertos primarios (casos de uso)
│ │ └── output/ # Puertos secundarios (controlados)
│ └── services/ # Lógica de negocio (implementa puertos de entrada)
│
├── adapters/ # Implementaciones de puertos
│ ├── primary/ # Adaptadores de entrada (controladores)
│ │ └── cli/ # Comandos CLI con Commander.js
│ └── secondary/ # Adaptadores de salida (controlados)
│ ├── jira/ # Implementa TicketRepositoryPort
│ ├── llm/ # Implementa LLMInterpreterPort
│ ├── github/ # Implementa CodeContextProviderPort
│ └── filesystem/ # Implementa DictionaryProviderPort
│
└── config/ # Configuración y composición de dependencias
1. search - Búsqueda con lenguaje natural
CLI Adapter → SearchTicketsPort → SearchService
|
+--------------------+--------------------+
| |
v v
LLMInterpreterPort TicketRepositoryPort
| |
v v
LangChain Adapter Jira Adapter
2. check - Evaluación de calidad
CLI Adapter → CheckTicketQualityPort → QualityCheckerService
|
+-------------------+-------------------+
| |
v v
TicketRepositoryPort LLMInterpreterPort
| |
v v
Jira Adapter LangChain Adapter
3. estimate - Estimación de esfuerzo
CLI Adapter → EstimateEffortPort → EstimatorService
|
+-----------------------+-----------------------+
| | |
v v v
TicketRepositoryPort CodeContextProviderPort LLMInterpreterPort
| | |
v v v
Jira Adapter GitHub Adapter LangChain Adapter
El LLM actúa exclusivamente como intérprete de lenguaje natural - nunca ejecuta acciones directamente contra Jira o GitHub. Solo transforma consultas en parámetros estructurados que la aplicación usa de forma determinista.
npm test # Ejecutar tests
npm run test:watch # Modo watch
npm run test:coverage # Con coberturanpm run lint # Verificar linting
npm run lint:fix # Auto-corregir
npm run format # Formatear con Prettier
npm run format:check # Verificar formatonpm run build # Compilar a dist/
npm run dev # Modo desarrollo con tsx watch| Tecnología | Versión | Propósito |
|---|---|---|
| Node.js | >= 22 | Runtime |
| TypeScript | 5.7 | Lenguaje principal |
| ESM | - | Sistema de módulos |
| LangChain | @langchain/openai | Integración LLM via API OpenAI-compatible |
| Zod | 3.x | Validación de schemas y tipos |
| Axios | 1.x | Cliente HTTP para Jira y GitHub |
| Commander | 12.x | Framework CLI |
| Jest | 30.x | Testing con ts-jest para ESM |
| ESLint | 9.x | Linting con flat config |
| Prettier | 3.x | Formateo de código |
MIT
- Fork del repositorio
- Crear feature branch (
git checkout -b feature/amazing-feature) - Commit de cambios (
git commit -m 'Add amazing feature') - Push a la branch (
git push origin feature/amazing-feature) - Abrir Pull Request
- El proyecto está diseñado para ser extensible mediante la arquitectura hexagonal
- Los adaptadores pueden intercambiarse fácilmente (ej. cambiar de llama.cpp a OpenAI)
- La validación con Zod garantiza robustez en las respuestas del LLM
- Los tests están diseñados para mockear puertos, facilitando el testing unitario