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,714 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * OpenSpec 导入脚本
5
+ * 将 OpenSpec change 目录批量转换为 XtepWorkspace 工作区
6
+ *
7
+ * 职责:只负责批量创建,不负责分析(分析由 AI 完成)
8
+ *
9
+ * 用法:
10
+ * node openspec-import.cjs --path <openspec-dir> --change <change-id> --project <project-root>
11
+ */
12
+
13
+ const fs = require('node:fs');
14
+ const path = require('node:path');
15
+ const { IS_DEV, DIR_SUFFIX, INDEX_PATH } = require('./shared/config.cjs');
16
+
17
+ // ========== OpenSpec 解析 ==========
18
+
19
+ /**
20
+ * 解析 proposal.md 文件
21
+ */
22
+ function parseProposal(filePath) {
23
+ const content = fs.readFileSync(filePath, 'utf-8');
24
+
25
+ const titleMatch = content.match(/^#\s*Change:\s*(.+)$/m);
26
+ const title = titleMatch ? titleMatch[1].trim() : '';
27
+
28
+ const whyMatch = content.match(/##\s*Why\s*\n+([\s\S]*?)(?=\n##|$)/);
29
+ const why = whyMatch ? whyMatch[1].trim() : '';
30
+
31
+ const whatMatch = content.match(/##\s*What Changes\s*\n+([\s\S]*?)(?=\n##|$)/);
32
+ const whatChanges = [];
33
+ if (whatMatch) {
34
+ const lines = whatMatch[1].split('\n');
35
+ for (const line of lines) {
36
+ const itemMatch = line.match(/^-\s+(.+)$/);
37
+ if (itemMatch) {
38
+ whatChanges.push(itemMatch[1].trim());
39
+ }
40
+ }
41
+ }
42
+
43
+ const impactMatch = content.match(/##\s*Impact\s*\n+([\s\S]*?)(?=\n##|$)/);
44
+ const impact = { specs: [], code: [] };
45
+ if (impactMatch) {
46
+ const impactText = impactMatch[1];
47
+ const specsMatch = impactText.match(/Affected specs?:\s*(.+)/i);
48
+ if (specsMatch) {
49
+ impact.specs = specsMatch[1].split(',').map(s => s.trim());
50
+ }
51
+ const codeMatch = impactText.match(/Affected code:\s*(.+)/i);
52
+ if (codeMatch) {
53
+ impact.code = codeMatch[1].split(',').map(s => s.trim());
54
+ }
55
+ }
56
+
57
+ return { title, why, whatChanges, impact, raw: content };
58
+ }
59
+
60
+ /**
61
+ * 解析 tasks.md 文件
62
+ */
63
+ function parseTasks(filePath) {
64
+ const content = fs.readFileSync(filePath, 'utf-8');
65
+ const groups = [];
66
+ const lines = content.split('\n');
67
+
68
+ let currentGroup = null;
69
+ let currentSubGroup = null;
70
+
71
+ for (const line of lines) {
72
+ const groupMatch = line.match(/^##\s+(\d+)\.\s+(.+)$/);
73
+ if (groupMatch) {
74
+ if (currentSubGroup && currentSubGroup.tasks.length > 0 && currentGroup) {
75
+ currentGroup.tasks.push(...currentSubGroup.tasks);
76
+ }
77
+ currentSubGroup = null;
78
+
79
+ if (currentGroup && currentGroup.tasks.length > 0) {
80
+ groups.push(currentGroup);
81
+ }
82
+
83
+ currentGroup = {
84
+ groupId: groupMatch[1],
85
+ groupName: groupMatch[2].trim(),
86
+ tasks: []
87
+ };
88
+ continue;
89
+ }
90
+
91
+ const subGroupMatch = line.match(/^###\s+([\d.]+)\s+(.+)$/);
92
+ if (subGroupMatch && currentGroup) {
93
+ if (currentSubGroup && currentSubGroup.tasks.length > 0) {
94
+ currentGroup.tasks.push(...currentSubGroup.tasks);
95
+ }
96
+ currentSubGroup = {
97
+ groupId: subGroupMatch[1],
98
+ groupName: subGroupMatch[2].trim(),
99
+ tasks: []
100
+ };
101
+ continue;
102
+ }
103
+
104
+ const taskMatch = line.match(/^-\s+\[([ x])\]\s+([\d.]+)\s+(.+)$/);
105
+ if (taskMatch) {
106
+ const task = {
107
+ id: taskMatch[2],
108
+ text: taskMatch[3].trim(),
109
+ completed: taskMatch[1] === 'x'
110
+ };
111
+ if (currentSubGroup) {
112
+ currentSubGroup.tasks.push(task);
113
+ } else if (currentGroup) {
114
+ currentGroup.tasks.push(task);
115
+ }
116
+ }
117
+ }
118
+
119
+ if (currentSubGroup && currentSubGroup.tasks.length > 0 && currentGroup) {
120
+ currentGroup.tasks.push(...currentSubGroup.tasks);
121
+ }
122
+ if (currentGroup && currentGroup.tasks.length > 0) {
123
+ groups.push(currentGroup);
124
+ }
125
+
126
+ return groups;
127
+ }
128
+
129
+ /**
130
+ * 解析完整的 change 目录
131
+ */
132
+ function parseChange(changePath) {
133
+ const changeId = path.basename(changePath);
134
+
135
+ const proposalPath = path.join(changePath, 'proposal.md');
136
+ if (!fs.existsSync(proposalPath)) {
137
+ throw new Error(`proposal.md not found in ${changePath}`);
138
+ }
139
+ const proposal = parseProposal(proposalPath);
140
+
141
+ const tasksPath = path.join(changePath, 'tasks.md');
142
+ let taskGroups = [];
143
+ if (fs.existsSync(tasksPath)) {
144
+ taskGroups = parseTasks(tasksPath);
145
+ }
146
+
147
+ const designPath = path.join(changePath, 'design.md');
148
+ const hasDesign = fs.existsSync(designPath);
149
+ const designContent = hasDesign ? fs.readFileSync(designPath, 'utf-8') : undefined;
150
+
151
+ const specsDir = path.join(changePath, 'specs');
152
+ const specFiles = [];
153
+ const specContents = {};
154
+
155
+ if (fs.existsSync(specsDir)) {
156
+ const collectSpecs = (dir, prefix = '') => {
157
+ const items = fs.readdirSync(dir);
158
+ for (const item of items) {
159
+ const itemPath = path.join(dir, item);
160
+ const relativePath = prefix ? `${prefix}/${item}` : item;
161
+ const stat = fs.statSync(itemPath);
162
+ if (stat.isDirectory()) {
163
+ collectSpecs(itemPath, relativePath);
164
+ } else if (item.endsWith('.md')) {
165
+ specFiles.push(relativePath);
166
+ specContents[relativePath] = fs.readFileSync(itemPath, 'utf-8');
167
+ }
168
+ }
169
+ };
170
+ collectSpecs(specsDir);
171
+ }
172
+
173
+ return {
174
+ changeId,
175
+ proposal,
176
+ taskGroups,
177
+ hasDesign,
178
+ designContent,
179
+ specFiles,
180
+ specContents
181
+ };
182
+ }
183
+
184
+ // ========== ID 生成 ==========
185
+
186
+ function generateId(prefix) {
187
+ const timestamp = Date.now().toString(36);
188
+ const random = Math.random().toString(36).substring(2, 8);
189
+ return `${prefix}-${timestamp}-${random}`;
190
+ }
191
+
192
+ // ========== 工作区生成 ==========
193
+
194
+ /**
195
+ * 生成工作区 Markdown
196
+ */
197
+ function generateWorkspaceMd(name, goal, rules, docs, createdAt) {
198
+ const rulesContent = rules.length > 0
199
+ ? rules.map(rule => `- ${rule}`).join('\n')
200
+ : '';
201
+
202
+ const docsContent = docs.length > 0
203
+ ? docs.map(doc => `- [${doc.description}](${doc.path})`).join('\n')
204
+ : '';
205
+
206
+ return `---
207
+ name: ${name}
208
+ createdAt: ${createdAt}
209
+ updatedAt: ${createdAt}
210
+ ---
211
+
212
+ ## 规则
213
+
214
+ > 只读,上下文必须遵循的约束
215
+
216
+ ${rulesContent}
217
+
218
+ ## 文档
219
+
220
+ > 读写,全局参考文档
221
+
222
+ ${docsContent}
223
+
224
+ ## 目标
225
+
226
+ ${goal}
227
+ `;
228
+ }
229
+
230
+ /**
231
+ * 生成节点 Info.md
232
+ */
233
+ function generateNodeInfoMd(node) {
234
+ const typeLabel = node.type === 'planning' ? '规划' : '执行';
235
+ const docsContent = node.docs.length > 0
236
+ ? node.docs.map(doc => `- [${doc.description}](${doc.path})`).join('\n')
237
+ : '';
238
+
239
+ return `---
240
+ id: ${node.id}
241
+ type: ${node.type}
242
+ title: ${node.title}
243
+ status: ${node.status}
244
+ createdAt: ${node.createdAt}
245
+ updatedAt: ${node.createdAt}
246
+ ---
247
+
248
+ ## 节点类型
249
+
250
+ ${typeLabel}节点
251
+
252
+ ## 需求
253
+
254
+ ${node.requirement}
255
+
256
+ ## 文档引用
257
+
258
+ > 格式:- [文件名](路径) - 说明 (状态)
259
+
260
+ ${docsContent}
261
+
262
+ ## 备注
263
+
264
+
265
+
266
+ ## 结论
267
+
268
+ > 节点完成时填写
269
+
270
+ ${node.conclusion || ''}
271
+ `;
272
+ }
273
+
274
+ /**
275
+ * 生成节点 Log.md
276
+ */
277
+ function generateNodeLogMd(initialLog) {
278
+ let content = `## 日志
279
+
280
+ | 时间 | 操作者 | 事件 |
281
+ |------|--------|------|
282
+ `;
283
+ if (initialLog) {
284
+ content += `| ${initialLog.time} | ${initialLog.operator} | ${initialLog.event} |\n`;
285
+ }
286
+ return content;
287
+ }
288
+
289
+ /**
290
+ * 生成节点 Problem.md
291
+ */
292
+ function generateNodeProblemMd() {
293
+ return `## 当前问题
294
+
295
+ (暂无)
296
+
297
+ ## 下一步
298
+
299
+ (暂无)
300
+ `;
301
+ }
302
+
303
+ /**
304
+ * 转换为工作区结构
305
+ */
306
+ function convertToWorkspace(change, projectRoot) {
307
+ const now = new Date();
308
+ const createdAt = now.toISOString();
309
+ const workspaceId = generateId('ws');
310
+ const workspaceName = change.proposal.title || change.changeId;
311
+ const goal = change.proposal.why || change.proposal.title;
312
+
313
+ // 生成规则
314
+ const rules = [];
315
+ if (change.proposal.whatChanges.length > 0) {
316
+ rules.push(`变更范围: ${change.proposal.whatChanges.slice(0, 3).join(', ')}${change.proposal.whatChanges.length > 3 ? '...' : ''}`);
317
+ }
318
+ if (change.proposal.impact.specs.length > 0) {
319
+ rules.push(`影响规范: ${change.proposal.impact.specs.join(', ')}`);
320
+ }
321
+
322
+ // 收集文档
323
+ const docs = [];
324
+ if (change.hasDesign) {
325
+ docs.push({ path: 'docs/design.md', description: '技术设计文档' });
326
+ }
327
+ for (const specFile of change.specFiles.slice(0, 5)) {
328
+ docs.push({ path: `docs/specs/${specFile}`, description: `规范: ${specFile}` });
329
+ }
330
+
331
+ // 生成节点树
332
+ const nodeTree = generateNodeTree(change, createdAt);
333
+
334
+ return {
335
+ workspaceId,
336
+ workspaceName,
337
+ goal,
338
+ rules,
339
+ docs,
340
+ createdAt,
341
+ nodeTree,
342
+ docContents: {
343
+ design: change.designContent,
344
+ specs: change.specContents
345
+ }
346
+ };
347
+ }
348
+
349
+ /**
350
+ * 生成节点树 (graph.json v3.0 格式)
351
+ */
352
+ function generateNodeTree(change, createdAt) {
353
+ const nodes = {};
354
+ const nodesList = [];
355
+
356
+ // 创建根节点
357
+ const rootId = generateId('node');
358
+ nodes[rootId] = {
359
+ id: rootId,
360
+ type: 'planning',
361
+ parentId: null,
362
+ children: [],
363
+ status: 'implementing',
364
+ isolate: false,
365
+ references: [],
366
+ conclusion: null,
367
+ createdAt,
368
+ updatedAt: createdAt
369
+ };
370
+ nodesList.push({
371
+ id: rootId,
372
+ type: 'planning',
373
+ title: change.proposal.title || '根节点',
374
+ status: 'implementing',
375
+ requirement: change.proposal.why || '',
376
+ docs: [],
377
+ createdAt,
378
+ conclusion: ''
379
+ });
380
+
381
+ // 遍历 taskGroups 生成规划节点和子执行节点
382
+ for (const group of change.taskGroups) {
383
+ const groupId = generateId('node');
384
+ const allCompleted = group.tasks.length > 0 && group.tasks.every(t => t.completed);
385
+ const groupStatus = allCompleted ? 'completed' : 'pending';
386
+
387
+ nodes[groupId] = {
388
+ id: groupId,
389
+ type: 'planning',
390
+ parentId: rootId,
391
+ children: [],
392
+ status: groupStatus,
393
+ isolate: false,
394
+ references: [],
395
+ conclusion: allCompleted ? `阶段已完成 (${group.tasks.length} 个任务)` : null,
396
+ createdAt,
397
+ updatedAt: createdAt
398
+ };
399
+ nodes[rootId].children.push(groupId);
400
+
401
+ nodesList.push({
402
+ id: groupId,
403
+ type: 'planning',
404
+ title: `${group.groupId}. ${group.groupName}`,
405
+ status: groupStatus,
406
+ requirement: `${group.groupName} 阶段的任务`,
407
+ docs: [],
408
+ createdAt,
409
+ conclusion: allCompleted ? `阶段已完成 (${group.tasks.length} 个任务)` : ''
410
+ });
411
+
412
+ // 遍历任务生成执行节点
413
+ for (const task of group.tasks) {
414
+ const taskId = generateId('node');
415
+ const taskStatus = task.completed ? 'completed' : 'pending';
416
+
417
+ const requirementParts = [`**任务**: ${task.text}`];
418
+ if (change.proposal.why) {
419
+ requirementParts.push(`\n**背景**: ${change.proposal.why.slice(0, 200)}${change.proposal.why.length > 200 ? '...' : ''}`);
420
+ }
421
+
422
+ const taskDocs = [];
423
+ if (change.hasDesign) {
424
+ taskDocs.push({ path: 'docs/design.md', description: '技术设计' });
425
+ }
426
+
427
+ nodes[taskId] = {
428
+ id: taskId,
429
+ type: 'execution',
430
+ parentId: groupId,
431
+ children: [],
432
+ status: taskStatus,
433
+ isolate: false,
434
+ references: [],
435
+ conclusion: task.completed ? '任务已在 OpenSpec 中标记为完成' : null,
436
+ createdAt,
437
+ updatedAt: createdAt
438
+ };
439
+ nodes[groupId].children.push(taskId);
440
+
441
+ nodesList.push({
442
+ id: taskId,
443
+ type: 'execution',
444
+ title: `${task.id} ${task.text}`,
445
+ status: taskStatus,
446
+ requirement: requirementParts.join('\n'),
447
+ docs: taskDocs,
448
+ createdAt,
449
+ conclusion: task.completed ? '任务已在 OpenSpec 中标记为完成' : ''
450
+ });
451
+ }
452
+ }
453
+
454
+ return {
455
+ rootId,
456
+ nodes,
457
+ nodesList
458
+ };
459
+ }
460
+
461
+ // ========== 文件写入 ==========
462
+
463
+ function formatLogTime(date = new Date()) {
464
+ const pad = n => String(n).padStart(2, '0');
465
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;
466
+ }
467
+
468
+ /**
469
+ * 写入工作区文件
470
+ */
471
+ function writeWorkspace(conversion, projectRoot) {
472
+ const workspacePath = path.join(projectRoot, `.xtep-workspace${DIR_SUFFIX}`, conversion.workspaceId);
473
+
474
+ // 创建目录结构
475
+ fs.mkdirSync(workspacePath, { recursive: true });
476
+ fs.mkdirSync(path.join(workspacePath, 'nodes'), { recursive: true });
477
+ fs.mkdirSync(path.join(workspacePath, 'docs'), { recursive: true });
478
+
479
+ // 写入 workspace.json
480
+ const workspaceJson = {
481
+ id: conversion.workspaceId,
482
+ name: conversion.workspaceName,
483
+ status: 'active',
484
+ createdAt: conversion.createdAt,
485
+ updatedAt: conversion.createdAt,
486
+ rootNodeId: conversion.nodeTree.rootId
487
+ };
488
+ fs.writeFileSync(
489
+ path.join(workspacePath, 'workspace.json'),
490
+ JSON.stringify(workspaceJson, null, 2)
491
+ );
492
+
493
+ // 写入 Workspace.md
494
+ fs.writeFileSync(
495
+ path.join(workspacePath, 'Workspace.md'),
496
+ generateWorkspaceMd(
497
+ conversion.workspaceName,
498
+ conversion.goal,
499
+ conversion.rules,
500
+ conversion.docs,
501
+ conversion.createdAt
502
+ )
503
+ );
504
+
505
+ // 写入 graph.json (v3.0 格式)
506
+ const graphJson = {
507
+ version: '3.0',
508
+ currentFocus: conversion.nodeTree.rootId,
509
+ nodes: conversion.nodeTree.nodes
510
+ };
511
+ fs.writeFileSync(
512
+ path.join(workspacePath, 'graph.json'),
513
+ JSON.stringify(graphJson, null, 2)
514
+ );
515
+
516
+ // 写入 Log.md
517
+ fs.writeFileSync(
518
+ path.join(workspacePath, 'Log.md'),
519
+ generateNodeLogMd({
520
+ time: formatLogTime(),
521
+ operator: 'System',
522
+ event: '工作区从 OpenSpec 导入创建'
523
+ })
524
+ );
525
+
526
+ // 写入 Problem.md
527
+ fs.writeFileSync(
528
+ path.join(workspacePath, 'Problem.md'),
529
+ generateNodeProblemMd()
530
+ );
531
+
532
+ // 写入所有节点
533
+ for (const node of conversion.nodeTree.nodesList) {
534
+ const nodePath = path.join(workspacePath, 'nodes', node.id);
535
+ fs.mkdirSync(nodePath, { recursive: true });
536
+
537
+ fs.writeFileSync(path.join(nodePath, 'Info.md'), generateNodeInfoMd(node));
538
+
539
+ const logEvent = node.status === 'completed'
540
+ ? '节点创建并标记为完成 (从 OpenSpec 导入)'
541
+ : '节点创建 (从 OpenSpec 导入)';
542
+ fs.writeFileSync(
543
+ path.join(nodePath, 'Log.md'),
544
+ generateNodeLogMd({
545
+ time: formatLogTime(),
546
+ operator: 'System',
547
+ event: logEvent
548
+ })
549
+ );
550
+
551
+ fs.writeFileSync(path.join(nodePath, 'Problem.md'), generateNodeProblemMd());
552
+ }
553
+
554
+ // 复制文档
555
+ if (conversion.docContents.design) {
556
+ fs.writeFileSync(
557
+ path.join(workspacePath, 'docs', 'design.md'),
558
+ conversion.docContents.design
559
+ );
560
+ }
561
+ if (Object.keys(conversion.docContents.specs).length > 0) {
562
+ fs.mkdirSync(path.join(workspacePath, 'docs', 'specs'), { recursive: true });
563
+ for (const [specPath, specContent] of Object.entries(conversion.docContents.specs)) {
564
+ const targetPath = path.join(workspacePath, 'docs', 'specs', specPath);
565
+ fs.mkdirSync(path.dirname(targetPath), { recursive: true });
566
+ fs.writeFileSync(targetPath, specContent);
567
+ }
568
+ }
569
+
570
+ return workspacePath;
571
+ }
572
+
573
+ /**
574
+ * 更新全局索引
575
+ */
576
+ function updateIndex(conversion, projectRoot) {
577
+ let index = { version: '2.0', workspaces: [] };
578
+ if (fs.existsSync(INDEX_PATH)) {
579
+ try {
580
+ index = JSON.parse(fs.readFileSync(INDEX_PATH, 'utf-8'));
581
+ } catch {
582
+ // 忽略解析错误
583
+ }
584
+ }
585
+
586
+ // 添加新工作区 (正确格式)
587
+ index.workspaces.push({
588
+ id: conversion.workspaceId,
589
+ name: conversion.workspaceName,
590
+ projectRoot,
591
+ status: 'active',
592
+ createdAt: conversion.createdAt,
593
+ updatedAt: conversion.createdAt
594
+ });
595
+
596
+ fs.writeFileSync(INDEX_PATH, JSON.stringify(index, null, 2));
597
+ }
598
+
599
+ // ========== 主程序 ==========
600
+
601
+ function printUsage() {
602
+ console.log(`
603
+ OpenSpec 导入脚本
604
+ 将 OpenSpec change 目录批量转换为 XtepWorkspace 工作区
605
+
606
+ 用法:
607
+ node openspec-import.cjs --path <openspec-dir> --change <change-id> --project <project-root>
608
+
609
+ 参数:
610
+ --path OpenSpec 目录路径 (包含 changes/ 子目录)
611
+ --change 要导入的 change ID (changes/ 下的目录名)
612
+ --project 目标项目根目录
613
+ `);
614
+ }
615
+
616
+ function main() {
617
+ const args = process.argv.slice(2);
618
+
619
+ if (args.includes('--help') || args.includes('-h')) {
620
+ printUsage();
621
+ process.exit(0);
622
+ }
623
+
624
+ let openspecPath = null;
625
+ let changeId = null;
626
+ let projectRoot = null;
627
+
628
+ for (let i = 0; i < args.length; i++) {
629
+ if (args[i] === '--path' && args[i + 1]) {
630
+ openspecPath = args[++i];
631
+ } else if (args[i] === '--change' && args[i + 1]) {
632
+ changeId = args[++i];
633
+ } else if (args[i] === '--project' && args[i + 1]) {
634
+ projectRoot = args[++i];
635
+ }
636
+ }
637
+
638
+ if (!openspecPath || !changeId || !projectRoot) {
639
+ console.error('错误: 缺少必要参数');
640
+ printUsage();
641
+ process.exit(1);
642
+ }
643
+
644
+ const changePath = path.join(openspecPath, 'changes', changeId);
645
+ if (!fs.existsSync(changePath)) {
646
+ console.error(`错误: Change 目录不存在: ${changePath}`);
647
+ process.exit(1);
648
+ }
649
+
650
+ if (!fs.existsSync(projectRoot)) {
651
+ console.error(`错误: 项目目录不存在: ${projectRoot}`);
652
+ process.exit(1);
653
+ }
654
+
655
+ try {
656
+ console.log(`正在解析 OpenSpec change: ${changeId}`);
657
+ const change = parseChange(changePath);
658
+
659
+ console.log(` - 标题: ${change.proposal.title || '(无)'}`);
660
+ console.log(` - 任务组: ${change.taskGroups.length}`);
661
+
662
+ let totalTasks = 0;
663
+ let completedTasks = 0;
664
+ for (const group of change.taskGroups) {
665
+ totalTasks += group.tasks.length;
666
+ completedTasks += group.tasks.filter(t => t.completed).length;
667
+ }
668
+ console.log(` - 任务: ${totalTasks} (已完成: ${completedTasks})`);
669
+
670
+ console.log(`正在转换为 XtepWorkspace...`);
671
+ const conversion = convertToWorkspace(change, projectRoot);
672
+
673
+ console.log(` - 工作区 ID: ${conversion.workspaceId}`);
674
+ console.log(` - 节点数: ${conversion.nodeTree.nodesList.length}`);
675
+
676
+ console.log(`正在写入文件...`);
677
+ const workspacePath = writeWorkspace(conversion, projectRoot);
678
+
679
+ console.log(`正在更新索引...`);
680
+ updateIndex(conversion, projectRoot);
681
+
682
+ const completedNodes = conversion.nodeTree.nodesList.filter(n => n.status === 'completed').length;
683
+ const pendingNodes = conversion.nodeTree.nodesList.filter(n => n.status === 'pending').length;
684
+ const implementingNodes = conversion.nodeTree.nodesList.filter(n => n.status === 'implementing').length;
685
+
686
+ console.log(`\n导入完成!`);
687
+ console.log(` 工作区: ${conversion.workspaceName}`);
688
+ console.log(` ID: ${conversion.workspaceId}`);
689
+ console.log(` 路径: ${workspacePath}`);
690
+ console.log(` 节点: ${completedNodes} 完成 / ${implementingNodes} 进行中 / ${pendingNodes} 待处理`);
691
+
692
+ // 输出 JSON 结果
693
+ const result = {
694
+ success: true,
695
+ workspaceId: conversion.workspaceId,
696
+ workspaceName: conversion.workspaceName,
697
+ workspacePath,
698
+ stats: {
699
+ totalNodes: conversion.nodeTree.nodesList.length,
700
+ completedNodes,
701
+ pendingNodes,
702
+ implementingNodes
703
+ }
704
+ };
705
+ console.log(`\n--- JSON ---`);
706
+ console.log(JSON.stringify(result, null, 2));
707
+
708
+ } catch (error) {
709
+ console.error(`导入失败: ${error.message}`);
710
+ process.exit(1);
711
+ }
712
+ }
713
+
714
+ main();