@brainfish-ai/devdoc 0.1.41 → 0.1.43

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 (400) hide show
  1. package/ai-agents/.claude/skills/bootstrap-docs/SKILL.md +710 -79
  2. package/ai-agents/.claude/skills/check-docs/SKILL.md +83 -8
  3. package/ai-agents/.claude/skills/create-doc/SKILL.md +267 -55
  4. package/ai-agents/.claude/skills/update-doc/SKILL.md +162 -63
  5. package/ai-agents/.cursor/rules/devdoc-bootstrap.mdc +145 -15
  6. package/ai-agents/.cursor/rules/devdoc-create.mdc +108 -57
  7. package/ai-agents/.cursor/rules/devdoc-update.mdc +93 -70
  8. package/ai-agents/.cursor/rules/devdoc.mdc +21 -0
  9. package/ai-agents/schemas/docs.schema.json +332 -0
  10. package/ai-agents/schemas/theme.schema.json +243 -0
  11. package/dist/cli/commands/create.js +4 -9
  12. package/dist/cli/commands/deploy.js +50 -25
  13. package/dist/cli/commands/dev.js +19 -10
  14. package/package.json +3 -2
  15. package/renderer/app/api/assets/[...path]/route.js +108 -0
  16. package/renderer/app/api/assets/route.js +114 -0
  17. package/renderer/app/api/assets/upload/route.js +163 -0
  18. package/renderer/app/api/auth-schemes/route.js +58 -0
  19. package/renderer/app/api/chat/route.js +759 -0
  20. package/renderer/app/api/codegen/route.js +52 -0
  21. package/renderer/app/api/collections/route.js +675 -0
  22. package/renderer/app/api/debug/route.js +47 -0
  23. package/renderer/app/api/deploy/route.js +199 -0
  24. package/renderer/app/api/device/route.js +36 -0
  25. package/renderer/app/api/docs/route.js +205 -0
  26. package/renderer/app/api/domains/add/route.js +121 -0
  27. package/renderer/app/api/domains/lookup/route.js +43 -0
  28. package/renderer/app/api/domains/remove/route.js +89 -0
  29. package/renderer/app/api/domains/status/route.js +140 -0
  30. package/renderer/app/api/domains/verify/route.js +168 -0
  31. package/renderer/app/api/keys/regenerate/route.js +71 -0
  32. package/renderer/app/api/local-assets/[...path]/route.js +108 -0
  33. package/renderer/app/api/openapi-spec/route.js +73 -0
  34. package/renderer/app/api/projects/[slug]/route.js +129 -0
  35. package/renderer/app/api/projects/[slug]/stats/route.js +80 -0
  36. package/renderer/app/api/projects/register/route.js +176 -0
  37. package/renderer/app/api/proxy/route.js +139 -0
  38. package/renderer/app/api/proxy-stream/route.js +156 -0
  39. package/renderer/app/api/redirects/route.js +35 -0
  40. package/renderer/app/api/schema/route.js +85 -0
  41. package/renderer/app/api/subdomains/check/route.js +158 -0
  42. package/renderer/app/api/suggestions/route.js +175 -0
  43. package/renderer/app/layout.js +47 -0
  44. package/renderer/app/llms-full.txt/route.js +257 -0
  45. package/renderer/app/llms.txt/route.js +219 -0
  46. package/renderer/app/page.js +12 -0
  47. package/renderer/app/robots.txt/route.js +66 -0
  48. package/renderer/app/sitemap.xml/route.js +145 -0
  49. package/renderer/components/docs/index.js +8 -0
  50. package/renderer/components/docs/mdx/accordion.js +113 -0
  51. package/renderer/components/docs/mdx/badge.js +72 -0
  52. package/renderer/components/docs/mdx/callouts.js +137 -0
  53. package/renderer/components/docs/mdx/cards.js +175 -0
  54. package/renderer/components/docs/mdx/changelog.js +100 -0
  55. package/renderer/components/docs/mdx/code-block.js +147 -0
  56. package/renderer/components/docs/mdx/code-group.js +287 -0
  57. package/renderer/components/docs/mdx/file-embeds.js +82 -0
  58. package/renderer/components/docs/mdx/frame.js +59 -0
  59. package/renderer/components/docs/mdx/highlight.js +90 -0
  60. package/renderer/components/docs/mdx/iframe.js +69 -0
  61. package/renderer/components/docs/mdx/image.js +135 -0
  62. package/renderer/components/docs/mdx/index.js +134 -0
  63. package/renderer/components/docs/mdx/landing.js +315 -0
  64. package/renderer/components/docs/mdx/mermaid.js +212 -0
  65. package/renderer/components/docs/mdx/param-field.js +112 -0
  66. package/renderer/components/docs/mdx/steps.js +74 -0
  67. package/renderer/components/docs/mdx/tabs.js +50 -0
  68. package/renderer/components/docs/mdx-renderer.js +77 -0
  69. package/renderer/components/docs/navigation/breadcrumbs.js +64 -0
  70. package/renderer/components/docs/navigation/index.js +6 -0
  71. package/renderer/components/docs/navigation/page-nav.js +57 -0
  72. package/renderer/components/docs/navigation/sidebar.js +375 -0
  73. package/renderer/components/docs/navigation/toc.js +89 -0
  74. package/renderer/components/docs/notice.js +77 -0
  75. package/renderer/components/docs-header.js +202 -0
  76. package/renderer/components/docs-viewer/agent/agent-chat.js +1930 -0
  77. package/renderer/components/docs-viewer/agent/cards/debug-context-card.js +107 -0
  78. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.js +57 -0
  79. package/renderer/components/docs-viewer/agent/cards/index.js +45 -0
  80. package/renderer/components/docs-viewer/agent/cards/response-options-card.js +154 -0
  81. package/renderer/components/docs-viewer/agent/cards/types.js +22 -0
  82. package/renderer/components/docs-viewer/agent/chat-message.js +2 -0
  83. package/renderer/components/docs-viewer/agent/index.js +4 -0
  84. package/renderer/components/docs-viewer/agent/messages/assistant-message.js +108 -0
  85. package/renderer/components/docs-viewer/agent/messages/chat-message.js +34 -0
  86. package/renderer/components/docs-viewer/agent/messages/index.js +6 -0
  87. package/renderer/components/docs-viewer/agent/messages/tool-call-display.js +1065 -0
  88. package/renderer/components/docs-viewer/agent/messages/types.js +2 -0
  89. package/renderer/components/docs-viewer/agent/messages/typing-indicator.js +26 -0
  90. package/renderer/components/docs-viewer/agent/messages/user-message.js +37 -0
  91. package/renderer/components/docs-viewer/code-editor/{index.tsx → index.js} +1 -1
  92. package/renderer/components/docs-viewer/code-editor/notes-mode.js +1338 -0
  93. package/renderer/components/docs-viewer/content/changelog-page.js +297 -0
  94. package/renderer/components/docs-viewer/content/doc-page.js +264 -0
  95. package/renderer/components/docs-viewer/content/documentation-viewer.js +14 -0
  96. package/renderer/components/docs-viewer/content/index.js +29 -0
  97. package/renderer/components/docs-viewer/content/not-found-page.js +300 -0
  98. package/renderer/components/docs-viewer/content/request-details.js +528 -0
  99. package/renderer/components/docs-viewer/content/sections/auth.js +108 -0
  100. package/renderer/components/docs-viewer/content/sections/body.js +80 -0
  101. package/renderer/components/docs-viewer/content/sections/headers.js +64 -0
  102. package/renderer/components/docs-viewer/content/sections/overview.js +56 -0
  103. package/renderer/components/docs-viewer/content/sections/parameters.js +64 -0
  104. package/renderer/components/docs-viewer/content/sections/responses.js +91 -0
  105. package/renderer/components/docs-viewer/global-auth-modal.js +427 -0
  106. package/renderer/components/docs-viewer/index.js +1552 -0
  107. package/renderer/components/docs-viewer/playground/auth-editor.js +418 -0
  108. package/renderer/components/docs-viewer/playground/body-editor.js +240 -0
  109. package/renderer/components/docs-viewer/playground/code-editor.js +135 -0
  110. package/renderer/components/docs-viewer/playground/code-snippet.js +393 -0
  111. package/renderer/components/docs-viewer/playground/graphql-playground.js +734 -0
  112. package/renderer/components/docs-viewer/playground/index.js +682 -0
  113. package/renderer/components/docs-viewer/playground/key-value-editor.js +317 -0
  114. package/renderer/components/docs-viewer/playground/method-selector.js +65 -0
  115. package/renderer/components/docs-viewer/playground/request-builder.js +181 -0
  116. package/renderer/components/docs-viewer/playground/request-tabs.js +240 -0
  117. package/renderer/components/docs-viewer/playground/response-cards/idle-card.js +42 -0
  118. package/renderer/components/docs-viewer/playground/response-cards/index.js +72 -0
  119. package/renderer/components/docs-viewer/playground/response-cards/loading-card.js +24 -0
  120. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.js +28 -0
  121. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.js +308 -0
  122. package/renderer/components/docs-viewer/playground/response-cards/types.js +9 -0
  123. package/renderer/components/docs-viewer/playground/response-viewer.js +18 -0
  124. package/renderer/components/docs-viewer/search/index.js +2 -0
  125. package/renderer/components/docs-viewer/search/search-dialog.js +367 -0
  126. package/renderer/components/docs-viewer/search/use-search.js +89 -0
  127. package/renderer/components/docs-viewer/shared/markdown-renderer.js +423 -0
  128. package/renderer/components/docs-viewer/shared/method-badge.js +23 -0
  129. package/renderer/components/docs-viewer/shared/schema-viewer.js +321 -0
  130. package/renderer/components/docs-viewer/sidebar/collection-tree.js +222 -0
  131. package/renderer/components/docs-viewer/sidebar/endpoint-options.js +512 -0
  132. package/renderer/components/docs-viewer/sidebar/index.js +196 -0
  133. package/renderer/components/docs-viewer/sidebar/right-sidebar.js +163 -0
  134. package/renderer/components/docs-viewer/sidebar/sidebar-group.js +87 -0
  135. package/renderer/components/docs-viewer/sidebar/sidebar-item.js +172 -0
  136. package/renderer/components/docs-viewer/sidebar/sidebar-section.js +31 -0
  137. package/renderer/components/theme-provider.js +10 -0
  138. package/renderer/components/theme-toggle.js +106 -0
  139. package/renderer/components/ui/badge.js +29 -0
  140. package/renderer/components/ui/button.js +40 -0
  141. package/renderer/components/ui/dialog.js +50 -0
  142. package/renderer/components/ui/dropdown-menu.js +143 -0
  143. package/renderer/components/ui/input.js +12 -0
  144. package/renderer/components/ui/label.js +13 -0
  145. package/renderer/components/ui/navigation-menu.js +83 -0
  146. package/renderer/components/ui/select.js +116 -0
  147. package/renderer/components/ui/spinner.js +92 -0
  148. package/renderer/components/ui/tabs.js +34 -0
  149. package/renderer/components/ui/tooltip.js +43 -0
  150. package/renderer/hooks/use-code-copy.js +76 -0
  151. package/renderer/hooks/use-openapi-title.js +33 -0
  152. package/renderer/lib/api-docs/agent/index.js +4 -0
  153. package/renderer/lib/api-docs/agent/indexer.js +254 -0
  154. package/renderer/lib/api-docs/agent/spec-summary.js +227 -0
  155. package/renderer/lib/api-docs/agent/types.js +5 -0
  156. package/renderer/lib/api-docs/auth/auth-context.js +157 -0
  157. package/renderer/lib/api-docs/auth/auth-storage.js +66 -0
  158. package/renderer/lib/api-docs/auth/crypto.js +64 -0
  159. package/renderer/lib/api-docs/auth/index.js +3 -0
  160. package/renderer/lib/api-docs/code-editor/db.js +145 -0
  161. package/renderer/lib/api-docs/code-editor/hooks.js +254 -0
  162. package/renderer/lib/api-docs/code-editor/{index.ts → index.js} +3 -4
  163. package/renderer/lib/api-docs/code-editor/mode-context.js +154 -0
  164. package/renderer/lib/api-docs/code-editor/types.js +53 -0
  165. package/renderer/lib/api-docs/codegen/definitions.js +258 -0
  166. package/renderer/lib/api-docs/codegen/har.js +171 -0
  167. package/renderer/lib/api-docs/codegen/index.js +118 -0
  168. package/renderer/lib/api-docs/factories.js +136 -0
  169. package/renderer/lib/api-docs/{index.ts → index.js} +5 -10
  170. package/renderer/lib/api-docs/mobile-context.js +79 -0
  171. package/renderer/lib/api-docs/navigation-context.js +62 -0
  172. package/renderer/lib/api-docs/parsers/graphql/index.js +50 -0
  173. package/renderer/lib/api-docs/parsers/graphql/parser.js +350 -0
  174. package/renderer/lib/api-docs/parsers/graphql/transformer.js +215 -0
  175. package/renderer/lib/api-docs/parsers/graphql/types.js +46 -0
  176. package/renderer/lib/api-docs/parsers/openapi/dereferencer.js +43 -0
  177. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.js +486 -0
  178. package/renderer/lib/api-docs/parsers/openapi/extractors/body.js +295 -0
  179. package/renderer/lib/api-docs/parsers/openapi/extractors/index.js +132 -0
  180. package/renderer/lib/api-docs/parsers/openapi/index.js +127 -0
  181. package/renderer/lib/api-docs/parsers/openapi/transformer.js +192 -0
  182. package/renderer/lib/api-docs/parsers/openapi/validator.js +24 -0
  183. package/renderer/lib/api-docs/playground/context.js +65 -0
  184. package/renderer/lib/api-docs/playground/navigation-context.js +74 -0
  185. package/renderer/lib/api-docs/playground/request-builder.js +163 -0
  186. package/renderer/lib/api-docs/playground/request-runner.js +224 -0
  187. package/renderer/lib/api-docs/playground/types.js +5 -0
  188. package/renderer/lib/api-docs/types.js +23 -0
  189. package/renderer/lib/api-docs/utils.js +212 -0
  190. package/renderer/lib/cache.js +157 -0
  191. package/renderer/lib/docs/config/domain-schema.js +161 -0
  192. package/renderer/lib/docs/config/index.js +5 -0
  193. package/renderer/lib/docs/config/loader.js +113 -0
  194. package/renderer/lib/docs/config/schema.js +269 -0
  195. package/renderer/lib/docs/index.js +8 -0
  196. package/renderer/lib/docs/mdx/compiler.js +128 -0
  197. package/renderer/lib/docs/mdx/frontmatter.js +73 -0
  198. package/renderer/lib/docs/mdx/index.js +8 -0
  199. package/renderer/lib/docs/navigation/generator.js +269 -0
  200. package/renderer/lib/docs/navigation/index.js +4 -0
  201. package/renderer/lib/docs/navigation/types.js +9 -0
  202. package/renderer/lib/docs-navigation-context.js +40 -0
  203. package/renderer/lib/multi-tenant/context.js +80 -0
  204. package/renderer/lib/storage/blob.js +767 -0
  205. package/renderer/lib/utils/icons.js +30 -0
  206. package/renderer/lib/utils.js +5 -0
  207. package/renderer/next.config.js +62 -0
  208. package/renderer/tsconfig.json +23 -5
  209. package/renderer/app/api/assets/[...path]/route.ts +0 -123
  210. package/renderer/app/api/assets/route.ts +0 -124
  211. package/renderer/app/api/assets/upload/route.ts +0 -177
  212. package/renderer/app/api/auth-schemes/route.ts +0 -77
  213. package/renderer/app/api/chat/route.ts +0 -858
  214. package/renderer/app/api/codegen/route.ts +0 -72
  215. package/renderer/app/api/collections/route.ts +0 -1002
  216. package/renderer/app/api/debug/route.ts +0 -53
  217. package/renderer/app/api/deploy/route.ts +0 -234
  218. package/renderer/app/api/device/route.ts +0 -42
  219. package/renderer/app/api/docs/route.ts +0 -201
  220. package/renderer/app/api/domains/add/route.ts +0 -132
  221. package/renderer/app/api/domains/lookup/route.ts +0 -43
  222. package/renderer/app/api/domains/remove/route.ts +0 -100
  223. package/renderer/app/api/domains/status/route.ts +0 -158
  224. package/renderer/app/api/domains/verify/route.ts +0 -181
  225. package/renderer/app/api/keys/regenerate/route.ts +0 -80
  226. package/renderer/app/api/local-assets/[...path]/route.ts +0 -122
  227. package/renderer/app/api/openapi-spec/route.ts +0 -151
  228. package/renderer/app/api/projects/[slug]/route.ts +0 -153
  229. package/renderer/app/api/projects/[slug]/stats/route.ts +0 -96
  230. package/renderer/app/api/projects/register/route.ts +0 -152
  231. package/renderer/app/api/proxy/route.ts +0 -149
  232. package/renderer/app/api/proxy-stream/route.ts +0 -168
  233. package/renderer/app/api/redirects/route.ts +0 -47
  234. package/renderer/app/api/schema/route.ts +0 -73
  235. package/renderer/app/api/subdomains/check/route.ts +0 -172
  236. package/renderer/app/api/suggestions/route.ts +0 -144
  237. package/renderer/app/layout.tsx +0 -54
  238. package/renderer/app/llms-full.txt/route.ts +0 -346
  239. package/renderer/app/llms.txt/route.ts +0 -279
  240. package/renderer/app/page.tsx +0 -14
  241. package/renderer/app/robots.txt/route.ts +0 -84
  242. package/renderer/app/sitemap.xml/route.ts +0 -199
  243. package/renderer/components/docs/index.ts +0 -12
  244. package/renderer/components/docs/mdx/accordion.tsx +0 -169
  245. package/renderer/components/docs/mdx/badge.tsx +0 -132
  246. package/renderer/components/docs/mdx/callouts.tsx +0 -154
  247. package/renderer/components/docs/mdx/cards.tsx +0 -241
  248. package/renderer/components/docs/mdx/changelog.tsx +0 -120
  249. package/renderer/components/docs/mdx/code-block.tsx +0 -186
  250. package/renderer/components/docs/mdx/code-group.tsx +0 -421
  251. package/renderer/components/docs/mdx/file-embeds.tsx +0 -105
  252. package/renderer/components/docs/mdx/frame.tsx +0 -112
  253. package/renderer/components/docs/mdx/highlight.tsx +0 -151
  254. package/renderer/components/docs/mdx/iframe.tsx +0 -134
  255. package/renderer/components/docs/mdx/image.tsx +0 -235
  256. package/renderer/components/docs/mdx/index.ts +0 -237
  257. package/renderer/components/docs/mdx/landing.tsx +0 -684
  258. package/renderer/components/docs/mdx/mermaid.tsx +0 -240
  259. package/renderer/components/docs/mdx/param-field.tsx +0 -200
  260. package/renderer/components/docs/mdx/steps.tsx +0 -113
  261. package/renderer/components/docs/mdx/tabs.tsx +0 -86
  262. package/renderer/components/docs/mdx-renderer.tsx +0 -100
  263. package/renderer/components/docs/navigation/breadcrumbs.tsx +0 -76
  264. package/renderer/components/docs/navigation/index.ts +0 -8
  265. package/renderer/components/docs/navigation/page-nav.tsx +0 -64
  266. package/renderer/components/docs/navigation/sidebar.tsx +0 -515
  267. package/renderer/components/docs/navigation/toc.tsx +0 -113
  268. package/renderer/components/docs/notice.tsx +0 -105
  269. package/renderer/components/docs-header.tsx +0 -278
  270. package/renderer/components/docs-viewer/agent/agent-chat.tsx +0 -2076
  271. package/renderer/components/docs-viewer/agent/cards/debug-context-card.tsx +0 -90
  272. package/renderer/components/docs-viewer/agent/cards/endpoint-context-card.tsx +0 -49
  273. package/renderer/components/docs-viewer/agent/cards/index.tsx +0 -50
  274. package/renderer/components/docs-viewer/agent/cards/response-options-card.tsx +0 -212
  275. package/renderer/components/docs-viewer/agent/cards/types.ts +0 -84
  276. package/renderer/components/docs-viewer/agent/chat-message.tsx +0 -17
  277. package/renderer/components/docs-viewer/agent/index.tsx +0 -6
  278. package/renderer/components/docs-viewer/agent/messages/assistant-message.tsx +0 -119
  279. package/renderer/components/docs-viewer/agent/messages/chat-message.tsx +0 -46
  280. package/renderer/components/docs-viewer/agent/messages/index.ts +0 -17
  281. package/renderer/components/docs-viewer/agent/messages/tool-call-display.tsx +0 -721
  282. package/renderer/components/docs-viewer/agent/messages/types.ts +0 -61
  283. package/renderer/components/docs-viewer/agent/messages/typing-indicator.tsx +0 -24
  284. package/renderer/components/docs-viewer/agent/messages/user-message.tsx +0 -51
  285. package/renderer/components/docs-viewer/code-editor/notes-mode.tsx +0 -1283
  286. package/renderer/components/docs-viewer/content/changelog-page.tsx +0 -331
  287. package/renderer/components/docs-viewer/content/doc-page.tsx +0 -367
  288. package/renderer/components/docs-viewer/content/documentation-viewer.tsx +0 -17
  289. package/renderer/components/docs-viewer/content/index.tsx +0 -29
  290. package/renderer/components/docs-viewer/content/not-found-page.tsx +0 -330
  291. package/renderer/components/docs-viewer/content/request-details.tsx +0 -330
  292. package/renderer/components/docs-viewer/content/sections/auth.tsx +0 -69
  293. package/renderer/components/docs-viewer/content/sections/body.tsx +0 -66
  294. package/renderer/components/docs-viewer/content/sections/headers.tsx +0 -43
  295. package/renderer/components/docs-viewer/content/sections/overview.tsx +0 -40
  296. package/renderer/components/docs-viewer/content/sections/parameters.tsx +0 -43
  297. package/renderer/components/docs-viewer/content/sections/responses.tsx +0 -87
  298. package/renderer/components/docs-viewer/global-auth-modal.tsx +0 -352
  299. package/renderer/components/docs-viewer/index.tsx +0 -1662
  300. package/renderer/components/docs-viewer/playground/auth-editor.tsx +0 -280
  301. package/renderer/components/docs-viewer/playground/body-editor.tsx +0 -221
  302. package/renderer/components/docs-viewer/playground/code-editor.tsx +0 -224
  303. package/renderer/components/docs-viewer/playground/code-snippet.tsx +0 -387
  304. package/renderer/components/docs-viewer/playground/graphql-playground.tsx +0 -745
  305. package/renderer/components/docs-viewer/playground/index.tsx +0 -671
  306. package/renderer/components/docs-viewer/playground/key-value-editor.tsx +0 -261
  307. package/renderer/components/docs-viewer/playground/method-selector.tsx +0 -60
  308. package/renderer/components/docs-viewer/playground/request-builder.tsx +0 -179
  309. package/renderer/components/docs-viewer/playground/request-tabs.tsx +0 -237
  310. package/renderer/components/docs-viewer/playground/response-cards/idle-card.tsx +0 -21
  311. package/renderer/components/docs-viewer/playground/response-cards/index.tsx +0 -93
  312. package/renderer/components/docs-viewer/playground/response-cards/loading-card.tsx +0 -16
  313. package/renderer/components/docs-viewer/playground/response-cards/network-error-card.tsx +0 -23
  314. package/renderer/components/docs-viewer/playground/response-cards/response-body-card.tsx +0 -268
  315. package/renderer/components/docs-viewer/playground/response-cards/types.ts +0 -82
  316. package/renderer/components/docs-viewer/playground/response-viewer.tsx +0 -43
  317. package/renderer/components/docs-viewer/search/index.ts +0 -2
  318. package/renderer/components/docs-viewer/search/search-dialog.tsx +0 -331
  319. package/renderer/components/docs-viewer/search/use-search.ts +0 -117
  320. package/renderer/components/docs-viewer/shared/markdown-renderer.tsx +0 -431
  321. package/renderer/components/docs-viewer/shared/method-badge.tsx +0 -41
  322. package/renderer/components/docs-viewer/shared/schema-viewer.tsx +0 -349
  323. package/renderer/components/docs-viewer/sidebar/collection-tree.tsx +0 -259
  324. package/renderer/components/docs-viewer/sidebar/endpoint-options.tsx +0 -316
  325. package/renderer/components/docs-viewer/sidebar/index.tsx +0 -282
  326. package/renderer/components/docs-viewer/sidebar/right-sidebar.tsx +0 -202
  327. package/renderer/components/docs-viewer/sidebar/sidebar-group.tsx +0 -118
  328. package/renderer/components/docs-viewer/sidebar/sidebar-item.tsx +0 -212
  329. package/renderer/components/docs-viewer/sidebar/sidebar-section.tsx +0 -38
  330. package/renderer/components/theme-provider.tsx +0 -11
  331. package/renderer/components/theme-toggle.tsx +0 -76
  332. package/renderer/components/ui/badge.tsx +0 -46
  333. package/renderer/components/ui/button.tsx +0 -59
  334. package/renderer/components/ui/dialog.tsx +0 -118
  335. package/renderer/components/ui/dropdown-menu.tsx +0 -257
  336. package/renderer/components/ui/input.tsx +0 -21
  337. package/renderer/components/ui/label.tsx +0 -24
  338. package/renderer/components/ui/navigation-menu.tsx +0 -168
  339. package/renderer/components/ui/select.tsx +0 -190
  340. package/renderer/components/ui/spinner.tsx +0 -114
  341. package/renderer/components/ui/tabs.tsx +0 -66
  342. package/renderer/components/ui/tooltip.tsx +0 -61
  343. package/renderer/hooks/use-code-copy.ts +0 -88
  344. package/renderer/hooks/use-openapi-title.ts +0 -44
  345. package/renderer/lib/api-docs/agent/index.ts +0 -6
  346. package/renderer/lib/api-docs/agent/indexer.ts +0 -323
  347. package/renderer/lib/api-docs/agent/spec-summary.ts +0 -335
  348. package/renderer/lib/api-docs/agent/types.ts +0 -116
  349. package/renderer/lib/api-docs/auth/auth-context.tsx +0 -225
  350. package/renderer/lib/api-docs/auth/auth-storage.ts +0 -87
  351. package/renderer/lib/api-docs/auth/crypto.ts +0 -89
  352. package/renderer/lib/api-docs/auth/index.ts +0 -4
  353. package/renderer/lib/api-docs/code-editor/db.ts +0 -164
  354. package/renderer/lib/api-docs/code-editor/hooks.ts +0 -266
  355. package/renderer/lib/api-docs/code-editor/mode-context.tsx +0 -207
  356. package/renderer/lib/api-docs/code-editor/types.ts +0 -105
  357. package/renderer/lib/api-docs/codegen/definitions.ts +0 -297
  358. package/renderer/lib/api-docs/codegen/har.ts +0 -251
  359. package/renderer/lib/api-docs/codegen/index.ts +0 -159
  360. package/renderer/lib/api-docs/factories.ts +0 -170
  361. package/renderer/lib/api-docs/mobile-context.tsx +0 -112
  362. package/renderer/lib/api-docs/navigation-context.tsx +0 -88
  363. package/renderer/lib/api-docs/parsers/graphql/README.md +0 -129
  364. package/renderer/lib/api-docs/parsers/graphql/index.ts +0 -91
  365. package/renderer/lib/api-docs/parsers/graphql/parser.ts +0 -491
  366. package/renderer/lib/api-docs/parsers/graphql/transformer.ts +0 -246
  367. package/renderer/lib/api-docs/parsers/graphql/types.ts +0 -283
  368. package/renderer/lib/api-docs/parsers/openapi/README.md +0 -32
  369. package/renderer/lib/api-docs/parsers/openapi/dereferencer.ts +0 -60
  370. package/renderer/lib/api-docs/parsers/openapi/extractors/auth.ts +0 -574
  371. package/renderer/lib/api-docs/parsers/openapi/extractors/body.ts +0 -403
  372. package/renderer/lib/api-docs/parsers/openapi/extractors/index.ts +0 -232
  373. package/renderer/lib/api-docs/parsers/openapi/index.ts +0 -171
  374. package/renderer/lib/api-docs/parsers/openapi/transformer.ts +0 -278
  375. package/renderer/lib/api-docs/parsers/openapi/validator.ts +0 -31
  376. package/renderer/lib/api-docs/playground/context.tsx +0 -107
  377. package/renderer/lib/api-docs/playground/navigation-context.tsx +0 -124
  378. package/renderer/lib/api-docs/playground/request-builder.ts +0 -223
  379. package/renderer/lib/api-docs/playground/request-runner.ts +0 -282
  380. package/renderer/lib/api-docs/playground/types.ts +0 -35
  381. package/renderer/lib/api-docs/types.ts +0 -269
  382. package/renderer/lib/api-docs/utils.ts +0 -311
  383. package/renderer/lib/cache.ts +0 -193
  384. package/renderer/lib/docs/config/domain-schema.ts +0 -260
  385. package/renderer/lib/docs/config/index.ts +0 -43
  386. package/renderer/lib/docs/config/loader.ts +0 -142
  387. package/renderer/lib/docs/config/schema.ts +0 -308
  388. package/renderer/lib/docs/index.ts +0 -12
  389. package/renderer/lib/docs/mdx/compiler.ts +0 -176
  390. package/renderer/lib/docs/mdx/frontmatter.ts +0 -91
  391. package/renderer/lib/docs/mdx/index.ts +0 -26
  392. package/renderer/lib/docs/navigation/generator.ts +0 -348
  393. package/renderer/lib/docs/navigation/index.ts +0 -12
  394. package/renderer/lib/docs/navigation/types.ts +0 -123
  395. package/renderer/lib/docs-navigation-context.tsx +0 -80
  396. package/renderer/lib/multi-tenant/context.ts +0 -105
  397. package/renderer/lib/storage/blob.ts +0 -1083
  398. package/renderer/lib/utils/icons.ts +0 -48
  399. package/renderer/lib/utils.ts +0 -6
  400. package/renderer/next.config.ts +0 -76
@@ -1,348 +0,0 @@
1
- import { relative, basename, extname } from 'path'
2
- import {
3
- type DocsConfig,
4
- type NavigationTab,
5
- type NavigationGroup,
6
- resolvePagePath,
7
- loadPageContent,
8
- } from '../config'
9
- import { extractFrontmatter, safeParseFrontmatter } from '../mdx'
10
- import type {
11
- Navigation,
12
- NavTab,
13
- NavGroup,
14
- NavItem,
15
- PageNavContext,
16
- BreadcrumbItem,
17
- PageMeta,
18
- } from './types'
19
-
20
- /**
21
- * Navigation Generator
22
- *
23
- * Builds navigation structure from docs.json configuration
24
- */
25
-
26
- /**
27
- * Generate navigation from configuration
28
- */
29
- export function generateNavigation(
30
- config: DocsConfig,
31
- docsDir: string
32
- ): Navigation {
33
- const nav = config.navigation
34
- const navigation: Navigation = {}
35
-
36
- // Handle tabbed navigation
37
- if (nav.tabs && nav.tabs.length > 0) {
38
- navigation.tabs = nav.tabs.map(tab => buildNavTab(tab, docsDir))
39
- }
40
-
41
- // Handle single-page navigation (no tabs)
42
- if (nav.groups && nav.groups.length > 0) {
43
- navigation.groups = nav.groups.map(group => buildNavGroup(group, docsDir))
44
- }
45
-
46
- // Add global anchors
47
- if (nav.global?.anchors) {
48
- navigation.anchors = nav.global.anchors.map(anchor => ({
49
- title: anchor.anchor,
50
- href: anchor.href,
51
- icon: anchor.icon,
52
- external: anchor.href.startsWith('http'),
53
- }))
54
- }
55
-
56
- return navigation
57
- }
58
-
59
- /**
60
- * Build a navigation tab
61
- */
62
- function buildNavTab(
63
- tab: NavigationTab,
64
- docsDir: string
65
- ): NavTab {
66
- const slug = tab.tab.toLowerCase().replace(/\s+/g, '-')
67
-
68
- // Only docs tabs have groups
69
- if ('groups' in tab && tab.groups) {
70
- const groups = tab.groups.map(group => buildNavGroup(group, docsDir))
71
- return {
72
- title: tab.tab,
73
- slug,
74
- groups,
75
- }
76
- }
77
-
78
- // For openapi/changelog tabs, return empty groups
79
- return {
80
- title: tab.tab,
81
- slug,
82
- groups: [],
83
- }
84
- }
85
-
86
- /**
87
- * Build a navigation group
88
- */
89
- function buildNavGroup(
90
- group: NavigationGroup,
91
- docsDir: string
92
- ): NavGroup {
93
- const items = group.pages
94
- .map(page => buildNavItemOrGroup(page, docsDir))
95
- .filter((item): item is NavItem | NavGroup => item !== null)
96
-
97
- return {
98
- title: group.group,
99
- icon: group.icon,
100
- items,
101
- collapsible: true,
102
- defaultCollapsed: false,
103
- }
104
- }
105
-
106
- /**
107
- * Build a navigation item or nested group from a page reference
108
- */
109
- function buildNavItemOrGroup(
110
- pageRef: string | { group: string; pages: (string | object)[] },
111
- docsDir: string
112
- ): NavItem | NavGroup | null {
113
- // Handle nested groups
114
- if (typeof pageRef === 'object' && 'group' in pageRef) {
115
- const nestedItems = pageRef.pages
116
- .map(p => buildNavItemOrGroup(p as string | { group: string; pages: (string | object)[] }, docsDir))
117
- .filter((item): item is NavItem | NavGroup => item !== null)
118
-
119
- return {
120
- title: pageRef.group,
121
- items: nestedItems,
122
- collapsible: true,
123
- defaultCollapsed: false,
124
- }
125
- }
126
-
127
- return buildNavItem(pageRef, docsDir)
128
- }
129
-
130
- /**
131
- * Build a navigation item from a page reference
132
- */
133
- function buildNavItem(
134
- pageRef: string,
135
- docsDir: string
136
- ): NavItem | null {
137
- // Check if it's an external link
138
- if (pageRef.startsWith('http://') || pageRef.startsWith('https://')) {
139
- return {
140
- title: pageRef,
141
- href: pageRef,
142
- external: true,
143
- }
144
- }
145
-
146
- // Resolve the page file
147
- const filePath = resolvePagePath(docsDir, pageRef)
148
-
149
- if (!filePath) {
150
- console.warn(`Page not found: ${pageRef}`)
151
- return {
152
- title: pageRef,
153
- href: `/${pageRef}`,
154
- }
155
- }
156
-
157
- // Load and parse frontmatter
158
- try {
159
- const content = loadPageContent(filePath)
160
- const { data } = extractFrontmatter(content)
161
- const frontmatter = safeParseFrontmatter(data)
162
-
163
- // Build URL path
164
- const urlPath = pageRef === 'index' ? '/' : `/${pageRef}`
165
-
166
- return {
167
- title: frontmatter?.sidebarTitle || frontmatter?.title || pageRef,
168
- href: urlPath,
169
- icon: frontmatter?.icon,
170
- deprecated: frontmatter?.deprecated,
171
- }
172
- } catch (error) {
173
- console.warn(`Failed to load page metadata: ${pageRef}`, error)
174
- return {
175
- title: pageRef,
176
- href: `/${pageRef}`,
177
- }
178
- }
179
- }
180
-
181
- /**
182
- * Helper to check if an item is a NavItem (has href)
183
- */
184
- function isNavItem(item: NavItem | NavGroup): item is NavItem {
185
- return 'href' in item && typeof item.href === 'string'
186
- }
187
-
188
- /**
189
- * Recursively collect all NavItems from items array (handles nested groups)
190
- */
191
- function collectNavItems(items: (NavItem | NavGroup)[]): NavItem[] {
192
- const result: NavItem[] = []
193
- for (const item of items) {
194
- if (isNavItem(item)) {
195
- result.push(item)
196
- } else if ('items' in item && Array.isArray(item.items)) {
197
- result.push(...collectNavItems(item.items))
198
- }
199
- }
200
- return result
201
- }
202
-
203
- /**
204
- * Find navigation context for a specific page
205
- */
206
- export function findPageNavContext(
207
- navigation: Navigation,
208
- currentPath: string
209
- ): PageNavContext {
210
- const breadcrumbs: BreadcrumbItem[] = []
211
- let prev: NavItem | undefined
212
- let next: NavItem | undefined
213
- let currentTab: NavTab | undefined
214
- let currentGroup: NavGroup | undefined
215
- let currentItem: NavItem | undefined
216
-
217
- // Normalize path
218
- const normalizedPath = currentPath.startsWith('/') ? currentPath : `/${currentPath}`
219
-
220
- // Flatten all items for prev/next calculation
221
- const allItems: NavItem[] = []
222
-
223
- // Search in tabs
224
- if (navigation.tabs) {
225
- for (const tab of navigation.tabs) {
226
- for (const group of tab.groups) {
227
- const groupItems = collectNavItems(group.items)
228
- allItems.push(...groupItems)
229
-
230
- for (const item of groupItems) {
231
- if (item.href === normalizedPath) {
232
- currentTab = tab
233
- currentGroup = group
234
- currentItem = item
235
-
236
- // Build breadcrumbs
237
- breadcrumbs.push({ title: tab.title, href: `/${tab.slug}` })
238
- breadcrumbs.push({ title: group.title, href: '#' })
239
- breadcrumbs.push({ title: item.title, href: item.href })
240
- }
241
- }
242
- }
243
- }
244
- }
245
-
246
- // Search in groups (non-tabbed)
247
- if (navigation.groups) {
248
- for (const group of navigation.groups) {
249
- const groupItems = collectNavItems(group.items)
250
- allItems.push(...groupItems)
251
-
252
- for (const item of groupItems) {
253
- if (item.href === normalizedPath) {
254
- currentGroup = group
255
- currentItem = item
256
-
257
- // Build breadcrumbs
258
- breadcrumbs.push({ title: group.title, href: '#' })
259
- breadcrumbs.push({ title: item.title, href: item.href })
260
- }
261
- }
262
- }
263
- }
264
-
265
- // Find prev/next
266
- const currentIndex = allItems.findIndex(item => item.href === normalizedPath)
267
- if (currentIndex > 0) {
268
- prev = allItems[currentIndex - 1]
269
- }
270
- if (currentIndex >= 0 && currentIndex < allItems.length - 1) {
271
- next = allItems[currentIndex + 1]
272
- }
273
-
274
- return {
275
- breadcrumbs,
276
- prev,
277
- next,
278
- currentTab,
279
- currentGroup,
280
- currentItem,
281
- }
282
- }
283
-
284
- /**
285
- * Get all page paths from navigation
286
- */
287
- export function getAllPagePaths(navigation: Navigation): string[] {
288
- const paths: string[] = []
289
-
290
- if (navigation.tabs) {
291
- for (const tab of navigation.tabs) {
292
- for (const group of tab.groups) {
293
- const items = collectNavItems(group.items)
294
- for (const item of items) {
295
- if (!item.external) {
296
- paths.push(item.href)
297
- }
298
- }
299
- }
300
- }
301
- }
302
-
303
- if (navigation.groups) {
304
- for (const group of navigation.groups) {
305
- const items = collectNavItems(group.items)
306
- for (const item of items) {
307
- if (!item.external) {
308
- paths.push(item.href)
309
- }
310
- }
311
- }
312
- }
313
-
314
- return paths
315
- }
316
-
317
- /**
318
- * Load page metadata from file
319
- */
320
- export function loadPageMeta(
321
- filePath: string,
322
- docsDir: string
323
- ): PageMeta | null {
324
- try {
325
- const content = loadPageContent(filePath)
326
- const { data } = extractFrontmatter(content)
327
- const frontmatter = safeParseFrontmatter(data)
328
-
329
- // Calculate URL path from file path
330
- const relativePath = relative(docsDir, filePath)
331
- const urlPath = '/' + relativePath
332
- .replace(/\.(mdx?|md)$/, '')
333
- .replace(/\/index$/, '')
334
- .replace(/^index$/, '')
335
-
336
- return {
337
- filePath: relativePath,
338
- urlPath: urlPath || '/',
339
- title: frontmatter?.title || basename(filePath, extname(filePath)),
340
- description: frontmatter?.description,
341
- sidebarTitle: frontmatter?.sidebarTitle,
342
- icon: frontmatter?.icon,
343
- hidden: frontmatter?.hidden,
344
- }
345
- } catch {
346
- return null
347
- }
348
- }
@@ -1,12 +0,0 @@
1
- /**
2
- * Navigation Module Exports
3
- */
4
-
5
- export * from './types'
6
-
7
- export {
8
- generateNavigation,
9
- findPageNavContext,
10
- getAllPagePaths,
11
- loadPageMeta,
12
- } from './generator'
@@ -1,123 +0,0 @@
1
- /**
2
- * Navigation Types
3
- *
4
- * Types for the documentation navigation system
5
- */
6
-
7
- /**
8
- * A navigation item representing a single page
9
- */
10
- export interface NavItem {
11
- /** Display title */
12
- title: string
13
- /** URL path to the page */
14
- href: string
15
- /** Icon name (Phosphor icons) */
16
- icon?: string
17
- /** Whether the page is marked as deprecated */
18
- deprecated?: boolean
19
- /** Whether this is an external link */
20
- external?: boolean
21
- /** Optional badge text */
22
- badge?: string
23
- }
24
-
25
- /**
26
- * A group of navigation items
27
- */
28
- export interface NavGroup {
29
- /** Group title */
30
- title: string
31
- /** Icon for the group */
32
- icon?: string
33
- /** Pages in this group (can include nested groups) */
34
- items: (NavItem | NavGroup)[]
35
- /** Whether the group is collapsible */
36
- collapsible?: boolean
37
- /** Default collapsed state */
38
- defaultCollapsed?: boolean
39
- }
40
-
41
- /**
42
- * A navigation tab (top-level section)
43
- */
44
- export interface NavTab {
45
- /** Tab title */
46
- title: string
47
- /** URL segment for this tab */
48
- slug: string
49
- /** Groups within this tab */
50
- groups: NavGroup[]
51
- /** Icon for the tab */
52
- icon?: string
53
- }
54
-
55
- /**
56
- * Complete navigation structure
57
- */
58
- export interface Navigation {
59
- /** Navigation tabs (if using tabbed navigation) */
60
- tabs?: NavTab[]
61
- /** Groups (if using single-page navigation) */
62
- groups?: NavGroup[]
63
- /** Global anchors (shown on all pages) */
64
- anchors?: NavItem[]
65
- }
66
-
67
- /**
68
- * Breadcrumb item
69
- */
70
- export interface BreadcrumbItem {
71
- title: string
72
- href: string
73
- }
74
-
75
- /**
76
- * Page navigation context
77
- */
78
- export interface PageNavContext {
79
- /** Current page's breadcrumbs */
80
- breadcrumbs: BreadcrumbItem[]
81
- /** Previous page in navigation */
82
- prev?: NavItem
83
- /** Next page in navigation */
84
- next?: NavItem
85
- /** Current tab (if using tabs) */
86
- currentTab?: NavTab
87
- /** Current group */
88
- currentGroup?: NavGroup
89
- /** Current item */
90
- currentItem?: NavItem
91
- }
92
-
93
- /**
94
- * Table of contents item (from page headings)
95
- */
96
- export interface TocItem {
97
- id: string
98
- title: string
99
- level: number
100
- children?: TocItem[]
101
- }
102
-
103
- /**
104
- * Page metadata for navigation
105
- */
106
- export interface PageMeta {
107
- /** File path relative to content directory */
108
- filePath: string
109
- /** URL path */
110
- urlPath: string
111
- /** Page title from frontmatter */
112
- title: string
113
- /** Page description */
114
- description?: string
115
- /** Sidebar title (shorter) */
116
- sidebarTitle?: string
117
- /** Icon name */
118
- icon?: string
119
- /** Whether the page is hidden from navigation */
120
- hidden?: boolean
121
- /** Page order within group */
122
- order?: number
123
- }
@@ -1,80 +0,0 @@
1
- 'use client'
2
-
3
- import React, { createContext, useContext, useCallback } from 'react'
4
-
5
- /**
6
- * Docs Navigation Context
7
- *
8
- * Provides navigation functions for doc components (like Card) to use
9
- * the correct navigation method based on the current view.
10
- *
11
- * In ApiDocs view: Uses hash-based navigation
12
- * In standalone /docs view: Uses Next.js router
13
- */
14
-
15
- interface DocsNavigationContextValue {
16
- // Navigate to a doc page by slug
17
- navigateToPage: (slug: string) => void
18
- // Navigate to an endpoint by ID
19
- navigateToEndpoint: (endpointId: string) => void
20
- // Switch to a different tab
21
- switchToTab: (tabId: string) => void
22
- // Check if we're in the integrated ApiDocs view
23
- isApiDocsView: boolean
24
- // Current active tab
25
- activeTab?: string
26
- }
27
-
28
- const DocsNavigationContext = createContext<DocsNavigationContextValue | null>(null)
29
-
30
- interface DocsNavigationProviderProps {
31
- children: React.ReactNode
32
- onNavigateToPage?: (slug: string) => void
33
- onNavigateToEndpoint?: (endpointId: string) => void
34
- onSwitchTab?: (tabId: string) => void
35
- activeTab?: string
36
- }
37
-
38
- export function DocsNavigationProvider({
39
- children,
40
- onNavigateToPage,
41
- onNavigateToEndpoint,
42
- onSwitchTab,
43
- activeTab,
44
- }: DocsNavigationProviderProps) {
45
- const navigateToPage = useCallback((slug: string) => {
46
- if (onNavigateToPage) {
47
- onNavigateToPage(slug)
48
- }
49
- }, [onNavigateToPage])
50
-
51
- const navigateToEndpoint = useCallback((endpointId: string) => {
52
- if (onNavigateToEndpoint) {
53
- onNavigateToEndpoint(endpointId)
54
- }
55
- }, [onNavigateToEndpoint])
56
-
57
- const switchToTab = useCallback((tabId: string) => {
58
- if (onSwitchTab) {
59
- onSwitchTab(tabId)
60
- }
61
- }, [onSwitchTab])
62
-
63
- return (
64
- <DocsNavigationContext.Provider
65
- value={{
66
- navigateToPage,
67
- navigateToEndpoint,
68
- switchToTab,
69
- isApiDocsView: !!onNavigateToPage,
70
- activeTab,
71
- }}
72
- >
73
- {children}
74
- </DocsNavigationContext.Provider>
75
- )
76
- }
77
-
78
- export function useDocsNavigation() {
79
- return useContext(DocsNavigationContext)
80
- }
@@ -1,105 +0,0 @@
1
- /**
2
- * Multi-tenant project context utilities
3
- * Handles extracting project slug from hostname and managing project context
4
- */
5
-
6
- export interface ProjectContext {
7
- slug: string
8
- isMultiTenant: boolean
9
- hostname: string
10
- }
11
-
12
- /**
13
- * Known hostnames that should use local file system (not multi-tenant)
14
- */
15
- const LOCAL_HOSTNAMES = [
16
- 'localhost',
17
- '127.0.0.1',
18
- '0.0.0.0',
19
- ]
20
-
21
- /**
22
- * The main platform domain
23
- */
24
- const PLATFORM_DOMAIN = process.env.DEVDOC_PLATFORM_DOMAIN || 'devdoc.sh'
25
-
26
- /**
27
- * Extract project context from hostname
28
- *
29
- * Examples:
30
- * - my-docs.devdoc.sh -> { slug: 'my-docs', isMultiTenant: true }
31
- * - localhost:3000 -> { slug: null, isMultiTenant: false }
32
- * - docs.company.com -> { slug: lookup from custom domains, isMultiTenant: true }
33
- */
34
- export function extractProjectContext(hostname: string): ProjectContext {
35
- // Remove port if present
36
- const host = hostname.split(':')[0]
37
-
38
- // Check if it's a local development hostname
39
- if (LOCAL_HOSTNAMES.includes(host)) {
40
- return {
41
- slug: '',
42
- isMultiTenant: false,
43
- hostname: host,
44
- }
45
- }
46
-
47
- // Check if it's a subdomain of the platform domain
48
- if (host.endsWith(`.${PLATFORM_DOMAIN}`)) {
49
- const slug = host.replace(`.${PLATFORM_DOMAIN}`, '')
50
- return {
51
- slug,
52
- isMultiTenant: true,
53
- hostname: host,
54
- }
55
- }
56
-
57
- // Check if it's the main platform domain
58
- if (host === PLATFORM_DOMAIN || host === `www.${PLATFORM_DOMAIN}`) {
59
- return {
60
- slug: '',
61
- isMultiTenant: false,
62
- hostname: host,
63
- }
64
- }
65
-
66
- // Custom domain - need to lookup in database
67
- // For now, return the full hostname as slug placeholder
68
- // This will be resolved via the domains API
69
- return {
70
- slug: host, // Will be resolved to actual slug via custom domains lookup
71
- isMultiTenant: true,
72
- hostname: host,
73
- }
74
- }
75
-
76
- /**
77
- * Check if running in multi-tenant mode
78
- */
79
- export function isMultiTenantMode(): boolean {
80
- return process.env.MULTI_TENANT_MODE === 'true'
81
- }
82
-
83
- /**
84
- * Get the current project slug from environment or context
85
- */
86
- export function getCurrentProjectSlug(): string | null {
87
- return process.env.DEVDOC_PROJECT_SLUG || null
88
- }
89
-
90
- /**
91
- * Build the URL for a project's docs
92
- */
93
- export function getProjectUrl(slug: string): string {
94
- const protocol = process.env.NODE_ENV === 'production' ? 'https' : 'http'
95
- return `${protocol}://${slug}.${PLATFORM_DOMAIN}`
96
- }
97
-
98
- /**
99
- * Validate a project slug format
100
- */
101
- export function isValidSlug(slug: string): boolean {
102
- // Must be lowercase alphanumeric with hyphens, 3-50 chars
103
- const slugRegex = /^[a-z0-9][a-z0-9-]{1,48}[a-z0-9]$/
104
- return slugRegex.test(slug)
105
- }