@geminilight/mindos 0.6.40 → 0.6.41

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/_standalone/.mindos-build-version +1 -1
  2. package/_standalone/.next/BUILD_ID +1 -1
  3. package/_standalone/.next/app-path-routes-manifest.json +18 -18
  4. package/_standalone/.next/build-manifest.json +3 -3
  5. package/_standalone/.next/cache/.previewinfo +1 -1
  6. package/_standalone/.next/cache/.rscinfo +1 -1
  7. package/_standalone/.next/cache/config.json +3 -3
  8. package/_standalone/.next/prerender-manifest.json +3 -3
  9. package/_standalone/.next/react-loadable-manifest.json +5 -1
  10. package/_standalone/.next/server/app/.well-known/agent-card.json/route_client-reference-manifest.js +1 -1
  11. package/_standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  12. package/_standalone/.next/server/app/_global-error.html +2 -2
  13. package/_standalone/.next/server/app/_global-error.rsc +1 -1
  14. package/_standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  15. package/_standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  16. package/_standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  17. package/_standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/_standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/_standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/_standalone/.next/server/app/_not-found/page.js +1 -1
  21. package/_standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  22. package/_standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  23. package/_standalone/.next/server/app/agents/[agentKey]/page.js +1 -1
  24. package/_standalone/.next/server/app/agents/[agentKey]/page.js.nft.json +1 -1
  25. package/_standalone/.next/server/app/agents/[agentKey]/page_client-reference-manifest.js +1 -1
  26. package/_standalone/.next/server/app/agents/page.js +2 -2
  27. package/_standalone/.next/server/app/agents/page.js.nft.json +1 -1
  28. package/_standalone/.next/server/app/agents/page_client-reference-manifest.js +1 -1
  29. package/_standalone/.next/server/app/api/a2a/agents/route_client-reference-manifest.js +1 -1
  30. package/_standalone/.next/server/app/api/a2a/delegations/route_client-reference-manifest.js +1 -1
  31. package/_standalone/.next/server/app/api/a2a/discover/route_client-reference-manifest.js +1 -1
  32. package/_standalone/.next/server/app/api/a2a/route_client-reference-manifest.js +1 -1
  33. package/_standalone/.next/server/app/api/acp/config/route_client-reference-manifest.js +1 -1
  34. package/_standalone/.next/server/app/api/acp/detect/route_client-reference-manifest.js +1 -1
  35. package/_standalone/.next/server/app/api/acp/install/route_client-reference-manifest.js +1 -1
  36. package/_standalone/.next/server/app/api/acp/registry/route_client-reference-manifest.js +1 -1
  37. package/_standalone/.next/server/app/api/acp/session/route_client-reference-manifest.js +1 -1
  38. package/_standalone/.next/server/app/api/agent-activity/route_client-reference-manifest.js +1 -1
  39. package/_standalone/.next/server/app/api/ask/route.js +1 -1
  40. package/_standalone/.next/server/app/api/ask/route.js.nft.json +1 -1
  41. package/_standalone/.next/server/app/api/ask/route_client-reference-manifest.js +1 -1
  42. package/_standalone/.next/server/app/api/ask-sessions/route_client-reference-manifest.js +1 -1
  43. package/_standalone/.next/server/app/api/auth/route_client-reference-manifest.js +1 -1
  44. package/_standalone/.next/server/app/api/backlinks/route.js.nft.json +1 -1
  45. package/_standalone/.next/server/app/api/backlinks/route_client-reference-manifest.js +1 -1
  46. package/_standalone/.next/server/app/api/bootstrap/route.js.nft.json +1 -1
  47. package/_standalone/.next/server/app/api/bootstrap/route_client-reference-manifest.js +1 -1
  48. package/_standalone/.next/server/app/api/changes/route.js.nft.json +1 -1
  49. package/_standalone/.next/server/app/api/changes/route_client-reference-manifest.js +1 -1
  50. package/_standalone/.next/server/app/api/export/route.js.nft.json +1 -1
  51. package/_standalone/.next/server/app/api/export/route_client-reference-manifest.js +1 -1
  52. package/_standalone/.next/server/app/api/extract-pdf/route_client-reference-manifest.js +1 -1
  53. package/_standalone/.next/server/app/api/file/import/route.js.nft.json +1 -1
  54. package/_standalone/.next/server/app/api/file/import/route_client-reference-manifest.js +1 -1
  55. package/_standalone/.next/server/app/api/file/route.js.nft.json +1 -1
  56. package/_standalone/.next/server/app/api/file/route_client-reference-manifest.js +1 -1
  57. package/_standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  58. package/_standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  59. package/_standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  60. package/_standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  61. package/_standalone/.next/server/app/api/graph/route.js.nft.json +1 -1
  62. package/_standalone/.next/server/app/api/graph/route_client-reference-manifest.js +1 -1
  63. package/_standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  64. package/_standalone/.next/server/app/api/inbox/route.js.nft.json +1 -1
  65. package/_standalone/.next/server/app/api/inbox/route_client-reference-manifest.js +1 -1
  66. package/_standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  67. package/_standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -1
  68. package/_standalone/.next/server/app/api/mcp/agents/route.js.nft.json +1 -1
  69. package/_standalone/.next/server/app/api/mcp/agents/route_client-reference-manifest.js +1 -1
  70. package/_standalone/.next/server/app/api/mcp/install/route.js +1 -1
  71. package/_standalone/.next/server/app/api/mcp/install/route_client-reference-manifest.js +1 -1
  72. package/_standalone/.next/server/app/api/mcp/install-skill/route.js.nft.json +1 -1
  73. package/_standalone/.next/server/app/api/mcp/install-skill/route_client-reference-manifest.js +1 -1
  74. package/_standalone/.next/server/app/api/mcp/restart/route_client-reference-manifest.js +1 -1
  75. package/_standalone/.next/server/app/api/mcp/status/route.js +1 -1
  76. package/_standalone/.next/server/app/api/mcp/status/route_client-reference-manifest.js +1 -1
  77. package/_standalone/.next/server/app/api/monitoring/route.js.nft.json +1 -1
  78. package/_standalone/.next/server/app/api/monitoring/route_client-reference-manifest.js +1 -1
  79. package/_standalone/.next/server/app/api/recent-files/route.js.nft.json +1 -1
  80. package/_standalone/.next/server/app/api/recent-files/route_client-reference-manifest.js +1 -1
  81. package/_standalone/.next/server/app/api/restart/route_client-reference-manifest.js +1 -1
  82. package/_standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  83. package/_standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  84. package/_standalone/.next/server/app/api/settings/list-models/route_client-reference-manifest.js +1 -1
  85. package/_standalone/.next/server/app/api/settings/reset-token/route_client-reference-manifest.js +1 -1
  86. package/_standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  87. package/_standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  88. package/_standalone/.next/server/app/api/settings/test-key/route_client-reference-manifest.js +1 -1
  89. package/_standalone/.next/server/app/api/setup/check-path/route_client-reference-manifest.js +1 -1
  90. package/_standalone/.next/server/app/api/setup/check-port/route_client-reference-manifest.js +1 -1
  91. package/_standalone/.next/server/app/api/setup/generate-token/route_client-reference-manifest.js +1 -1
  92. package/_standalone/.next/server/app/api/setup/ls/route_client-reference-manifest.js +1 -1
  93. package/_standalone/.next/server/app/api/setup/route_client-reference-manifest.js +1 -1
  94. package/_standalone/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  95. package/_standalone/.next/server/app/api/sync/route_client-reference-manifest.js +1 -1
  96. package/_standalone/.next/server/app/api/tree-version/route.js.nft.json +1 -1
  97. package/_standalone/.next/server/app/api/tree-version/route_client-reference-manifest.js +1 -1
  98. package/_standalone/.next/server/app/api/uninstall/route_client-reference-manifest.js +1 -1
  99. package/_standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  100. package/_standalone/.next/server/app/api/update-check/route_client-reference-manifest.js +1 -1
  101. package/_standalone/.next/server/app/api/update-status/route_client-reference-manifest.js +1 -1
  102. package/_standalone/.next/server/app/api/workflows/route.js.nft.json +1 -1
  103. package/_standalone/.next/server/app/api/workflows/route_client-reference-manifest.js +1 -1
  104. package/_standalone/.next/server/app/changes/page.js +1 -1
  105. package/_standalone/.next/server/app/changes/page.js.nft.json +1 -1
  106. package/_standalone/.next/server/app/changes/page_client-reference-manifest.js +1 -1
  107. package/_standalone/.next/server/app/echo/[segment]/page.js +1 -1
  108. package/_standalone/.next/server/app/echo/[segment]/page.js.nft.json +1 -1
  109. package/_standalone/.next/server/app/echo/[segment]/page_client-reference-manifest.js +1 -1
  110. package/_standalone/.next/server/app/echo/page.js +1 -1
  111. package/_standalone/.next/server/app/echo/page.js.nft.json +1 -1
  112. package/_standalone/.next/server/app/echo/page_client-reference-manifest.js +1 -1
  113. package/_standalone/.next/server/app/explore/page.js +1 -1
  114. package/_standalone/.next/server/app/explore/page.js.nft.json +1 -1
  115. package/_standalone/.next/server/app/explore/page_client-reference-manifest.js +1 -1
  116. package/_standalone/.next/server/app/help/page.js +2 -2
  117. package/_standalone/.next/server/app/help/page.js.nft.json +1 -1
  118. package/_standalone/.next/server/app/help/page_client-reference-manifest.js +1 -1
  119. package/_standalone/.next/server/app/login/page.js +1 -1
  120. package/_standalone/.next/server/app/login/page.js.nft.json +1 -1
  121. package/_standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  122. package/_standalone/.next/server/app/page.js +2 -2
  123. package/_standalone/.next/server/app/page.js.nft.json +1 -1
  124. package/_standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  125. package/_standalone/.next/server/app/setup/page.js +2 -2
  126. package/_standalone/.next/server/app/setup/page.js.nft.json +1 -1
  127. package/_standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  128. package/_standalone/.next/server/app/trash/page.js +3 -3
  129. package/_standalone/.next/server/app/trash/page.js.nft.json +1 -1
  130. package/_standalone/.next/server/app/trash/page_client-reference-manifest.js +1 -1
  131. package/_standalone/.next/server/app/view/[...path]/page.js +3 -3
  132. package/_standalone/.next/server/app/view/[...path]/page.js.nft.json +1 -1
  133. package/_standalone/.next/server/app/view/[...path]/page_client-reference-manifest.js +1 -1
  134. package/_standalone/.next/server/app-paths-manifest.json +18 -18
  135. package/_standalone/.next/server/chunks/1550.js +1 -1
  136. package/_standalone/.next/server/chunks/2190.js +11 -0
  137. package/_standalone/.next/server/chunks/{6365.js → 2536.js} +2 -2
  138. package/_standalone/.next/server/chunks/5648.js +2 -0
  139. package/_standalone/.next/server/chunks/8388.js +1 -1
  140. package/_standalone/.next/server/chunks/953.js +1 -1
  141. package/_standalone/.next/server/chunks/9539.js +219 -0
  142. package/_standalone/.next/server/middleware-build-manifest.js +1 -1
  143. package/_standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  144. package/_standalone/.next/server/next-font-manifest.js +1 -1
  145. package/_standalone/.next/server/next-font-manifest.json +1 -1
  146. package/_standalone/.next/server/pages/500.html +2 -2
  147. package/_standalone/.next/server/server-reference-manifest.js +1 -1
  148. package/_standalone/.next/server/server-reference-manifest.json +1 -1
  149. package/_standalone/.next/static/chunks/1053-b70535785cc5aaee.js +29 -0
  150. package/_standalone/.next/static/chunks/{8663-de911d2d395622be.js → 1880-c2a9e76201841c86.js} +1 -1
  151. package/_standalone/.next/static/chunks/3637.0541ac2d0ea7de1f.js +1 -0
  152. package/_standalone/.next/static/chunks/4563-b2a2ce80aff845af.js +6 -0
  153. package/_standalone/.next/static/chunks/6981-3d7dcac2d12a5670.js +1 -0
  154. package/_standalone/.next/static/chunks/7144-5febf62f1a79fe64.js +1 -0
  155. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-773071a99c4daac2.js +1 -0
  156. package/_standalone/.next/static/chunks/app/agents/page-6102a884b2cb3cfe.js +5 -0
  157. package/_standalone/.next/static/chunks/app/help/page-2325d25b6846ca07.js +1 -0
  158. package/_standalone/.next/static/chunks/app/{layout-9378c1c8d3e5761b.js → layout-42cdbce19f404567.js} +34 -34
  159. package/_standalone/.next/static/chunks/app/{page-9bae420fbbdc5fff.js → page-8c9643b649e01735.js} +1 -1
  160. package/_standalone/.next/static/chunks/app/setup/page-d158b8cb533feb1e.js +1 -0
  161. package/_standalone/.next/static/chunks/app/trash/{page-b61ef2d5cd4f8d73.js → page-e9ab74ffeb96af41.js} +1 -1
  162. package/_standalone/.next/static/chunks/app/view/[...path]/page-764a69a1c8bd4eef.js +12 -0
  163. package/_standalone/.next/static/chunks/{webpack-c28c55d0a6021a6b.js → webpack-7b276daaa930d480.js} +1 -1
  164. package/_standalone/.next/static/css/bc9179074eaf65ae.css +1 -0
  165. package/_standalone/.next/trace +63 -63
  166. package/_standalone/__tests__/api/mcp-install.test.ts +23 -0
  167. package/_standalone/__tests__/cli/agent-routing.test.ts +232 -0
  168. package/_standalone/__tests__/cli/file-subcommands.test.ts +379 -0
  169. package/_standalone/__tests__/core/tools.test.ts +3 -6
  170. package/_standalone/components/FileTree.tsx +3 -2
  171. package/_standalone/components/MarkdownView.tsx +30 -15
  172. package/_standalone/components/RightAskPanel.tsx +36 -6
  173. package/_standalone/components/Sidebar.tsx +3 -3
  174. package/_standalone/components/agents/AgentsMcpSection.tsx +3 -0
  175. package/_standalone/components/settings/McpAgentInstall.tsx +94 -27
  176. package/_standalone/components/settings/McpSkillsSection.tsx +1 -1
  177. package/_standalone/components/settings/McpTab.tsx +484 -340
  178. package/_standalone/components/settings/SettingsContent.tsx +12 -6
  179. package/_standalone/components/settings/types.ts +3 -0
  180. package/_standalone/components/setup/StepAgents.tsx +113 -47
  181. package/_standalone/components/setup/StepReview.tsx +14 -27
  182. package/_standalone/components/setup/types.ts +6 -0
  183. package/_standalone/data/skills/mindos/SKILL.md +92 -92
  184. package/_standalone/data/skills/mindos/references/write-supplement.md +119 -0
  185. package/_standalone/data/skills/mindos-zh/SKILL.md +100 -104
  186. package/_standalone/data/skills/mindos-zh/references/write-supplement.md +119 -0
  187. package/_standalone/lib/i18n/modules/features.ts +4 -4
  188. package/_standalone/lib/i18n/modules/knowledge.ts +4 -0
  189. package/_standalone/lib/i18n/modules/onboarding.ts +40 -30
  190. package/_standalone/lib/i18n/modules/settings.ts +78 -6
  191. package/_standalone/lib/mcp-snippets.ts +5 -1
  192. package/_standalone/tsconfig.tsbuildinfo +1 -1
  193. package/app/app/api/ask/route.ts +3 -2
  194. package/app/app/api/mcp/install/route.ts +2 -1
  195. package/app/app/api/mcp/status/route.ts +14 -6
  196. package/app/app/view/[...path]/ViewPageClient.tsx +12 -27
  197. package/app/components/FileTree.tsx +3 -2
  198. package/app/components/MarkdownView.tsx +30 -15
  199. package/app/components/RightAskPanel.tsx +36 -6
  200. package/app/components/Sidebar.tsx +3 -3
  201. package/app/components/agents/AgentsMcpSection.tsx +3 -0
  202. package/app/components/help/HelpContent.tsx +1 -0
  203. package/app/components/settings/McpAgentInstall.tsx +94 -27
  204. package/app/components/settings/McpSkillsSection.tsx +1 -1
  205. package/app/components/settings/McpTab.tsx +484 -340
  206. package/app/components/settings/SettingsContent.tsx +12 -6
  207. package/app/components/settings/types.ts +3 -0
  208. package/app/components/setup/StepAgents.tsx +113 -47
  209. package/app/components/setup/StepReview.tsx +14 -27
  210. package/app/components/setup/index.tsx +12 -11
  211. package/app/components/setup/types.ts +6 -0
  212. package/app/data/skills/mindos/SKILL.md +92 -92
  213. package/app/data/skills/mindos/references/write-supplement.md +119 -0
  214. package/app/data/skills/mindos-zh/SKILL.md +100 -104
  215. package/app/data/skills/mindos-zh/references/write-supplement.md +119 -0
  216. package/app/lib/fs.ts +0 -6
  217. package/app/lib/i18n/modules/features.ts +4 -4
  218. package/app/lib/i18n/modules/knowledge.ts +4 -0
  219. package/app/lib/i18n/modules/onboarding.ts +40 -30
  220. package/app/lib/i18n/modules/settings.ts +78 -6
  221. package/app/lib/mcp-agents.ts +1 -2
  222. package/app/lib/mcp-snippets.ts +5 -1
  223. package/app/lib/renderers/index.ts +2 -1
  224. package/bin/cli.js +168 -1404
  225. package/bin/commands/agent.js +156 -20
  226. package/bin/commands/api.js +14 -11
  227. package/bin/commands/ask.js +79 -68
  228. package/bin/commands/build.js +26 -0
  229. package/bin/commands/config.js +170 -0
  230. package/bin/commands/dev.js +58 -0
  231. package/bin/commands/doctor.js +205 -0
  232. package/bin/commands/file.js +551 -36
  233. package/bin/commands/gateway.js +42 -0
  234. package/bin/commands/init-skills.js +56 -0
  235. package/bin/commands/logs.js +32 -0
  236. package/bin/commands/mcp-cmd.js +57 -0
  237. package/bin/commands/onboard.js +25 -0
  238. package/bin/commands/open.js +41 -0
  239. package/bin/commands/restart.js +48 -0
  240. package/bin/commands/search.js +16 -14
  241. package/bin/commands/space.js +96 -25
  242. package/bin/commands/start.js +262 -0
  243. package/bin/commands/status.js +2 -2
  244. package/bin/commands/stop.js +14 -0
  245. package/bin/commands/sync-cmd.js +134 -0
  246. package/bin/commands/token.js +98 -0
  247. package/bin/commands/uninstall.js +154 -0
  248. package/bin/commands/update.js +286 -0
  249. package/bin/lib/build.js +1 -1
  250. package/bin/lib/colors.js +8 -7
  251. package/bin/lib/command.js +37 -96
  252. package/bin/lib/config.js +5 -0
  253. package/bin/lib/csv.js +19 -0
  254. package/bin/lib/jsonc.js +12 -0
  255. package/bin/lib/markdown.js +69 -0
  256. package/bin/lib/mcp-agents.js +1 -6
  257. package/bin/lib/mcp-build.js +1 -1
  258. package/bin/lib/mcp-install.js +2 -1
  259. package/bin/lib/one-shot.js +88 -0
  260. package/bin/lib/path-expand.js +9 -0
  261. package/bin/lib/remote.js +65 -0
  262. package/bin/lib/repl.js +167 -0
  263. package/bin/lib/{utils.js → shell.js} +10 -26
  264. package/bin/lib/skill-check.js +1 -1
  265. package/bin/lib/sse-stream.js +167 -0
  266. package/package.json +2 -2
  267. package/scripts/setup.js +182 -120
  268. package/skills/mindos/SKILL.md +92 -92
  269. package/skills/mindos-zh/SKILL.md +100 -104
  270. package/_standalone/.next/server/chunks/1955.js +0 -11
  271. package/_standalone/.next/server/chunks/3680.js +0 -1
  272. package/_standalone/.next/server/chunks/4497.js +0 -219
  273. package/_standalone/.next/server/chunks/5560.js +0 -2
  274. package/_standalone/.next/static/chunks/1053-0adaccc98a752a58.js +0 -29
  275. package/_standalone/.next/static/chunks/3637.f9a42cca59fd5bb5.js +0 -1
  276. package/_standalone/.next/static/chunks/4563-c2afaeacb241d1d0.js +0 -6
  277. package/_standalone/.next/static/chunks/6090-c98268ca726a68d3.js +0 -1
  278. package/_standalone/.next/static/chunks/9371-575600301da5d6bb.js +0 -1
  279. package/_standalone/.next/static/chunks/app/agents/[agentKey]/page-3e08abb495ecd5fd.js +0 -1
  280. package/_standalone/.next/static/chunks/app/agents/page-e7e0f87ad3d765ac.js +0 -5
  281. package/_standalone/.next/static/chunks/app/help/page-3d0e1ceaa4abc243.js +0 -1
  282. package/_standalone/.next/static/chunks/app/setup/page-99ed3d1bb6b8f4ef.js +0 -1
  283. package/_standalone/.next/static/chunks/app/view/[...path]/page-44fa78cbea613a78.js +0 -12
  284. package/_standalone/.next/static/css/d300701f384db50d.css +0 -1
  285. package/_standalone/components/renderers/agent-inspector/manifest.ts +0 -16
  286. /package/_standalone/.next/static/{rZLs1krFuduixvcVNe6q3 → Ij3PFh-a0zi5K_ANoSAW0}/_buildManifest.js +0 -0
  287. /package/_standalone/.next/static/{rZLs1krFuduixvcVNe6q3 → Ij3PFh-a0zi5K_ANoSAW0}/_ssgManifest.js +0 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * mindos dev — Start Next.js app and MCP server in development mode.
3
+ *
4
+ * Sets default ports, ensures app dependencies, spawns MCP, optionally starts
5
+ * cross-device sync daemon, then runs `next dev`.
6
+ */
7
+
8
+ import { resolve } from 'node:path';
9
+ import { ROOT } from '../lib/constants.js';
10
+ import { loadConfig } from '../lib/config.js';
11
+ import { ensureAppDeps } from '../lib/build.js';
12
+ import { assertPortFree } from '../lib/port.js';
13
+ import { savePids, clearPids } from '../lib/pid.js';
14
+ import { printStartupInfo } from '../lib/startup.js';
15
+ import { spawnMcp } from '../lib/mcp-spawn.js';
16
+ import { execInherited } from '../lib/shell.js';
17
+
18
+ export const meta = {
19
+ name: 'dev',
20
+ group: 'Service',
21
+ summary: 'Start in dev mode (hot reload)',
22
+ usage: 'mindos dev',
23
+ flags: {
24
+ '--verbose': 'Show MCP server output',
25
+ },
26
+ examples: [
27
+ 'mindos dev',
28
+ 'mindos dev --verbose',
29
+ ],
30
+ };
31
+
32
+ export const run = async (args, flags) => {
33
+ const NEXT_BIN = resolve(ROOT, 'app', 'node_modules', '.bin', 'next');
34
+ loadConfig();
35
+ if (!process.env.MINDOS_WEB_PORT) process.env.MINDOS_WEB_PORT = '3456';
36
+ if (!process.env.MINDOS_MCP_PORT) process.env.MINDOS_MCP_PORT = '8781';
37
+ process.env.MINDOS_CLI_PATH = resolve(ROOT, 'bin', 'cli.js');
38
+ process.env.MINDOS_NODE_BIN = process.execPath;
39
+ const webPort = process.env.MINDOS_WEB_PORT;
40
+ const mcpPort = process.env.MINDOS_MCP_PORT;
41
+ await assertPortFree(Number(webPort), 'web');
42
+ await assertPortFree(Number(mcpPort), 'mcp');
43
+ ensureAppDeps({ force: true }); // dev mode always needs app/node_modules
44
+ const { stopSyncDaemon, startSyncDaemon } = await import('../lib/sync.js');
45
+
46
+ const mcp = spawnMcp(flags.verbose === true);
47
+ savePids(process.pid, mcp.pid);
48
+ process.on('exit', () => {
49
+ try { stopSyncDaemon(); } catch {}
50
+ clearPids();
51
+ });
52
+ const devMindRoot = process.env.MIND_ROOT;
53
+ if (devMindRoot) {
54
+ startSyncDaemon(devMindRoot).catch(() => {});
55
+ }
56
+ await printStartupInfo(webPort, mcpPort);
57
+ execInherited(`${NEXT_BIN} dev -p ${webPort} ${args.join(' ')}`, resolve(ROOT, 'app'));
58
+ };
@@ -0,0 +1,205 @@
1
+ /**
2
+ * mindos doctor — Health check for config, mindRoot, AI keys, Node/npm, build,
3
+ * listening ports, OS daemon, sync, and update availability.
4
+ */
5
+
6
+ import { execSync } from 'node:child_process';
7
+ import { existsSync, readFileSync } from 'node:fs';
8
+ import { resolve } from 'node:path';
9
+ import { homedir } from 'node:os';
10
+ import { CONFIG_PATH, ROOT } from '../lib/constants.js';
11
+ import { bold, dim, cyan, green, red, yellow } from '../lib/colors.js';
12
+ import { isPortInUse } from '../lib/port.js';
13
+ import { EXIT } from '../lib/command.js';
14
+
15
+ export const meta = {
16
+ name: 'doctor',
17
+ group: 'Config',
18
+ summary: 'Check installation health',
19
+ usage: 'mindos doctor',
20
+ flags: {
21
+ '--json': 'Output as JSON',
22
+ },
23
+ examples: [
24
+ 'mindos doctor',
25
+ 'mindos doctor --json',
26
+ ],
27
+ };
28
+
29
+ export const run = async (_args, flags) => {
30
+ const jsonMode = flags.json === true;
31
+ const checks = [];
32
+ const ok = (msg, key) => { checks.push({ status: 'ok', key, msg }); if (!jsonMode) console.log(` ${green('✔')} ${msg}`); };
33
+ const err = (msg, key) => { checks.push({ status: 'error', key, msg }); if (!jsonMode) console.log(` ${red('✘')} ${msg}`); };
34
+ const warn = (msg, key) => { checks.push({ status: 'warn', key, msg }); if (!jsonMode) console.log(` ${yellow('!')} ${msg}`); };
35
+
36
+ if (!jsonMode) console.log(`\n${bold('MindOS Doctor')}\n`);
37
+ let hasError = false;
38
+
39
+ // 1. config file
40
+ if (!existsSync(CONFIG_PATH)) {
41
+ err(`Config not found at ${dim(CONFIG_PATH)}`, 'config');
42
+ if (!jsonMode) { console.log(`\n ${dim('Run `mindos onboard` to create it.')}\n`); }
43
+ if (jsonMode) { console.log(JSON.stringify({ ok: false, checks }, null, 2)); }
44
+ process.exit(EXIT.ERROR);
45
+ }
46
+ let config;
47
+ try {
48
+ config = JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));
49
+ ok(`Config file found and valid JSON ${dim(CONFIG_PATH)}`, 'config');
50
+ } catch {
51
+ err(`Config file exists but failed to parse ${dim(CONFIG_PATH)}`, 'config');
52
+ hasError = true;
53
+ }
54
+
55
+ // 2. mindRoot
56
+ if (config) {
57
+ const mindRoot = config.mindRoot;
58
+ if (!mindRoot) {
59
+ err('Config missing required field: mindRoot');
60
+ hasError = true;
61
+ } else if (!existsSync(mindRoot.replace(/^~/, homedir()))) {
62
+ warn(`mindRoot path does not exist: ${dim(mindRoot)} (will be created on first start)`);
63
+ } else {
64
+ ok(`Knowledge base path exists ${dim(mindRoot)}`);
65
+ }
66
+ }
67
+
68
+ // 3. AI config
69
+ if (config) {
70
+ const provider = config.ai?.provider;
71
+ const providers = config.ai?.providers;
72
+ const hasAnthropic = providers?.anthropic?.apiKey || config.ai?.anthropicApiKey;
73
+ const hasOpenai = providers?.openai?.apiKey || config.ai?.openaiApiKey;
74
+ if (!provider) {
75
+ warn('AI provider not configured (run `mindos onboard` to set up)');
76
+ } else if (provider === 'anthropic' && !hasAnthropic) {
77
+ err('AI provider is "anthropic" but no API key found');
78
+ hasError = true;
79
+ } else if (provider === 'openai' && !hasOpenai) {
80
+ err('AI provider is "openai" but no API key found');
81
+ hasError = true;
82
+ } else {
83
+ ok(`AI provider configured ${dim(provider)}`);
84
+ }
85
+ }
86
+
87
+ // 4. Node version
88
+ const nodeVersion = process.versions.node;
89
+ const [nodeMajor] = nodeVersion.split('.').map(Number);
90
+ if (nodeMajor < 18) {
91
+ err(`Node.js ${nodeVersion} is below minimum required (18+)`);
92
+ hasError = true;
93
+ } else {
94
+ ok(`Node.js ${nodeVersion}`);
95
+ }
96
+
97
+ // 4b. npm reachable from /bin/sh
98
+ try {
99
+ const npmVersion = execSync('npm --version', { stdio: 'pipe' }).toString().trim();
100
+ ok(`npm ${npmVersion} reachable`);
101
+ } catch {
102
+ err('npm not found in PATH — app dependencies cannot be installed');
103
+ console.log(dim(' Node.js may be installed via nvm/fnm/volta and not visible to /bin/sh.'));
104
+ console.log(dim(' Fix: add your Node.js bin path to ~/.profile so non-interactive shells can find it.'));
105
+ hasError = true;
106
+ }
107
+
108
+ const { hasPrebuiltStandalone, needsBuild } = await import('../lib/build.js');
109
+
110
+ // 5. Build
111
+ if (hasPrebuiltStandalone()) {
112
+ ok('Production build is up to date (prebuilt standalone)');
113
+ } else if (!existsSync(resolve(ROOT, 'app', '.next'))) {
114
+ warn(`App not built yet — will build automatically on next ${dim('mindos start')}`);
115
+ } else if (needsBuild()) {
116
+ warn(`Build is outdated — will rebuild automatically on next ${dim('mindos start')}`);
117
+ } else {
118
+ ok('Production build is up to date');
119
+ }
120
+
121
+ // 6. Ports
122
+ const webPort = Number(config?.port || process.env.MINDOS_WEB_PORT || 3456);
123
+ const mcpPort = Number(config?.mcpPort || process.env.MINDOS_MCP_PORT || 8781);
124
+ const webInUse = await isPortInUse(webPort);
125
+ const mcpInUse = await isPortInUse(mcpPort);
126
+ if (webInUse) {
127
+ ok(`Web server is listening on port ${webPort}`);
128
+ } else {
129
+ warn(`Web server is not running on port ${webPort}`);
130
+ }
131
+ if (mcpInUse) {
132
+ ok(`MCP server is listening on port ${mcpPort}`);
133
+ } else {
134
+ warn(`MCP server is not running on port ${mcpPort}`);
135
+ }
136
+
137
+ // 7. Daemon status
138
+ const { getPlatform } = await import('../lib/gateway.js');
139
+ const platform = getPlatform();
140
+ if (platform === 'systemd') {
141
+ try {
142
+ execSync('systemctl --user is-active mindos', { stdio: 'pipe' });
143
+ ok('Systemd service mindos is active');
144
+ } catch {
145
+ warn('Systemd service mindos is not active (run `mindos gateway start` to start)');
146
+ }
147
+ } else if (platform === 'launchd') {
148
+ try {
149
+ const uid = execSync('id -u').toString().trim();
150
+ execSync(`launchctl print gui/${uid}/com.mindos.app`, { stdio: 'pipe' });
151
+ ok('LaunchAgent com.mindos.app is loaded');
152
+ } catch {
153
+ warn('LaunchAgent com.mindos.app is not loaded (run `mindos gateway start` to start)');
154
+ }
155
+ }
156
+
157
+ // 8. Sync status
158
+ if (config?.mindRoot) {
159
+ try {
160
+ const { getSyncStatus } = await import('../lib/sync.js');
161
+ const syncStatus = await getSyncStatus(config.mindRoot);
162
+ if (!syncStatus.enabled) {
163
+ warn(`Cross-device sync is not configured ${dim('(run `mindos sync init` to set up)')}`);
164
+ } else if (syncStatus.lastError) {
165
+ err(`Sync error: ${syncStatus.lastError}`);
166
+ hasError = true;
167
+ } else if (syncStatus.conflicts && syncStatus.conflicts.length > 0) {
168
+ warn(`Sync has ${syncStatus.conflicts.length} unresolved conflict(s) ${dim('(run `mindos sync conflicts` to view)')}`);
169
+ } else {
170
+ const unpushed = parseInt(syncStatus.unpushed || '0', 10);
171
+ const extra = unpushed > 0 ? ` ${dim(`(${unpushed} unpushed commit(s))`)}` : '';
172
+ ok(`Sync enabled ${dim(syncStatus.remote || 'origin')}${extra}`);
173
+ }
174
+ } catch {
175
+ warn('Could not check sync status');
176
+ }
177
+ }
178
+
179
+ // 9. Update check
180
+ try {
181
+ const { checkForUpdate } = await import('../lib/update-check.js');
182
+ const latestVersion = await Promise.race([
183
+ checkForUpdate(),
184
+ new Promise((r) => setTimeout(() => r(null), 4000)),
185
+ ]);
186
+ if (latestVersion) {
187
+ const currentVersion = (() => { try { return JSON.parse(readFileSync(resolve(ROOT, 'package.json'), 'utf-8')).version; } catch { return '?'; } })();
188
+ warn(`Update available: v${currentVersion} → ${bold(`v${latestVersion}`)} ${dim('run `mindos update`')}`);
189
+ } else {
190
+ ok('MindOS is up to date');
191
+ }
192
+ } catch {
193
+ warn('Could not check for updates');
194
+ }
195
+
196
+ if (jsonMode) {
197
+ const hasErr = checks.some((c) => c.status === 'error');
198
+ console.log(JSON.stringify({ ok: !hasErr, checks }, null, 2));
199
+ } else {
200
+ console.log(hasError
201
+ ? `\n${red('Some checks failed.')} Run ${cyan('mindos onboard')} to reconfigure.\n`
202
+ : `\n${green('All checks passed.')}\n`);
203
+ }
204
+ if (hasError) process.exit(EXIT.ERROR);
205
+ };