docviz-builder 0.1.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/AGENTS.md +371 -0
- package/LICENSE +21 -0
- package/README.md +837 -0
- package/bin/docviz-mcp.mjs +10 -0
- package/bin/docviz.mjs +11 -0
- package/dist/build/builder.d.ts +62 -0
- package/dist/build/builder.d.ts.map +1 -0
- package/dist/build/builder.js +337 -0
- package/dist/build/builder.js.map +1 -0
- package/dist/build/diff.d.ts +64 -0
- package/dist/build/diff.d.ts.map +1 -0
- package/dist/build/diff.js +156 -0
- package/dist/build/diff.js.map +1 -0
- package/dist/build/doctor.d.ts +39 -0
- package/dist/build/doctor.d.ts.map +1 -0
- package/dist/build/doctor.js +190 -0
- package/dist/build/doctor.js.map +1 -0
- package/dist/build/init.d.ts +28 -0
- package/dist/build/init.d.ts.map +1 -0
- package/dist/build/init.js +274 -0
- package/dist/build/init.js.map +1 -0
- package/dist/build/preview.d.ts +13 -0
- package/dist/build/preview.d.ts.map +1 -0
- package/dist/build/preview.js +277 -0
- package/dist/build/preview.js.map +1 -0
- package/dist/build/skill.d.ts +41 -0
- package/dist/build/skill.d.ts.map +1 -0
- package/dist/build/skill.js +63 -0
- package/dist/build/skill.js.map +1 -0
- package/dist/build/verify.d.ts +26 -0
- package/dist/build/verify.d.ts.map +1 -0
- package/dist/build/verify.js +99 -0
- package/dist/build/verify.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +427 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/load.d.ts +32 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +279 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/types.d.ts +89 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/cache.d.ts +32 -0
- package/dist/core/cache.d.ts.map +1 -0
- package/dist/core/cache.js +69 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/errors.d.ts +115 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +164 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/hash.d.ts +57 -0
- package/dist/core/hash.d.ts.map +1 -0
- package/dist/core/hash.js +0 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/package-version.d.ts +9 -0
- package/dist/core/package-version.d.ts.map +1 -0
- package/dist/core/package-version.js +44 -0
- package/dist/core/package-version.js.map +1 -0
- package/dist/core/paths.d.ts +46 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +105 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/registry.d.ts +24 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +72 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/types.d.ts +78 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +11 -0
- package/dist/core/types.js.map +1 -0
- package/dist/dsl/architecture.d.ts +15 -0
- package/dist/dsl/architecture.d.ts.map +1 -0
- package/dist/dsl/architecture.js +242 -0
- package/dist/dsl/architecture.js.map +1 -0
- package/dist/dsl/catalog.d.ts +62 -0
- package/dist/dsl/catalog.d.ts.map +1 -0
- package/dist/dsl/catalog.en.d.ts +18 -0
- package/dist/dsl/catalog.en.d.ts.map +1 -0
- package/dist/dsl/catalog.en.js +299 -0
- package/dist/dsl/catalog.en.js.map +1 -0
- package/dist/dsl/catalog.js +1082 -0
- package/dist/dsl/catalog.js.map +1 -0
- package/dist/dsl/chart.d.ts +14 -0
- package/dist/dsl/chart.d.ts.map +1 -0
- package/dist/dsl/chart.js +435 -0
- package/dist/dsl/chart.js.map +1 -0
- package/dist/dsl/compile.d.ts +31 -0
- package/dist/dsl/compile.d.ts.map +1 -0
- package/dist/dsl/compile.js +120 -0
- package/dist/dsl/compile.js.map +1 -0
- package/dist/dsl/diagram-bpmn.d.ts +13 -0
- package/dist/dsl/diagram-bpmn.d.ts.map +1 -0
- package/dist/dsl/diagram-bpmn.js +215 -0
- package/dist/dsl/diagram-bpmn.js.map +1 -0
- package/dist/dsl/diagram-product.d.ts +15 -0
- package/dist/dsl/diagram-product.d.ts.map +1 -0
- package/dist/dsl/diagram-product.js +291 -0
- package/dist/dsl/diagram-product.js.map +1 -0
- package/dist/dsl/diagram-technical.d.ts +28 -0
- package/dist/dsl/diagram-technical.d.ts.map +1 -0
- package/dist/dsl/diagram-technical.js +365 -0
- package/dist/dsl/diagram-technical.js.map +1 -0
- package/dist/dsl/diagram.d.ts +22 -0
- package/dist/dsl/diagram.d.ts.map +1 -0
- package/dist/dsl/diagram.js +542 -0
- package/dist/dsl/diagram.js.map +1 -0
- package/dist/dsl/fallbacks-d2.d.ts +27 -0
- package/dist/dsl/fallbacks-d2.d.ts.map +1 -0
- package/dist/dsl/fallbacks-d2.js +265 -0
- package/dist/dsl/fallbacks-d2.js.map +1 -0
- package/dist/dsl/fallbacks.d.ts +25 -0
- package/dist/dsl/fallbacks.d.ts.map +1 -0
- package/dist/dsl/fallbacks.js +264 -0
- package/dist/dsl/fallbacks.js.map +1 -0
- package/dist/dsl/fields.d.ts +93 -0
- package/dist/dsl/fields.d.ts.map +1 -0
- package/dist/dsl/fields.js +233 -0
- package/dist/dsl/fields.js.map +1 -0
- package/dist/dsl/index.d.ts +50 -0
- package/dist/dsl/index.d.ts.map +1 -0
- package/dist/dsl/index.js +114 -0
- package/dist/dsl/index.js.map +1 -0
- package/dist/dsl/util.d.ts +105 -0
- package/dist/dsl/util.d.ts.map +1 -0
- package/dist/dsl/util.js +261 -0
- package/dist/dsl/util.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/scan.d.ts +73 -0
- package/dist/markdown/scan.d.ts.map +1 -0
- package/dist/markdown/scan.js +150 -0
- package/dist/markdown/scan.js.map +1 -0
- package/dist/markdown/transform.d.ts +28 -0
- package/dist/markdown/transform.d.ts.map +1 -0
- package/dist/markdown/transform.js +38 -0
- package/dist/markdown/transform.js.map +1 -0
- package/dist/mcp/server.d.ts +18 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +118 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +118 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +573 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/renderers/base.d.ts +18 -0
- package/dist/renderers/base.d.ts.map +1 -0
- package/dist/renderers/base.js +59 -0
- package/dist/renderers/base.js.map +1 -0
- package/dist/renderers/bpmn.d.ts +68 -0
- package/dist/renderers/bpmn.d.ts.map +1 -0
- package/dist/renderers/bpmn.js +158 -0
- package/dist/renderers/bpmn.js.map +1 -0
- package/dist/renderers/browser.d.ts +30 -0
- package/dist/renderers/browser.d.ts.map +1 -0
- package/dist/renderers/browser.js +143 -0
- package/dist/renderers/browser.js.map +1 -0
- package/dist/renderers/color-scheme.d.ts +40 -0
- package/dist/renderers/color-scheme.d.ts.map +1 -0
- package/dist/renderers/color-scheme.js +122 -0
- package/dist/renderers/color-scheme.js.map +1 -0
- package/dist/renderers/d2.d.ts +37 -0
- package/dist/renderers/d2.d.ts.map +1 -0
- package/dist/renderers/d2.js +108 -0
- package/dist/renderers/d2.js.map +1 -0
- package/dist/renderers/graphviz.d.ts +33 -0
- package/dist/renderers/graphviz.d.ts.map +1 -0
- package/dist/renderers/graphviz.js +88 -0
- package/dist/renderers/graphviz.js.map +1 -0
- package/dist/renderers/in-page.d.ts +33 -0
- package/dist/renderers/in-page.d.ts.map +1 -0
- package/dist/renderers/in-page.js +76 -0
- package/dist/renderers/in-page.js.map +1 -0
- package/dist/renderers/index.d.ts +20 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/renderers/index.js +94 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/kroki.d.ts +38 -0
- package/dist/renderers/kroki.d.ts.map +1 -0
- package/dist/renderers/kroki.js +151 -0
- package/dist/renderers/kroki.js.map +1 -0
- package/dist/renderers/likec4-svg.d.ts +82 -0
- package/dist/renderers/likec4-svg.d.ts.map +1 -0
- package/dist/renderers/likec4-svg.js +435 -0
- package/dist/renderers/likec4-svg.js.map +1 -0
- package/dist/renderers/likec4.d.ts +22 -0
- package/dist/renderers/likec4.d.ts.map +1 -0
- package/dist/renderers/likec4.js +77 -0
- package/dist/renderers/likec4.js.map +1 -0
- package/dist/renderers/mermaid.d.ts +64 -0
- package/dist/renderers/mermaid.d.ts.map +1 -0
- package/dist/renderers/mermaid.js +196 -0
- package/dist/renderers/mermaid.js.map +1 -0
- package/dist/renderers/plantuml.d.ts +56 -0
- package/dist/renderers/plantuml.d.ts.map +1 -0
- package/dist/renderers/plantuml.js +195 -0
- package/dist/renderers/plantuml.js.map +1 -0
- package/dist/renderers/svg-utils.d.ts +46 -0
- package/dist/renderers/svg-utils.d.ts.map +1 -0
- package/dist/renderers/svg-utils.js +439 -0
- package/dist/renderers/svg-utils.js.map +1 -0
- package/dist/renderers/svgbob.d.ts +26 -0
- package/dist/renderers/svgbob.d.ts.map +1 -0
- package/dist/renderers/svgbob.js +70 -0
- package/dist/renderers/svgbob.js.map +1 -0
- package/dist/renderers/vega-lite.d.ts +18 -0
- package/dist/renderers/vega-lite.d.ts.map +1 -0
- package/dist/renderers/vega-lite.js +94 -0
- package/dist/renderers/vega-lite.js.map +1 -0
- package/dist/themes/index.d.ts +17 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +419 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/themes/types.d.ts +99 -0
- package/dist/themes/types.d.ts.map +1 -0
- package/dist/themes/types.js +9 -0
- package/dist/themes/types.js.map +1 -0
- package/eval/casos.json +513 -0
- package/package.json +114 -0
- package/scripts/capture-preview.mjs +101 -0
- package/scripts/check-github.mjs +128 -0
- package/scripts/eval.d.mts +8 -0
- package/scripts/eval.mjs +284 -0
- package/scripts/fetch-plantuml.mjs +122 -0
- package/scripts/generate-catalog-doc.mjs +106 -0
- package/scripts/rasterize.mjs +68 -0
- package/scripts/sync-docs.mjs +158 -0
- package/skills/docviz/SKILL.md +111 -0
- package/vendor/.gitkeep +0 -0
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preparacion de un proyecto para usar DocViz.
|
|
3
|
+
*
|
|
4
|
+
* Adoptarlo a mano son cuatro archivos y cinco scripts, y el que se olvida
|
|
5
|
+
* siempre es `AGENTS.md`, justo el que hace que un agente escriba bien los
|
|
6
|
+
* bloques. Este comando deja el proyecto listo y no sobrescribe nada que ya
|
|
7
|
+
* exista: informa y sigue.
|
|
8
|
+
*/
|
|
9
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
/** Scripts que forman el flujo de trabajo documentado. */
|
|
13
|
+
export const SCRIPTS = [
|
|
14
|
+
['docs:check', 'docviz check docs-src'],
|
|
15
|
+
['docs:build', 'docviz build docs-src --output docs'],
|
|
16
|
+
['docs:verify', 'docviz verify docs'],
|
|
17
|
+
['docs:preview', 'docviz preview docs'],
|
|
18
|
+
['docs:doctor', 'docviz doctor'],
|
|
19
|
+
];
|
|
20
|
+
function configYaml(theme) {
|
|
21
|
+
return `# Configuracion de DocViz Builder.
|
|
22
|
+
#
|
|
23
|
+
# Todos los valores son opcionales: sin este archivo el build ya funciona en
|
|
24
|
+
# modo local, sin conexion y con el tema "default".
|
|
25
|
+
|
|
26
|
+
source: docs-src
|
|
27
|
+
|
|
28
|
+
output:
|
|
29
|
+
dir: docs
|
|
30
|
+
assetsDir: assets/generated
|
|
31
|
+
|
|
32
|
+
theme:
|
|
33
|
+
name: ${theme}
|
|
34
|
+
|
|
35
|
+
cache:
|
|
36
|
+
enabled: true
|
|
37
|
+
dir: .docviz-cache
|
|
38
|
+
|
|
39
|
+
renderers:
|
|
40
|
+
# "local" no envia nada a la red. "kroki" requiere una instancia propia.
|
|
41
|
+
backend: local
|
|
42
|
+
timeoutMs: 60000
|
|
43
|
+
|
|
44
|
+
# Mermaid y BPMN dibujan dentro de un Chromium local y el sandbox esta activo.
|
|
45
|
+
# Se desactiva solo como root, donde Chromium no arranca de otra forma.
|
|
46
|
+
# noSandbox: false
|
|
47
|
+
|
|
48
|
+
# Ejecuta \`docviz doctor\` para ver que motores puede usar esta maquina y que
|
|
49
|
+
# tipos quedarian afectados si falta alguno.
|
|
50
|
+
`;
|
|
51
|
+
}
|
|
52
|
+
function agentsMd() {
|
|
53
|
+
return `# Instrucciones para agentes — Documentación visual
|
|
54
|
+
|
|
55
|
+
Este proyecto usa **DocViz Builder** para generar diagramas dentro de Markdown.
|
|
56
|
+
|
|
57
|
+
## Regla principal
|
|
58
|
+
|
|
59
|
+
Modifica exclusivamente los documentos de \`docs-src/\`.
|
|
60
|
+
|
|
61
|
+
No edites nunca a mano \`docs/\` ni \`docs/assets/generated/\`: son directorios
|
|
62
|
+
generados y cualquier cambio se pierde en la siguiente compilación.
|
|
63
|
+
|
|
64
|
+
## Describe la intención, no la tecnología
|
|
65
|
+
|
|
66
|
+
DocViz elige el motor. Tú declaras qué quieres explicar con una de estas vallas:
|
|
67
|
+
|
|
68
|
+
| Valla | Cuándo |
|
|
69
|
+
|---|---|
|
|
70
|
+
| \`diagram\` | Interacción, flujo, estados, dependencias, análisis estratégico |
|
|
71
|
+
| \`chart\` | Comparación cuantitativa, tendencia, distribución |
|
|
72
|
+
| \`architecture\` | Modelo C4 |
|
|
73
|
+
|
|
74
|
+
Para saber qué tipo usar:
|
|
75
|
+
|
|
76
|
+
\`\`\`bash
|
|
77
|
+
npx docviz suggest "el proceso de aprobación de una solicitud"
|
|
78
|
+
npx docviz types # catálogo completo con propósito y ejemplo
|
|
79
|
+
npx docviz types sequence # ficha de un tipo concreto
|
|
80
|
+
\`\`\`
|
|
81
|
+
|
|
82
|
+
Si tu cliente tiene el servidor MCP de DocViz configurado, usa \`docviz_suggest\`
|
|
83
|
+
y \`docviz_types\` en lugar de los comandos.
|
|
84
|
+
|
|
85
|
+
## Ejemplo
|
|
86
|
+
|
|
87
|
+
\`\`\`\`md
|
|
88
|
+
\`\`\`diagram
|
|
89
|
+
type: sequence
|
|
90
|
+
title: Autenticación de usuario
|
|
91
|
+
|
|
92
|
+
participants:
|
|
93
|
+
- Usuario
|
|
94
|
+
- API
|
|
95
|
+
|
|
96
|
+
flow:
|
|
97
|
+
- Usuario -> API: Login
|
|
98
|
+
- API --> Usuario: Token
|
|
99
|
+
\`\`\`
|
|
100
|
+
\`\`\`\`
|
|
101
|
+
|
|
102
|
+
\`->\` es un mensaje; \`-->\` una respuesta.
|
|
103
|
+
|
|
104
|
+
## Flujo obligatorio
|
|
105
|
+
|
|
106
|
+
Después de crear o modificar documentación:
|
|
107
|
+
|
|
108
|
+
\`\`\`bash
|
|
109
|
+
npm run docs:check # valida los bloques sin dibujar
|
|
110
|
+
npm run docs:build # docs-src/ -> docs/
|
|
111
|
+
npm run docs:verify # comprueba que no haya imágenes rotas
|
|
112
|
+
npm run docs:preview # revisión visual
|
|
113
|
+
\`\`\`
|
|
114
|
+
|
|
115
|
+
No reportes la tarea como terminada mientras existan errores de renderizado o
|
|
116
|
+
imágenes rotas.
|
|
117
|
+
|
|
118
|
+
Cada error trae un **código** además de archivo y línea: \`DV101\` falta un campo
|
|
119
|
+
obligatorio, \`DV104\` escribiste un campo que ese tipo no usa, \`DV105\` el bloque
|
|
120
|
+
no es YAML válido, \`DV106\` el tipo no existe o va en otra valla. Un documento
|
|
121
|
+
con varios bloques rotos los reporta todos a la vez: arréglalos en una pasada.
|
|
122
|
+
|
|
123
|
+
Un \`AVISO ... [DV104]\` no rompe el build, pero significa que un campo que
|
|
124
|
+
escribiste no llegó al dibujo. O sobra, o está mal escrito; en ningún caso se
|
|
125
|
+
ignora.
|
|
126
|
+
|
|
127
|
+
Antes de dar por bueno un cambio grande, comprueba qué diagramas tocaste:
|
|
128
|
+
|
|
129
|
+
\`\`\`bash
|
|
130
|
+
npx docviz diff <docs-src de la versión anterior> docs-src
|
|
131
|
+
\`\`\`
|
|
132
|
+
|
|
133
|
+
## Reglas
|
|
134
|
+
|
|
135
|
+
- No generes SVG o PNG a mano cuando DocViz pueda generarlos.
|
|
136
|
+
- No modifiques hashes ni nombres de imagen.
|
|
137
|
+
- No introduzcas rutas absolutas.
|
|
138
|
+
- No sustituyas diagramas declarativos por capturas de pantalla.
|
|
139
|
+
- No fijes colores a mano: el tema trae su equivalente en modo oscuro, y un
|
|
140
|
+
color escrito a mano pierde esa propiedad.
|
|
141
|
+
|
|
142
|
+
## Cuándo NO dibujar
|
|
143
|
+
|
|
144
|
+
Antes de crear una visualización, comprueba que aporta algo. Para información
|
|
145
|
+
sencilla, una tabla Markdown o un párrafo comunican mejor. Un diagrama con veinte
|
|
146
|
+
cajas no explica nada: divídelo en varios con objetivos distintos.
|
|
147
|
+
`;
|
|
148
|
+
}
|
|
149
|
+
function documentoDeEjemplo() {
|
|
150
|
+
return `---
|
|
151
|
+
title: Arquitectura
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
# Arquitectura
|
|
155
|
+
|
|
156
|
+
Sustituye este documento por el tuyo. Sirve para comprobar que la compilación
|
|
157
|
+
funciona de extremo a extremo.
|
|
158
|
+
|
|
159
|
+
## Flujo de autenticación
|
|
160
|
+
|
|
161
|
+
\`\`\`diagram
|
|
162
|
+
type: sequence
|
|
163
|
+
title: Flujo de autenticación
|
|
164
|
+
|
|
165
|
+
participants:
|
|
166
|
+
- Usuario
|
|
167
|
+
- Frontend
|
|
168
|
+
- API
|
|
169
|
+
|
|
170
|
+
flow:
|
|
171
|
+
- Usuario -> Frontend: Login
|
|
172
|
+
- Frontend -> API: POST /login
|
|
173
|
+
- API --> Frontend: Token
|
|
174
|
+
\`\`\`
|
|
175
|
+
|
|
176
|
+
## Contexto del sistema
|
|
177
|
+
|
|
178
|
+
\`\`\`architecture
|
|
179
|
+
type: c4-context
|
|
180
|
+
title: Contexto
|
|
181
|
+
|
|
182
|
+
elements:
|
|
183
|
+
- id: usuario
|
|
184
|
+
kind: person
|
|
185
|
+
name: Usuario
|
|
186
|
+
- id: sistema
|
|
187
|
+
kind: system
|
|
188
|
+
name: Sistema
|
|
189
|
+
description: Sustituye esto por tu sistema
|
|
190
|
+
|
|
191
|
+
relations:
|
|
192
|
+
- from: usuario
|
|
193
|
+
to: sistema
|
|
194
|
+
label: Utiliza
|
|
195
|
+
\`\`\`
|
|
196
|
+
`;
|
|
197
|
+
}
|
|
198
|
+
const GITIGNORE = `
|
|
199
|
+
# DocViz: cache de recursos generados, se reconstruye solo.
|
|
200
|
+
.docviz-cache/
|
|
201
|
+
`;
|
|
202
|
+
export async function init(options) {
|
|
203
|
+
const { cwd, theme, force } = options;
|
|
204
|
+
const result = { creados: [], omitidos: [], scriptsPendientes: [] };
|
|
205
|
+
const escribir = async (relativo, contenido) => {
|
|
206
|
+
const destino = path.join(cwd, relativo);
|
|
207
|
+
if (existsSync(destino) && !force) {
|
|
208
|
+
result.omitidos.push(relativo);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
await mkdir(path.dirname(destino), { recursive: true });
|
|
212
|
+
await writeFile(destino, contenido, 'utf8');
|
|
213
|
+
result.creados.push(relativo);
|
|
214
|
+
};
|
|
215
|
+
await escribir('docviz.config.yaml', configYaml(theme));
|
|
216
|
+
await escribir('AGENTS.md', agentsMd());
|
|
217
|
+
await escribir(path.join('docs-src', 'arquitectura.md'), documentoDeEjemplo());
|
|
218
|
+
// El `.gitignore` se completa en lugar de sustituirse: casi siempre ya existe
|
|
219
|
+
// y tiene contenido que no es nuestro.
|
|
220
|
+
const gitignore = path.join(cwd, '.gitignore');
|
|
221
|
+
if (existsSync(gitignore)) {
|
|
222
|
+
const actual = await readFile(gitignore, 'utf8');
|
|
223
|
+
if (!actual.includes('.docviz-cache')) {
|
|
224
|
+
await writeFile(gitignore, `${actual.replace(/\s*$/, '')}\n${GITIGNORE}`, 'utf8');
|
|
225
|
+
result.creados.push('.gitignore (ampliado)');
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
result.omitidos.push('.gitignore');
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
await escribir('.gitignore', GITIGNORE.trimStart());
|
|
233
|
+
}
|
|
234
|
+
// Los scripts no se escriben solos: modificar el package.json de otro
|
|
235
|
+
// proyecto es intrusivo. Se informa de cuales faltan.
|
|
236
|
+
const packageJson = path.join(cwd, 'package.json');
|
|
237
|
+
if (existsSync(packageJson)) {
|
|
238
|
+
const contenido = JSON.parse(await readFile(packageJson, 'utf8'));
|
|
239
|
+
const scripts = contenido.scripts ?? {};
|
|
240
|
+
for (const [nombre, comando] of SCRIPTS) {
|
|
241
|
+
if (scripts[nombre] === undefined)
|
|
242
|
+
result.scriptsPendientes.push([nombre, comando]);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
result.scriptsPendientes.push(...SCRIPTS.map((s) => [s[0], s[1]]));
|
|
247
|
+
}
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
/** Informe legible de lo que hizo `init`. */
|
|
251
|
+
export function formatearInit(result, theme) {
|
|
252
|
+
const lineas = [''];
|
|
253
|
+
if (result.creados.length > 0) {
|
|
254
|
+
lineas.push('Creados:');
|
|
255
|
+
for (const archivo of result.creados)
|
|
256
|
+
lineas.push(` + ${archivo}`);
|
|
257
|
+
lineas.push('');
|
|
258
|
+
}
|
|
259
|
+
if (result.omitidos.length > 0) {
|
|
260
|
+
lineas.push('Ya existian, no se tocaron:');
|
|
261
|
+
for (const archivo of result.omitidos)
|
|
262
|
+
lineas.push(` = ${archivo}`);
|
|
263
|
+
lineas.push(' (usa --force para sobrescribirlos)', '');
|
|
264
|
+
}
|
|
265
|
+
if (result.scriptsPendientes.length > 0) {
|
|
266
|
+
lineas.push('Anade estos scripts a tu package.json:', '');
|
|
267
|
+
lineas.push(' "scripts": {');
|
|
268
|
+
lineas.push(result.scriptsPendientes.map(([nombre, comando]) => ` "${nombre}": "${comando}"`).join(',\n'));
|
|
269
|
+
lineas.push(' }', '');
|
|
270
|
+
}
|
|
271
|
+
lineas.push(`Tema: ${theme}`, '', 'Siguientes pasos:', ' npx docviz doctor comprueba que motores puede usar esta maquina', ' npx docviz build docs-src --output docs', ' npx docviz preview docs', '');
|
|
272
|
+
return lineas.join('\n');
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/build/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAkB7B,0DAA0D;AAC1D,MAAM,CAAC,MAAM,OAAO,GAA6C;IAC/D,CAAC,YAAY,EAAE,uBAAuB,CAAC;IACvC,CAAC,YAAY,EAAE,qCAAqC,CAAC;IACrD,CAAC,aAAa,EAAE,oBAAoB,CAAC;IACrC,CAAC,cAAc,EAAE,qBAAqB,CAAC;IACvC,CAAC,aAAa,EAAE,eAAe,CAAC;CACjC,CAAC;AAEF,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO;;;;;;;;;;;;UAYC,KAAK;;;;;;;;;;;;;;;;;CAiBd,CAAC;AACF,CAAC;AAED,SAAS,QAAQ;IACf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8FR,CAAC;AACF,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CR,CAAC;AACF,CAAC;AAED,MAAM,SAAS,GAAG;;;CAGjB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAoB;IAC7C,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC;IAEhF,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAgB,EAAE,SAAiB,EAAiB,EAAE;QAC5E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACzC,IAAI,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxC,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAE/E,8EAA8E;IAC9E,uCAAuC;IACvC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;YAClF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,sEAAsE;IACtE,sDAAsD;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACnD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAyC,CAAC;QAC1G,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;YACxC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS;gBAAE,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAqB,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,aAAa,CAAC,MAAkB,EAAE,KAAa;IAC7D,MAAM,MAAM,GAAa,CAAC,EAAE,CAAC,CAAC;IAE9B,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,MAAM,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,QAAQ,MAAM,OAAO,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CACjG,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,IAAI,CACT,SAAS,KAAK,EAAE,EAChB,EAAE,EACF,mBAAmB,EACnB,sEAAsE,EACtE,2CAA2C,EAC3C,2BAA2B,EAC3B,EAAE,CACH,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Servidor estatico de previsualizacion.
|
|
3
|
+
*
|
|
4
|
+
* Sirve el Markdown ya compilado con un visor minimo para la revision visual
|
|
5
|
+
* exigida por la seccion 22. Escucha solo en la interfaz local.
|
|
6
|
+
*/
|
|
7
|
+
export interface PreviewServer {
|
|
8
|
+
url: string;
|
|
9
|
+
port: number;
|
|
10
|
+
close(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare function startPreview(rootDir: string, port?: number): Promise<PreviewServer>;
|
|
13
|
+
//# sourceMappingURL=preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/build/preview.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAuBvF"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Servidor estatico de previsualizacion.
|
|
3
|
+
*
|
|
4
|
+
* Sirve el Markdown ya compilado con un visor minimo para la revision visual
|
|
5
|
+
* exigida por la seccion 22. Escucha solo en la interfaz local.
|
|
6
|
+
*/
|
|
7
|
+
import { createReadStream } from 'node:fs';
|
|
8
|
+
import { readFile, readdir, realpath, stat } from 'node:fs/promises';
|
|
9
|
+
import http from 'node:http';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { collectMarkdown } from './builder.js';
|
|
12
|
+
import { toPosix } from '../core/paths.js';
|
|
13
|
+
const MIME = {
|
|
14
|
+
'.html': 'text/html; charset=utf-8',
|
|
15
|
+
'.md': 'text/markdown; charset=utf-8',
|
|
16
|
+
'.svg': 'image/svg+xml',
|
|
17
|
+
'.png': 'image/png',
|
|
18
|
+
'.jpg': 'image/jpeg',
|
|
19
|
+
'.jpeg': 'image/jpeg',
|
|
20
|
+
'.gif': 'image/gif',
|
|
21
|
+
'.css': 'text/css; charset=utf-8',
|
|
22
|
+
'.js': 'text/javascript; charset=utf-8',
|
|
23
|
+
'.json': 'application/json; charset=utf-8',
|
|
24
|
+
};
|
|
25
|
+
export async function startPreview(rootDir, port = 4321) {
|
|
26
|
+
const root = path.resolve(rootDir);
|
|
27
|
+
const server = http.createServer((req, res) => {
|
|
28
|
+
void handle(root, req, res).catch(() => {
|
|
29
|
+
res.writeHead(500, { 'content-type': 'text/plain; charset=utf-8' });
|
|
30
|
+
res.end('error interno del servidor de previsualizacion');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
const actualPort = await new Promise((resolve, reject) => {
|
|
34
|
+
server.once('error', reject);
|
|
35
|
+
server.listen(port, '127.0.0.1', () => {
|
|
36
|
+
const address = server.address();
|
|
37
|
+
resolve(typeof address === 'object' && address !== null ? address.port : port);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
url: `http://127.0.0.1:${actualPort}/`,
|
|
42
|
+
port: actualPort,
|
|
43
|
+
close: () => new Promise((resolve) => server.close(() => resolve())),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/** `true` si la ruta no esta contenida en la raiz. */
|
|
47
|
+
function fuera(root, target) {
|
|
48
|
+
const rel = path.relative(root, target);
|
|
49
|
+
return rel.startsWith('..') || path.isAbsolute(rel);
|
|
50
|
+
}
|
|
51
|
+
async function handle(root, req, res) {
|
|
52
|
+
const url = new URL(req.url ?? '/', 'http://127.0.0.1');
|
|
53
|
+
const decoded = decodeURIComponent(url.pathname);
|
|
54
|
+
if (decoded === '/') {
|
|
55
|
+
const html = await indexPage(root);
|
|
56
|
+
res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
|
|
57
|
+
res.end(html);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Contencion: nada fuera de `root` puede servirse.
|
|
61
|
+
const target = path.resolve(root, `.${decoded}`);
|
|
62
|
+
if (fuera(root, target)) {
|
|
63
|
+
res.writeHead(403, { 'content-type': 'text/plain; charset=utf-8' });
|
|
64
|
+
res.end('acceso denegado');
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// Y otra vez sobre la ruta real: comparar cadenas no sigue los enlaces
|
|
68
|
+
// simbolicos, asi que un enlace dentro de la salida apuntando a /etc pasaria
|
|
69
|
+
// la comprobacion de arriba y se serviria igual.
|
|
70
|
+
let real;
|
|
71
|
+
try {
|
|
72
|
+
real = await realpath(target);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
res.writeHead(404, { 'content-type': 'text/plain; charset=utf-8' });
|
|
76
|
+
res.end('no encontrado');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (fuera(await realpath(root), real)) {
|
|
80
|
+
res.writeHead(403, { 'content-type': 'text/plain; charset=utf-8' });
|
|
81
|
+
res.end('acceso denegado');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
let info;
|
|
85
|
+
try {
|
|
86
|
+
info = await stat(target);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
res.writeHead(404, { 'content-type': 'text/plain; charset=utf-8' });
|
|
90
|
+
res.end('no encontrado');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (info.isDirectory()) {
|
|
94
|
+
res.writeHead(404, { 'content-type': 'text/plain; charset=utf-8' });
|
|
95
|
+
res.end('no encontrado');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const ext = path.extname(target).toLowerCase();
|
|
99
|
+
if (ext === '.md' && url.searchParams.get('raw') !== '1') {
|
|
100
|
+
const text = await readFile(target, 'utf8');
|
|
101
|
+
res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
|
|
102
|
+
res.end(documentPage(path.relative(root, target), text));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
res.writeHead(200, {
|
|
106
|
+
'content-type': MIME[ext] ?? 'application/octet-stream',
|
|
107
|
+
'content-length': info.size,
|
|
108
|
+
});
|
|
109
|
+
createReadStream(target).pipe(res);
|
|
110
|
+
}
|
|
111
|
+
async function indexPage(root) {
|
|
112
|
+
const files = await collectMarkdown(root);
|
|
113
|
+
const items = files
|
|
114
|
+
.map((f) => toPosix(path.relative(root, f)))
|
|
115
|
+
.map((f) => `<li><a href="/${f}">${escapeHtml(f)}</a></li>`)
|
|
116
|
+
.join('\n');
|
|
117
|
+
const assets = await countAssets(root);
|
|
118
|
+
return page('DocViz — previsualizacion', `<h1>Documentos compilados</h1>
|
|
119
|
+
<p class="meta">${files.length} documento(s) · ${assets} recurso(s) generado(s) · raiz <code>${escapeHtml(root)}</code></p>
|
|
120
|
+
<ul class="docs">${items}</ul>`);
|
|
121
|
+
}
|
|
122
|
+
async function countAssets(root) {
|
|
123
|
+
const dir = path.join(root, 'assets', 'generated');
|
|
124
|
+
try {
|
|
125
|
+
return (await readdir(dir)).length;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return 0;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Render minimo de Markdown suficiente para revisar imagenes, titulos y
|
|
133
|
+
* tablas. No pretende ser un visor completo: su unico objetivo es que la
|
|
134
|
+
* validacion visual se pueda hacer sin instalar nada mas.
|
|
135
|
+
*/
|
|
136
|
+
function documentPage(relative, markdown) {
|
|
137
|
+
const body = renderMarkdown(markdown);
|
|
138
|
+
return page(relative, `<p class="meta"><a href="/">← indice</a> · <code>${escapeHtml(relative)}</code> · <a href="?raw=1">ver fuente</a></p>
|
|
139
|
+
<article>${body}</article>`);
|
|
140
|
+
}
|
|
141
|
+
function renderMarkdown(markdown) {
|
|
142
|
+
const lines = markdown.split('\n');
|
|
143
|
+
const out = [];
|
|
144
|
+
let inCode = false;
|
|
145
|
+
let inTable = false;
|
|
146
|
+
let listType;
|
|
147
|
+
const closeList = () => {
|
|
148
|
+
if (listType !== undefined) {
|
|
149
|
+
out.push(`</${listType}>`);
|
|
150
|
+
listType = undefined;
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
const closeTable = () => {
|
|
154
|
+
if (inTable) {
|
|
155
|
+
out.push('</tbody></table>');
|
|
156
|
+
inTable = false;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
for (const line of lines) {
|
|
160
|
+
if (/^```/.test(line)) {
|
|
161
|
+
closeList();
|
|
162
|
+
closeTable();
|
|
163
|
+
out.push(inCode ? '</code></pre>' : '<pre><code>');
|
|
164
|
+
inCode = !inCode;
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (inCode) {
|
|
168
|
+
out.push(escapeHtml(line));
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const heading = /^(#{1,6})\s+(.*)$/.exec(line);
|
|
172
|
+
if (heading !== null) {
|
|
173
|
+
closeList();
|
|
174
|
+
closeTable();
|
|
175
|
+
const level = heading[1].length;
|
|
176
|
+
out.push(`<h${level}>${inline(heading[2])}</h${level}>`);
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
if (/^\s*\|.*\|\s*$/.test(line)) {
|
|
180
|
+
const cells = line.trim().slice(1, -1).split('|').map((c) => c.trim());
|
|
181
|
+
if (/^[\s|:-]+$/.test(line))
|
|
182
|
+
continue;
|
|
183
|
+
if (!inTable) {
|
|
184
|
+
closeList();
|
|
185
|
+
out.push('<table><thead><tr>');
|
|
186
|
+
out.push(cells.map((c) => `<th>${inline(c)}</th>`).join(''));
|
|
187
|
+
out.push('</tr></thead><tbody>');
|
|
188
|
+
inTable = true;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
out.push(`<tr>${cells.map((c) => `<td>${inline(c)}</td>`).join('')}</tr>`);
|
|
192
|
+
}
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
closeTable();
|
|
196
|
+
const bullet = /^\s*[-*+]\s+(.*)$/.exec(line);
|
|
197
|
+
const numbered = /^\s*\d+[.)]\s+(.*)$/.exec(line);
|
|
198
|
+
if (bullet !== null || numbered !== null) {
|
|
199
|
+
const wanted = bullet !== null ? 'ul' : 'ol';
|
|
200
|
+
if (listType !== wanted) {
|
|
201
|
+
closeList();
|
|
202
|
+
out.push(`<${wanted}>`);
|
|
203
|
+
listType = wanted;
|
|
204
|
+
}
|
|
205
|
+
out.push(`<li>${inline((bullet ?? numbered)[1])}</li>`);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
closeList();
|
|
209
|
+
if (line.trim() === '')
|
|
210
|
+
continue;
|
|
211
|
+
if (/^---+$/.test(line.trim())) {
|
|
212
|
+
out.push('<hr>');
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
out.push(`<p>${inline(line)}</p>`);
|
|
216
|
+
}
|
|
217
|
+
closeList();
|
|
218
|
+
closeTable();
|
|
219
|
+
if (inCode)
|
|
220
|
+
out.push('</code></pre>');
|
|
221
|
+
return out.join('\n');
|
|
222
|
+
}
|
|
223
|
+
function inline(text) {
|
|
224
|
+
let out = escapeHtml(text);
|
|
225
|
+
out = out.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g, (_m, alt, src) => {
|
|
226
|
+
const clean = src.replace(/^<|>$/g, '');
|
|
227
|
+
return `<figure><img src="${clean}" alt="${alt}" loading="lazy"><figcaption>${alt}</figcaption></figure>`;
|
|
228
|
+
});
|
|
229
|
+
out = out.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, '<a href="$2">$1</a>');
|
|
230
|
+
out = out.replace(/`([^`]+)`/g, '<code>$1</code>');
|
|
231
|
+
out = out.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
|
|
232
|
+
return out;
|
|
233
|
+
}
|
|
234
|
+
function escapeHtml(text) {
|
|
235
|
+
return text
|
|
236
|
+
.replace(/&/g, '&')
|
|
237
|
+
.replace(/</g, '<')
|
|
238
|
+
.replace(/>/g, '>')
|
|
239
|
+
.replace(/"/g, '"');
|
|
240
|
+
}
|
|
241
|
+
function page(title, body) {
|
|
242
|
+
return `<!doctype html>
|
|
243
|
+
<html lang="es">
|
|
244
|
+
<head>
|
|
245
|
+
<meta charset="utf-8">
|
|
246
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
247
|
+
<title>${escapeHtml(title)}</title>
|
|
248
|
+
<style>
|
|
249
|
+
:root { color-scheme: light dark; }
|
|
250
|
+
body { margin: 0 auto; max-width: 60rem; padding: 2rem 1.5rem 6rem;
|
|
251
|
+
font: 16px/1.65 system-ui, -apple-system, 'Segoe UI', sans-serif; }
|
|
252
|
+
h1, h2, h3, h4 { line-height: 1.25; margin: 2rem 0 .75rem; }
|
|
253
|
+
h1 { font-size: 1.9rem; } h2 { font-size: 1.45rem; } h3 { font-size: 1.2rem; }
|
|
254
|
+
.meta { color: #6b7280; font-size: .9rem; }
|
|
255
|
+
figure { margin: 1.5rem 0; }
|
|
256
|
+
img { max-width: 100%; height: auto; display: block; }
|
|
257
|
+
figcaption { color: #6b7280; font-size: .85rem; margin-top: .4rem; }
|
|
258
|
+
pre { background: #f6f8fa; padding: .9rem 1rem; overflow-x: auto; border-radius: 6px; }
|
|
259
|
+
code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .9em; }
|
|
260
|
+
table { border-collapse: collapse; margin: 1.2rem 0; width: 100%; }
|
|
261
|
+
th, td { border: 1px solid #d0d7de; padding: .45rem .7rem; text-align: left; }
|
|
262
|
+
th { background: #f6f8fa; }
|
|
263
|
+
ul.docs { padding-left: 1.1rem; }
|
|
264
|
+
a { color: #0969da; }
|
|
265
|
+
@media (prefers-color-scheme: dark) {
|
|
266
|
+
body { background: #0d1117; color: #e6edf3; }
|
|
267
|
+
pre, th { background: #161b22; }
|
|
268
|
+
th, td { border-color: #30363d; }
|
|
269
|
+
a { color: #58a6ff; }
|
|
270
|
+
.meta, figcaption { color: #9ba7b4; }
|
|
271
|
+
}
|
|
272
|
+
</style>
|
|
273
|
+
</head>
|
|
274
|
+
<body>${body}</body>
|
|
275
|
+
</html>`;
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/build/preview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instalacion del contrato de DocViz como skill de agente.
|
|
3
|
+
*
|
|
4
|
+
* `docviz init` deja un `AGENTS.md` en el proyecto, y eso basta para los
|
|
5
|
+
* agentes que lo leen solos. Pero un agente solo abre `AGENTS.md` si ya esta
|
|
6
|
+
* trabajando en ese repositorio: no hay forma de que sepa que DocViz existe
|
|
7
|
+
* antes de eso. Un skill instalado —en el proyecto o en el perfil del usuario—
|
|
8
|
+
* lo pone en su radar desde el primer mensaje.
|
|
9
|
+
*/
|
|
10
|
+
export interface SkillOptions {
|
|
11
|
+
/** Raiz del proyecto, para la instalacion local. */
|
|
12
|
+
cwd: string;
|
|
13
|
+
/** Instala en el perfil del usuario en lugar de en el proyecto. */
|
|
14
|
+
global?: boolean;
|
|
15
|
+
/** Directorio de skills de otro agente, si no es el de Claude Code. */
|
|
16
|
+
dir?: string;
|
|
17
|
+
/** Sobrescribe una instalacion anterior. */
|
|
18
|
+
force?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface SkillResult {
|
|
21
|
+
destino: string;
|
|
22
|
+
escrito: boolean;
|
|
23
|
+
/** Por que no se escribio, si no se escribio. */
|
|
24
|
+
motivo?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Fuente del skill dentro del propio paquete. */
|
|
27
|
+
export declare function skillSourcePath(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Directorio donde el agente busca sus skills.
|
|
30
|
+
*
|
|
31
|
+
* Se admite `dir` explicito porque cada agente elige el suyo y esa lista
|
|
32
|
+
* cambia mas rapido que este paquete: fijarla aqui garantizaria quedarse
|
|
33
|
+
* desactualizado.
|
|
34
|
+
*/
|
|
35
|
+
export declare function skillTargetDir(options: SkillOptions): string;
|
|
36
|
+
export declare function installSkill(options: SkillOptions): Promise<SkillResult>;
|
|
37
|
+
/** Informe legible de la instalacion. */
|
|
38
|
+
export declare function formatearSkill(result: SkillResult): string;
|
|
39
|
+
/** Contenido del skill, para comprobar que sigue siendo valido. */
|
|
40
|
+
export declare function readSkill(): Promise<string>;
|
|
41
|
+
//# sourceMappingURL=skill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/build/skill.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH,MAAM,WAAW,YAAY;IAC3B,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,uEAAuE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kDAAkD;AAClD,wBAAgB,eAAe,IAAI,MAAM,CAIxC;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAI5D;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAmB9E;AAED,yCAAyC;AACzC,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAa1D;AAED,mEAAmE;AACnE,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAEjD"}
|