69 lines
3.5 KiB
JavaScript
69 lines
3.5 KiB
JavaScript
import { z } from "zod";
|
|
import { handleToolError, validateRequired } from "../helpers/errorHandler.js";
|
|
import { readDoc } from "./_docsReader.js";
|
|
|
|
export function registerReadDocTool(server) {
|
|
server.tool(
|
|
"read_doc",
|
|
`Lee un documento del knowledge base de Acai bajo demanda.
|
|
|
|
Cuándo usarlo:
|
|
- El doc no se cargó completo en el contexto (aparece en "Other Available Docs" del knowledge_base).
|
|
- Necesitas una sección concreta con detalle sin cargar todo el doc.
|
|
- Vas a hacer una operación delicada y quieres releer las reglas exactas (e.g. crear una tabla, escribir un hook, editar el header).
|
|
|
|
Parámetros:
|
|
- name: id del doc (sin extensión). Ejemplos: '01-builder-fields', '05-tables-and-fields', '09-mcp-tools-reference'. Usa 'list_docs' si dudas del id.
|
|
- section: opcional. Match case-insensitive y parcial sobre headings H2 ('## ...'). Devuelve desde el heading hasta el siguiente H2.
|
|
|
|
Si la sección no existe, la respuesta incluye 'available_sections' para que reintentes con un nombre válido.
|
|
|
|
Docs disponibles (resumen):
|
|
- 01-builder-fields — Campos editables (data-field-type), atributos Acai (c-if, c-for, c-class), c-form, componentes built-in.
|
|
- 02-twig — Filtros Twig (get, queryDB, hook, module, imagec, translate, raw).
|
|
- 03-modules-and-sections — Módulos vs secciones generales, thisrecord, multiv2, custom-{tableName}.
|
|
- 04-pages-and-records — Builder vs Standard, menuType, apartados, reglas sobre enlace/controlador.
|
|
- 05-tables-and-fields — Schema, create_table, create_field, tipos de campo, casos destructivos.
|
|
- 06-hooks-and-cmsapi — Hooks PHP, CmsApi/CocoDB, hook middleware.
|
|
- 07-css-js-conventions — Tailwind+BEM, scoping, Vue 3, componentes nativos.
|
|
- 08-layout-and-libraries — get/set_layout_field, librerías globales, regla de no editar layout.json.
|
|
- 09-mcp-tools-reference — Inventario completo + workflows canónicos.
|
|
- 10-production-patterns — Patrones reales (cabecera, zigzag, FAQ, formulario, detalle).
|
|
- 11-quick-reference — Cheat sheet con todas las reglas y formatos.`,
|
|
{
|
|
name: z.string().describe("ID del doc sin extensión (e.g. '05-tables-and-fields')"),
|
|
section: z.string().optional().describe("Heading H2 a extraer (case-insensitive, parcial). Omitir para leer el doc completo."),
|
|
},
|
|
{ readOnlyHint: true, destructiveHint: false },
|
|
async ({ name, section }) => {
|
|
try {
|
|
const validationError = validateRequired({ name }, ["name"], "read_doc");
|
|
if (validationError) return validationError;
|
|
|
|
const data = await readDoc(name, section);
|
|
return {
|
|
content: [{
|
|
type: "text",
|
|
text: JSON.stringify(data, null, 2),
|
|
}],
|
|
};
|
|
} catch (error) {
|
|
if (error?.code === "DOC_NOT_FOUND") {
|
|
return {
|
|
content: [{
|
|
type: "text",
|
|
text: JSON.stringify({
|
|
success: false,
|
|
error: error.message,
|
|
hint: "Usa 'list_docs' para ver los ids disponibles. Los ids tienen prefijo numérico (e.g. '05-tables-and-fields').",
|
|
}, null, 2),
|
|
}],
|
|
isError: true,
|
|
};
|
|
}
|
|
return handleToolError(error, "read_doc", { name, section });
|
|
}
|
|
}
|
|
);
|
|
}
|