grf-cli 1.0.2 → 1.0.4

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 (382) hide show
  1. package/README.md +15 -7
  2. package/README.zh-CN.md +15 -7
  3. package/dist/cli.js +2 -14
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/add/display.d.ts +10 -0
  6. package/dist/commands/add/display.d.ts.map +1 -0
  7. package/dist/commands/add/display.js +25 -0
  8. package/dist/commands/add/display.js.map +1 -0
  9. package/dist/commands/add/helpers.d.ts +11 -0
  10. package/dist/commands/add/helpers.d.ts.map +1 -0
  11. package/dist/commands/add/helpers.js +59 -0
  12. package/dist/commands/add/helpers.js.map +1 -0
  13. package/dist/commands/add/index.d.ts +12 -0
  14. package/dist/commands/add/index.d.ts.map +1 -0
  15. package/dist/commands/add/index.js +57 -0
  16. package/dist/commands/add/index.js.map +1 -0
  17. package/dist/commands/add/types.d.ts +32 -0
  18. package/dist/commands/add/types.d.ts.map +1 -0
  19. package/dist/commands/add/types.js +6 -0
  20. package/dist/commands/add/types.js.map +1 -0
  21. package/dist/commands/add.d.ts +5 -0
  22. package/dist/commands/add.d.ts.map +1 -1
  23. package/dist/commands/add.js +21 -21
  24. package/dist/commands/add.js.map +1 -1
  25. package/dist/commands/clean/display.d.ts +30 -0
  26. package/dist/commands/clean/display.d.ts.map +1 -0
  27. package/dist/commands/clean/display.js +67 -0
  28. package/dist/commands/clean/display.js.map +1 -0
  29. package/dist/commands/clean/handlers/clean-all.d.ts +12 -0
  30. package/dist/commands/clean/handlers/clean-all.d.ts.map +1 -0
  31. package/dist/commands/clean/handlers/clean-all.js +43 -0
  32. package/dist/commands/clean/handlers/clean-all.js.map +1 -0
  33. package/dist/commands/clean/handlers/clean-single.d.ts +13 -0
  34. package/dist/commands/clean/handlers/clean-single.d.ts.map +1 -0
  35. package/dist/commands/clean/handlers/clean-single.js +78 -0
  36. package/dist/commands/clean/handlers/clean-single.js.map +1 -0
  37. package/dist/commands/clean/handlers/index.d.ts +6 -0
  38. package/dist/commands/clean/handlers/index.d.ts.map +1 -0
  39. package/dist/commands/clean/handlers/index.js +11 -0
  40. package/dist/commands/clean/handlers/index.js.map +1 -0
  41. package/dist/commands/clean/helpers.d.ts +25 -0
  42. package/dist/commands/clean/helpers.d.ts.map +1 -0
  43. package/dist/commands/clean/helpers.js +70 -0
  44. package/dist/commands/clean/helpers.js.map +1 -0
  45. package/dist/commands/clean/index.d.ts +12 -0
  46. package/dist/commands/clean/index.d.ts.map +1 -0
  47. package/dist/commands/clean/index.js +90 -0
  48. package/dist/commands/clean/index.js.map +1 -0
  49. package/dist/commands/clean/types.d.ts +21 -0
  50. package/dist/commands/clean/types.d.ts.map +1 -0
  51. package/dist/commands/clean/types.js +6 -0
  52. package/dist/commands/clean/types.js.map +1 -0
  53. package/dist/commands/clean.d.ts +5 -0
  54. package/dist/commands/clean.d.ts.map +1 -1
  55. package/dist/commands/clean.js +18 -35
  56. package/dist/commands/clean.js.map +1 -1
  57. package/dist/commands/config/display.d.ts +36 -0
  58. package/dist/commands/config/display.d.ts.map +1 -0
  59. package/dist/commands/config/display.js +86 -0
  60. package/dist/commands/config/display.js.map +1 -0
  61. package/dist/commands/config/handlers/index.d.ts +8 -0
  62. package/dist/commands/config/handlers/index.d.ts.map +1 -0
  63. package/dist/commands/config/handlers/index.js +15 -0
  64. package/dist/commands/config/handlers/index.js.map +1 -0
  65. package/dist/commands/config/handlers/set-value.d.ts +11 -0
  66. package/dist/commands/config/handlers/set-value.d.ts.map +1 -0
  67. package/dist/commands/config/handlers/set-value.js +36 -0
  68. package/dist/commands/config/handlers/set-value.js.map +1 -0
  69. package/dist/commands/config/handlers/show-all.d.ts +11 -0
  70. package/dist/commands/config/handlers/show-all.d.ts.map +1 -0
  71. package/dist/commands/config/handlers/show-all.js +24 -0
  72. package/dist/commands/config/handlers/show-all.js.map +1 -0
  73. package/dist/commands/config/handlers/show-path.d.ts +11 -0
  74. package/dist/commands/config/handlers/show-path.d.ts.map +1 -0
  75. package/dist/commands/config/handlers/show-path.js +20 -0
  76. package/dist/commands/config/handlers/show-path.js.map +1 -0
  77. package/dist/commands/config/handlers/show-value.d.ts +11 -0
  78. package/dist/commands/config/handlers/show-value.d.ts.map +1 -0
  79. package/dist/commands/config/handlers/show-value.js +31 -0
  80. package/dist/commands/config/handlers/show-value.js.map +1 -0
  81. package/dist/commands/config/helpers.d.ts +23 -0
  82. package/dist/commands/config/helpers.d.ts.map +1 -0
  83. package/dist/commands/config/helpers.js +53 -0
  84. package/dist/commands/config/helpers.js.map +1 -0
  85. package/dist/commands/config/index.d.ts +12 -0
  86. package/dist/commands/config/index.d.ts.map +1 -0
  87. package/dist/commands/config/index.js +56 -0
  88. package/dist/commands/config/index.js.map +1 -0
  89. package/dist/commands/config/types.d.ts +31 -0
  90. package/dist/commands/config/types.d.ts.map +1 -0
  91. package/dist/commands/config/types.js +13 -0
  92. package/dist/commands/config/types.js.map +1 -0
  93. package/dist/commands/config.d.ts +5 -0
  94. package/dist/commands/config.d.ts.map +1 -1
  95. package/dist/commands/config.js +22 -41
  96. package/dist/commands/config.js.map +1 -1
  97. package/dist/commands/index.d.ts +27 -0
  98. package/dist/commands/index.d.ts.map +1 -0
  99. package/dist/commands/index.js +52 -0
  100. package/dist/commands/index.js.map +1 -0
  101. package/dist/commands/list/display.d.ts +39 -0
  102. package/dist/commands/list/display.d.ts.map +1 -0
  103. package/dist/commands/list/display.js +144 -0
  104. package/dist/commands/list/display.js.map +1 -0
  105. package/dist/commands/list/index.d.ts +12 -0
  106. package/dist/commands/list/index.d.ts.map +1 -0
  107. package/dist/commands/list/index.js +128 -0
  108. package/dist/commands/list/index.js.map +1 -0
  109. package/dist/commands/list/types.d.ts +32 -0
  110. package/dist/commands/list/types.d.ts.map +1 -0
  111. package/dist/commands/list/types.js +6 -0
  112. package/dist/commands/list/types.js.map +1 -0
  113. package/dist/commands/list.d.ts +5 -0
  114. package/dist/commands/list.d.ts.map +1 -1
  115. package/dist/commands/list.js +29 -60
  116. package/dist/commands/list.js.map +1 -1
  117. package/dist/commands/load/display.d.ts +28 -0
  118. package/dist/commands/load/display.d.ts.map +1 -0
  119. package/dist/commands/load/display.js +53 -0
  120. package/dist/commands/load/display.js.map +1 -0
  121. package/dist/commands/load/handlers/copy-repo.d.ts +13 -0
  122. package/dist/commands/load/handlers/copy-repo.d.ts.map +1 -0
  123. package/dist/commands/load/handlers/copy-repo.js +82 -0
  124. package/dist/commands/load/handlers/copy-repo.js.map +1 -0
  125. package/dist/commands/load/handlers/index.d.ts +6 -0
  126. package/dist/commands/load/handlers/index.d.ts.map +1 -0
  127. package/dist/commands/load/handlers/index.js +11 -0
  128. package/dist/commands/load/handlers/index.js.map +1 -0
  129. package/dist/commands/load/handlers/url-add.d.ts +13 -0
  130. package/dist/commands/load/handlers/url-add.d.ts.map +1 -0
  131. package/dist/commands/load/handlers/url-add.js +50 -0
  132. package/dist/commands/load/handlers/url-add.js.map +1 -0
  133. package/dist/commands/load/helpers.d.ts +81 -0
  134. package/dist/commands/load/helpers.d.ts.map +1 -0
  135. package/dist/commands/load/helpers.js +199 -0
  136. package/dist/commands/load/helpers.js.map +1 -0
  137. package/dist/commands/load/index.d.ts +13 -0
  138. package/dist/commands/load/index.d.ts.map +1 -0
  139. package/dist/commands/load/index.js +46 -0
  140. package/dist/commands/load/index.js.map +1 -0
  141. package/dist/commands/load/types.d.ts +37 -0
  142. package/dist/commands/load/types.d.ts.map +1 -0
  143. package/dist/commands/load/types.js +6 -0
  144. package/dist/commands/load/types.js.map +1 -0
  145. package/dist/commands/load.d.ts +5 -0
  146. package/dist/commands/load.d.ts.map +1 -1
  147. package/dist/commands/load.js +27 -64
  148. package/dist/commands/load.js.map +1 -1
  149. package/dist/commands/options/all.d.ts +11 -0
  150. package/dist/commands/options/all.d.ts.map +1 -0
  151. package/dist/commands/options/all.js +14 -0
  152. package/dist/commands/options/all.js.map +1 -0
  153. package/dist/commands/options/branch.d.ts +11 -0
  154. package/dist/commands/options/branch.d.ts.map +1 -0
  155. package/dist/commands/options/branch.js +14 -0
  156. package/dist/commands/options/branch.js.map +1 -0
  157. package/dist/commands/options/check.d.ts +11 -0
  158. package/dist/commands/options/check.d.ts.map +1 -0
  159. package/dist/commands/options/check.js +14 -0
  160. package/dist/commands/options/check.js.map +1 -0
  161. package/dist/commands/options/clean-empty.d.ts +11 -0
  162. package/dist/commands/options/clean-empty.d.ts.map +1 -0
  163. package/dist/commands/options/clean-empty.js +14 -0
  164. package/dist/commands/options/clean-empty.js.map +1 -0
  165. package/dist/commands/options/depth.d.ts +11 -0
  166. package/dist/commands/options/depth.d.ts.map +1 -0
  167. package/dist/commands/options/depth.js +14 -0
  168. package/dist/commands/options/depth.js.map +1 -0
  169. package/dist/commands/options/dry-run.d.ts +11 -0
  170. package/dist/commands/options/dry-run.d.ts.map +1 -0
  171. package/dist/commands/options/dry-run.js +14 -0
  172. package/dist/commands/options/dry-run.js.map +1 -0
  173. package/dist/commands/options/force.d.ts +11 -0
  174. package/dist/commands/options/force.d.ts.map +1 -0
  175. package/dist/commands/options/force.js +14 -0
  176. package/dist/commands/options/force.js.map +1 -0
  177. package/dist/commands/options/index.d.ts +24 -0
  178. package/dist/commands/options/index.d.ts.map +1 -0
  179. package/dist/commands/options/index.js +53 -0
  180. package/dist/commands/options/index.js.map +1 -0
  181. package/dist/commands/options/json.d.ts +11 -0
  182. package/dist/commands/options/json.d.ts.map +1 -0
  183. package/dist/commands/options/json.js +14 -0
  184. package/dist/commands/options/json.js.map +1 -0
  185. package/dist/commands/options/keep-empty.d.ts +11 -0
  186. package/dist/commands/options/keep-empty.d.ts.map +1 -0
  187. package/dist/commands/options/keep-empty.js +14 -0
  188. package/dist/commands/options/keep-empty.js.map +1 -0
  189. package/dist/commands/options/list.d.ts +11 -0
  190. package/dist/commands/options/list.d.ts.map +1 -0
  191. package/dist/commands/options/list.js +14 -0
  192. package/dist/commands/options/list.js.map +1 -0
  193. package/dist/commands/options/name.d.ts +11 -0
  194. package/dist/commands/options/name.d.ts.map +1 -0
  195. package/dist/commands/options/name.js +14 -0
  196. package/dist/commands/options/name.js.map +1 -0
  197. package/dist/commands/options/no-ignore.d.ts +11 -0
  198. package/dist/commands/options/no-ignore.d.ts.map +1 -0
  199. package/dist/commands/options/no-ignore.js +14 -0
  200. package/dist/commands/options/no-ignore.js.map +1 -0
  201. package/dist/commands/options/path.d.ts +11 -0
  202. package/dist/commands/options/path.d.ts.map +1 -0
  203. package/dist/commands/options/path.js +14 -0
  204. package/dist/commands/options/path.js.map +1 -0
  205. package/dist/commands/options/shallow.d.ts +16 -0
  206. package/dist/commands/options/shallow.d.ts.map +1 -0
  207. package/dist/commands/options/shallow.js +19 -0
  208. package/dist/commands/options/shallow.js.map +1 -0
  209. package/dist/commands/options/status.d.ts +11 -0
  210. package/dist/commands/options/status.d.ts.map +1 -0
  211. package/dist/commands/options/status.js +14 -0
  212. package/dist/commands/options/status.js.map +1 -0
  213. package/dist/commands/options/subdir.d.ts +11 -0
  214. package/dist/commands/options/subdir.d.ts.map +1 -0
  215. package/dist/commands/options/subdir.js +14 -0
  216. package/dist/commands/options/subdir.js.map +1 -0
  217. package/dist/commands/options/sync-only.d.ts +11 -0
  218. package/dist/commands/options/sync-only.d.ts.map +1 -0
  219. package/dist/commands/options/sync-only.js +14 -0
  220. package/dist/commands/options/sync-only.js.map +1 -0
  221. package/dist/commands/options/sync.d.ts +11 -0
  222. package/dist/commands/options/sync.d.ts.map +1 -0
  223. package/dist/commands/options/sync.js +14 -0
  224. package/dist/commands/options/sync.js.map +1 -0
  225. package/dist/commands/options/verbose.d.ts +11 -0
  226. package/dist/commands/options/verbose.d.ts.map +1 -0
  227. package/dist/commands/options/verbose.js +14 -0
  228. package/dist/commands/options/verbose.js.map +1 -0
  229. package/dist/commands/unload/display.d.ts +29 -0
  230. package/dist/commands/unload/display.d.ts.map +1 -0
  231. package/dist/commands/unload/display.js +125 -0
  232. package/dist/commands/unload/display.js.map +1 -0
  233. package/dist/commands/unload/handlers/clean-empty.d.ts +11 -0
  234. package/dist/commands/unload/handlers/clean-empty.d.ts.map +1 -0
  235. package/dist/commands/unload/handlers/clean-empty.js +111 -0
  236. package/dist/commands/unload/handlers/clean-empty.js.map +1 -0
  237. package/dist/commands/unload/handlers/index.d.ts +8 -0
  238. package/dist/commands/unload/handlers/index.d.ts.map +1 -0
  239. package/dist/commands/unload/handlers/index.js +15 -0
  240. package/dist/commands/unload/handlers/index.js.map +1 -0
  241. package/dist/commands/unload/handlers/list.d.ts +11 -0
  242. package/dist/commands/unload/handlers/list.d.ts.map +1 -0
  243. package/dist/commands/unload/handlers/list.js +42 -0
  244. package/dist/commands/unload/handlers/list.js.map +1 -0
  245. package/dist/commands/unload/handlers/remove-all.d.ts +11 -0
  246. package/dist/commands/unload/handlers/remove-all.d.ts.map +1 -0
  247. package/dist/commands/unload/handlers/remove-all.js +184 -0
  248. package/dist/commands/unload/handlers/remove-all.js.map +1 -0
  249. package/dist/commands/unload/handlers/remove-single.d.ts +12 -0
  250. package/dist/commands/unload/handlers/remove-single.d.ts.map +1 -0
  251. package/dist/commands/unload/handlers/remove-single.js +217 -0
  252. package/dist/commands/unload/handlers/remove-single.js.map +1 -0
  253. package/dist/commands/unload/helpers.d.ts +55 -0
  254. package/dist/commands/unload/helpers.d.ts.map +1 -0
  255. package/dist/commands/unload/helpers.js +256 -0
  256. package/dist/commands/unload/helpers.js.map +1 -0
  257. package/dist/commands/unload/index.d.ts +12 -0
  258. package/dist/commands/unload/index.d.ts.map +1 -0
  259. package/dist/commands/unload/index.js +121 -0
  260. package/dist/commands/unload/index.js.map +1 -0
  261. package/dist/commands/unload/types.d.ts +53 -0
  262. package/dist/commands/unload/types.d.ts.map +1 -0
  263. package/dist/commands/unload/types.js +6 -0
  264. package/dist/commands/unload/types.js.map +1 -0
  265. package/dist/commands/unload.d.ts +6 -1
  266. package/dist/commands/unload.d.ts.map +1 -1
  267. package/dist/commands/unload.js +165 -169
  268. package/dist/commands/unload.js.map +1 -1
  269. package/dist/commands/update/display.d.ts +30 -0
  270. package/dist/commands/update/display.d.ts.map +1 -0
  271. package/dist/commands/update/display.js +161 -0
  272. package/dist/commands/update/display.js.map +1 -0
  273. package/dist/commands/update/handlers/index.d.ts +8 -0
  274. package/dist/commands/update/handlers/index.d.ts.map +1 -0
  275. package/dist/commands/update/handlers/index.js +15 -0
  276. package/dist/commands/update/handlers/index.js.map +1 -0
  277. package/dist/commands/update/handlers/status.d.ts +11 -0
  278. package/dist/commands/update/handlers/status.d.ts.map +1 -0
  279. package/dist/commands/update/handlers/status.js +20 -0
  280. package/dist/commands/update/handlers/status.js.map +1 -0
  281. package/dist/commands/update/handlers/sync-only.d.ts +11 -0
  282. package/dist/commands/update/handlers/sync-only.d.ts.map +1 -0
  283. package/dist/commands/update/handlers/sync-only.js +41 -0
  284. package/dist/commands/update/handlers/sync-only.js.map +1 -0
  285. package/dist/commands/update/handlers/update-all.d.ts +10 -0
  286. package/dist/commands/update/handlers/update-all.d.ts.map +1 -0
  287. package/dist/commands/update/handlers/update-all.js +125 -0
  288. package/dist/commands/update/handlers/update-all.js.map +1 -0
  289. package/dist/commands/update/handlers/update-single.d.ts +11 -0
  290. package/dist/commands/update/handlers/update-single.d.ts.map +1 -0
  291. package/dist/commands/update/handlers/update-single.js +154 -0
  292. package/dist/commands/update/handlers/update-single.js.map +1 -0
  293. package/dist/commands/update/helpers.d.ts +13 -0
  294. package/dist/commands/update/helpers.d.ts.map +1 -0
  295. package/dist/commands/update/helpers.js +86 -0
  296. package/dist/commands/update/helpers.js.map +1 -0
  297. package/dist/commands/update/index.d.ts +12 -0
  298. package/dist/commands/update/index.d.ts.map +1 -0
  299. package/dist/commands/update/index.js +67 -0
  300. package/dist/commands/update/index.js.map +1 -0
  301. package/dist/commands/update/types.d.ts +55 -0
  302. package/dist/commands/update/types.d.ts.map +1 -0
  303. package/dist/commands/update/types.js +6 -0
  304. package/dist/commands/update/types.js.map +1 -0
  305. package/dist/commands/update.d.ts +6 -1
  306. package/dist/commands/update.d.ts.map +1 -1
  307. package/dist/commands/update.js +73 -80
  308. package/dist/commands/update.js.map +1 -1
  309. package/dist/core/config-manager.d.ts +83 -0
  310. package/dist/core/config-manager.d.ts.map +1 -0
  311. package/dist/core/config-manager.js +170 -0
  312. package/dist/core/config-manager.js.map +1 -0
  313. package/dist/core/config.d.ts +22 -2
  314. package/dist/core/config.d.ts.map +1 -1
  315. package/dist/core/config.js +71 -35
  316. package/dist/core/config.js.map +1 -1
  317. package/dist/core/filesystem.js +1 -1
  318. package/dist/core/filesystem.js.map +1 -1
  319. package/dist/core/loading-state.d.ts +141 -0
  320. package/dist/core/loading-state.d.ts.map +1 -0
  321. package/dist/core/loading-state.js +237 -0
  322. package/dist/core/loading-state.js.map +1 -0
  323. package/dist/core/loading.d.ts +24 -27
  324. package/dist/core/loading.d.ts.map +1 -1
  325. package/dist/core/loading.js +127 -88
  326. package/dist/core/loading.js.map +1 -1
  327. package/dist/core/migration.d.ts +54 -0
  328. package/dist/core/migration.d.ts.map +1 -0
  329. package/dist/core/migration.js +277 -0
  330. package/dist/core/migration.js.map +1 -0
  331. package/dist/core/paths.d.ts +58 -0
  332. package/dist/core/paths.d.ts.map +1 -0
  333. package/dist/core/paths.js +103 -0
  334. package/dist/core/paths.js.map +1 -0
  335. package/dist/core/repos-index.d.ts +113 -0
  336. package/dist/core/repos-index.d.ts.map +1 -0
  337. package/dist/core/repos-index.js +206 -0
  338. package/dist/core/repos-index.js.map +1 -0
  339. package/dist/core/repository.js +2 -2
  340. package/dist/core/repository.js.map +1 -1
  341. package/dist/core/sync.d.ts.map +1 -1
  342. package/dist/core/sync.js +3 -3
  343. package/dist/core/sync.js.map +1 -1
  344. package/dist/types/index.d.ts +2 -0
  345. package/dist/types/index.d.ts.map +1 -1
  346. package/dist/ui/format.d.ts +159 -0
  347. package/dist/ui/format.d.ts.map +1 -0
  348. package/dist/ui/format.js +300 -0
  349. package/dist/ui/format.js.map +1 -0
  350. package/dist/ui/index.d.ts +9 -0
  351. package/dist/ui/index.d.ts.map +1 -0
  352. package/dist/ui/index.js +53 -0
  353. package/dist/ui/index.js.map +1 -0
  354. package/dist/ui/prompt.d.ts +94 -0
  355. package/dist/ui/prompt.d.ts.map +1 -0
  356. package/dist/ui/prompt.js +223 -0
  357. package/dist/ui/prompt.js.map +1 -0
  358. package/dist/ui/spinner.d.ts +99 -0
  359. package/dist/ui/spinner.d.ts.map +1 -0
  360. package/dist/ui/spinner.js +136 -0
  361. package/dist/ui/spinner.js.map +1 -0
  362. package/dist/ui/table.d.ts +142 -0
  363. package/dist/ui/table.d.ts.map +1 -0
  364. package/dist/ui/table.js +213 -0
  365. package/dist/ui/table.js.map +1 -0
  366. package/dist/utils/constants.d.ts +152 -0
  367. package/dist/utils/constants.d.ts.map +1 -0
  368. package/dist/utils/constants.js +160 -0
  369. package/dist/utils/constants.js.map +1 -0
  370. package/dist/utils/error.d.ts +109 -0
  371. package/dist/utils/error.d.ts.map +1 -0
  372. package/dist/utils/error.js +212 -0
  373. package/dist/utils/error.js.map +1 -0
  374. package/dist/utils/index.d.ts +8 -0
  375. package/dist/utils/index.d.ts.map +1 -0
  376. package/dist/utils/index.js +44 -0
  377. package/dist/utils/index.js.map +1 -0
  378. package/dist/utils/validation.d.ts +122 -0
  379. package/dist/utils/validation.d.ts.map +1 -0
  380. package/dist/utils/validation.js +248 -0
  381. package/dist/utils/validation.js.map +1 -0
  382. package/package.json +23 -3
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
3
  * unload 命令
4
- * 移除当前项目中已加载的参考代码(use 命令的逆操作)
4
+ * 从当前项目中移除已加载的参考代码(use 命令的逆操作)
5
5
  */
6
6
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
7
  if (k2 === undefined) k2 = k;
@@ -41,67 +41,40 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
41
41
  };
42
42
  Object.defineProperty(exports, "__esModule", { value: true });
43
43
  exports.unloadCommand = void 0;
44
+ exports.registerUnloadCommand = registerUnloadCommand;
44
45
  const commander_1 = require("commander");
45
46
  const chalk_1 = __importDefault(require("chalk"));
46
- const ora_1 = __importDefault(require("ora"));
47
47
  const path_1 = __importDefault(require("path"));
48
- const readline = __importStar(require("readline"));
49
48
  const prompts_1 = require("@inquirer/prompts");
50
49
  const filesystem = __importStar(require("../core/filesystem.js"));
51
50
  const loading = __importStar(require("../core/loading.js"));
52
- const index_js_1 = require("../types/index.js");
53
- /** .gitreference 目录名 */
54
- const GITREFERENCE_DIR = ".gitreference";
51
+ const spinner_js_1 = require("../ui/spinner.js");
52
+ const prompt_js_1 = require("../ui/prompt.js");
53
+ const table_js_1 = require("../ui/table.js");
54
+ const error_js_1 = require("../utils/error.js");
55
+ const constants_js_1 = require("../utils/constants.js");
56
+ const index_js_1 = require("./options/index.js");
55
57
  /**
56
- * loading.json 获取所有已加载仓库的目标路径
57
- * @param projectRoot 项目根目录
58
- * @returns 由 gitreference 管理的路径列表
58
+ * 注册 unload 命令
59
+ * @param program Commander 程序实例
59
60
  */
60
- async function getGitreferenceManagedPaths(projectRoot) {
61
- const entries = await loading.getEntries(projectRoot);
62
- return entries.map((entry) => entry.targetPath);
63
- }
64
- /**
65
- * 填充字符串到指定宽度
66
- * @param str 原始字符串
67
- * @param width 目标宽度
68
- * @returns 填充后的字符串
69
- */
70
- function padEnd(str, width) {
71
- if (str.length >= width)
72
- return str;
73
- return str + " ".repeat(width - str.length);
74
- }
75
- /**
76
- * 确认提示
77
- * @param message 提示消息
78
- * @returns 用户是否确认
79
- */
80
- async function confirm(message) {
81
- const rl = readline.createInterface({
82
- input: process.stdin,
83
- output: process.stdout,
84
- });
85
- return new Promise((resolve) => {
86
- rl.question(`${message} (y/N) `, (answer) => {
87
- rl.close();
88
- resolve(answer.toLowerCase() === "y" || answer.toLowerCase() === "yes");
89
- });
90
- });
61
+ function registerUnloadCommand(program) {
62
+ program.addCommand(exports.unloadCommand);
91
63
  }
64
+ /** .gitreference 目录名(使用共享常量) */
65
+ const GITREFERENCE_DIR = constants_js_1.DIR_NAMES.GITREFERENCE;
92
66
  /**
93
67
  * 从 loading.json 获取所有已加载的仓库条目
94
- * @param projectRoot 项目根目录
95
68
  * @returns 加载条目列表
96
69
  */
97
- async function getLoadedEntries(projectRoot) {
98
- return await loading.getEntries(projectRoot);
70
+ async function getLoadedEntries() {
71
+ return await loading.getEntries();
99
72
  }
100
73
  /**
101
- * 递归扫描 .gitreference 目录,获取空目录列表
74
+ * 递归扫描 .gitreference 目录以获取空目录列表
102
75
  * @param baseDir .gitreference 目录的绝对路径
103
- * @param currentPath 当前扫描的相对路径
104
- * @param loadedPaths 已加载的路径列表(用于排除)
76
+ * @param currentPath 当前正在扫描的相对路径
77
+ * @param loadedPaths 已加载路径列表(用于排除)
105
78
  * @returns 空目录列表
106
79
  */
107
80
  async function scanEmptyDirs(baseDir, currentPath = "", loadedPaths = new Set()) {
@@ -160,7 +133,7 @@ function matchEntries(entries, name) {
160
133
  return entries.filter((entry) => {
161
134
  const repoName = entry.repoName.replace(/\\/g, "/");
162
135
  const targetPath = entry.targetPath.replace(/\\/g, "/");
163
- // 完整仓库名匹配: github.com/facebook/react
136
+ // 完整仓库名称匹配: github.com/facebook/react
164
137
  if (repoName === normalizedName) {
165
138
  return true;
166
139
  }
@@ -168,7 +141,7 @@ function matchEntries(entries, name) {
168
141
  if (targetPath === normalizedName) {
169
142
  return true;
170
143
  }
171
- // 仓库短名匹配: react -> 匹配所有名为 react 的仓库
144
+ // 短仓库名称匹配: react -> 匹配所有名为 react 的仓库
172
145
  const shortName = path_1.default.basename(repoName);
173
146
  if (shortName === normalizedName) {
174
147
  return true;
@@ -187,7 +160,7 @@ function matchEntries(entries, name) {
187
160
  /**
188
161
  * 递归删除空的父目录
189
162
  * @param dirPath 起始目录路径
190
- * @param stopAt 停止删除的目录(不会删除此目录)
163
+ * @param stopAt 停止的目录(不会删除此目录)
191
164
  * @param verbose 是否输出详细信息
192
165
  */
193
166
  async function removeEmptyParents(dirPath, stopAt, verbose = false) {
@@ -197,7 +170,7 @@ async function removeEmptyParents(dirPath, stopAt, verbose = false) {
197
170
  const entries = await filesystem.readDir(currentDir);
198
171
  if (entries.length === 0) {
199
172
  if (verbose) {
200
- console.log(chalk_1.default.gray(` 清理空目录: ${path_1.default.relative(stopAt, currentDir)}`));
173
+ console.log(chalk_1.default.gray(` Cleaning empty directory: ${path_1.default.relative(stopAt, currentDir)}`));
201
174
  }
202
175
  await filesystem.removeDir(currentDir);
203
176
  currentDir = path_1.default.dirname(currentDir);
@@ -233,7 +206,7 @@ async function cleanEmptyDirectories(gitrefDir, emptyDirs, verbose = false) {
233
206
  const entries = await filesystem.readDir(dir.absolutePath);
234
207
  if (entries.length === 0) {
235
208
  if (verbose) {
236
- console.log(chalk_1.default.gray(` 删除空目录: ${dir.fullPath.replace(/\\/g, "/")}`));
209
+ console.log(chalk_1.default.gray(` Removing empty directory: ${dir.fullPath.replace(/\\/g, "/")}`));
237
210
  }
238
211
  await filesystem.removeDir(dir.absolutePath);
239
212
  cleanedCount++;
@@ -249,24 +222,24 @@ async function cleanEmptyDirectories(gitrefDir, emptyDirs, verbose = false) {
249
222
  return cleanedCount;
250
223
  }
251
224
  /**
252
- * 交互式选择仓库条目
225
+ * 交互式仓库条目选择
253
226
  * @param matches 匹配的条目列表
254
227
  * @param name 用户输入的名称
255
228
  * @returns 用户选择的条目,如果取消则返回 null
256
229
  */
257
230
  async function selectEntry(matches, name) {
258
- console.log(chalk_1.default.yellow(`找到 ${matches.length} 个匹配 '${name}' 的参考代码:`));
231
+ console.log(chalk_1.default.yellow(`Found ${matches.length} reference code matching '${name}':`));
259
232
  console.log();
260
233
  try {
261
234
  const selected = await (0, prompts_1.select)({
262
- message: "请选择要删除的参考代码:",
235
+ message: "Select reference code to remove:",
263
236
  choices: [
264
237
  ...matches.map((match) => ({
265
238
  name: `${match.repoName} -> ${match.targetPath}`,
266
239
  value: match,
267
240
  })),
268
241
  {
269
- name: chalk_1.default.gray("取消"),
242
+ name: chalk_1.default.gray("Cancel"),
270
243
  value: null,
271
244
  },
272
245
  ],
@@ -279,20 +252,20 @@ async function selectEntry(matches, name) {
279
252
  }
280
253
  }
281
254
  /**
282
- * 详细模式下删除目录
255
+ * 在详细模式下删除目录
283
256
  * @param dirPath 要删除的目录路径
284
- * @param displayPath 显示用的路径
257
+ * @param displayPath 用于显示的路径
285
258
  * @param verbose 是否输出详细信息
286
259
  */
287
260
  async function removeDirVerbose(dirPath, displayPath, verbose) {
288
261
  if (verbose) {
289
- console.log(chalk_1.default.gray(` 删除目录: ${displayPath}`));
262
+ console.log(chalk_1.default.gray(` Removing directory: ${displayPath}`));
290
263
  }
291
264
  await filesystem.removeDir(dirPath);
292
265
  }
293
266
  /**
294
- * 清理 .gitignore 中的参考代码路径条目
295
- * @param targetPath 被删除的目标路径(相对于工作目录)
267
+ * .gitignore 中清理参考代码路径条目
268
+ * @param targetPath 已删除的目标路径(相对于工作目录)
296
269
  * @param gitreferenceDirExists .gitreference 目录是否仍然存在
297
270
  * @param verbose 是否输出详细信息
298
271
  */
@@ -301,11 +274,11 @@ async function cleanupGitignore(targetPath, gitreferenceDirExists, verbose = fal
301
274
  // 如果删除的是 .gitreference 目录下的内容
302
275
  if (targetPath.startsWith(".gitreference") ||
303
276
  targetPath.startsWith(GITREFERENCE_DIR)) {
304
- // 只有当 .gitreference 目录不存在或为空时,才移除 .gitignore 中的 .gitreference/ 条目
277
+ // 只有当目录不存在或为空时才从 .gitignore 中移除 .gitreference/ 条目
305
278
  if (!gitreferenceDirExists) {
306
279
  const removed = await filesystem.removeFromGitignore(cwd, ".gitreference/");
307
280
  if (removed && verbose) {
308
- console.log(chalk_1.default.gray(" 已从 .gitignore 中移除 .gitreference/"));
281
+ console.log(chalk_1.default.gray(" Removed .gitreference/ from .gitignore"));
309
282
  }
310
283
  }
311
284
  }
@@ -316,27 +289,27 @@ async function cleanupGitignore(targetPath, gitreferenceDirExists, verbose = fal
316
289
  : targetPath + "/";
317
290
  const removed = await filesystem.removeFromGitignore(cwd, gitignoreEntry);
318
291
  if (removed && verbose) {
319
- console.log(chalk_1.default.gray(` 已从 .gitignore 中移除 ${gitignoreEntry}`));
292
+ console.log(chalk_1.default.gray(` Removed ${gitignoreEntry} from .gitignore`));
320
293
  }
321
294
  }
322
295
  }
323
296
  exports.unloadCommand = new commander_1.Command("unload")
324
297
  .description("Remove reference code from current project")
325
298
  .argument("[name]", "Repository name to remove")
326
- .option("-a, --all", "Remove all reference code")
327
- .option("-f, --force", "Skip confirmation prompt")
328
- .option("--dry-run", "Show what would be deleted without actually deleting")
329
- .option("-l, --list", "List all loaded reference code")
330
- .option("--keep-empty", "Keep empty .gitreference/ directory after removal")
331
- .option("--clean-empty", "Clean empty directory structures in .gitreference/")
332
- .option("-v, --verbose", "Show detailed deletion progress")
299
+ .addOption(index_js_1.allOption)
300
+ .addOption(index_js_1.forceOption)
301
+ .addOption(index_js_1.dryRunOption)
302
+ .addOption(index_js_1.listOption)
303
+ .addOption(index_js_1.keepEmptyOption)
304
+ .addOption(index_js_1.cleanEmptyOption)
305
+ .addOption(index_js_1.verboseOption)
333
306
  .action(async (name, options) => {
334
307
  const startTime = Date.now();
335
308
  try {
336
309
  const cwd = process.cwd();
337
310
  const gitrefDir = path_1.default.join(cwd, GITREFERENCE_DIR);
338
311
  // 获取所有已加载的条目
339
- const loadedEntries = await getLoadedEntries(cwd);
312
+ const loadedEntries = await getLoadedEntries();
340
313
  // 检查 .gitreference 目录是否存在(用于空目录扫描)
341
314
  const gitrefDirExists = await filesystem.exists(gitrefDir);
342
315
  // 扫描空目录(仅当 .gitreference 目录存在时)
@@ -347,29 +320,29 @@ exports.unloadCommand = new commander_1.Command("unload")
347
320
  // 情况 0: --clean-empty 选项,清理空目录
348
321
  if (options.cleanEmpty) {
349
322
  if (emptyDirs.length === 0) {
350
- console.log(chalk_1.default.green("没有需要清理的空目录。"));
323
+ console.log(chalk_1.default.green("No empty directories to clean."));
351
324
  return;
352
325
  }
353
- console.log(`发现 ${chalk_1.default.bold(emptyDirs.length)} 个空目录:`);
326
+ console.log(`Found ${chalk_1.default.bold(emptyDirs.length)} empty directories:`);
354
327
  for (const dir of emptyDirs) {
355
328
  console.log(` - ${dir.fullPath.replace(/\\/g, "/")}`);
356
329
  }
357
330
  console.log();
358
331
  // dry-run 模式
359
332
  if (options.dryRun) {
360
- console.log(chalk_1.default.yellow("(试运行模式,未执行实际删除)"));
333
+ console.log(chalk_1.default.yellow("(Dry run mode, no actual deletion)"));
361
334
  return;
362
335
  }
363
336
  // 确认删除
364
337
  if (!options.force) {
365
- const confirmed = await confirm("确定要清理这些空目录吗?");
338
+ const confirmed = await (0, prompt_js_1.confirm)("Are you sure you want to clean these empty directories?");
366
339
  if (!confirmed) {
367
- console.log(chalk_1.default.yellow("操作已取消。"));
340
+ console.log(chalk_1.default.yellow("Operation cancelled."));
368
341
  return;
369
342
  }
370
343
  }
371
344
  // 执行清理
372
- const spinner = (0, ora_1.default)("正在清理空目录...").start();
345
+ const spinner = (0, spinner_js_1.startSpinner)("Cleaning empty directories...");
373
346
  try {
374
347
  const cleanedCount = await cleanEmptyDirectories(gitrefDir, emptyDirs, options.verbose);
375
348
  // 检查 .gitreference 目录是否为空
@@ -378,7 +351,7 @@ exports.unloadCommand = new commander_1.Command("unload")
378
351
  const remaining = await filesystem.readDir(gitrefDir);
379
352
  if (remaining.length === 0) {
380
353
  if (options.verbose) {
381
- console.log(chalk_1.default.gray(` 删除空的 .gitreference 目录`));
354
+ console.log(chalk_1.default.gray(` Removing empty .gitreference directory`));
382
355
  }
383
356
  await filesystem.removeDir(gitrefDir);
384
357
  }
@@ -388,13 +361,13 @@ exports.unloadCommand = new commander_1.Command("unload")
388
361
  }
389
362
  }
390
363
  const elapsed = Date.now() - startTime;
391
- spinner.succeed(chalk_1.default.green(`已清理 ${cleanedCount} 个空目录!`));
364
+ spinner.succeed(chalk_1.default.green(`Cleaned ${cleanedCount} empty directories!`));
392
365
  if (options.verbose) {
393
- console.log(chalk_1.default.gray(` 耗时: ${elapsed}ms`));
366
+ console.log(chalk_1.default.gray(` Time elapsed: ${elapsed}ms`));
394
367
  }
395
368
  }
396
369
  catch (error) {
397
- spinner.fail(chalk_1.default.red("清理失败"));
370
+ spinner.fail(chalk_1.default.red("Cleanup failed"));
398
371
  throw error;
399
372
  }
400
373
  return;
@@ -402,20 +375,20 @@ exports.unloadCommand = new commander_1.Command("unload")
402
375
  // 情况 1: --list 选项,列出所有已加载的参考代码
403
376
  if (options.list) {
404
377
  if (loadedEntries.length === 0 && emptyDirs.length === 0) {
405
- console.log(chalk_1.default.yellow("当前项目中没有已加载的参考代码。"));
378
+ console.log(chalk_1.default.yellow("No loaded reference code in current project."));
406
379
  return;
407
380
  }
408
381
  if (loadedEntries.length > 0) {
409
- console.log(chalk_1.default.bold(`📦 当前项目中已加载的参考代码 (${loadedEntries.length})`));
382
+ console.log(chalk_1.default.bold(`📦 Loaded reference code in current project (${loadedEntries.length})`));
410
383
  console.log();
411
384
  // 表头
412
385
  const COL_NAME = 35;
413
386
  const COL_PATH = 30;
414
387
  const COL_COMMIT = 10;
415
388
  console.log(chalk_1.default.gray(" " +
416
- padEnd("REPO", COL_NAME) +
417
- padEnd("PATH", COL_PATH) +
418
- padEnd("COMMIT", COL_COMMIT)));
389
+ (0, table_js_1.padEnd)("REPO", COL_NAME) +
390
+ (0, table_js_1.padEnd)("PATH", COL_PATH) +
391
+ (0, table_js_1.padEnd)("COMMIT", COL_COMMIT)));
419
392
  // 条目列表
420
393
  for (const entry of loadedEntries) {
421
394
  const repoName = entry.repoName.replace(/\\/g, "/");
@@ -424,51 +397,51 @@ exports.unloadCommand = new commander_1.Command("unload")
424
397
  ? entry.commitId.substring(0, 7)
425
398
  : "-";
426
399
  console.log(" " +
427
- padEnd(repoName, COL_NAME) +
428
- padEnd(targetPath, COL_PATH) +
429
- padEnd(commitShort, COL_COMMIT));
400
+ (0, table_js_1.padEnd)(repoName, COL_NAME) +
401
+ (0, table_js_1.padEnd)(targetPath, COL_PATH) +
402
+ (0, table_js_1.padEnd)(commitShort, COL_COMMIT));
430
403
  }
431
404
  console.log();
432
- // 详细模式下显示更多信息
405
+ // 在详细模式下显示更多信息
433
406
  if (options.verbose) {
434
- console.log(chalk_1.default.gray("详细信息:"));
407
+ console.log(chalk_1.default.gray("Details:"));
435
408
  for (const entry of loadedEntries) {
436
409
  console.log(chalk_1.default.gray(` - ${entry.repoName}`));
437
410
  console.log(chalk_1.default.gray(` ID: ${entry.id}`));
438
411
  console.log(chalk_1.default.gray(` URL: ${entry.repoUrl}`));
439
- console.log(chalk_1.default.gray(` 路径: ${entry.targetPath}`));
412
+ console.log(chalk_1.default.gray(` Path: ${entry.targetPath}`));
440
413
  console.log(chalk_1.default.gray(` Commit: ${entry.commitId}`));
441
414
  if (entry.branch) {
442
- console.log(chalk_1.default.gray(` 分支: ${entry.branch}`));
415
+ console.log(chalk_1.default.gray(` Branch: ${entry.branch}`));
443
416
  }
444
417
  if (entry.subdir) {
445
- console.log(chalk_1.default.gray(` 子目录: ${entry.subdir}`));
418
+ console.log(chalk_1.default.gray(` Subdir: ${entry.subdir}`));
446
419
  }
447
- console.log(chalk_1.default.gray(` 加载时间: ${entry.loadedAt}`));
420
+ console.log(chalk_1.default.gray(` Loaded at: ${entry.loadedAt}`));
448
421
  if (entry.updatedAt) {
449
- console.log(chalk_1.default.gray(` 更新时间: ${entry.updatedAt}`));
422
+ console.log(chalk_1.default.gray(` Updated at: ${entry.updatedAt}`));
450
423
  }
451
424
  }
452
425
  console.log();
453
426
  }
454
427
  }
455
428
  else {
456
- console.log(chalk_1.default.yellow("当前项目中没有已加载的参考代码。"));
429
+ console.log(chalk_1.default.yellow("No loaded reference code in current project."));
457
430
  console.log();
458
431
  }
459
432
  // 显示空目录提示
460
433
  if (emptyDirs.length > 0) {
461
- console.log(chalk_1.default.yellow(`⚠️ 发现 ${emptyDirs.length} 个空目录结构`));
434
+ console.log(chalk_1.default.yellow(`⚠️ Found ${emptyDirs.length} empty directory structures`));
462
435
  if (options.verbose) {
463
436
  for (const dir of emptyDirs) {
464
437
  console.log(chalk_1.default.gray(` - ${dir.fullPath.replace(/\\/g, "/")}`));
465
438
  }
466
439
  }
467
- console.log(chalk_1.default.gray(` 使用 'grf unload --clean-empty' 清理空目录`));
440
+ console.log(chalk_1.default.gray(` Use 'grf unload --clean-empty' to clean empty directories`));
468
441
  console.log();
469
442
  }
470
443
  if (loadedEntries.length > 0) {
471
- console.log(chalk_1.default.gray(`💡 使用 'grf unload <name>' 移除指定的参考代码`));
444
+ console.log(chalk_1.default.gray(`💡 Use 'grf unload <name>' to remove specific reference code`));
472
445
  }
473
446
  return;
474
447
  }
@@ -476,9 +449,9 @@ exports.unloadCommand = new commander_1.Command("unload")
476
449
  if (options.all) {
477
450
  // 如果没有已加载的条目
478
451
  if (loadedEntries.length === 0) {
479
- console.log(chalk_1.default.yellow("没有找到需要删除的参考代码。"));
452
+ console.log(chalk_1.default.yellow("No reference code found to delete."));
480
453
  console.log();
481
- console.log(chalk_1.default.gray("💡 提示: loading.json 中没有记录任何已加载的参考代码。"));
454
+ console.log(chalk_1.default.gray("💡 Hint: No loaded reference code recorded in loading.json."));
482
455
  return;
483
456
  }
484
457
  const pathsToDelete = [];
@@ -492,40 +465,64 @@ exports.unloadCommand = new commander_1.Command("unload")
492
465
  });
493
466
  }
494
467
  // 显示将要删除的内容
495
- console.log(`将要删除 ${chalk_1.default.bold(loadedEntries.length)} 个参考代码:`);
468
+ console.log(`Will delete ${chalk_1.default.bold(loadedEntries.length)} reference code:`);
496
469
  for (const pathInfo of pathsToDelete) {
497
- const status = pathInfo.exists ? "" : chalk_1.default.gray(" (路径不存在)");
470
+ const status = pathInfo.exists
471
+ ? ""
472
+ : chalk_1.default.gray(" (path does not exist)");
498
473
  console.log(` - ${pathInfo.entry.repoName} -> ${pathInfo.entry.targetPath}${status}`);
499
474
  }
500
475
  console.log();
501
476
  // dry-run 模式
502
477
  if (options.dryRun) {
503
- console.log(chalk_1.default.yellow("(试运行模式,未执行实际删除)"));
478
+ console.log(chalk_1.default.yellow("(Dry run mode, no actual deletion)"));
504
479
  return;
505
480
  }
506
481
  // 确认删除
507
482
  if (!options.force) {
508
- const confirmed = await confirm("确定要删除吗?");
483
+ const confirmed = await (0, prompt_js_1.confirm)("Are you sure you want to delete?");
509
484
  if (!confirmed) {
510
- console.log(chalk_1.default.yellow("操作已取消。"));
485
+ console.log(chalk_1.default.yellow("Operation cancelled."));
511
486
  return;
512
487
  }
513
488
  }
514
489
  // 执行删除
515
- const spinner = (0, ora_1.default)("正在删除参考代码...").start();
490
+ const spinner = (0, spinner_js_1.startSpinner)("Removing reference code...");
516
491
  try {
517
492
  let deletedCount = 0;
518
493
  for (const pathInfo of pathsToDelete) {
519
494
  if (options.verbose) {
520
495
  spinner.stop();
521
- console.log(chalk_1.default.gray(` 删除: ${pathInfo.entry.targetPath}`));
496
+ console.log(chalk_1.default.gray(` Removing: ${pathInfo.entry.targetPath}`));
522
497
  spinner.start();
523
498
  }
524
499
  // 删除实际文件/目录(如果存在)
525
500
  if (pathInfo.exists) {
526
501
  await filesystem.removeDir(pathInfo.absolutePath);
502
+ // 递归删除空的父目录
503
+ if (pathInfo.entry.targetPath.startsWith(".gitreference/") ||
504
+ pathInfo.entry.targetPath.startsWith(GITREFERENCE_DIR + "/")) {
505
+ // 在 .gitreference 下,清理到 gitrefDir 为止
506
+ if (options.verbose) {
507
+ spinner.stop();
508
+ }
509
+ await removeEmptyParents(pathInfo.absolutePath, gitrefDir, options.verbose);
510
+ if (options.verbose) {
511
+ spinner.start();
512
+ }
513
+ }
514
+ else {
515
+ // 自定义路径,清理到工作目录为止
516
+ if (options.verbose) {
517
+ spinner.stop();
518
+ }
519
+ await removeEmptyParents(pathInfo.absolutePath, cwd, options.verbose);
520
+ if (options.verbose) {
521
+ spinner.start();
522
+ }
523
+ }
527
524
  }
528
- // 清理 .gitignore 中对应的条目
525
+ // .gitignore 中清理对应条目
529
526
  const gitignoreEntry = pathInfo.entry.targetPath.endsWith("/")
530
527
  ? pathInfo.entry.targetPath
531
528
  : pathInfo.entry.targetPath + "/";
@@ -533,21 +530,21 @@ exports.unloadCommand = new commander_1.Command("unload")
533
530
  deletedCount++;
534
531
  }
535
532
  // 清空 loading.json
536
- await loading.clearAllEntries(cwd);
533
+ await loading.clearAllEntries();
537
534
  // 检查 .gitreference 目录是否为空
538
535
  if (!options.keepEmpty && gitrefDirExists) {
539
536
  try {
540
537
  const remaining = await filesystem.readDir(gitrefDir);
541
- // 只剩下 loading.json 或为空时删除整个目录
538
+ // 当只剩 loading.json 或为空时删除整个目录
542
539
  if (remaining.length === 0 ||
543
540
  (remaining.length === 1 && remaining[0] === "loading.json")) {
544
541
  if (options.verbose) {
545
542
  spinner.stop();
546
- console.log(chalk_1.default.gray(` 删除 .gitreference 目录`));
543
+ console.log(chalk_1.default.gray(` Removing .gitreference directory`));
547
544
  spinner.start();
548
545
  }
549
546
  await filesystem.removeDir(gitrefDir);
550
- // 移除 .gitignore 中的 .gitreference/ 条目
547
+ // .gitignore 中移除 .gitreference/ 条目
551
548
  await filesystem.removeFromGitignore(cwd, ".gitreference/");
552
549
  }
553
550
  }
@@ -556,44 +553,44 @@ exports.unloadCommand = new commander_1.Command("unload")
556
553
  }
557
554
  }
558
555
  const elapsed = Date.now() - startTime;
559
- spinner.succeed(chalk_1.default.green(`已删除 ${deletedCount} 个参考代码!`));
556
+ spinner.succeed(chalk_1.default.green(`Deleted ${deletedCount} reference code!`));
560
557
  if (options.verbose) {
561
- console.log(chalk_1.default.gray(` 耗时: ${elapsed}ms`));
558
+ console.log(chalk_1.default.gray(` Time elapsed: ${elapsed}ms`));
562
559
  }
563
560
  }
564
561
  catch (error) {
565
- spinner.fail(chalk_1.default.red("删除失败"));
562
+ spinner.fail(chalk_1.default.red("Deletion failed"));
566
563
  throw error;
567
564
  }
568
565
  return;
569
566
  }
570
- // 情况 3: 指定仓库名称,删除指定的参考代码
567
+ // 情况 3: 指定了仓库名称,删除特定参考代码
571
568
  if (name) {
572
569
  // 匹配条目
573
570
  const matches = matchEntries(loadedEntries, name);
574
571
  if (matches.length === 0) {
575
- console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} 未找到匹配的参考代码: ${name}`));
572
+ console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} No matching reference code found: ${name}`));
576
573
  console.log();
577
- console.log(`使用 '${chalk_1.default.cyan("grf unload --list")}' 查看所有已加载的参考代码。`);
574
+ console.log(`Use '${chalk_1.default.cyan("grf unload --list")}' to see all loaded reference code.`);
578
575
  process.exit(1);
579
576
  }
580
577
  let targetEntry;
581
578
  if (matches.length > 1) {
582
- // 如果使用了 --force 选项,仍然报错要求精确指定
579
+ // 如果使用了 --force 选项,仍然需要精确指定
583
580
  if (options.force) {
584
- console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} 找到多个匹配的参考代码:`));
581
+ console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} Found multiple matching reference code:`));
585
582
  console.log();
586
583
  for (const match of matches) {
587
584
  console.log(` - ${match.repoName} -> ${match.targetPath}`);
588
585
  }
589
586
  console.log();
590
- console.log(`请使用完整路径精确指定要删除的参考代码。`);
587
+ console.log(`Please use full path to specify exactly which reference code to delete.`);
591
588
  process.exit(1);
592
589
  }
593
590
  // 交互式选择
594
591
  const selected = await selectEntry(matches, name);
595
592
  if (!selected) {
596
- console.log(chalk_1.default.yellow("操作已取消。"));
593
+ console.log(chalk_1.default.yellow("Operation cancelled."));
597
594
  return;
598
595
  }
599
596
  targetEntry = selected;
@@ -607,46 +604,47 @@ exports.unloadCommand = new commander_1.Command("unload")
607
604
  const absolutePath = path_1.default.resolve(cwd, targetEntry.targetPath);
608
605
  const pathExists = await filesystem.exists(absolutePath);
609
606
  // 显示将要删除的内容
610
- console.log(`将要删除: ${chalk_1.default.cyan(displayName)}`);
611
- console.log(` 目标路径: ${chalk_1.default.gray(displayPath)}`);
607
+ console.log(`Will delete: ${chalk_1.default.cyan(displayName)}`);
608
+ console.log(` Target path: ${chalk_1.default.gray(displayPath)}`);
612
609
  if (!pathExists) {
613
- console.log(chalk_1.default.yellow(` (注意: 目标路径不存在,将仅从 loading.json 中移除记录)`));
610
+ console.log(chalk_1.default.yellow(` (Note: Target path does not exist, will only remove record from loading.json)`));
614
611
  }
615
612
  if (options.verbose) {
616
- console.log(` 绝对路径: ${chalk_1.default.gray(absolutePath)}`);
613
+ console.log(` Absolute path: ${chalk_1.default.gray(absolutePath)}`);
617
614
  console.log(` Commit: ${chalk_1.default.gray(targetEntry.commitId)}`);
618
615
  if (targetEntry.branch) {
619
- console.log(` 分支: ${chalk_1.default.gray(targetEntry.branch)}`);
616
+ console.log(` Branch: ${chalk_1.default.gray(targetEntry.branch)}`);
620
617
  }
621
618
  }
622
619
  console.log();
623
620
  // dry-run 模式
624
621
  if (options.dryRun) {
625
- console.log(chalk_1.default.yellow("(试运行模式,未执行实际删除)"));
622
+ console.log(chalk_1.default.yellow("(Dry run mode, no actual deletion)"));
626
623
  return;
627
624
  }
628
625
  // 确认删除
629
626
  if (!options.force) {
630
- const confirmed = await confirm(`确定要删除 '${displayName}' 吗?`);
627
+ const confirmed = await (0, prompt_js_1.confirm)(`Are you sure you want to delete '${displayName}'?`);
631
628
  if (!confirmed) {
632
- console.log(chalk_1.default.yellow("操作已取消。"));
629
+ console.log(chalk_1.default.yellow("Operation cancelled."));
633
630
  return;
634
631
  }
635
632
  }
636
633
  // 执行删除
637
- const spinner = (0, ora_1.default)("正在删除参考代码...").start();
634
+ const spinner = (0, spinner_js_1.startSpinner)("Removing reference code...");
638
635
  try {
639
636
  // 删除实际文件/目录(如果存在)
640
637
  if (pathExists) {
641
638
  if (options.verbose) {
642
639
  spinner.stop();
643
- console.log(chalk_1.default.gray(` 删除目录: ${displayPath}`));
640
+ console.log(chalk_1.default.gray(` Removing directory: ${displayPath}`));
644
641
  spinner.start();
645
642
  }
646
643
  await filesystem.removeDir(absolutePath);
647
- // 递归删除空的父目录(仅当在 .gitreference 目录下时)
644
+ // 递归删除空的父目录
648
645
  if (targetEntry.targetPath.startsWith(".gitreference/") ||
649
646
  targetEntry.targetPath.startsWith(GITREFERENCE_DIR + "/")) {
647
+ // 在 .gitreference 下,清理到 gitrefDir 为止
650
648
  if (options.verbose) {
651
649
  spinner.stop();
652
650
  }
@@ -655,36 +653,46 @@ exports.unloadCommand = new commander_1.Command("unload")
655
653
  spinner.start();
656
654
  }
657
655
  }
656
+ else {
657
+ // 自定义路径,清理到工作目录为止
658
+ if (options.verbose) {
659
+ spinner.stop();
660
+ }
661
+ await removeEmptyParents(absolutePath, cwd, options.verbose);
662
+ if (options.verbose) {
663
+ spinner.start();
664
+ }
665
+ }
658
666
  }
659
- // 从 loading.json 移除条目
660
- await loading.removeEntry(targetEntry.id, cwd);
661
- // 清理 .gitignore 中对应的条目
667
+ // 从 loading.json 中移除条目
668
+ await loading.removeEntry(targetEntry.id);
669
+ // .gitignore 中清理对应条目
662
670
  const gitignoreEntry = targetEntry.targetPath.endsWith("/")
663
671
  ? targetEntry.targetPath
664
672
  : targetEntry.targetPath + "/";
665
673
  const gitignoreRemoved = await filesystem.removeFromGitignore(cwd, gitignoreEntry);
666
674
  if (gitignoreRemoved && options.verbose) {
667
675
  spinner.stop();
668
- console.log(chalk_1.default.gray(` 已从 .gitignore 中移除 ${gitignoreEntry}`));
676
+ console.log(chalk_1.default.gray(` Removed ${gitignoreEntry} from .gitignore`));
669
677
  spinner.start();
670
678
  }
671
679
  // 检查 .gitreference 目录是否为空
672
680
  if (!options.keepEmpty && gitrefDirExists) {
673
681
  try {
674
682
  const remaining = await filesystem.readDir(gitrefDir);
675
- // 只剩下 loading.json 或为空时删除整个目录
683
+ // 当只剩 loading.json 或为空时删除整个目录
676
684
  if (remaining.length === 0 ||
677
685
  (remaining.length === 1 && remaining[0] === "loading.json")) {
678
686
  // 检查 loading.json 是否还有其他条目
679
- const remainingEntries = await loading.getEntries(cwd);
687
+ const remainingEntries = await loading.getEntries();
680
688
  if (remainingEntries.length === 0) {
681
689
  if (options.verbose) {
682
690
  spinner.stop();
683
- console.log(chalk_1.default.gray(` 删除空的 .gitreference 目录`));
691
+ console.log(chalk_1.default.gray(` Removing empty .gitreference directory`));
684
692
  spinner.start();
685
693
  }
686
694
  await filesystem.removeDir(gitrefDir);
687
- // 移除 .gitignore 中的 .gitreference/ 条目
695
+ // .gitignore 中移除 .gitreference/ 条目
688
696
  await filesystem.removeFromGitignore(cwd, ".gitreference/");
689
697
  }
690
698
  }
@@ -694,45 +702,33 @@ exports.unloadCommand = new commander_1.Command("unload")
694
702
  }
695
703
  }
696
704
  const elapsed = Date.now() - startTime;
697
- spinner.succeed(chalk_1.default.green("参考代码已移除!"));
705
+ spinner.succeed(chalk_1.default.green("Reference code removed!"));
698
706
  console.log();
699
- console.log(` ${chalk_1.default.gray("仓库:")} ${displayName}`);
700
- console.log(` ${chalk_1.default.gray("路径:")} ${displayPath}`);
707
+ console.log(` ${chalk_1.default.gray("Repository:")} ${displayName}`);
708
+ console.log(` ${chalk_1.default.gray("Path:")} ${displayPath}`);
701
709
  if (options.verbose) {
702
- console.log(chalk_1.default.gray(` 耗时: ${elapsed}ms`));
710
+ console.log(chalk_1.default.gray(` Time elapsed: ${elapsed}ms`));
703
711
  }
704
712
  }
705
713
  catch (error) {
706
- spinner.fail(chalk_1.default.red("删除失败"));
714
+ spinner.fail(chalk_1.default.red("Deletion failed"));
707
715
  throw error;
708
716
  }
709
717
  return;
710
718
  }
711
- // 情况 4: 没有指定名称也没有 --all 或 --list,显示使用说明
712
- console.log(chalk_1.default.yellow("未指定要移除的参考代码。"));
719
+ // 情况 4: 未指定名称、--all 或 --list,显示用法
720
+ console.log(chalk_1.default.yellow("No reference code specified to remove."));
713
721
  console.log();
714
- console.log("用法:");
715
- console.log(` ${chalk_1.default.cyan("grf unload <name>")} 移除指定的参考代码`);
716
- console.log(` ${chalk_1.default.cyan("grf unload --all")} 移除所有参考代码`);
717
- console.log(` ${chalk_1.default.cyan("grf unload --list")} 列出所有已加载的参考代码`);
718
- console.log(` ${chalk_1.default.cyan("grf unload --clean-empty")} 清理空目录结构`);
722
+ console.log("Usage:");
723
+ console.log(` ${chalk_1.default.cyan("grf unload <name>")} Remove specific reference code`);
724
+ console.log(` ${chalk_1.default.cyan("grf unload --all")} Remove all reference code`);
725
+ console.log(` ${chalk_1.default.cyan("grf unload --list")} List all loaded reference code`);
726
+ console.log(` ${chalk_1.default.cyan("grf unload --clean-empty")} Clean empty directory structures`);
719
727
  console.log();
720
- console.log(`使用 '${chalk_1.default.cyan("grf unload --list")}' 查看所有已加载的参考代码。`);
728
+ console.log(`Use '${chalk_1.default.cyan("grf unload --list")}' to see all loaded reference code.`);
721
729
  }
722
730
  catch (error) {
723
- if (error instanceof index_js_1.GrfError) {
724
- console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} ${error.message}`));
725
- if (error.code === index_js_1.ErrorCode.FS_PERMISSION_DENIED) {
726
- console.error(chalk_1.default.gray(` 权限被拒绝,请检查文件权限。`));
727
- }
728
- }
729
- else if (error instanceof Error) {
730
- console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} ${error.message}`));
731
- }
732
- else {
733
- console.error(chalk_1.default.red(`${chalk_1.default.bold("✗")} 发生未知错误`));
734
- }
735
- process.exit(1);
731
+ (0, error_js_1.handleError)(error, { exit: true });
736
732
  }
737
733
  });
738
734
  //# sourceMappingURL=unload.js.map