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.
Files changed (233) hide show
  1. package/AGENTS.md +371 -0
  2. package/LICENSE +21 -0
  3. package/README.md +837 -0
  4. package/bin/docviz-mcp.mjs +10 -0
  5. package/bin/docviz.mjs +11 -0
  6. package/dist/build/builder.d.ts +62 -0
  7. package/dist/build/builder.d.ts.map +1 -0
  8. package/dist/build/builder.js +337 -0
  9. package/dist/build/builder.js.map +1 -0
  10. package/dist/build/diff.d.ts +64 -0
  11. package/dist/build/diff.d.ts.map +1 -0
  12. package/dist/build/diff.js +156 -0
  13. package/dist/build/diff.js.map +1 -0
  14. package/dist/build/doctor.d.ts +39 -0
  15. package/dist/build/doctor.d.ts.map +1 -0
  16. package/dist/build/doctor.js +190 -0
  17. package/dist/build/doctor.js.map +1 -0
  18. package/dist/build/init.d.ts +28 -0
  19. package/dist/build/init.d.ts.map +1 -0
  20. package/dist/build/init.js +274 -0
  21. package/dist/build/init.js.map +1 -0
  22. package/dist/build/preview.d.ts +13 -0
  23. package/dist/build/preview.d.ts.map +1 -0
  24. package/dist/build/preview.js +277 -0
  25. package/dist/build/preview.js.map +1 -0
  26. package/dist/build/skill.d.ts +41 -0
  27. package/dist/build/skill.d.ts.map +1 -0
  28. package/dist/build/skill.js +63 -0
  29. package/dist/build/skill.js.map +1 -0
  30. package/dist/build/verify.d.ts +26 -0
  31. package/dist/build/verify.d.ts.map +1 -0
  32. package/dist/build/verify.js +99 -0
  33. package/dist/build/verify.js.map +1 -0
  34. package/dist/cli.d.ts +20 -0
  35. package/dist/cli.d.ts.map +1 -0
  36. package/dist/cli.js +427 -0
  37. package/dist/cli.js.map +1 -0
  38. package/dist/config/load.d.ts +32 -0
  39. package/dist/config/load.d.ts.map +1 -0
  40. package/dist/config/load.js +279 -0
  41. package/dist/config/load.js.map +1 -0
  42. package/dist/config/types.d.ts +89 -0
  43. package/dist/config/types.d.ts.map +1 -0
  44. package/dist/config/types.js +5 -0
  45. package/dist/config/types.js.map +1 -0
  46. package/dist/core/cache.d.ts +32 -0
  47. package/dist/core/cache.d.ts.map +1 -0
  48. package/dist/core/cache.js +69 -0
  49. package/dist/core/cache.js.map +1 -0
  50. package/dist/core/errors.d.ts +115 -0
  51. package/dist/core/errors.d.ts.map +1 -0
  52. package/dist/core/errors.js +164 -0
  53. package/dist/core/errors.js.map +1 -0
  54. package/dist/core/hash.d.ts +57 -0
  55. package/dist/core/hash.d.ts.map +1 -0
  56. package/dist/core/hash.js +0 -0
  57. package/dist/core/hash.js.map +1 -0
  58. package/dist/core/package-version.d.ts +9 -0
  59. package/dist/core/package-version.d.ts.map +1 -0
  60. package/dist/core/package-version.js +44 -0
  61. package/dist/core/package-version.js.map +1 -0
  62. package/dist/core/paths.d.ts +46 -0
  63. package/dist/core/paths.d.ts.map +1 -0
  64. package/dist/core/paths.js +105 -0
  65. package/dist/core/paths.js.map +1 -0
  66. package/dist/core/registry.d.ts +24 -0
  67. package/dist/core/registry.d.ts.map +1 -0
  68. package/dist/core/registry.js +72 -0
  69. package/dist/core/registry.js.map +1 -0
  70. package/dist/core/types.d.ts +78 -0
  71. package/dist/core/types.d.ts.map +1 -0
  72. package/dist/core/types.js +11 -0
  73. package/dist/core/types.js.map +1 -0
  74. package/dist/dsl/architecture.d.ts +15 -0
  75. package/dist/dsl/architecture.d.ts.map +1 -0
  76. package/dist/dsl/architecture.js +242 -0
  77. package/dist/dsl/architecture.js.map +1 -0
  78. package/dist/dsl/catalog.d.ts +62 -0
  79. package/dist/dsl/catalog.d.ts.map +1 -0
  80. package/dist/dsl/catalog.en.d.ts +18 -0
  81. package/dist/dsl/catalog.en.d.ts.map +1 -0
  82. package/dist/dsl/catalog.en.js +299 -0
  83. package/dist/dsl/catalog.en.js.map +1 -0
  84. package/dist/dsl/catalog.js +1082 -0
  85. package/dist/dsl/catalog.js.map +1 -0
  86. package/dist/dsl/chart.d.ts +14 -0
  87. package/dist/dsl/chart.d.ts.map +1 -0
  88. package/dist/dsl/chart.js +435 -0
  89. package/dist/dsl/chart.js.map +1 -0
  90. package/dist/dsl/compile.d.ts +31 -0
  91. package/dist/dsl/compile.d.ts.map +1 -0
  92. package/dist/dsl/compile.js +120 -0
  93. package/dist/dsl/compile.js.map +1 -0
  94. package/dist/dsl/diagram-bpmn.d.ts +13 -0
  95. package/dist/dsl/diagram-bpmn.d.ts.map +1 -0
  96. package/dist/dsl/diagram-bpmn.js +215 -0
  97. package/dist/dsl/diagram-bpmn.js.map +1 -0
  98. package/dist/dsl/diagram-product.d.ts +15 -0
  99. package/dist/dsl/diagram-product.d.ts.map +1 -0
  100. package/dist/dsl/diagram-product.js +291 -0
  101. package/dist/dsl/diagram-product.js.map +1 -0
  102. package/dist/dsl/diagram-technical.d.ts +28 -0
  103. package/dist/dsl/diagram-technical.d.ts.map +1 -0
  104. package/dist/dsl/diagram-technical.js +365 -0
  105. package/dist/dsl/diagram-technical.js.map +1 -0
  106. package/dist/dsl/diagram.d.ts +22 -0
  107. package/dist/dsl/diagram.d.ts.map +1 -0
  108. package/dist/dsl/diagram.js +542 -0
  109. package/dist/dsl/diagram.js.map +1 -0
  110. package/dist/dsl/fallbacks-d2.d.ts +27 -0
  111. package/dist/dsl/fallbacks-d2.d.ts.map +1 -0
  112. package/dist/dsl/fallbacks-d2.js +265 -0
  113. package/dist/dsl/fallbacks-d2.js.map +1 -0
  114. package/dist/dsl/fallbacks.d.ts +25 -0
  115. package/dist/dsl/fallbacks.d.ts.map +1 -0
  116. package/dist/dsl/fallbacks.js +264 -0
  117. package/dist/dsl/fallbacks.js.map +1 -0
  118. package/dist/dsl/fields.d.ts +93 -0
  119. package/dist/dsl/fields.d.ts.map +1 -0
  120. package/dist/dsl/fields.js +233 -0
  121. package/dist/dsl/fields.js.map +1 -0
  122. package/dist/dsl/index.d.ts +50 -0
  123. package/dist/dsl/index.d.ts.map +1 -0
  124. package/dist/dsl/index.js +114 -0
  125. package/dist/dsl/index.js.map +1 -0
  126. package/dist/dsl/util.d.ts +105 -0
  127. package/dist/dsl/util.d.ts.map +1 -0
  128. package/dist/dsl/util.js +261 -0
  129. package/dist/dsl/util.js.map +1 -0
  130. package/dist/index.d.ts +27 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +21 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/markdown/scan.d.ts +73 -0
  135. package/dist/markdown/scan.d.ts.map +1 -0
  136. package/dist/markdown/scan.js +150 -0
  137. package/dist/markdown/scan.js.map +1 -0
  138. package/dist/markdown/transform.d.ts +28 -0
  139. package/dist/markdown/transform.d.ts.map +1 -0
  140. package/dist/markdown/transform.js +38 -0
  141. package/dist/markdown/transform.js.map +1 -0
  142. package/dist/mcp/server.d.ts +18 -0
  143. package/dist/mcp/server.d.ts.map +1 -0
  144. package/dist/mcp/server.js +118 -0
  145. package/dist/mcp/server.js.map +1 -0
  146. package/dist/mcp/tools.d.ts +118 -0
  147. package/dist/mcp/tools.d.ts.map +1 -0
  148. package/dist/mcp/tools.js +573 -0
  149. package/dist/mcp/tools.js.map +1 -0
  150. package/dist/renderers/base.d.ts +18 -0
  151. package/dist/renderers/base.d.ts.map +1 -0
  152. package/dist/renderers/base.js +59 -0
  153. package/dist/renderers/base.js.map +1 -0
  154. package/dist/renderers/bpmn.d.ts +68 -0
  155. package/dist/renderers/bpmn.d.ts.map +1 -0
  156. package/dist/renderers/bpmn.js +158 -0
  157. package/dist/renderers/bpmn.js.map +1 -0
  158. package/dist/renderers/browser.d.ts +30 -0
  159. package/dist/renderers/browser.d.ts.map +1 -0
  160. package/dist/renderers/browser.js +143 -0
  161. package/dist/renderers/browser.js.map +1 -0
  162. package/dist/renderers/color-scheme.d.ts +40 -0
  163. package/dist/renderers/color-scheme.d.ts.map +1 -0
  164. package/dist/renderers/color-scheme.js +122 -0
  165. package/dist/renderers/color-scheme.js.map +1 -0
  166. package/dist/renderers/d2.d.ts +37 -0
  167. package/dist/renderers/d2.d.ts.map +1 -0
  168. package/dist/renderers/d2.js +108 -0
  169. package/dist/renderers/d2.js.map +1 -0
  170. package/dist/renderers/graphviz.d.ts +33 -0
  171. package/dist/renderers/graphviz.d.ts.map +1 -0
  172. package/dist/renderers/graphviz.js +88 -0
  173. package/dist/renderers/graphviz.js.map +1 -0
  174. package/dist/renderers/in-page.d.ts +33 -0
  175. package/dist/renderers/in-page.d.ts.map +1 -0
  176. package/dist/renderers/in-page.js +76 -0
  177. package/dist/renderers/in-page.js.map +1 -0
  178. package/dist/renderers/index.d.ts +20 -0
  179. package/dist/renderers/index.d.ts.map +1 -0
  180. package/dist/renderers/index.js +94 -0
  181. package/dist/renderers/index.js.map +1 -0
  182. package/dist/renderers/kroki.d.ts +38 -0
  183. package/dist/renderers/kroki.d.ts.map +1 -0
  184. package/dist/renderers/kroki.js +151 -0
  185. package/dist/renderers/kroki.js.map +1 -0
  186. package/dist/renderers/likec4-svg.d.ts +82 -0
  187. package/dist/renderers/likec4-svg.d.ts.map +1 -0
  188. package/dist/renderers/likec4-svg.js +435 -0
  189. package/dist/renderers/likec4-svg.js.map +1 -0
  190. package/dist/renderers/likec4.d.ts +22 -0
  191. package/dist/renderers/likec4.d.ts.map +1 -0
  192. package/dist/renderers/likec4.js +77 -0
  193. package/dist/renderers/likec4.js.map +1 -0
  194. package/dist/renderers/mermaid.d.ts +64 -0
  195. package/dist/renderers/mermaid.d.ts.map +1 -0
  196. package/dist/renderers/mermaid.js +196 -0
  197. package/dist/renderers/mermaid.js.map +1 -0
  198. package/dist/renderers/plantuml.d.ts +56 -0
  199. package/dist/renderers/plantuml.d.ts.map +1 -0
  200. package/dist/renderers/plantuml.js +195 -0
  201. package/dist/renderers/plantuml.js.map +1 -0
  202. package/dist/renderers/svg-utils.d.ts +46 -0
  203. package/dist/renderers/svg-utils.d.ts.map +1 -0
  204. package/dist/renderers/svg-utils.js +439 -0
  205. package/dist/renderers/svg-utils.js.map +1 -0
  206. package/dist/renderers/svgbob.d.ts +26 -0
  207. package/dist/renderers/svgbob.d.ts.map +1 -0
  208. package/dist/renderers/svgbob.js +70 -0
  209. package/dist/renderers/svgbob.js.map +1 -0
  210. package/dist/renderers/vega-lite.d.ts +18 -0
  211. package/dist/renderers/vega-lite.d.ts.map +1 -0
  212. package/dist/renderers/vega-lite.js +94 -0
  213. package/dist/renderers/vega-lite.js.map +1 -0
  214. package/dist/themes/index.d.ts +17 -0
  215. package/dist/themes/index.d.ts.map +1 -0
  216. package/dist/themes/index.js +419 -0
  217. package/dist/themes/index.js.map +1 -0
  218. package/dist/themes/types.d.ts +99 -0
  219. package/dist/themes/types.d.ts.map +1 -0
  220. package/dist/themes/types.js +9 -0
  221. package/dist/themes/types.js.map +1 -0
  222. package/eval/casos.json +513 -0
  223. package/package.json +114 -0
  224. package/scripts/capture-preview.mjs +101 -0
  225. package/scripts/check-github.mjs +128 -0
  226. package/scripts/eval.d.mts +8 -0
  227. package/scripts/eval.mjs +284 -0
  228. package/scripts/fetch-plantuml.mjs +122 -0
  229. package/scripts/generate-catalog-doc.mjs +106 -0
  230. package/scripts/rasterize.mjs +68 -0
  231. package/scripts/sync-docs.mjs +158 -0
  232. package/skills/docviz/SKILL.md +111 -0
  233. 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":"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"}
@@ -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) &middot; ${assets} recurso(s) generado(s) &middot; 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="/">&larr; indice</a> &middot; <code>${escapeHtml(relative)}</code> &middot; <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(/^&lt;|&gt;$/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, '&amp;')
237
+ .replace(/</g, '&lt;')
238
+ .replace(/>/g, '&gt;')
239
+ .replace(/"/g, '&quot;');
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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,IAAI,GAAqC;IAC7C,OAAO,EAAE,0BAA0B;IACnC,KAAK,EAAE,8BAA8B;IACrC,MAAM,EAAE,eAAe;IACvB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,yBAAyB;IACjC,KAAK,EAAE,gCAAgC;IACvC,OAAO,EAAE,iCAAiC;CAC3C,CAAC;AAQF,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,IAAI,GAAG,IAAI;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACrC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;YACpE,GAAG,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC/D,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;YACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,OAAO,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,EAAE,oBAAoB,UAAU,GAAG;QACtC,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;KAC3E,CAAC;AACJ,CAAC;AAED,sDAAsD;AACtD,SAAS,KAAK,CAAC,IAAY,EAAE,MAAc;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,GAAyB,EAAE,GAAwB;IACrF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEjD,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACnE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACd,OAAO;IACT,CAAC;IAED,mDAAmD;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QACxB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,uEAAuE;IACvE,6EAA6E;IAC7E,iDAAiD;IACjD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;QACtC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;QACpE,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACnE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,0BAA0B;QACvD,gBAAgB,EAAE,IAAI,CAAC,IAAI;KAC5B,CAAC,CAAC;IACH,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SAC3C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;SAC3D,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,IAAI,CACT,2BAA2B,EAC3B;uBACmB,KAAK,CAAC,MAAM,0BAA0B,MAAM,+CAA+C,UAAU,CAAC,IAAI,CAAC;wBAC1G,KAAK,OAAO,CACjC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CAAC,QAAgB,EAAE,QAAgB;IACtD,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,IAAI,CACT,QAAQ,EACR,gEAAgE,UAAU,CAAC,QAAQ,CAAC;gBACxE,IAAI,YAAY,CAC7B,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,QAAiC,CAAC;IAEtC,MAAM,SAAS,GAAG,GAAS,EAAE;QAC3B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC;YAC3B,QAAQ,GAAG,SAAS,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,GAAS,EAAE;QAC5B,IAAI,OAAO,EAAE,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC7B,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YACnD,MAAM,GAAG,CAAC,MAAM,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QAED,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACvE,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS;YACtC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS,EAAE,CAAC;gBACZ,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBAC/B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7D,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBACjC,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YAC7E,CAAC;YACD,SAAS;QACX,CAAC;QACD,UAAU,EAAE,CAAC;QAEb,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7C,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACxB,SAAS,EAAE,CAAC;gBACZ,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;gBACxB,QAAQ,GAAG,MAAM,CAAC;YACpB,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,IAAI,QAAQ,CAAE,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,SAAS,EAAE,CAAC;QAEZ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjB,SAAS;QACX,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,IAAI,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,6BAA6B,EAAE,CAAC,EAAE,EAAE,GAAW,EAAE,GAAW,EAAE,EAAE;QAChF,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,qBAAqB,KAAK,UAAU,GAAG,gCAAgC,GAAG,wBAAwB,CAAC;IAC5G,CAAC,CAAC,CAAC;IACH,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,4BAA4B,EAAE,qBAAqB,CAAC,CAAC;IACvE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACnD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,CAAC;IAC7D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,IAAY;IACvC,OAAO;;;;;SAKA,UAAU,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;QA2BlB,IAAI;QACJ,CAAC;AACT,CAAC"}
@@ -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"}