@planu/cli 0.35.2 → 0.36.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 (46) hide show
  1. package/dist/config/license-plans.json +2 -1
  2. package/dist/engine/docs-site-generator/dashboard-renderer.d.ts +3 -0
  3. package/dist/engine/docs-site-generator/dashboard-renderer.d.ts.map +1 -0
  4. package/dist/engine/docs-site-generator/dashboard-renderer.js +84 -0
  5. package/dist/engine/docs-site-generator/dashboard-renderer.js.map +1 -0
  6. package/dist/engine/docs-site-generator/data-collector.d.ts +5 -0
  7. package/dist/engine/docs-site-generator/data-collector.d.ts.map +1 -0
  8. package/dist/engine/docs-site-generator/data-collector.js +300 -0
  9. package/dist/engine/docs-site-generator/data-collector.js.map +1 -0
  10. package/dist/engine/docs-site-generator/diagrams-renderer.d.ts +2 -0
  11. package/dist/engine/docs-site-generator/diagrams-renderer.d.ts.map +1 -0
  12. package/dist/engine/docs-site-generator/diagrams-renderer.js +40 -0
  13. package/dist/engine/docs-site-generator/diagrams-renderer.js.map +1 -0
  14. package/dist/engine/docs-site-generator/html-templates.d.ts +12 -0
  15. package/dist/engine/docs-site-generator/html-templates.d.ts.map +1 -0
  16. package/dist/engine/docs-site-generator/html-templates.js +359 -0
  17. package/dist/engine/docs-site-generator/html-templates.js.map +1 -0
  18. package/dist/engine/docs-site-generator/index.d.ts +3 -0
  19. package/dist/engine/docs-site-generator/index.d.ts.map +1 -0
  20. package/dist/engine/docs-site-generator/index.js +74 -0
  21. package/dist/engine/docs-site-generator/index.js.map +1 -0
  22. package/dist/engine/docs-site-generator/markdown-renderer.d.ts +6 -0
  23. package/dist/engine/docs-site-generator/markdown-renderer.d.ts.map +1 -0
  24. package/dist/engine/docs-site-generator/markdown-renderer.js +168 -0
  25. package/dist/engine/docs-site-generator/markdown-renderer.js.map +1 -0
  26. package/dist/engine/docs-site-generator/spec-renderer.d.ts +4 -0
  27. package/dist/engine/docs-site-generator/spec-renderer.d.ts.map +1 -0
  28. package/dist/engine/docs-site-generator/spec-renderer.js +81 -0
  29. package/dist/engine/docs-site-generator/spec-renderer.js.map +1 -0
  30. package/dist/engine/docs-site-generator/tools-renderer.d.ts +3 -0
  31. package/dist/engine/docs-site-generator/tools-renderer.d.ts.map +1 -0
  32. package/dist/engine/docs-site-generator/tools-renderer.js +55 -0
  33. package/dist/engine/docs-site-generator/tools-renderer.js.map +1 -0
  34. package/dist/resources/process.js +2 -2
  35. package/dist/resources/process.js.map +1 -1
  36. package/dist/tools/generate-docs-site.d.ts +3 -0
  37. package/dist/tools/generate-docs-site.d.ts.map +1 -0
  38. package/dist/tools/generate-docs-site.js +25 -0
  39. package/dist/tools/generate-docs-site.js.map +1 -0
  40. package/dist/tools/register-workspace-tools.d.ts.map +1 -1
  41. package/dist/tools/register-workspace-tools.js +15 -0
  42. package/dist/tools/register-workspace-tools.js.map +1 -1
  43. package/dist/types/docs.d.ts +51 -0
  44. package/dist/types/docs.d.ts.map +1 -1
  45. package/package.json +1 -1
  46. package/src/config/license-plans.json +2 -1
@@ -0,0 +1,359 @@
1
+ /**
2
+ * HTML templates for the static docs site generator.
3
+ * Provides layout, CSS, navigation, and shared HTML utilities.
4
+ */
5
+ // eslint-disable-next-line max-lines-per-function -- CSS template is inherently long
6
+ export function getStyles() {
7
+ return `
8
+ :root {
9
+ --bg: #0f1117;
10
+ --bg-card: #1a1d29;
11
+ --bg-sidebar: #141620;
12
+ --text: #e2e8f0;
13
+ --text-muted: #94a3b8;
14
+ --accent: #3b82f6;
15
+ --green: #22c55e;
16
+ --amber: #f59e0b;
17
+ --red: #ef4444;
18
+ --purple: #a855f7;
19
+ --border: #2d3348;
20
+ --font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
21
+ --font-mono: 'SF Mono', 'Fira Code', 'Consolas', monospace;
22
+ --sidebar-width: 250px;
23
+ --content-max: 900px;
24
+ }
25
+ @media (prefers-color-scheme: light) {
26
+ :root {
27
+ --bg: #f8fafc;
28
+ --bg-card: #ffffff;
29
+ --bg-sidebar: #f1f5f9;
30
+ --text: #1e293b;
31
+ --text-muted: #64748b;
32
+ --border: #e2e8f0;
33
+ }
34
+ }
35
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
36
+ html { font-size: 16px; }
37
+ body {
38
+ font-family: var(--font);
39
+ background: var(--bg);
40
+ color: var(--text);
41
+ line-height: 1.7;
42
+ display: flex;
43
+ min-height: 100vh;
44
+ }
45
+ a { color: var(--accent); text-decoration: none; }
46
+ a:hover { text-decoration: underline; }
47
+
48
+ /* Sidebar */
49
+ .sidebar {
50
+ width: var(--sidebar-width);
51
+ background: var(--bg-sidebar);
52
+ border-right: 1px solid var(--border);
53
+ padding: 1.5rem 0;
54
+ position: fixed;
55
+ top: 0;
56
+ left: 0;
57
+ height: 100vh;
58
+ overflow-y: auto;
59
+ z-index: 10;
60
+ }
61
+ .sidebar h2 {
62
+ font-size: 1.1rem;
63
+ padding: 0 1.25rem;
64
+ margin-bottom: 1rem;
65
+ color: var(--accent);
66
+ }
67
+ .sidebar ul { list-style: none; }
68
+ .sidebar li a {
69
+ display: block;
70
+ padding: 0.4rem 1.25rem;
71
+ color: var(--text-muted);
72
+ font-size: 0.9rem;
73
+ border-left: 3px solid transparent;
74
+ transition: background 0.15s, color 0.15s;
75
+ }
76
+ .sidebar li a:hover { background: var(--bg-card); color: var(--text); text-decoration: none; }
77
+ .sidebar li a.active {
78
+ color: var(--accent);
79
+ border-left-color: var(--accent);
80
+ background: var(--bg-card);
81
+ }
82
+ .sidebar .nav-section {
83
+ font-size: 0.75rem;
84
+ text-transform: uppercase;
85
+ letter-spacing: 0.05em;
86
+ color: var(--text-muted);
87
+ padding: 0.8rem 1.25rem 0.3rem;
88
+ font-weight: 600;
89
+ }
90
+
91
+ /* Main */
92
+ .main {
93
+ margin-left: var(--sidebar-width);
94
+ flex: 1;
95
+ padding: 2rem 2.5rem;
96
+ max-width: calc(var(--content-max) + 5rem);
97
+ }
98
+ .main h1 { font-size: 2rem; margin-bottom: 1rem; }
99
+ .main h2 { font-size: 1.5rem; margin-top: 2rem; margin-bottom: 0.75rem; border-bottom: 1px solid var(--border); padding-bottom: 0.4rem; }
100
+ .main h3 { font-size: 1.2rem; margin-top: 1.5rem; margin-bottom: 0.5rem; }
101
+
102
+ /* Cards */
103
+ .card {
104
+ background: var(--bg-card);
105
+ border: 1px solid var(--border);
106
+ border-radius: 8px;
107
+ padding: 1.25rem;
108
+ margin-bottom: 1rem;
109
+ }
110
+
111
+ /* Tables */
112
+ table {
113
+ width: 100%;
114
+ border-collapse: collapse;
115
+ margin: 1rem 0;
116
+ font-size: 0.9rem;
117
+ }
118
+ th, td {
119
+ padding: 0.6rem 0.8rem;
120
+ border: 1px solid var(--border);
121
+ text-align: left;
122
+ }
123
+ th { background: var(--bg-card); font-weight: 600; }
124
+
125
+ /* Progress bar */
126
+ .progress-bar {
127
+ background: var(--border);
128
+ border-radius: 6px;
129
+ height: 22px;
130
+ overflow: hidden;
131
+ position: relative;
132
+ margin: 0.5rem 0;
133
+ }
134
+ .progress-bar .fill {
135
+ height: 100%;
136
+ border-radius: 6px;
137
+ transition: width 0.3s;
138
+ }
139
+ .progress-bar .label {
140
+ position: absolute;
141
+ top: 50%;
142
+ left: 50%;
143
+ transform: translate(-50%, -50%);
144
+ font-size: 0.75rem;
145
+ font-weight: 600;
146
+ color: var(--text);
147
+ }
148
+ .progress-green .fill { background: var(--green); }
149
+ .progress-amber .fill { background: var(--amber); }
150
+ .progress-red .fill { background: var(--red); }
151
+
152
+ /* Status badges */
153
+ .badge {
154
+ display: inline-block;
155
+ padding: 0.15rem 0.6rem;
156
+ border-radius: 12px;
157
+ font-size: 0.78rem;
158
+ font-weight: 600;
159
+ text-transform: capitalize;
160
+ }
161
+ .badge-draft { background: #374151; color: #d1d5db; }
162
+ .badge-review { background: #78350f; color: var(--amber); }
163
+ .badge-approved { background: #1e3a5f; color: var(--accent); }
164
+ .badge-implementing { background: #3b1f6e; color: var(--purple); }
165
+ .badge-done { background: #14532d; color: var(--green); }
166
+
167
+ /* Code */
168
+ pre {
169
+ background: var(--bg-card);
170
+ border: 1px solid var(--border);
171
+ border-radius: 6px;
172
+ padding: 1rem;
173
+ overflow-x: auto;
174
+ font-size: 0.85rem;
175
+ line-height: 1.5;
176
+ margin: 1rem 0;
177
+ }
178
+ code { font-family: var(--font-mono); font-size: 0.88em; }
179
+ p code, li code {
180
+ background: var(--bg-card);
181
+ padding: 0.15rem 0.4rem;
182
+ border-radius: 4px;
183
+ border: 1px solid var(--border);
184
+ }
185
+
186
+ /* Checkboxes */
187
+ .criteria-item {
188
+ display: flex;
189
+ align-items: flex-start;
190
+ gap: 0.5rem;
191
+ padding: 0.3rem 0;
192
+ }
193
+ .criteria-check {
194
+ width: 18px;
195
+ height: 18px;
196
+ border-radius: 4px;
197
+ border: 2px solid var(--border);
198
+ flex-shrink: 0;
199
+ margin-top: 3px;
200
+ display: flex;
201
+ align-items: center;
202
+ justify-content: center;
203
+ font-size: 0.7rem;
204
+ }
205
+ .criteria-check.checked { background: var(--green); border-color: var(--green); color: #fff; }
206
+
207
+ /* Blockquotes */
208
+ blockquote {
209
+ border-left: 4px solid var(--accent);
210
+ padding: 0.5rem 1rem;
211
+ margin: 1rem 0;
212
+ color: var(--text-muted);
213
+ background: var(--bg-card);
214
+ border-radius: 0 6px 6px 0;
215
+ }
216
+
217
+ /* Mermaid */
218
+ .mermaid {
219
+ background: var(--bg-card);
220
+ padding: 1rem;
221
+ border-radius: 6px;
222
+ overflow-x: auto;
223
+ margin: 1rem 0;
224
+ text-align: center;
225
+ }
226
+
227
+ /* Search */
228
+ .search-box {
229
+ padding: 0.5rem 1.25rem;
230
+ margin-bottom: 0.5rem;
231
+ }
232
+ .search-box input {
233
+ width: 100%;
234
+ padding: 0.45rem 0.75rem;
235
+ background: var(--bg);
236
+ border: 1px solid var(--border);
237
+ border-radius: 6px;
238
+ color: var(--text);
239
+ font-size: 0.85rem;
240
+ outline: none;
241
+ }
242
+ .search-box input:focus { border-color: var(--accent); }
243
+
244
+ /* Responsive */
245
+ @media (max-width: 768px) {
246
+ .sidebar {
247
+ position: static;
248
+ width: 100%;
249
+ height: auto;
250
+ border-right: none;
251
+ border-bottom: 1px solid var(--border);
252
+ }
253
+ body { flex-direction: column; }
254
+ .main { margin-left: 0; padding: 1.5rem 1rem; }
255
+ }
256
+ `;
257
+ }
258
+ export function renderNav(items, activePath) {
259
+ const sections = {};
260
+ for (const item of items) {
261
+ const parts = item.path.split('/');
262
+ const section = parts[0] ?? 'General';
263
+ const existing = sections[section];
264
+ if (existing) {
265
+ existing.push(item);
266
+ }
267
+ else {
268
+ sections[section] = [item];
269
+ }
270
+ }
271
+ let html = '<div class="search-box"><input type="text" id="nav-search" placeholder="Search..." /></div>';
272
+ for (const [section, sectionItems] of Object.entries(sections)) {
273
+ html += `<div class="nav-section">${escapeHtml(section)}</div><ul>`;
274
+ for (const item of sectionItems) {
275
+ const activeClass = activePath === item.path ? ' class="active"' : '';
276
+ const icon = item.icon ? `${item.icon} ` : '';
277
+ html += `<li data-searchable="${escapeAttr(item.title)}"><a href="${escapeAttr(item.path)}.html"${activeClass}>${icon}${escapeHtml(item.title)}</a></li>`;
278
+ }
279
+ html += '</ul>';
280
+ }
281
+ return html;
282
+ }
283
+ export function wrapPage(title, content, navItems) {
284
+ const styles = getStyles();
285
+ const nav = renderNav(navItems, title);
286
+ const searchScript = renderSearchScript();
287
+ return `<!DOCTYPE html>
288
+ <html lang="en">
289
+ <head>
290
+ <meta charset="UTF-8" />
291
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
292
+ <title>${escapeHtml(title)} - Planu Docs</title>
293
+ <style>${styles}</style>
294
+ </head>
295
+ <body>
296
+ <aside class="sidebar">
297
+ <h2>Planu Docs</h2>
298
+ ${nav}
299
+ </aside>
300
+ <main class="main">
301
+ ${content}
302
+ </main>
303
+ <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
304
+ <script>mermaid.initialize({startOnLoad:true,theme:'dark'});</script>
305
+ <script>${searchScript}</script>
306
+ </body>
307
+ </html>`;
308
+ }
309
+ export function renderProgressBar(done, total) {
310
+ const pct = total > 0 ? Math.round((done / total) * 100) : 0;
311
+ let colorClass;
312
+ if (pct >= 80) {
313
+ colorClass = 'progress-green';
314
+ }
315
+ else if (pct >= 40) {
316
+ colorClass = 'progress-amber';
317
+ }
318
+ else {
319
+ colorClass = 'progress-red';
320
+ }
321
+ return `<div class="progress-bar ${colorClass}"><div class="fill" style="width:${String(pct)}%"></div><div class="label">${String(done)}/${String(total)} (${String(pct)}%)</div></div>`;
322
+ }
323
+ export function renderStatusBadge(status) {
324
+ const normalized = status.toLowerCase().trim();
325
+ const classMap = {
326
+ draft: 'badge-draft',
327
+ review: 'badge-review',
328
+ approved: 'badge-approved',
329
+ implementing: 'badge-implementing',
330
+ done: 'badge-done',
331
+ };
332
+ const badgeClass = classMap[normalized] ?? 'badge-draft';
333
+ return `<span class="badge ${badgeClass}">${escapeHtml(normalized)}</span>`;
334
+ }
335
+ export function renderSearchScript() {
336
+ return `(function(){
337
+ var input = document.getElementById('nav-search');
338
+ if (!input) return;
339
+ input.addEventListener('keyup', function() {
340
+ var query = this.value.toLowerCase();
341
+ var items = document.querySelectorAll('[data-searchable]');
342
+ for (var i = 0; i < items.length; i++) {
343
+ var text = (items[i].getAttribute('data-searchable') || '').toLowerCase();
344
+ items[i].style.display = text.indexOf(query) !== -1 ? '' : 'none';
345
+ }
346
+ });
347
+ })();`;
348
+ }
349
+ function escapeHtml(text) {
350
+ return text
351
+ .replace(/&/g, '&amp;')
352
+ .replace(/</g, '&lt;')
353
+ .replace(/>/g, '&gt;')
354
+ .replace(/"/g, '&quot;');
355
+ }
356
+ function escapeAttr(text) {
357
+ return escapeHtml(text).replace(/'/g, '&#39;');
358
+ }
359
+ //# sourceMappingURL=html-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-templates.js","sourceRoot":"","sources":["../../../src/engine/docs-site-generator/html-templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DocsSiteConfig, DocsSiteResult } from '../../types/index.js';
2
+ export declare function generateDocsSite(config: DocsSiteConfig): Promise<DocsSiteResult>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/docs-site-generator/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAY,MAAM,sBAAsB,CAAC;AAQrF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CA4EtF"}
@@ -0,0 +1,74 @@
1
+ import { mkdir, writeFile, readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { collectSpecs, collectTools, collectMetrics } from './data-collector.js';
4
+ import { wrapPage } from './html-templates.js';
5
+ import { renderDashboard } from './dashboard-renderer.js';
6
+ import { renderSpecPage, renderSpecIndex } from './spec-renderer.js';
7
+ import { renderToolsCatalog } from './tools-renderer.js';
8
+ import { renderDiagramsPage } from './diagrams-renderer.js';
9
+ export async function generateDocsSite(config) {
10
+ const { projectPath, outputDir, title = 'Planu Documentation' } = config;
11
+ const [specs, metrics] = await Promise.all([
12
+ collectSpecs(projectPath),
13
+ collectMetrics(projectPath),
14
+ ]);
15
+ const tools = collectTools(projectPath);
16
+ const navItems = [
17
+ { path: 'index.html', title: 'Dashboard' },
18
+ { path: 'specs/index.html', title: 'Specs' },
19
+ { path: 'tools.html', title: 'Tools' },
20
+ { path: 'architecture.html', title: 'Architecture' },
21
+ ];
22
+ const pages = [];
23
+ pages.push({
24
+ path: 'index.html',
25
+ title: 'Dashboard',
26
+ html: wrapPage(`${title} — Dashboard`, renderDashboard(specs, metrics), navItems),
27
+ });
28
+ pages.push({
29
+ path: 'specs/index.html',
30
+ title: 'Specs',
31
+ html: wrapPage(`${title} — Specs`, renderSpecIndex(specs), navItems),
32
+ });
33
+ for (const spec of specs) {
34
+ let specContent = '';
35
+ let techContent = '';
36
+ try {
37
+ specContent = await readFile(spec.specPath, 'utf-8');
38
+ }
39
+ catch {
40
+ /* missing */
41
+ }
42
+ try {
43
+ const techPath = spec.specPath
44
+ .replace(/spec\.md$/, 'technical.md')
45
+ .replace(/HU\.md$/, 'FICHA-TECNICA.md');
46
+ techContent = await readFile(techPath, 'utf-8');
47
+ }
48
+ catch {
49
+ /* missing */
50
+ }
51
+ pages.push({
52
+ path: `specs/${spec.slug}.html`,
53
+ title: spec.title,
54
+ html: wrapPage(`${spec.id}: ${spec.title}`, renderSpecPage(spec, specContent, techContent), navItems),
55
+ });
56
+ }
57
+ pages.push({
58
+ path: 'tools.html',
59
+ title: 'Tools',
60
+ html: wrapPage(`${title} — Tools`, renderToolsCatalog(tools), navItems),
61
+ });
62
+ pages.push({
63
+ path: 'architecture.html',
64
+ title: 'Architecture',
65
+ html: wrapPage(`${title} — Architecture`, renderDiagramsPage(), navItems),
66
+ });
67
+ await mkdir(outputDir, { recursive: true });
68
+ await mkdir(join(outputDir, 'specs'), { recursive: true });
69
+ for (const page of pages) {
70
+ await writeFile(join(outputDir, page.path), page.html, 'utf-8');
71
+ }
72
+ return { pagesGenerated: pages.length, outputDir, pages: pages.map((p) => p.path) };
73
+ }
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/docs-site-generator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAsB;IAC3D,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,GAAG,qBAAqB,EAAE,GAAG,MAAM,CAAC;IAEzE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACzC,YAAY,CAAC,WAAW,CAAC;QACzB,cAAc,CAAC,WAAW,CAAC;KAC5B,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAG;QACf,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE;QAC1C,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE;QAC5C,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE;QACtC,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,cAAc,EAAE;KACrD,CAAC;IAEF,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,cAAc,EAAE,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC;KAClF,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,kBAAkB;QACxB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;KACrE,CAAC,CAAC;IAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;iBAC3B,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC;iBACpC,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;YAC1C,WAAW,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,SAAS,IAAI,CAAC,IAAI,OAAO;YAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,QAAQ,CACZ,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,EAC3B,cAAc,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,EAC9C,QAAQ,CACT;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,UAAU,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;KACxE,CAAC,CAAC;IAEH,KAAK,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,mBAAmB;QACzB,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,QAAQ,CAAC,GAAG,KAAK,iBAAiB,EAAE,kBAAkB,EAAE,EAAE,QAAQ,CAAC;KAC1E,CAAC,CAAC;IAEH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AACtF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Minimal markdown-to-HTML converter for spec rendering.
3
+ * No external dependencies — pure regex-based transformation.
4
+ */
5
+ export declare function renderMarkdown(md: string): string;
6
+ //# sourceMappingURL=markdown-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-renderer.d.ts","sourceRoot":"","sources":["../../../src/engine/docs-site-generator/markdown-renderer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAwIjD"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Minimal markdown-to-HTML converter for spec rendering.
3
+ * No external dependencies — pure regex-based transformation.
4
+ */
5
+ // eslint-disable-next-line max-lines-per-function, complexity -- markdown parser with many patterns
6
+ export function renderMarkdown(md) {
7
+ const lines = md.split('\n');
8
+ const output = [];
9
+ let inCodeBlock = false;
10
+ let codeLanguage = '';
11
+ let codeLines = [];
12
+ let inList = false;
13
+ let inTable = false;
14
+ let tableHeaderDone = false;
15
+ for (const line of lines) {
16
+ // Code block fences
17
+ if (line.startsWith('```')) {
18
+ if (inCodeBlock) {
19
+ const code = codeLines.join('\n');
20
+ if (codeLanguage === 'mermaid') {
21
+ output.push(`<div class="mermaid">${code}</div>`);
22
+ }
23
+ else {
24
+ const langClass = codeLanguage ? ` class="language-${escapeHtml(codeLanguage)}"` : '';
25
+ output.push(`<pre><code${langClass}>${escapeHtml(code)}</code></pre>`);
26
+ }
27
+ inCodeBlock = false;
28
+ codeLines = [];
29
+ codeLanguage = '';
30
+ }
31
+ else {
32
+ closeList(output, inList);
33
+ inList = false;
34
+ closeTable(output, inTable);
35
+ inTable = false;
36
+ tableHeaderDone = false;
37
+ inCodeBlock = true;
38
+ codeLanguage = line.slice(3).trim();
39
+ }
40
+ continue;
41
+ }
42
+ if (inCodeBlock) {
43
+ codeLines.push(line);
44
+ continue;
45
+ }
46
+ // Table rows
47
+ if (line.includes('|') && line.trim().startsWith('|')) {
48
+ const cells = parseTableRow(line);
49
+ if (cells.length > 0) {
50
+ // Separator row (e.g. |---|---|)
51
+ if (cells.every((c) => /^[-:]+$/.test(c.trim()))) {
52
+ tableHeaderDone = true;
53
+ continue;
54
+ }
55
+ if (!inTable) {
56
+ closeList(output, inList);
57
+ inList = false;
58
+ output.push('<table>');
59
+ inTable = true;
60
+ tableHeaderDone = false;
61
+ }
62
+ const tag = !tableHeaderDone ? 'th' : 'td';
63
+ const rowHtml = cells.map((c) => `<${tag}>${renderInline(c.trim())}</${tag}>`).join('');
64
+ output.push(`<tr>${rowHtml}</tr>`);
65
+ continue;
66
+ }
67
+ }
68
+ else if (inTable) {
69
+ closeTable(output, inTable);
70
+ inTable = false;
71
+ tableHeaderDone = false;
72
+ }
73
+ // Empty line
74
+ if (line.trim() === '') {
75
+ closeList(output, inList);
76
+ inList = false;
77
+ continue;
78
+ }
79
+ // Headings
80
+ const headingMatch = /^(#{1,6})\s+(.+)$/.exec(line);
81
+ if (headingMatch) {
82
+ closeList(output, inList);
83
+ inList = false;
84
+ const level = headingMatch[1]?.length ?? 1;
85
+ const text = headingMatch[2] ?? '';
86
+ output.push(`<h${String(level)}>${renderInline(text)}</h${String(level)}>`);
87
+ continue;
88
+ }
89
+ // Blockquote
90
+ if (line.startsWith('> ')) {
91
+ closeList(output, inList);
92
+ inList = false;
93
+ output.push(`<blockquote>${renderInline(line.slice(2))}</blockquote>`);
94
+ continue;
95
+ }
96
+ // Checkbox items
97
+ const checkboxMatch = /^[-*]\s+\[([ xX])\]\s+(.+)$/.exec(line.trim());
98
+ if (checkboxMatch) {
99
+ closeList(output, inList);
100
+ inList = false;
101
+ const checked = checkboxMatch[1] !== ' ';
102
+ const text = checkboxMatch[2] ?? '';
103
+ const checkClass = checked ? 'criteria-check checked' : 'criteria-check';
104
+ const checkmark = checked ? '&#10003;' : '';
105
+ output.push(`<div class="criteria-item"><div class="${checkClass}">${checkmark}</div><span>${renderInline(text)}</span></div>`);
106
+ continue;
107
+ }
108
+ // Unordered list items
109
+ const listMatch = /^[-*]\s+(.+)$/.exec(line.trim());
110
+ if (listMatch) {
111
+ if (!inList) {
112
+ output.push('<ul>');
113
+ inList = true;
114
+ }
115
+ output.push(`<li>${renderInline(listMatch[1] ?? '')}</li>`);
116
+ continue;
117
+ }
118
+ // Paragraph
119
+ closeList(output, inList);
120
+ inList = false;
121
+ output.push(`<p>${renderInline(line)}</p>`);
122
+ }
123
+ // Close any unclosed blocks
124
+ if (inCodeBlock) {
125
+ const code = codeLines.join('\n');
126
+ const langClass = codeLanguage ? ` class="language-${escapeHtml(codeLanguage)}"` : '';
127
+ output.push(`<pre><code${langClass}>${escapeHtml(code)}</code></pre>`);
128
+ }
129
+ closeList(output, inList);
130
+ closeTable(output, inTable);
131
+ return output.join('\n');
132
+ }
133
+ function renderInline(text) {
134
+ let result = escapeHtml(text);
135
+ // Bold: **text**
136
+ result = result.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
137
+ // Italic: *text* (but not inside bold)
138
+ result = result.replace(/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g, '<em>$1</em>');
139
+ // Inline code: `text`
140
+ result = result.replace(/`([^`]+)`/g, '<code>$1</code>');
141
+ // Links: [text](url)
142
+ result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
143
+ return result;
144
+ }
145
+ function escapeHtml(text) {
146
+ return text
147
+ .replace(/&/g, '&amp;')
148
+ .replace(/</g, '&lt;')
149
+ .replace(/>/g, '&gt;')
150
+ .replace(/"/g, '&quot;');
151
+ }
152
+ function closeList(output, inList) {
153
+ if (inList) {
154
+ output.push('</ul>');
155
+ }
156
+ }
157
+ function closeTable(output, inTable) {
158
+ if (inTable) {
159
+ output.push('</table>');
160
+ }
161
+ }
162
+ function parseTableRow(line) {
163
+ const trimmed = line.trim();
164
+ const inner = trimmed.startsWith('|') ? trimmed.slice(1) : trimmed;
165
+ const withoutEnd = inner.endsWith('|') ? inner.slice(0, -1) : inner;
166
+ return withoutEnd.split('|');
167
+ }
168
+ //# sourceMappingURL=markdown-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-renderer.js","sourceRoot":"","sources":["../../../src/engine/docs-site-generator/markdown-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DocSpecSummary } from '../../types/index.js';
2
+ export declare function renderSpecPage(spec: DocSpecSummary, specContent: string, technicalContent: string): string;
3
+ export declare function renderSpecIndex(specs: DocSpecSummary[]): string;
4
+ //# sourceMappingURL=spec-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-renderer.d.ts","sourceRoot":"","sources":["../../../src/engine/docs-site-generator/spec-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAI3D,wBAAgB,cAAc,CAC5B,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,MAAM,EACnB,gBAAgB,EAAE,MAAM,GACvB,MAAM,CAoCR;AAgBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,CA+B/D"}