xtep-workspace 1.10.10

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 (418) hide show
  1. package/CHANGELOG.md +525 -0
  2. package/README.md +188 -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 +89 -0
  386. package/plugin/README.md +141 -0
  387. package/plugin/agents/xtep-executor.md +114 -0
  388. package/plugin/agents/xtep-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//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
+ * xtep-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.XTEP_DEV === "true";
27
+ const HOME = homedir();
28
+ const XTEP_BASE = IS_DEV ? ".xtep-workspace-dev" : ".xtep-workspace";
29
+ const XTEP_HOME = join(HOME, XTEP_BASE);
30
+ const XTEP_SCRIPTS = join(XTEP_HOME, "scripts");
31
+ const XTEP_SHARED = join(XTEP_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(XTEP_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(XTEP_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(XTEP_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(`XtepWorkspace 插件状态 (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: ${XTEP_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(XTEP_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(XTEP_SHARED, file));
328
+ }
329
+ success(`共享模块已安装到 ${XTEP_SHARED}/`);
330
+ }
331
+ // ============================================================================
332
+ // Claude Code 插件
333
+ // ============================================================================
334
+ function installClaudeHooks() {
335
+ info("安装 Claude Code Hook 脚本...");
336
+ ensureDir(XTEP_SCRIPTS);
337
+ installSharedScripts();
338
+ const hookSrc = join(PLUGIN_SCRIPTS, "hook-entry.cjs");
339
+ const hookDest = join(XTEP_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(XTEP_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__xtep-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(XTEP_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(XTEP_SCRIPTS, "hook-entry.cjs");
556
+ const cursorHook = join(XTEP_SCRIPTS, "cursor-hook-entry.cjs");
557
+ if (!existsSync(claudeHook) && !existsSync(cursorHook)) {
558
+ if (removeDir(XTEP_SHARED)) {
559
+ success(`已清理共享模块 ${XTEP_SHARED}`);
560
+ }
561
+ }
562
+ }
563
+ // ============================================================================
564
+ // Cursor 插件
565
+ // ============================================================================
566
+ function installCursorHooks() {
567
+ info("安装 Cursor Hook 脚本...");
568
+ ensureDir(XTEP_SCRIPTS);
569
+ installSharedScripts();
570
+ const hookSrc = join(PLUGIN_SCRIPTS, "cursor-hook-entry.cjs");
571
+ const hookDest = join(XTEP_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(XTEP_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(XTEP_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("xtep-workspace plugins")} - 插件管理
676
+
677
+ ${colors.bold("用法:")}
678
+ xtep-workspace plugins 查看插件安装状态
679
+ xtep-workspace plugins install <平台> 安装插件
680
+ xtep-workspace plugins uninstall <平台> 卸载插件
681
+
682
+ ${colors.bold("平台:")}
683
+ --claude Claude Code (Hooks, Agents, Skills)
684
+ --cursor Cursor (Hooks)
685
+
686
+ ${colors.bold("示例:")}
687
+ xtep-workspace plugins # 查看状态
688
+ xtep-workspace plugins install --claude # 安装 Claude 插件
689
+ xtep-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