dr-claw 1.1.2

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 (287) hide show
  1. package/LICENSE +1380 -0
  2. package/NOTICE +17 -0
  3. package/README.md +875 -0
  4. package/README.zh-CN.md +857 -0
  5. package/dist/api-docs.html +878 -0
  6. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  7. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  8. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  9. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  10. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  11. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  12. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  13. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  14. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  15. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  16. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  17. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  18. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  19. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  20. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  21. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  22. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  23. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  24. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  25. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  26. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  27. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  28. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  29. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  30. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  31. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  32. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  33. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  34. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  35. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  36. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  37. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  38. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  39. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  44. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  45. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  46. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  47. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  48. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  49. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  50. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  51. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  52. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  53. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  54. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  55. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  56. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  57. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  58. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  59. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  60. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  61. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  62. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  63. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  64. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  65. package/dist/assets/_basePickBy-C0n1uo4u.js +1 -0
  66. package/dist/assets/_baseUniq-BRNmhFkc.js +1 -0
  67. package/dist/assets/arc-DOMBmC_A.js +1 -0
  68. package/dist/assets/architectureDiagram-VXUJARFQ-CtMWglbD.js +36 -0
  69. package/dist/assets/blockDiagram-VD42YOAC-DK_gTkJy.js +122 -0
  70. package/dist/assets/c4Diagram-YG6GDRKO-DrDAvsn7.js +10 -0
  71. package/dist/assets/channel-BFOE7OyC.js +1 -0
  72. package/dist/assets/chunk-4BX2VUAB-CGbhdZcN.js +1 -0
  73. package/dist/assets/chunk-55IACEB6-sGeFSxen.js +1 -0
  74. package/dist/assets/chunk-B4BG7PRW-RxgHAU_P.js +165 -0
  75. package/dist/assets/chunk-DI55MBZ5-CvHUXZrx.js +220 -0
  76. package/dist/assets/chunk-FMBD7UC4-Sn7cXVNU.js +15 -0
  77. package/dist/assets/chunk-QN33PNHL-bDKOHppN.js +1 -0
  78. package/dist/assets/chunk-QZHKN3VN-B9kN5LGm.js +1 -0
  79. package/dist/assets/chunk-TZMSLE5B-CCBe6len.js +1 -0
  80. package/dist/assets/classDiagram-2ON5EDUG-DQoMNYlY.js +1 -0
  81. package/dist/assets/classDiagram-v2-WZHVMYZB-DQoMNYlY.js +1 -0
  82. package/dist/assets/clone-BulQSblH.js +1 -0
  83. package/dist/assets/cose-bilkent-S5V4N54A-r6sLiHBW.js +1 -0
  84. package/dist/assets/cytoscape.esm-5J0xJHOV.js +321 -0
  85. package/dist/assets/dagre-6UL2VRFP-AbsaR1Oa.js +4 -0
  86. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  87. package/dist/assets/diagram-PSM6KHXK-DjCvdUyy.js +24 -0
  88. package/dist/assets/diagram-QEK2KX5R-CqiocXkH.js +43 -0
  89. package/dist/assets/diagram-S2PKOQOG-D5ALeoII.js +24 -0
  90. package/dist/assets/erDiagram-Q2GNP2WA-C1AeOsiz.js +60 -0
  91. package/dist/assets/flowDiagram-NV44I4VS-C98ve_DO.js +162 -0
  92. package/dist/assets/ganttDiagram-JELNMOA3-3zdLvcxD.js +267 -0
  93. package/dist/assets/gitGraphDiagram-V2S2FVAM-nDuDMsHh.js +65 -0
  94. package/dist/assets/graph-Blm-emkR.js +1 -0
  95. package/dist/assets/index-B8Yutsnm.css +1 -0
  96. package/dist/assets/index-Cf6gyhc3.js +654 -0
  97. package/dist/assets/infoDiagram-HS3SLOUP-CmzE3q0R.js +2 -0
  98. package/dist/assets/init-Gi6I4Gst.js +1 -0
  99. package/dist/assets/journeyDiagram-XKPGCS4Q-CYaW7LrP.js +139 -0
  100. package/dist/assets/kanban-definition-3W4ZIXB7-mkmW7p0j.js +89 -0
  101. package/dist/assets/layout-Ct2kFIId.js +1 -0
  102. package/dist/assets/linear-CKG9EwIJ.js +1 -0
  103. package/dist/assets/mermaid.core-CaKcUnnd.js +250 -0
  104. package/dist/assets/mindmap-definition-VGOIOE7T-Bct-pYin.js +68 -0
  105. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  106. package/dist/assets/pieDiagram-ADFJNKIX-C8wFD4Jr.js +30 -0
  107. package/dist/assets/quadrantDiagram-AYHSOK5B-CuiE_f46.js +7 -0
  108. package/dist/assets/requirementDiagram-UZGBJVZJ-C4v1CqU8.js +64 -0
  109. package/dist/assets/sankeyDiagram-TZEHDZUN-keAqqs-Y.js +10 -0
  110. package/dist/assets/sequenceDiagram-WL72ISMW-ClNbvKTB.js +145 -0
  111. package/dist/assets/stateDiagram-FKZM4ZOC-D8We-2vq.js +1 -0
  112. package/dist/assets/stateDiagram-v2-4FDKWEC3-BUURfjrE.js +1 -0
  113. package/dist/assets/timeline-definition-IT6M3QCI-DsvEMT5T.js +61 -0
  114. package/dist/assets/treemap-GDKQZRPO-TJrzN7Bj.js +162 -0
  115. package/dist/assets/vendor-codemirror-ansM-eig.js +33 -0
  116. package/dist/assets/vendor-react-BWF6YQQ3.js +8 -0
  117. package/dist/assets/vendor-xterm-DfcmCpbH.js +66 -0
  118. package/dist/assets/xychartDiagram-PRI3JC2R-BdATmY5F.js +7 -0
  119. package/dist/clear-cache.html +85 -0
  120. package/dist/convert-icons.md +53 -0
  121. package/dist/dr-claw.png +0 -0
  122. package/dist/favicon.png +0 -0
  123. package/dist/generate-icons.js +49 -0
  124. package/dist/icons/claude-ai-icon.svg +1 -0
  125. package/dist/icons/codex-white.svg +3 -0
  126. package/dist/icons/codex.svg +3 -0
  127. package/dist/icons/cursor-white.svg +12 -0
  128. package/dist/icons/cursor.svg +1 -0
  129. package/dist/icons/file.svg +16997 -0
  130. package/dist/icons/generate-icons.md +19 -0
  131. package/dist/icons/icon-128x128.png +0 -0
  132. package/dist/icons/icon-144x144.png +0 -0
  133. package/dist/icons/icon-152x152.png +0 -0
  134. package/dist/icons/icon-192x192.png +0 -0
  135. package/dist/icons/icon-384x384.png +0 -0
  136. package/dist/icons/icon-512x512.png +0 -0
  137. package/dist/icons/icon-72x72.png +0 -0
  138. package/dist/icons/icon-96x96.png +0 -0
  139. package/dist/icons/news/arxiv.svg +1 -0
  140. package/dist/icons/news/huggingface.svg +8 -0
  141. package/dist/icons/news/x-black.png +0 -0
  142. package/dist/icons/news/x-white.png +0 -0
  143. package/dist/icons/news/xiaohongshu.png +0 -0
  144. package/dist/index.html +51 -0
  145. package/dist/leveraged-cognition.png +0 -0
  146. package/dist/manifest.json +61 -0
  147. package/dist/screenshots/chat.png +0 -0
  148. package/dist/screenshots/new_claw.png +0 -0
  149. package/dist/screenshots/news_dashboard.png +0 -0
  150. package/dist/screenshots/project_dashboard.png +0 -0
  151. package/dist/screenshots/research_lab.png +0 -0
  152. package/dist/screenshots/skill_library.png +0 -0
  153. package/dist/screenshots/task_list.png +0 -0
  154. package/dist/screenshots/terminal_example.png +0 -0
  155. package/dist/screenshots/terminal_example1.png +0 -0
  156. package/dist/sw.js +58 -0
  157. package/dist/wechat-group-qr.jpg +0 -0
  158. package/package.json +133 -0
  159. package/public/api-docs.html +878 -0
  160. package/public/clear-cache.html +85 -0
  161. package/public/convert-icons.md +53 -0
  162. package/public/dr-claw.png +0 -0
  163. package/public/favicon.png +0 -0
  164. package/public/generate-icons.js +49 -0
  165. package/public/icons/claude-ai-icon.svg +1 -0
  166. package/public/icons/codex-white.svg +3 -0
  167. package/public/icons/codex.svg +3 -0
  168. package/public/icons/cursor-white.svg +12 -0
  169. package/public/icons/cursor.svg +1 -0
  170. package/public/icons/file.svg +16997 -0
  171. package/public/icons/generate-icons.md +19 -0
  172. package/public/icons/icon-128x128.png +0 -0
  173. package/public/icons/icon-144x144.png +0 -0
  174. package/public/icons/icon-152x152.png +0 -0
  175. package/public/icons/icon-192x192.png +0 -0
  176. package/public/icons/icon-384x384.png +0 -0
  177. package/public/icons/icon-512x512.png +0 -0
  178. package/public/icons/icon-72x72.png +0 -0
  179. package/public/icons/icon-96x96.png +0 -0
  180. package/public/icons/news/arxiv.svg +1 -0
  181. package/public/icons/news/huggingface.svg +8 -0
  182. package/public/icons/news/x-black.png +0 -0
  183. package/public/icons/news/x-white.png +0 -0
  184. package/public/icons/news/xiaohongshu.png +0 -0
  185. package/public/leveraged-cognition.png +0 -0
  186. package/public/manifest.json +61 -0
  187. package/public/screenshots/chat.png +0 -0
  188. package/public/screenshots/new_claw.png +0 -0
  189. package/public/screenshots/news_dashboard.png +0 -0
  190. package/public/screenshots/project_dashboard.png +0 -0
  191. package/public/screenshots/research_lab.png +0 -0
  192. package/public/screenshots/skill_library.png +0 -0
  193. package/public/screenshots/task_list.png +0 -0
  194. package/public/screenshots/terminal_example.png +0 -0
  195. package/public/screenshots/terminal_example1.png +0 -0
  196. package/public/sw.js +58 -0
  197. package/public/wechat-group-qr.jpg +0 -0
  198. package/scripts/export-skills-catalog-v2.mjs +746 -0
  199. package/scripts/fix-node-pty.js +45 -0
  200. package/scripts/gemini_image_core.py +470 -0
  201. package/scripts/install-python-tools.js +64 -0
  202. package/server/AGENTS.md +73 -0
  203. package/server/__tests__/gemini-legacy-thought.test.mjs +88 -0
  204. package/server/__tests__/runtimePorts.test.mjs +115 -0
  205. package/server/__tests__/session-delete.test.mjs +166 -0
  206. package/server/bin/compute-node +70 -0
  207. package/server/claude-sdk.js +799 -0
  208. package/server/cli-chat.js +488 -0
  209. package/server/cli.js +354 -0
  210. package/server/compute-node.js +439 -0
  211. package/server/constants/config.js +5 -0
  212. package/server/cursor-cli.js +340 -0
  213. package/server/database/auth.db +0 -0
  214. package/server/database/db.js +1852 -0
  215. package/server/database/init.sql +194 -0
  216. package/server/gemini-cli.js +1352 -0
  217. package/server/index.js +3154 -0
  218. package/server/load-env.js +71 -0
  219. package/server/local-gpu.js +860 -0
  220. package/server/middleware/auth.js +100 -0
  221. package/server/openai-codex.js +724 -0
  222. package/server/openrouter.js +890 -0
  223. package/server/project-token-usage.js +407 -0
  224. package/server/projects.js +3973 -0
  225. package/server/routes/agent.js +1272 -0
  226. package/server/routes/auth.js +128 -0
  227. package/server/routes/auto-research.js +558 -0
  228. package/server/routes/cli-auth.js +958 -0
  229. package/server/routes/codex.js +344 -0
  230. package/server/routes/commands.js +601 -0
  231. package/server/routes/compute.js +358 -0
  232. package/server/routes/cursor.js +795 -0
  233. package/server/routes/git.js +1348 -0
  234. package/server/routes/mcp-utils.js +48 -0
  235. package/server/routes/mcp.js +618 -0
  236. package/server/routes/news.js +711 -0
  237. package/server/routes/projects.js +633 -0
  238. package/server/routes/references.js +338 -0
  239. package/server/routes/settings.js +285 -0
  240. package/server/routes/skills.js +914 -0
  241. package/server/routes/taskmaster.js +2566 -0
  242. package/server/routes/telemetry.js +89 -0
  243. package/server/routes/user.js +155 -0
  244. package/server/scripts/fix_session_names.js +57 -0
  245. package/server/scripts/research-news/common_words.py +19 -0
  246. package/server/scripts/research-news/link_keywords.py +298 -0
  247. package/server/scripts/research-news/scan_existing_notes.py +266 -0
  248. package/server/scripts/research-news/scoring_utils.py +227 -0
  249. package/server/scripts/research-news/search_arxiv.py +842 -0
  250. package/server/scripts/research-news/search_huggingface.py +438 -0
  251. package/server/scripts/research-news/search_x.py +490 -0
  252. package/server/scripts/research-news/search_xiaohongshu.py +610 -0
  253. package/server/taskmaster-templates/README.md +150 -0
  254. package/server/taskmaster-templates/README.zh-CN.md +150 -0
  255. package/server/taskmaster-templates/ai-research-dataset.json +230 -0
  256. package/server/taskmaster-templates/ai-research-method-model.json +230 -0
  257. package/server/taskmaster-templates/ai-research-position-paper.json +230 -0
  258. package/server/telemetry.js +121 -0
  259. package/server/templates/AGENTS.md +103 -0
  260. package/server/templates/CLAUDE.md +104 -0
  261. package/server/templates/GEMINI.md +103 -0
  262. package/server/templates/cursor-project.md +108 -0
  263. package/server/templates/index.js +37 -0
  264. package/server/utils/__tests__/sessionTokenUsage.test.js +82 -0
  265. package/server/utils/auto-research-mailer.js +57 -0
  266. package/server/utils/cliResolution.js +170 -0
  267. package/server/utils/commandParser.js +303 -0
  268. package/server/utils/cursorCommand.js +61 -0
  269. package/server/utils/geminiApiKey.js +28 -0
  270. package/server/utils/gitConfig.js +24 -0
  271. package/server/utils/imageAttachmentFiles.js +35 -0
  272. package/server/utils/mcp-detector.js +198 -0
  273. package/server/utils/parsers/bibtex-parser.js +207 -0
  274. package/server/utils/permissions.js +100 -0
  275. package/server/utils/runtimePorts.js +212 -0
  276. package/server/utils/sessionFormatting.js +68 -0
  277. package/server/utils/sessionIndex.js +100 -0
  278. package/server/utils/sessionMode.js +95 -0
  279. package/server/utils/sessionTokenUsage.js +105 -0
  280. package/server/utils/taskmaster-websocket.js +129 -0
  281. package/server/utils/zotero-client.js +136 -0
  282. package/shared/errorClassifier.js +102 -0
  283. package/shared/geminiThinkingSupport.d.ts +22 -0
  284. package/shared/geminiThinkingSupport.js +96 -0
  285. package/shared/geminiThoughtParser.d.ts +8 -0
  286. package/shared/geminiThoughtParser.js +30 -0
  287. package/shared/modelConstants.js +139 -0
package/server/cli.js ADDED
@@ -0,0 +1,354 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Dr. Claw CLI
4
+ *
5
+ * Provides command-line utilities for managing Dr. Claw
6
+ *
7
+ * Commands:
8
+ * (no args) - Start the server (default)
9
+ * start - Start the server
10
+ * chat - Interactive terminal chat via OpenRouter
11
+ * status - Show configuration and data locations
12
+ * help - Show help information
13
+ * version - Show version information
14
+ *
15
+ * Legacy alias:
16
+ * vibelab - Still supported as a compatibility command alias
17
+ */
18
+
19
+ import fs from 'fs';
20
+ import path from 'path';
21
+ import os from 'os';
22
+ import { fileURLToPath } from 'url';
23
+ import { dirname } from 'path';
24
+
25
+ const __filename = fileURLToPath(import.meta.url);
26
+ const __dirname = dirname(__filename);
27
+
28
+ // ANSI color codes for terminal output
29
+ const colors = {
30
+ reset: '\x1b[0m',
31
+ bright: '\x1b[1m',
32
+ dim: '\x1b[2m',
33
+
34
+ // Foreground colors
35
+ cyan: '\x1b[36m',
36
+ green: '\x1b[32m',
37
+ yellow: '\x1b[33m',
38
+ blue: '\x1b[34m',
39
+ magenta: '\x1b[35m',
40
+ white: '\x1b[37m',
41
+ gray: '\x1b[90m',
42
+ };
43
+
44
+ // Helper to colorize text
45
+ const c = {
46
+ info: (text) => `${colors.cyan}${text}${colors.reset}`,
47
+ ok: (text) => `${colors.green}${text}${colors.reset}`,
48
+ warn: (text) => `${colors.yellow}${text}${colors.reset}`,
49
+ error: (text) => `${colors.yellow}${text}${colors.reset}`,
50
+ tip: (text) => `${colors.blue}${text}${colors.reset}`,
51
+ bright: (text) => `${colors.bright}${text}${colors.reset}`,
52
+ dim: (text) => `${colors.dim}${text}${colors.reset}`,
53
+ };
54
+
55
+ // Load package.json for version info
56
+ const packageJsonPath = path.join(__dirname, '../package.json');
57
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
58
+
59
+ // Load environment variables from .env file if it exists
60
+ function loadEnvFile() {
61
+ try {
62
+ const envPath = path.join(__dirname, '../.env');
63
+ const envFile = fs.readFileSync(envPath, 'utf8');
64
+ envFile.split('\n').forEach(line => {
65
+ const trimmedLine = line.trim();
66
+ if (trimmedLine && !trimmedLine.startsWith('#')) {
67
+ const [key, ...valueParts] = trimmedLine.split('=');
68
+ if (key && valueParts.length > 0 && !process.env[key]) {
69
+ process.env[key] = valueParts.join('=').trim();
70
+ }
71
+ }
72
+ });
73
+ } catch (e) {
74
+ // .env file is optional
75
+ }
76
+ }
77
+
78
+ // Get the database path (same logic as db.js)
79
+ function getDatabasePath() {
80
+ loadEnvFile();
81
+ return process.env.DATABASE_PATH || path.join(__dirname, 'database', 'auth.db');
82
+ }
83
+
84
+ // Get the installation directory
85
+ function getInstallDir() {
86
+ return path.join(__dirname, '..');
87
+ }
88
+
89
+ // Show status command
90
+ function showStatus() {
91
+ console.log(`\n${c.bright('Dr. Claw - Status')}\n`);
92
+ console.log(c.dim('═'.repeat(60)));
93
+
94
+ // Version info
95
+ console.log(`\n${c.info('[INFO]')} Version: ${c.bright(packageJson.version)}`);
96
+
97
+ // Installation location
98
+ const installDir = getInstallDir();
99
+ console.log(`\n${c.info('[INFO]')} Installation Directory:`);
100
+ console.log(` ${c.dim(installDir)}`);
101
+
102
+ // Database location
103
+ const dbPath = getDatabasePath();
104
+ const dbExists = fs.existsSync(dbPath);
105
+ console.log(`\n${c.info('[INFO]')} Database Location:`);
106
+ console.log(` ${c.dim(dbPath)}`);
107
+ console.log(` Status: ${dbExists ? c.ok('[OK] Exists') : c.warn('[WARN] Not created yet (will be created on first run)')}`);
108
+
109
+ if (dbExists) {
110
+ const stats = fs.statSync(dbPath);
111
+ console.log(` Size: ${c.dim((stats.size / 1024).toFixed(2) + ' KB')}`);
112
+ console.log(` Modified: ${c.dim(stats.mtime.toLocaleString())}`);
113
+ }
114
+
115
+ // Environment variables
116
+ console.log(`\n${c.info('[INFO]')} Configuration:`);
117
+ console.log(` PORT: ${c.bright(process.env.PORT || '3001')} ${c.dim(process.env.PORT ? '' : '(default)')}`);
118
+ console.log(` DATABASE_PATH: ${c.dim(process.env.DATABASE_PATH || '(using default location)')}`);
119
+ console.log(` CLAUDE_CLI_PATH: ${c.dim(process.env.CLAUDE_CLI_PATH || 'claude (default)')}`);
120
+ console.log(` CONTEXT_WINDOW: ${c.dim(process.env.CONTEXT_WINDOW || '160000 (default)')}`);
121
+
122
+ // Claude projects folder
123
+ const claudeProjectsPath = path.join(os.homedir(), '.claude', 'projects');
124
+ const projectsExists = fs.existsSync(claudeProjectsPath);
125
+ console.log(`\n${c.info('[INFO]')} Claude Projects Folder:`);
126
+ console.log(` ${c.dim(claudeProjectsPath)}`);
127
+ console.log(` Status: ${projectsExists ? c.ok('[OK] Exists') : c.warn('[WARN] Not found')}`);
128
+
129
+ // Config file location
130
+ const envFilePath = path.join(__dirname, '../.env');
131
+ const envExists = fs.existsSync(envFilePath);
132
+ console.log(`\n${c.info('[INFO]')} Configuration File:`);
133
+ console.log(` ${c.dim(envFilePath)}`);
134
+ console.log(` Status: ${envExists ? c.ok('[OK] Exists') : c.warn('[WARN] Not found (using defaults)')}`);
135
+
136
+ console.log('\n' + c.dim('═'.repeat(60)));
137
+ console.log(`\n${c.tip('[TIP]')} Hints:`);
138
+ console.log(` ${c.dim('>')} Use ${c.bright('dr-claw --port 8080')} to run on a custom port`);
139
+ console.log(` ${c.dim('>')} Use ${c.bright('dr-claw --database-path /path/to/db')} for custom database`);
140
+ console.log(` ${c.dim('>')} Run ${c.bright('dr-claw help')} for all options`);
141
+ console.log(` ${c.dim('>')} Legacy alias ${c.bright('vibelab')} is still supported during transition (Deprecation: V2.0, Q3 2026)`);
142
+ console.log(` ${c.dim('>')} Access the UI at http://localhost:${process.env.PORT || '3001'}\n`);
143
+ }
144
+
145
+ // Show help
146
+ function showHelp() {
147
+ console.log(`
148
+ ╔═══════════════════════════════════════════════════════════════╗
149
+ ║ Dr. Claw - Command Line Tool ║
150
+ ╚═══════════════════════════════════════════════════════════════╝
151
+
152
+ Usage:
153
+ dr-claw [command] [options]
154
+
155
+ Legacy alias:
156
+ vibelab [command] [options]
157
+
158
+ Commands:
159
+ start Start the Dr. Claw server (default)
160
+ chat Interactive terminal chat via OpenRouter
161
+ status Show configuration and data locations
162
+ update Update to the latest version
163
+ help Show this help information
164
+ version Show version information
165
+
166
+ Options:
167
+ -p, --port <port> Set server port (default: 3001)
168
+ --database-path <path> Set custom database location
169
+ --model <model> OpenRouter model slug (chat command)
170
+ --key <key> OpenRouter API key (chat command)
171
+ -h, --help Show this help information
172
+ -v, --version Show version information
173
+
174
+ Examples:
175
+ $ dr-claw # Start with defaults
176
+ $ dr-claw chat # Terminal chat with OpenRouter
177
+ $ dr-claw chat --model deepseek/deepseek-r1
178
+ $ dr-claw --port 8080 # Start on port 8080
179
+ $ dr-claw -p 3000 # Short form for port
180
+ $ dr-claw start --port 4000 # Explicit start command
181
+ $ dr-claw status # Show configuration
182
+ $ vibelab status # Legacy alias still works
183
+
184
+ Environment Variables:
185
+ PORT Set server port (default: 3001)
186
+ DATABASE_PATH Set custom database location
187
+ CLAUDE_CLI_PATH Set custom Claude CLI path
188
+ CONTEXT_WINDOW Set context window size (default: 160000)
189
+
190
+ Documentation:
191
+ ${packageJson.homepage || 'https://github.com/OpenLAIR/dr-claw'}
192
+
193
+ Report Issues:
194
+ ${packageJson.bugs?.url || 'https://github.com/OpenLAIR/dr-claw/issues'}
195
+ `);
196
+ }
197
+
198
+ // Show version
199
+ function showVersion() {
200
+ console.log(`${packageJson.version}`);
201
+ }
202
+
203
+ // Compare semver versions, returns true if v1 > v2
204
+ function isNewerVersion(v1, v2) {
205
+ const parts1 = v1.split('.').map(Number);
206
+ const parts2 = v2.split('.').map(Number);
207
+ for (let i = 0; i < 3; i++) {
208
+ if (parts1[i] > parts2[i]) return true;
209
+ if (parts1[i] < parts2[i]) return false;
210
+ }
211
+ return false;
212
+ }
213
+
214
+ // Check for updates
215
+ async function checkForUpdates(silent = false) {
216
+ try {
217
+ const { execSync } = await import('child_process');
218
+ const latestVersion = execSync('npm show dr-claw version', { encoding: 'utf8' }).trim();
219
+ const currentVersion = packageJson.version;
220
+
221
+ if (isNewerVersion(latestVersion, currentVersion)) {
222
+ console.log(`\n${c.warn('[UPDATE]')} New version available: ${c.bright(latestVersion)} (current: ${currentVersion})`);
223
+ console.log(` Run ${c.bright('dr-claw update')} to update\n`);
224
+ return { hasUpdate: true, latestVersion, currentVersion };
225
+ } else if (!silent) {
226
+ console.log(`${c.ok('[OK]')} You are on the latest version (${currentVersion})`);
227
+ }
228
+ return { hasUpdate: false, latestVersion, currentVersion };
229
+ } catch (e) {
230
+ if (!silent) {
231
+ console.log(`${c.warn('[WARN]')} Could not check for updates`);
232
+ }
233
+ return { hasUpdate: false, error: e.message };
234
+ }
235
+ }
236
+
237
+ // Update the package
238
+ async function updatePackage() {
239
+ try {
240
+ const { execSync } = await import('child_process');
241
+ console.log(`${c.info('[INFO]')} Checking for updates...`);
242
+
243
+ const { hasUpdate, latestVersion, currentVersion } = await checkForUpdates(true);
244
+
245
+ if (!hasUpdate) {
246
+ console.log(`${c.ok('[OK]')} Already on the latest version (${currentVersion})`);
247
+ return;
248
+ }
249
+
250
+ console.log(`${c.info('[INFO]')} Updating from ${currentVersion} to ${latestVersion}...`);
251
+ execSync('npm update -g dr-claw', { stdio: 'inherit' });
252
+ console.log(`${c.ok('[OK]')} Update complete! Restart dr-claw to use the new version.`);
253
+ } catch (e) {
254
+ console.error(`${c.error('[ERROR]')} Update failed: ${e.message}`);
255
+ console.log(`${c.tip('[TIP]')} Try running manually: npm update -g dr-claw`);
256
+ }
257
+ }
258
+
259
+ // Start the server
260
+ async function startServer() {
261
+ // Check for updates silently on startup
262
+ checkForUpdates(true);
263
+
264
+ // Import and run the server
265
+ await import('./index.js');
266
+ }
267
+
268
+ // Parse CLI arguments
269
+ function parseArgs(args) {
270
+ const parsed = { command: 'start', options: {} };
271
+
272
+ for (let i = 0; i < args.length; i++) {
273
+ const arg = args[i];
274
+
275
+ if (arg === '--port' || arg === '-p') {
276
+ parsed.options.port = args[++i];
277
+ } else if (arg.startsWith('--port=')) {
278
+ parsed.options.port = arg.split('=')[1];
279
+ } else if (arg === '--database-path') {
280
+ parsed.options.databasePath = args[++i];
281
+ } else if (arg.startsWith('--database-path=')) {
282
+ parsed.options.databasePath = arg.split('=')[1];
283
+ } else if (arg === '--model' || arg === '-m') {
284
+ parsed.options.model = args[++i];
285
+ } else if (arg.startsWith('--model=')) {
286
+ parsed.options.model = arg.split('=')[1];
287
+ } else if (arg === '--key') {
288
+ parsed.options.key = args[++i];
289
+ } else if (arg.startsWith('--key=')) {
290
+ parsed.options.key = arg.split('=')[1];
291
+ } else if (arg === '--help' || arg === '-h') {
292
+ parsed.command = 'help';
293
+ } else if (arg === '--version' || arg === '-v') {
294
+ parsed.command = 'version';
295
+ } else if (!arg.startsWith('-')) {
296
+ parsed.command = arg;
297
+ }
298
+ }
299
+
300
+ return parsed;
301
+ }
302
+
303
+ // Main CLI handler
304
+ async function main() {
305
+ const args = process.argv.slice(2);
306
+ const { command, options } = parseArgs(args);
307
+
308
+ // Apply CLI options to environment variables
309
+ if (options.port) {
310
+ process.env.PORT = options.port;
311
+ }
312
+ if (options.databasePath) {
313
+ process.env.DATABASE_PATH = options.databasePath;
314
+ }
315
+
316
+ switch (command) {
317
+ case 'start':
318
+ await startServer();
319
+ break;
320
+ case 'chat': {
321
+ loadEnvFile();
322
+ const { startChat } = await import('./cli-chat.js');
323
+ await startChat({ model: options.model, key: options.key });
324
+ break;
325
+ }
326
+ case 'status':
327
+ case 'info':
328
+ showStatus();
329
+ break;
330
+ case 'help':
331
+ case '-h':
332
+ case '--help':
333
+ showHelp();
334
+ break;
335
+ case 'version':
336
+ case '-v':
337
+ case '--version':
338
+ showVersion();
339
+ break;
340
+ case 'update':
341
+ await updatePackage();
342
+ break;
343
+ default:
344
+ console.error(`\n❌ Unknown command: ${command}`);
345
+ console.log(' Run "dr-claw help" for usage information.\n');
346
+ process.exit(1);
347
+ }
348
+ }
349
+
350
+ // Run the CLI
351
+ main().catch(error => {
352
+ console.error('\n❌ Error:', error.message);
353
+ process.exit(1);
354
+ });