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
@@ -0,0 +1,742 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * zero-workspace plugins 命令
4
+ * 插件管理:安装/卸载/查看状态
5
+ *
6
+ * 功能:
7
+ * - 显示插件安装状态
8
+ * - 安装 Claude Code / Cursor 插件(Hooks, Agents, Skills)
9
+ * - 卸载插件
10
+ */
11
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, cpSync, rmSync, readdirSync, statSync, } from "fs";
12
+ import { homedir } from "os";
13
+ import { join, dirname } from "path";
14
+ import { fileURLToPath } from "url";
15
+ import { createRequire } from "module";
16
+ // ES module 兼容
17
+ const __filename = fileURLToPath(import.meta.url);
18
+ const __dirname = dirname(__filename);
19
+ const require = createRequire(import.meta.url);
20
+ // ============================================================================
21
+ // 配置
22
+ // ============================================================================
23
+ // 项目根目录(从 dist/cli/ 回到项目根目录)
24
+ const PROJECT_ROOT = join(__dirname, "..", "..");
25
+ // 全局安装目录
26
+ const IS_DEV = process.env.NODE_ENV === "development" || process.env.ZERO_DEV === "true";
27
+ const HOME = homedir();
28
+ const ZERO_BASE = IS_DEV ? ".zero-workspace-dev" : ".zero-workspace";
29
+ const ZERO_HOME = join(HOME, ZERO_BASE);
30
+ const ZERO_SCRIPTS = join(ZERO_HOME, "scripts");
31
+ const ZERO_SHARED = join(ZERO_SCRIPTS, "shared");
32
+ // Claude Code 配置
33
+ const CLAUDE_HOME = join(HOME, ".claude");
34
+ const CLAUDE_SETTINGS = join(CLAUDE_HOME, "settings.json");
35
+ // Cursor 配置
36
+ const CURSOR_HOME = join(HOME, ".cursor");
37
+ const CURSOR_HOOKS = join(CURSOR_HOME, "hooks.json");
38
+ // 安装元信息
39
+ const INSTALLATION_META_PATH = join(ZERO_HOME, "installation-meta.json");
40
+ // 插件源目录
41
+ const PLUGIN_ROOT = join(PROJECT_ROOT, "plugin");
42
+ const PLUGIN_SCRIPTS = join(PLUGIN_ROOT, "scripts");
43
+ const PLUGIN_AGENTS = join(PLUGIN_ROOT, "agents");
44
+ const PLUGIN_SKILLS = join(PLUGIN_ROOT, "skills");
45
+ // ============================================================================
46
+ // 颜色输出
47
+ // ============================================================================
48
+ const colors = {
49
+ red: (s) => `\x1b[31m${s}\x1b[0m`,
50
+ green: (s) => `\x1b[32m${s}\x1b[0m`,
51
+ yellow: (s) => `\x1b[33m${s}\x1b[0m`,
52
+ blue: (s) => `\x1b[34m${s}\x1b[0m`,
53
+ gray: (s) => `\x1b[90m${s}\x1b[0m`,
54
+ bold: (s) => `\x1b[1m${s}\x1b[0m`,
55
+ };
56
+ function info(msg) {
57
+ console.log(`${colors.blue("[INFO]")} ${msg}`);
58
+ }
59
+ function success(msg) {
60
+ console.log(`${colors.green("[OK]")} ${msg}`);
61
+ }
62
+ function warn(msg) {
63
+ console.log(`${colors.yellow("[WARN]")} ${msg}`);
64
+ }
65
+ function error(msg) {
66
+ console.log(`${colors.red("[ERROR]")} ${msg}`);
67
+ }
68
+ // ============================================================================
69
+ // 工具函数
70
+ // ============================================================================
71
+ function getPackageVersion() {
72
+ try {
73
+ const pkg = require(join(PROJECT_ROOT, "package.json"));
74
+ return pkg.version || "0.0.0";
75
+ }
76
+ catch {
77
+ return "0.0.0";
78
+ }
79
+ }
80
+ function readInstallationMeta() {
81
+ try {
82
+ if (existsSync(INSTALLATION_META_PATH)) {
83
+ return JSON.parse(readFileSync(INSTALLATION_META_PATH, "utf-8"));
84
+ }
85
+ }
86
+ catch {
87
+ // 解析失败
88
+ }
89
+ const now = new Date().toISOString();
90
+ return {
91
+ schemaVersion: "1.0",
92
+ global: {
93
+ installedAt: now,
94
+ lastUpdatedAt: now,
95
+ packageVersion: "0.0.0",
96
+ platforms: {},
97
+ },
98
+ };
99
+ }
100
+ function writeInstallationMeta(meta) {
101
+ const dir = dirname(INSTALLATION_META_PATH);
102
+ if (!existsSync(dir)) {
103
+ mkdirSync(dir, { recursive: true });
104
+ }
105
+ meta.global.lastUpdatedAt = new Date().toISOString();
106
+ writeFileSync(INSTALLATION_META_PATH, JSON.stringify(meta, null, 2), "utf-8");
107
+ }
108
+ export function updateInstallationMeta(platform, component, action) {
109
+ try {
110
+ const meta = readInstallationMeta();
111
+ const now = new Date().toISOString();
112
+ const version = getPackageVersion();
113
+ // 初始化平台
114
+ if (!meta.global.platforms[platform]) {
115
+ meta.global.platforms[platform] = {
116
+ enabled: true,
117
+ installedAt: now,
118
+ components: {
119
+ hooks: { installed: false },
120
+ mcp: { installed: false },
121
+ },
122
+ };
123
+ // 平台特有组件
124
+ if (platform === "claudeCode") {
125
+ meta.global.platforms[platform].components.agents = { installed: false };
126
+ meta.global.platforms[platform].components.skills = { installed: false };
127
+ }
128
+ if (platform === "cursor") {
129
+ meta.global.platforms[platform].components.modes = { installed: false };
130
+ }
131
+ }
132
+ if (action === "update") {
133
+ meta.global.platforms[platform].components[component] = { installed: true, version };
134
+ meta.global.packageVersion = version;
135
+ }
136
+ else {
137
+ meta.global.platforms[platform].components[component] = { installed: false };
138
+ const allDisabled = Object.values(meta.global.platforms[platform].components).every((c) => !c.installed);
139
+ if (allDisabled) {
140
+ meta.global.platforms[platform].enabled = false;
141
+ }
142
+ }
143
+ writeInstallationMeta(meta);
144
+ }
145
+ catch {
146
+ // 静默失败
147
+ }
148
+ }
149
+ function readJsonFile(filePath) {
150
+ try {
151
+ if (existsSync(filePath)) {
152
+ return JSON.parse(readFileSync(filePath, "utf-8"));
153
+ }
154
+ }
155
+ catch {
156
+ // 解析失败
157
+ }
158
+ return {};
159
+ }
160
+ function writeJsonFile(filePath, data) {
161
+ const dir = dirname(filePath);
162
+ if (!existsSync(dir)) {
163
+ mkdirSync(dir, { recursive: true });
164
+ }
165
+ writeFileSync(filePath, JSON.stringify(data, null, 2), "utf-8");
166
+ }
167
+ function ensureDir(dir) {
168
+ if (!existsSync(dir)) {
169
+ mkdirSync(dir, { recursive: true });
170
+ }
171
+ }
172
+ function copyFile(src, dest) {
173
+ const destDir = dirname(dest);
174
+ ensureDir(destDir);
175
+ cpSync(src, dest);
176
+ }
177
+ function copyDir(src, dest) {
178
+ ensureDir(dest);
179
+ cpSync(src, dest, { recursive: true });
180
+ }
181
+ function removeFile(filePath) {
182
+ if (existsSync(filePath)) {
183
+ rmSync(filePath);
184
+ return true;
185
+ }
186
+ return false;
187
+ }
188
+ function removeDir(dirPath) {
189
+ if (existsSync(dirPath)) {
190
+ rmSync(dirPath, { recursive: true });
191
+ return true;
192
+ }
193
+ return false;
194
+ }
195
+ function isDirEmpty(dirPath) {
196
+ if (!existsSync(dirPath))
197
+ return true;
198
+ const files = readdirSync(dirPath);
199
+ return files.length === 0;
200
+ }
201
+ // 比较版本,完整比较 major.minor.patch
202
+ function needsVersionUpdate(installedVersion, currentVersion) {
203
+ if (!installedVersion)
204
+ return false; // 没有记录版本信息,无法判断
205
+ return installedVersion !== currentVersion;
206
+ }
207
+ function getPluginStatus() {
208
+ const currentVersion = getPackageVersion();
209
+ const meta = readInstallationMeta();
210
+ const claudePlatform = meta.global.platforms["claudeCode"];
211
+ const cursorPlatform = meta.global.platforms["cursor"];
212
+ // Claude hooks
213
+ const claudeHooksInstalled = existsSync(join(ZERO_SCRIPTS, "hook-entry.cjs"));
214
+ const claudeHooksVersion = claudePlatform?.components?.hooks?.version;
215
+ // Claude agents - 动态检测已安装的 agent
216
+ const agentsDir = join(CLAUDE_HOME, "agents");
217
+ const installedAgents = [];
218
+ if (existsSync(agentsDir) && existsSync(PLUGIN_AGENTS)) {
219
+ // 从源目录获取期望的 agent 列表
220
+ const sourceAgents = readdirSync(PLUGIN_AGENTS).filter((name) => name.endsWith(".md") && name !== "CLAUDE.md");
221
+ for (const agent of sourceAgents) {
222
+ if (existsSync(join(agentsDir, agent))) {
223
+ installedAgents.push(agent);
224
+ }
225
+ }
226
+ }
227
+ const claudeAgentsVersion = claudePlatform?.components?.agents?.version;
228
+ // Claude skills
229
+ const skillsDir = join(CLAUDE_HOME, "skills");
230
+ const installedSkills = [];
231
+ if (existsSync(PLUGIN_SKILLS) && existsSync(skillsDir)) {
232
+ const sourceSkills = readdirSync(PLUGIN_SKILLS).filter((name) => {
233
+ const fullPath = join(PLUGIN_SKILLS, name);
234
+ return statSync(fullPath).isDirectory() && existsSync(join(fullPath, "SKILL.md"));
235
+ });
236
+ for (const skill of sourceSkills) {
237
+ if (existsSync(join(skillsDir, skill, "SKILL.md"))) {
238
+ installedSkills.push(skill);
239
+ }
240
+ }
241
+ }
242
+ const claudeSkillsVersion = claudePlatform?.components?.skills?.version;
243
+ // Cursor hooks
244
+ const cursorHooksInstalled = existsSync(join(ZERO_SCRIPTS, "cursor-hook-entry.cjs"));
245
+ const cursorHooksVersion = cursorPlatform?.components?.hooks?.version;
246
+ return {
247
+ currentVersion,
248
+ claude: {
249
+ hooks: claudeHooksInstalled,
250
+ hooksVersion: claudeHooksVersion,
251
+ hooksNeedsUpdate: claudeHooksInstalled && needsVersionUpdate(claudeHooksVersion, currentVersion),
252
+ agents: installedAgents,
253
+ agentsVersion: claudeAgentsVersion,
254
+ agentsNeedsUpdate: installedAgents.length > 0 && needsVersionUpdate(claudeAgentsVersion, currentVersion),
255
+ skills: installedSkills,
256
+ skillsVersion: claudeSkillsVersion,
257
+ skillsNeedsUpdate: installedSkills.length > 0 && needsVersionUpdate(claudeSkillsVersion, currentVersion),
258
+ },
259
+ cursor: {
260
+ hooks: cursorHooksInstalled,
261
+ hooksVersion: cursorHooksVersion,
262
+ hooksNeedsUpdate: cursorHooksInstalled && needsVersionUpdate(cursorHooksVersion, currentVersion),
263
+ },
264
+ };
265
+ }
266
+ // 格式化组件状态显示
267
+ function formatComponentStatus(installed, count, // null 表示不显示数量
268
+ needsUpdate, installedVersion) {
269
+ if (!installed && count !== null && count === 0) {
270
+ return colors.gray("未安装");
271
+ }
272
+ if (!installed) {
273
+ return colors.gray("未安装");
274
+ }
275
+ const countStr = count !== null ? ` (${count})` : "";
276
+ if (needsUpdate) {
277
+ const versionStr = installedVersion ? ` v${installedVersion}` : "";
278
+ return colors.yellow(`需更新${countStr}${versionStr}`);
279
+ }
280
+ return colors.green(`已安装${countStr}`);
281
+ }
282
+ function showStatus() {
283
+ const status = getPluginStatus();
284
+ console.log("");
285
+ console.log(colors.bold(`ZeroWorkspace 插件状态 (v${status.currentVersion})`));
286
+ console.log("");
287
+ // Claude Code
288
+ console.log(colors.bold("Claude Code:"));
289
+ console.log(` Hooks: ${formatComponentStatus(status.claude.hooks, null, status.claude.hooksNeedsUpdate, status.claude.hooksVersion)}`);
290
+ console.log(` Agents: ${formatComponentStatus(status.claude.agents.length > 0, status.claude.agents.length, status.claude.agentsNeedsUpdate, status.claude.agentsVersion)}`);
291
+ if (status.claude.agents.length > 0) {
292
+ for (const agent of status.claude.agents) {
293
+ console.log(` ${colors.gray("-")} ${agent}`);
294
+ }
295
+ }
296
+ console.log(` Skills: ${formatComponentStatus(status.claude.skills.length > 0, status.claude.skills.length, status.claude.skillsNeedsUpdate, status.claude.skillsVersion)}`);
297
+ if (status.claude.skills.length > 0) {
298
+ for (const skill of status.claude.skills) {
299
+ console.log(` ${colors.gray("-")} ${skill}`);
300
+ }
301
+ }
302
+ console.log("");
303
+ // Cursor
304
+ console.log(colors.bold("Cursor:"));
305
+ console.log(` Hooks: ${formatComponentStatus(status.cursor.hooks, null, status.cursor.hooksNeedsUpdate, status.cursor.hooksVersion)}`);
306
+ console.log("");
307
+ // 安装路径
308
+ console.log(colors.gray("安装路径:"));
309
+ console.log(colors.gray(` Scripts: ${ZERO_SCRIPTS}`));
310
+ console.log(colors.gray(` Agents: ${join(CLAUDE_HOME, "agents")}`));
311
+ console.log(colors.gray(` Skills: ${join(CLAUDE_HOME, "skills")}`));
312
+ console.log("");
313
+ }
314
+ // ============================================================================
315
+ // 共享脚本安装
316
+ // ============================================================================
317
+ function installSharedScripts() {
318
+ info("安装共享模块...");
319
+ ensureDir(ZERO_SHARED);
320
+ const sharedSrc = join(PLUGIN_SCRIPTS, "shared");
321
+ if (!existsSync(sharedSrc)) {
322
+ warn(`共享模块源目录不存在: ${sharedSrc}`);
323
+ return;
324
+ }
325
+ const files = readdirSync(sharedSrc).filter((f) => f.endsWith(".cjs"));
326
+ for (const file of files) {
327
+ copyFile(join(sharedSrc, file), join(ZERO_SHARED, file));
328
+ }
329
+ success(`共享模块已安装到 ${ZERO_SHARED}/`);
330
+ }
331
+ // ============================================================================
332
+ // Claude Code 插件
333
+ // ============================================================================
334
+ function installClaudeHooks() {
335
+ info("安装 Claude Code Hook 脚本...");
336
+ ensureDir(ZERO_SCRIPTS);
337
+ installSharedScripts();
338
+ const hookSrc = join(PLUGIN_SCRIPTS, "hook-entry.cjs");
339
+ const hookDest = join(ZERO_SCRIPTS, "hook-entry.cjs");
340
+ if (!existsSync(hookSrc)) {
341
+ error(`Hook 脚本不存在: ${hookSrc}`);
342
+ return;
343
+ }
344
+ copyFile(hookSrc, hookDest);
345
+ success(`Hook 脚本已安装到 ${hookDest}`);
346
+ }
347
+ function configureClaudeHooks() {
348
+ info("配置 Claude Code Hooks...");
349
+ ensureDir(CLAUDE_HOME);
350
+ const settings = readJsonFile(CLAUDE_SETTINGS);
351
+ const hookScript = join(ZERO_SCRIPTS, "hook-entry.cjs");
352
+ const hooksConfig = {
353
+ SessionStart: [
354
+ {
355
+ matcher: "startup|clear|compact",
356
+ hooks: [
357
+ {
358
+ type: "command",
359
+ command: `node "${hookScript}" SessionStart`,
360
+ timeout: 10000,
361
+ },
362
+ ],
363
+ },
364
+ ],
365
+ UserPromptSubmit: [
366
+ {
367
+ hooks: [
368
+ {
369
+ type: "command",
370
+ command: `node "${hookScript}" UserPromptSubmit`,
371
+ timeout: 5000,
372
+ },
373
+ ],
374
+ },
375
+ ],
376
+ PostToolUse: [
377
+ {
378
+ matcher: "mcp__zero-workspace__.*",
379
+ hooks: [
380
+ {
381
+ type: "command",
382
+ command: `node "${hookScript}" PostToolUse`,
383
+ timeout: 3000,
384
+ },
385
+ ],
386
+ },
387
+ {
388
+ matcher: "Edit",
389
+ hooks: [
390
+ {
391
+ type: "command",
392
+ command: `node "${hookScript}" PostToolUse`,
393
+ timeout: 3000,
394
+ },
395
+ ],
396
+ },
397
+ {
398
+ matcher: "Write",
399
+ hooks: [
400
+ {
401
+ type: "command",
402
+ command: `node "${hookScript}" PostToolUse`,
403
+ timeout: 3000,
404
+ },
405
+ ],
406
+ },
407
+ {
408
+ matcher: "Bash",
409
+ hooks: [
410
+ {
411
+ type: "command",
412
+ command: `node "${hookScript}" PostToolUse`,
413
+ timeout: 3000,
414
+ },
415
+ ],
416
+ },
417
+ {
418
+ matcher: "TodoWrite",
419
+ hooks: [
420
+ {
421
+ type: "command",
422
+ command: `node "${hookScript}" PostToolUse`,
423
+ timeout: 3000,
424
+ },
425
+ ],
426
+ },
427
+ ],
428
+ };
429
+ settings.hooks = hooksConfig;
430
+ writeJsonFile(CLAUDE_SETTINGS, settings);
431
+ success(`Hooks 已配置到 ${CLAUDE_SETTINGS}`);
432
+ updateInstallationMeta("claudeCode", "hooks", "update");
433
+ }
434
+ function installDispatchAgents() {
435
+ info("安装派发 Agent 模板...");
436
+ if (!existsSync(PLUGIN_AGENTS)) {
437
+ error(`Agent 模板目录不存在: ${PLUGIN_AGENTS}`);
438
+ return;
439
+ }
440
+ // 动态读取所有 .md 文件(排除 CLAUDE.md)
441
+ const agentFiles = readdirSync(PLUGIN_AGENTS).filter((name) => name.endsWith(".md") && name !== "CLAUDE.md");
442
+ if (agentFiles.length === 0) {
443
+ warn("没有找到 Agent 模板文件");
444
+ return;
445
+ }
446
+ const agentsDir = join(CLAUDE_HOME, "agents");
447
+ ensureDir(agentsDir);
448
+ for (const agentFile of agentFiles) {
449
+ const src = join(PLUGIN_AGENTS, agentFile);
450
+ const dest = join(agentsDir, agentFile);
451
+ copyFile(src, dest);
452
+ }
453
+ success(`派发 Agent 已安装到 ${agentsDir}/`);
454
+ for (const agentFile of agentFiles) {
455
+ info(` - ${agentFile}`);
456
+ }
457
+ updateInstallationMeta("claudeCode", "agents", "update");
458
+ }
459
+ function installSkills() {
460
+ info("安装 Skills 模板...");
461
+ if (!existsSync(PLUGIN_SKILLS)) {
462
+ warn(`Skills 模板目录不存在: ${PLUGIN_SKILLS}`);
463
+ return;
464
+ }
465
+ const skillDirs = readdirSync(PLUGIN_SKILLS).filter((name) => {
466
+ const fullPath = join(PLUGIN_SKILLS, name);
467
+ return statSync(fullPath).isDirectory();
468
+ });
469
+ if (skillDirs.length === 0) {
470
+ warn("Skills 模板目录为空");
471
+ return;
472
+ }
473
+ const skillsDestDir = join(CLAUDE_HOME, "skills");
474
+ ensureDir(skillsDestDir);
475
+ let count = 0;
476
+ for (const skillName of skillDirs) {
477
+ const skillSrcDir = join(PLUGIN_SKILLS, skillName);
478
+ const skillMdPath = join(skillSrcDir, "SKILL.md");
479
+ if (existsSync(skillMdPath)) {
480
+ const skillDestDir = join(skillsDestDir, skillName);
481
+ if (existsSync(skillDestDir)) {
482
+ removeDir(skillDestDir);
483
+ }
484
+ copyDir(skillSrcDir, skillDestDir);
485
+ info(` - ${skillName}/`);
486
+ count++;
487
+ }
488
+ }
489
+ if (count === 0) {
490
+ warn("未找到有效的 Skill 目录(需包含 SKILL.md)");
491
+ return;
492
+ }
493
+ success(`已安装 ${count} 个 Skill 模板到 ${skillsDestDir}/`);
494
+ updateInstallationMeta("claudeCode", "skills", "update");
495
+ }
496
+ function uninstallClaudeHooks() {
497
+ info("卸载 Claude Code Hook...");
498
+ const hookPath = join(ZERO_SCRIPTS, "hook-entry.cjs");
499
+ if (removeFile(hookPath)) {
500
+ success(`已删除 ${hookPath}`);
501
+ }
502
+ if (existsSync(CLAUDE_SETTINGS)) {
503
+ const settings = readJsonFile(CLAUDE_SETTINGS);
504
+ delete settings.hooks;
505
+ writeJsonFile(CLAUDE_SETTINGS, settings);
506
+ success(`已从 ${CLAUDE_SETTINGS} 移除 hooks 配置`);
507
+ }
508
+ updateInstallationMeta("claudeCode", "hooks", "remove");
509
+ }
510
+ function uninstallDispatchAgents() {
511
+ info("卸载派发 Agent...");
512
+ const agentsDir = join(CLAUDE_HOME, "agents");
513
+ // 动态获取要卸载的 agent 列表(排除 CLAUDE.md)
514
+ let agentFiles = [];
515
+ if (existsSync(PLUGIN_AGENTS)) {
516
+ agentFiles = readdirSync(PLUGIN_AGENTS).filter((name) => name.endsWith(".md") && name !== "CLAUDE.md");
517
+ }
518
+ if (agentFiles.length === 0) {
519
+ warn("没有找到 Agent 模板文件");
520
+ return;
521
+ }
522
+ for (const file of agentFiles) {
523
+ const filePath = join(agentsDir, file);
524
+ if (removeFile(filePath)) {
525
+ success(`已删除 ${filePath}`);
526
+ }
527
+ }
528
+ if (isDirEmpty(agentsDir)) {
529
+ removeDir(agentsDir);
530
+ }
531
+ updateInstallationMeta("claudeCode", "agents", "remove");
532
+ }
533
+ function uninstallSkills() {
534
+ info("卸载 Skills...");
535
+ const skillsDestDir = join(CLAUDE_HOME, "skills");
536
+ if (!existsSync(PLUGIN_SKILLS) || !existsSync(skillsDestDir)) {
537
+ return;
538
+ }
539
+ const skillDirs = readdirSync(PLUGIN_SKILLS).filter((name) => {
540
+ const fullPath = join(PLUGIN_SKILLS, name);
541
+ return statSync(fullPath).isDirectory();
542
+ });
543
+ for (const skillName of skillDirs) {
544
+ const skillDestDir = join(skillsDestDir, skillName);
545
+ if (removeDir(skillDestDir)) {
546
+ success(`已删除 ${skillDestDir}/`);
547
+ }
548
+ }
549
+ if (isDirEmpty(skillsDestDir)) {
550
+ removeDir(skillsDestDir);
551
+ }
552
+ updateInstallationMeta("claudeCode", "skills", "remove");
553
+ }
554
+ function cleanupSharedIfUnused() {
555
+ const claudeHook = join(ZERO_SCRIPTS, "hook-entry.cjs");
556
+ const cursorHook = join(ZERO_SCRIPTS, "cursor-hook-entry.cjs");
557
+ if (!existsSync(claudeHook) && !existsSync(cursorHook)) {
558
+ if (removeDir(ZERO_SHARED)) {
559
+ success(`已清理共享模块 ${ZERO_SHARED}`);
560
+ }
561
+ }
562
+ }
563
+ // ============================================================================
564
+ // Cursor 插件
565
+ // ============================================================================
566
+ function installCursorHooks() {
567
+ info("安装 Cursor Hook 脚本...");
568
+ ensureDir(ZERO_SCRIPTS);
569
+ installSharedScripts();
570
+ const hookSrc = join(PLUGIN_SCRIPTS, "cursor-hook-entry.cjs");
571
+ const hookDest = join(ZERO_SCRIPTS, "cursor-hook-entry.cjs");
572
+ if (!existsSync(hookSrc)) {
573
+ error(`Hook 脚本不存在: ${hookSrc}`);
574
+ return;
575
+ }
576
+ copyFile(hookSrc, hookDest);
577
+ success(`Hook 脚本已安装到 ${hookDest}`);
578
+ }
579
+ function configureCursorHooks() {
580
+ info("配置 Cursor Hooks...");
581
+ ensureDir(CURSOR_HOME);
582
+ const hookScript = join(ZERO_SCRIPTS, "cursor-hook-entry.cjs");
583
+ let cursorConfig = readJsonFile(CURSOR_HOOKS);
584
+ if (Object.keys(cursorConfig).length === 0) {
585
+ cursorConfig = { version: 1, hooks: {} };
586
+ }
587
+ if (!cursorConfig.hooks) {
588
+ cursorConfig.hooks = {};
589
+ }
590
+ const hooks = cursorConfig.hooks;
591
+ hooks.beforeSubmitPrompt = [{ command: `node "${hookScript}"` }];
592
+ hooks.afterMCPExecution = [{ command: `node "${hookScript}"` }];
593
+ writeJsonFile(CURSOR_HOOKS, cursorConfig);
594
+ success(`Hooks 已配置到 ${CURSOR_HOOKS}`);
595
+ updateInstallationMeta("cursor", "hooks", "update");
596
+ }
597
+ function uninstallCursorHooks() {
598
+ info("卸载 Cursor Hook...");
599
+ const hookPath = join(ZERO_SCRIPTS, "cursor-hook-entry.cjs");
600
+ if (removeFile(hookPath)) {
601
+ success(`已删除 ${hookPath}`);
602
+ }
603
+ if (existsSync(CURSOR_HOOKS)) {
604
+ const cursorConfig = readJsonFile(CURSOR_HOOKS);
605
+ const hooks = cursorConfig.hooks;
606
+ if (hooks) {
607
+ delete hooks.beforeSubmitPrompt;
608
+ delete hooks.afterMCPExecution;
609
+ writeJsonFile(CURSOR_HOOKS, cursorConfig);
610
+ success(`已从 ${CURSOR_HOOKS} 移除 hooks 配置`);
611
+ }
612
+ }
613
+ updateInstallationMeta("cursor", "hooks", "remove");
614
+ }
615
+ // ============================================================================
616
+ // 单独安装函数(导出供 setup.ts 使用)
617
+ // ============================================================================
618
+ export function installClaudeHooksExport() {
619
+ installClaudeHooks();
620
+ configureClaudeHooks();
621
+ }
622
+ export function installClaudeAgentsExport() {
623
+ installDispatchAgents();
624
+ }
625
+ export function installClaudeSkillsExport() {
626
+ installSkills();
627
+ }
628
+ export { getPluginStatus };
629
+ // ============================================================================
630
+ // 平台完整安装/卸载(导出供 setup.ts 使用)
631
+ // ============================================================================
632
+ export function installClaudeAll() {
633
+ info("安装 Claude Code 全部插件...");
634
+ console.log("");
635
+ installClaudeHooks();
636
+ configureClaudeHooks();
637
+ installDispatchAgents();
638
+ installSkills();
639
+ console.log("");
640
+ success("Claude Code 插件安装完成!");
641
+ info("请重启 Claude Code 使配置生效。");
642
+ }
643
+ export function uninstallClaudeAll() {
644
+ info("卸载 Claude Code 全部插件...");
645
+ console.log("");
646
+ uninstallClaudeHooks();
647
+ uninstallDispatchAgents();
648
+ uninstallSkills();
649
+ cleanupSharedIfUnused();
650
+ console.log("");
651
+ success("Claude Code 插件已卸载");
652
+ }
653
+ export function installCursorAll() {
654
+ info("安装 Cursor 全部插件...");
655
+ console.log("");
656
+ installCursorHooks();
657
+ configureCursorHooks();
658
+ console.log("");
659
+ success("Cursor 插件安装完成!");
660
+ info("请重启 Cursor 使配置生效。");
661
+ }
662
+ export function uninstallCursorAll() {
663
+ info("卸载 Cursor 全部插件...");
664
+ console.log("");
665
+ uninstallCursorHooks();
666
+ cleanupSharedIfUnused();
667
+ console.log("");
668
+ success("Cursor 插件已卸载");
669
+ }
670
+ // ============================================================================
671
+ // 帮助
672
+ // ============================================================================
673
+ function showHelp() {
674
+ console.log(`
675
+ ${colors.bold("zero-workspace plugins")} - 插件管理
676
+
677
+ ${colors.bold("用法:")}
678
+ zero-workspace plugins 查看插件安装状态
679
+ zero-workspace plugins install <平台> 安装插件
680
+ zero-workspace plugins uninstall <平台> 卸载插件
681
+
682
+ ${colors.bold("平台:")}
683
+ --claude Claude Code (Hooks, Agents, Skills)
684
+ --cursor Cursor (Hooks)
685
+
686
+ ${colors.bold("示例:")}
687
+ zero-workspace plugins # 查看状态
688
+ zero-workspace plugins install --claude # 安装 Claude 插件
689
+ zero-workspace plugins uninstall --cursor # 卸载 Cursor 插件
690
+ `);
691
+ }
692
+ // ============================================================================
693
+ // 主函数
694
+ // ============================================================================
695
+ export default function main() {
696
+ const args = process.argv.slice(3); // 跳过 node, script, plugins
697
+ // 无参数:显示状态
698
+ if (args.length === 0) {
699
+ showStatus();
700
+ return;
701
+ }
702
+ const action = args[0];
703
+ const platform = args[1];
704
+ switch (action) {
705
+ case "install":
706
+ if (platform === "--claude") {
707
+ installClaudeAll();
708
+ }
709
+ else if (platform === "--cursor") {
710
+ installCursorAll();
711
+ }
712
+ else {
713
+ error("请指定平台: --claude 或 --cursor");
714
+ showHelp();
715
+ process.exit(1);
716
+ }
717
+ break;
718
+ case "uninstall":
719
+ if (platform === "--claude") {
720
+ uninstallClaudeAll();
721
+ }
722
+ else if (platform === "--cursor") {
723
+ uninstallCursorAll();
724
+ }
725
+ else {
726
+ error("请指定平台: --claude 或 --cursor");
727
+ showHelp();
728
+ process.exit(1);
729
+ }
730
+ break;
731
+ case "help":
732
+ case "--help":
733
+ case "-h":
734
+ showHelp();
735
+ break;
736
+ default:
737
+ error(`未知操作: ${action}`);
738
+ showHelp();
739
+ process.exit(1);
740
+ }
741
+ }
742
+ //# sourceMappingURL=plugins.js.map