orquestra-mcp 1.5.0 → 1.6.1
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.
- package/package.json +1 -1
- package/src/server.mjs +39 -5
package/package.json
CHANGED
package/src/server.mjs
CHANGED
|
@@ -57,8 +57,9 @@ Durante el trabajo normal de código, sin que el usuario te lo pida explícitame
|
|
|
57
57
|
- Si te pide una funcionalidad o arreglo real (no una pregunta rápida ni exploración de código sin cambios), revisa con list_tasks/search si ya existe una tarea relacionada; si no, créala con create_task antes de empezar a trabajar.
|
|
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
|
+
- Si una nota que vas a crear (create_note) es claramente sobre un módulo o una tarea específica -- por ejemplo durante un setup guiado donde acabas de crear ambos -- mándale moduleId/taskId para ligarla, en vez de dejarla suelta. No inventes la relación si no es clara.
|
|
60
61
|
- 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
|
|
62
|
+
- 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í, revisa primero con list_qa_agents que exista un agente para el stack que tocaste (si no hay ninguno, créalo con create_qa_agent -- necesita una máquina ya emparejada, ver Workspace → QA) y llama a create_qa_run en la rama real de ese trabajo, dejando 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.
|
|
62
63
|
|
|
63
64
|
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.
|
|
64
65
|
|
|
@@ -341,6 +342,8 @@ export function createServer() {
|
|
|
341
342
|
title: z.string().describe('Título de la nota'),
|
|
342
343
|
body: z.string().optional(),
|
|
343
344
|
pinned: z.boolean().optional(),
|
|
345
|
+
moduleId: z.string().optional().describe('Módulo relacionado, si la nota es sobre uno específico -- ligarla ayuda a encontrarla después (ver list_modules)'),
|
|
346
|
+
taskId: z.string().optional().describe('Tarea relacionada, si la nota es sobre una específica (ver list_tasks)'),
|
|
344
347
|
}
|
|
345
348
|
)
|
|
346
349
|
|
|
@@ -521,13 +524,44 @@ export function createServer() {
|
|
|
521
524
|
// ═══ QA (módulo de runners -- ver orquestra-qa-agent) ═══════════════════════
|
|
522
525
|
// Asíncronas: una corrida puede tardar minutos en otra máquina. Ver
|
|
523
526
|
// SERVER_INSTRUCTIONS para la regla de no asumir "passed" sin confirmar.
|
|
527
|
+
//
|
|
528
|
+
// Un agente = un stack de este proyecto (web/ios/android/node/nestjs)
|
|
529
|
+
// atado a una máquina (runnerId) y una ruta de checkout en ella
|
|
530
|
+
// (localPath) -- "orquestra-qa-agent setup" crea/actualiza el suyo solo;
|
|
531
|
+
// estas tools existen para revisarlos/crearlos desde acá también.
|
|
532
|
+
const QA_AGENT_STACKS = ['web', 'ios', 'android', 'node', 'nestjs']
|
|
533
|
+
|
|
534
|
+
registerRead('list_qa_agents', '/v1/qaAgents',
|
|
535
|
+
'Lista los agentes de QA (stack+máquina+ruta local) configurados en un proyecto. Úsala antes de create_qa_agent o de create_qa_run con stack, para saber si ya existe uno.',
|
|
536
|
+
{}, (args, projectId) => ({ projectId }))
|
|
537
|
+
|
|
538
|
+
registerCreate('create_qa_agent', '/v1/qaAgents', 'Crea un agente de QA: asocia un stack de este proyecto a una máquina (runner, ver Workspace → QA) y una ruta de checkout en ESA máquina.', {
|
|
539
|
+
name: z.string().describe('Nombre a mostrar, ej. "Agente web"'),
|
|
540
|
+
stack: z.enum(QA_AGENT_STACKS),
|
|
541
|
+
runnerId: z.string().describe('ID de la máquina emparejada -- ver list_qa_agents o Workspace → QA'),
|
|
542
|
+
localPath: z.string().describe('Ruta absoluta del checkout en esa máquina'),
|
|
543
|
+
branch: z.string().optional().describe('Override de rama para este agente -- default: la del proyecto'),
|
|
544
|
+
distributionId: z.string().optional().describe('Distribución vinculada (repo/fuente de conocimiento)'),
|
|
545
|
+
enabled: z.boolean().optional(),
|
|
546
|
+
})
|
|
547
|
+
|
|
548
|
+
registerUpdate('update_qa_agent', '/v1/qaAgents', 'Edita un agente de QA existente.', {
|
|
549
|
+
name: z.string().optional(),
|
|
550
|
+
stack: z.enum(QA_AGENT_STACKS).optional(),
|
|
551
|
+
runnerId: z.string().optional(),
|
|
552
|
+
localPath: z.string().optional(),
|
|
553
|
+
branch: z.string().optional(),
|
|
554
|
+
distributionId: z.string().optional(),
|
|
555
|
+
enabled: z.boolean().optional(),
|
|
556
|
+
})
|
|
524
557
|
|
|
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
|
|
526
|
-
|
|
558
|
+
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 y al menos un agente de QA para el stack (o falla explícito -- ver list_qa_agents/create_qa_agent). La corrida queda "queued" -- nunca asumas que pasó, confirma con get_qa_run.', {
|
|
559
|
+
agentId: z.string().optional().describe('Agente específico -- si se manda, gana sobre stack'),
|
|
560
|
+
branch: z.string().optional().describe('Rama a probar -- default: la del agente, o la del proyecto, o "main"'),
|
|
527
561
|
commit: z.string().optional(),
|
|
528
562
|
trigger: z.enum(['manual', 'push', 'schedule']).optional().describe('Default: manual'),
|
|
529
|
-
stack: z.string().optional().describe('Stack a probar (ej. "web", "ios", "android")
|
|
530
|
-
runnerId: z.string().optional().describe('Máquina específica -- si se manda, gana sobre la
|
|
563
|
+
stack: z.string().optional().describe('Stack a probar (ej. "web", "ios", "android") -- resuelve contra los agentes activos de ese stack. Falla si hay 0 (créalo con create_qa_agent) o más de 1 (usa agentId).'),
|
|
564
|
+
runnerId: z.string().optional().describe('Máquina específica -- si se manda, gana sobre la del agente resuelto'),
|
|
531
565
|
})
|
|
532
566
|
|
|
533
567
|
server.registerTool(
|