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,1082 @@
1
+ /**
2
+ * Catalogo de tipos del DSL.
3
+ *
4
+ * Es la fuente unica de verdad: que motor atiende cada intencion, con que
5
+ * alternativa si ese motor no esta disponible, para que sirve y cuando NO
6
+ * conviene usarlo.
7
+ *
8
+ * Los tres ultimos campos no son documentacion decorativa. El consumidor
9
+ * habitual del catalogo es un modelo de lenguaje decidiendo como explicar algo:
10
+ * "cuando no usarlo" evita la mitad de los errores, y un esqueleto minimo evita
11
+ * la otra mitad.
12
+ */
13
+ import { CATALOG_EN } from './catalog.en.js';
14
+ const t = (spec) => spec;
15
+ // --------------------------------------------------------------------------
16
+ // diagram — UML y comportamiento (PlantUML)
17
+ // --------------------------------------------------------------------------
18
+ const UML = [
19
+ t({
20
+ type: 'sequence',
21
+ lang: 'diagram',
22
+ engine: 'plantuml',
23
+ fallbacks: ['d2'],
24
+ aliases: ['uml-sequence'],
25
+ purpose: 'Quien habla con quien y en que orden.',
26
+ whenToUse: 'Para explicar una interaccion entre componentes a lo largo del tiempo: un login, un pago, una llamada entre servicios.',
27
+ whenNotToUse: 'Si el orden temporal no importa; entonces es un diagrama de componentes o de dependencias.',
28
+ keywords: ['interaccion', 'interactuan', 'mensajes', 'llamadas', 'protocolo', 'login', 'api', 'temporal', 'orden', 'frontend', 'backend', 'servicio', 'interaction', 'messages', 'calls', 'protocol', 'login', 'api', 'over time', 'order', 'who calls whom', 'request flow'],
29
+ example: [
30
+ 'type: sequence',
31
+ 'title: Autenticacion',
32
+ 'participants:',
33
+ ' - Usuario',
34
+ ' - API',
35
+ 'flow:',
36
+ ' - Usuario -> API: Login',
37
+ ' - API --> Usuario: Token',
38
+ ].join('\n'),
39
+ }),
40
+ t({
41
+ type: 'class',
42
+ lang: 'diagram',
43
+ engine: 'plantuml',
44
+ fallbacks: ['d2'],
45
+ aliases: ['uml-class'],
46
+ purpose: 'Estructura de clases o entidades y sus relaciones.',
47
+ whenToUse: 'Para el modelo de dominio de un sistema orientado a objetos, con atributos, metodos y herencia.',
48
+ whenNotToUse: 'Si lo que describes son tablas y claves foraneas: usa `erd`.',
49
+ keywords: ['clases', 'dominio', 'herencia', 'objetos', 'modelo', 'atributos', 'metodos', 'classes', 'domain', 'inheritance', 'objects', 'attributes', 'methods', 'oop'],
50
+ example: [
51
+ 'type: class',
52
+ 'title: Modelo de dominio',
53
+ 'classes:',
54
+ ' - name: Pedido',
55
+ ' attributes: [id, total]',
56
+ ' methods: [confirmar]',
57
+ ' - name: Linea',
58
+ 'relations:',
59
+ ' - from: Pedido',
60
+ ' to: Linea',
61
+ ' type: composition',
62
+ ].join('\n'),
63
+ }),
64
+ t({
65
+ type: 'state',
66
+ lang: 'diagram',
67
+ engine: 'plantuml',
68
+ fallbacks: ['d2'],
69
+ aliases: ['uml-state'],
70
+ purpose: 'Estados de una entidad y las transiciones entre ellos.',
71
+ whenToUse: 'Cuando algo tiene un ciclo de vida: un pedido, una solicitud, un despliegue.',
72
+ whenNotToUse: 'Si el proceso es una secuencia de tareas sin estados propios: usa `activity` o `flow`.',
73
+ keywords: ['estados', 'ciclo de vida', 'transiciones', 'maquina de estados', 'flujo de estado', 'states', 'lifecycle', 'transitions', 'state machine', 'status changes'],
74
+ example: [
75
+ 'type: state',
76
+ 'title: Ciclo de vida',
77
+ 'states: [Borrador, Publicado]',
78
+ 'initial: Borrador',
79
+ 'transitions:',
80
+ ' - Borrador -> Publicado: publicar',
81
+ 'finals: [Publicado]',
82
+ ].join('\n'),
83
+ }),
84
+ t({
85
+ type: 'activity',
86
+ lang: 'diagram',
87
+ engine: 'plantuml',
88
+ aliases: ['uml-activity'],
89
+ purpose: 'Proceso con decisiones y ramas paralelas.',
90
+ whenToUse: 'Cuando hay condiciones que bifurcan el camino: validaciones, aprobaciones, reintentos.',
91
+ whenNotToUse: 'Si el proceso es lineal y sencillo: `flow` queda mas limpio. Si es un proceso de negocio con roles: `bpmn`.',
92
+ keywords: ['proceso', 'decision', 'condicion', 'if', 'bifurcacion', 'paralelo', 'algoritmo', 'process', 'decisions', 'branches', 'parallel', 'swimlane', 'approval', 'workflow'],
93
+ example: [
94
+ 'type: activity',
95
+ 'title: Validacion',
96
+ 'flow:',
97
+ ' - Recibir solicitud',
98
+ ' - decision: Es valida?',
99
+ ' yes:',
100
+ ' - Procesar',
101
+ ' no:',
102
+ ' - Rechazar',
103
+ ].join('\n'),
104
+ }),
105
+ t({
106
+ type: 'erd',
107
+ lang: 'diagram',
108
+ engine: 'plantuml',
109
+ fallbacks: ['mermaid'],
110
+ aliases: ['entity-relationship', 'entidad-relacion'],
111
+ purpose: 'Entidades de datos, sus campos y su cardinalidad.',
112
+ whenToUse: 'Para documentar un modelo de datos relacional: tablas, claves y cardinalidades.',
113
+ whenNotToUse: 'Si el foco es el comportamiento y no los datos: usa `class`.',
114
+ keywords: ['datos', 'tablas', 'entidades', 'base de datos', 'cardinalidad', 'clave', 'sql', 'modelo de datos', 'entities', 'database', 'tables', 'fields', 'cardinality', 'data model', 'relational'],
115
+ example: [
116
+ 'type: erd',
117
+ 'title: Modelo de datos',
118
+ 'entities:',
119
+ ' - name: Pedido',
120
+ ' fields:',
121
+ ' - name: id',
122
+ ' type: uuid',
123
+ ' key: true',
124
+ ' - name: total',
125
+ ' type: decimal',
126
+ ' - name: Linea',
127
+ ' fields:',
128
+ ' - name: id',
129
+ ' type: uuid',
130
+ ' key: true',
131
+ 'relations:',
132
+ ' - from: Pedido',
133
+ ' to: Linea',
134
+ ' cardinality: one-to-many',
135
+ ' label: contiene',
136
+ ].join('\n'),
137
+ }),
138
+ t({
139
+ type: 'use-case',
140
+ lang: 'diagram',
141
+ engine: 'plantuml',
142
+ fallbacks: ['d2'],
143
+ aliases: ['casos-de-uso'],
144
+ purpose: 'Que puede hacer cada actor con el sistema.',
145
+ whenToUse: 'Para delimitar el alcance funcional frente a usuarios y sistemas externos.',
146
+ whenNotToUse: 'Si necesitas detallar como ocurre cada caso: eso es `sequence` o `activity`.',
147
+ keywords: ['casos de uso', 'actores', 'alcance', 'funcionalidad', 'requisitos', 'actors', 'roles', 'what each user can do', 'capabilities', 'use cases'],
148
+ example: [
149
+ 'type: use-case',
150
+ 'title: Alcance del portal',
151
+ 'system: Portal de pagos',
152
+ 'actors:',
153
+ ' - Cliente',
154
+ ' - Operador',
155
+ 'useCases:',
156
+ ' - name: Realizar pago',
157
+ ' actors: [Cliente]',
158
+ ' - name: Conciliar',
159
+ ' actors: [Operador]',
160
+ ].join('\n'),
161
+ }),
162
+ t({
163
+ type: 'component',
164
+ lang: 'diagram',
165
+ engine: 'plantuml',
166
+ fallbacks: ['d2'],
167
+ aliases: ['componentes'],
168
+ purpose: 'Componentes de software agrupados y como se conectan.',
169
+ whenToUse: 'Para la estructura interna de una aplicacion cuando C4 resulta excesivo.',
170
+ whenNotToUse: 'Si describes el sistema completo y su entorno: usa `c4-context` o `c4-container`.',
171
+ keywords: ['componentes', 'modulos', 'paquetes', 'estructura', 'interfaces', 'software components', 'modules', 'internal structure', 'wiring', 'packages'],
172
+ example: [
173
+ 'type: component',
174
+ 'title: Componentes',
175
+ 'groups:',
176
+ ' - name: Frontend',
177
+ ' components: [UI]',
178
+ ' - name: Backend',
179
+ ' components: [API, Servicio]',
180
+ 'relations:',
181
+ ' - UI -> API',
182
+ ' - API -> Servicio',
183
+ ].join('\n'),
184
+ }),
185
+ t({
186
+ type: 'deployment',
187
+ lang: 'diagram',
188
+ engine: 'plantuml',
189
+ fallbacks: ['d2'],
190
+ aliases: ['despliegue'],
191
+ purpose: 'Donde se ejecuta cada pieza y sobre que infraestructura.',
192
+ whenToUse: 'Para documentar nodos, contenedores, artefactos y las bases de datos de un entorno.',
193
+ whenNotToUse: 'Si el interes es la responsabilidad logica y no la maquina: usa `component` o C4.',
194
+ keywords: ['despliegue', 'infraestructura', 'servidores', 'nodos', 'entorno', 'produccion', 'contenedores', 'infrastructure', 'servers', 'nodes', 'runtime', 'where it runs', 'topology'],
195
+ example: [
196
+ 'type: deployment',
197
+ 'title: Entorno de produccion',
198
+ 'nodes:',
199
+ ' - name: Servidor web',
200
+ ' kind: node',
201
+ ' contains: [app.jar]',
202
+ ' - name: PostgreSQL',
203
+ ' kind: database',
204
+ 'relations:',
205
+ ' - Servidor web -> PostgreSQL: JDBC',
206
+ ].join('\n'),
207
+ }),
208
+ t({
209
+ type: 'wireframe',
210
+ lang: 'diagram',
211
+ engine: 'plantuml',
212
+ aliases: ['mockup', 'ui'],
213
+ purpose: 'Boceto de una pantalla: campos, botones y disposicion.',
214
+ whenToUse: 'Para acordar una interfaz sin abrir una herramienta de diseno, dentro del propio documento.',
215
+ whenNotToUse: 'Si necesitas fidelidad visual real; esto es un boceto, no un diseno.',
216
+ keywords: ['pantalla', 'formulario', 'interfaz', 'mockup', 'boceto', 'ui', 'campos', 'boton', 'screen', 'mockup', 'ui sketch', 'form', 'buttons', 'layout'],
217
+ example: [
218
+ 'type: wireframe',
219
+ 'title: Inicio de sesion',
220
+ 'rows:',
221
+ ' - fields:',
222
+ ' - label: Usuario',
223
+ ' input: text',
224
+ ' - fields:',
225
+ ' - label: Clave',
226
+ ' input: password',
227
+ ' - buttons: [Cancelar, Entrar]',
228
+ ].join('\n'),
229
+ }),
230
+ t({
231
+ type: 'json',
232
+ lang: 'diagram',
233
+ engine: 'plantuml',
234
+ purpose: 'Estructura de un JSON dibujada como arbol.',
235
+ whenToUse: 'Para documentar el cuerpo de una peticion o respuesta de API de un vistazo.',
236
+ whenNotToUse: 'Si el JSON es corto: un bloque de codigo se lee mejor y se puede copiar.',
237
+ keywords: ['json', 'payload', 'respuesta', 'peticion', 'estructura', 'contrato', 'cuerpo', 'json structure', 'payload', 'response shape', 'tree of json'],
238
+ example: ['type: json', 'title: Respuesta de /pedidos', 'data:', ' id: 1', ' estado: confirmado'].join('\n'),
239
+ }),
240
+ t({
241
+ type: 'yaml',
242
+ lang: 'diagram',
243
+ engine: 'plantuml',
244
+ purpose: 'Estructura de un YAML dibujada como arbol.',
245
+ whenToUse: 'Para explicar un manifiesto o una configuracion extensa por su forma.',
246
+ whenNotToUse: 'Si el archivo es corto o el lector va a copiarlo: usa un bloque de codigo.',
247
+ keywords: ['yaml', 'configuracion', 'manifiesto', 'kubernetes', 'helm', 'valores', 'yaml structure', 'config tree', 'manifest'],
248
+ example: ['type: yaml', 'title: Configuracion', 'data:', ' replicas: 3', ' puertos:', ' - 8080'].join('\n'),
249
+ }),
250
+ t({
251
+ type: 'wbs',
252
+ lang: 'diagram',
253
+ engine: 'plantuml',
254
+ fallbacks: ['d2'],
255
+ aliases: ['work-breakdown'],
256
+ purpose: 'Descomposicion jerarquica del trabajo de un proyecto.',
257
+ whenToUse: 'Para desglosar un alcance en entregables y paquetes de trabajo.',
258
+ whenNotToUse: 'Si lo que importa son las fechas: usa `gantt`. Si es un analisis causal: `issue-tree`.',
259
+ keywords: ['wbs', 'edt', 'alcance', 'entregables', 'descomposicion', 'proyecto', 'paquetes', 'work breakdown', 'project decomposition', 'tasks', 'deliverables'],
260
+ example: [
261
+ 'type: wbs',
262
+ 'title: Alcance del proyecto',
263
+ 'root: Portal de pagos',
264
+ 'branches:',
265
+ ' - name: Analisis',
266
+ ' children: [Requisitos, Casos de prueba]',
267
+ ' - name: Construccion',
268
+ ].join('\n'),
269
+ }),
270
+ ];
271
+ // --------------------------------------------------------------------------
272
+ // diagram — flujos, tiempo y producto (Mermaid)
273
+ // --------------------------------------------------------------------------
274
+ const FLOW_AND_PRODUCT = [
275
+ t({
276
+ type: 'flow',
277
+ lang: 'diagram',
278
+ engine: 'mermaid',
279
+ fallbacks: ['d2'],
280
+ aliases: ['flowchart'],
281
+ purpose: 'Flujo sencillo de extremo a extremo.',
282
+ whenToUse: 'Para encadenar pasos o componentes cuando basta con ver por donde pasa la cosa.',
283
+ whenNotToUse: 'Si hay muchas condiciones: `activity`. Si es una interaccion temporal: `sequence`.',
284
+ keywords: ['flujo', 'pasos', 'pipeline', 'proceso simple', 'cadena', 'etapas', 'flowchart', 'end to end', 'steps', 'simple process', 'pipeline'],
285
+ example: ['type: flow', 'title: Publicacion', 'direction: lr', 'flow:', ' - Autor -> Revision', ' - Revision -> Portal'].join('\n'),
286
+ }),
287
+ t({
288
+ type: 'gantt',
289
+ lang: 'diagram',
290
+ engine: 'mermaid',
291
+ fallbacks: ['plantuml'],
292
+ aliases: ['cronograma'],
293
+ purpose: 'Tareas situadas en el calendario.',
294
+ whenToUse: 'Para un plan con fechas y dependencias entre tareas.',
295
+ whenNotToUse: 'Si no hay fechas concretas: usa `roadmap` o `timeline`.',
296
+ keywords: ['cronograma', 'plan', 'fechas', 'calendario', 'tareas', 'hitos', 'planificacion', 'schedule', 'calendar', 'dates', 'timeline of tasks', 'project plan'],
297
+ example: [
298
+ 'type: gantt',
299
+ 'title: Plan',
300
+ 'sections:',
301
+ ' - name: Fase 1',
302
+ ' tasks:',
303
+ ' - name: Analisis',
304
+ ' start: 2026-01-05',
305
+ ' duration: 5d',
306
+ ].join('\n'),
307
+ }),
308
+ t({
309
+ type: 'journey',
310
+ lang: 'diagram',
311
+ engine: 'mermaid',
312
+ aliases: ['user-journey', 'recorrido'],
313
+ purpose: 'Recorrido de una persona por un proceso, con su nivel de satisfaccion.',
314
+ whenToUse: 'Para mostrar donde sufre el usuario y quien interviene en cada paso.',
315
+ whenNotToUse: 'Si el interes es tecnico y no la experiencia: usa `flow` o `sequence`.',
316
+ keywords: ['experiencia', 'usuario', 'recorrido', 'satisfaccion', 'ux', 'viaje', 'cliente', 'customer journey', 'user journey', 'satisfaction', 'experience', 'touchpoints'],
317
+ example: [
318
+ 'type: journey',
319
+ 'title: Alta de cliente',
320
+ 'sections:',
321
+ ' - name: Registro',
322
+ ' steps:',
323
+ ' - name: Rellenar formulario',
324
+ ' score: 3',
325
+ ' actors: [Cliente]',
326
+ ' - name: Verificar correo',
327
+ ' score: 2',
328
+ ' actors: [Cliente]',
329
+ ' - name: Activacion',
330
+ ' steps:',
331
+ ' - name: Aprobar cuenta',
332
+ ' score: 4',
333
+ ' actors: [Operador]',
334
+ ' - name: Primer acceso',
335
+ ' score: 5',
336
+ ' actors: [Cliente]',
337
+ ].join('\n'),
338
+ }),
339
+ t({
340
+ type: 'git-graph',
341
+ lang: 'diagram',
342
+ engine: 'mermaid',
343
+ aliases: ['gitgraph', 'commit-graph', 'ramas'],
344
+ purpose: 'Historia de ramas, commits y fusiones.',
345
+ whenToUse: 'Para explicar la estrategia de ramificacion del equipo.',
346
+ whenNotToUse: 'Si lo que documentas es el proceso de revision, no la topologia: usa `flow`.',
347
+ keywords: ['git', 'ramas', 'branch', 'merge', 'commits', 'gitflow', 'versionado', 'branches', 'commits', 'merges', 'git history', 'release branches'],
348
+ example: [
349
+ 'type: git-graph',
350
+ 'title: Estrategia de ramas',
351
+ 'commits:',
352
+ ' - commit: inicial',
353
+ ' - branch: develop',
354
+ ' - commit: funcionalidad',
355
+ ' - checkout: main',
356
+ ' - merge: develop',
357
+ ].join('\n'),
358
+ }),
359
+ t({
360
+ type: 'kanban',
361
+ lang: 'diagram',
362
+ engine: 'mermaid',
363
+ aliases: ['tablero'],
364
+ purpose: 'Tarjetas repartidas por columna de estado.',
365
+ whenToUse: 'Para fotografiar el estado de un tablero en un informe.',
366
+ whenNotToUse: 'Si el tablero cambia a diario: enlaza la herramienta en vez de congelarlo.',
367
+ keywords: ['tablero', 'kanban', 'columnas', 'sprint', 'estado', 'tarjetas', 'board', 'board', 'columns', 'cards', 'work in progress', 'backlog'],
368
+ example: [
369
+ 'type: kanban',
370
+ 'title: Sprint 12',
371
+ 'columns:',
372
+ ' - name: Pendiente',
373
+ ' items: [Analisis de HU-14]',
374
+ ' - name: En curso',
375
+ ' items: [Diseno de API]',
376
+ ].join('\n'),
377
+ }),
378
+ t({
379
+ type: 'quadrant',
380
+ lang: 'diagram',
381
+ engine: 'mermaid',
382
+ aliases: ['quadrant-chart'],
383
+ purpose: 'Elementos situados en dos ejes continuos.',
384
+ whenToUse: 'Para priorizar con datos: cada elemento tiene una posicion concreta, no solo un cuadrante.',
385
+ whenNotToUse: 'Si solo quieres nombrar los cuatro cuadrantes sin situar nada: usa `matrix-2x2`.',
386
+ keywords: ['priorizacion', 'esfuerzo', 'impacto', 'cuadrantes', 'matriz', 'valor', 'riesgo', 'two axes', 'effort impact', 'prioritization', 'positioning', 'scatter of options'],
387
+ example: [
388
+ 'type: quadrant',
389
+ 'title: Priorizacion',
390
+ 'xAxis: [Bajo esfuerzo, Alto esfuerzo]',
391
+ 'yAxis: [Bajo impacto, Alto impacto]',
392
+ 'quadrants: [Hacer ya, Planificar, Descartar, Delegar]',
393
+ 'items:',
394
+ ' - name: Automatizar pruebas',
395
+ ' x: 0.3',
396
+ ' y: 0.8',
397
+ ].join('\n'),
398
+ }),
399
+ t({
400
+ type: 'sankey',
401
+ lang: 'diagram',
402
+ engine: 'mermaid',
403
+ purpose: 'Como se reparte una cantidad al pasar de un estado a otro.',
404
+ whenToUse: 'Para mostrar volumenes que se dividen: origen de los defectos, embudo de conversion con fugas.',
405
+ whenNotToUse: 'Si solo comparas totales sin flujo entre ellos: usa `bar`.',
406
+ keywords: ['flujo', 'volumen', 'reparto', 'origen', 'destino', 'sankey', 'derivacion', 'flow of quantity', 'allocation', 'how budget splits', 'energy flow', 'transfers'],
407
+ example: [
408
+ 'type: sankey',
409
+ 'title: Origen de los defectos',
410
+ 'flows:',
411
+ ' - from: Requisitos',
412
+ ' to: Produccion',
413
+ ' value: 12',
414
+ ' - from: Codigo',
415
+ ' to: Produccion',
416
+ ' value: 30',
417
+ ].join('\n'),
418
+ }),
419
+ t({
420
+ type: 'treemap',
421
+ lang: 'diagram',
422
+ engine: 'mermaid',
423
+ purpose: 'Composicion de un total por area proporcional.',
424
+ whenToUse: 'Para ver de un vistazo quien pesa mas dentro de un conjunto jerarquico.',
425
+ whenNotToUse: 'Si comparas pocas categorias sin jerarquia: `bar` es mas preciso de leer.',
426
+ keywords: ['composicion', 'proporcion', 'peso', 'reparto', 'jerarquia', 'tamano', 'esfuerzo', 'proportional area', 'composition by area', 'nested rectangles', 'share of total'],
427
+ example: [
428
+ 'type: treemap',
429
+ 'title: Esfuerzo por modulo',
430
+ 'groups:',
431
+ ' - name: Backend',
432
+ ' items:',
433
+ ' - name: API',
434
+ ' value: 40',
435
+ ' - name: Batch',
436
+ ' value: 20',
437
+ ].join('\n'),
438
+ }),
439
+ t({
440
+ type: 'radar',
441
+ lang: 'diagram',
442
+ engine: 'mermaid',
443
+ aliases: ['spider', 'madurez'],
444
+ purpose: 'Perfil de varias dimensiones a la vez.',
445
+ whenToUse: 'Para evaluaciones de madurez o capacidad, y para comparar dos perfiles.',
446
+ whenNotToUse: 'Con mas de siete ejes o si las dimensiones no son comparables entre si.',
447
+ keywords: ['madurez', 'capacidad', 'evaluacion', 'perfil', 'dimensiones', 'radar', 'assessment', 'spider', 'multiple dimensions', 'profile', 'skills', 'competency'],
448
+ example: [
449
+ 'type: radar',
450
+ 'title: Madurez del equipo',
451
+ 'axes: [Proceso, Calidad, Arquitectura, Automatizacion]',
452
+ 'max: 5',
453
+ 'series:',
454
+ ' - name: Actual',
455
+ ' values: [3, 4, 2, 3]',
456
+ ].join('\n'),
457
+ }),
458
+ t({
459
+ type: 'mindmap',
460
+ lang: 'diagram',
461
+ engine: 'mermaid',
462
+ fallbacks: ['plantuml'],
463
+ aliases: ['mapa-mental'],
464
+ purpose: 'Exploracion de un tema en ramas libres.',
465
+ whenToUse: 'Para abrir un alcance o recoger ideas antes de estructurarlas.',
466
+ whenNotToUse: 'Si la jerarquia ya es firme y dirigida: `strategy-tree` comunica mejor la intencion.',
467
+ keywords: ['ideas', 'lluvia', 'alcance', 'exploracion', 'mapa mental', 'brainstorm', 'brainstorm', 'ideas', 'free branches', 'exploration', 'notes'],
468
+ example: [
469
+ 'type: mindmap',
470
+ 'title: Alcance',
471
+ 'root: Plataforma',
472
+ 'branches:',
473
+ ' - name: Pagos',
474
+ ' children: [Tarjeta, Transferencia]',
475
+ ' - Reportes',
476
+ ].join('\n'),
477
+ }),
478
+ t({
479
+ type: 'block',
480
+ lang: 'diagram',
481
+ engine: 'mermaid',
482
+ aliases: ['bloques'],
483
+ purpose: 'Bloques dispuestos en rejilla, sin semantica de flujo.',
484
+ whenToUse: 'Para capas, bandas o una vista esquematica donde la posicion importa mas que las flechas.',
485
+ whenNotToUse: 'Si hay relaciones que explicar: usa `flow` o `component`.',
486
+ keywords: ['bloques', 'capas', 'rejilla', 'esquema', 'stack', 'disposicion', 'grid', 'blocks', 'layout without flow', 'arrangement'],
487
+ example: [
488
+ 'type: block',
489
+ 'title: Capas',
490
+ 'rows:',
491
+ ' - [Presentacion]',
492
+ ' - [Aplicacion, Dominio]',
493
+ ' - [Infraestructura]',
494
+ ].join('\n'),
495
+ }),
496
+ ];
497
+ // --------------------------------------------------------------------------
498
+ // diagram — ejecutivos (D2) y dependencias (Graphviz)
499
+ // --------------------------------------------------------------------------
500
+ const EXECUTIVE = [
501
+ t({
502
+ type: 'strategy-tree',
503
+ lang: 'diagram',
504
+ engine: 'd2',
505
+ purpose: 'Descomposicion de un objetivo en lineas de accion.',
506
+ whenToUse: 'Para bajar un objetivo a iniciativas concretas ante direccion.',
507
+ whenNotToUse: 'Si exploras causas de un problema: `issue-tree` nombra mejor la intencion.',
508
+ keywords: ['estrategia', 'objetivo', 'iniciativas', 'descomposicion', 'plan', 'lineas de accion', 'objective breakdown', 'goals', 'initiatives', 'okr', 'strategy'],
509
+ example: [
510
+ 'type: strategy-tree',
511
+ 'title: Estrategia de calidad',
512
+ 'root: Reducir defectos',
513
+ 'branches:',
514
+ ' - name: Automatizacion',
515
+ ' children: [Pruebas de regresion]',
516
+ ' - Proceso',
517
+ ].join('\n'),
518
+ }),
519
+ t({
520
+ type: 'issue-tree',
521
+ lang: 'diagram',
522
+ engine: 'd2',
523
+ purpose: 'Descomposicion de un problema en sus causas.',
524
+ whenToUse: 'Para analisis de causa raiz o para estructurar un diagnostico.',
525
+ whenNotToUse: 'Si ya sabes que hacer y solo quieres presentarlo: `strategy-tree`.',
526
+ keywords: ['causa raiz', 'problema', 'analisis', 'diagnostico', 'porque', 'causas', 'root cause', 'problem breakdown', 'why', 'causes', 'mece'],
527
+ example: ['type: issue-tree', 'title: Analisis', 'root: Defectos en produccion', 'branches: [Requisitos, Pruebas]'].join('\n'),
528
+ }),
529
+ t({
530
+ type: 'decision-tree',
531
+ lang: 'diagram',
532
+ engine: 'd2',
533
+ purpose: 'Alternativas de una decision y sus ramas.',
534
+ whenToUse: 'Para presentar opciones excluyentes y a que lleva cada una.',
535
+ whenNotToUse: 'Si la decision ocurre dentro de un proceso: usa `activity`.',
536
+ keywords: ['decision', 'alternativas', 'opciones', 'escenarios', 'eleccion', 'options', 'alternatives', 'decision branches', 'choices'],
537
+ example: ['type: decision-tree', 'title: Decision', 'root: Comprar o construir', 'branches: [Comprar, Construir]'].join('\n'),
538
+ }),
539
+ t({
540
+ type: 'strategy-pillars',
541
+ lang: 'diagram',
542
+ engine: 'd2',
543
+ purpose: 'Pilares que sostienen un objetivo, con su contenido.',
544
+ whenToUse: 'Para una lamina de direccion con tres o cuatro ejes y sus iniciativas.',
545
+ whenNotToUse: 'Si la jerarquia tiene mas de dos niveles: usa `strategy-tree`.',
546
+ keywords: ['pilares', 'ejes', 'estrategia', 'direccion', 'lamina', 'pillars', 'foundations', 'supporting themes'],
547
+ example: [
548
+ 'type: strategy-pillars',
549
+ 'title: Plan anual',
550
+ 'root: Excelencia tecnica',
551
+ 'pillars:',
552
+ ' - name: Personas',
553
+ ' children: [Formacion]',
554
+ ' - Procesos',
555
+ ].join('\n'),
556
+ }),
557
+ t({
558
+ type: 'capability-map',
559
+ lang: 'diagram',
560
+ engine: 'd2',
561
+ purpose: 'Capacidades agrupadas por dominio.',
562
+ whenToUse: 'Para mostrar que sabe hacer una organizacion o un producto, sin hablar de tecnologia.',
563
+ whenNotToUse: 'Si describes componentes de software: usa `component` o C4.',
564
+ keywords: ['capacidades', 'dominios', 'organizacion', 'mapa', 'negocio', 'funciones', 'business capabilities', 'domains', 'capability model'],
565
+ example: [
566
+ 'type: capability-map',
567
+ 'title: Capacidades',
568
+ 'domains:',
569
+ ' - name: Calidad',
570
+ ' capabilities: [Pruebas, Gestion de defectos]',
571
+ ].join('\n'),
572
+ }),
573
+ t({
574
+ type: 'operating-model',
575
+ lang: 'diagram',
576
+ engine: 'd2',
577
+ purpose: 'Capas de un modelo operativo, de negocio a infraestructura.',
578
+ whenToUse: 'Para relacionar niveles: negocio, procesos, aplicaciones, tecnologia.',
579
+ whenNotToUse: 'Si solo hay una capa con elementos sueltos: usa `capability-map`.',
580
+ keywords: ['modelo operativo', 'capas', 'niveles', 'gobierno', 'operacion', 'layers', 'business to infrastructure', 'operating layers', 'stack of the organization'],
581
+ example: [
582
+ 'type: operating-model',
583
+ 'title: Modelo operativo',
584
+ 'layers:',
585
+ ' - name: Negocio',
586
+ ' items: [Ventas]',
587
+ ' - name: Tecnologia',
588
+ ' items: [Plataforma]',
589
+ ].join('\n'),
590
+ }),
591
+ t({
592
+ type: 'value-chain',
593
+ lang: 'diagram',
594
+ engine: 'd2',
595
+ purpose: 'Etapas encadenadas que generan valor.',
596
+ whenToUse: 'Para el recorrido de una actividad de principio a fin, en pasos amplios.',
597
+ whenNotToUse: 'Si hay condiciones o vueltas atras: usa `flow` o `activity`.',
598
+ keywords: ['cadena de valor', 'etapas', 'proceso de negocio', 'extremo a extremo', 'value chain', 'stages', 'end to end value', 'porter'],
599
+ example: ['type: value-chain', 'title: Cadena de valor', 'stages: [Captar, Vender, Entregar, Soportar]'].join('\n'),
600
+ }),
601
+ t({
602
+ type: 'before-after',
603
+ lang: 'diagram',
604
+ engine: 'd2',
605
+ aliases: ['antes-despues'],
606
+ purpose: 'Comparacion de dos escenarios.',
607
+ whenToUse: 'Para justificar un cambio mostrando la situacion actual frente a la propuesta.',
608
+ whenNotToUse: 'Si la comparacion es numerica: usa `bar` o `slope`.',
609
+ keywords: ['antes', 'despues', 'comparacion', 'cambio', 'propuesta', 'situacion actual', 'before and after', 'comparison of two scenarios', 'current vs future', 'as is to be'],
610
+ example: ['type: before-after', 'title: Cambio propuesto', 'before: [Despliegue manual]', 'after: [Pipeline automatico]'].join('\n'),
611
+ }),
612
+ t({
613
+ type: 'matrix-2x2',
614
+ lang: 'diagram',
615
+ engine: 'd2',
616
+ purpose: 'Cuatro cuadrantes con su contenido, sin coordenadas.',
617
+ whenToUse: 'Para clasificar en cuatro grupos cualitativos.',
618
+ whenNotToUse: 'Si cada elemento tiene una posicion medida: usa `quadrant`.',
619
+ keywords: ['matriz', 'cuadrantes', 'clasificacion', 'dos ejes', 'four quadrants', '2x2', 'matrix', 'without coordinates'],
620
+ example: [
621
+ 'type: matrix-2x2',
622
+ 'title: Clasificacion',
623
+ 'axes:',
624
+ ' x: Esfuerzo',
625
+ ' y: Impacto',
626
+ 'quadrants: [Ganar rapido, Estrategico, Descartar, Revisar]',
627
+ ].join('\n'),
628
+ }),
629
+ t({
630
+ type: 'timeline',
631
+ lang: 'diagram',
632
+ engine: 'd2',
633
+ fallbacks: ['mermaid'],
634
+ aliases: ['linea-de-tiempo'],
635
+ purpose: 'Hitos en orden cronologico.',
636
+ whenToUse: 'Para una historia o una sucesion de hitos sin duraciones.',
637
+ whenNotToUse: 'Si hay fechas de inicio y fin por tarea: usa `gantt`.',
638
+ keywords: ['cronologia', 'hitos', 'historia', 'evolucion', 'linea de tiempo', 'milestones', 'chronological', 'history', 'key dates'],
639
+ example: [
640
+ 'type: timeline',
641
+ 'title: Evolucion',
642
+ 'phases:',
643
+ ' - name: 2025',
644
+ ' items: [Piloto]',
645
+ ' - name: 2026',
646
+ ' items: [Despliegue]',
647
+ ].join('\n'),
648
+ }),
649
+ t({
650
+ type: 'roadmap',
651
+ lang: 'diagram',
652
+ engine: 'd2',
653
+ aliases: ['hoja-de-ruta'],
654
+ purpose: 'Fases futuras con su contenido.',
655
+ whenToUse: 'Para comunicar el plan por trimestres o fases sin comprometer fechas exactas.',
656
+ whenNotToUse: 'Si hay compromisos de fecha: usa `gantt`.',
657
+ keywords: ['hoja de ruta', 'roadmap', 'fases', 'trimestres', 'plan', 'futuro', 'phases', 'upcoming', 'plan by phase', 'releases'],
658
+ example: [
659
+ 'type: roadmap',
660
+ 'title: Hoja de ruta',
661
+ 'phases:',
662
+ ' - name: Q1',
663
+ ' items: [Piloto]',
664
+ ' - name: Q2',
665
+ ' items: [Adopcion]',
666
+ ].join('\n'),
667
+ }),
668
+ t({
669
+ type: 'dependency-map',
670
+ lang: 'diagram',
671
+ engine: 'graphviz',
672
+ aliases: ['dependency-graph', 'dependencias'],
673
+ purpose: 'Quien depende de quien.',
674
+ whenToUse: 'Para grafos de dependencia entre modulos, servicios o equipos, incluso con ciclos.',
675
+ whenNotToUse: 'Si el orden temporal importa: usa `sequence`.',
676
+ keywords: ['dependencias', 'acoplamiento', 'grafo', 'modulos', 'servicios', 'impacto', 'dependencies', 'who depends on whom', 'blast radius', 'coupling', 'services graph', 'microservicios', 'microservices', 'que se rompe si cae', 'what breaks if one goes down', 'impacto de una caida'],
677
+ example: ['type: dependency-map', 'title: Dependencias', 'dependencies:', ' - api -> base de datos', ' - web -> api'].join('\n'),
678
+ }),
679
+ ];
680
+ // --------------------------------------------------------------------------
681
+ // diagram — proceso de negocio y esquemas libres
682
+ // --------------------------------------------------------------------------
683
+ const SPECIAL = [
684
+ t({
685
+ type: 'bpmn',
686
+ lang: 'diagram',
687
+ engine: 'bpmn',
688
+ aliases: ['proceso-de-negocio'],
689
+ purpose: 'Proceso de negocio en notacion BPMN estandar.',
690
+ whenToUse: 'Cuando el documento va a manos de negocio o auditoria y la notacion estandar importa.',
691
+ whenNotToUse: 'Para un proceso tecnico interno: `activity` o `flow` son mas breves. Aun no admite carriles por rol.',
692
+ keywords: ['bpmn', 'proceso de negocio', 'carriles', 'roles', 'aprobacion', 'auditoria', 'compuerta', 'business process', 'bpmn notation', 'lanes', 'standard notation'],
693
+ example: [
694
+ 'type: bpmn',
695
+ 'title: Aprobacion de solicitud',
696
+ 'flow:',
697
+ ' - start: Solicitud recibida',
698
+ ' - task: Revisar',
699
+ ' - gateway: Aprobada?',
700
+ ' yes:',
701
+ ' - task: Notificar aprobacion',
702
+ ' - end: Aprobada',
703
+ ' no:',
704
+ ' - end: Rechazada',
705
+ ].join('\n'),
706
+ }),
707
+ t({
708
+ type: 'ascii',
709
+ lang: 'diagram',
710
+ engine: 'svgbob',
711
+ aliases: ['ascii-art', 'sketch'],
712
+ purpose: 'Dibujo hecho con caracteres, convertido a SVG limpio.',
713
+ whenToUse: 'Cuando ya tienes un esquema en arte ASCII —de un RFC, de un README— y quieres publicarlo legible.',
714
+ whenNotToUse: 'Para un diagrama nuevo: cualquier tipo declarativo se mantiene mejor.',
715
+ keywords: ['ascii', 'arte', 'esquema', 'rfc', 'texto', 'boceto', 'goat', 'svgbob', 'ascii art', 'text drawing', 'characters', 'sketch in text'],
716
+ example: [
717
+ 'type: ascii',
718
+ 'title: Esquema',
719
+ 'art: |',
720
+ ' .-------. .------.',
721
+ ' | Front +----->| API |',
722
+ " '-------' '------'",
723
+ ].join('\n'),
724
+ }),
725
+ ];
726
+ // --------------------------------------------------------------------------
727
+ // chart (Vega-Lite)
728
+ // --------------------------------------------------------------------------
729
+ const CHARTS = [
730
+ t({
731
+ type: 'bar',
732
+ lang: 'chart',
733
+ engine: 'vega-lite',
734
+ aliases: ['column'],
735
+ purpose: 'Comparacion entre categorias.',
736
+ whenToUse: 'Cuando cada barra es una categoria y quieres compararlas.',
737
+ whenNotToUse: 'Si el eje es el tiempo y hay muchos puntos: usa `line`.',
738
+ keywords: ['comparar', 'categorias', 'barras', 'cantidad', 'ranking', 'defectos', 'total', 'compare categories', 'bar chart', 'column chart', 'ranking by value'],
739
+ example: ['type: bar', 'title: Defectos por sprint', 'data:', ' - label: SP1', ' value: 42'].join('\n'),
740
+ }),
741
+ t({
742
+ type: 'horizontal-bar',
743
+ lang: 'chart',
744
+ engine: 'vega-lite',
745
+ purpose: 'Comparacion entre categorias con etiquetas largas.',
746
+ whenToUse: 'Cuando los nombres no caben bajo barras verticales.',
747
+ whenNotToUse: 'Si son pocas categorias con nombres cortos: `bar` ocupa menos.',
748
+ keywords: ['barras horizontales', 'ranking', 'etiquetas largas', 'long labels', 'horizontal bars', 'ranking with names', 'wide category names', 'nombres largos', 'long names', 'names are long'],
749
+ example: ['type: horizontal-bar', 'data:', ' - label: Gestion de defectos', ' value: 12'].join('\n'),
750
+ }),
751
+ t({
752
+ type: 'stacked-bar',
753
+ lang: 'chart',
754
+ engine: 'vega-lite',
755
+ purpose: 'Composicion de un total por categoria.',
756
+ whenToUse: 'Para ver el total y su reparto interno a la vez.',
757
+ whenNotToUse: 'Si quieres comparar las partes entre si: usa `grouped-bar`.',
758
+ keywords: ['apilado', 'composicion', 'total', 'reparto', 'series', 'composition', 'stacked', 'breakdown of total', 'parts of each bar', 'share by category'],
759
+ example: [
760
+ 'type: stacked-bar',
761
+ 'series:',
762
+ ' - name: Backend',
763
+ ' data:',
764
+ ' - label: SP1',
765
+ ' value: 10',
766
+ ].join('\n'),
767
+ }),
768
+ t({
769
+ type: 'grouped-bar',
770
+ lang: 'chart',
771
+ engine: 'vega-lite',
772
+ purpose: 'Comparacion de varias series por categoria.',
773
+ whenToUse: 'Cuando comparas dos o tres series dentro de cada categoria.',
774
+ whenNotToUse: 'Si el interes es el total: usa `stacked-bar`.',
775
+ keywords: ['agrupado', 'comparar series', 'barras', 'several series', 'side by side', 'grouped columns', 'compare series'],
776
+ example: [
777
+ 'type: grouped-bar',
778
+ 'series:',
779
+ ' - name: Plan',
780
+ ' data:',
781
+ ' - label: SP1',
782
+ ' value: 10',
783
+ ].join('\n'),
784
+ }),
785
+ t({
786
+ type: 'line',
787
+ lang: 'chart',
788
+ engine: 'vega-lite',
789
+ purpose: 'Evolucion de una magnitud en el tiempo.',
790
+ whenToUse: 'Para tendencias con varios puntos: cobertura por sprint, defectos por mes.',
791
+ whenNotToUse: 'Con dos o tres puntos sin continuidad: usa `bar`.',
792
+ keywords: ['tendencia', 'evolucion', 'tiempo', 'serie', 'historico', 'progreso', 'sprint', 'sprints', 'cobertura', 'mensual', 'trend', 'over time', 'evolution', 'time series', 'monthly'],
793
+ example: ['type: line', 'title: Cobertura', 'data:', ' - label: SP1', ' value: 41'].join('\n'),
794
+ }),
795
+ t({
796
+ type: 'area',
797
+ lang: 'chart',
798
+ engine: 'vega-lite',
799
+ purpose: 'Evolucion con enfasis en el volumen acumulado.',
800
+ whenToUse: 'Cuando importa la magnitud bajo la curva, no solo la forma.',
801
+ whenNotToUse: 'Si comparas varias series que se cruzan: `line` se lee mejor.',
802
+ keywords: ['area', 'volumen', 'acumulado', 'tendencia', 'cumulative volume', 'filled trend', 'area under the curve'],
803
+ example: ['type: area', 'data:', ' - label: Ene', ' value: 10'].join('\n'),
804
+ }),
805
+ t({
806
+ type: 'stacked-area',
807
+ lang: 'chart',
808
+ engine: 'vega-lite',
809
+ purpose: 'Evolucion de la composicion de un total.',
810
+ whenToUse: 'Para ver como cambia el reparto entre series a lo largo del tiempo.',
811
+ whenNotToUse: 'Si las series no suman un total con sentido: usa `line`.',
812
+ keywords: ['area apilada', 'composicion', 'evolucion', 'reparto temporal', 'composition over time', 'stacked trend', 'mix evolution'],
813
+ example: [
814
+ 'type: stacked-area',
815
+ 'series:',
816
+ ' - name: Backend',
817
+ ' data:',
818
+ ' - label: Ene',
819
+ ' value: 10',
820
+ ].join('\n'),
821
+ }),
822
+ t({
823
+ type: 'scatter',
824
+ lang: 'chart',
825
+ engine: 'vega-lite',
826
+ purpose: 'Relacion entre dos magnitudes.',
827
+ whenToUse: 'Para buscar correlacion: tamano frente a defectos, esfuerzo frente a valor.',
828
+ whenNotToUse: 'Si una de las dos es categorica: usa `bar`.',
829
+ keywords: ['correlacion', 'dispersion', 'relacion', 'nube de puntos', 'dos variables', 'correlation', 'relationship between two', 'points', 'x vs y'],
830
+ example: ['type: scatter', 'data:', ' - x: 120', ' y: 8'].join('\n'),
831
+ }),
832
+ t({
833
+ type: 'heatmap',
834
+ lang: 'chart',
835
+ engine: 'vega-lite',
836
+ aliases: ['mapa-de-calor'],
837
+ purpose: 'Densidad de una magnitud en dos dimensiones categoricas.',
838
+ whenToUse: 'Para cruces: defectos por modulo y por sprint, actividad por dia y hora.',
839
+ whenNotToUse: 'Si una dimension tiene un solo valor: usa `bar`.',
840
+ keywords: ['mapa de calor', 'cruce', 'matriz', 'densidad', 'concentracion', 'density', 'by day and hour', 'intensity', 'matrix of values', 'calendar heat'],
841
+ example: ['type: heatmap', 'data:', ' - x: SP1', ' y: Backend', ' value: 12'].join('\n'),
842
+ }),
843
+ t({
844
+ type: 'histogram',
845
+ lang: 'chart',
846
+ engine: 'vega-lite',
847
+ purpose: 'Distribucion de una variable continua.',
848
+ whenToUse: 'Para ver como se reparten los valores: duracion de las builds, tamano de las HU.',
849
+ whenNotToUse: 'Si los valores ya vienen agrupados en categorias: usa `bar`.',
850
+ keywords: ['distribucion', 'histograma', 'frecuencia', 'reparto', 'rangos', 'distribution', 'how values spread', 'buckets', 'bins', 'frequency', 'spread of times'],
851
+ example: ['type: histogram', 'title: Duracion de builds', 'bins: 10', 'values: [4, 6, 6, 7, 9, 12]'].join('\n'),
852
+ }),
853
+ t({
854
+ type: 'box-plot',
855
+ lang: 'chart',
856
+ engine: 'vega-lite',
857
+ aliases: ['boxplot', 'caja-bigotes'],
858
+ purpose: 'Mediana, dispersion y valores atipicos por grupo.',
859
+ whenToUse: 'Para comparar la variabilidad entre grupos, no solo su promedio.',
860
+ whenNotToUse: 'Con muy pocas observaciones por grupo: la caja enganaria.',
861
+ keywords: ['dispersion', 'mediana', 'variabilidad', 'atipicos', 'percentiles', 'caja', 'median', 'dispersion', 'outliers', 'quartiles', 'variability by group'],
862
+ example: [
863
+ 'type: box-plot',
864
+ 'title: Duracion por equipo',
865
+ 'groups:',
866
+ ' - name: Equipo A',
867
+ ' values: [3, 5, 6, 6, 9]',
868
+ ].join('\n'),
869
+ }),
870
+ t({
871
+ type: 'bullet',
872
+ lang: 'chart',
873
+ engine: 'vega-lite',
874
+ aliases: ['kpi'],
875
+ purpose: 'Valor real frente a su objetivo.',
876
+ whenToUse: 'Para indicadores con meta: cobertura frente al 80 %, disponibilidad frente al SLA.',
877
+ whenNotToUse: 'Si no hay objetivo definido: usa `bar`.',
878
+ keywords: ['kpi', 'objetivo', 'meta', 'indicador', 'sla', 'cumplimiento', 'avance', 'target', 'actual vs goal', 'kpi', 'progress to target'],
879
+ example: [
880
+ 'type: bullet',
881
+ 'title: Indicadores',
882
+ 'data:',
883
+ ' - label: Cobertura',
884
+ ' value: 74',
885
+ ' target: 80',
886
+ ].join('\n'),
887
+ }),
888
+ t({
889
+ type: 'slope',
890
+ lang: 'chart',
891
+ engine: 'vega-lite',
892
+ aliases: ['slopegraph'],
893
+ purpose: 'Cambio entre dos momentos, elemento a elemento.',
894
+ whenToUse: 'Para mostrar quien mejoro y quien empeoro entre dos mediciones.',
895
+ whenNotToUse: 'Con mas de dos momentos: usa `line`.',
896
+ keywords: ['antes y despues', 'cambio', 'mejora', 'comparacion', 'dos momentos', 'pendiente', 'change between two moments', 'before after by item', 'rank shift'],
897
+ example: [
898
+ 'type: slope',
899
+ 'title: Cobertura antes y despues',
900
+ 'from: SP1',
901
+ 'to: SP5',
902
+ 'data:',
903
+ ' - label: Backend',
904
+ ' before: 41',
905
+ ' after: 81',
906
+ ].join('\n'),
907
+ }),
908
+ t({
909
+ type: 'funnel',
910
+ lang: 'chart',
911
+ engine: 'vega-lite',
912
+ aliases: ['embudo'],
913
+ purpose: 'Caida de volumen a lo largo de etapas sucesivas.',
914
+ whenToUse: 'Para conversiones o filtros: candidatos por fase, incidencias por estado.',
915
+ whenNotToUse: 'Si las etapas no son sucesivas: usa `bar`.',
916
+ keywords: ['embudo', 'conversion', 'etapas', 'caida', 'filtro', 'abandono', 'conversion', 'drop off', 'stages of signup', 'how many survive each step', 'attrition', 'sobreviven', 'cuantos llegan', 'de la visita a la compra', 'drop-off by step', 'how many reach each step'],
917
+ example: [
918
+ 'type: funnel',
919
+ 'title: Conversion',
920
+ 'data:',
921
+ ' - label: Visitas',
922
+ ' value: 1000',
923
+ ' - label: Registros',
924
+ ' value: 220',
925
+ ].join('\n'),
926
+ }),
927
+ t({
928
+ type: 'pie',
929
+ lang: 'chart',
930
+ engine: 'vega-lite',
931
+ purpose: 'Reparto de un total entre pocas partes.',
932
+ whenToUse: 'Con tres o cuatro partes y diferencias grandes entre ellas.',
933
+ whenNotToUse: 'Con muchas partes o valores parecidos: `bar` se compara mejor.',
934
+ keywords: ['reparto', 'porcentaje', 'proporcion', 'tarta', 'cuota', 'share of total', 'percentage split', 'proportions', 'few slices'],
935
+ example: ['type: pie', 'data:', ' - label: Backend', ' value: 60'].join('\n'),
936
+ }),
937
+ t({
938
+ type: 'donut',
939
+ lang: 'chart',
940
+ engine: 'vega-lite',
941
+ aliases: ['doughnut'],
942
+ purpose: 'Reparto de un total, con el centro libre para un dato o un titulo.',
943
+ whenToUse: 'Igual que `pie`, cuando el hueco central aligera visualmente la lamina.',
944
+ whenNotToUse: 'Con muchas partes o valores parecidos: `bar` se compara mejor.',
945
+ keywords: ['reparto', 'porcentaje', 'proporcion', 'anillo', 'donut', 'cuota', 'share of total with center', 'ring chart', 'proportions with a figure'],
946
+ example: ['type: donut', 'data:', ' - label: Backend', ' value: 60'].join('\n'),
947
+ }),
948
+ t({
949
+ type: 'waterfall',
950
+ lang: 'chart',
951
+ engine: 'vega-lite',
952
+ aliases: ['cascada'],
953
+ purpose: 'Como se llega de un valor inicial a uno final, paso a paso.',
954
+ whenToUse: 'Para descomponer una variacion en sus aportes positivos y negativos.',
955
+ whenNotToUse: 'Si solo tienes el inicio y el final: usa `bar`.',
956
+ keywords: ['cascada', 'variacion', 'aportes', 'descomposicion', 'presupuesto', 'delta', 'bridge', 'from one value to another', 'contributions', 'walk from start to end', 'variance bridge', 'sumando y restando', 'adding and subtracting', 'de un resultado a otro', 'from one result to another', 'efectos acumulados'],
957
+ example: [
958
+ 'type: waterfall',
959
+ 'title: Variacion de defectos',
960
+ 'data:',
961
+ ' - label: Inicial',
962
+ ' value: 100',
963
+ ' - label: Corregidos',
964
+ ' value: -60',
965
+ ].join('\n'),
966
+ }),
967
+ ];
968
+ // --------------------------------------------------------------------------
969
+ // architecture
970
+ // --------------------------------------------------------------------------
971
+ const ARCHITECTURE = [
972
+ t({
973
+ type: 'c4-context',
974
+ lang: 'architecture',
975
+ engine: 'likec4',
976
+ fallbacks: ['plantuml-c4'],
977
+ aliases: ['context'],
978
+ purpose: 'El sistema, sus usuarios y los sistemas con los que habla.',
979
+ whenToUse: 'Como primera vista de una arquitectura, para publico que no conoce el sistema.',
980
+ whenNotToUse: 'Si necesitas ver piezas internas: usa `c4-container`.',
981
+ keywords: ['contexto', 'c4', 'arquitectura', 'sistemas externos', 'vision general', 'actores', 'system context', 'users and external systems', 'big picture', 'landscape'],
982
+ example: [
983
+ 'type: c4-context',
984
+ 'title: Contexto',
985
+ 'elements:',
986
+ ' - id: usuario',
987
+ ' kind: person',
988
+ ' name: Usuario',
989
+ ' - id: core',
990
+ ' kind: system',
991
+ ' name: Plataforma',
992
+ 'relations:',
993
+ ' - from: usuario',
994
+ ' to: core',
995
+ ' label: Utiliza',
996
+ ].join('\n'),
997
+ }),
998
+ t({
999
+ type: 'c4-container',
1000
+ lang: 'architecture',
1001
+ engine: 'likec4',
1002
+ fallbacks: ['plantuml-c4'],
1003
+ aliases: ['container'],
1004
+ purpose: 'Las piezas desplegables del sistema y su tecnologia.',
1005
+ whenToUse: 'Para explicar de que partes consta el sistema y como se comunican.',
1006
+ whenNotToUse: 'Si el detalle es de clases o modulos internos: usa `c4-component` o `component`.',
1007
+ keywords: ['contenedores', 'c4', 'aplicaciones', 'servicios', 'bases de datos', 'tecnologia', 'deployable pieces', 'apps and databases', 'technology per piece', 'containers'],
1008
+ example: [
1009
+ 'type: c4-container',
1010
+ 'title: Contenedores',
1011
+ 'elements:',
1012
+ ' - id: plataforma',
1013
+ ' kind: system',
1014
+ ' name: Plataforma',
1015
+ ' - id: api',
1016
+ ' kind: container',
1017
+ ' name: API',
1018
+ ' technology: NestJS',
1019
+ ' parent: plataforma',
1020
+ ].join('\n'),
1021
+ }),
1022
+ t({
1023
+ type: 'c4-component',
1024
+ lang: 'architecture',
1025
+ engine: 'likec4',
1026
+ fallbacks: ['plantuml-c4'],
1027
+ aliases: ['component-view'],
1028
+ purpose: 'Componentes internos de un contenedor.',
1029
+ whenToUse: 'Para el interior de una aplicacion concreta, cuando aporta al lector.',
1030
+ whenNotToUse: 'Casi siempre: este nivel envejece rapido. Comprueba que alguien lo vaya a leer.',
1031
+ keywords: ['componentes', 'c4', 'interior', 'modulos', 'internal components', 'inside a container', 'responsibilities'],
1032
+ example: [
1033
+ 'type: c4-component',
1034
+ 'title: Componentes de la API',
1035
+ 'elements:',
1036
+ ' - id: api',
1037
+ ' kind: container',
1038
+ ' name: API',
1039
+ ' - id: ctrl',
1040
+ ' kind: component',
1041
+ ' name: Controlador',
1042
+ ' parent: api',
1043
+ ].join('\n'),
1044
+ }),
1045
+ ];
1046
+ const TIPOS = [
1047
+ ...UML,
1048
+ ...FLOW_AND_PRODUCT,
1049
+ ...EXECUTIVE,
1050
+ ...SPECIAL,
1051
+ ...CHARTS,
1052
+ ...ARCHITECTURE,
1053
+ ];
1054
+ // La traduccion se acopla aqui y no dentro de cada definicion: asi la ficha en
1055
+ // español se lee de corrido y anadir un idioma no obliga a tocar 57 objetos.
1056
+ export const TYPE_CATALOG = TIPOS.map((spec) => {
1057
+ const en = CATALOG_EN[spec.type];
1058
+ return en === undefined ? spec : { ...spec, en };
1059
+ });
1060
+ const BY_NAME = new Map();
1061
+ for (const spec of TYPE_CATALOG) {
1062
+ BY_NAME.set(spec.type, spec);
1063
+ for (const alias of spec.aliases ?? [])
1064
+ BY_NAME.set(alias, spec);
1065
+ }
1066
+ /** Busca un tipo por su nombre canonico o por cualquiera de sus alias. */
1067
+ export function findType(name) {
1068
+ return BY_NAME.get(name.trim().toLowerCase());
1069
+ }
1070
+ export function typesFor(lang) {
1071
+ return TYPE_CATALOG.filter((s) => s.lang === lang);
1072
+ }
1073
+ export function typeNames(lang) {
1074
+ return typesFor(lang)
1075
+ .map((s) => s.type)
1076
+ .sort();
1077
+ }
1078
+ /** Todos los nombres aceptados, alias incluidos. */
1079
+ export function allTypeNames() {
1080
+ return [...BY_NAME.keys()].sort();
1081
+ }
1082
+ //# sourceMappingURL=catalog.js.map