CreaRack-SL

MCP Tool: wiki_delete_page — Hard-delete de drafts wiki

MCP Tool: wiki_delete_page

Tool MCP del supercontexto CreaRack Pro que realiza el hard-delete real de una página wiki en estado draft: elimina la fila de bib_wiki_pages en D1 y (por defecto) también borra el .md del repo vía GitHub Contents API. Introducida en el pulido sesión 17 como reemplazo del fallback que usaba wiki_archive_page.


Resumen rápido

CampoValor
Nombrewiki_delete_page
HandlerwikiDeletePage() en functions/api/mcp/handlers/wiki.ts
GuardSolo status = 'draft'. Rechaza active / stale / archived.
D1DELETE FROM bib_wiki_pages WHERE slug = ? AND status = 'draft'
RepoghDeleteFile() → DELETE /repos/{owner}/{repo}/contents/{path}
LogINSERT INTO bib_wiki_log (operation='delete', ...)
LOGGED_TOOLSSí — action: 'delete', entity_type: 'wiki_page'

Parámetros

ParámetroTipoRequeridoDefaultDescripción
slugstring✅—Slug del draft a borrar
reasonstring❌'deleted'Razón del borrado (queda en bib_wiki_log)
actorstring❌'unknown'Quién borra (edu|dani|agent-xxx)
delete_fileboolean❌trueSi true, borra también el .md vía GitHub API

Comportamiento detallado

1. Guard de status

Antes de cualquier operación, la función consulta bib_wiki_pages por slug. Si la página:

  • no existe → devuelve { error: "Page '...' not found" }
  • status ≠ draft → devuelve { error: "... only drafts can be deleted. Use wiki_archive_page for active/stale pages." }

2. Borrado del .md en repo (cuando delete_file: true)

Llama al helper ghDeleteFile() que:

  1. Obtiene el SHA actual del fichero con getFileSha().
  2. Lanza DELETE /repos/{REPO}/contents/{file_path} con el SHA y el mensaje de commit wiki: delete draft '<slug>' (<reason>).
  3. El commit queda en git como audit trail permanente.

Si el SHA no existe (fichero ya ausente) o la API devuelve error, no aborta: continúa con el DELETE de D1 y devuelve file_warning en la respuesta.

3. DELETE en D1

DELETE FROM bib_wiki_pages WHERE slug = ? AND status = 'draft'

La condición AND status = 'draft' es redundante de seguridad ante posible race condition entre el check inicial y el DELETE.

4. Log en bib_wiki_log

Siempre se inserta una fila con operation = 'delete' independientemente del resultado del borrado del fichero.


Respuesta de la tool

{
  "deleted": true,
  "slug": "<slug>",
  "file_deleted": true,
  "file_warning": null,
  "rows_affected": 1
}
  • deleted: true si rows_affected > 0 en D1.
  • file_deleted: true si el .md fue eliminado del repo con éxito.
  • file_warning: string con el error si el borrado del .md falló (la D1 se borró igualmente).

Diferencia vs wiki_archive_page

wiki_archive_pagewiki_delete_page
AcciónCambia status → archivedBorra la fila de D1
Fichero .mdLo deja intactoLo borra (por defecto)
ReversibleSí (status se puede cambiar)No
Scopeactive / stale / archivedSolo draft
Audit trailCampo status en D1Commit de borrado en git + fila en bib_wiki_log

Regla: usar wiki_delete_page únicamente para drafts que no deben existir. Para retirar páginas activas, usar wiki_archive_page.


Contexto de implementación

Antes del pulido sesión 17, la skill wiki-delete usaba wiki_archive_page como fallback (marcaba la página como archived pero no borraba la fila D1 ni el .md). El commit 2db6309 implementó el hard-delete real con tres cambios coordinados:

  1. wiki.ts: función wikiDeletePage + helper ghDeleteFile + validOps ampliado con 'delete'.
  2. tools.ts: declaración de wiki_delete_page en el array TOOLS.
  3. index.ts: registro en LOGGED_TOOLS (action: 'delete').
  4. SKILL.md: pasos 5-6 reescritos para invocar la tool real.

Variables de entorno requeridas

VariableUso
env.GH_PATToken PAT de GitHub para llamar a la Contents API

Si GH_PAT no está disponible, el borrado del .md se omite silenciosamente y file_warning refleja la ausencia.

Véase también

  • [[entity—mcp—skill—wiki-delete]]