viberadar 0.3.133 → 0.3.134

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/docx.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Zero-dependency DOCX generator for viberadar docs export.
3
+ * DOCX format = ZIP of XML files (OOXML spec).
4
+ * Uses Node.js built-in `zlib` for DEFLATE compression.
5
+ */
6
+ export interface DocFeature {
7
+ key: string;
8
+ label: string;
9
+ latestVersion: number | null;
10
+ docVersions: string[];
11
+ }
12
+ export declare function buildDocx(features: DocFeature[], projectRoot: string): Buffer;
13
+ //# sourceMappingURL=docx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx.d.ts","sourceRoot":"","sources":["../src/docx.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0QH,MAAM,WAAW,UAAU;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;CAAE;AAEhH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAoM7E"}
package/dist/docx.js ADDED
@@ -0,0 +1,487 @@
1
+ "use strict";
2
+ /**
3
+ * Zero-dependency DOCX generator for viberadar docs export.
4
+ * DOCX format = ZIP of XML files (OOXML spec).
5
+ * Uses Node.js built-in `zlib` for DEFLATE compression.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.buildDocx = buildDocx;
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ const zlib = __importStar(require("zlib"));
45
+ // ── CRC-32 ────────────────────────────────────────────────────────────────────
46
+ const CRC_TABLE = (() => {
47
+ const t = new Uint32Array(256);
48
+ for (let i = 0; i < 256; i++) {
49
+ let c = i;
50
+ for (let j = 0; j < 8; j++)
51
+ c = (c & 1) ? 0xEDB88320 ^ (c >>> 1) : c >>> 1;
52
+ t[i] = c;
53
+ }
54
+ return t;
55
+ })();
56
+ function crc32(buf) {
57
+ let c = 0xFFFFFFFF;
58
+ for (let i = 0; i < buf.length; i++)
59
+ c = CRC_TABLE[(c ^ buf[i]) & 0xFF] ^ (c >>> 8);
60
+ return (c ^ 0xFFFFFFFF) >>> 0;
61
+ }
62
+ class ZipBuilder {
63
+ entries = [];
64
+ offset = 0;
65
+ add(name, data) {
66
+ const compressed = zlib.deflateRawSync(data, { level: 6 });
67
+ const crc = crc32(data);
68
+ this.entries.push({ name, data, crc, compressed, offset: this.offset });
69
+ // local file header (30) + name + compressed data
70
+ this.offset += 30 + Buffer.byteLength(name) + compressed.length;
71
+ }
72
+ toBuffer() {
73
+ const parts = [];
74
+ for (const e of this.entries) {
75
+ const nameBuf = Buffer.from(e.name, 'utf-8');
76
+ const hdr = Buffer.alloc(30);
77
+ hdr.writeUInt32LE(0x04034B50, 0); // signature
78
+ hdr.writeUInt16LE(20, 4); // version needed
79
+ hdr.writeUInt16LE(0, 6); // flags
80
+ hdr.writeUInt16LE(8, 8); // deflate
81
+ hdr.writeUInt16LE(0, 10); // mod time
82
+ hdr.writeUInt16LE(0, 12); // mod date
83
+ hdr.writeUInt32LE(e.crc, 14);
84
+ hdr.writeUInt32LE(e.compressed.length, 18);
85
+ hdr.writeUInt32LE(e.data.length, 22);
86
+ hdr.writeUInt16LE(nameBuf.length, 26);
87
+ hdr.writeUInt16LE(0, 28);
88
+ parts.push(hdr, nameBuf, e.compressed);
89
+ }
90
+ const centralStart = this.offset;
91
+ for (const e of this.entries) {
92
+ const nameBuf = Buffer.from(e.name, 'utf-8');
93
+ const cd = Buffer.alloc(46);
94
+ cd.writeUInt32LE(0x02014B50, 0); // central dir sig
95
+ cd.writeUInt16LE(20, 4); // version made by
96
+ cd.writeUInt16LE(20, 6); // version needed
97
+ cd.writeUInt16LE(0, 8);
98
+ cd.writeUInt16LE(8, 10); // deflate
99
+ cd.writeUInt16LE(0, 12);
100
+ cd.writeUInt16LE(0, 14);
101
+ cd.writeUInt32LE(e.crc, 16);
102
+ cd.writeUInt32LE(e.compressed.length, 20);
103
+ cd.writeUInt32LE(e.data.length, 24);
104
+ cd.writeUInt16LE(nameBuf.length, 28);
105
+ cd.writeUInt16LE(0, 30);
106
+ cd.writeUInt16LE(0, 32);
107
+ cd.writeUInt16LE(0, 34);
108
+ cd.writeUInt16LE(0, 36);
109
+ cd.writeUInt32LE(0, 38);
110
+ cd.writeUInt32LE(e.offset, 42);
111
+ parts.push(cd, nameBuf);
112
+ }
113
+ const centralSize = parts.reduce((s, b, i) => i >= this.entries.length * 3 ? s + b.length : s, 0);
114
+ // recalculate central dir size properly
115
+ let cdSize = 0;
116
+ for (const e of this.entries)
117
+ cdSize += 46 + Buffer.byteLength(e.name);
118
+ const eocd = Buffer.alloc(22);
119
+ eocd.writeUInt32LE(0x06054B50, 0);
120
+ eocd.writeUInt16LE(0, 4);
121
+ eocd.writeUInt16LE(0, 6);
122
+ eocd.writeUInt16LE(this.entries.length, 8);
123
+ eocd.writeUInt16LE(this.entries.length, 10);
124
+ eocd.writeUInt32LE(cdSize, 12);
125
+ eocd.writeUInt32LE(centralStart, 16);
126
+ eocd.writeUInt16LE(0, 20);
127
+ parts.push(eocd);
128
+ return Buffer.concat(parts);
129
+ }
130
+ }
131
+ // ── Helpers ───────────────────────────────────────────────────────────────────
132
+ function xe(s) {
133
+ return String(s || '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
134
+ }
135
+ /** Read PNG width/height from binary header (bytes 16-23 in IHDR chunk) */
136
+ function pngSize(buf) {
137
+ if (buf.length < 24)
138
+ return null;
139
+ if (buf.readUInt32BE(0) !== 0x89504E47)
140
+ return null; // PNG magic
141
+ return { w: buf.readUInt32BE(16), h: buf.readUInt32BE(20) };
142
+ }
143
+ function inlineRuns(text) {
144
+ // Process inline markup: **bold**, *italic*, `code`, links
145
+ const parts = [];
146
+ // Simple state machine
147
+ let i = 0;
148
+ let cur = '';
149
+ const flush = (extra = '') => { if (cur || extra)
150
+ parts.push(`<w:r><w:t xml:space="preserve">${xe(cur)}${extra}</w:t></w:r>`); cur = ''; };
151
+ const raw = text;
152
+ const tokens = [];
153
+ // Tokenize
154
+ const re = /\*\*([^*]+)\*\*|\*([^*]+)\*|`([^`]+)`|\[([^\]]+)\]\(([^)]+)\)/g;
155
+ let last = 0, m;
156
+ while ((m = re.exec(raw)) !== null) {
157
+ if (m.index > last)
158
+ tokens.push({ type: 'text', text: raw.slice(last, m.index) });
159
+ if (m[1] !== undefined)
160
+ tokens.push({ type: 'bold', text: m[1] });
161
+ else if (m[2] !== undefined)
162
+ tokens.push({ type: 'italic', text: m[2] });
163
+ else if (m[3] !== undefined)
164
+ tokens.push({ type: 'code', text: m[3] });
165
+ else if (m[4] !== undefined)
166
+ tokens.push({ type: 'link', text: m[4], href: m[5] });
167
+ last = m.index + m[0].length;
168
+ }
169
+ if (last < raw.length)
170
+ tokens.push({ type: 'text', text: raw.slice(last) });
171
+ return tokens.map(t => {
172
+ if (t.type === 'text')
173
+ return `<w:r><w:t xml:space="preserve">${xe(t.text)}</w:t></w:r>`;
174
+ if (t.type === 'bold')
175
+ return `<w:r><w:rPr><w:b/></w:rPr><w:t xml:space="preserve">${xe(t.text)}</w:t></w:r>`;
176
+ if (t.type === 'italic')
177
+ return `<w:r><w:rPr><w:i/></w:rPr><w:t xml:space="preserve">${xe(t.text)}</w:t></w:r>`;
178
+ if (t.type === 'code')
179
+ return `<w:r><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New"/><w:sz w:val="18"/><w:shd w:val="clear" w:color="auto" w:fill="F0F0F0"/></w:rPr><w:t xml:space="preserve">${xe(t.text)}</w:t></w:r>`;
180
+ if (t.type === 'link')
181
+ return `<w:hyperlink w:tooltip="${xe(t.href || '')}"><w:r><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr><w:t>${xe(t.text)}</w:t></w:r></w:hyperlink>`;
182
+ return '';
183
+ }).join('');
184
+ }
185
+ function para(style, content, extraPPr = '') {
186
+ return `<w:p><w:pPr><w:pStyle w:val="${style}"/>${extraPPr}</w:pPr>${content}</w:p>`;
187
+ }
188
+ function mdToOoxml(md, featureKey, imgRefs, screenshotsDir) {
189
+ const lines = md.split('\n');
190
+ const parts = [];
191
+ let inCode = false, codeBuf = '';
192
+ let listType = null;
193
+ let numId = 1;
194
+ const closeList = () => { listType = null; };
195
+ for (let i = 0; i < lines.length; i++) {
196
+ const line = lines[i];
197
+ // Code block
198
+ if (line.trimStart().startsWith('```')) {
199
+ if (inCode) {
200
+ // Emit code block
201
+ const codeLines = codeBuf.trimEnd().split('\n');
202
+ for (const cl of codeLines) {
203
+ parts.push(`<w:p><w:pPr><w:pStyle w:val="Code"/></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New"/><w:sz w:val="18"/></w:rPr><w:t xml:space="preserve">${xe(cl)}</w:t></w:r></w:p>`);
204
+ }
205
+ codeBuf = '';
206
+ inCode = false;
207
+ }
208
+ else {
209
+ closeList();
210
+ inCode = true;
211
+ }
212
+ continue;
213
+ }
214
+ if (inCode) {
215
+ codeBuf += line + '\n';
216
+ continue;
217
+ }
218
+ // Headings
219
+ const hm = line.match(/^(#{1,6})\s+(.+)$/);
220
+ if (hm) {
221
+ closeList();
222
+ const lvl = hm[1].length;
223
+ const styleMap = { 1: 'Heading1', 2: 'Heading2', 3: 'Heading3', 4: 'Heading4', 5: 'Heading5', 6: 'Heading6' };
224
+ parts.push(para(styleMap[lvl] || 'Heading3', inlineRuns(hm[2])));
225
+ continue;
226
+ }
227
+ // Horizontal rule → page separator
228
+ if (/^-{3,}$/.test(line.trim())) {
229
+ closeList();
230
+ parts.push(`<w:p><w:pPr><w:pBdr><w:bottom w:val="single" w:sz="6" w:space="1" w:color="CCCCCC"/></w:pBdr></w:pPr></w:p>`);
231
+ continue;
232
+ }
233
+ // Unordered list
234
+ if (/^\s*[-*]\s+/.test(line)) {
235
+ if (listType !== 'ul') {
236
+ closeList();
237
+ listType = 'ul';
238
+ }
239
+ const txt = line.replace(/^\s*[-*]\s+/, '');
240
+ parts.push(`<w:p><w:pPr><w:pStyle w:val="ListBullet"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/></w:numPr></w:pPr>${inlineRuns(txt)}</w:p>`);
241
+ continue;
242
+ }
243
+ // Ordered list
244
+ if (/^\s*\d+\.\s+/.test(line)) {
245
+ if (listType !== 'ol') {
246
+ closeList();
247
+ listType = 'ol';
248
+ }
249
+ const txt = line.replace(/^\s*\d+\.\s+/, '');
250
+ parts.push(`<w:p><w:pPr><w:pStyle w:val="ListNumber"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr></w:pPr>${inlineRuns(txt)}</w:p>`);
251
+ continue;
252
+ }
253
+ // Image
254
+ const im = line.trim().match(/^!\[([^\]]*)\]\(([^)]+)\)$/);
255
+ if (im) {
256
+ closeList();
257
+ const alt = im[1];
258
+ let src = im[2];
259
+ // Resolve screenshot path
260
+ if (src.startsWith('screenshots/')) {
261
+ const fname = src.replace('screenshots/', '');
262
+ const fpath = path.join(screenshotsDir, fname);
263
+ try {
264
+ const imgBuf = fs.readFileSync(fpath);
265
+ const size = pngSize(imgBuf) || { w: 800, h: 600 };
266
+ // Max width 15cm = 5400000 EMU (at 96dpi)
267
+ const maxW = 5400000;
268
+ const scale = Math.min(1, maxW / (size.w * 9525));
269
+ const emuW = Math.round(size.w * 9525 * scale);
270
+ const emuH = Math.round(size.h * 9525 * scale);
271
+ const rId = `rImg${imgRefs.length + 1}`;
272
+ const mediaName = `media/img${imgRefs.length + 1}${path.extname(fname) || '.png'}`;
273
+ imgRefs.push({ rId, file: fpath, w: emuW, h: emuH, altText: alt });
274
+ parts.push(`<w:p><w:pPr><w:jc w:val="center"/></w:pPr><w:r><w:rPr/><w:drawing><wp:inline distT="0" distB="0" distL="0" distR="0" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"><wp:extent cx="${emuW}" cy="${emuH}"/><wp:effectExtent l="0" t="0" r="0" b="0"/><wp:docPr id="${imgRefs.length}" name="Image${imgRefs.length}" descr="${xe(alt)}"/><wp:cNvGraphicFramePr><a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/></wp:cNvGraphicFramePr><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:nvPicPr><pic:cNvPr id="${imgRefs.length}" name="Image${imgRefs.length}"/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed="${rId}" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="${emuW}" cy="${emuH}"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r></w:p>`);
275
+ // Caption
276
+ if (alt)
277
+ parts.push(para('Caption', `<w:r><w:t>${xe(alt)}</w:t></w:r>`));
278
+ }
279
+ catch { /* skip missing image */ }
280
+ }
281
+ continue;
282
+ }
283
+ // Empty line
284
+ if (!line.trim()) {
285
+ closeList();
286
+ parts.push(`<w:p/>`);
287
+ continue;
288
+ }
289
+ // Normal paragraph
290
+ closeList();
291
+ parts.push(para('Normal', inlineRuns(line)));
292
+ }
293
+ if (inCode && codeBuf) {
294
+ for (const cl of codeBuf.split('\n')) {
295
+ parts.push(`<w:p><w:pPr><w:pStyle w:val="Code"/></w:pPr><w:r><w:t xml:space="preserve">${xe(cl)}</w:t></w:r></w:p>`);
296
+ }
297
+ }
298
+ return parts.join('\n');
299
+ }
300
+ function buildDocx(features, projectRoot) {
301
+ const zip = new ZipBuilder();
302
+ // Collect all image refs across all features
303
+ const allImgRefs = [];
304
+ const featureBlocks = [];
305
+ for (const f of features) {
306
+ const docDir = path.join(projectRoot, 'docs', 'features', f.key);
307
+ const ssDir = path.join(docDir, 'screenshots');
308
+ // Read latest markdown
309
+ let mdContent = '';
310
+ try {
311
+ const entries = fs.readdirSync(docDir);
312
+ const versions = entries
313
+ .map((e) => { const m = e.match(/^v(\d+)\.md$/); return m ? { file: e, n: parseInt(m[1], 10) } : null; })
314
+ .filter((x) => x !== null)
315
+ .sort((a, b) => b.n - a.n);
316
+ if (versions.length)
317
+ mdContent = fs.readFileSync(path.join(docDir, versions[0].file), 'utf-8');
318
+ }
319
+ catch {
320
+ continue;
321
+ }
322
+ if (!mdContent)
323
+ continue;
324
+ // Feature heading
325
+ featureBlocks.push(para('Heading1', `<w:r><w:t>${xe(f.label)}</w:t></w:r>`));
326
+ featureBlocks.push(mdToOoxml(mdContent, f.key, allImgRefs, ssDir));
327
+ // Page break between features
328
+ featureBlocks.push(`<w:p><w:r><w:br w:type="page"/></w:r></w:p>`);
329
+ }
330
+ // Build relationships for images
331
+ const imgRelsXml = allImgRefs.map((r, i) => `<Relationship Id="${r.rId}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/img${i + 1}${path.extname(r.file) || '.png'}"/>`).join('\n');
332
+ const documentRels = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
333
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
334
+ <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/>
335
+ <Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml"/>
336
+ ${imgRelsXml}
337
+ </Relationships>`;
338
+ const documentXml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
339
+ <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
340
+ xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex"
341
+ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
342
+ xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink"
343
+ xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d"
344
+ xmlns:o="urn:schemas-microsoft-com:office:office"
345
+ xmlns:oel="http://schemas.microsoft.com/office/2019/extlst"
346
+ xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
347
+ xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
348
+ xmlns:v="urn:schemas-microsoft-com:vml"
349
+ xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
350
+ xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
351
+ xmlns:w10="urn:schemas-microsoft-com:office:word"
352
+ xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
353
+ xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
354
+ xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml"
355
+ xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex"
356
+ xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid"
357
+ xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml"
358
+ xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash"
359
+ xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex"
360
+ xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
361
+ xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
362
+ xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
363
+ xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"
364
+ mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh wp14">
365
+ <w:body>
366
+ ${featureBlocks.join('\n')}
367
+ <w:sectPr>
368
+ <w:pgSz w:w="12240" w:h="15840"/>
369
+ <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440" w:header="708" w:footer="708" w:gutter="0"/>
370
+ </w:sectPr>
371
+ </w:body>
372
+ </w:document>`;
373
+ const contentTypes = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
374
+ <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
375
+ <Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
376
+ <Default Extension="xml" ContentType="application/xml"/>
377
+ <Default Extension="png" ContentType="image/png"/>
378
+ <Default Extension="jpg" ContentType="image/jpeg"/>
379
+ <Default Extension="jpeg" ContentType="image/jpeg"/>
380
+ <Default Extension="webp" ContentType="image/webp"/>
381
+ <Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
382
+ <Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>
383
+ <Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/>
384
+ </Types>`;
385
+ const rootRels = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
386
+ <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
387
+ <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/>
388
+ </Relationships>`;
389
+ const stylesXml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
390
+ <w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
391
+ xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
392
+ <w:docDefaults>
393
+ <w:rPrDefault><w:rPr>
394
+ <w:rFonts w:ascii="Calibri" w:hAnsi="Calibri" w:cs="Calibri"/>
395
+ <w:sz w:val="22"/><w:szCs w:val="22"/>
396
+ </w:rPr></w:rPrDefault>
397
+ </w:docDefaults>
398
+ <w:style w:type="paragraph" w:default="1" w:styleId="Normal">
399
+ <w:name w:val="Normal"/>
400
+ <w:pPr><w:spacing w:after="160" w:line="259" w:lineRule="auto"/></w:pPr>
401
+ </w:style>
402
+ <w:style w:type="paragraph" w:styleId="Heading1">
403
+ <w:name w:val="heading 1"/>
404
+ <w:pPr><w:spacing w:before="480" w:after="160"/><w:outlineLvl w:val="0"/></w:pPr>
405
+ <w:rPr><w:b/><w:sz w:val="40"/><w:color w:val="1F2328"/></w:rPr>
406
+ </w:style>
407
+ <w:style w:type="paragraph" w:styleId="Heading2">
408
+ <w:name w:val="heading 2"/>
409
+ <w:pPr><w:spacing w:before="360" w:after="120"/><w:outlineLvl w:val="1"/></w:pPr>
410
+ <w:rPr><w:b/><w:sz w:val="32"/><w:color w:val="1F2328"/></w:rPr>
411
+ </w:style>
412
+ <w:style w:type="paragraph" w:styleId="Heading3">
413
+ <w:name w:val="heading 3"/>
414
+ <w:pPr><w:spacing w:before="280" w:after="80"/><w:outlineLvl w:val="2"/></w:pPr>
415
+ <w:rPr><w:b/><w:sz w:val="26"/><w:color w:val="1F2328"/></w:rPr>
416
+ </w:style>
417
+ <w:style w:type="paragraph" w:styleId="Heading4">
418
+ <w:name w:val="heading 4"/>
419
+ <w:pPr><w:outlineLvl w:val="3"/></w:pPr>
420
+ <w:rPr><w:b/><w:sz w:val="24"/></w:rPr>
421
+ </w:style>
422
+ <w:style w:type="paragraph" w:styleId="Heading5">
423
+ <w:name w:val="heading 5"/>
424
+ <w:pPr><w:outlineLvl w:val="4"/></w:pPr>
425
+ <w:rPr><w:b/><w:sz w:val="22"/></w:rPr>
426
+ </w:style>
427
+ <w:style w:type="paragraph" w:styleId="Heading6">
428
+ <w:name w:val="heading 6"/>
429
+ <w:pPr><w:outlineLvl w:val="5"/></w:pPr>
430
+ <w:rPr><w:b/><w:sz w:val="20"/><w:color w:val="656D76"/></w:rPr>
431
+ </w:style>
432
+ <w:style w:type="paragraph" w:styleId="Code">
433
+ <w:name w:val="Code"/>
434
+ <w:pPr><w:shd w:val="clear" w:color="auto" w:fill="F6F8FA"/><w:spacing w:before="0" w:after="0"/></w:pPr>
435
+ <w:rPr><w:rFonts w:ascii="Courier New" w:hAnsi="Courier New"/><w:sz w:val="18"/></w:rPr>
436
+ </w:style>
437
+ <w:style w:type="paragraph" w:styleId="Caption">
438
+ <w:name w:val="caption"/>
439
+ <w:pPr><w:jc w:val="center"/><w:spacing w:before="80" w:after="160"/></w:pPr>
440
+ <w:rPr><w:i/><w:sz w:val="18"/><w:color w:val="656D76"/></w:rPr>
441
+ </w:style>
442
+ <w:style w:type="paragraph" w:styleId="ListBullet">
443
+ <w:name w:val="List Bullet"/>
444
+ <w:basedOn w:val="Normal"/>
445
+ </w:style>
446
+ <w:style w:type="paragraph" w:styleId="ListNumber">
447
+ <w:name w:val="List Number"/>
448
+ <w:basedOn w:val="Normal"/>
449
+ </w:style>
450
+ <w:style w:type="character" w:styleId="Hyperlink">
451
+ <w:name w:val="Hyperlink"/>
452
+ <w:rPr><w:color w:val="0969DA"/><w:u w:val="single"/></w:rPr>
453
+ </w:style>
454
+ </w:styles>`;
455
+ const numberingXml = `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
456
+ <w:numbering xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
457
+ <w:abstractNum w:abstractNumId="0">
458
+ <w:multiLevelType w:val="hybridMultilevel"/>
459
+ <w:lvl w:ilvl="0"><w:start w:val="1"/><w:numFmt w:val="bullet"/><w:lvlText w:val="•"/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl>
460
+ </w:abstractNum>
461
+ <w:abstractNum w:abstractNumId="1">
462
+ <w:multiLevelType w:val="hybridMultilevel"/>
463
+ <w:lvl w:ilvl="0"><w:start w:val="1"/><w:numFmt w:val="decimal"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl>
464
+ </w:abstractNum>
465
+ <w:num w:numId="1"><w:abstractNumId w:val="0"/></w:num>
466
+ <w:num w:numId="2"><w:abstractNumId w:val="1"/></w:num>
467
+ </w:numbering>`;
468
+ // Pack into ZIP
469
+ zip.add('[Content_Types].xml', Buffer.from(contentTypes, 'utf-8'));
470
+ zip.add('_rels/.rels', Buffer.from(rootRels, 'utf-8'));
471
+ zip.add('word/document.xml', Buffer.from(documentXml, 'utf-8'));
472
+ zip.add('word/_rels/document.xml.rels', Buffer.from(documentRels, 'utf-8'));
473
+ zip.add('word/styles.xml', Buffer.from(stylesXml, 'utf-8'));
474
+ zip.add('word/numbering.xml', Buffer.from(numberingXml, 'utf-8'));
475
+ // Add images
476
+ for (let i = 0; i < allImgRefs.length; i++) {
477
+ const ref = allImgRefs[i];
478
+ const ext = path.extname(ref.file) || '.png';
479
+ try {
480
+ const imgBuf = fs.readFileSync(ref.file);
481
+ zip.add(`word/media/img${i + 1}${ext}`, imgBuf);
482
+ }
483
+ catch { /* skip */ }
484
+ }
485
+ return zip.toBuffer();
486
+ }
487
+ //# sourceMappingURL=docx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx.js","sourceRoot":"","sources":["../src/docx.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,OAAO,EAAE,UAAU,EAA4H,MAAM,YAAY,CAAC;AAElK,UAAU,aAAa;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB;AA+1DD,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAkpE1G"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAO7B,OAAO,EAAE,UAAU,EAA4H,MAAM,YAAY,CAAC;AAGlK,UAAU,aAAa;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB;AA+1DD,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CA+qE1G"}
@@ -45,6 +45,7 @@ const child_process_1 = require("child_process");
45
45
  const readline = __importStar(require("readline"));
46
46
  const chokidar_1 = __importDefault(require("chokidar"));
47
47
  const scanner_1 = require("../scanner");
48
+ const docx_1 = require("../docx");
48
49
  const DASHBOARD_HTML = fs.readFileSync(path.join(__dirname, '../ui/dashboard.html'), 'utf-8');
49
50
  // ─── Agent CLI commands ───────────────────────────────────────────────────────
50
51
  const WIN = process.platform === 'win32';
@@ -3650,6 +3651,46 @@ function startServer({ data: initialData, port, projectRoot }) {
3650
3651
  res.end(JSON.stringify({ configured: !!token, projectName: projName || null }));
3651
3652
  return;
3652
3653
  }
3654
+ // ── Export docs as DOCX ──────────────────────────────────────────────────
3655
+ if (url.startsWith('/api/docs/export/docx') && req.method === 'GET') {
3656
+ try {
3657
+ const urlObj = new URL(url, 'http://localhost');
3658
+ const featureKey = urlObj.searchParams.get('feature');
3659
+ const docReport = currentData.documentation;
3660
+ if (!docReport) {
3661
+ res.writeHead(400, jsonH);
3662
+ res.end(JSON.stringify({ error: 'Documentation not available' }));
3663
+ return;
3664
+ }
3665
+ let features = docReport.features.filter((f) => f.docExists);
3666
+ if (featureKey)
3667
+ features = features.filter((f) => f.key === featureKey);
3668
+ if (!features.length) {
3669
+ res.writeHead(400, jsonH);
3670
+ res.end(JSON.stringify({ error: 'No documented features found' }));
3671
+ return;
3672
+ }
3673
+ const docxBuf = (0, docx_1.buildDocx)(features, projectRoot);
3674
+ const projName = (() => { try {
3675
+ return JSON.parse(fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf-8')).name || 'docs';
3676
+ }
3677
+ catch {
3678
+ return 'docs';
3679
+ } })();
3680
+ const filename = featureKey ? `${featureKey}.docx` : `${projName}-docs.docx`;
3681
+ res.writeHead(200, {
3682
+ 'Content-Type': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
3683
+ 'Content-Disposition': `attachment; filename="${filename}"`,
3684
+ 'Content-Length': docxBuf.length,
3685
+ });
3686
+ res.end(docxBuf);
3687
+ }
3688
+ catch (err) {
3689
+ res.writeHead(500, jsonH);
3690
+ res.end(JSON.stringify({ error: err.message }));
3691
+ }
3692
+ return;
3693
+ }
3653
3694
  // Verify Vercel token before saving
3654
3695
  if (url === '/api/docs/deploy/verify-token' && req.method === 'POST') {
3655
3696
  let body = '';