mcp-phase-gate 2.0.1 → 2.2.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.
package/README.es.md CHANGED
@@ -32,7 +32,7 @@ flowchart TD
32
32
 
33
33
  Y entre una fase y otra hay una **compuerta**, que es lo que le da el nombre al servidor: si pides una fase saltándote la anterior, el servidor lo detecta y avisa ([ver abajo](#-la-compuerta-saltarse-una-fase-deja-de-ser-invisible)).
34
34
 
35
- En la fase 5 la IA solo lee. **Los commits y el PR los haces tú**, siempre.
35
+ En la Fase 4 la IA hace el commit de cada lote solo con tu OK; nunca hace push ni abre el PR. En la Fase 5 solo lee.
36
36
 
37
37
  ## Para quién es
38
38
 
@@ -57,7 +57,10 @@ DOCUMENTACIÓN/
57
57
  │ ├── 01 - Análisis Técnico.md ← Fase 1
58
58
  │ ├── 02 - Decisiones.md ← Fase 2
59
59
  │ ├── 03 - Plan Técnico.md ← Fase 3
60
- │ ├── 04 - Ejecución.md ← Fase 4
60
+ │ ├── 04 - Ejecución/ ← Fase 4, con más de un lote: un recibo por lote
61
+ │ │ ├── L01 - <slug>.md
62
+ │ │ └── L02 - <slug>.md
63
+ │ ├── 04 - Ejecución.md ← Fase 4: el recibo, o el índice de los recibos
61
64
  │ └── 05 - Auditoría.md ← Fase 5
62
65
  ├── PROYECTO-B/
63
66
  │ └── Proyectos/
@@ -67,7 +70,9 @@ DOCUMENTACIÓN/
67
70
  └── <nombre_de_la_tarea>/
68
71
  ```
69
72
 
70
- `PROYECTO-A`, `PROYECTO-B` y `PROYECTO-C` son de ejemplo: tus proyectos son las carpetas que tú tengas ahí, con los nombres que tú les pongas. El nivel `Proyectos` es la subcarpeta de tareas, y su nombre también es configurable — ver `ORQUESTADOR_TASKS_SUBDIR` más abajo.
73
+ `PROYECTO-A`, `PROYECTO-B` y `PROYECTO-C` son de ejemplo: tus proyectos son las carpetas que tú tengas ahí, con los nombres que tú les pongas. El nivel `Proyectos` es la subcarpeta de tareas, y su nombre también es configurable — ver `PHASE_GATE_TASKS_SUBDIR` más abajo.
74
+
75
+ **Lotes y recibos.** El plan de la Fase 3 parte el trabajo en lotes (`L01`, `L02`…): cada uno es un cambio que se revierte solo y deja la aplicación funcionando. La Fase 4 los ejecuta uno a la vez y cierra cada lote con un **recibo** corto (qué se hizo, qué se verificó, qué espera por ti) y un commit. Con un solo lote, el recibo es directamente `04 - Ejecución.md` y no hay subcarpeta, salvo que ese lote falle o se descarte: entonces su recibo va a `04 - Ejecución/` y la fase no se da por cerrada. Con varios, los recibos van en `04 - Ejecución/` y `04 - Ejecución.md` es el índice que se escribe al cerrar el último: hasta entonces la fase no aparece como terminada. Al pedir la Fase 4 o la 5, el servidor añade al prompt la lista de recibos que ya existen, para retomar en otro chat sin adivinar sus nombres.
71
76
 
72
77
  > El servidor arma esta ruta **automáticamente**. Tú (o el LLM) solo indican `project`, `task_name` y `file_name`; no hay que escribir la ruta completa a mano.
73
78
 
@@ -94,7 +99,7 @@ El código es idéntico en todos lados; lo único que cambia de un equipo a otro
94
99
 
95
100
  No hay nada que instalar: `npx` descarga el paquete la primera vez y lo cachea. Todo se configura en el archivo de tu cliente MCP.
96
101
 
97
- **La clave que le pongas es la que identifica al servidor y la que prefija sus tools**, así que puedes ponerle la que quieras. En los ejemplos va `mcp-phase-gate`, igual que el nombre del paquete y el que el servidor declara de sí mismo: el mismo nombre en los tres sitios, para que no haya que recordar cuál era cuál.
102
+ **La clave que le pongas es la que identifica al servidor y la que prefija sus tools y sus comandos**, así que puedes ponerle la que quieras. En los ejemplos va `mcp-phase-gate`, igual que el nombre del paquete y el que el servidor declara de sí mismo. Si lo registras por primera vez, una clave corta como `pg` deja los comandos más cortos (`/pg:f1` en Claude Code). **Si ya lo tienes registrado, conserva tu clave**: cambiarla cambia el nombre de todas las tools y comandos, y tendrías que volver a conceder sus permisos.
98
103
 
99
104
  Recuerda que en JSON cada `\` va doble `\\`.
100
105
 
@@ -108,8 +113,8 @@ Recuerda que en JSON cada `\` va doble `\\`.
108
113
  "command": "npx",
109
114
  "args": ["-y", "mcp-phase-gate"],
110
115
  "env": {
111
- "ORQUESTADOR_DOCS_PATH": "C:\\Users\\TU_USUARIO\\OneDrive - TU ORGANIZACIÓN\\Documentos\\DOCUMENTACIÓN",
112
- "ORQUESTADOR_REPOS_PATH": "C:\\proyectos"
116
+ "PHASE_GATE_DOCS_PATH": "C:\\Users\\TU_USUARIO\\OneDrive - TU ORGANIZACIÓN\\Documentos\\DOCUMENTACIÓN",
117
+ "PHASE_GATE_REPOS_PATH": "C:\\proyectos"
113
118
  }
114
119
  }
115
120
  }
@@ -130,8 +135,8 @@ Ojo con dos diferencias: la clave de arriba es `servers`, no `mcpServers`, y hay
130
135
  "command": "npx",
131
136
  "args": ["-y", "mcp-phase-gate"],
132
137
  "env": {
133
- "ORQUESTADOR_DOCS_PATH": "C:\\Users\\TU_USUARIO\\OneDrive - TU ORGANIZACIÓN\\Documentos\\DOCUMENTACIÓN",
134
- "ORQUESTADOR_REPOS_PATH": "C:\\proyectos"
138
+ "PHASE_GATE_DOCS_PATH": "C:\\Users\\TU_USUARIO\\OneDrive - TU ORGANIZACIÓN\\Documentos\\DOCUMENTACIÓN",
139
+ "PHASE_GATE_REPOS_PATH": "C:\\proyectos"
135
140
  }
136
141
  }
137
142
  }
@@ -143,19 +148,21 @@ Ojo con dos diferencias: la clave de arriba es `servers`, no `mcpServers`, y hay
143
148
  <summary><b>Claude Code</b> — de una sola línea</summary>
144
149
 
145
150
  ```bash
146
- claude mcp add mcp-phase-gate --env ORQUESTADOR_DOCS_PATH="C:\Users\TU_USUARIO\Documentos\DOCUMENTACIÓN" --env ORQUESTADOR_REPOS_PATH="C:\proyectos" -- npx -y mcp-phase-gate
151
+ claude mcp add mcp-phase-gate --env PHASE_GATE_DOCS_PATH="C:\Users\TU_USUARIO\Documentos\DOCUMENTACIÓN" --env PHASE_GATE_REPOS_PATH="C:\proyectos" -- npx -y mcp-phase-gate
147
152
  ```
148
153
 
149
154
  O a mano, en un `.mcp.json` en la raíz del proyecto, con la misma forma que el de Cursor.
150
155
  </details>
151
156
 
152
- Ese `ORQUESTADOR_DOCS_PATH` es solo un **ejemplo** con una carpeta de OneDrive. Sirve igual `G:\Mi unidad\Documentación`, `D:\Dropbox\Docs` o `C:\Docs` sin nube ninguna.
157
+ Ese `PHASE_GATE_DOCS_PATH` es solo un **ejemplo** con una carpeta de OneDrive. Sirve igual `G:\Mi unidad\Documentación`, `D:\Dropbox\Docs` o `C:\Docs` sin nube ninguna.
153
158
 
154
159
  > **Por este camino no hay archivo `.env`.** El paquete vive dentro de `node_modules`, donde no tiene sentido dejar tu configuración, así que las rutas van **obligatoriamente** en el bloque `"env"`. El `.env` solo existe en el camino de abajo.
155
160
 
156
161
  **Las dos variables son obligatorias y no tienen valor por defecto.** Si falta alguna, o si apunta a una carpeta que no existe, las tools que la necesitan te lo dicen con ese nombre exacto en vez de fallar más tarde por otro motivo.
157
162
 
158
- > `npx mcp-phase-gate` escrito directamente en una terminal **parece que se cuelga**, y no está roto: es un servidor MCP esperando mensajes por stdin. Si lo que quieres es comprobar que está ahí, usa `npx mcp-phase-gate --help`.
163
+ > **¿Ya lo usabas con `ORQUESTADOR_*`?** Esos nombres siguen funcionando como alias de `PHASE_GATE_*`; no tienes que tocar nada. Si defines los dos con valores distintos gana `PHASE_GATE_*`, y `doctor` y el log del servidor te avisan.
164
+
165
+ > `npx mcp-phase-gate` escrito directamente en una terminal **parece que se cuelga**, y no está roto: es un servidor MCP esperando mensajes por stdin. Si lo que quieres es comprobar tu instalación, usa `npx mcp-phase-gate doctor` ([ver abajo](#-revisar-la-instalación-doctor)).
159
166
 
160
167
  ---
161
168
 
@@ -181,11 +188,11 @@ copy .env.example .env
181
188
  Averigua tu ruta real abriendo la carpeta en el explorador y copiando la ruta de la barra de direcciones. Aquí las barras invertidas van **simples**, sin comillas:
182
189
 
183
190
  ```ini
184
- ORQUESTADOR_DOCS_PATH=C:\Users\TU_USUARIO\OneDrive - TU ORGANIZACIÓN\Documentos\DOCUMENTACIÓN
185
- ORQUESTADOR_REPOS_PATH=C:\proyectos
191
+ PHASE_GATE_DOCS_PATH=C:\Users\TU_USUARIO\OneDrive - TU ORGANIZACIÓN\Documentos\DOCUMENTACIÓN
192
+ PHASE_GATE_REPOS_PATH=C:\proyectos
186
193
  ```
187
194
 
188
- > Guarda el `.env` en **UTF-8 sin BOM**. Si lo creas desde PowerShell con `>` sale en UTF-16, los acentos de `DOCUMENTACIÓN` llegan rotos y la ruta "no existe" aunque la veas bien.
195
+ > Guarda el `.env` en **UTF-8** (con o sin BOM, da igual). Si lo creas desde PowerShell con `>` sale en UTF-16: el servidor lo detecta, no lo carga y te lo dice, tanto en el error de la variable que falta como en `doctor`.
189
196
 
190
197
  **3. Registra el servidor** igual que en el camino A, pero cambiando `command` y `args` por el `build/index.js` de tu clon, y sin bloque `"env"` (las rutas ya vienen del `.env`):
191
198
 
@@ -202,8 +209,20 @@ En **Claude Code**, un `.mcp.json` en la raíz de este repo puede usar ruta **re
202
209
 
203
210
  ### ✅ Verificar que funciona
204
211
  1. Reinicia el cliente, o desactiva y vuelve a activar el servidor en su panel de MCP.
205
- 2. Debe aparecer activo con sus 8 tools listadas. En **Cursor** está en Settings → MCP; en **VS Code**, en la vista de extensiones/MCP; en **Claude Code**, con `/mcp`.
206
- 3. Pruébalo pidiendo en el chat: *"Usa la tool `get_active_task` del mcp-phase-gate"* — debe responder, aunque sea para decir que no hay tarea activa todavía.
212
+ 2. Debe aparecer activo con sus 9 tools listadas. En **Cursor** está en Settings → MCP; en **VS Code**, en la vista de extensiones/MCP; en **Claude Code**, con `/mcp`.
213
+ 3. Pruébalo pidiendo en el chat: *"Usa la tool `get_orchestrator_status` del mcp-phase-gate"* — te devuelve la radiografía de la instalación: qué variables ve, qué prompts usa y qué proyectos encuentra.
214
+
215
+ ### 🔍 Revisar la instalación: `doctor`
216
+
217
+ Desde una terminal, con las mismas variables que le das al cliente:
218
+
219
+ ```bash
220
+ npx mcp-phase-gate doctor
221
+ ```
222
+
223
+ Te dice qué versión corre y desde dónde (`npx`, global, una dependencia o un clon), qué valor tiene cada variable y de dónde salió (el entorno o el `.env`, y si usaste el nombre nuevo o el alias), qué archivo de prompt gana en cada fase, qué proyectos hay con su tarea activa, y una lista de hallazgos: una variable obligatoria que falta, un `.env` en UTF-16, un `global-rules.md` propio al que le faltan secciones que las fases citan, una fase sin documento… Sale con código `1` si hay algún error, así que sirve también en un script. `doctor --json` da lo mismo como JSON.
224
+
225
+ Es la misma información que devuelve la tool `get_orchestrator_status` y el recurso `phase-gate://estado`; desde el chat, además, incluye qué cliente está conectado y qué capacidades anunció.
207
226
 
208
227
  ---
209
228
 
@@ -231,23 +250,23 @@ Puede que quieras documentaciones separadas que no se mezclen: una del trabajo y
231
250
  ```jsonc
232
251
  {
233
252
  "mcpServers": {
234
- "orquestador-trabajo": {
253
+ "pg-trabajo": {
235
254
  "command": "npx",
236
255
  "args": ["-y", "mcp-phase-gate"],
237
256
  "env": {
238
- "ORQUESTADOR_DOCS_PATH": "C:\\Users\\TU_USUARIO\\OneDrive - TU ORGANIZACIÓN\\Documentos\\DOCUMENTACIÓN",
239
- "ORQUESTADOR_REPOS_PATH": "C:\\proyectos",
240
- "ORQUESTADOR_STATE_PATH": "C:\\Users\\TU_USUARIO\\.orquestador\\trabajo"
257
+ "PHASE_GATE_DOCS_PATH": "C:\\Users\\TU_USUARIO\\OneDrive - TU ORGANIZACIÓN\\Documentos\\DOCUMENTACIÓN",
258
+ "PHASE_GATE_REPOS_PATH": "C:\\proyectos",
259
+ "PHASE_GATE_STATE_PATH": "C:\\Users\\TU_USUARIO\\.orquestador\\trabajo"
241
260
  }
242
261
  },
243
- "orquestador-personal": {
262
+ "pg-personal": {
244
263
  "command": "npx",
245
264
  "args": ["-y", "mcp-phase-gate"],
246
265
  "env": {
247
- "ORQUESTADOR_DOCS_PATH": "G:\\Mi unidad\\Documentación",
248
- "ORQUESTADOR_REPOS_PATH": "D:\\dev",
249
- "ORQUESTADOR_TASKS_SUBDIR": "",
250
- "ORQUESTADOR_STATE_PATH": "C:\\Users\\TU_USUARIO\\.orquestador\\personal"
266
+ "PHASE_GATE_DOCS_PATH": "G:\\Mi unidad\\Documentación",
267
+ "PHASE_GATE_REPOS_PATH": "D:\\dev",
268
+ "PHASE_GATE_TASKS_SUBDIR": "",
269
+ "PHASE_GATE_STATE_PATH": "C:\\Users\\TU_USUARIO\\.orquestador\\personal"
251
270
  }
252
271
  }
253
272
  }
@@ -256,12 +275,12 @@ Puede que quieras documentaciones separadas que no se mezclen: una del trabajo y
256
275
 
257
276
  Es el mismo paquete en los dos: lo único que cambia son las rutas. Cada registro puede tener incluso su propia subcarpeta de tareas — arriba, la personal la deja vacía para que las tareas cuelguen directo del proyecto.
258
277
 
259
- > ⚠️ **`ORQUESTADOR_STATE_PATH` tiene que ser distinto en cada registro.** Si se comparte, los punteros de tarea activa se pisan **en silencio**: la clave del estado es el nombre del proyecto, así que dos documentaciones con un proyecto que se llame igual acaban compartiendo entrada y una le contesta a la otra. No da error; simplemente te responde la tarea equivocada.
278
+ > ⚠️ **`PHASE_GATE_STATE_PATH` tiene que ser distinto en cada registro.** Si se comparte, los punteros de tarea activa se pisan **en silencio**: la clave del estado es el nombre del proyecto, así que dos documentaciones con un proyecto que se llame igual acaban compartiendo entrada y una le contesta a la otra. No da error; simplemente te responde la tarea equivocada.
260
279
 
261
280
  Dos cosas más que muerden y no son evidentes:
262
281
 
263
282
  - **Modo espejo, no streaming.** Google Drive en modo *streaming* y OneDrive con *Archivos a Petición* dejan los archivos como marcadores hasta que algo los abre. Este servidor vive de listar carpetas y comprobar si existen archivos, así que con marcadores se vuelve lento o falla cuando no hay red. Si puedes, ten la carpeta de Documentación **descargada localmente**.
264
- - **Los repos de código, fuera de la carpeta sincronizada.** La Documentación en la nube no da problema. El código sí: la sincronización compitiendo con git sobre `.git/` corrompe repositorios. Que `ORQUESTADOR_REPOS_PATH` apunte a un disco local.
283
+ - **Los repos de código, fuera de la carpeta sincronizada.** La Documentación en la nube no da problema. El código sí: la sincronización compitiendo con git sobre `.git/` corrompe repositorios. Que `PHASE_GATE_REPOS_PATH` apunte a un disco local.
265
284
 
266
285
  ---
267
286
 
@@ -275,7 +294,7 @@ cambios, la causa está casi siempre aquí.
275
294
  | El servidor compilado | `build/` en tu clon | Está gitignoreado. **Después de cada `git pull` que traiga cambios en `src/`, corre `npm run build`** o el cliente seguirá ejecutando la versión anterior. |
276
295
  | Las rutas de este equipo | `.env` en la raíz ([camino B](#-camino-b--desde-el-código), paso 2) | Cambian el usuario del sistema y dónde tengas la carpeta de Documentación. |
277
296
  | El registro del MCP | La configuración de tu cliente ([camino A](#-camino-a--con-npx-recomendado), o el paso 3 del [camino B](#-camino-b--desde-el-código)) | En Cursor y VS Code contiene la ruta absoluta a `build/index.js`, que depende de dónde clonaste y apunta a una carpeta gitignoreada. Ninguna ruta puede ser correcta en todos los equipos. Ver [`docs/decisiones.md`](docs/decisiones.md). La excepción es el `.mcp.json` de Claude Code, que va con ruta relativa. |
278
- | Los comandos `/f1`–`/f5` en **Cursor** | `C:\Users\<TU_USUARIO>\.cursor\commands\f<N>.md` | Cursor solo los lee de la carpeta del usuario, así que se copian a mano en cada equipo. En **Claude Code** no aplica: están versionados en `.claude/commands/` y llegan con el `git pull`. |
297
+ | Los comandos `/f1`–`/f5` como archivos, **solo si tu cliente no muestra bien los MCP Prompts** | `C:\Users\<TU_USUARIO>\.cursor\commands\f<N>.md` en Cursor | Desde la 2.2.0 el servidor los ofrece como MCP Prompts y llegan solos con cada versión ([ver abajo](#los-comandos-de-fase)). La copia en archivos solo hace falta como respaldo; en **Claude Code** dentro de este repo ya está versionada en `.claude/commands/`. |
279
298
 
280
299
  ### Los comandos de fase
281
300
 
@@ -291,25 +310,38 @@ Lo que hace cada uno:
291
310
  | `/f1` | `start_task` + `get_phase_prompt(1)` | El de la Fase 1 |
292
311
  | `/f2` | `get_phase_prompt(2)`, lee el de la Fase 1 | El de la Fase 2, después de que respondas las preguntas |
293
312
  | `/f3` | `get_phase_prompt(3)`, lee los anteriores | El de la Fase 3 |
294
- | `/f4` | `get_phase_prompt(4)`, lee el plan | El de la Fase 4, corto y al final |
313
+ | `/f4` | `get_phase_prompt(4)`, lee el plan | Un recibo por lote; el documento de la fase al cerrar |
295
314
  | `/f5` | `get_phase_prompt(5)` | El de la Fase 5: la auditoría y la descripción del PR, que además van en el chat |
296
315
 
297
316
  Ningún comando nombra un archivo: el nombre lo declara la cabecera del prompt de cada fase
298
317
  y `get_phase_prompt` se lo entrega al modelo.
299
318
 
300
- `/f1` y `/f5` esperan datos después del comando: `/f1` necesita project, task_name y el
301
- requerimiento completo; `/f5`, cuáles commits auditar. Los otros cuatro arrancan de
302
- `get_active_task`.
303
-
304
- **Dónde ponerlos según el cliente:**
305
-
306
- - **Claude Code:** ya están en [`.claude/commands/`](.claude/commands), versionados. Funcionan al abrir este repo sin configurar nada. Para usarlos desde tus otros proyectos, cópialos a `C:\Users\<TU_USUARIO>\.claude\commands\`.
307
- - **Cursor:** cópialos a `C:\Users\<TU_USUARIO>\.cursor\commands\`. Desde ahí sirven en todos tus proyectos.
308
- - **VS Code:** no tiene comandos de barra propios; pega el contenido del archivo en el chat.
309
-
310
- El contenido exacto de los cinco está también en
311
- [`docs/comandos-de-fase.md`](docs/comandos-de-fase.md), para leerlos sin abrir la carpeta o
312
- pegarlos en un cliente que no tenga comandos.
319
+ `/f1` necesita project, task_name y el requerimiento completo. `/f5` acepta un rango de
320
+ commits; si no le das ninguno, audita los que registran los recibos de la Fase 4, y solo si no
321
+ hay recibos te pregunta. Los demás arrancan de `get_active_task`.
322
+
323
+ **Llegan solos, como MCP Prompts.** Desde la 2.2.0 el servidor ofrece cada comando como un
324
+ prompt MCP (`f1`…`f5`), con su texto en [`prompts/comandos/`](prompts/comandos). No hay que
325
+ copiar nada a ninguna carpeta y se actualizan con cada versión del paquete. Todos sus
326
+ argumentos son opcionales —`project`; en `/f1` también `task_name` y `contexto`; en `/f5`,
327
+ `commits`—: lo que no pases te lo pide el propio comando, y un contexto largo puede ir pegado
328
+ después del comando como texto normal. Una fase que añadas tú (una `fase-6`) recibe su `/f6`
329
+ con un texto genérico, y un `comandos/fN.md` en tu carpeta de prompts propia gana al de
330
+ fábrica.
331
+
332
+ Cómo se ven en cada cliente:
333
+
334
+ | Cliente | `/f1`…`/f5` visibles | Argumentos con espacios | `@` recursos | Confirmaciones directas | Notas |
335
+ |---------|----------------------|-------------------------|--------------|-------------------------|-------|
336
+ | Claude Code | Por verificar (según su documentación: `/<clave>:f1 (MCP)`, y `/mcp__<clave>__f1` como alias) | Por verificar | Por verificar | Por verificar | |
337
+ | Cursor | Por verificar (según su documentación: en el menú de prompts MCP) | Por verificar | Por verificar | Por verificar | En Windows, `PHASE_GATE_ELICITATION=off` mientras siga abierto el bug del formulario ([ver abajo](#-documentos-protegidos)) |
338
+ | VS Code | Por verificar (su documentación se contradice entre `/<clave>.f1` y `mcp.<clave>.f1`) | Por verificar | Por verificar | Por verificar | |
339
+
340
+ **Si tu cliente no los muestra cómodamente**, usa los archivos: en este repo, Claude Code ya
341
+ los lee de [`.claude/commands/`](.claude/commands) (idénticos a `prompts/comandos/`); para
342
+ usarlos en tus otros proyectos, cópialos a `C:\Users\<TU_USUARIO>\.claude\commands\`, o a
343
+ `C:\Users\<TU_USUARIO>\.cursor\commands\` en Cursor. Más detalle en
344
+ [`docs/comandos-de-fase.md`](docs/comandos-de-fase.md).
313
345
 
314
346
  ---
315
347
 
@@ -336,24 +368,64 @@ Tres cosas que **no** hace, a propósito:
336
368
  - **No te obliga a escribir nada más.** Sigues escribiendo `/f4` a secas. Quien averigua de qué tarea se habla es el servidor, con el puntero que ya mantiene — no el modelo preguntándotelo.
337
369
  - **No se calla cuando no puede comprobar.** Si tienes varios proyectos con tarea activa y no se indicó cuál, lo dice en vez de fingir que todo está en orden.
338
370
 
371
+ **También señala los pendientes que dejó la fase anterior.** Si el documento de la fase anterior tiene una sección `## Validaciones pendientes` con algo dentro, o si al pedir la Fase 5 algún recibo de lote quedó `con pendientes`, `fallido` o `descartado`, el prompt llega además con un bloque `## PENDIENTES HEREDADOS (detectados por el servidor)` que los nombra, para que la IA te los diga antes de empezar. Una sección que solo dice "Ninguna." no cuenta. Tampoco bloquea nada: solo señala lo que el prompt ya obligaba a escribir.
372
+
373
+ ---
374
+
375
+ ## 🔒 Documentos protegidos
376
+
377
+ Cada fase trabaja sobre los documentos de las anteriores, así que reescribir uno ya superado cambia en silencio la base de lo que vino después. Por eso `write_central_doc` se niega, **sin `force: true`**, a escribir:
378
+
379
+ - **El contexto inicial** (`00 - Contexto Inicial.md`), siempre, incluso para crearlo. Solo `start_task` lo escribe sin `force`.
380
+ - **El documento de una fase congelada.** Una fase se congela en cuanto existe el documento de una fase posterior, o en cuanto la Fase 4 tiene algún recibo en `04 - Ejecución/`. Los recibos cuentan como de la Fase 4: a ellos y a `04 - Ejecución.md` solo los congela la Fase 5.
381
+
382
+ Crear un documento de fase que todavía no existe nunca se rechaza; un recibo nuevo sí, cuando la Fase 5 ya está presente. Los nombres se comparan sin distinguir mayúsculas y en la misma forma Unicode, así que escribirlos de otra manera no esquiva la protección.
383
+
384
+ **Si hace falta una corrección legítima** —una errata en el análisis con las decisiones ya escritas—, depende de tu cliente:
385
+
386
+ - **Si tu cliente admite confirmaciones directas** (elicitation de MCP), el servidor **te pregunta a ti**, en un formulario de tu cliente con una casilla: "Reescribir `01 - Análisis Técnico.md`". Si la marcas y aceptas, se escribe y la respuesta dice que fue con tu confirmación; si dices que no o cierras el formulario, no se escribe nada. Aquí `force` no basta: lo pone la IA, y justo eso es lo que la pregunta evita.
387
+ - **Si no la admite**, sigue como antes: el mensaje de rechazo le explica a la IA que necesita tu confirmación explícita en el chat y `force: true`, y la respuesta avisa de que el documento se sobrescribió (o se creó, si no existía).
388
+
389
+ Lo mismo para **estrenar un proyecto** con `crear_proyecto: true`: con confirmaciones directas, el servidor te pregunta antes de crear la carpeta.
390
+
391
+ Si tu cliente anuncia confirmaciones directas pero el formulario nunca aparece, el servidor espera tres minutos y no escribe nada; a la segunda vez seguida tampoco escribe (aunque la IA haya puesto `force`) y deja de preguntar durante el resto de la sesión: desde ahí vuelve a decidir `force`, con tu confirmación en el chat. Si tu cliente cancela la llamada antes de que respondas, no se escribe nada. Para evitarlo desde el principio, registra el servidor con `PHASE_GATE_ELICITATION=off`. **En Cursor para Windows se recomienda `off`** mientras siga abierto el bug en el que el formulario no aparece.
392
+
393
+ Además, `write_central_doc` solo escribe **dentro de la carpeta de una tarea que ya existe**: no crea carpetas sueltas en la Documentación.
394
+
339
395
  ---
340
396
 
341
397
  ## 🛠 Tools Disponibles
342
398
 
343
399
  | Tool | Qué hace |
344
400
  |------|----------|
345
- | `start_task` | Crea la carpeta de una tarea **nueva** (`<PROYECTO>/Proyectos/<tarea>`), guarda el "00 - Contexto Inicial.md" y la deja como **activa de su proyecto**. Si la tarea ya existe se niega y te manda a `switch_task`, para no reescribir el contexto inicial. |
401
+ | `start_task` | Crea la carpeta de una tarea **nueva** (`<PROYECTO>/Proyectos/<tarea>`), guarda el "00 - Contexto Inicial.md" y la deja como **activa de su proyecto**. Si la tarea ya existe se niega y te manda a `switch_task`, para no reescribir el contexto inicial. Estrenar un proyecto pide `crear_proyecto: true` y, si tu cliente puede, tu confirmación directa. |
346
402
  | `get_active_task` | Devuelve la tarea activa y **en qué fase va**, deducida de los documentos que ya tiene. Sin `project` responde la de cada proyecto. Úsalo al abrir un chat nuevo o si se perdió el contexto. |
347
403
  | `list_tasks` | Lista las tareas que existen y la fase de cada una, de la más reciente a la más antigua. Para retomar algo viejo o ver qué quedó a medias. |
348
404
  | `switch_task` | Cambia cuál es la tarea activa de un proyecto. **No toca ningún archivo**: es la forma correcta de retomar una tarea que ya existe. |
349
- | `get_phase_prompt` | Trae las reglas de comportamiento globales según la fase (1–5): 1 Descubrimiento, 2 Decisiones, 3 Plan Técnico, 4 Ejecución, 5 Auditoría / Pre-PR. El texto vive en `prompts/` (ver abajo). Comprueba de paso la **compuerta**: si pasas `project` y te saltaste una fase, el prompt llega con el aviso al principio. |
405
+ | `get_phase_prompt` | Trae las reglas de comportamiento globales según la fase (1–5): 1 Descubrimiento, 2 Decisiones, 3 Plan Técnico, 4 Ejecución, 5 Auditoría / Pre-PR. El texto vive en `prompts/` (ver abajo). Comprueba de paso la **compuerta**: si pasas `project` y te saltaste una fase, el prompt llega con el aviso al principio, seguido de los pendientes heredados si los hay. |
350
406
  | `read_central_doc` | Lee un archivo de la Documentación. **Recomendado:** pasar `project` + `task_name` + `file_name` (el servidor arma la ruta). También acepta `file_path` relativo. |
351
- | `write_central_doc` | Escribe/sobrescribe un archivo. Mismos parámetros que `read_central_doc` + `content`. |
407
+ | `write_central_doc` | Escribe/sobrescribe un archivo dentro de la carpeta de una tarea. Mismos parámetros que `read_central_doc` + `content`, y `force` para los [documentos protegidos](#-documentos-protegidos) cuando tu cliente no admite confirmaciones directas. |
352
408
  | `read_cross_repo` | Lee archivos de otros repos locales en tu carpeta de proyectos (ej. desde `repo-a` consultar cómo `repo-b` maneja un endpoint) sin cambiar de ventana. |
409
+ | `get_orchestrator_status` | La radiografía de la instalación, igual que [`doctor`](#-revisar-la-instalación-doctor): versión y ruta del paquete, variables y de dónde salió cada una, qué prompt gana en cada fase, proyectos con su tarea activa y avisos. Además, el cliente conectado y sus capacidades. Úsala cuando algo no se comporte como esperas. |
410
+
411
+ Todas declaran sus anotaciones MCP (solo lectura, destructiva, idempotente), así que un cliente cauto puede dejar pasar sin preguntar las de lectura. Solo `write_central_doc` es destructiva.
412
+
413
+ ### Recursos `phase-gate://`
414
+
415
+ El servidor expone además los documentos como **recursos de solo lectura**, que los clientes compatibles muestran al escribir `@` en el chat para adjuntarlos sin pedírselo a la IA:
416
+
417
+ | Recurso | Qué es |
418
+ |---------|--------|
419
+ | `phase-gate://estado` | La radiografía de `doctor`, en Markdown |
420
+ | `phase-gate://fases` | Las fases disponibles, con su documento, sus recibos y qué archivo de prompt gana |
421
+ | `phase-gate://tareas/{proyecto}/{tarea}/{documento}` | Un documento de una tarea |
422
+ | `phase-gate://tareas/{proyecto}/{tarea}/recibos/{recibo}` | Un recibo de lote de la Fase 4 |
423
+
424
+ La lista solo incluye los documentos que existen de la **tarea activa de cada proyecto**, para no inundar el selector; el resto se alcanza con la plantilla, que autocompleta proyecto, tarea y documento. Tienen las mismas defensas que `read_central_doc`: no se salen de la carpeta de la tarea, no exponen archivos con punto y no leen más de 1 MB.
353
425
 
354
426
  ### Cómo el servidor arma las rutas
355
- - **Documentación:** `ORQUESTADOR_DOCS_PATH` / `<PROYECTO>` / `ORQUESTADOR_TASKS_SUBDIR` / `<tarea>` / `<archivo>`
356
- - **Repos de código:** `ORQUESTADOR_REPOS_PATH` / `<repo>` / `<archivo>`
427
+ - **Documentación:** `PHASE_GATE_DOCS_PATH` / `<PROYECTO>` / `PHASE_GATE_TASKS_SUBDIR` / `<tarea>` / `<archivo>`
428
+ - **Repos de código:** `PHASE_GATE_REPOS_PATH` / `<repo>` / `<archivo>`
357
429
 
358
430
  ### Qué cuenta como proyecto
359
431
 
@@ -361,7 +433,7 @@ No hay ninguna lista de proyectos que mantener. **Es proyecto la carpeta que con
361
433
 
362
434
  Un proyecto que no existe se rechaza mostrando la lista de los que sí, en vez de crear una carpeta suelta. Para **estrenar** un proyecto hay que pedirlo a propósito: `start_task` acepta `crear_proyecto: true`, y sin esa bandera un nombre mal escrito no ensucia tu Documentación.
363
435
 
364
- > Si dejas `ORQUESTADOR_TASKS_SUBDIR` vacío, la regla no se puede aplicar y **cualquier** carpeta cuenta como proyecto.
436
+ > Si dejas `PHASE_GATE_TASKS_SUBDIR` vacío, la regla no se puede aplicar y **cualquier** carpeta cuenta como proyecto.
365
437
 
366
438
  ---
367
439
 
@@ -376,7 +448,10 @@ prompts/
376
448
  ├── fase-2-decisiones.md
377
449
  ├── fase-3-plan-tecnico.md
378
450
  ├── fase-4-ejecucion.md
379
- └── fase-5-auditoria-pr.md ← incluye el contrato de la descripción del PR
451
+ ├── fase-5-auditoria-pr.md ← incluye el contrato de la descripción del PR
452
+ └── comandos/ ← el texto de /f1…/f5, que el servidor sirve como MCP Prompts
453
+ ├── f1.md
454
+ └── …
380
455
  ```
381
456
 
382
457
  **Se leen en cada llamada.** Si editas un `.md`, la siguiente vez que la IA invoque
@@ -408,7 +483,7 @@ Reglas del formato:
408
483
 
409
484
  ### Usar tus propios prompts sin perder los de fábrica
410
485
 
411
- `ORQUESTADOR_PROMPTS_PATH` apunta a una carpeta tuya que **se superpone** a la del paquete. No la sustituye.
486
+ `PHASE_GATE_PROMPTS_PATH` apunta a una carpeta tuya que **se superpone** a la del paquete. No la sustituye.
412
487
 
413
488
  Si quieres cambiar solo la Fase 2, tu carpeta lleva **un archivo**:
414
489
 
@@ -424,6 +499,7 @@ Tres detalles que importan:
424
499
  - **Se superpone por número de fase, no por nombre de archivo.** Tu `fase-2-a-mi-manera.md` pisa al `fase-2-decisiones.md` del paquete. No tienes que adivinar cómo se llama el original.
425
500
  - **También sirve para añadir.** Un `fase-6-despliegue.md` en tu carpeta crea la fase 6, sin tocar nada más.
426
501
  - **Tu `global-rules.md` sustituye al del paquete, no se suma.** Concatenar dos juegos de reglas hace imposible saber de qué archivo salió la instrucción que estorbó, justo cuando necesitas saberlo. Si quieres las de fábrica y algo más, cópialas y añade.
502
+ **Ojo:** las de fábrica traen las secciones `EVIDENCIA`, `BASE DE CADA DECISIÓN` y `PENDIENTES HEREDADOS`, que las fases citan. Un `global-rules.md` propio que no las incluya deja a las fases citando reglas que no existen; cópialas a tu archivo.
427
503
 
428
504
  Por el camino `npx` esta es la **única** forma de personalizar: los prompts de fábrica viven dentro de `node_modules` y editarlos ahí no sirve, porque la siguiente instalación se los lleva.
429
505
 
@@ -463,13 +539,16 @@ Se cargan desde el archivo `.env` de la raíz del repo (o desde el bloque `"env"
463
539
 
464
540
  Las dos primeras **son obligatorias y no tienen valor por defecto**: apuntan a carpetas que solo existen en tu equipo, así que cualquier default sería la ruta de la máquina de otra persona. Si falta una, o apunta a algo que no existe o que no es una carpeta, las tools que la usan devuelven el nombre de la variable y dónde configurarla. Las que no dependen de ella —como `get_phase_prompt`— siguen funcionando.
465
541
 
542
+ Cada variable tiene además un **alias** con el nombre de antes, `ORQUESTADOR_*` (por ejemplo, `ORQUESTADOR_DOCS_PATH`), que sigue funcionando para no romper ninguna configuración. Si defines los dos con valores distintos gana `PHASE_GATE_*`, y `doctor` y el log del servidor te avisan.
543
+
466
544
  | Variable | Por defecto | Descripción |
467
545
  |----------|-------------|-------------|
468
- | `ORQUESTADOR_DOCS_PATH` | **ninguno, es obligatoria** | Ruta a la carpeta raíz de la Documentación. Sincronizada o no, da igual. **Distinta en cada dispositivo.** |
469
- | `ORQUESTADOR_REPOS_PATH` | **ninguno, es obligatoria** | Ruta a la carpeta donde están tus repositorios de código. |
470
- | `ORQUESTADOR_TASKS_SUBDIR` | `Proyectos` | Subcarpeta donde viven las tareas dentro de cada proyecto. Vacía = las tareas cuelgan directo del proyecto. Es además la regla que decide qué carpeta cuenta como proyecto (ver abajo). |
471
- | `ORQUESTADOR_PROMPTS_PATH` | ninguno | Carpeta de prompts propios, que **se superponen** a los del paquete en vez de reemplazarlos: basta con poner los archivos de las fases que quieras cambiar ([ver arriba](#usar-tus-propios-prompts-sin-perder-los-de-fábrica)). |
472
- | `ORQUESTADOR_STATE_PATH` | Carpeta de datos del usuario (ver arriba) | Carpeta donde se guardan los punteros de tarea activa. Casi nunca hace falta tocarla; sirve para aislar el estado en pruebas y es **obligatoria si registras el servidor más de una vez** (ver [¿Varias carpetas de Documentación?](#-varias-carpetas-de-documentación-opcional)). |
546
+ | `PHASE_GATE_DOCS_PATH` | **ninguno, es obligatoria** | Ruta a la carpeta raíz de la Documentación. Sincronizada o no, da igual. **Distinta en cada dispositivo.** |
547
+ | `PHASE_GATE_REPOS_PATH` | **ninguno, es obligatoria** | Ruta a la carpeta donde están tus repositorios de código. |
548
+ | `PHASE_GATE_TASKS_SUBDIR` | `Proyectos` | Subcarpeta donde viven las tareas dentro de cada proyecto. Vacía = las tareas cuelgan directo del proyecto. Es además la regla que decide qué carpeta cuenta como proyecto (ver abajo). |
549
+ | `PHASE_GATE_PROMPTS_PATH` | ninguno | Carpeta de prompts propios, que **se superponen** a los del paquete en vez de reemplazarlos: basta con poner los archivos de las fases que quieras cambiar ([ver arriba](#usar-tus-propios-prompts-sin-perder-los-de-fábrica)). |
550
+ | `PHASE_GATE_STATE_PATH` | Carpeta de datos del usuario (ver arriba) | Carpeta donde se guardan los punteros de tarea activa. Casi nunca hace falta tocarla; sirve para aislar el estado en pruebas y es **obligatoria si registras el servidor más de una vez** (ver [¿Varias carpetas de Documentación?](#-varias-carpetas-de-documentación-opcional)). |
551
+ | `PHASE_GATE_ELICITATION` | ninguno (activadas) | `off` (o `false`, `0`, `no`) para que el servidor no pida [confirmaciones directas](#-documentos-protegidos) al cliente y decida `force`, como antes. Recomendado en Cursor para Windows. No tiene alias. |
473
552
 
474
553
  ---
475
554
 
@@ -483,11 +562,19 @@ El código fuente está en `src/`, repartido por responsabilidad:
483
562
 
484
563
  | Archivo | De qué se encarga |
485
564
  |---------|-------------------|
486
- | `config.ts` | Rutas del entorno, dónde vive el estado, identidad del servidor |
565
+ | `config.ts` | Variables del entorno y su alias, lectura del `.env`, dónde vive el estado, identidad del servidor |
487
566
  | `paths.ts` | Cómo se arma cada ruta y la comprobación de que no se salga de su base |
488
567
  | `phases.ts` | Descubrir las fases y armar el prompt de cada una |
489
- | `tasks.ts` | Qué tareas existen, en qué fase va cada una y cuál está activa |
490
- | `index.ts` | Las tools del servidor. No calcula nada: traduce entre el protocolo y lo anterior |
568
+ | `tasks.ts` | Qué tareas existen, en qué fase va cada una, cuál está activa, la compuerta y los pendientes heredados |
569
+ | `schemas.ts` | Los argumentos de cada tool, con su descripción y su mensaje de error |
570
+ | `servidor.ts` | Las tools del servidor. No calcula nada: traduce entre el protocolo y lo anterior |
571
+ | `recursos.ts` | Los recursos `phase-gate://` |
572
+ | `prompts-mcp.ts` | Los comandos `/f1`…`/fN` como MCP Prompts |
573
+ | `confirmacion.ts` | Las confirmaciones directas al usuario (elicitation) |
574
+ | `diagnostico.ts` | La radiografía que comparten `doctor`, `get_orchestrator_status` y `phase-gate://estado` |
575
+ | `cli.ts` | La línea de comandos: `doctor`, `--help`, `--version` |
576
+ | `log.ts` | El log: stderr y, con un cliente conectado, notificaciones MCP |
577
+ | `index.ts` | El punto de entrada: la línea de comandos, o el servidor por stdio |
491
578
 
492
579
  El cliente ejecuta la versión compilada `build/index.js`, así que después de cualquier cambio:
493
580
 
@@ -513,7 +600,7 @@ no tocan la tuya. El CI los corre en cada PR.
513
600
  |------------|-------|
514
601
  | Lo que el proyecto hace hoy | Este README (y su gemelo en inglés, [`README.md`](README.md) — **si cambias uno, cambia el otro**) |
515
602
  | Por qué está diseñado así | [`docs/decisiones.md`](docs/decisiones.md) |
516
- | Los comandos `/f1`–`/f5`, para recrearlos en otro equipo | [`docs/comandos-de-fase.md`](docs/comandos-de-fase.md) |
603
+ | Los comandos `/f1`–`/f5` | Su texto en [`prompts/comandos/`](prompts/comandos); cómo llegan a cada cliente en [`docs/comandos-de-fase.md`](docs/comandos-de-fase.md) |
517
604
  | Que un cambio no rompió nada | [`test/`](test), con `npm test`. El CI los corre en cada PR |
518
605
  | Lo que falta por hacer | [Issues](https://github.com/Montse2308/mcp-phase-gate/issues) — agrupados con las labels `v1-uso-propio` y `v2-publico` |
519
606
  | Lo que ya se hizo | El historial de commits y los PRs mergeados |