botdocs 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 (37) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/bin/botdocs.js +6 -0
  4. package/dist/src/builder/chunker.d.ts +41 -0
  5. package/dist/src/builder/chunker.js +139 -0
  6. package/dist/src/builder/embedder.d.ts +26 -0
  7. package/dist/src/builder/embedder.js +75 -0
  8. package/dist/src/builder/index.d.ts +5 -0
  9. package/dist/src/builder/index.js +142 -0
  10. package/dist/src/builder/markdown-processor.d.ts +26 -0
  11. package/dist/src/builder/markdown-processor.js +161 -0
  12. package/dist/src/builder/site-generator.d.ts +24 -0
  13. package/dist/src/builder/site-generator.js +152 -0
  14. package/dist/src/builder/template-engine.d.ts +30 -0
  15. package/dist/src/builder/template-engine.js +77 -0
  16. package/dist/src/builder/vector-db-builder.d.ts +20 -0
  17. package/dist/src/builder/vector-db-builder.js +63 -0
  18. package/dist/src/cli/index.d.ts +1 -0
  19. package/dist/src/cli/index.js +47 -0
  20. package/dist/src/cli/options.d.ts +7 -0
  21. package/dist/src/cli/options.js +5 -0
  22. package/dist/src/types/config.d.ts +24 -0
  23. package/dist/src/types/config.js +16 -0
  24. package/dist/src/types/document.d.ts +20 -0
  25. package/dist/src/types/document.js +1 -0
  26. package/dist/src/types/vector-db.d.ts +21 -0
  27. package/dist/src/types/vector-db.js +1 -0
  28. package/dist-client/assets/chatbox-CmTTiB2Z.js +1 -0
  29. package/dist-client/assets/rag-engine-L2vj3Y0G.js +7 -0
  30. package/dist-client/bundle.js +1 -0
  31. package/package.json +71 -0
  32. package/src/styles/chat.css +420 -0
  33. package/src/styles/main.css +532 -0
  34. package/src/styles/themes.css +78 -0
  35. package/src/templates/doc-page.html +27 -0
  36. package/src/templates/index.html +28 -0
  37. package/src/templates/layout.html +59 -0
@@ -0,0 +1 @@
1
+ const e={},t=function(t,n,o){let r=Promise.resolve();if(n&&n.length>0){let t=function(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:"fulfilled",value:e}),e=>({status:"rejected",reason:e}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),c=(null==o?void 0:o.nonce)||(null==o?void 0:o.getAttribute("nonce"));r=t(n.map(t=>{if((t=function(e){return"/"+e}(t))in e)return;e[t]=!0;const n=t.endsWith(".css"),o=n?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${t}"]${o}`))return;const r=document.createElement("link");return r.rel=n?"stylesheet":"modulepreload",n||(r.as="script"),r.crossOrigin="",r.href=t,c&&r.setAttribute("nonce",c),document.head.appendChild(r),n?new Promise((e,n)=>{r.addEventListener("load",e),r.addEventListener("error",()=>n(new Error(`Unable to preload CSS for ${t}`)))}):void 0}))}function c(e){const t=new Event("vite:preloadError",{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(e=>{for(const t of e||[])"rejected"===t.status&&c(t.reason);return t().catch(c)})},n="botdocs-theme";function o(){const e="dark"===document.documentElement.getAttribute("data-theme")?"light":"dark";r(e),localStorage.setItem(n,e)}function r(e){document.documentElement.setAttribute("data-theme",e)}document.addEventListener("DOMContentLoaded",()=>{!function(){const e=localStorage.getItem(n),t=window.matchMedia("(prefers-color-scheme: dark)").matches;r(e||(t?"dark":"light"));const c=document.querySelector(".theme-toggle");c&&c.addEventListener("click",o),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{localStorage.getItem(n)||r(e.matches?"dark":"light")})}(),function(){const e=window.location.pathname;document.querySelectorAll(".sidebar-nav a").forEach(t=>{const n=t.getAttribute("href");(n===e||"/"===e&&"/index.html"===n)&&t.classList.add("active")}),document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",t=>{t.preventDefault();const n=e.getAttribute("href");if(n&&n.length>1){const e=document.querySelector(n);e&&e.scrollIntoView({behavior:"smooth"})}})})}();document.getElementById("chat-widget")&&t(async()=>{const{initChat:e}=await import("./assets/chatbox-CmTTiB2Z.js");return{initChat:e}},[]).then(({initChat:e})=>{e()})});export{t as _};
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "botdocs",
3
+ "version": "0.1.0",
4
+ "description": "An npm CLI tool that converts markdown documentation into a static website with an optional client-side AI chatbot",
5
+ "author": "usr-wwelsh <https://wwel.sh>",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "botdocs": "./bin/botdocs.js"
9
+ },
10
+ "main": "./dist/src/cli/index.js",
11
+ "type": "module",
12
+ "files": [
13
+ "dist/",
14
+ "dist-client/",
15
+ "bin/",
16
+ "src/templates/",
17
+ "src/styles/",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "build:client": "vite build",
24
+ "dev": "tsc --watch",
25
+ "prepublishOnly": "npm run build && npm run build:client"
26
+ },
27
+ "keywords": [
28
+ "documentation",
29
+ "markdown",
30
+ "static-site",
31
+ "ai",
32
+ "chatbot",
33
+ "rag",
34
+ "llm",
35
+ "cli"
36
+ ],
37
+ "dependencies": {
38
+ "@shikijs/markdown-it": "^1.0.0",
39
+ "@xenova/transformers": "^2.17.0",
40
+ "commander": "^12.0.0",
41
+ "fs-extra": "^11.2.0",
42
+ "glob": "^11.0.0",
43
+ "gray-matter": "^4.0.3",
44
+ "markdown-it": "^14.0.0",
45
+ "markdown-it-anchor": "^9.0.0",
46
+ "markdown-it-emoji": "^3.0.0",
47
+ "markdown-it-footnote": "^4.0.0",
48
+ "markdown-it-github-alerts": "^1.0.1",
49
+ "markdown-it-sub": "^2.0.0",
50
+ "markdown-it-sup": "^2.0.0",
51
+ "markdown-it-task-lists": "^2.1.1",
52
+ "markdown-it-toc-done-right": "^4.2.0",
53
+ "shiki": "^1.0.0"
54
+ },
55
+ "devDependencies": {
56
+ "@types/fs-extra": "^11.0.4",
57
+ "@types/markdown-it": "^13.0.0",
58
+ "@types/node": "^20.11.0",
59
+ "terser": "^5.36.0",
60
+ "typescript": "^5.3.0",
61
+ "vite": "^6.0.0"
62
+ },
63
+ "engines": {
64
+ "node": ">=18.0.0"
65
+ },
66
+ "repository": {
67
+ "type": "git",
68
+ "url": "https://github.com/usr-wwelsh/botdocs.git"
69
+ },
70
+ "homepage": "https://wwel.sh"
71
+ }
@@ -0,0 +1,420 @@
1
+ /* Chat Widget Styles */
2
+
3
+ .chat-widget {
4
+ position: fixed;
5
+ bottom: 2rem;
6
+ right: 2rem;
7
+ z-index: 1000;
8
+ }
9
+
10
+ .chat-toggle {
11
+ width: 4rem;
12
+ height: 4rem;
13
+ border-radius: 50%;
14
+ background: var(--link-color);
15
+ color: white;
16
+ border: none;
17
+ cursor: pointer;
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: center;
21
+ font-size: 2rem;
22
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
23
+ transition: all 0.3s ease;
24
+ }
25
+
26
+ .chat-toggle:hover {
27
+ transform: scale(1.1);
28
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);
29
+ }
30
+
31
+ .chat-container {
32
+ position: absolute;
33
+ bottom: 5rem;
34
+ right: 0;
35
+ width: 400px;
36
+ max-width: calc(100vw - 4rem);
37
+ height: 600px;
38
+ max-height: calc(100vh - 10rem);
39
+ background: var(--bg-primary);
40
+ border: 1px solid var(--border-color);
41
+ border-radius: 1rem;
42
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
43
+ display: flex;
44
+ flex-direction: column;
45
+ overflow: hidden;
46
+ }
47
+
48
+ .chat-header {
49
+ background: var(--link-color);
50
+ color: white;
51
+ padding: 1rem 1.5rem;
52
+ display: flex;
53
+ justify-content: space-between;
54
+ align-items: center;
55
+ border-radius: 1rem 1rem 0 0;
56
+ }
57
+
58
+ .chat-header h3 {
59
+ margin: 0;
60
+ font-size: 1.125rem;
61
+ font-weight: 600;
62
+ color: white;
63
+ }
64
+
65
+ .chat-header-actions {
66
+ display: flex;
67
+ gap: 0.5rem;
68
+ align-items: center;
69
+ }
70
+
71
+ .chat-clear,
72
+ .chat-close {
73
+ background: none;
74
+ border: none;
75
+ color: white;
76
+ font-size: 1.25rem;
77
+ cursor: pointer;
78
+ padding: 0;
79
+ width: 2rem;
80
+ height: 2rem;
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ border-radius: 0.25rem;
85
+ transition: background-color 0.2s;
86
+ }
87
+
88
+ .chat-close {
89
+ font-size: 1.5rem;
90
+ }
91
+
92
+ .chat-clear:hover,
93
+ .chat-close:hover {
94
+ background: rgba(255, 255, 255, 0.2);
95
+ }
96
+
97
+ .chat-messages {
98
+ flex: 1;
99
+ overflow-y: auto;
100
+ padding: 1.5rem;
101
+ display: flex;
102
+ flex-direction: column;
103
+ gap: 1rem;
104
+ }
105
+
106
+ .chat-message {
107
+ display: flex;
108
+ flex-direction: column;
109
+ gap: 0.5rem;
110
+ max-width: 85%;
111
+ animation: slideIn 0.3s ease;
112
+ }
113
+
114
+ @keyframes slideIn {
115
+ from {
116
+ opacity: 0;
117
+ transform: translateY(10px);
118
+ }
119
+ to {
120
+ opacity: 1;
121
+ transform: translateY(0);
122
+ }
123
+ }
124
+
125
+ .chat-message.user {
126
+ align-self: flex-end;
127
+ }
128
+
129
+ .chat-message.assistant {
130
+ align-self: flex-start;
131
+ }
132
+
133
+ .message-content {
134
+ padding: 0.75rem 1rem;
135
+ border-radius: 1rem;
136
+ line-height: 1.5;
137
+ word-wrap: break-word;
138
+ }
139
+
140
+ .chat-message.user .message-content {
141
+ background: var(--link-color);
142
+ color: white;
143
+ border-bottom-right-radius: 0.25rem;
144
+ }
145
+
146
+ .chat-message.assistant .message-content {
147
+ background: var(--bg-secondary);
148
+ color: var(--text-primary);
149
+ border-bottom-left-radius: 0.25rem;
150
+ }
151
+
152
+ /* Markdown content styling */
153
+ .message-content p {
154
+ margin: 0.5rem 0;
155
+ }
156
+
157
+ .message-content p:first-child {
158
+ margin-top: 0;
159
+ }
160
+
161
+ .message-content p:last-child {
162
+ margin-bottom: 0;
163
+ }
164
+
165
+ .message-content h1,
166
+ .message-content h2,
167
+ .message-content h3 {
168
+ margin: 1rem 0 0.5rem 0;
169
+ font-weight: 600;
170
+ line-height: 1.3;
171
+ }
172
+
173
+ .message-content h1:first-child,
174
+ .message-content h2:first-child,
175
+ .message-content h3:first-child {
176
+ margin-top: 0;
177
+ }
178
+
179
+ .message-content h1 {
180
+ font-size: 1.25rem;
181
+ }
182
+
183
+ .message-content h2 {
184
+ font-size: 1.125rem;
185
+ }
186
+
187
+ .message-content h3 {
188
+ font-size: 1rem;
189
+ }
190
+
191
+ .message-content strong {
192
+ font-weight: 600;
193
+ color: var(--text-primary);
194
+ }
195
+
196
+ .message-content em {
197
+ font-style: italic;
198
+ }
199
+
200
+ .message-content code {
201
+ background: rgba(0, 0, 0, 0.08);
202
+ padding: 0.125rem 0.375rem;
203
+ border-radius: 0.25rem;
204
+ font-family: 'Courier New', Courier, monospace;
205
+ font-size: 0.875em;
206
+ }
207
+
208
+ [data-theme='dark'] .message-content code {
209
+ background: rgba(255, 255, 255, 0.1);
210
+ }
211
+
212
+ .message-content pre {
213
+ background: rgba(0, 0, 0, 0.05);
214
+ border: 1px solid var(--border-color);
215
+ border-radius: 0.5rem;
216
+ padding: 0.75rem;
217
+ overflow-x: auto;
218
+ margin: 0.75rem 0;
219
+ }
220
+
221
+ [data-theme='dark'] .message-content pre {
222
+ background: rgba(255, 255, 255, 0.05);
223
+ }
224
+
225
+ .message-content pre code {
226
+ background: none;
227
+ padding: 0;
228
+ border-radius: 0;
229
+ font-size: 0.8125rem;
230
+ line-height: 1.5;
231
+ display: block;
232
+ }
233
+
234
+ .message-content a {
235
+ color: var(--link-color);
236
+ text-decoration: none;
237
+ border-bottom: 1px solid transparent;
238
+ transition: border-color 0.2s;
239
+ }
240
+
241
+ .message-content a:hover {
242
+ border-bottom-color: var(--link-color);
243
+ }
244
+
245
+ .message-content hr {
246
+ border: none;
247
+ border-top: 1px solid var(--border-color);
248
+ margin: 1rem 0;
249
+ opacity: 0.5;
250
+ }
251
+
252
+ .message-content br {
253
+ display: block;
254
+ content: "";
255
+ margin-top: 0.25rem;
256
+ }
257
+
258
+ .message-citations {
259
+ display: flex;
260
+ flex-direction: column;
261
+ gap: 0.5rem;
262
+ margin-top: 0.75rem;
263
+ padding-top: 0.75rem;
264
+ border-top: 1px solid var(--border-color);
265
+ }
266
+
267
+ .citations-label {
268
+ font-size: 0.75rem;
269
+ font-weight: 600;
270
+ color: var(--text-secondary);
271
+ margin-bottom: 0.25rem;
272
+ }
273
+
274
+ .citation-link {
275
+ font-size: 0.75rem;
276
+ color: var(--link-color);
277
+ text-decoration: none;
278
+ padding: 0.5rem 0.75rem;
279
+ background: var(--bg-tertiary);
280
+ border-radius: 0.5rem;
281
+ transition: all 0.2s;
282
+ border: 1px solid transparent;
283
+ display: block;
284
+ }
285
+
286
+ .citation-link:hover {
287
+ background: var(--bg-primary);
288
+ border-color: var(--link-color);
289
+ text-decoration: none;
290
+ transform: translateX(4px);
291
+ }
292
+
293
+ .chat-input-container {
294
+ padding: 1rem 1.5rem;
295
+ border-top: 1px solid var(--border-color);
296
+ background: var(--bg-secondary);
297
+ }
298
+
299
+ .chat-input-wrapper {
300
+ display: flex;
301
+ gap: 0.5rem;
302
+ align-items: center;
303
+ }
304
+
305
+ .chat-input {
306
+ flex: 1;
307
+ padding: 0.75rem 1rem;
308
+ border: 1px solid var(--border-color);
309
+ border-radius: 0.5rem;
310
+ background: var(--bg-primary);
311
+ color: var(--text-primary);
312
+ font-size: 0.875rem;
313
+ font-family: inherit;
314
+ resize: none;
315
+ max-height: 100px;
316
+ }
317
+
318
+ .chat-input:focus {
319
+ outline: none;
320
+ border-color: var(--link-color);
321
+ }
322
+
323
+ .chat-send {
324
+ padding: 0.75rem 1.5rem;
325
+ background: var(--link-color);
326
+ color: white;
327
+ border: none;
328
+ border-radius: 0.5rem;
329
+ cursor: pointer;
330
+ font-weight: 500;
331
+ transition: background-color 0.2s;
332
+ }
333
+
334
+ .chat-send:hover:not(:disabled) {
335
+ background: var(--link-hover);
336
+ }
337
+
338
+ .chat-send:disabled {
339
+ opacity: 0.5;
340
+ cursor: not-allowed;
341
+ }
342
+
343
+ .loading-indicator {
344
+ display: flex;
345
+ gap: 0.5rem;
346
+ padding: 0.75rem 1rem;
347
+ background: var(--bg-secondary);
348
+ border-radius: 1rem;
349
+ max-width: fit-content;
350
+ }
351
+
352
+ .loading-dot {
353
+ width: 0.5rem;
354
+ height: 0.5rem;
355
+ background: var(--text-secondary);
356
+ border-radius: 50%;
357
+ animation: bounce 1.4s infinite ease-in-out both;
358
+ }
359
+
360
+ .loading-dot:nth-child(1) {
361
+ animation-delay: -0.32s;
362
+ }
363
+
364
+ .loading-dot:nth-child(2) {
365
+ animation-delay: -0.16s;
366
+ }
367
+
368
+ @keyframes bounce {
369
+ 0%, 80%, 100% {
370
+ transform: scale(0);
371
+ }
372
+ 40% {
373
+ transform: scale(1);
374
+ }
375
+ }
376
+
377
+ .chat-status {
378
+ padding: 0.75rem 1rem;
379
+ background: var(--bg-tertiary);
380
+ color: var(--text-secondary);
381
+ font-size: 0.875rem;
382
+ text-align: center;
383
+ border-bottom: 1px solid var(--border-color);
384
+ }
385
+
386
+ .progress-bar {
387
+ width: 100%;
388
+ height: 4px;
389
+ background: var(--bg-tertiary);
390
+ border-radius: 2px;
391
+ overflow: hidden;
392
+ margin-top: 0.5rem;
393
+ }
394
+
395
+ .progress-fill {
396
+ height: 100%;
397
+ background: var(--link-color);
398
+ transition: width 0.3s ease;
399
+ }
400
+
401
+ /* Mobile responsiveness */
402
+ @media (max-width: 768px) {
403
+ .chat-widget {
404
+ bottom: 1rem;
405
+ right: 1rem;
406
+ }
407
+
408
+ .chat-container {
409
+ width: calc(100vw - 2rem);
410
+ height: calc(100vh - 8rem);
411
+ bottom: 4rem;
412
+ right: 0;
413
+ }
414
+
415
+ .chat-toggle {
416
+ width: 3.5rem;
417
+ height: 3.5rem;
418
+ font-size: 1.5rem;
419
+ }
420
+ }