dev3000 0.0.66 → 0.0.67

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 (212) hide show
  1. package/dist/cdp-monitor.d.ts +4 -1
  2. package/dist/cdp-monitor.d.ts.map +1 -1
  3. package/dist/cdp-monitor.js +35 -1
  4. package/dist/cdp-monitor.js.map +1 -1
  5. package/dist/cli.js +10 -5
  6. package/dist/cli.js.map +1 -1
  7. package/dist/dev-environment.d.ts +2 -0
  8. package/dist/dev-environment.d.ts.map +1 -1
  9. package/dist/dev-environment.js +44 -27
  10. package/dist/dev-environment.js.map +1 -1
  11. package/dist/services/parsers/log-parsers/base.d.ts +1 -1
  12. package/dist/services/parsers/log-parsers/base.d.ts.map +1 -1
  13. package/dist/src/tui-interface-impl.tsx +163 -48
  14. package/dist/tui-interface-impl.d.ts.map +1 -1
  15. package/dist/tui-interface-impl.js +72 -14
  16. package/dist/tui-interface-impl.js.map +1 -1
  17. package/dist/utils/project-name.d.ts +18 -0
  18. package/dist/utils/project-name.d.ts.map +1 -0
  19. package/dist/utils/project-name.js +114 -0
  20. package/dist/utils/project-name.js.map +1 -0
  21. package/dist/utils/timestamp.d.ts +8 -0
  22. package/dist/utils/timestamp.d.ts.map +1 -0
  23. package/dist/utils/timestamp.js +18 -0
  24. package/dist/utils/timestamp.js.map +1 -0
  25. package/mcp-server/.next/BUILD_ID +1 -1
  26. package/mcp-server/.next/app-build-manifest.json +8 -6
  27. package/mcp-server/.next/build-manifest.json +2 -2
  28. package/mcp-server/.next/cache/.tsbuildinfo +1 -1
  29. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000005.sst +0 -0
  30. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000006.sst +0 -0
  31. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000007.sst +0 -0
  32. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000008.sst +0 -0
  33. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000009.meta +0 -0
  34. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000010.meta +0 -0
  35. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000011.meta +0 -0
  36. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000013.meta +0 -0
  37. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000014.sst +0 -0
  38. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000016.sst +0 -0
  39. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000017.meta +0 -0
  40. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000018.meta +0 -0
  41. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000021.sst +0 -0
  42. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000022.sst +0 -0
  43. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000023.meta +0 -0
  44. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000025.meta +0 -0
  45. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000027.sst +0 -0
  46. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000028.sst +0 -0
  47. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000029.sst +0 -0
  48. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000030.sst +0 -0
  49. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000031.meta +0 -0
  50. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000032.meta +0 -0
  51. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000034.meta +0 -0
  52. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000035.meta +0 -0
  53. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000037.sst +0 -0
  54. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000038.sst +0 -0
  55. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000039.sst +0 -0
  56. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000040.sst +0 -0
  57. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000041.meta +0 -0
  58. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000042.meta +0 -0
  59. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000044.meta +0 -0
  60. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000045.meta +0 -0
  61. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000047.sst +0 -0
  62. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000048.sst +0 -0
  63. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000049.sst +0 -0
  64. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000050.sst +0 -0
  65. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000051.meta +0 -0
  66. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000052.meta +0 -0
  67. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000054.meta +0 -0
  68. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000055.meta +0 -0
  69. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000057.sst +0 -0
  70. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000058.sst +0 -0
  71. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000059.sst +0 -0
  72. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000060.sst +0 -0
  73. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000061.meta +0 -0
  74. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000062.meta +0 -0
  75. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000064.meta +0 -0
  76. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000065.meta +0 -0
  77. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000066.sst +0 -0
  78. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000067.meta +0 -0
  79. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000069.sst +0 -0
  80. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000070.sst +0 -0
  81. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000071.sst +0 -0
  82. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000072.sst +0 -0
  83. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000073.sst +0 -0
  84. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000074.meta +0 -0
  85. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000075.meta +0 -0
  86. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000076.meta +0 -0
  87. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000077.meta +0 -0
  88. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000078.meta +0 -0
  89. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000079.sst +0 -0
  90. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000080.sst +0 -0
  91. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000081.sst +0 -0
  92. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000082.sst +0 -0
  93. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000083.sst +0 -0
  94. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000084.meta +0 -0
  95. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000085.meta +0 -0
  96. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000086.meta +0 -0
  97. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000087.meta +0 -0
  98. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000088.meta +0 -0
  99. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000089.sst +0 -0
  100. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000090.sst +0 -0
  101. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000091.sst +0 -0
  102. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000092.sst +0 -0
  103. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000093.sst +0 -0
  104. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000094.meta +0 -0
  105. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000095.meta +0 -0
  106. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000096.meta +0 -0
  107. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000097.meta +0 -0
  108. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000098.meta +0 -0
  109. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000099.sst +0 -0
  110. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000100.sst +0 -0
  111. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000101.sst +0 -0
  112. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000102.meta +0 -0
  113. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000103.meta +0 -0
  114. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000104.meta +0 -0
  115. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000105.sst +0 -0
  116. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000106.sst +0 -0
  117. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000107.sst +0 -0
  118. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000108.meta +0 -0
  119. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000109.meta +0 -0
  120. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/00000110.meta +0 -0
  121. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/CURRENT +0 -0
  122. package/mcp-server/.next/cache/turbopack/v15.5.1-canary.28-7-gede8d1b86/LOG +230 -0
  123. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  124. package/mcp-server/.next/package.json +3 -1
  125. package/mcp-server/.next/required-server-files.json +1 -0
  126. package/mcp-server/.next/server/app/_global-error.html +2 -2
  127. package/mcp-server/.next/server/app/_global-error.rsc +1 -1
  128. package/mcp-server/.next/server/app/_not-found/page/app-build-manifest.json +1 -1
  129. package/mcp-server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  130. package/mcp-server/.next/server/app/_not-found.html +1 -1
  131. package/mcp-server/.next/server/app/_not-found.rsc +2 -2
  132. package/mcp-server/.next/server/app/index.html +1 -1
  133. package/mcp-server/.next/server/app/index.rsc +3 -3
  134. package/mcp-server/.next/server/app/logs/page/app-build-manifest.json +4 -3
  135. package/mcp-server/.next/server/app/logs/page.js.nft.json +1 -1
  136. package/mcp-server/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  137. package/mcp-server/.next/server/app/mcp/route.js.nft.json +1 -1
  138. package/mcp-server/.next/server/app/page/app-build-manifest.json +3 -2
  139. package/mcp-server/.next/server/app/page.js.nft.json +1 -1
  140. package/mcp-server/.next/server/app/page_client-reference-manifest.js +1 -1
  141. package/mcp-server/.next/server/chunks/[root-of-the-server]__1b561deb._.js +1 -1
  142. package/mcp-server/.next/server/chunks/[root-of-the-server]__1b561deb._.js.map +1 -1
  143. package/mcp-server/.next/server/chunks/[root-of-the-server]__38e8baae._.js +7 -8
  144. package/mcp-server/.next/server/chunks/[root-of-the-server]__38e8baae._.js.map +1 -1
  145. package/mcp-server/.next/server/chunks/ssr/{node_modules__pnpm_4f58b96e._.js → _188bfe33._.js} +2 -2
  146. package/mcp-server/.next/server/chunks/ssr/_188bfe33._.js.map +1 -0
  147. package/mcp-server/.next/server/chunks/ssr/_9d670a6b._.js +2 -2
  148. package/mcp-server/.next/server/chunks/ssr/_9d670a6b._.js.map +1 -1
  149. package/mcp-server/.next/server/chunks/ssr/_d858c4cd._.js +1 -1
  150. package/mcp-server/.next/server/chunks/ssr/_d858c4cd._.js.map +1 -1
  151. package/mcp-server/.next/server/chunks/ssr/_dae9c1d5._.js +1 -1
  152. package/mcp-server/.next/server/chunks/ssr/_dae9c1d5._.js.map +1 -1
  153. package/mcp-server/.next/server/chunks/ssr/{node_modules__pnpm_87fb6266._.js → _f03e80a8._.js} +2 -2
  154. package/mcp-server/.next/server/chunks/ssr/_f03e80a8._.js.map +1 -0
  155. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js +1 -1
  156. package/mcp-server/.next/server/chunks/ssr/mcp-server_app_layout_tsx_afa41767._.js.map +1 -1
  157. package/mcp-server/.next/server/pages/404.html +1 -1
  158. package/mcp-server/.next/server/pages/500.html +2 -2
  159. package/mcp-server/.next/static/chunks/5a5edc75ee7e7de4.js +1 -0
  160. package/mcp-server/.next/static/chunks/65b18bf1ede9811a.css +1 -0
  161. package/mcp-server/.next/static/chunks/909033014621484e.js +1 -0
  162. package/mcp-server/.next/static/chunks/c5f8464bc8083ee7.js +1 -0
  163. package/mcp-server/.next/trace +1 -1
  164. package/mcp-server/app/api/tools/route.ts +22 -5
  165. package/mcp-server/app/layout.tsx +4 -2
  166. package/mcp-server/app/logs/LogsClient.infinite-loop.test.tsx +127 -0
  167. package/mcp-server/app/logs/LogsClient.tsx +318 -201
  168. package/mcp-server/app/logs/page.tsx +19 -3
  169. package/mcp-server/app/logs/utils.ts +15 -3
  170. package/mcp-server/app/mcp/route.ts +75 -509
  171. package/mcp-server/app/mcp/tools.ts +747 -0
  172. package/mcp-server/app/page.tsx +244 -169
  173. package/mcp-server/next.config.ts +1 -1
  174. package/mcp-server/package.json +9 -1
  175. package/mcp-server/public/favicon-16.svg +4 -0
  176. package/mcp-server/public/favicon-180.png +0 -0
  177. package/mcp-server/public/favicon-64.svg +4 -0
  178. package/mcp-server/public/favicon-preview.html +67 -0
  179. package/mcp-server/public/favicon.ico +0 -0
  180. package/mcp-server/public/favicon.svg +4 -0
  181. package/mcp-server/public/screenshots/test.txt +1 -0
  182. package/package.json +3 -4
  183. package/src/tui-interface-impl.tsx +163 -48
  184. package/mcp-server/.next/build/chunks/[root-of-the-server]__25374c4f._.js +0 -496
  185. package/mcp-server/.next/build/chunks/[root-of-the-server]__25374c4f._.js.map +0 -11
  186. package/mcp-server/.next/build/chunks/[root-of-the-server]__4718a9dd._.js +0 -408
  187. package/mcp-server/.next/build/chunks/[root-of-the-server]__4718a9dd._.js.map +0 -7
  188. package/mcp-server/.next/build/chunks/[root-of-the-server]__c438ef56._.js +0 -205
  189. package/mcp-server/.next/build/chunks/[root-of-the-server]__c438ef56._.js.map +0 -8
  190. package/mcp-server/.next/build/chunks/[root-of-the-server]__c7ae8543._.js +0 -496
  191. package/mcp-server/.next/build/chunks/[root-of-the-server]__c7ae8543._.js.map +0 -11
  192. package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_d723d216._.js +0 -13
  193. package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_postcss_ts_d723d216._.js.map +0 -5
  194. package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_webpack-loaders_ts_5a40237e._.js +0 -12
  195. package/mcp-server/.next/build/chunks/[turbopack-node]_transforms_webpack-loaders_ts_5a40237e._.js.map +0 -5
  196. package/mcp-server/.next/build/chunks/[turbopack]_runtime.js +0 -770
  197. package/mcp-server/.next/build/chunks/[turbopack]_runtime.js.map +0 -10
  198. package/mcp-server/.next/build/chunks/node_modules__pnpm_806d01c0._.js +0 -6759
  199. package/mcp-server/.next/build/chunks/node_modules__pnpm_806d01c0._.js.map +0 -47
  200. package/mcp-server/.next/postcss.js +0 -6
  201. package/mcp-server/.next/postcss.js.map +0 -5
  202. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_4f58b96e._.js.map +0 -1
  203. package/mcp-server/.next/server/chunks/ssr/node_modules__pnpm_87fb6266._.js.map +0 -1
  204. package/mcp-server/.next/static/chunks/11f1b53bdf7a9af0.js +0 -1
  205. package/mcp-server/.next/static/chunks/3d4ea64f6384f2c6.js +0 -1
  206. package/mcp-server/.next/static/chunks/50335dad5c51aab8.js +0 -1
  207. package/mcp-server/.next/static/chunks/bdd0789390bc312f.css +0 -1
  208. package/mcp-server/.next/webpack-loaders.js +0 -6
  209. package/mcp-server/.next/webpack-loaders.js.map +0 -5
  210. /package/mcp-server/.next/static/{mZfouQw6OHfahPQayuVeY → KrGcHKj--hSqNUOXmnA4A}/_buildManifest.js +0 -0
  211. /package/mcp-server/.next/static/{mZfouQw6OHfahPQayuVeY → KrGcHKj--hSqNUOXmnA4A}/_clientMiddlewareManifest.json +0 -0
  212. /package/mcp-server/.next/static/{mZfouQw6OHfahPQayuVeY → KrGcHKj--hSqNUOXmnA4A}/_ssgManifest.js +0 -0
@@ -2,6 +2,8 @@
2
2
 
3
3
  import Link from "next/link"
4
4
  import { useEffect, useState } from "react"
5
+ import { DarkModeToggle } from "@/components/dark-mode-toggle"
6
+ import { useDarkMode } from "@/hooks/use-dark-mode"
5
7
 
6
8
  interface MCPTool {
7
9
  name: string
@@ -22,9 +24,109 @@ interface ToolsResponse {
22
24
  categories: string[]
23
25
  }
24
26
 
27
+ // Format tool descriptions by parsing markdown-style sections
28
+ function formatToolDescription(description: string) {
29
+ const slugify = (value: string) =>
30
+ value
31
+ .toLowerCase()
32
+ .replace(/[^a-z0-9]+/g, "-")
33
+ .replace(/(^-|-$)/g, "")
34
+
35
+ // Split by double newline to get sections
36
+ const sections = description.split("\n\n").filter((section) => section.trim())
37
+ const keyCounts = new Map<string, number>()
38
+
39
+ const getUniqueKey = (base: string) => {
40
+ const count = keyCounts.get(base) ?? 0
41
+ keyCounts.set(base, count + 1)
42
+ return count === 0 ? base : `${base}-${count}`
43
+ }
44
+
45
+ return sections.map((rawSection, _idx) => {
46
+ const normalizedKey = getUniqueKey(slugify(rawSection) || "section")
47
+ let section = rawSection
48
+
49
+ // Remove excessive emojis
50
+ // Simple emoji reduction - just remove most emojis except the first in sequences
51
+ section = section.replace(/(\u{1F300}-\u{1F9FF}|\u{2600}-\u{26FF}|\u{1F900}-\u{1F9FF})+/gu, (match) => {
52
+ // Keep only the first emoji in a sequence
53
+ return match.charAt(0)
54
+ })
55
+
56
+ // Handle different section types
57
+ if (section.includes("**") && section.includes(":")) {
58
+ // This is a header with content
59
+ const [header, ...contentParts] = section.split(":")
60
+ const cleanHeader = header.replace(/\*\*/g, "").trim()
61
+ const content = contentParts.join(":").trim()
62
+
63
+ // Check if content has bullet points
64
+ if (content.includes("•")) {
65
+ const items = content.split("•").filter((item) => item.trim())
66
+ const sectionKey = `${normalizedKey}-bullets`
67
+ return (
68
+ <div key={sectionKey}>
69
+ <h5 className="font-semibold mb-2">{cleanHeader}</h5>
70
+ <ul className="space-y-1 ml-4">
71
+ {items.map((item) => {
72
+ const itemKey = getUniqueKey(`${sectionKey}-item-${slugify(item).slice(0, 40) || "bullet"}`)
73
+ return (
74
+ <li key={itemKey} className="flex items-start">
75
+ <span className="text-muted-foreground mr-2">•</span>
76
+ <span className="text-muted-foreground text-sm">{item.trim()}</span>
77
+ </li>
78
+ )
79
+ })}
80
+ </ul>
81
+ </div>
82
+ )
83
+ }
84
+
85
+ return (
86
+ <div key={`${normalizedKey}-content`}>
87
+ <h5 className="font-semibold mb-1">{cleanHeader}</h5>
88
+ <p className="text-muted-foreground text-sm ml-4">{content}</p>
89
+ </div>
90
+ )
91
+ }
92
+
93
+ // Handle numbered lists (like workflow steps)
94
+ if (section.match(/^\d+[\ud83c-\ud83e][\udc00-\udfff]|^\d+\./m)) {
95
+ const items = section.split(/\n/).filter((item) => item.trim())
96
+ return (
97
+ <ol className="space-y-1 ml-4" key={`${normalizedKey}-steps`}>
98
+ {items.map((item, itemIdx) => {
99
+ // Clean up the item text
100
+ const cleanItem = item
101
+ .replace(/^\d+[\ud83c-\ud83e][\udc00-\udfff]\s*/, "")
102
+ .replace(/^\d+\.\s*/, "")
103
+ .trim()
104
+ return (
105
+ <li
106
+ key={getUniqueKey(`${normalizedKey}-step-${slugify(cleanItem).slice(0, 40) || "step"}`)}
107
+ className="text-muted-foreground text-sm"
108
+ >
109
+ {itemIdx + 1}. {cleanItem}
110
+ </li>
111
+ )
112
+ })}
113
+ </ol>
114
+ )
115
+ }
116
+
117
+ // Default paragraph
118
+ return (
119
+ <p key={`${normalizedKey}-paragraph`} className="text-muted-foreground text-sm leading-relaxed">
120
+ {section}
121
+ </p>
122
+ )
123
+ })
124
+ }
125
+
25
126
  export default function HomePage() {
26
127
  const [tools, setTools] = useState<ToolsResponse | null>(null)
27
128
  const [loading, setLoading] = useState(true)
129
+ const [darkMode, setDarkMode] = useDarkMode()
28
130
 
29
131
  useEffect(() => {
30
132
  fetch("/api/tools")
@@ -39,25 +141,25 @@ export default function HomePage() {
39
141
  }, [])
40
142
 
41
143
  return (
42
- <div className="min-h-screen bg-white">
144
+ <div className="min-h-screen bg-background text-foreground">
43
145
  {/* Header */}
44
- <header className="bg-gray-50 border-b border-gray-200">
146
+ <header className="bg-muted/30 border-b border-border">
45
147
  <div className="max-w-7xl mx-auto px-6 py-8">
46
148
  <div className="flex items-center justify-between">
47
149
  <div>
48
150
  <div className="flex items-center gap-4 mb-3">
49
- <div className="w-12 h-12 bg-black rounded flex items-center justify-center">
50
- <span className="text-white font-mono font-bold">d3k</span>
151
+ <div className="w-12 h-12 bg-foreground rounded flex items-center justify-center">
152
+ <span className="text-background font-mono font-bold">d3k</span>
51
153
  </div>
52
154
  <div>
53
- <h1 className="text-3xl font-bold text-gray-900">dev3000 MCP Server</h1>
155
+ <h1 className="text-3xl font-bold">dev3000 MCP Server</h1>
54
156
  <div className="flex items-center gap-3 mt-2">
55
157
  <span className="inline-flex items-center gap-2 text-sm text-green-600 font-medium">
56
158
  <span className="w-2 h-2 bg-green-500 rounded-full"></span>
57
159
  Server Running
58
160
  </span>
59
- <span className="text-gray-300">•</span>
60
- <span className="text-sm text-gray-600">Port {process.env.PORT || "3684"}</span>
161
+ <span className="text-muted-foreground">•</span>
162
+ <span className="text-sm text-muted-foreground">Port {process.env.PORT || "3684"}</span>
61
163
  </div>
62
164
  </div>
63
165
  </div>
@@ -65,7 +167,7 @@ export default function HomePage() {
65
167
  <div className="flex items-center gap-4">
66
168
  <Link
67
169
  href="/logs"
68
- className="inline-flex items-center gap-2 px-5 py-3 bg-blue-600 text-white text-sm font-medium rounded hover:bg-blue-700 transition-colors"
170
+ className="inline-flex items-center gap-2 px-5 py-3 bg-primary text-primary-foreground text-sm font-medium rounded hover:bg-primary/90 transition-colors"
69
171
  >
70
172
  📊 View Logs
71
173
  </Link>
@@ -73,190 +175,163 @@ export default function HomePage() {
73
175
  href="https://github.com/vercel-labs/dev3000#setup"
74
176
  target="_blank"
75
177
  rel="noopener noreferrer"
76
- className="inline-flex items-center gap-2 px-5 py-3 border border-gray-300 text-gray-700 text-sm font-medium rounded hover:bg-gray-50 transition-colors"
178
+ className="inline-flex items-center gap-2 px-5 py-3 border border-border text-foreground text-sm font-medium rounded hover:bg-accent hover:text-accent-foreground transition-colors"
77
179
  >
78
180
  📖 Setup Guide
79
181
  </a>
182
+ <DarkModeToggle darkMode={darkMode} setDarkMode={setDarkMode} />
80
183
  </div>
81
184
  </div>
82
185
  </div>
83
186
  </header>
84
187
 
85
- <div className="flex max-w-7xl mx-auto">
86
- {/* Main Content */}
87
- <main className="flex-1 px-6 py-8 min-w-0 lg:pr-80">
88
- {/* Quick Start */}
89
- <section className="mb-16">
90
- <div className="bg-blue-50 border border-blue-200 rounded p-8">
91
- <h2 className="text-xl font-semibold text-blue-900 mb-4">🚀 Quick Start</h2>
92
- <div className="space-y-4">
93
- <div>
94
- <span className="text-sm font-medium text-blue-800">MCP Endpoint:</span>
95
- <code className="ml-3 px-4 py-2 bg-blue-100 text-blue-800 text-sm font-mono rounded">
96
- {tools?.endpoint || "http://localhost:3684/mcp"}
97
- </code>
98
- </div>
99
- <div className="text-sm text-blue-700">
100
- <p className="mb-3">Connect your AI tools to this MCP server for real-time development debugging:</p>
101
- <div className="flex gap-6">
102
- <a
103
- href="https://github.com/vercel-labs/dev3000#claude-desktop"
104
- target="_blank"
105
- rel="noopener noreferrer"
106
- className="text-blue-600 hover:text-blue-800 font-medium"
107
- >
108
- Claude Desktop Setup →
109
- </a>
110
- <a
111
- href="https://github.com/vercel-labs/dev3000#cursor"
112
- target="_blank"
113
- rel="noopener noreferrer"
114
- className="text-blue-600 hover:text-blue-800 font-medium"
115
- >
116
- Cursor Setup →
117
- </a>
118
- </div>
188
+ {/* Main Content - no sidebar needed with only 2 tools */}
189
+ <main className="max-w-7xl mx-auto px-6 py-8">
190
+ {/* Quick Start */}
191
+ <section className="mb-16">
192
+ <div className="bg-primary/10 border border-primary/20 rounded p-8">
193
+ <h2 className="text-xl font-semibold mb-4">🚀 Quick Start</h2>
194
+ <div className="space-y-4">
195
+ <div>
196
+ <span className="text-sm font-medium">MCP Endpoint:</span>
197
+ <code className="ml-3 px-4 py-2 bg-primary/20 text-foreground text-sm font-mono rounded">
198
+ {tools?.endpoint || "http://localhost:3684/mcp"}
199
+ </code>
200
+ </div>
201
+ <div className="text-sm">
202
+ <p className="mb-3">Connect your AI tools to this MCP server for real-time development debugging:</p>
203
+ <div className="flex gap-6">
204
+ <a
205
+ href="https://github.com/vercel-labs/dev3000#claude-desktop"
206
+ target="_blank"
207
+ rel="noopener noreferrer"
208
+ className="text-primary hover:text-primary/80 font-medium"
209
+ >
210
+ Claude Desktop Setup →
211
+ </a>
212
+ <a
213
+ href="https://github.com/vercel-labs/dev3000#cursor"
214
+ target="_blank"
215
+ rel="noopener noreferrer"
216
+ className="text-primary hover:text-primary/80 font-medium"
217
+ >
218
+ Cursor Setup →
219
+ </a>
119
220
  </div>
120
221
  </div>
121
222
  </div>
122
- </section>
223
+ </div>
224
+ </section>
123
225
 
124
- {/* Tools Documentation */}
125
- <section>
126
- <div className="mb-12">
127
- <div>
128
- <h2 className="text-3xl font-bold text-gray-900 mb-3">Available Tools</h2>
129
- <p className="text-gray-600 text-lg">
130
- {loading
131
- ? "Loading MCP tools..."
132
- : `${tools?.totalTools || 0} tools across ${
133
- tools?.categories.length || 0
134
- } categories for AI-powered development debugging`}
135
- </p>
136
- </div>
226
+ {/* Tools Documentation */}
227
+ <section>
228
+ <div className="mb-12">
229
+ <div>
230
+ <h2 className="text-3xl font-bold mb-3">Available Tools</h2>
231
+ <p className="text-muted-foreground text-lg">
232
+ {loading
233
+ ? "Loading MCP tools..."
234
+ : `${tools?.totalTools || 0} tools across ${
235
+ tools?.categories.length || 0
236
+ } categories for AI-powered development debugging`}
237
+ </p>
137
238
  </div>
239
+ </div>
138
240
 
139
- {loading ? (
140
- <div className="text-center py-16">
141
- <div className="inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div>
142
- <p className="mt-6 text-gray-600">Loading tool documentation...</p>
143
- </div>
144
- ) : tools ? (
145
- <div className="grid gap-6 lg:grid-cols-2">
146
- {tools.tools.map((tool) => (
147
- <div
148
- key={tool.name}
149
- id={tool.name}
150
- className="border border-gray-200 rounded-lg p-6 hover:border-gray-300 transition-colors"
151
- >
152
- <div className="mb-4">
153
- <h4 className="text-xl font-semibold text-gray-900 font-mono mb-3">{tool.name}</h4>
154
- <p className="text-gray-600 leading-relaxed">
155
- {tool.description.replace(/🚨|⏰|🔍|🪄|📊|🌐|⚙️/g, "").trim()}
156
- </p>
157
- </div>
158
- {tool.parameters.length > 0 && (
159
- <div>
160
- <h5 className="text-sm font-semibold text-gray-800 mb-3">Parameters:</h5>
161
- <div className="space-y-2">
162
- {tool.parameters.map((param) => (
163
- <div key={param.name} className="text-sm">
164
- <div className="flex items-start gap-2">
165
- <span className="font-mono text-blue-600 font-medium">{param.name}</span>
166
- <span className="text-gray-500 text-xs">
167
- {param.optional ? "(optional)" : "(required)"}
168
- </span>
169
- <span className="text-gray-400 text-xs">- {param.type}</span>
170
- </div>
171
- {param.description && (
172
- <div className="text-gray-600 ml-1 mt-1 text-sm">{param.description}</div>
173
- )}
241
+ {loading ? (
242
+ <div className="text-center py-16">
243
+ <div className="inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-primary"></div>
244
+ <p className="mt-6 text-muted-foreground">Loading tool documentation...</p>
245
+ </div>
246
+ ) : tools ? (
247
+ <div className="grid gap-6 lg:grid-cols-2">
248
+ {tools.tools.map((tool) => (
249
+ <div
250
+ key={tool.name}
251
+ id={tool.name}
252
+ className="border border-border rounded-lg p-6 hover:border-muted-foreground/50 transition-colors"
253
+ >
254
+ <div className="mb-4">
255
+ <h4 className="text-xl font-semibold font-mono mb-3">{tool.name}</h4>
256
+ <div className="text-muted-foreground space-y-3">{formatToolDescription(tool.description)}</div>
257
+ </div>
258
+ {tool.parameters.length > 0 && (
259
+ <div>
260
+ <h5 className="text-sm font-semibold mb-3">Parameters:</h5>
261
+ <div className="space-y-2">
262
+ {tool.parameters.map((param) => (
263
+ <div key={param.name} className="text-sm">
264
+ <div className="flex items-start gap-2">
265
+ <span className="font-mono text-primary font-medium">{param.name}</span>
266
+ <span className="text-muted-foreground text-xs">
267
+ {param.optional ? "(optional)" : "(required)"}
268
+ </span>
269
+ <span className="text-muted-foreground/70 text-xs">- {param.type}</span>
174
270
  </div>
175
- ))}
176
- </div>
271
+ {param.description && (
272
+ <div className="text-muted-foreground ml-1 mt-1 text-sm">{param.description}</div>
273
+ )}
274
+ </div>
275
+ ))}
177
276
  </div>
178
- )}
179
- </div>
180
- ))}
181
- </div>
182
- ) : (
183
- <div className="text-center py-16">
184
- <p className="text-red-600 mb-6">Failed to load tool documentation</p>
185
- <button
186
- onClick={() => window.location.reload()}
187
- className="px-6 py-3 bg-blue-600 text-white text-sm rounded hover:bg-blue-700 transition-colors"
188
- type="button"
189
- >
190
- Retry
191
- </button>
192
- </div>
193
- )}
194
- </section>
195
-
196
- {/* Magic Workflow */}
197
- <section className="mt-20 bg-gradient-to-r from-purple-50 to-blue-50 border border-purple-200 rounded-lg p-10">
198
- <h2 className="text-2xl font-semibold text-gray-900 mb-6 flex items-center gap-3">🪄 The Magic Workflow</h2>
199
- <div className="grid md:grid-cols-3 gap-8">
200
- <div className="text-center">
201
- <div className="w-16 h-16 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md">
202
- <span className="text-blue-600 font-bold text-2xl">1</span>
277
+ </div>
278
+ )}
203
279
  </div>
204
- <h3 className="font-semibold mb-3 text-lg">AI Finds Issues</h3>
205
- <p className="text-gray-600 leading-relaxed">
206
- Tools like debug_my_app and monitor_for_new_errors automatically detect problems
207
- </p>
280
+ ))}
281
+ </div>
282
+ ) : (
283
+ <div className="text-center py-16">
284
+ <p className="text-destructive mb-6">Failed to load tool documentation</p>
285
+ <button
286
+ onClick={() => window.location.reload()}
287
+ className="px-6 py-3 bg-primary text-primary-foreground text-sm rounded hover:bg-primary/90 transition-colors"
288
+ type="button"
289
+ >
290
+ Retry
291
+ </button>
292
+ </div>
293
+ )}
294
+ </section>
295
+
296
+ {/* Magic Workflow */}
297
+ <section className="mt-20 bg-gradient-to-r from-primary/10 to-secondary/10 border border-border rounded-lg p-10">
298
+ <h2 className="text-2xl font-semibold mb-6 flex items-center gap-3">🪄 The Magic Workflow</h2>
299
+ <div className="grid md:grid-cols-3 gap-8">
300
+ <div className="text-center">
301
+ <div className="w-16 h-16 bg-primary/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md">
302
+ <span className="text-primary font-bold text-2xl">1</span>
208
303
  </div>
209
- <div className="text-center">
210
- <div className="w-16 h-16 bg-purple-100 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md">
211
- <span className="text-purple-600 font-bold text-2xl">2</span>
212
- </div>
213
- <h3 className="font-semibold mb-3 text-lg">AI Fixes Code</h3>
214
- <p className="text-gray-600 leading-relaxed">
215
- AI analyzes errors and edits your code files to resolve issues
216
- </p>
304
+ <h3 className="font-semibold mb-3 text-lg">AI Finds Issues</h3>
305
+ <p className="text-muted-foreground leading-relaxed">
306
+ fix_my_app automatically detects all types of errors and problems in your app
307
+ </p>
308
+ </div>
309
+ <div className="text-center">
310
+ <div className="w-16 h-16 bg-accent/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md">
311
+ <span className="text-accent-foreground font-bold text-2xl">2</span>
217
312
  </div>
218
- <div className="text-center">
219
- <div className="w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md">
220
- <span className="text-green-600 font-bold text-2xl">3</span>
221
- </div>
222
- <h3 className="font-semibold mb-3 text-lg">AI Verifies Fixes</h3>
223
- <p className="text-gray-600 leading-relaxed">
224
- execute_browser_action tests the fixes in real-time with screenshots
225
- </p>
313
+ <h3 className="font-semibold mb-3 text-lg">AI Fixes Code</h3>
314
+ <p className="text-muted-foreground leading-relaxed">
315
+ AI analyzes errors and edits your code files to resolve issues
316
+ </p>
317
+ </div>
318
+ <div className="text-center">
319
+ <div className="w-16 h-16 bg-green-500/20 rounded-full flex items-center justify-center mx-auto mb-4 shadow-md">
320
+ <span className="text-green-600 dark:text-green-400 font-bold text-2xl">3</span>
226
321
  </div>
322
+ <h3 className="font-semibold mb-3 text-lg">AI Verifies Fixes</h3>
323
+ <p className="text-muted-foreground leading-relaxed">
324
+ execute_browser_action tests the fixes in real-time with screenshots
325
+ </p>
227
326
  </div>
228
- </section>
229
- </main>
230
-
231
- {/* Table of Contents - Sticky Sidebar (Right) */}
232
- <aside className="lg:block w-72 flex-shrink-0 fixed right-0 top-0 h-screen overflow-y-auto z-10">
233
- <div className="p-6 bg-gray-50 border-l border-gray-200 h-full">
234
- <h3 className="text-sm font-semibold text-gray-900 mb-4">Tools</h3>
235
- {loading ? (
236
- <div className="text-sm text-gray-500">Loading tools...</div>
237
- ) : tools ? (
238
- <nav className="space-y-1 text-sm">
239
- {tools.tools.map((tool) => (
240
- <a
241
- key={tool.name}
242
- href={`#${tool.name}`}
243
- className="text-gray-600 hover:text-blue-600 transition-colors block py-2 px-3 rounded hover:bg-white"
244
- >
245
- {tool.name}
246
- </a>
247
- ))}
248
- </nav>
249
- ) : (
250
- <div className="text-sm text-gray-500">Failed to load tools</div>
251
- )}
252
327
  </div>
253
- </aside>
254
- </div>
328
+ </section>
329
+ </main>
255
330
 
256
331
  {/* Footer */}
257
- <footer className="border-t border-gray-200 mt-20">
332
+ <footer className="border-t border-border mt-20">
258
333
  <div className="max-w-7xl mx-auto px-6 py-8">
259
- <div className="flex items-center justify-between text-sm text-gray-600">
334
+ <div className="flex items-center justify-between text-sm text-muted-foreground">
260
335
  <div>
261
336
  <span className="font-semibold">dev3000 MCP Server</span> - AI-powered development monitoring
262
337
  </div>
@@ -265,7 +340,7 @@ export default function HomePage() {
265
340
  href="https://github.com/vercel-labs/dev3000"
266
341
  target="_blank"
267
342
  rel="noopener noreferrer"
268
- className="hover:text-gray-900 transition-colors"
343
+ className="hover:text-foreground transition-colors"
269
344
  >
270
345
  GitHub
271
346
  </a>
@@ -273,7 +348,7 @@ export default function HomePage() {
273
348
  href="https://dev3000.ai"
274
349
  target="_blank"
275
350
  rel="noopener noreferrer"
276
- className="hover:text-gray-900 transition-colors"
351
+ className="hover:text-foreground transition-colors"
277
352
  >
278
353
  Homepage
279
354
  </a>
@@ -3,7 +3,7 @@ import path from "path"
3
3
 
4
4
  const nextConfig: NextConfig = {
5
5
  reactStrictMode: true,
6
- experimental: { reactCompiler: true },
6
+ experimental: { reactCompiler: true, turbopackPersistentCaching: true },
7
7
  devIndicators: false,
8
8
  turbopack: {
9
9
  root: path.join(__dirname, "..")
@@ -7,14 +7,22 @@
7
7
  "build": "next build --turbopack",
8
8
  "start": "next start",
9
9
  "typegen": "next typegen",
10
- "typecheck": "tsc --noEmit"
10
+ "typecheck": "tsc --noEmit",
11
+ "tools": "tsx tools-cli.ts"
11
12
  },
12
13
  "dependencies": {
14
+ "@modelcontextprotocol/sdk": "catalog:",
15
+ "@radix-ui/react-slot": "catalog:",
13
16
  "autoprefixer": "catalog:",
17
+ "class-variance-authority": "catalog:",
18
+ "clsx": "catalog:",
19
+ "commander": "^11.1.0",
20
+ "lucide-react": "catalog:",
14
21
  "mcp-handler": "^1.0.2",
15
22
  "next": "catalog:",
16
23
  "react": "catalog:",
17
24
  "react-dom": "catalog:",
25
+ "tailwind-merge": "catalog:",
18
26
  "ws": "^8.18.3",
19
27
  "zod": "catalog:"
20
28
  },
@@ -0,0 +1,4 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="16" height="16" fill="#ffffff" rx="1"/>
3
+ <text x="8" y="11" font-family="monospace" font-size="5" font-weight="bold" text-anchor="middle" fill="#000000">d3k</text>
4
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="64" height="64" fill="#ffffff" rx="4"/>
3
+ <text x="32" y="44" font-family="monospace" font-size="20" font-weight="bold" text-anchor="middle" fill="#000000">d3k</text>
4
+ </svg>
@@ -0,0 +1,67 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>dev3000 Favicon Preview - Bold & Readable</title>
5
+ <style>
6
+ body { font-family: monospace; background: #f0f0f0; padding: 20px; }
7
+ .favicon-preview { display: inline-block; margin: 10px; padding: 10px; background: white; border: 1px solid #ccc; }
8
+ svg { border: 1px solid #000; }
9
+ .browser-tab-demo { background: #e8e8e8; padding: 10px; border-radius: 8px; margin: 20px 0; }
10
+ .tab { display: inline-block; background: #d0d0d0; padding: 4px 8px; border-radius: 4px 4px 0 0; margin-right: 2px; font-size: 12px; }
11
+ .tab svg { vertical-align: middle; margin-right: 4px; border: none; }
12
+ </style>
13
+ </head>
14
+ <body>
15
+ <h2>dev3000 Favicon Preview - Bold & Readable Design</h2>
16
+ <p>Simplified design with larger white rectangle and bold text for maximum readability at small sizes.</p>
17
+
18
+ <div class="browser-tab-demo">
19
+ <h3>How it looks in browser tabs:</h3>
20
+ <div class="tab">
21
+ <svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
22
+ <rect width="16" height="16" fill="#000000"/>
23
+ <rect x="2" y="2" width="12" height="12" fill="#ffffff" rx="1"/>
24
+ <text x="8" y="12" font-family="monospace" font-size="6" font-weight="900" text-anchor="middle" fill="#000000">d3k</text>
25
+ </svg>
26
+ dev3000 - AI Debugging
27
+ </div>
28
+ <div class="tab">
29
+ <svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
30
+ <rect width="16" height="16" fill="#000000"/>
31
+ <rect x="2" y="2" width="12" height="12" fill="#ffffff" rx="1"/>
32
+ <text x="8" y="12" font-family="monospace" font-size="6" font-weight="900" text-anchor="middle" fill="#000000">d3k</text>
33
+ </svg>
34
+ localhost:3684/logs
35
+ </div>
36
+ </div>
37
+
38
+ <div class="favicon-preview">
39
+ <h3>16x16 (Browser Tab) - NEW BOLD DESIGN</h3>
40
+ <svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
41
+ <rect width="16" height="16" fill="#000000"/>
42
+ <rect x="2" y="2" width="12" height="12" fill="#ffffff" rx="1"/>
43
+ <text x="8" y="12" font-family="monospace" font-size="6" font-weight="900" text-anchor="middle" fill="#000000">d3k</text>
44
+ </svg>
45
+ <p>Bold, simple rectangle with large text - clearly readable!</p>
46
+ </div>
47
+
48
+ <div class="favicon-preview">
49
+ <h3>32x32 (Standard)</h3>
50
+ <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
51
+ <rect width="32" height="32" fill="#000000"/>
52
+ <rect x="4" y="4" width="24" height="24" fill="#ffffff" rx="2"/>
53
+ <text x="16" y="24" font-family="monospace" font-size="12" font-weight="900" text-anchor="middle" fill="#000000">d3k</text>
54
+ </svg>
55
+ </div>
56
+
57
+ <div class="favicon-preview">
58
+ <h3>64x64 (High-DPI)</h3>
59
+ <svg width="64" height="64" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg">
60
+ <rect width="64" height="64" fill="#000000"/>
61
+ <rect x="8" y="8" width="48" height="48" fill="#ffffff" rx="4"/>
62
+ <text x="32" y="48" font-family="monospace" font-size="24" font-weight="900" text-anchor="middle" fill="#000000">d3k</text>
63
+ </svg>
64
+ </div>
65
+
66
+ </body>
67
+ </html>
Binary file
@@ -0,0 +1,4 @@
1
+ <svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="32" height="32" fill="#ffffff" rx="2"/>
3
+ <text x="16" y="22" font-family="monospace" font-size="10" font-weight="bold" text-anchor="middle" fill="#000000">d3k</text>
4
+ </svg>
@@ -0,0 +1 @@
1
+ test