orquestra-mcp 1.3.2 → 1.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 (3) hide show
  1. package/README.md +12 -12
  2. package/package.json +2 -2
  3. package/src/server.mjs +32 -0
package/README.md CHANGED
@@ -1,9 +1,10 @@
1
1
  # orquestra-mcp
2
2
 
3
- Servidor MCP (Model Context Protocol) para Orquestra. Expone **35 tools**
3
+ Servidor MCP (Model Context Protocol) para Orquestra. Expone **38 tools**
4
4
  que llaman a la API de `orquestra-infra`: lectura de contexto/dashboard/
5
- workspace/infra/paridad/listados, y escritura de tareas/ideas/changelog/
6
- notas/docs/módulos/flujo/categorías/infra/proyectos — un agente puede
5
+ workspace/infra/paridad/listados, escritura de tareas/ideas/changelog/
6
+ notas/docs/módulos/flujo/categorías/infra/proyectos, y corridas de QA —
7
+ un agente puede
7
8
  prácticamente todo lo que un humano hace en la web, directo desde la
8
9
  conversación. `get_setup_guide` documenta el orden recomendado para
9
10
  configurar/sincronizar un proyecto completo sin crear duplicados.
@@ -185,12 +186,11 @@ create/update sigue siendo criterio del agente y del humano.
185
186
 
186
187
  ## Estado
187
188
 
188
- 35 tools: 8 de lectura (contexto/tasks/search + dashboard/workspace/infra/
189
- paridad/playbook) + 6 `list_*` + `get_setup_guide` + 18 de creación/
190
- edición (tasks/ideas/changelog/notes/docs + módulos/flujo/categorías/
191
- servicios/entornos/distribuciones) + 2 compuestas (init_project,
192
- apply_stage_playbook). No hay `delete_*`, ni `update_idea`/`update_note`/
193
- `update_doc`/`update_changelog_entry` todavía. Distribuido por ahora vía
194
- path local o `npx github:ajuarez93/orquestra-mcp` — publish a npm como
195
- `orquestra-mcp` queda pendiente (requiere crear el scope `orquestra` en
196
- npmjs.com).
189
+ 38 tools: 9 de lectura (contexto/tasks/search + dashboard/workspace/infra/
190
+ paridad/setup guide/stage playbook) + 6 `list_*` + 19 de creación/edición
191
+ (tasks/ideas/changelog/notes/docs + módulos/flujo/categorías/servicios/
192
+ entornos/distribuciones/proyecto) + 2 de QA (create_qa_run/get_qa_run) +
193
+ 2 compuestas (init_project, apply_stage_playbook). No hay `delete_*`, ni
194
+ `update_idea`/`update_note`/`update_doc`/`update_changelog_entry`
195
+ todavía. Publicado en npm como `orquestra-mcp` (unscoped) -- `npx
196
+ orquestra-mcp setup`.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "orquestra-mcp",
3
- "version": "1.3.2",
4
- "description": "Servidor MCP de Orquestra -- 35 tools para leer y escribir tareas, ideas, changelog, infraestructura y más desde un agente de IA",
3
+ "version": "1.5.0",
4
+ "description": "Servidor MCP de Orquestra -- 38 tools para leer y escribir tareas, ideas, changelog, infraestructura, QA y más desde un agente de IA",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "orquestra-mcp": "./bin/orquestra-mcp.mjs"
package/src/server.mjs CHANGED
@@ -58,6 +58,7 @@ Durante el trabajo normal de código, sin que el usuario te lo pida explícitame
58
58
  - Al terminar, mueve la tarea de estatus con update_task y registra una entrada de changelog con create_changelog_entry -- así el usuario nunca tiene que documentar esto a mano.
59
59
  - Antes de crear un módulo/estatus/categoría/servicio/entorno/distribución, revisa con el list_* correspondiente que no exista ya uno con ese nombre.
60
60
  - Si tienes acceso al repo real de una distribución (ej. puedes correr "git remote get-url origin" en ese código), llena repoUrl en create_distribution/update_distribution sin preguntar -- es solo informativo, no requiere credenciales. Esto es distinto de conectar el repo con PAT para el changelog automático (Workspace → Conexiones en orquestra-web): eso sí es un paso deliberado del usuario, con una credencial real -- nunca lo hagas tú solo ni sugieras que ya está conectado por haber llenado repoUrl.
61
+ - No todas las tareas necesitan una corrida de QA -- clasifica antes de disparar una: cambios que afectan comportamiento real (features, bugs, UI, lógica de negocio, endpoints/API) sí la necesitan; cambios que no alteran comportamiento (docs, comentarios, refactors sin cambio funcional, config/tooling interno, notas/reuniones/ideas) no. Si decides que sí, llama a create_qa_run en la rama real de ese trabajo y deja la tarea en "En revisión" -- NUNCA la muevas a "Listo" ni digas que "QA lo revisó" sin haber confirmado con get_qa_run un estatus terminal "passed" de verdad (las corridas son asíncronas, tardan minutos en otra máquina). Si tarda, dile al usuario que quedó en cola (con el runId) y que confirmas cuando termine -- no lo des por hecho nunca.
61
62
 
62
63
  No le preguntes al usuario por workspaceId ni projectId -- ya están configurados. Solo pregúntale por el proyecto si tiene más de uno y no queda claro a cuál te refieres.
63
64
 
@@ -517,6 +518,37 @@ export function createServer() {
517
518
  repoUrl: z.string().optional().describe('URL del repo de este código -- solo informativo, no requiere credenciales.'),
518
519
  })
519
520
 
521
+ // ═══ QA (módulo de runners -- ver orquestra-qa-agent) ═══════════════════════
522
+ // Asíncronas: una corrida puede tardar minutos en otra máquina. Ver
523
+ // SERVER_INSTRUCTIONS para la regla de no asumir "passed" sin confirmar.
524
+
525
+ registerCreate('create_qa_run', '/v1/qa/runs', 'Dispara una corrida de QA (lint/tests/build/E2E según el stack) en la rama indicada. El proyecto necesita QA activado (Workspace → QA + sección QA del proyecto) o falla explícito. La corrida queda "queued" -- nunca asumas que pasó, confirma con get_qa_run.', {
526
+ branch: z.string().optional().describe('Rama a probar -- default: la configurada para el proyecto, o "main"'),
527
+ commit: z.string().optional(),
528
+ trigger: z.enum(['manual', 'push', 'schedule']).optional().describe('Default: manual'),
529
+ stack: z.string().optional().describe('Stack a probar (ej. "web", "ios", "android") cuando el proyecto tiene varios corriendo en máquinas distintas. Si el proyecto tiene qaConfig.runnerByStack configurado, resuelve solo la máquina de ese stack -- default: el runner/stack global del proyecto.'),
530
+ runnerId: z.string().optional().describe('Máquina específica -- si se manda, gana sobre la resuelta por stack. Default: la configurada para el proyecto/stack, o cualquiera disponible'),
531
+ })
532
+
533
+ server.registerTool(
534
+ 'get_qa_run',
535
+ {
536
+ description: 'Consulta el estatus real de una corrida de QA por id (queued|running|passed|failed|error|cancelled, con steps y summary). Única forma válida de confirmar un resultado -- nunca lo des por hecho.',
537
+ inputSchema: {
538
+ runId: z.string().describe('ID de la corrida, devuelto por create_qa_run'),
539
+ projectId: z.string().optional().describe(PROJECT_ID_DESC),
540
+ },
541
+ },
542
+ async ({ runId, projectId }) => {
543
+ try {
544
+ const data = await apiGet(config, `/v1/qa/runs/${runId}`, { projectId: resolveProjectId(projectId) })
545
+ return textResult(data)
546
+ } catch (err) {
547
+ return errorResult(err)
548
+ }
549
+ }
550
+ )
551
+
520
552
  // ═══ COMPUESTAS (nivel C) ═══════════════════════════════════════════════════
521
553
 
522
554
  server.registerTool(