zero-workspace 0.0.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 (507) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +187 -0
  3. package/config/component-versions.json +16 -0
  4. package/config/scenarioCapabilities.json +29 -0
  5. package/config/version-notes.yaml +244 -0
  6. package/dist/adapters/OutputAdapter.d.ts +79 -0
  7. package/dist/adapters/OutputAdapter.d.ts.map +1 -0
  8. package/dist/adapters/OutputAdapter.js +124 -0
  9. package/dist/adapters/OutputAdapter.js.map +1 -0
  10. package/dist/cli/check-node-version.d.ts +3 -0
  11. package/dist/cli/check-node-version.d.ts.map +1 -0
  12. package/dist/cli/check-node-version.js +153 -0
  13. package/dist/cli/check-node-version.js.map +1 -0
  14. package/dist/cli/plugins.d.ts +41 -0
  15. package/dist/cli/plugins.d.ts.map +1 -0
  16. package/dist/cli/plugins.js +742 -0
  17. package/dist/cli/plugins.js.map +1 -0
  18. package/dist/cli/rebuild.d.ts +63 -0
  19. package/dist/cli/rebuild.d.ts.map +1 -0
  20. package/dist/cli/rebuild.js +989 -0
  21. package/dist/cli/rebuild.js.map +1 -0
  22. package/dist/cli/repair.d.ts +7 -0
  23. package/dist/cli/repair.d.ts.map +1 -0
  24. package/dist/cli/repair.js +925 -0
  25. package/dist/cli/repair.js.map +1 -0
  26. package/dist/cli/setup.d.ts +7 -0
  27. package/dist/cli/setup.d.ts.map +1 -0
  28. package/dist/cli/setup.js +452 -0
  29. package/dist/cli/setup.js.map +1 -0
  30. package/dist/cli/update.d.ts +10 -0
  31. package/dist/cli/update.d.ts.map +1 -0
  32. package/dist/cli/update.js +426 -0
  33. package/dist/cli/update.js.map +1 -0
  34. package/dist/cli/webui.d.ts +6 -0
  35. package/dist/cli/webui.d.ts.map +1 -0
  36. package/dist/cli/webui.js +210 -0
  37. package/dist/cli/webui.js.map +1 -0
  38. package/dist/http/index.d.ts +3 -0
  39. package/dist/http/index.d.ts.map +1 -0
  40. package/dist/http/index.js +15 -0
  41. package/dist/http/index.js.map +1 -0
  42. package/dist/http/middleware/errorHandler.d.ts +16 -0
  43. package/dist/http/middleware/errorHandler.d.ts.map +1 -0
  44. package/dist/http/middleware/errorHandler.js +79 -0
  45. package/dist/http/middleware/errorHandler.js.map +1 -0
  46. package/dist/http/routes/admin.d.ts +3 -0
  47. package/dist/http/routes/admin.d.ts.map +1 -0
  48. package/dist/http/routes/admin.js +730 -0
  49. package/dist/http/routes/admin.js.map +1 -0
  50. package/dist/http/routes/backup.d.ts +3 -0
  51. package/dist/http/routes/backup.d.ts.map +1 -0
  52. package/dist/http/routes/backup.js +172 -0
  53. package/dist/http/routes/backup.js.map +1 -0
  54. package/dist/http/routes/config.d.ts +3 -0
  55. package/dist/http/routes/config.d.ts.map +1 -0
  56. package/dist/http/routes/config.js +157 -0
  57. package/dist/http/routes/config.js.map +1 -0
  58. package/dist/http/routes/context.d.ts +3 -0
  59. package/dist/http/routes/context.d.ts.map +1 -0
  60. package/dist/http/routes/context.js +82 -0
  61. package/dist/http/routes/context.js.map +1 -0
  62. package/dist/http/routes/log.d.ts +3 -0
  63. package/dist/http/routes/log.d.ts.map +1 -0
  64. package/dist/http/routes/log.js +105 -0
  65. package/dist/http/routes/log.js.map +1 -0
  66. package/dist/http/routes/memo.d.ts +6 -0
  67. package/dist/http/routes/memo.d.ts.map +1 -0
  68. package/dist/http/routes/memo.js +29 -0
  69. package/dist/http/routes/memo.js.map +1 -0
  70. package/dist/http/routes/node.d.ts +3 -0
  71. package/dist/http/routes/node.d.ts.map +1 -0
  72. package/dist/http/routes/node.js +251 -0
  73. package/dist/http/routes/node.js.map +1 -0
  74. package/dist/http/routes/state.d.ts +3 -0
  75. package/dist/http/routes/state.d.ts.map +1 -0
  76. package/dist/http/routes/state.js +48 -0
  77. package/dist/http/routes/state.js.map +1 -0
  78. package/dist/http/routes/workspace.d.ts +3 -0
  79. package/dist/http/routes/workspace.d.ts.map +1 -0
  80. package/dist/http/routes/workspace.js +249 -0
  81. package/dist/http/routes/workspace.js.map +1 -0
  82. package/dist/http/server.d.ts +10 -0
  83. package/dist/http/server.d.ts.map +1 -0
  84. package/dist/http/server.js +284 -0
  85. package/dist/http/server.js.map +1 -0
  86. package/dist/http/services.d.ts +93 -0
  87. package/dist/http/services.d.ts.map +1 -0
  88. package/dist/http/services.js +297 -0
  89. package/dist/http/services.js.map +1 -0
  90. package/dist/index.d.ts +3 -0
  91. package/dist/index.d.ts.map +1 -0
  92. package/dist/index.js +1073 -0
  93. package/dist/index.js.map +1 -0
  94. package/dist/prompts/guidanceContent.d.ts +18 -0
  95. package/dist/prompts/guidanceContent.d.ts.map +1 -0
  96. package/dist/prompts/guidanceContent.js +814 -0
  97. package/dist/prompts/guidanceContent.js.map +1 -0
  98. package/dist/prompts/index.d.ts +2 -0
  99. package/dist/prompts/index.d.ts.map +1 -0
  100. package/dist/prompts/index.js +4 -0
  101. package/dist/prompts/index.js.map +1 -0
  102. package/dist/prompts/instructions.d.ts +56 -0
  103. package/dist/prompts/instructions.d.ts.map +1 -0
  104. package/dist/prompts/instructions.js +1343 -0
  105. package/dist/prompts/instructions.js.map +1 -0
  106. package/dist/services/BackupService.d.ts +104 -0
  107. package/dist/services/BackupService.d.ts.map +1 -0
  108. package/dist/services/BackupService.js +549 -0
  109. package/dist/services/BackupService.js.map +1 -0
  110. package/dist/services/CapabilityService.d.ts +38 -0
  111. package/dist/services/CapabilityService.d.ts.map +1 -0
  112. package/dist/services/CapabilityService.js +256 -0
  113. package/dist/services/CapabilityService.js.map +1 -0
  114. package/dist/services/ConfigService.d.ts +35 -0
  115. package/dist/services/ConfigService.d.ts.map +1 -0
  116. package/dist/services/ConfigService.js +105 -0
  117. package/dist/services/ConfigService.js.map +1 -0
  118. package/dist/services/ContextService.d.ts +65 -0
  119. package/dist/services/ContextService.d.ts.map +1 -0
  120. package/dist/services/ContextService.js +503 -0
  121. package/dist/services/ContextService.js.map +1 -0
  122. package/dist/services/DetectionService.d.ts +76 -0
  123. package/dist/services/DetectionService.d.ts.map +1 -0
  124. package/dist/services/DetectionService.js +262 -0
  125. package/dist/services/DetectionService.js.map +1 -0
  126. package/dist/services/DispatchService.d.ts +267 -0
  127. package/dist/services/DispatchService.d.ts.map +1 -0
  128. package/dist/services/DispatchService.js +1357 -0
  129. package/dist/services/DispatchService.js.map +1 -0
  130. package/dist/services/EventService.d.ts +81 -0
  131. package/dist/services/EventService.d.ts.map +1 -0
  132. package/dist/services/EventService.js +187 -0
  133. package/dist/services/EventService.js.map +1 -0
  134. package/dist/services/GuidanceService.d.ts +64 -0
  135. package/dist/services/GuidanceService.d.ts.map +1 -0
  136. package/dist/services/GuidanceService.js +259 -0
  137. package/dist/services/GuidanceService.js.map +1 -0
  138. package/dist/services/HealthService.d.ts +43 -0
  139. package/dist/services/HealthService.d.ts.map +1 -0
  140. package/dist/services/HealthService.js +276 -0
  141. package/dist/services/HealthService.js.map +1 -0
  142. package/dist/services/InstallationService.d.ts +62 -0
  143. package/dist/services/InstallationService.d.ts.map +1 -0
  144. package/dist/services/InstallationService.js +204 -0
  145. package/dist/services/InstallationService.js.map +1 -0
  146. package/dist/services/LogService.d.ts +35 -0
  147. package/dist/services/LogService.d.ts.map +1 -0
  148. package/dist/services/LogService.js +189 -0
  149. package/dist/services/LogService.js.map +1 -0
  150. package/dist/services/MemoService.d.ts +39 -0
  151. package/dist/services/MemoService.d.ts.map +1 -0
  152. package/dist/services/MemoService.js +288 -0
  153. package/dist/services/MemoService.js.map +1 -0
  154. package/dist/services/NodeService.d.ts +90 -0
  155. package/dist/services/NodeService.d.ts.map +1 -0
  156. package/dist/services/NodeService.js +958 -0
  157. package/dist/services/NodeService.js.map +1 -0
  158. package/dist/services/OpenSpecParser.d.ts +43 -0
  159. package/dist/services/OpenSpecParser.d.ts.map +1 -0
  160. package/dist/services/OpenSpecParser.js +191 -0
  161. package/dist/services/OpenSpecParser.js.map +1 -0
  162. package/dist/services/ReferenceService.d.ts +35 -0
  163. package/dist/services/ReferenceService.d.ts.map +1 -0
  164. package/dist/services/ReferenceService.js +195 -0
  165. package/dist/services/ReferenceService.js.map +1 -0
  166. package/dist/services/RepairService.d.ts +36 -0
  167. package/dist/services/RepairService.d.ts.map +1 -0
  168. package/dist/services/RepairService.js +429 -0
  169. package/dist/services/RepairService.js.map +1 -0
  170. package/dist/services/SearchService.d.ts +34 -0
  171. package/dist/services/SearchService.d.ts.map +1 -0
  172. package/dist/services/SearchService.js +293 -0
  173. package/dist/services/SearchService.js.map +1 -0
  174. package/dist/services/SessionService.d.ts +136 -0
  175. package/dist/services/SessionService.d.ts.map +1 -0
  176. package/dist/services/SessionService.js +297 -0
  177. package/dist/services/SessionService.js.map +1 -0
  178. package/dist/services/StateService.d.ts +97 -0
  179. package/dist/services/StateService.d.ts.map +1 -0
  180. package/dist/services/StateService.js +846 -0
  181. package/dist/services/StateService.js.map +1 -0
  182. package/dist/services/TutorialService.d.ts +114 -0
  183. package/dist/services/TutorialService.d.ts.map +1 -0
  184. package/dist/services/TutorialService.js +1262 -0
  185. package/dist/services/TutorialService.js.map +1 -0
  186. package/dist/services/WorkspaceService.d.ts +273 -0
  187. package/dist/services/WorkspaceService.d.ts.map +1 -0
  188. package/dist/services/WorkspaceService.js +1764 -0
  189. package/dist/services/WorkspaceService.js.map +1 -0
  190. package/dist/services/index.d.ts +15 -0
  191. package/dist/services/index.d.ts.map +1 -0
  192. package/dist/services/index.js +14 -0
  193. package/dist/services/index.js.map +1 -0
  194. package/dist/storage/FileSystemAdapter.d.ts +223 -0
  195. package/dist/storage/FileSystemAdapter.d.ts.map +1 -0
  196. package/dist/storage/FileSystemAdapter.js +384 -0
  197. package/dist/storage/FileSystemAdapter.js.map +1 -0
  198. package/dist/storage/JsonStorage.d.ts +158 -0
  199. package/dist/storage/JsonStorage.d.ts.map +1 -0
  200. package/dist/storage/JsonStorage.js +613 -0
  201. package/dist/storage/JsonStorage.js.map +1 -0
  202. package/dist/storage/MarkdownStorage.d.ts +178 -0
  203. package/dist/storage/MarkdownStorage.d.ts.map +1 -0
  204. package/dist/storage/MarkdownStorage.js +918 -0
  205. package/dist/storage/MarkdownStorage.js.map +1 -0
  206. package/dist/storage/SessionBindingStorage.d.ts +69 -0
  207. package/dist/storage/SessionBindingStorage.d.ts.map +1 -0
  208. package/dist/storage/SessionBindingStorage.js +131 -0
  209. package/dist/storage/SessionBindingStorage.js.map +1 -0
  210. package/dist/storage/index.d.ts +6 -0
  211. package/dist/storage/index.d.ts.map +1 -0
  212. package/dist/storage/index.js +6 -0
  213. package/dist/storage/index.js.map +1 -0
  214. package/dist/tools/capability.d.ts +18 -0
  215. package/dist/tools/capability.d.ts.map +1 -0
  216. package/dist/tools/capability.js +73 -0
  217. package/dist/tools/capability.js.map +1 -0
  218. package/dist/tools/config.d.ts +14 -0
  219. package/dist/tools/config.d.ts.map +1 -0
  220. package/dist/tools/config.js +61 -0
  221. package/dist/tools/config.js.map +1 -0
  222. package/dist/tools/context.d.ts +22 -0
  223. package/dist/tools/context.d.ts.map +1 -0
  224. package/dist/tools/context.js +139 -0
  225. package/dist/tools/context.js.map +1 -0
  226. package/dist/tools/dispatch.d.ts +41 -0
  227. package/dist/tools/dispatch.d.ts.map +1 -0
  228. package/dist/tools/dispatch.js +380 -0
  229. package/dist/tools/dispatch.js.map +1 -0
  230. package/dist/tools/help.d.ts +44 -0
  231. package/dist/tools/help.d.ts.map +1 -0
  232. package/dist/tools/help.js +227 -0
  233. package/dist/tools/help.js.map +1 -0
  234. package/dist/tools/import.d.ts +17 -0
  235. package/dist/tools/import.d.ts.map +1 -0
  236. package/dist/tools/import.js +96 -0
  237. package/dist/tools/import.js.map +1 -0
  238. package/dist/tools/index.d.ts +12 -0
  239. package/dist/tools/index.d.ts.map +1 -0
  240. package/dist/tools/index.js +13 -0
  241. package/dist/tools/index.js.map +1 -0
  242. package/dist/tools/log.d.ts +21 -0
  243. package/dist/tools/log.d.ts.map +1 -0
  244. package/dist/tools/log.js +93 -0
  245. package/dist/tools/log.js.map +1 -0
  246. package/dist/tools/memo.d.ts +26 -0
  247. package/dist/tools/memo.d.ts.map +1 -0
  248. package/dist/tools/memo.js +188 -0
  249. package/dist/tools/memo.js.map +1 -0
  250. package/dist/tools/node.d.ts +34 -0
  251. package/dist/tools/node.d.ts.map +1 -0
  252. package/dist/tools/node.js +328 -0
  253. package/dist/tools/node.js.map +1 -0
  254. package/dist/tools/search.d.ts +14 -0
  255. package/dist/tools/search.d.ts.map +1 -0
  256. package/dist/tools/search.js +95 -0
  257. package/dist/tools/search.js.map +1 -0
  258. package/dist/tools/session.d.ts +22 -0
  259. package/dist/tools/session.d.ts.map +1 -0
  260. package/dist/tools/session.js +127 -0
  261. package/dist/tools/session.js.map +1 -0
  262. package/dist/tools/state.d.ts +10 -0
  263. package/dist/tools/state.d.ts.map +1 -0
  264. package/dist/tools/state.js +79 -0
  265. package/dist/tools/state.js.map +1 -0
  266. package/dist/tools/workspace.d.ts +38 -0
  267. package/dist/tools/workspace.d.ts.map +1 -0
  268. package/dist/tools/workspace.js +240 -0
  269. package/dist/tools/workspace.js.map +1 -0
  270. package/dist/types/capability.d.ts +36 -0
  271. package/dist/types/capability.d.ts.map +1 -0
  272. package/dist/types/capability.js +3 -0
  273. package/dist/types/capability.js.map +1 -0
  274. package/dist/types/confirmation.d.ts +35 -0
  275. package/dist/types/confirmation.d.ts.map +1 -0
  276. package/dist/types/confirmation.js +3 -0
  277. package/dist/types/confirmation.js.map +1 -0
  278. package/dist/types/context.d.ts +174 -0
  279. package/dist/types/context.d.ts.map +1 -0
  280. package/dist/types/context.js +3 -0
  281. package/dist/types/context.js.map +1 -0
  282. package/dist/types/errors.d.ts +81 -0
  283. package/dist/types/errors.d.ts.map +1 -0
  284. package/dist/types/errors.js +154 -0
  285. package/dist/types/errors.js.map +1 -0
  286. package/dist/types/guidance.d.ts +162 -0
  287. package/dist/types/guidance.d.ts.map +1 -0
  288. package/dist/types/guidance.js +4 -0
  289. package/dist/types/guidance.js.map +1 -0
  290. package/dist/types/health.d.ts +61 -0
  291. package/dist/types/health.d.ts.map +1 -0
  292. package/dist/types/health.js +3 -0
  293. package/dist/types/health.js.map +1 -0
  294. package/dist/types/index.d.ts +10 -0
  295. package/dist/types/index.d.ts.map +1 -0
  296. package/dist/types/index.js +11 -0
  297. package/dist/types/index.js.map +1 -0
  298. package/dist/types/memo.d.ts +132 -0
  299. package/dist/types/memo.d.ts.map +1 -0
  300. package/dist/types/memo.js +3 -0
  301. package/dist/types/memo.js.map +1 -0
  302. package/dist/types/node.d.ts +316 -0
  303. package/dist/types/node.d.ts.map +1 -0
  304. package/dist/types/node.js +3 -0
  305. package/dist/types/node.js.map +1 -0
  306. package/dist/types/repair.d.ts +62 -0
  307. package/dist/types/repair.d.ts.map +1 -0
  308. package/dist/types/repair.js +4 -0
  309. package/dist/types/repair.js.map +1 -0
  310. package/dist/types/search.d.ts +58 -0
  311. package/dist/types/search.d.ts.map +1 -0
  312. package/dist/types/search.js +3 -0
  313. package/dist/types/search.js.map +1 -0
  314. package/dist/types/settings.d.ts +109 -0
  315. package/dist/types/settings.d.ts.map +1 -0
  316. package/dist/types/settings.js +30 -0
  317. package/dist/types/settings.js.map +1 -0
  318. package/dist/types/workspace.d.ts +357 -0
  319. package/dist/types/workspace.d.ts.map +1 -0
  320. package/dist/types/workspace.js +3 -0
  321. package/dist/types/workspace.js.map +1 -0
  322. package/dist/utils/contentValidation.d.ts +47 -0
  323. package/dist/utils/contentValidation.d.ts.map +1 -0
  324. package/dist/utils/contentValidation.js +93 -0
  325. package/dist/utils/contentValidation.js.map +1 -0
  326. package/dist/utils/devLog.d.ts +43 -0
  327. package/dist/utils/devLog.d.ts.map +1 -0
  328. package/dist/utils/devLog.js +94 -0
  329. package/dist/utils/devLog.js.map +1 -0
  330. package/dist/utils/errorLogger.d.ts +27 -0
  331. package/dist/utils/errorLogger.d.ts.map +1 -0
  332. package/dist/utils/errorLogger.js +105 -0
  333. package/dist/utils/errorLogger.js.map +1 -0
  334. package/dist/utils/git.d.ts +123 -0
  335. package/dist/utils/git.d.ts.map +1 -0
  336. package/dist/utils/git.js +400 -0
  337. package/dist/utils/git.js.map +1 -0
  338. package/dist/utils/hash.d.ts +32 -0
  339. package/dist/utils/hash.d.ts.map +1 -0
  340. package/dist/utils/hash.js +37 -0
  341. package/dist/utils/hash.js.map +1 -0
  342. package/dist/utils/id.d.ts +54 -0
  343. package/dist/utils/id.d.ts.map +1 -0
  344. package/dist/utils/id.js +96 -0
  345. package/dist/utils/id.js.map +1 -0
  346. package/dist/utils/index.d.ts +8 -0
  347. package/dist/utils/index.d.ts.map +1 -0
  348. package/dist/utils/index.js +9 -0
  349. package/dist/utils/index.js.map +1 -0
  350. package/dist/utils/logger.d.ts +42 -0
  351. package/dist/utils/logger.d.ts.map +1 -0
  352. package/dist/utils/logger.js +228 -0
  353. package/dist/utils/logger.js.map +1 -0
  354. package/dist/utils/manualChangeFormatter.d.ts +8 -0
  355. package/dist/utils/manualChangeFormatter.d.ts.map +1 -0
  356. package/dist/utils/manualChangeFormatter.js +21 -0
  357. package/dist/utils/manualChangeFormatter.js.map +1 -0
  358. package/dist/utils/paramValidator.d.ts +35 -0
  359. package/dist/utils/paramValidator.d.ts.map +1 -0
  360. package/dist/utils/paramValidator.js +214 -0
  361. package/dist/utils/paramValidator.js.map +1 -0
  362. package/dist/utils/port.d.ts +7 -0
  363. package/dist/utils/port.d.ts.map +1 -0
  364. package/dist/utils/port.js +28 -0
  365. package/dist/utils/port.js.map +1 -0
  366. package/dist/utils/processManager.d.ts +53 -0
  367. package/dist/utils/processManager.d.ts.map +1 -0
  368. package/dist/utils/processManager.js +267 -0
  369. package/dist/utils/processManager.js.map +1 -0
  370. package/dist/utils/sessionLogger.d.ts +28 -0
  371. package/dist/utils/sessionLogger.d.ts.map +1 -0
  372. package/dist/utils/sessionLogger.js +142 -0
  373. package/dist/utils/sessionLogger.js.map +1 -0
  374. package/dist/utils/time.d.ts +15 -0
  375. package/dist/utils/time.d.ts.map +1 -0
  376. package/dist/utils/time.js +32 -0
  377. package/dist/utils/time.js.map +1 -0
  378. package/dist/utils/validation.d.ts +23 -0
  379. package/dist/utils/validation.d.ts.map +1 -0
  380. package/dist/utils/validation.js +88 -0
  381. package/dist/utils/validation.js.map +1 -0
  382. package/docs//346/227/245/345/277/227/347/263/273/347/273/237.md +389 -0
  383. package/docs//347/224/250/346/210/267/346/211/213/345/206/214.md +1446 -0
  384. package/docs//347/224/250/346/210/267/346/211/213/345/206/214/344/270/216/346/212/200/346/234/257/346/214/207/345/215/227.md +873 -0
  385. package/package.json +94 -0
  386. package/plugin/README.md +141 -0
  387. package/plugin/agents/zero-executor.md +114 -0
  388. package/plugin/agents/zero-reviewer.md +133 -0
  389. package/plugin/docs/diagnostic-guide.md +128 -0
  390. package/plugin/hooks/hooks.json.deprecated +70 -0
  391. package/plugin/scripts/cursor-hook-entry.cjs +217 -0
  392. package/plugin/scripts/hook-entry.cjs +663 -0
  393. package/plugin/scripts/openspec-import.cjs +714 -0
  394. package/plugin/scripts/shared/binding.cjs +98 -0
  395. package/plugin/scripts/shared/config.cjs +65 -0
  396. package/plugin/scripts/shared/context.cjs +120 -0
  397. package/plugin/scripts/shared/index.cjs +34 -0
  398. package/plugin/scripts/shared/logger.cjs +196 -0
  399. package/plugin/scripts/shared/reminder.cjs +261 -0
  400. package/plugin/scripts/shared/utils.cjs +62 -0
  401. package/plugin/scripts/shared/workspace.cjs +322 -0
  402. package/plugin/skills/aligning-intent/SKILL.md +275 -0
  403. package/plugin/skills/analyzing-measurements/SKILL.md +223 -0
  404. package/plugin/skills/bootstrapping-workspace/SKILL.md +260 -0
  405. package/plugin/skills/designing-solutions/SKILL.md +363 -0
  406. package/plugin/skills/diagnosing-issues/SKILL.md +219 -0
  407. package/plugin/skills/discovering-context/SKILL.md +283 -0
  408. package/plugin/skills/dispatching-parent/SKILL.md +399 -0
  409. package/plugin/skills/executing-task/SKILL.md +340 -0
  410. package/plugin/skills/memo-create/SKILL.md +222 -0
  411. package/plugin/skills/planning-verification/SKILL.md +245 -0
  412. package/plugin/skills/preparing-dispatch/SKILL.md +299 -0
  413. package/plugin/skills/researching-tech/SKILL.md +223 -0
  414. package/plugin/skills/reviewing-quality/SKILL.md +354 -0
  415. package/plugin/skills/reviewing-spec/SKILL.md +333 -0
  416. package/plugin/skills/starting-info-flow/SKILL.md +196 -0
  417. package/web/README.md +5 -0
  418. package/web/dist/assets/DocsView-Bls_Vjsr.css +1 -0
  419. package/web/dist/assets/DocsView-Cxc0B63r.js +1447 -0
  420. package/web/dist/assets/HomeView-C7df9thb.js +9 -0
  421. package/web/dist/assets/HomeView-ufUdnfHk.css +1 -0
  422. package/web/dist/assets/MarkdownContent-DXp6CtSP.js +308 -0
  423. package/web/dist/assets/MarkdownContent-NFqiOBLH.css +1 -0
  424. package/web/dist/assets/NotFoundView-BYX1oZAn.css +1 -0
  425. package/web/dist/assets/NotFoundView-zrc0lT9q.js +1 -0
  426. package/web/dist/assets/WorkspaceView-BckqgNcX.js +27 -0
  427. package/web/dist/assets/WorkspaceView-J1dgpYMx.css +1 -0
  428. package/web/dist/assets/WsConfirmDialog-C1CvL4my.css +1 -0
  429. package/web/dist/assets/WsConfirmDialog-gLEP7uBD.js +4 -0
  430. package/web/dist/assets/arc-DPkKTkUT.js +1 -0
  431. package/web/dist/assets/architectureDiagram-VXUJARFQ-CEGpqUlZ.js +36 -0
  432. package/web/dist/assets/blockDiagram-VD42YOAC-Bv-mqdQH.js +122 -0
  433. package/web/dist/assets/c4Diagram-YG6GDRKO-DRyPatZ_.js +10 -0
  434. package/web/dist/assets/channel-B84mKLDZ.js +1 -0
  435. package/web/dist/assets/chunk-4BX2VUAB-c7DivX0u.js +1 -0
  436. package/web/dist/assets/chunk-55IACEB6-CGKTaLlo.js +1 -0
  437. package/web/dist/assets/chunk-B4BG7PRW-Czhx5Q_P.js +165 -0
  438. package/web/dist/assets/chunk-DI55MBZ5-CQVA7hcZ.js +220 -0
  439. package/web/dist/assets/chunk-FMBD7UC4-hEiPmi7V.js +15 -0
  440. package/web/dist/assets/chunk-QN33PNHL-rL6yYI-E.js +1 -0
  441. package/web/dist/assets/chunk-QZHKN3VN-BRyHBBzq.js +1 -0
  442. package/web/dist/assets/chunk-TZMSLE5B-D4PXmTz9.js +1 -0
  443. package/web/dist/assets/classDiagram-2ON5EDUG-CNn53ohi.js +1 -0
  444. package/web/dist/assets/classDiagram-v2-WZHVMYZB-CNn53ohi.js +1 -0
  445. package/web/dist/assets/cose-bilkent-S5V4N54A-BAREnRga.js +1 -0
  446. package/web/dist/assets/cytoscape.esm-BnkdMOzK.js +321 -0
  447. package/web/dist/assets/dagre-6UL2VRFP-DaYzb3MT.js +4 -0
  448. package/web/dist/assets/defaultLocale-C4B-KCzX.js +1 -0
  449. package/web/dist/assets/diagram-PSM6KHXK-BFltDqvd.js +24 -0
  450. package/web/dist/assets/diagram-QEK2KX5R-CR4VU2La.js +43 -0
  451. package/web/dist/assets/diagram-S2PKOQOG-0UfIeT-1.js +24 -0
  452. package/web/dist/assets/erDiagram-Q2GNP2WA-Bo17Xmng.js +60 -0
  453. package/web/dist/assets/flowDiagram-NV44I4VS-CzqhQp8s.js +162 -0
  454. package/web/dist/assets/ganttDiagram-JELNMOA3-TXwXtUcq.js +267 -0
  455. package/web/dist/assets/gitGraphDiagram-NY62KEGX-CoFQTy9O.js +65 -0
  456. package/web/dist/assets/graph-CIQcRIVd.js +1 -0
  457. package/web/dist/assets/index-BgLd_o_M.css +1 -0
  458. package/web/dist/assets/index-Cd_J3fZn.js +30 -0
  459. package/web/dist/assets/infoDiagram-WHAUD3N6-Dq0xXfVu.js +2 -0
  460. package/web/dist/assets/init-Gi6I4Gst.js +1 -0
  461. package/web/dist/assets/journeyDiagram-XKPGCS4Q-jIg5BOfC.js +139 -0
  462. package/web/dist/assets/kanban-definition-3W4ZIXB7-D2giu6aZ.js +89 -0
  463. package/web/dist/assets/katex-XbL3y5x-.js +261 -0
  464. package/web/dist/assets/layout-Bm-XCM-8.js +1 -0
  465. package/web/dist/assets/linear-FbekP9OZ.js +1 -0
  466. package/web/dist/assets/min-BrRCpYmF.js +1 -0
  467. package/web/dist/assets/mindmap-definition-VGOIOE7T-o-4ubbY9.js +68 -0
  468. package/web/dist/assets/noto-emoji-0-400-normal-BTQbhB77.woff +0 -0
  469. package/web/dist/assets/noto-emoji-0-400-normal-DHdy6Uhy.woff2 +0 -0
  470. package/web/dist/assets/noto-emoji-1-400-normal-0IvkdXBB.woff +0 -0
  471. package/web/dist/assets/noto-emoji-1-400-normal-BY9OovbM.woff2 +0 -0
  472. package/web/dist/assets/noto-emoji-10-400-normal-D9w4QCof.woff2 +0 -0
  473. package/web/dist/assets/noto-emoji-10-400-normal-DtCumcZR.woff +0 -0
  474. package/web/dist/assets/noto-emoji-11-400-normal-BboTlyvx.woff +0 -0
  475. package/web/dist/assets/noto-emoji-12-400-normal-BB5pgBKj.woff2 +0 -0
  476. package/web/dist/assets/noto-emoji-12-400-normal-g186qhiA.woff +0 -0
  477. package/web/dist/assets/noto-emoji-2-400-normal-BKCR1azW.woff2 +0 -0
  478. package/web/dist/assets/noto-emoji-2-400-normal-BYH0KhDr.woff +0 -0
  479. package/web/dist/assets/noto-emoji-3-400-normal-CnPTUeEK.woff +0 -0
  480. package/web/dist/assets/noto-emoji-3-400-normal-TrTb2VQM.woff2 +0 -0
  481. package/web/dist/assets/noto-emoji-4-400-normal-BxD0KVdj.woff +0 -0
  482. package/web/dist/assets/noto-emoji-4-400-normal-s_n9EyG1.woff2 +0 -0
  483. package/web/dist/assets/noto-emoji-5-400-normal-C190AIxR.woff +0 -0
  484. package/web/dist/assets/noto-emoji-5-400-normal-Ctfx4xc6.woff2 +0 -0
  485. package/web/dist/assets/noto-emoji-6-400-normal-DlXlXWt7.woff +0 -0
  486. package/web/dist/assets/noto-emoji-6-400-normal-NzsjD754.woff2 +0 -0
  487. package/web/dist/assets/noto-emoji-7-400-normal-BHP8KeA6.woff2 +0 -0
  488. package/web/dist/assets/noto-emoji-7-400-normal-CtuKhtAZ.woff +0 -0
  489. package/web/dist/assets/noto-emoji-8-400-normal-DR49ZFe7.woff +0 -0
  490. package/web/dist/assets/noto-emoji-8-400-normal-Dvmkf6b2.woff2 +0 -0
  491. package/web/dist/assets/noto-emoji-9-400-normal-BeHJQ2iK.woff2 +0 -0
  492. package/web/dist/assets/noto-emoji-9-400-normal-BlXmCgeQ.woff +0 -0
  493. package/web/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  494. package/web/dist/assets/pieDiagram-ADFJNKIX-C45wSpld.js +30 -0
  495. package/web/dist/assets/quadrantDiagram-AYHSOK5B-tv-_fe-W.js +7 -0
  496. package/web/dist/assets/reduce-CoLNNlNb.js +1 -0
  497. package/web/dist/assets/requirementDiagram-UZGBJVZJ-Dn6PDfkL.js +64 -0
  498. package/web/dist/assets/sankeyDiagram-TZEHDZUN-CbXTZAsG.js +10 -0
  499. package/web/dist/assets/sequenceDiagram-WL72ISMW-B-o1CUJ5.js +145 -0
  500. package/web/dist/assets/stateDiagram-FKZM4ZOC-hzrupXQi.js +1 -0
  501. package/web/dist/assets/stateDiagram-v2-4FDKWEC3-DN-c2M96.js +1 -0
  502. package/web/dist/assets/timeline-definition-IT6M3QCI-R5SP9GDo.js +61 -0
  503. package/web/dist/assets/treemap-KMMF4GRG-Pg9KlUOt.js +128 -0
  504. package/web/dist/assets/xychartDiagram-PRI3JC2R-C3vbJhd1.js +7 -0
  505. package/web/dist/favicon.svg +13 -0
  506. package/web/dist/index.html +17 -0
  507. package//351/205/215/347/275/256/346/226/271/345/274/217.md +330 -0
package/dist/index.js ADDED
@@ -0,0 +1,1073 @@
1
+ #!/usr/bin/env node
2
+ // src/index.ts
3
+ // 统一入口:MCP Server + HTTP Server
4
+ // 注意:生产环境应通过 check-node-version.js 启动,以确保版本检查在模块加载前执行
5
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
8
+ import { createServices } from "./http/services.js";
9
+ import { createServer } from "./http/server.js";
10
+ import { isPortInUse } from "./utils/port.js";
11
+ import { handleOldProcess, writePidInfo, removePidFile, readPidInfo, isProcessRunning } from "./utils/processManager.js";
12
+ import { eventService } from "./services/EventService.js";
13
+ import { createRequire } from "module";
14
+ import { fileURLToPath } from "url";
15
+ import { dirname, join } from "path";
16
+ import { workspaceTools } from "./tools/workspace.js";
17
+ import { nodeTools } from "./tools/node.js";
18
+ import { stateTools } from "./tools/state.js";
19
+ import { contextTools } from "./tools/context.js";
20
+ import { logTools } from "./tools/log.js";
21
+ import { sessionTools } from "./tools/session.js";
22
+ import { helpTools } from "./tools/help.js";
23
+ import { importTools } from "./tools/import.js";
24
+ import { dispatchTools } from "./tools/dispatch.js";
25
+ import { configTools } from "./tools/config.js";
26
+ import { memoTools } from "./tools/memo.js";
27
+ import { capabilityTools } from "./tools/capability.js";
28
+ import { searchTools } from "./tools/search.js";
29
+ import { generateImportGuide, listChanges } from "./services/OpenSpecParser.js";
30
+ import { getFullInstructions } from "./prompts/instructions.js";
31
+ import { ZeroError } from "./types/errors.js";
32
+ import { validateAndCorrectParams } from "./utils/paramValidator.js";
33
+ import { logMcpStart, logMcpEnd, logMcpError } from "./utils/sessionLogger.js";
34
+ import { formatManualChangeReminder } from "./utils/manualChangeFormatter.js";
35
+ import { devLog } from "./utils/devLog.js";
36
+ import { INTERNAL_RULES_HASH } from "./services/NodeService.js";
37
+ import { aiAdapter } from "./adapters/OutputAdapter.js";
38
+ // ============================================================================
39
+ // 配置
40
+ // ============================================================================
41
+ const IS_DEV = process.env.NODE_ENV === "development" || process.env.ZERO_DEV === "true";
42
+ // 开发模式默认端口 19541,正式模式默认端口 19540
43
+ const DEFAULT_PORT = IS_DEV ? "19541" : "19540";
44
+ const HTTP_PORT = parseInt(process.env.HTTP_PORT ?? process.env.PORT ?? DEFAULT_PORT, 10);
45
+ const DISABLE_HTTP = process.env.DISABLE_HTTP === "true";
46
+ // ============================================================================
47
+ // 日志工具
48
+ // ============================================================================
49
+ const MODE_LABEL = IS_DEV ? "[DEV]" : "[PROD]";
50
+ function logMcp(message) {
51
+ console.error(`[mcp]${MODE_LABEL} ${message}`);
52
+ }
53
+ function logHttp(message) {
54
+ console.error(`[http]${MODE_LABEL} ${message}`);
55
+ }
56
+ // ============================================================================
57
+ // 获取当前版本
58
+ // ============================================================================
59
+ function getCurrentVersion() {
60
+ try {
61
+ const __filename = fileURLToPath(import.meta.url);
62
+ const __dirname = dirname(__filename);
63
+ const require = createRequire(import.meta.url);
64
+ const pkg = require(join(__dirname, "..", "package.json"));
65
+ return pkg.version;
66
+ }
67
+ catch {
68
+ return "0.0.0";
69
+ }
70
+ }
71
+ const CURRENT_VERSION = getCurrentVersion();
72
+ // ============================================================================
73
+ // HTTP Server 后台启动
74
+ // ============================================================================
75
+ async function startHttpServerInBackground(port) {
76
+ // 检查是否禁用 HTTP
77
+ if (DISABLE_HTTP) {
78
+ logHttp("HTTP server 已禁用 (DISABLE_HTTP=true)");
79
+ return null;
80
+ }
81
+ // 使用与 server.ts 一致的 host 设置(默认 127.0.0.1,可通过环境变量覆盖)
82
+ const host = process.env.ZERO_HOST || "127.0.0.1";
83
+ // 处理旧版本进程
84
+ const canStart = handleOldProcess(port, CURRENT_VERSION, logHttp);
85
+ if (!canStart) {
86
+ // 检查是否是因为相同版本已在运行(不是真正的错误)
87
+ if (await isPortInUse(port, host)) {
88
+ logHttp(`相同版本已在运行,复用现有服务`);
89
+ }
90
+ return null;
91
+ }
92
+ // 再次检测端口占用(处理非 zero-workspace 进程占用的情况)
93
+ if (await isPortInUse(port, host)) {
94
+ logHttp(`端口 ${host}:${port} 被其他服务占用,跳过 HTTP 启动`);
95
+ return null;
96
+ }
97
+ try {
98
+ const server = await createServer();
99
+ await server.listen({ port, host });
100
+ logHttp(`Listening on http://${host}:${port} (v${CURRENT_VERSION})`);
101
+ // 写入 PID 信息
102
+ writePidInfo({
103
+ pid: process.pid,
104
+ port,
105
+ version: CURRENT_VERSION,
106
+ startedAt: new Date().toISOString(),
107
+ });
108
+ // 进程退出时清理
109
+ const cleanup = () => {
110
+ removePidFile();
111
+ };
112
+ process.on("exit", cleanup);
113
+ process.on("SIGINT", cleanup);
114
+ process.on("SIGTERM", cleanup);
115
+ return server;
116
+ }
117
+ catch (err) {
118
+ logHttp(`启动失败: ${err instanceof Error ? err.message : String(err)}`);
119
+ return null;
120
+ }
121
+ }
122
+ // ============================================================================
123
+ // MCP Server 创建
124
+ // ============================================================================
125
+ function createMcpServer(services) {
126
+ const server = new Server({
127
+ name: "zero-workspace",
128
+ version: "1.0.0",
129
+ }, {
130
+ capabilities: {
131
+ tools: {},
132
+ prompts: {},
133
+ },
134
+ });
135
+ // 所有工具列表
136
+ const allTools = [
137
+ ...workspaceTools,
138
+ ...nodeTools,
139
+ ...stateTools,
140
+ ...contextTools,
141
+ ...logTools,
142
+ ...sessionTools,
143
+ ...helpTools,
144
+ ...importTools,
145
+ ...dispatchTools,
146
+ ...configTools,
147
+ ];
148
+ // 汇总所有工具(用于列表和参数验证)
149
+ const allToolsWithExtras = [...allTools, ...memoTools, ...capabilityTools, ...searchTools];
150
+ // 创建工具名到 Tool 定义的映射(用于参数验证)
151
+ const toolMap = new Map(allToolsWithExtras.map(tool => [tool.name, tool]));
152
+ // 注册工具列表处理器
153
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
154
+ tools: allToolsWithExtras,
155
+ }));
156
+ // 注册工具调用处理器
157
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
158
+ const { name, arguments: rawArgs } = request.params;
159
+ const startTime = Date.now();
160
+ // 记录 MCP 调用开始
161
+ logMcpStart(name, rawArgs || {});
162
+ try {
163
+ // 确保基础目录存在
164
+ await services.fs.ensureIndex();
165
+ // 参数验证与自动纠错
166
+ let args = rawArgs;
167
+ let paramWarnings = [];
168
+ const tool = toolMap.get(name);
169
+ if (tool) {
170
+ const validation = validateAndCorrectParams(name, rawArgs, tool);
171
+ // 如果有错误,抛出异常
172
+ if (validation.errors.length > 0) {
173
+ throw new ZeroError("UNKNOWN_PARAMS", validation.errors.join("\n"));
174
+ }
175
+ // 使用纠正后的参数
176
+ args = validation.correctedArgs;
177
+ paramWarnings = validation.warnings;
178
+ }
179
+ let result;
180
+ switch (name) {
181
+ // Workspace 工具
182
+ case "workspace_init": {
183
+ // 参数验证:检测常见的错误参数名
184
+ const wrongParamMapping = {
185
+ description: "goal",
186
+ desc: "goal",
187
+ objective: "goal",
188
+ target: "goal",
189
+ purpose: "goal",
190
+ };
191
+ const wrongParams = Object.keys(wrongParamMapping).filter(wrong => args?.[wrong] !== undefined);
192
+ if (wrongParams.length > 0) {
193
+ const corrections = wrongParams.map(wrong => `"${wrong}" → "${wrongParamMapping[wrong]}"`).join(", ");
194
+ throw new ZeroError("INVALID_PARAMS", `参数名错误: ${corrections}。请使用正确的参数名重新调用。`);
195
+ }
196
+ // 验证必填参数
197
+ if (!args?.name) {
198
+ throw new ZeroError("INVALID_PARAMS", "缺少必填参数 'name'(工作区名称)");
199
+ }
200
+ if (!args?.goal) {
201
+ throw new ZeroError("INVALID_PARAMS", "缺少必填参数 'goal'(工作区目标描述)");
202
+ }
203
+ // 验证 scenario 参数(必填)
204
+ const validScenarios = ['feature', 'summary', 'optimize', 'debug', 'misc'];
205
+ if (!args?.scenario) {
206
+ throw new ZeroError("INVALID_PARAMS", `缺少必填参数 'scenario'(任务场景类型)。有效值为: ${validScenarios.join(', ')}`);
207
+ }
208
+ if (!validScenarios.includes(args.scenario)) {
209
+ throw new ZeroError("INVALID_PARAMS", `无效的 scenario 参数: "${args.scenario}"。有效值为: ${validScenarios.join(', ')}`);
210
+ }
211
+ result = await services.workspace.init({
212
+ name: args.name,
213
+ goal: args.goal,
214
+ rules: args?.rules,
215
+ docs: args?.docs,
216
+ scenario: args?.scenario,
217
+ });
218
+ break;
219
+ }
220
+ case "workspace_list": {
221
+ const statusFilter = args?.status;
222
+ const fullResult = await services.workspace.list({ status: statusFilter });
223
+ // AI 适配器:简化输出
224
+ // - active/archived: 顶层 filter 字段,各项不含 status
225
+ // - all: 各项保留 status
226
+ result = aiAdapter.transformWorkspaceList(fullResult, statusFilter);
227
+ break;
228
+ }
229
+ case "workspace_get": {
230
+ const fullResult = await services.workspace.get({
231
+ workspaceId: args?.workspaceId,
232
+ });
233
+ // AI 适配器:压缩 logMd
234
+ result = {
235
+ ...fullResult,
236
+ logMd: aiAdapter.transformWorkspaceGetLog(fullResult.logMd),
237
+ };
238
+ break;
239
+ }
240
+ case "workspace_delete":
241
+ result = await services.workspace.delete({
242
+ workspaceId: args?.workspaceId,
243
+ force: args?.force,
244
+ });
245
+ break;
246
+ case "workspace_update_rules":
247
+ result = await services.workspace.updateRules({
248
+ workspaceId: args?.workspaceId,
249
+ action: args?.action,
250
+ rule: args?.rule,
251
+ rules: args?.rules,
252
+ });
253
+ break;
254
+ case "workspace_archive":
255
+ result = await services.workspace.archive({
256
+ workspaceId: args?.workspaceId,
257
+ });
258
+ break;
259
+ case "workspace_restore":
260
+ result = await services.workspace.restore({
261
+ workspaceId: args?.workspaceId,
262
+ });
263
+ break;
264
+ case "workspace_health": {
265
+ const diagnosticToken = args?.diagnosticToken;
266
+ // 令牌校验
267
+ if (!diagnosticToken || !services.health.validateToken(diagnosticToken)) {
268
+ result = {
269
+ actionRequired: {
270
+ type: "read_diagnostic_guide",
271
+ message: "健康检测需要先阅读诊断指南获取令牌。请阅读指南文件,从 frontmatter 中获取 diagnosticToken,然后携带 token 再次调用。",
272
+ guidePath: services.health.getGuidePath(),
273
+ hint: "诊断指南包含常见问题解决方案和修复建议",
274
+ },
275
+ };
276
+ }
277
+ else {
278
+ result = await services.health.checkHealth(args?.workspaceId);
279
+ }
280
+ break;
281
+ }
282
+ // Node 工具
283
+ case "node_create": {
284
+ const nodeRole = args?.role;
285
+ const rulesHash = args?.rulesHash;
286
+ // 检测 info 类节点:引导使用 starting-info-flow Skill
287
+ // 仅对外部调用生效(rulesHash !== INTERNAL_RULES_HASH)
288
+ if ((nodeRole === "info_collection" || nodeRole === "info_summary") && rulesHash !== INTERNAL_RULES_HASH) {
289
+ const infoTypeName = nodeRole === "info_collection" ? "信息收集" : "信息总结";
290
+ result = {
291
+ actionRequired: {
292
+ type: "invoke_skill",
293
+ message: `⚠️ 创建${infoTypeName}节点需要通过能力包流程。
294
+
295
+ **MUST 调用 Skill(starting-info-flow)** 完成信息流程启动。
296
+
297
+ Skill 会引导你:
298
+ 1. capability_list() → 获取可用能力包
299
+ 2. 展示给用户并确认选择
300
+ 3. capability_select() → 创建节点并返回对应 Skill 引导
301
+
302
+ **如果 Skill 不可用**,使用 plugin_path 获取路径后 Read:
303
+ \`\`\`
304
+ plugin_path() → 获取 skillsPath
305
+ Read(file_path: <skillsPath>/starting-info-flow/SKILL.md)
306
+ \`\`\``,
307
+ data: {
308
+ skill: "starting-info-flow",
309
+ requestedRole: nodeRole,
310
+ },
311
+ },
312
+ };
313
+ break;
314
+ }
315
+ result = await services.node.create({
316
+ workspaceId: args?.workspaceId,
317
+ parentId: args?.parentId,
318
+ type: args?.type,
319
+ title: args?.title,
320
+ requirement: args?.requirement,
321
+ docs: args?.docs,
322
+ rulesHash,
323
+ role: nodeRole,
324
+ acceptanceCriteria: args?.acceptanceCriteria,
325
+ isNeedTest: args?.isNeedTest,
326
+ testRequirement: args?.testRequirement,
327
+ });
328
+ break;
329
+ }
330
+ case "node_get":
331
+ result = await services.node.get({
332
+ workspaceId: args?.workspaceId,
333
+ nodeId: args?.nodeId,
334
+ });
335
+ break;
336
+ case "node_list": {
337
+ const fullResult = await services.node.list({
338
+ workspaceId: args?.workspaceId,
339
+ rootId: args?.rootId,
340
+ depth: args?.depth,
341
+ });
342
+ // AI 适配器:简化输出,只保留 id 和 title
343
+ result = aiAdapter.transformNodeList(fullResult);
344
+ break;
345
+ }
346
+ case "node_delete":
347
+ result = await services.node.delete({
348
+ workspaceId: args?.workspaceId,
349
+ nodeId: args?.nodeId,
350
+ });
351
+ break;
352
+ // Phase 3: 节点更新
353
+ case "node_update": {
354
+ // MCP 调用必须提供 nodeHash
355
+ const nodeHashParam = args?.nodeHash;
356
+ if (!nodeHashParam) {
357
+ throw new ZeroError("INVALID_PARAMS", "请先 node_get 获取 nodeHash");
358
+ }
359
+ result = await services.node.update({
360
+ workspaceId: args?.workspaceId,
361
+ nodeId: args?.nodeId,
362
+ nodeHash: nodeHashParam,
363
+ title: args?.title,
364
+ requirement: args?.requirement,
365
+ note: args?.note,
366
+ conclusion: args?.conclusion,
367
+ field: args?.field,
368
+ old_str: args?.old_str,
369
+ new_str: args?.new_str,
370
+ });
371
+ break;
372
+ }
373
+ case "node_move":
374
+ result = await services.node.move({
375
+ workspaceId: args?.workspaceId,
376
+ nodeId: args?.nodeId,
377
+ newParentId: args?.newParentId,
378
+ });
379
+ break;
380
+ case "node_reorder":
381
+ await services.node.reorderChildren({
382
+ workspaceId: args?.workspaceId,
383
+ nodeId: args?.nodeId,
384
+ orderedChildIds: args?.orderedChildIds,
385
+ });
386
+ result = { success: true };
387
+ break;
388
+ // Phase 2: 状态转换工具
389
+ case "node_transition":
390
+ result = await services.state.transition({
391
+ workspaceId: args?.workspaceId,
392
+ nodeId: args?.nodeId,
393
+ action: args?.action,
394
+ reason: args?.reason,
395
+ conclusion: args?.conclusion,
396
+ conclusionsHash: args?.conclusionsHash,
397
+ confirmation: args?.confirmation,
398
+ });
399
+ break;
400
+ // Phase 2: 上下文工具
401
+ case "context_get":
402
+ result = await services.context.get({
403
+ workspaceId: args?.workspaceId,
404
+ nodeId: args?.nodeId,
405
+ includeLog: args?.includeLog,
406
+ maxLogEntries: args?.maxLogEntries,
407
+ reverseLog: args?.reverseLog,
408
+ includeProblem: args?.includeProblem,
409
+ });
410
+ break;
411
+ case "context_focus":
412
+ result = await services.context.focus({
413
+ workspaceId: args?.workspaceId,
414
+ nodeId: args?.nodeId,
415
+ });
416
+ break;
417
+ case "node_isolate":
418
+ result = await services.reference.isolate({
419
+ workspaceId: args?.workspaceId,
420
+ nodeId: args?.nodeId,
421
+ isolate: args?.isolate,
422
+ });
423
+ break;
424
+ case "node_reference":
425
+ result = await services.reference.reference({
426
+ workspaceId: args?.workspaceId,
427
+ nodeId: args?.nodeId,
428
+ targetIdOrPath: args?.targetIdOrPath,
429
+ action: args?.action,
430
+ description: args?.description,
431
+ });
432
+ break;
433
+ // Phase 2: 日志工具
434
+ case "log_append":
435
+ result = await services.log.append({
436
+ workspaceId: args?.workspaceId,
437
+ nodeId: args?.nodeId,
438
+ operator: args?.operator,
439
+ event: args?.event,
440
+ });
441
+ break;
442
+ case "problem_update":
443
+ result = await services.log.updateProblem({
444
+ workspaceId: args?.workspaceId,
445
+ nodeId: args?.nodeId,
446
+ problem: args?.problem,
447
+ nextStep: args?.nextStep,
448
+ });
449
+ break;
450
+ case "problem_clear":
451
+ result = await services.log.clearProblem({
452
+ workspaceId: args?.workspaceId,
453
+ nodeId: args?.nodeId,
454
+ });
455
+ break;
456
+ // Session 工具
457
+ case "session_bind":
458
+ result = await services.session.bind({
459
+ sessionId: args?.sessionId,
460
+ workspaceId: args?.workspaceId,
461
+ nodeId: args?.nodeId,
462
+ });
463
+ break;
464
+ case "session_unbind":
465
+ result = await services.session.unbind({
466
+ sessionId: args?.sessionId,
467
+ });
468
+ break;
469
+ case "session_status":
470
+ result = await services.session.status({
471
+ sessionId: args?.sessionId,
472
+ });
473
+ break;
474
+ case "get_pending_changes":
475
+ result = await services.session.getPendingChanges({
476
+ sessionId: args?.sessionId,
477
+ workspaceId: args?.workspaceId,
478
+ });
479
+ break;
480
+ // Help 工具
481
+ case "zero_help":
482
+ result = await services.help.getHelp(args?.topic);
483
+ break;
484
+ case "zero_prompt":
485
+ result = services.help.getPrompt(args?.template, args?.params);
486
+ break;
487
+ // Import 工具
488
+ case "workspace_import_guide": {
489
+ const path = args?.path;
490
+ const type = args?.type;
491
+ const changeId = args?.changeId;
492
+ const projectRoot = args?.projectRoot;
493
+ if (type !== 'openspec') {
494
+ throw new Error(`不支持的规范类型: ${type}`);
495
+ }
496
+ result = generateImportGuide(path, changeId, projectRoot);
497
+ break;
498
+ }
499
+ case "workspace_import_list": {
500
+ const path = args?.path;
501
+ const type = args?.type;
502
+ if (type !== 'openspec') {
503
+ throw new Error(`不支持的规范类型: ${type}`);
504
+ }
505
+ const changes = listChanges(path);
506
+ result = { type, changes };
507
+ break;
508
+ }
509
+ // Dispatch 工具
510
+ case "dispatch_enable": {
511
+ const workspaceId = args?.workspaceId;
512
+ const useGit = args?.useGit;
513
+ const projectRoot = await services.workspace.resolveProjectRoot(workspaceId);
514
+ result = await services.dispatch.enableDispatch(workspaceId, projectRoot, { useGit });
515
+ break;
516
+ }
517
+ case "dispatch_disable": {
518
+ const workspaceId = args?.workspaceId;
519
+ const projectRoot = await services.workspace.resolveProjectRoot(workspaceId);
520
+ result = await services.dispatch.queryDisableDispatch(workspaceId, projectRoot);
521
+ break;
522
+ }
523
+ case "dispatch_disable_execute": {
524
+ const workspaceId = args?.workspaceId;
525
+ const mergeStrategy = args?.mergeStrategy;
526
+ const keepBackupBranch = args?.keepBackupBranch;
527
+ const keepProcessBranch = args?.keepProcessBranch;
528
+ const commitMessage = args?.commitMessage;
529
+ const projectRoot = await services.workspace.resolveProjectRoot(workspaceId);
530
+ result = await services.dispatch.executeDisableChoice(projectRoot, {
531
+ workspaceId,
532
+ mergeStrategy,
533
+ keepBackupBranch: keepBackupBranch ?? false,
534
+ keepProcessBranch: keepProcessBranch ?? false,
535
+ commitMessage,
536
+ });
537
+ break;
538
+ }
539
+ case "dispatch_node": {
540
+ const workspaceId = args?.workspaceId;
541
+ const nodeId = args?.nodeId;
542
+ const projectRoot = await services.workspace.resolveProjectRoot(workspaceId);
543
+ result = await services.dispatch.upgradeToDispatchParent(workspaceId, projectRoot, nodeId);
544
+ break;
545
+ }
546
+ case "dispatch_complete": {
547
+ const workspaceId = args?.workspaceId;
548
+ const nodeId = args?.nodeId;
549
+ const success = args?.success;
550
+ const conclusion = args?.conclusion;
551
+ const projectRoot = await services.workspace.resolveProjectRoot(workspaceId);
552
+ result = await services.dispatch.completeDispatch(workspaceId, projectRoot, nodeId, success, conclusion);
553
+ break;
554
+ }
555
+ case "dispatch_cleanup": {
556
+ const workspaceId = args?.workspaceId;
557
+ const projectRoot = await services.workspace.resolveProjectRoot(workspaceId);
558
+ result = await services.dispatch.cleanupBranches(workspaceId, projectRoot);
559
+ break;
560
+ }
561
+ case "dispatch_create": {
562
+ const workspaceId = args?.workspaceId;
563
+ const parentId = args?.parentId;
564
+ const exec = args?.exec;
565
+ const includeQuality = args?.includeQuality;
566
+ const projectRoot = await services.workspace.resolveProjectRoot(workspaceId);
567
+ result = await services.dispatch.createDispatchChildren(workspaceId, projectRoot, parentId, exec, includeQuality ?? true);
568
+ break;
569
+ }
570
+ // Config 工具
571
+ case "config_get": {
572
+ result = await services.config.get();
573
+ break;
574
+ }
575
+ case "config_set": {
576
+ const defaultDispatchMode = args?.defaultDispatchMode;
577
+ result = await services.config.set({ defaultDispatchMode });
578
+ break;
579
+ }
580
+ // Memo 工具
581
+ case "memo_create": {
582
+ result = await services.memo.create({
583
+ workspaceId: args?.workspaceId,
584
+ title: args?.title,
585
+ summary: args?.summary,
586
+ content: args?.content,
587
+ tags: args?.tags,
588
+ });
589
+ break;
590
+ }
591
+ case "memo_list": {
592
+ result = await services.memo.list({
593
+ workspaceId: args?.workspaceId,
594
+ tags: args?.tags,
595
+ });
596
+ break;
597
+ }
598
+ case "memo_get": {
599
+ result = await services.memo.get({
600
+ workspaceId: args?.workspaceId,
601
+ memoId: args?.memoId,
602
+ lineOffset: args?.lineOffset,
603
+ lineLimit: args?.lineLimit,
604
+ });
605
+ break;
606
+ }
607
+ case "memo_update": {
608
+ result = await services.memo.update({
609
+ workspaceId: args?.workspaceId,
610
+ memoId: args?.memoId,
611
+ contentHash: args?.contentHash,
612
+ title: args?.title,
613
+ summary: args?.summary,
614
+ content: args?.content,
615
+ field: args?.field,
616
+ old_str: args?.old_str,
617
+ new_str: args?.new_str,
618
+ tags: args?.tags,
619
+ });
620
+ break;
621
+ }
622
+ case "memo_delete": {
623
+ result = await services.memo.delete({
624
+ workspaceId: args?.workspaceId,
625
+ memoId: args?.memoId,
626
+ });
627
+ break;
628
+ }
629
+ // Capability 工具
630
+ case "capability_list": {
631
+ let scenario = args?.scenario;
632
+ // 如果未传入 scenario,尝试从会话绑定的工作区获取
633
+ if (!scenario) {
634
+ const sessionId = args?.sessionId;
635
+ if (sessionId) {
636
+ const binding = await services.sessionStorage.getBinding(sessionId);
637
+ if (binding) {
638
+ const location = await services.json.getWorkspaceLocation(binding.workspaceId);
639
+ if (location) {
640
+ const config = await services.json.readWorkspaceConfig(location.projectRoot, location.dirName);
641
+ scenario = config.scenario;
642
+ }
643
+ }
644
+ }
645
+ }
646
+ if (!scenario) {
647
+ throw new Error("scenario 参数必填。请传入 scenario 参数,或确保当前会话已绑定到包含 scenario 配置的工作区。");
648
+ }
649
+ const { capabilityService } = await import("./services/CapabilityService.js");
650
+ const capabilities = capabilityService.getCapabilitiesForScenario(scenario);
651
+ result = {
652
+ scenario,
653
+ basePack: capabilities.basePack,
654
+ optionalPack: capabilities.optionalPack,
655
+ hint: "使用 capability_select 确认选择的能力包",
656
+ };
657
+ break;
658
+ }
659
+ case "capability_select": {
660
+ const workspaceId = args?.workspaceId;
661
+ const infoType = args?.infoType;
662
+ const nodeId = args?.nodeId;
663
+ const selected = args?.selected;
664
+ const { capabilityService } = await import("./services/CapabilityService.js");
665
+ // 验证 selected 是否为有效的 CapabilityId
666
+ const validCapabilities = selected.filter((id) => {
667
+ try {
668
+ capabilityService.getCapabilityInfo(id);
669
+ return true;
670
+ }
671
+ catch {
672
+ return false;
673
+ }
674
+ });
675
+ if (validCapabilities.length === 0) {
676
+ throw new Error("未选择有效的能力包");
677
+ }
678
+ let infoNodeId;
679
+ const createdNodes = [];
680
+ // 首次调用:创建 info 节点
681
+ if (!nodeId) {
682
+ if (!infoType) {
683
+ throw new Error("首次调用必须提供 infoType 参数");
684
+ }
685
+ // 创建 info 节点(使用 planning 类型,因为需要有能力子节点)
686
+ const infoNodeTitle = infoType === "info_collection" ? "信息收集" : "信息总结";
687
+ const infoNodeResult = await services.node.create({
688
+ workspaceId,
689
+ parentId: "root",
690
+ type: "planning",
691
+ title: infoNodeTitle,
692
+ requirement: `${infoNodeTitle}节点,包含以下能力:${validCapabilities.map((id) => capabilityService.getCapabilityInfo(id).name).join("、")}`,
693
+ role: infoType,
694
+ rulesHash: INTERNAL_RULES_HASH,
695
+ });
696
+ infoNodeId = infoNodeResult.nodeId;
697
+ }
698
+ else {
699
+ // 追加调用:使用现有 info 节点
700
+ infoNodeId = nodeId;
701
+ }
702
+ // 为每个能力创建子节点
703
+ for (const capabilityId of validCapabilities) {
704
+ const capInfo = capabilityService.getCapabilityInfo(capabilityId);
705
+ const acceptanceCriteria = capabilityService.getAcceptanceCriteria(capabilityId);
706
+ const childNodeResult = await services.node.create({
707
+ workspaceId,
708
+ parentId: infoNodeId,
709
+ type: "execution",
710
+ title: capInfo.name,
711
+ requirement: capInfo.description,
712
+ acceptanceCriteria,
713
+ rulesHash: INTERNAL_RULES_HASH,
714
+ });
715
+ createdNodes.push({
716
+ nodeId: childNodeResult.nodeId,
717
+ capabilityId,
718
+ title: capInfo.name,
719
+ });
720
+ }
721
+ // 构建 Skill 列表(返回 skill 目录名 + 节点映射)
722
+ const skillsWithNodes = createdNodes.map((node) => ({
723
+ skill: capabilityService.getSkillDirName(node.capabilityId),
724
+ nodeId: node.nodeId,
725
+ title: node.title,
726
+ }));
727
+ const skills = skillsWithNodes.map(s => s.skill);
728
+ // 构建 Skill 调用引导
729
+ const skillList = skillsWithNodes
730
+ .map(s => `- Skill(${s.skill}) → 节点「${s.title}」(${s.nodeId})`)
731
+ .join("\n");
732
+ result = {
733
+ infoNodeId,
734
+ createdNodes,
735
+ skills,
736
+ actionRequired: {
737
+ type: "invoke_skill",
738
+ message: `⚠️ 已创建能力节点,MUST 按顺序调用对应 Skill 执行任务:
739
+
740
+ ${skillList}
741
+
742
+ **执行流程**:
743
+ 1. 调用 Skill(${skills[0]}) 获取第一个任务的执行指导
744
+ 2. 按 Skill SOP 完成任务,记录结论到对应节点
745
+ 3. 依次执行后续 Skill
746
+
747
+ **如果 Skill 不可用**,使用 plugin_path 获取路径后 Read:
748
+ \`\`\`
749
+ plugin_path() → 获取 skillsPath
750
+ Read(file_path: <skillsPath>/<skill-name>/SKILL.md)
751
+ \`\`\``,
752
+ data: {
753
+ skills: skillsWithNodes,
754
+ },
755
+ },
756
+ };
757
+ break;
758
+ }
759
+ case "plugin_path": {
760
+ // 使用 import.meta.url 获取当前模块路径,推导出 plugin 目录
761
+ const currentFileUrl = import.meta.url;
762
+ const currentFilePath = new URL(currentFileUrl).pathname;
763
+ // 从 dist/index.js 往上两级到包根目录,再进入 plugin
764
+ const pluginPath = join(dirname(currentFilePath), "..", "plugin");
765
+ result = {
766
+ path: pluginPath,
767
+ skillsPath: join(pluginPath, "skills"),
768
+ };
769
+ break;
770
+ }
771
+ // Search 工具
772
+ case "workspace_search": {
773
+ result = await services.search.workspaceSearch({
774
+ query: args?.query,
775
+ limit: args?.limit,
776
+ });
777
+ break;
778
+ }
779
+ case "content_search": {
780
+ result = await services.search.contentSearch({
781
+ workspaceId: args?.workspaceId,
782
+ query: args?.query,
783
+ id: args?.id,
784
+ target: args?.target,
785
+ limit: args?.limit,
786
+ context: args?.context,
787
+ });
788
+ break;
789
+ }
790
+ default:
791
+ throw new Error(`未知工具: ${name}`);
792
+ }
793
+ // 记录 MCP 调用成功
794
+ const duration = Date.now() - startTime;
795
+ logMcpEnd(name, true, result, duration);
796
+ // 检查并附加手动变更提醒(针对工作区相关工具)
797
+ let responseText = JSON.stringify(result, null, 2);
798
+ // 附加参数纠正警告
799
+ if (paramWarnings.length > 0) {
800
+ responseText = responseText + "\n\n⚠️ " + paramWarnings.join("\n⚠️ ");
801
+ }
802
+ const workspaceId = args?.workspaceId;
803
+ // 排除 context_get 和 workspace_get(它们会清除变更,所以不需要提醒)
804
+ const shouldCheckManualChanges = workspaceId &&
805
+ name !== "context_get" &&
806
+ name !== "workspace_get";
807
+ if (shouldCheckManualChanges) {
808
+ try {
809
+ const manualChanges = await services.workspace.getManualChanges(workspaceId);
810
+ if (manualChanges.length > 0) {
811
+ const reminder = formatManualChangeReminder(manualChanges);
812
+ responseText = responseText + "\n\n" + reminder;
813
+ }
814
+ }
815
+ catch (error) {
816
+ // 静默失败:如果获取变更失败,不影响主响应
817
+ devLog.warn("获取手动变更失败", { error });
818
+ }
819
+ }
820
+ return {
821
+ content: [
822
+ {
823
+ type: "text",
824
+ text: responseText,
825
+ },
826
+ ],
827
+ };
828
+ }
829
+ catch (error) {
830
+ // 记录 MCP 调用错误
831
+ const duration = Date.now() - startTime;
832
+ logMcpError(name, error instanceof Error ? error : String(error));
833
+ logMcpEnd(name, false, error instanceof Error ? error.message : String(error), duration);
834
+ if (error instanceof ZeroError) {
835
+ // 对于 WORKSPACE_NOT_FOUND 错误,附加活跃工作区列表以帮助恢复
836
+ let errorResponse = {
837
+ error: {
838
+ code: error.code,
839
+ message: error.message,
840
+ },
841
+ };
842
+ if (error.code === "WORKSPACE_NOT_FOUND") {
843
+ try {
844
+ const listResult = await services.workspace.list({ status: "active" });
845
+ errorResponse.error.availableWorkspaces = listResult.workspaces;
846
+ }
847
+ catch {
848
+ // 获取列表失败时忽略,不影响错误响应
849
+ }
850
+ }
851
+ return {
852
+ content: [
853
+ {
854
+ type: "text",
855
+ text: JSON.stringify(errorResponse, null, 2),
856
+ },
857
+ ],
858
+ isError: true,
859
+ };
860
+ }
861
+ const message = error instanceof Error ? error.message : String(error);
862
+ return {
863
+ content: [
864
+ {
865
+ type: "text",
866
+ text: JSON.stringify({
867
+ error: {
868
+ code: "INTERNAL_ERROR",
869
+ message,
870
+ },
871
+ }, null, 2),
872
+ },
873
+ ],
874
+ isError: true,
875
+ };
876
+ }
877
+ });
878
+ // 注册 Prompts 列表处理器
879
+ server.setRequestHandler(ListPromptsRequestSchema, async () => ({
880
+ prompts: [
881
+ {
882
+ name: "zero-instructions",
883
+ description: "ZeroWorkspace 完整使用指南 - AI 首次使用时应获取此指南",
884
+ },
885
+ {
886
+ name: "zero-quick-start",
887
+ description: "快速开始指南 - 简要的工作流程说明",
888
+ },
889
+ ],
890
+ }));
891
+ // 注册 Prompt 获取处理器
892
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
893
+ const { name } = request.params;
894
+ switch (name) {
895
+ case "zero-instructions":
896
+ return {
897
+ description: "ZeroWorkspace 完整使用指南",
898
+ messages: [
899
+ {
900
+ role: "user",
901
+ content: {
902
+ type: "text",
903
+ text: getFullInstructions(),
904
+ },
905
+ },
906
+ ],
907
+ };
908
+ case "zero-quick-start":
909
+ return {
910
+ description: "ZeroWorkspace 快速开始",
911
+ messages: [
912
+ {
913
+ role: "user",
914
+ content: {
915
+ type: "text",
916
+ text: `# ZeroWorkspace 快速开始
917
+
918
+ ## 基本流程
919
+ 1. workspace_init - 创建工作区
920
+ 2. node_create - 创建子任务
921
+ 3. node_transition(action="start") - 开始执行
922
+ 4. log_append - 记录过程
923
+ 5. node_transition(action="complete") - 完成任务
924
+
925
+ ## 常用工具
926
+ - zero_help(topic="overview") - 获取系统概述
927
+ - workspace_get - 获取工作区详情
928
+ - context_get - 获取聚焦上下文
929
+
930
+ 详细信息请调用 zero_help(topic="all")`,
931
+ },
932
+ },
933
+ ],
934
+ };
935
+ default:
936
+ throw new Error(`未知 Prompt: ${name}`);
937
+ }
938
+ });
939
+ return server;
940
+ }
941
+ // ============================================================================
942
+ // 启动检测
943
+ // ============================================================================
944
+ async function runStartupDetection(services) {
945
+ try {
946
+ // 运行检测
947
+ const detectionResults = await services.detection.detectAll();
948
+ // 读取当前 meta
949
+ const meta = await services.installation.read();
950
+ const currentVersion = services.installation.getPackageVersion();
951
+ // 检查是否需要更新 meta(检测到的组件与 meta 记录不一致)
952
+ let needsUpdate = false;
953
+ for (const platform of ["claudeCode", "cursor", "codex"]) {
954
+ const detected = detectionResults[platform];
955
+ const recorded = meta.global.platforms[platform];
956
+ if (detected?.detected) {
957
+ // 构建组件状态(使用新的 ComponentInfo 结构)
958
+ const components = {
959
+ hooks: {
960
+ installed: detected.components.hooks.installed,
961
+ // 如果检测到已安装但 meta 没有记录版本,说明是新检测到的,使用当前版本
962
+ version: detected.components.hooks.installed
963
+ ? (recorded?.components?.hooks?.version || currentVersion)
964
+ : undefined,
965
+ },
966
+ mcp: {
967
+ installed: detected.components.mcp.installed,
968
+ version: detected.components.mcp.installed
969
+ ? (recorded?.components?.mcp?.version || currentVersion)
970
+ : undefined,
971
+ },
972
+ };
973
+ // Claude Code 平台特有的 agents 和 skills 组件
974
+ if (platform === "claudeCode") {
975
+ if (detected.components.agents) {
976
+ components.agents = {
977
+ installed: detected.components.agents.installed,
978
+ version: detected.components.agents.installed
979
+ ? (recorded?.components?.agents?.version || currentVersion)
980
+ : undefined,
981
+ };
982
+ }
983
+ if (detected.components.skills) {
984
+ components.skills = {
985
+ installed: detected.components.skills.installed,
986
+ version: detected.components.skills.installed
987
+ ? (recorded?.components?.skills?.version || currentVersion)
988
+ : undefined,
989
+ };
990
+ }
991
+ }
992
+ // 检查是否有变更需要同步(比较 installed 状态)
993
+ const hooksChanged = components.hooks.installed !== recorded?.components?.hooks?.installed;
994
+ const mcpChanged = components.mcp.installed !== recorded?.components?.mcp?.installed;
995
+ const agentsChanged = platform === "claudeCode" &&
996
+ components.agents?.installed !== recorded?.components?.agents?.installed;
997
+ const skillsChanged = platform === "claudeCode" &&
998
+ components.skills?.installed !== recorded?.components?.skills?.installed;
999
+ if (!recorded?.enabled || hooksChanged || mcpChanged || agentsChanged || skillsChanged) {
1000
+ // 检测到组件状态变更,更新 meta
1001
+ await services.installation.updatePlatform(platform, {
1002
+ enabled: true,
1003
+ components,
1004
+ });
1005
+ needsUpdate = true;
1006
+ logMcp(`检测到 ${platform} 组件状态变更,已更新 meta`);
1007
+ }
1008
+ }
1009
+ }
1010
+ if (!needsUpdate) {
1011
+ logMcp("启动检测完成,无需更新");
1012
+ }
1013
+ }
1014
+ catch (err) {
1015
+ // 检测失败不影响启动,只记录警告
1016
+ logMcp(`启动检测失败: ${err instanceof Error ? err.message : String(err)}`);
1017
+ }
1018
+ }
1019
+ // ============================================================================
1020
+ // 主函数
1021
+ // ============================================================================
1022
+ async function main() {
1023
+ // 1. 创建共享服务实例
1024
+ const services = createServices();
1025
+ // 1.1 后台运行启动检测(不阻塞启动)
1026
+ runStartupDetection(services);
1027
+ // 2. 尝试启动 HTTP server(后台)
1028
+ const httpServer = await startHttpServerInBackground(HTTP_PORT);
1029
+ // 2.1 如果没有启动本地 HTTP,检测并连接远程 HTTP(用于事件转发)
1030
+ if (!httpServer) {
1031
+ const pidInfo = readPidInfo();
1032
+ if (pidInfo && isProcessRunning(pidInfo.pid) && pidInfo.pid !== process.pid) {
1033
+ // 存在远程 HTTP 服务,配置事件转发
1034
+ eventService.setRemoteHttp(pidInfo.port);
1035
+ logMcp(`已配置事件转发到远程 HTTP (port: ${pidInfo.port})`);
1036
+ }
1037
+ }
1038
+ // 3. 创建并启动 MCP server
1039
+ const mcpServer = createMcpServer(services);
1040
+ const transport = new StdioServerTransport();
1041
+ await mcpServer.connect(transport);
1042
+ logMcp("Server started");
1043
+ // 4. 优雅退出处理
1044
+ const shutdown = async (signal) => {
1045
+ logMcp(`收到 ${signal},正在关闭...`);
1046
+ // 关闭 HTTP server
1047
+ if (httpServer) {
1048
+ try {
1049
+ await httpServer.close();
1050
+ logHttp("Server closed");
1051
+ }
1052
+ catch (err) {
1053
+ logHttp(`关闭失败: ${err instanceof Error ? err.message : String(err)}`);
1054
+ }
1055
+ }
1056
+ // 关闭 MCP server
1057
+ try {
1058
+ await mcpServer.close();
1059
+ logMcp("Server closed");
1060
+ }
1061
+ catch (err) {
1062
+ logMcp(`关闭失败: ${err instanceof Error ? err.message : String(err)}`);
1063
+ }
1064
+ process.exit(0);
1065
+ };
1066
+ process.on("SIGINT", () => shutdown("SIGINT"));
1067
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
1068
+ }
1069
+ main().catch((err) => {
1070
+ console.error("[main] 启动失败:", err);
1071
+ process.exit(1);
1072
+ });
1073
+ //# sourceMappingURL=index.js.map