@skillsmith/cli 0.7.2 → 0.7.3

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 (560) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli.js +44039 -0
  4. package/package.json +21 -11
  5. package/dist/src/commands/__meta__/telemetry-coverage.test.d.ts +0 -20
  6. package/dist/src/commands/__meta__/telemetry-coverage.test.d.ts.map +0 -1
  7. package/dist/src/commands/__meta__/telemetry-coverage.test.js +0 -118
  8. package/dist/src/commands/__meta__/telemetry-coverage.test.js.map +0 -1
  9. package/dist/src/commands/ab-test.d.ts +0 -29
  10. package/dist/src/commands/ab-test.d.ts.map +0 -1
  11. package/dist/src/commands/ab-test.js +0 -226
  12. package/dist/src/commands/ab-test.js.map +0 -1
  13. package/dist/src/commands/ab-test.test.d.ts +0 -7
  14. package/dist/src/commands/ab-test.test.d.ts.map +0 -1
  15. package/dist/src/commands/ab-test.test.js +0 -255
  16. package/dist/src/commands/ab-test.test.js.map +0 -1
  17. package/dist/src/commands/analyze.d.ts +0 -14
  18. package/dist/src/commands/analyze.d.ts.map +0 -1
  19. package/dist/src/commands/analyze.js +0 -191
  20. package/dist/src/commands/analyze.js.map +0 -1
  21. package/dist/src/commands/audit-collisions.d.ts +0 -68
  22. package/dist/src/commands/audit-collisions.d.ts.map +0 -1
  23. package/dist/src/commands/audit-collisions.js +0 -309
  24. package/dist/src/commands/audit-collisions.js.map +0 -1
  25. package/dist/src/commands/audit-sources.action.d.ts +0 -37
  26. package/dist/src/commands/audit-sources.action.d.ts.map +0 -1
  27. package/dist/src/commands/audit-sources.action.js +0 -321
  28. package/dist/src/commands/audit-sources.action.js.map +0 -1
  29. package/dist/src/commands/audit-sources.d.ts +0 -37
  30. package/dist/src/commands/audit-sources.d.ts.map +0 -1
  31. package/dist/src/commands/audit-sources.js +0 -55
  32. package/dist/src/commands/audit-sources.js.map +0 -1
  33. package/dist/src/commands/audit-sources.test.d.ts +0 -9
  34. package/dist/src/commands/audit-sources.test.d.ts.map +0 -1
  35. package/dist/src/commands/audit-sources.test.js +0 -228
  36. package/dist/src/commands/audit-sources.test.js.map +0 -1
  37. package/dist/src/commands/audit.d.ts +0 -40
  38. package/dist/src/commands/audit.d.ts.map +0 -1
  39. package/dist/src/commands/audit.js +0 -223
  40. package/dist/src/commands/audit.js.map +0 -1
  41. package/dist/src/commands/audit.test.d.ts +0 -8
  42. package/dist/src/commands/audit.test.d.ts.map +0 -1
  43. package/dist/src/commands/audit.test.js +0 -97
  44. package/dist/src/commands/audit.test.js.map +0 -1
  45. package/dist/src/commands/author/index.d.ts +0 -17
  46. package/dist/src/commands/author/index.d.ts.map +0 -1
  47. package/dist/src/commands/author/index.js +0 -21
  48. package/dist/src/commands/author/index.js.map +0 -1
  49. package/dist/src/commands/author/init.action.d.ts +0 -29
  50. package/dist/src/commands/author/init.action.d.ts.map +0 -1
  51. package/dist/src/commands/author/init.action.js +0 -131
  52. package/dist/src/commands/author/init.action.js.map +0 -1
  53. package/dist/src/commands/author/init.d.ts +0 -36
  54. package/dist/src/commands/author/init.d.ts.map +0 -1
  55. package/dist/src/commands/author/init.helpers.d.ts +0 -80
  56. package/dist/src/commands/author/init.helpers.d.ts.map +0 -1
  57. package/dist/src/commands/author/init.helpers.js +0 -107
  58. package/dist/src/commands/author/init.helpers.js.map +0 -1
  59. package/dist/src/commands/author/init.js +0 -320
  60. package/dist/src/commands/author/init.js.map +0 -1
  61. package/dist/src/commands/author/mcp-init.d.ts +0 -21
  62. package/dist/src/commands/author/mcp-init.d.ts.map +0 -1
  63. package/dist/src/commands/author/mcp-init.js +0 -202
  64. package/dist/src/commands/author/mcp-init.js.map +0 -1
  65. package/dist/src/commands/author/subagent.d.ts +0 -23
  66. package/dist/src/commands/author/subagent.d.ts.map +0 -1
  67. package/dist/src/commands/author/subagent.js +0 -174
  68. package/dist/src/commands/author/subagent.js.map +0 -1
  69. package/dist/src/commands/author/transform.d.ts +0 -23
  70. package/dist/src/commands/author/transform.d.ts.map +0 -1
  71. package/dist/src/commands/author/transform.js +0 -149
  72. package/dist/src/commands/author/transform.js.map +0 -1
  73. package/dist/src/commands/author/utils.d.ts +0 -27
  74. package/dist/src/commands/author/utils.d.ts.map +0 -1
  75. package/dist/src/commands/author/utils.js +0 -118
  76. package/dist/src/commands/author/utils.js.map +0 -1
  77. package/dist/src/commands/config.d.ts +0 -57
  78. package/dist/src/commands/config.d.ts.map +0 -1
  79. package/dist/src/commands/config.js +0 -226
  80. package/dist/src/commands/config.js.map +0 -1
  81. package/dist/src/commands/create.d.ts +0 -43
  82. package/dist/src/commands/create.d.ts.map +0 -1
  83. package/dist/src/commands/create.js +0 -336
  84. package/dist/src/commands/create.js.map +0 -1
  85. package/dist/src/commands/diff.d.ts +0 -21
  86. package/dist/src/commands/diff.d.ts.map +0 -1
  87. package/dist/src/commands/diff.js +0 -227
  88. package/dist/src/commands/diff.js.map +0 -1
  89. package/dist/src/commands/diff.test.d.ts +0 -6
  90. package/dist/src/commands/diff.test.d.ts.map +0 -1
  91. package/dist/src/commands/diff.test.js +0 -327
  92. package/dist/src/commands/diff.test.js.map +0 -1
  93. package/dist/src/commands/import-local.d.ts +0 -28
  94. package/dist/src/commands/import-local.d.ts.map +0 -1
  95. package/dist/src/commands/import-local.helpers.d.ts +0 -28
  96. package/dist/src/commands/import-local.helpers.d.ts.map +0 -1
  97. package/dist/src/commands/import-local.helpers.js +0 -166
  98. package/dist/src/commands/import-local.helpers.js.map +0 -1
  99. package/dist/src/commands/import-local.js +0 -273
  100. package/dist/src/commands/import-local.js.map +0 -1
  101. package/dist/src/commands/import-local.types.d.ts +0 -59
  102. package/dist/src/commands/import-local.types.d.ts.map +0 -1
  103. package/dist/src/commands/import-local.types.js +0 -2
  104. package/dist/src/commands/import-local.types.js.map +0 -1
  105. package/dist/src/commands/import.d.ts +0 -47
  106. package/dist/src/commands/import.d.ts.map +0 -1
  107. package/dist/src/commands/import.js +0 -314
  108. package/dist/src/commands/import.js.map +0 -1
  109. package/dist/src/commands/index.d.ts +0 -28
  110. package/dist/src/commands/index.d.ts.map +0 -1
  111. package/dist/src/commands/index.js +0 -50
  112. package/dist/src/commands/index.js.map +0 -1
  113. package/dist/src/commands/info.d.ts +0 -19
  114. package/dist/src/commands/info.d.ts.map +0 -1
  115. package/dist/src/commands/info.js +0 -110
  116. package/dist/src/commands/info.js.map +0 -1
  117. package/dist/src/commands/install-skill.d.ts +0 -16
  118. package/dist/src/commands/install-skill.d.ts.map +0 -1
  119. package/dist/src/commands/install-skill.js +0 -155
  120. package/dist/src/commands/install-skill.js.map +0 -1
  121. package/dist/src/commands/install.d.ts +0 -34
  122. package/dist/src/commands/install.d.ts.map +0 -1
  123. package/dist/src/commands/install.js +0 -311
  124. package/dist/src/commands/install.js.map +0 -1
  125. package/dist/src/commands/inventory.action.d.ts +0 -55
  126. package/dist/src/commands/inventory.action.d.ts.map +0 -1
  127. package/dist/src/commands/inventory.action.js +0 -179
  128. package/dist/src/commands/inventory.action.js.map +0 -1
  129. package/dist/src/commands/inventory.action.test.d.ts +0 -19
  130. package/dist/src/commands/inventory.action.test.d.ts.map +0 -1
  131. package/dist/src/commands/inventory.action.test.js +0 -371
  132. package/dist/src/commands/inventory.action.test.js.map +0 -1
  133. package/dist/src/commands/inventory.d.ts +0 -21
  134. package/dist/src/commands/inventory.d.ts.map +0 -1
  135. package/dist/src/commands/inventory.js +0 -42
  136. package/dist/src/commands/inventory.js.map +0 -1
  137. package/dist/src/commands/login.d.ts +0 -7
  138. package/dist/src/commands/login.d.ts.map +0 -1
  139. package/dist/src/commands/login.js +0 -323
  140. package/dist/src/commands/login.js.map +0 -1
  141. package/dist/src/commands/login.test-helpers.d.ts +0 -7
  142. package/dist/src/commands/login.test-helpers.d.ts.map +0 -1
  143. package/dist/src/commands/login.test-helpers.js +0 -44
  144. package/dist/src/commands/login.test-helpers.js.map +0 -1
  145. package/dist/src/commands/login.test.d.ts +0 -2
  146. package/dist/src/commands/login.test.d.ts.map +0 -1
  147. package/dist/src/commands/login.test.js +0 -387
  148. package/dist/src/commands/login.test.js.map +0 -1
  149. package/dist/src/commands/logout.d.ts +0 -15
  150. package/dist/src/commands/logout.d.ts.map +0 -1
  151. package/dist/src/commands/logout.js +0 -54
  152. package/dist/src/commands/logout.js.map +0 -1
  153. package/dist/src/commands/logout.test.d.ts +0 -8
  154. package/dist/src/commands/logout.test.d.ts.map +0 -1
  155. package/dist/src/commands/logout.test.js +0 -137
  156. package/dist/src/commands/logout.test.js.map +0 -1
  157. package/dist/src/commands/manage.d.ts +0 -19
  158. package/dist/src/commands/manage.d.ts.map +0 -1
  159. package/dist/src/commands/manage.js +0 -346
  160. package/dist/src/commands/manage.js.map +0 -1
  161. package/dist/src/commands/merge.d.ts +0 -24
  162. package/dist/src/commands/merge.d.ts.map +0 -1
  163. package/dist/src/commands/merge.js +0 -168
  164. package/dist/src/commands/merge.js.map +0 -1
  165. package/dist/src/commands/pin.d.ts +0 -26
  166. package/dist/src/commands/pin.d.ts.map +0 -1
  167. package/dist/src/commands/pin.js +0 -138
  168. package/dist/src/commands/pin.js.map +0 -1
  169. package/dist/src/commands/pin.test.d.ts +0 -6
  170. package/dist/src/commands/pin.test.d.ts.map +0 -1
  171. package/dist/src/commands/pin.test.js +0 -206
  172. package/dist/src/commands/pin.test.js.map +0 -1
  173. package/dist/src/commands/recommend-scoring.d.ts +0 -29
  174. package/dist/src/commands/recommend-scoring.d.ts.map +0 -1
  175. package/dist/src/commands/recommend-scoring.js +0 -141
  176. package/dist/src/commands/recommend-scoring.js.map +0 -1
  177. package/dist/src/commands/recommend.d.ts +0 -15
  178. package/dist/src/commands/recommend.d.ts.map +0 -1
  179. package/dist/src/commands/recommend.helpers.d.ts +0 -44
  180. package/dist/src/commands/recommend.helpers.d.ts.map +0 -1
  181. package/dist/src/commands/recommend.helpers.js +0 -303
  182. package/dist/src/commands/recommend.helpers.js.map +0 -1
  183. package/dist/src/commands/recommend.js +0 -198
  184. package/dist/src/commands/recommend.js.map +0 -1
  185. package/dist/src/commands/recommend.types.d.ts +0 -66
  186. package/dist/src/commands/recommend.types.d.ts.map +0 -1
  187. package/dist/src/commands/recommend.types.js +0 -14
  188. package/dist/src/commands/recommend.types.js.map +0 -1
  189. package/dist/src/commands/run-registry-sync.d.ts +0 -31
  190. package/dist/src/commands/run-registry-sync.d.ts.map +0 -1
  191. package/dist/src/commands/run-registry-sync.js +0 -45
  192. package/dist/src/commands/run-registry-sync.js.map +0 -1
  193. package/dist/src/commands/search-formatters.d.ts +0 -36
  194. package/dist/src/commands/search-formatters.d.ts.map +0 -1
  195. package/dist/src/commands/search-formatters.js +0 -132
  196. package/dist/src/commands/search-formatters.js.map +0 -1
  197. package/dist/src/commands/search-types.d.ts +0 -46
  198. package/dist/src/commands/search-types.d.ts.map +0 -1
  199. package/dist/src/commands/search-types.js +0 -12
  200. package/dist/src/commands/search-types.js.map +0 -1
  201. package/dist/src/commands/search.action.d.ts +0 -16
  202. package/dist/src/commands/search.action.d.ts.map +0 -1
  203. package/dist/src/commands/search.action.js +0 -384
  204. package/dist/src/commands/search.action.js.map +0 -1
  205. package/dist/src/commands/search.d.ts +0 -18
  206. package/dist/src/commands/search.d.ts.map +0 -1
  207. package/dist/src/commands/search.helpers.d.ts +0 -52
  208. package/dist/src/commands/search.helpers.d.ts.map +0 -1
  209. package/dist/src/commands/search.helpers.js +0 -95
  210. package/dist/src/commands/search.helpers.js.map +0 -1
  211. package/dist/src/commands/search.js +0 -48
  212. package/dist/src/commands/search.js.map +0 -1
  213. package/dist/src/commands/search.test.d.ts +0 -10
  214. package/dist/src/commands/search.test.d.ts.map +0 -1
  215. package/dist/src/commands/search.test.js +0 -179
  216. package/dist/src/commands/search.test.js.map +0 -1
  217. package/dist/src/commands/sync.action.d.ts +0 -39
  218. package/dist/src/commands/sync.action.d.ts.map +0 -1
  219. package/dist/src/commands/sync.action.js +0 -353
  220. package/dist/src/commands/sync.action.js.map +0 -1
  221. package/dist/src/commands/sync.d.ts +0 -24
  222. package/dist/src/commands/sync.d.ts.map +0 -1
  223. package/dist/src/commands/sync.helpers.d.ts +0 -55
  224. package/dist/src/commands/sync.helpers.d.ts.map +0 -1
  225. package/dist/src/commands/sync.helpers.js +0 -90
  226. package/dist/src/commands/sync.helpers.js.map +0 -1
  227. package/dist/src/commands/sync.js +0 -101
  228. package/dist/src/commands/sync.js.map +0 -1
  229. package/dist/src/commands/telemetry.action.d.ts +0 -38
  230. package/dist/src/commands/telemetry.action.d.ts.map +0 -1
  231. package/dist/src/commands/telemetry.action.js +0 -350
  232. package/dist/src/commands/telemetry.action.js.map +0 -1
  233. package/dist/src/commands/telemetry.d.ts +0 -30
  234. package/dist/src/commands/telemetry.d.ts.map +0 -1
  235. package/dist/src/commands/telemetry.helpers.d.ts +0 -58
  236. package/dist/src/commands/telemetry.helpers.d.ts.map +0 -1
  237. package/dist/src/commands/telemetry.helpers.js +0 -173
  238. package/dist/src/commands/telemetry.helpers.js.map +0 -1
  239. package/dist/src/commands/telemetry.helpers.test.d.ts +0 -15
  240. package/dist/src/commands/telemetry.helpers.test.d.ts.map +0 -1
  241. package/dist/src/commands/telemetry.helpers.test.js +0 -240
  242. package/dist/src/commands/telemetry.helpers.test.js.map +0 -1
  243. package/dist/src/commands/telemetry.js +0 -65
  244. package/dist/src/commands/telemetry.js.map +0 -1
  245. package/dist/src/commands/telemetry.test.d.ts +0 -18
  246. package/dist/src/commands/telemetry.test.d.ts.map +0 -1
  247. package/dist/src/commands/telemetry.test.js +0 -401
  248. package/dist/src/commands/telemetry.test.js.map +0 -1
  249. package/dist/src/commands/whoami.d.ts +0 -15
  250. package/dist/src/commands/whoami.d.ts.map +0 -1
  251. package/dist/src/commands/whoami.js +0 -55
  252. package/dist/src/commands/whoami.js.map +0 -1
  253. package/dist/src/commands/whoami.test.d.ts +0 -8
  254. package/dist/src/commands/whoami.test.d.ts.map +0 -1
  255. package/dist/src/commands/whoami.test.js +0 -133
  256. package/dist/src/commands/whoami.test.js.map +0 -1
  257. package/dist/src/config.d.ts +0 -29
  258. package/dist/src/config.d.ts.map +0 -1
  259. package/dist/src/config.js +0 -34
  260. package/dist/src/config.js.map +0 -1
  261. package/dist/src/index.d.ts +0 -22
  262. package/dist/src/index.d.ts.map +0 -1
  263. package/dist/src/index.js +0 -117
  264. package/dist/src/index.js.map +0 -1
  265. package/dist/src/templates/changelog.md.template.d.ts +0 -8
  266. package/dist/src/templates/changelog.md.template.d.ts.map +0 -1
  267. package/dist/src/templates/changelog.md.template.js +0 -19
  268. package/dist/src/templates/changelog.md.template.js.map +0 -1
  269. package/dist/src/templates/index.d.ts +0 -11
  270. package/dist/src/templates/index.d.ts.map +0 -1
  271. package/dist/src/templates/index.js +0 -11
  272. package/dist/src/templates/index.js.map +0 -1
  273. package/dist/src/templates/mcp-server.template.d.ts +0 -82
  274. package/dist/src/templates/mcp-server.template.d.ts.map +0 -1
  275. package/dist/src/templates/mcp-server.template.js +0 -430
  276. package/dist/src/templates/mcp-server.template.js.map +0 -1
  277. package/dist/src/templates/mcp-server.template.snippets.d.ts +0 -51
  278. package/dist/src/templates/mcp-server.template.snippets.d.ts.map +0 -1
  279. package/dist/src/templates/mcp-server.template.snippets.js +0 -162
  280. package/dist/src/templates/mcp-server.template.snippets.js.map +0 -1
  281. package/dist/src/templates/mcp-template-handlers.d.ts +0 -33
  282. package/dist/src/templates/mcp-template-handlers.d.ts.map +0 -1
  283. package/dist/src/templates/mcp-template-handlers.js +0 -106
  284. package/dist/src/templates/mcp-template-handlers.js.map +0 -1
  285. package/dist/src/templates/mcp-template-types.d.ts +0 -48
  286. package/dist/src/templates/mcp-template-types.d.ts.map +0 -1
  287. package/dist/src/templates/mcp-template-types.js +0 -18
  288. package/dist/src/templates/mcp-template-types.js.map +0 -1
  289. package/dist/src/templates/readme.md.template.d.ts +0 -8
  290. package/dist/src/templates/readme.md.template.d.ts.map +0 -1
  291. package/dist/src/templates/readme.md.template.js +0 -86
  292. package/dist/src/templates/readme.md.template.js.map +0 -1
  293. package/dist/src/templates/skill.md.template.d.ts +0 -8
  294. package/dist/src/templates/skill.md.template.d.ts.map +0 -1
  295. package/dist/src/templates/skill.md.template.js +0 -97
  296. package/dist/src/templates/skill.md.template.js.map +0 -1
  297. package/dist/src/templates/subagent.md.template.d.ts +0 -38
  298. package/dist/src/templates/subagent.md.template.d.ts.map +0 -1
  299. package/dist/src/templates/subagent.md.template.js +0 -128
  300. package/dist/src/templates/subagent.md.template.js.map +0 -1
  301. package/dist/src/utils/errors.d.ts +0 -52
  302. package/dist/src/utils/errors.d.ts.map +0 -1
  303. package/dist/src/utils/errors.js +0 -58
  304. package/dist/src/utils/errors.js.map +0 -1
  305. package/dist/src/utils/formatters.d.ts +0 -39
  306. package/dist/src/utils/formatters.d.ts.map +0 -1
  307. package/dist/src/utils/formatters.js +0 -69
  308. package/dist/src/utils/formatters.js.map +0 -1
  309. package/dist/src/utils/license-types.d.ts +0 -88
  310. package/dist/src/utils/license-types.d.ts.map +0 -1
  311. package/dist/src/utils/license-types.js +0 -60
  312. package/dist/src/utils/license-types.js.map +0 -1
  313. package/dist/src/utils/license-validation.d.ts +0 -61
  314. package/dist/src/utils/license-validation.d.ts.map +0 -1
  315. package/dist/src/utils/license-validation.js +0 -198
  316. package/dist/src/utils/license-validation.js.map +0 -1
  317. package/dist/src/utils/license.d.ts +0 -56
  318. package/dist/src/utils/license.d.ts.map +0 -1
  319. package/dist/src/utils/license.js +0 -163
  320. package/dist/src/utils/license.js.map +0 -1
  321. package/dist/src/utils/license.test.d.ts +0 -7
  322. package/dist/src/utils/license.test.d.ts.map +0 -1
  323. package/dist/src/utils/license.test.js +0 -308
  324. package/dist/src/utils/license.test.js.map +0 -1
  325. package/dist/src/utils/manifest.d.ts +0 -121
  326. package/dist/src/utils/manifest.d.ts.map +0 -1
  327. package/dist/src/utils/manifest.js +0 -133
  328. package/dist/src/utils/manifest.js.map +0 -1
  329. package/dist/src/utils/manifest.test.d.ts +0 -20
  330. package/dist/src/utils/manifest.test.d.ts.map +0 -1
  331. package/dist/src/utils/manifest.test.js +0 -344
  332. package/dist/src/utils/manifest.test.js.map +0 -1
  333. package/dist/src/utils/node-version.d.ts +0 -41
  334. package/dist/src/utils/node-version.d.ts.map +0 -1
  335. package/dist/src/utils/node-version.js +0 -123
  336. package/dist/src/utils/node-version.js.map +0 -1
  337. package/dist/src/utils/open-database.d.ts +0 -35
  338. package/dist/src/utils/open-database.d.ts.map +0 -1
  339. package/dist/src/utils/open-database.js +0 -73
  340. package/dist/src/utils/open-database.js.map +0 -1
  341. package/dist/src/utils/require-tier.d.ts +0 -38
  342. package/dist/src/utils/require-tier.d.ts.map +0 -1
  343. package/dist/src/utils/require-tier.js +0 -74
  344. package/dist/src/utils/require-tier.js.map +0 -1
  345. package/dist/src/utils/sanitize.d.ts +0 -30
  346. package/dist/src/utils/sanitize.d.ts.map +0 -1
  347. package/dist/src/utils/sanitize.js +0 -45
  348. package/dist/src/utils/sanitize.js.map +0 -1
  349. package/dist/src/utils/skill-name.d.ts +0 -19
  350. package/dist/src/utils/skill-name.d.ts.map +0 -1
  351. package/dist/src/utils/skill-name.js +0 -26
  352. package/dist/src/utils/skill-name.js.map +0 -1
  353. package/dist/src/utils/skills-directory.d.ts +0 -95
  354. package/dist/src/utils/skills-directory.d.ts.map +0 -1
  355. package/dist/src/utils/skills-directory.js +0 -285
  356. package/dist/src/utils/skills-directory.js.map +0 -1
  357. package/dist/src/utils/startup-header-gate.d.ts +0 -29
  358. package/dist/src/utils/startup-header-gate.d.ts.map +0 -1
  359. package/dist/src/utils/startup-header-gate.js +0 -44
  360. package/dist/src/utils/startup-header-gate.js.map +0 -1
  361. package/dist/src/utils/startup-header-gate.test.d.ts +0 -2
  362. package/dist/src/utils/startup-header-gate.test.d.ts.map +0 -1
  363. package/dist/src/utils/startup-header-gate.test.js +0 -46
  364. package/dist/src/utils/startup-header-gate.test.js.map +0 -1
  365. package/dist/src/utils/tool-analyzer.d.ts +0 -54
  366. package/dist/src/utils/tool-analyzer.d.ts.map +0 -1
  367. package/dist/src/utils/tool-analyzer.js +0 -156
  368. package/dist/src/utils/tool-analyzer.js.map +0 -1
  369. package/dist/src/version.d.ts +0 -2
  370. package/dist/src/version.d.ts.map +0 -1
  371. package/dist/src/version.js +0 -24
  372. package/dist/src/version.js.map +0 -1
  373. package/dist/tests/audit-collisions.test.d.ts +0 -42
  374. package/dist/tests/audit-collisions.test.d.ts.map +0 -1
  375. package/dist/tests/audit-collisions.test.js +0 -370
  376. package/dist/tests/audit-collisions.test.js.map +0 -1
  377. package/dist/tests/audit-restructure.test.d.ts +0 -15
  378. package/dist/tests/audit-restructure.test.d.ts.map +0 -1
  379. package/dist/tests/audit-restructure.test.js +0 -151
  380. package/dist/tests/audit-restructure.test.js.map +0 -1
  381. package/dist/tests/author.test.d.ts +0 -5
  382. package/dist/tests/author.test.d.ts.map +0 -1
  383. package/dist/tests/author.test.js +0 -653
  384. package/dist/tests/author.test.js.map +0 -1
  385. package/dist/tests/config.test.d.ts +0 -33
  386. package/dist/tests/config.test.d.ts.map +0 -1
  387. package/dist/tests/config.test.js +0 -240
  388. package/dist/tests/config.test.js.map +0 -1
  389. package/dist/tests/create.test.d.ts +0 -5
  390. package/dist/tests/create.test.d.ts.map +0 -1
  391. package/dist/tests/create.test.js +0 -449
  392. package/dist/tests/create.test.js.map +0 -1
  393. package/dist/tests/e2e/audit-sources-affix.test.d.ts +0 -11
  394. package/dist/tests/e2e/audit-sources-affix.test.d.ts.map +0 -1
  395. package/dist/tests/e2e/audit-sources-affix.test.js +0 -121
  396. package/dist/tests/e2e/audit-sources-affix.test.js.map +0 -1
  397. package/dist/tests/e2e/audit-sources-apply.test.d.ts +0 -13
  398. package/dist/tests/e2e/audit-sources-apply.test.d.ts.map +0 -1
  399. package/dist/tests/e2e/audit-sources-apply.test.js +0 -166
  400. package/dist/tests/e2e/audit-sources-apply.test.js.map +0 -1
  401. package/dist/tests/e2e/audit-sources-recovery.test.d.ts +0 -15
  402. package/dist/tests/e2e/audit-sources-recovery.test.d.ts.map +0 -1
  403. package/dist/tests/e2e/audit-sources-recovery.test.js +0 -179
  404. package/dist/tests/e2e/audit-sources-recovery.test.js.map +0 -1
  405. package/dist/tests/e2e/audit-sources-roundtrip.test.d.ts +0 -23
  406. package/dist/tests/e2e/audit-sources-roundtrip.test.d.ts.map +0 -1
  407. package/dist/tests/e2e/audit-sources-roundtrip.test.js +0 -139
  408. package/dist/tests/e2e/audit-sources-roundtrip.test.js.map +0 -1
  409. package/dist/tests/e2e/author.e2e.test.d.ts +0 -9
  410. package/dist/tests/e2e/author.e2e.test.d.ts.map +0 -1
  411. package/dist/tests/e2e/author.e2e.test.js +0 -666
  412. package/dist/tests/e2e/author.e2e.test.js.map +0 -1
  413. package/dist/tests/e2e/import.e2e.test.d.ts +0 -10
  414. package/dist/tests/e2e/import.e2e.test.d.ts.map +0 -1
  415. package/dist/tests/e2e/import.e2e.test.js +0 -213
  416. package/dist/tests/e2e/import.e2e.test.js.map +0 -1
  417. package/dist/tests/e2e/manage.e2e.test.d.ts +0 -9
  418. package/dist/tests/e2e/manage.e2e.test.d.ts.map +0 -1
  419. package/dist/tests/e2e/manage.e2e.test.js +0 -277
  420. package/dist/tests/e2e/manage.e2e.test.js.map +0 -1
  421. package/dist/tests/e2e/search.e2e.test.d.ts +0 -10
  422. package/dist/tests/e2e/search.e2e.test.d.ts.map +0 -1
  423. package/dist/tests/e2e/search.e2e.test.js +0 -324
  424. package/dist/tests/e2e/search.e2e.test.js.map +0 -1
  425. package/dist/tests/e2e/test-config.d.ts +0 -39
  426. package/dist/tests/e2e/test-config.d.ts.map +0 -1
  427. package/dist/tests/e2e/test-config.js +0 -44
  428. package/dist/tests/e2e/test-config.js.map +0 -1
  429. package/dist/tests/e2e/utils/baseline-collector.d.ts +0 -107
  430. package/dist/tests/e2e/utils/baseline-collector.d.ts.map +0 -1
  431. package/dist/tests/e2e/utils/baseline-collector.js +0 -211
  432. package/dist/tests/e2e/utils/baseline-collector.js.map +0 -1
  433. package/dist/tests/e2e/utils/hardcoded-detector.d.ts +0 -46
  434. package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +0 -1
  435. package/dist/tests/e2e/utils/hardcoded-detector.js +0 -238
  436. package/dist/tests/e2e/utils/hardcoded-detector.js.map +0 -1
  437. package/dist/tests/e2e/utils/index.d.ts +0 -12
  438. package/dist/tests/e2e/utils/index.d.ts.map +0 -1
  439. package/dist/tests/e2e/utils/index.js +0 -12
  440. package/dist/tests/e2e/utils/index.js.map +0 -1
  441. package/dist/tests/e2e/utils/linear-reporter.d.ts +0 -60
  442. package/dist/tests/e2e/utils/linear-reporter.d.ts.map +0 -1
  443. package/dist/tests/e2e/utils/linear-reporter.js +0 -223
  444. package/dist/tests/e2e/utils/linear-reporter.js.map +0 -1
  445. package/dist/tests/e2e/utils/mock-github.d.ts +0 -23
  446. package/dist/tests/e2e/utils/mock-github.d.ts.map +0 -1
  447. package/dist/tests/e2e/utils/mock-github.js +0 -60
  448. package/dist/tests/e2e/utils/mock-github.js.map +0 -1
  449. package/dist/tests/e2e/utils/mock-prompts.d.ts +0 -19
  450. package/dist/tests/e2e/utils/mock-prompts.d.ts.map +0 -1
  451. package/dist/tests/e2e/utils/mock-prompts.js +0 -48
  452. package/dist/tests/e2e/utils/mock-prompts.js.map +0 -1
  453. package/dist/tests/e2e/utils/source-recovery-fixture.d.ts +0 -49
  454. package/dist/tests/e2e/utils/source-recovery-fixture.d.ts.map +0 -1
  455. package/dist/tests/e2e/utils/source-recovery-fixture.js +0 -106
  456. package/dist/tests/e2e/utils/source-recovery-fixture.js.map +0 -1
  457. package/dist/tests/embedding-probe-stdio.test.d.ts +0 -11
  458. package/dist/tests/embedding-probe-stdio.test.d.ts.map +0 -1
  459. package/dist/tests/embedding-probe-stdio.test.js +0 -58
  460. package/dist/tests/embedding-probe-stdio.test.js.map +0 -1
  461. package/dist/tests/import.test.d.ts +0 -5
  462. package/dist/tests/import.test.d.ts.map +0 -1
  463. package/dist/tests/import.test.js +0 -11
  464. package/dist/tests/import.test.js.map +0 -1
  465. package/dist/tests/init.test.d.ts +0 -30
  466. package/dist/tests/init.test.d.ts.map +0 -1
  467. package/dist/tests/init.test.js +0 -357
  468. package/dist/tests/init.test.js.map +0 -1
  469. package/dist/tests/install-multi-client.test.d.ts +0 -2
  470. package/dist/tests/install-multi-client.test.d.ts.map +0 -1
  471. package/dist/tests/install-multi-client.test.js +0 -202
  472. package/dist/tests/install-multi-client.test.js.map +0 -1
  473. package/dist/tests/install-quarantine.test.d.ts +0 -10
  474. package/dist/tests/install-quarantine.test.d.ts.map +0 -1
  475. package/dist/tests/install-quarantine.test.js +0 -86
  476. package/dist/tests/install-quarantine.test.js.map +0 -1
  477. package/dist/tests/install-skill.test.d.ts +0 -8
  478. package/dist/tests/install-skill.test.d.ts.map +0 -1
  479. package/dist/tests/install-skill.test.js +0 -414
  480. package/dist/tests/install-skill.test.js.map +0 -1
  481. package/dist/tests/integration/import-local.test.d.ts +0 -2
  482. package/dist/tests/integration/import-local.test.d.ts.map +0 -1
  483. package/dist/tests/integration/import-local.test.js +0 -158
  484. package/dist/tests/integration/import-local.test.js.map +0 -1
  485. package/dist/tests/license-validation.test.d.ts +0 -8
  486. package/dist/tests/license-validation.test.d.ts.map +0 -1
  487. package/dist/tests/license-validation.test.js +0 -186
  488. package/dist/tests/license-validation.test.js.map +0 -1
  489. package/dist/tests/manage.test.d.ts +0 -5
  490. package/dist/tests/manage.test.d.ts.map +0 -1
  491. package/dist/tests/manage.test.js +0 -495
  492. package/dist/tests/manage.test.js.map +0 -1
  493. package/dist/tests/mcp-server-template.test.d.ts +0 -7
  494. package/dist/tests/mcp-server-template.test.d.ts.map +0 -1
  495. package/dist/tests/mcp-server-template.test.js +0 -372
  496. package/dist/tests/mcp-server-template.test.js.map +0 -1
  497. package/dist/tests/node-version.test.d.ts +0 -8
  498. package/dist/tests/node-version.test.d.ts.map +0 -1
  499. package/dist/tests/node-version.test.js +0 -200
  500. package/dist/tests/node-version.test.js.map +0 -1
  501. package/dist/tests/open-database.test.d.ts +0 -2
  502. package/dist/tests/open-database.test.d.ts.map +0 -1
  503. package/dist/tests/open-database.test.js +0 -77
  504. package/dist/tests/open-database.test.js.map +0 -1
  505. package/dist/tests/recommend-helpers.test.d.ts +0 -9
  506. package/dist/tests/recommend-helpers.test.d.ts.map +0 -1
  507. package/dist/tests/recommend-helpers.test.js +0 -308
  508. package/dist/tests/recommend-helpers.test.js.map +0 -1
  509. package/dist/tests/recommend-scoring.test.d.ts +0 -8
  510. package/dist/tests/recommend-scoring.test.d.ts.map +0 -1
  511. package/dist/tests/recommend-scoring.test.js +0 -184
  512. package/dist/tests/recommend-scoring.test.js.map +0 -1
  513. package/dist/tests/recommend.errors.test.d.ts +0 -8
  514. package/dist/tests/recommend.errors.test.d.ts.map +0 -1
  515. package/dist/tests/recommend.errors.test.js +0 -232
  516. package/dist/tests/recommend.errors.test.js.map +0 -1
  517. package/dist/tests/recommend.filters.test.d.ts +0 -9
  518. package/dist/tests/recommend.filters.test.d.ts.map +0 -1
  519. package/dist/tests/recommend.filters.test.js +0 -235
  520. package/dist/tests/recommend.filters.test.js.map +0 -1
  521. package/dist/tests/recommend.test-helpers.d.ts +0 -66
  522. package/dist/tests/recommend.test-helpers.d.ts.map +0 -1
  523. package/dist/tests/recommend.test-helpers.js +0 -79
  524. package/dist/tests/recommend.test-helpers.js.map +0 -1
  525. package/dist/tests/recommend.test.d.ts +0 -11
  526. package/dist/tests/recommend.test.d.ts.map +0 -1
  527. package/dist/tests/recommend.test.js +0 -320
  528. package/dist/tests/recommend.test.js.map +0 -1
  529. package/dist/tests/search-helpers.test.d.ts +0 -2
  530. package/dist/tests/search-helpers.test.d.ts.map +0 -1
  531. package/dist/tests/search-helpers.test.js +0 -110
  532. package/dist/tests/search-helpers.test.js.map +0 -1
  533. package/dist/tests/search.test.d.ts +0 -5
  534. package/dist/tests/search.test.d.ts.map +0 -1
  535. package/dist/tests/search.test.js +0 -91
  536. package/dist/tests/search.test.js.map +0 -1
  537. package/dist/tests/skills-directory-per-harness.test.d.ts +0 -2
  538. package/dist/tests/skills-directory-per-harness.test.d.ts.map +0 -1
  539. package/dist/tests/skills-directory-per-harness.test.js +0 -116
  540. package/dist/tests/skills-directory-per-harness.test.js.map +0 -1
  541. package/dist/tests/skills-directory.test.d.ts +0 -2
  542. package/dist/tests/skills-directory.test.d.ts.map +0 -1
  543. package/dist/tests/skills-directory.test.js +0 -108
  544. package/dist/tests/skills-directory.test.js.map +0 -1
  545. package/dist/tests/sync.auth-ux.test.d.ts +0 -14
  546. package/dist/tests/sync.auth-ux.test.d.ts.map +0 -1
  547. package/dist/tests/sync.auth-ux.test.js +0 -148
  548. package/dist/tests/sync.auth-ux.test.js.map +0 -1
  549. package/dist/tests/tool-analyzer.test.d.ts +0 -8
  550. package/dist/tests/tool-analyzer.test.d.ts.map +0 -1
  551. package/dist/tests/tool-analyzer.test.js +0 -149
  552. package/dist/tests/tool-analyzer.test.js.map +0 -1
  553. package/dist/tests/unit/commands/install.test.d.ts +0 -7
  554. package/dist/tests/unit/commands/install.test.d.ts.map +0 -1
  555. package/dist/tests/unit/commands/install.test.js +0 -482
  556. package/dist/tests/unit/commands/install.test.js.map +0 -1
  557. package/dist/tests/unit/import-local.helpers.test.d.ts +0 -2
  558. package/dist/tests/unit/import-local.helpers.test.d.ts.map +0 -1
  559. package/dist/tests/unit/import-local.helpers.test.js +0 -96
  560. package/dist/tests/unit/import-local.helpers.test.js.map +0 -1
@@ -1,387 +0,0 @@
1
- // SMI-4402: login command tests — device-code OAuth flow + legacy detection + paste-legacy
2
- // LC-1: JWT auth guard exits 0 when valid credentials exist
3
- // LC-2: device-code success path stores credentials and exits 0
4
- // LC-3: device-code network error on request exits 5
5
- // LC-4: device-code expired exits 4
6
- // LC-5: device-code declined exits 3
7
- // LC-6: slow_down doubles poll interval
8
- // LC-7: legacy key menu — choice 'a' keeps key
9
- // LC-8: legacy key menu — choice 'p' runs paste flow
10
- // LC-9: paste-legacy stores key and exits 0 (+ SMI-4454 echo assertion)
11
- // LC-10: paste-legacy 3 failures exits 1 (+ SMI-4454 echo-per-attempt assertion)
12
- // LC-11: paste-legacy Ctrl+C exits 2
13
- // LC-12: --paste-legacy store failure exits 1 with message
14
- // LC-13: device-code network error during polling exits 5
15
- // LC-14: legacy key menu — choice 'd' runs device flow
16
- // LC-15: SMI-4454 — device-code flow sends client_meta with CLI identity
17
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
18
- // readline.createInterface must be mocked via vi.hoisted + vi.mock — ESM namespace
19
- // objects are not configurable, so vi.spyOn cannot intercept them at runtime.
20
- const { mockCreateInterface } = vi.hoisted(() => ({
21
- mockCreateInterface: vi.fn(),
22
- }));
23
- vi.mock('readline', () => ({
24
- default: { createInterface: mockCreateInterface },
25
- createInterface: mockCreateInterface,
26
- }));
27
- vi.mock('@skillsmith/core', () => ({
28
- loadCredentials: vi.fn(),
29
- storeCredentials: vi.fn(),
30
- getApiKey: vi.fn(),
31
- getApiBaseUrl: vi.fn().mockReturnValue('https://api.skillsmith.app/functions/v1'),
32
- storeApiKey: vi.fn(),
33
- isValidApiKeyFormat: vi.fn(),
34
- }));
35
- vi.mock('@inquirer/prompts', () => ({
36
- password: vi.fn(),
37
- }));
38
- vi.mock('open', () => ({ default: vi.fn() }));
39
- // SMI-5427: login no longer opens a DB or runs a registry sync — those imports
40
- // were removed, so no open-database / run-registry-sync / ora mocks are needed.
41
- import { createLoginCommand } from './login.js';
42
- import { mockDeviceCodeSuccess } from './login.test-helpers.js';
43
- import { loadCredentials, storeCredentials, getApiKey, storeApiKey, isValidApiKeyFormat, } from '@skillsmith/core';
44
- import { password } from '@inquirer/prompts';
45
- const mockLoadCredentials = vi.mocked(loadCredentials);
46
- const mockStoreCredentials = vi.mocked(storeCredentials);
47
- const mockGetApiKey = vi.mocked(getApiKey);
48
- const mockStoreApiKey = vi.mocked(storeApiKey);
49
- const mockIsValidApiKeyFormat = vi.mocked(isValidApiKeyFormat);
50
- const mockPassword = vi.mocked(password);
51
- const VALID_KEY = 'sk_live_' + 'a'.repeat(32);
52
- const NOW = Date.now();
53
- async function runCommand(args = []) {
54
- const cmd = createLoginCommand();
55
- await cmd.parseAsync(['node', 'login', ...args]);
56
- }
57
- describe('createLoginCommand', () => {
58
- let consoleLogSpy;
59
- let consoleErrorSpy;
60
- let processExitSpy;
61
- let originalEnv;
62
- let originalFetch;
63
- beforeEach(() => {
64
- vi.clearAllMocks();
65
- vi.useFakeTimers();
66
- originalEnv = { ...process.env };
67
- originalFetch = global.fetch;
68
- process.env['CI'] = 'true'; // suppress browser open by default
69
- delete process.env['SKILLSMITH_API_KEY'];
70
- mockLoadCredentials.mockResolvedValue(null);
71
- mockGetApiKey.mockReturnValue(undefined);
72
- mockStoreCredentials.mockResolvedValue(undefined);
73
- mockStoreApiKey.mockResolvedValue(undefined);
74
- consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
75
- consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
76
- processExitSpy = vi
77
- .spyOn(process, 'exit')
78
- .mockImplementation((code) => {
79
- // Clear pending timers so vi.runAllTimersAsync() doesn't fire additional
80
- // polling iterations after process.exit, which would create unhandled rejections.
81
- vi.clearAllTimers();
82
- throw new Error(`process.exit(${code ?? 0})`);
83
- });
84
- });
85
- afterEach(() => {
86
- vi.useRealTimers();
87
- process.env = originalEnv;
88
- global.fetch = originalFetch;
89
- consoleLogSpy.mockRestore();
90
- consoleErrorSpy.mockRestore();
91
- processExitSpy.mockRestore();
92
- });
93
- it('has correct name and --paste-legacy option', () => {
94
- const cmd = createLoginCommand();
95
- expect(cmd.name()).toBe('login');
96
- // cmd.opts() before parsing excludes boolean flags without defaults;
97
- // check the option definition array directly.
98
- const hasPasteLegacy = cmd.options.some((o) => o.long === '--paste-legacy');
99
- expect(hasPasteLegacy).toBe(true);
100
- });
101
- it('LC-1: exits 0 when valid JWT credentials already exist', async () => {
102
- mockLoadCredentials.mockResolvedValue({
103
- accessToken: 'jwt.access',
104
- refreshToken: 'jwt.refresh',
105
- expiresAt: NOW + 3_600_000,
106
- version: 2,
107
- });
108
- await expect(runCommand()).rejects.toThrow('process.exit(0)');
109
- const output = consoleLogSpy.mock.calls.flat().join('\n');
110
- expect(output).toContain('Already authenticated');
111
- expect(output).toContain('skillsmith logout');
112
- });
113
- describe('device-code flow', () => {
114
- it('LC-2: success path stores credentials and exits 0', async () => {
115
- mockDeviceCodeSuccess();
116
- const run = runCommand();
117
- // Suppress unhandledRejection: run rejects inside runAllTimersAsync before
118
- // expect(run).rejects can attach a handler. The noop catch prevents the
119
- // Node.js unhandled-rejection warning without consuming the rejection.
120
- run.catch(() => { });
121
- await vi.runAllTimersAsync();
122
- await expect(run).rejects.toThrow('process.exit(0)');
123
- expect(mockStoreCredentials).toHaveBeenCalledWith(expect.objectContaining({
124
- accessToken: 'jwt.access',
125
- refreshToken: 'jwt.refresh',
126
- version: 2,
127
- }));
128
- const output = consoleLogSpy.mock.calls.flat().join('\n');
129
- expect(output).toContain('Logged in successfully');
130
- // SMI-5427: login authenticates only — no 20-min registry auto-sync — and the
131
- // hint avoids `search` so users don't trip the same sync on first query.
132
- expect(output).toContain('Run `skillsmith --help`');
133
- expect(output).not.toContain('Synced');
134
- expect(output).not.toContain('search mcp');
135
- });
136
- it('LC-3: network error on device-code request exits 5', async () => {
137
- global.fetch = vi.fn().mockRejectedValue(new Error('ENOTFOUND'));
138
- await expect(runCommand()).rejects.toThrow('process.exit(5)');
139
- });
140
- it('LC-4: expired token exits 4', async () => {
141
- global.fetch = vi.fn().mockImplementation((url) => {
142
- if (url.includes('auth-device-code')) {
143
- return Promise.resolve({
144
- ok: true,
145
- json: () => Promise.resolve({
146
- device_code: 'dc_exp',
147
- user_code: 'BCDFGHJK',
148
- verification_uri: 'https://skillsmith.app/device',
149
- expires_in: 900,
150
- interval: 5,
151
- }),
152
- });
153
- }
154
- return Promise.resolve({
155
- ok: false,
156
- status: 400,
157
- json: () => Promise.resolve({ error: 'expired_token' }),
158
- });
159
- });
160
- const run = runCommand();
161
- run.catch(() => { });
162
- await vi.runAllTimersAsync();
163
- await expect(run).rejects.toThrow('process.exit(4)');
164
- });
165
- it('LC-5: declined exits 3', async () => {
166
- global.fetch = vi.fn().mockImplementation((url) => {
167
- if (url.includes('auth-device-code')) {
168
- return Promise.resolve({
169
- ok: true,
170
- json: () => Promise.resolve({
171
- device_code: 'dc_dec',
172
- user_code: 'BCDFGHJK',
173
- verification_uri: 'https://skillsmith.app/device',
174
- expires_in: 900,
175
- interval: 5,
176
- }),
177
- });
178
- }
179
- return Promise.resolve({
180
- ok: false,
181
- status: 400,
182
- json: () => Promise.resolve({ error: 'authorization_declined' }),
183
- });
184
- });
185
- const run = runCommand();
186
- run.catch(() => { });
187
- await vi.runAllTimersAsync();
188
- await expect(run).rejects.toThrow('process.exit(3)');
189
- });
190
- it('LC-6: slow_down response doubles poll interval', async () => {
191
- let tokenCallCount = 0;
192
- global.fetch = vi.fn().mockImplementation((url) => {
193
- if (url.includes('auth-device-code')) {
194
- return Promise.resolve({
195
- ok: true,
196
- json: () => Promise.resolve({
197
- device_code: 'dc_slow',
198
- user_code: 'BCDFGHJK',
199
- verification_uri: 'https://skillsmith.app/device',
200
- expires_in: 900,
201
- interval: 5,
202
- }),
203
- });
204
- }
205
- tokenCallCount++;
206
- if (tokenCallCount === 1) {
207
- return Promise.resolve({ ok: false, status: 429, json: () => Promise.resolve({}) });
208
- }
209
- return Promise.resolve({
210
- ok: true,
211
- json: () => Promise.resolve({ access_token: 'j.a', refresh_token: 'j.r', expires_in: 3600 }),
212
- });
213
- });
214
- const run = runCommand();
215
- run.catch(() => { });
216
- await vi.runAllTimersAsync();
217
- await expect(run).rejects.toThrow('process.exit(0)');
218
- expect(tokenCallCount).toBe(2);
219
- });
220
- it('LC-13: network error during token polling exits 5', async () => {
221
- global.fetch = vi.fn().mockImplementation((url) => {
222
- if (url.includes('auth-device-code')) {
223
- return Promise.resolve({
224
- ok: true,
225
- json: () => Promise.resolve({
226
- device_code: 'dc_neterr',
227
- user_code: 'BCDFGHJK',
228
- verification_uri: 'https://skillsmith.app/device',
229
- expires_in: 900,
230
- interval: 5,
231
- }),
232
- });
233
- }
234
- // auth-device-token throws network error
235
- return Promise.reject(new Error('ECONNRESET'));
236
- });
237
- const run = runCommand();
238
- run.catch(() => { });
239
- await vi.runAllTimersAsync();
240
- await expect(run).rejects.toThrow('process.exit(5)');
241
- });
242
- });
243
- describe('legacy key menu', () => {
244
- beforeEach(() => {
245
- mockGetApiKey.mockReturnValue('sk_live_' + 'x'.repeat(32));
246
- });
247
- it('LC-7: choice a keeps existing key and exits 0', async () => {
248
- mockCreateInterface.mockReturnValue({
249
- once: (_event, cb) => {
250
- cb('a');
251
- return {};
252
- },
253
- close: vi.fn(),
254
- });
255
- await expect(runCommand()).rejects.toThrow('process.exit(0)');
256
- const output = consoleLogSpy.mock.calls.flat().join('\n');
257
- expect(output).toContain('Keeping existing key');
258
- expect(mockStoreCredentials).not.toHaveBeenCalled();
259
- });
260
- it('LC-8: choice p runs paste flow', async () => {
261
- mockCreateInterface.mockReturnValue({
262
- once: (_event, cb) => {
263
- cb('p');
264
- return {};
265
- },
266
- close: vi.fn(),
267
- });
268
- mockIsValidApiKeyFormat.mockReturnValue(true);
269
- mockPassword.mockResolvedValue(VALID_KEY);
270
- await expect(runCommand()).rejects.toThrow('process.exit(0)');
271
- expect(mockStoreApiKey).toHaveBeenCalledWith(VALID_KEY);
272
- });
273
- it('LC-14: choice d runs device-code flow', async () => {
274
- mockCreateInterface.mockReturnValue({
275
- once: (_event, cb) => {
276
- cb('d');
277
- return {};
278
- },
279
- close: vi.fn(),
280
- });
281
- mockDeviceCodeSuccess();
282
- const run = runCommand();
283
- run.catch(() => { });
284
- await vi.runAllTimersAsync();
285
- await expect(run).rejects.toThrow('process.exit(0)');
286
- expect(mockStoreCredentials).toHaveBeenCalledWith(expect.objectContaining({ version: 2 }));
287
- });
288
- });
289
- describe('paste-legacy flow', () => {
290
- it('LC-9: --paste-legacy stores key and exits 0', async () => {
291
- mockIsValidApiKeyFormat.mockReturnValue(true);
292
- mockPassword.mockResolvedValue(VALID_KEY);
293
- await expect(runCommand(['--paste-legacy'])).rejects.toThrow('process.exit(0)');
294
- expect(mockStoreApiKey).toHaveBeenCalledWith(VALID_KEY);
295
- const output = consoleLogSpy.mock.calls.flat().join('\n');
296
- expect(output).toContain('Logged in successfully');
297
- // SMI-5427: the paste-legacy path emits the same neutral hint and runs no
298
- // registry sync — assert parity with the device-code path (governance C8 gap).
299
- expect(output).toContain('Run `skillsmith --help`');
300
- expect(output).not.toContain('Synced');
301
- expect(output).not.toContain('search mcp');
302
- // SMI-4454: post-paste echo gives a ground-truth signal when the mask
303
- // bullet is stripped by the terminal (Claude Code's embedded PTY, etc).
304
- expect(output).toMatch(/Received \d+ characters — validating…/);
305
- // And the mask option is forwarded to the prompt so terminals that DO
306
- // render it use the denser ASCII mark instead of the invisible default.
307
- expect(mockPassword).toHaveBeenCalledWith(expect.objectContaining({ mask: '*' }));
308
- });
309
- it('LC-10: 3 format failures exits 1', async () => {
310
- mockIsValidApiKeyFormat.mockReturnValue(false);
311
- mockPassword.mockResolvedValue('bad');
312
- await expect(runCommand(['--paste-legacy'])).rejects.toThrow('process.exit(1)');
313
- expect(mockPassword).toHaveBeenCalledTimes(3);
314
- expect(mockStoreApiKey).not.toHaveBeenCalled();
315
- const err = consoleErrorSpy.mock.calls.flat().join('\n');
316
- expect(err).toContain('Too many invalid attempts');
317
- // SMI-4454: echo fires before each validation error — one per attempt.
318
- const output = consoleLogSpy.mock.calls.flat().join('\n');
319
- const echoMatches = output.match(/Received \d+ characters — validating…/g) ?? [];
320
- expect(echoMatches.length).toBeGreaterThanOrEqual(3);
321
- });
322
- it('LC-11: Ctrl+C exits 2', async () => {
323
- const exitErr = Object.assign(new Error('prompt closed'), { name: 'ExitPromptError' });
324
- mockPassword.mockRejectedValue(exitErr);
325
- await expect(runCommand(['--paste-legacy'])).rejects.toThrow('process.exit(2)');
326
- const output = consoleLogSpy.mock.calls.flat().join('\n');
327
- expect(output).toContain('Cancelled');
328
- });
329
- it('LC-12: store failure exits 1 with message', async () => {
330
- mockIsValidApiKeyFormat.mockReturnValue(true);
331
- mockPassword.mockResolvedValue(VALID_KEY);
332
- mockStoreApiKey.mockRejectedValue(new Error('EACCES'));
333
- await expect(runCommand(['--paste-legacy'])).rejects.toThrow('process.exit(1)');
334
- const err = consoleErrorSpy.mock.calls.flat().join('\n');
335
- expect(err).toContain('Failed to store credentials');
336
- expect(err).toContain('EACCES');
337
- });
338
- });
339
- describe('SMI-4454: client_meta transport', () => {
340
- it('LC-15: device-code flow sends client_meta with CLI identity', async () => {
341
- const fetchSpy = vi.fn().mockImplementation((url) => {
342
- if (url.includes('auth-device-code')) {
343
- return Promise.resolve({
344
- ok: true,
345
- json: () => Promise.resolve({
346
- device_code: 'dc_meta',
347
- user_code: 'BCDFGHJK',
348
- verification_uri: 'https://skillsmith.app/device',
349
- expires_in: 900,
350
- interval: 5,
351
- }),
352
- });
353
- }
354
- return Promise.resolve({
355
- ok: true,
356
- json: () => Promise.resolve({
357
- access_token: 'jwt.access',
358
- refresh_token: 'jwt.refresh',
359
- expires_in: 3600,
360
- }),
361
- });
362
- });
363
- global.fetch = fetchSpy;
364
- const run = runCommand();
365
- run.catch(() => { });
366
- await vi.runAllTimersAsync();
367
- await expect(run).rejects.toThrow('process.exit(0)');
368
- const deviceCodeCall = fetchSpy.mock.calls.find((c) => String(c[0]).includes('auth-device-code'));
369
- expect(deviceCodeCall).toBeDefined();
370
- const init = deviceCodeCall?.[1];
371
- const parsed = JSON.parse(init?.body ?? '{}');
372
- expect(parsed.client_type).toBe('cli');
373
- expect(parsed.client_meta).toBeDefined();
374
- const meta = parsed.client_meta ?? {};
375
- for (const key of ['cli_version', 'node_version', 'platform', 'arch', 'hostname']) {
376
- expect(meta, `missing ${key}`).toHaveProperty(key);
377
- expect(typeof meta[key]).toBe('string');
378
- expect(meta[key].length).toBeGreaterThan(0);
379
- }
380
- // node_version is live process.version ('vX.Y.Z'); platform/arch match live.
381
- expect(meta['node_version']).toMatch(/^v\d/);
382
- expect(meta['platform']).toBe(process.platform);
383
- expect(meta['arch']).toBe(process.arch);
384
- });
385
- });
386
- });
387
- //# sourceMappingURL=login.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"login.test.js","sourceRoot":"","sources":["../../../src/commands/login.test.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Logout Command - Remove stored Skillsmith API key
3
- *
4
- * SMI-2715: CLI Login Device Flow
5
- *
6
- * Checks authentication status, prompts for confirmation, and clears
7
- * the stored API key from all storage locations (keyring + config file).
8
- */
9
- import { Command } from 'commander';
10
- export declare const logoutAction: () => Promise<void>;
11
- /**
12
- * Create the `skillsmith logout` command.
13
- */
14
- export declare function createLogoutCommand(): Command;
15
- //# sourceMappingURL=logout.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AA2CnC,eAAO,MAAM,YAAY,qBAIvB,CAAA;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}
@@ -1,54 +0,0 @@
1
- /**
2
- * Logout Command - Remove stored Skillsmith API key
3
- *
4
- * SMI-2715: CLI Login Device Flow
5
- *
6
- * Checks authentication status, prompts for confirmation, and clears
7
- * the stored API key from all storage locations (keyring + config file).
8
- */
9
- import { Command } from 'commander';
10
- import { confirm } from '@inquirer/prompts';
11
- import chalk from 'chalk';
12
- import { clearApiKey, getAuthStatus } from '@skillsmith/core';
13
- import { withTelemetry } from '@skillsmith/core/telemetry';
14
- // SMI-5128: extracted from inline .action() closure to a named function so
15
- // withTelemetry can wrap it at the export boundary (SMI-5040 coverage gate).
16
- async function logoutActionImpl() {
17
- // 1. Check whether there is anything to remove
18
- const status = await getAuthStatus();
19
- if (!status.authenticated) {
20
- console.log('Not authenticated. Nothing to log out.');
21
- process.exit(0);
22
- }
23
- // 2. Confirm before removing
24
- const confirmed = await confirm({
25
- message: 'Log out and remove stored API key?',
26
- default: false,
27
- });
28
- if (!confirmed) {
29
- console.log('Cancelled.');
30
- process.exit(0);
31
- }
32
- // 3. Clear key from all storage locations
33
- const result = await clearApiKey();
34
- if (result.success) {
35
- console.log(chalk.green(`Logged out. Key removed from ${result.source}.`));
36
- }
37
- else {
38
- console.log(chalk.yellow(`Logged out (config file cleared), but could not remove from keyring: ${result.error}`));
39
- console.log(chalk.dim('The key may still be stored in your OS keyring.'));
40
- }
41
- process.exit(0);
42
- }
43
- export const logoutAction = withTelemetry(logoutActionImpl, {
44
- source: 'cli',
45
- extractSkillId: () => 'logout',
46
- extractFramework: () => 'cli',
47
- });
48
- /**
49
- * Create the `skillsmith logout` command.
50
- */
51
- export function createLogoutCommand() {
52
- return new Command('logout').description('Remove stored Skillsmith API key').action(logoutAction);
53
- }
54
- //# sourceMappingURL=logout.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE1D,2EAA2E;AAC3E,6EAA6E;AAC7E,KAAK,UAAU,gBAAgB;IAC7B,+CAA+C;IAC/C,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAA;IACpC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,6BAA6B;IAC7B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;QAC9B,OAAO,EAAE,oCAAoC;QAC7C,OAAO,EAAE,KAAK;KACf,CAAC,CAAA;IAEF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,0CAA0C;IAC1C,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAA;IAElC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC5E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,wEAAwE,MAAM,CAAC,KAAK,EAAE,CACvF,CACF,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAA;IAC3E,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC,gBAAgB,EAAE;IAC1D,MAAM,EAAE,KAAK;IACb,cAAc,EAAE,GAAG,EAAE,CAAC,QAAQ;IAC9B,gBAAgB,EAAE,GAAG,EAAE,CAAC,KAAK;CAC9B,CAAC,CAAA;AAEF;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;AACnG,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * SMI-2715: Logout Command Tests
3
- *
4
- * Tests for `skillsmith logout` — not-authenticated guard, confirmation prompt,
5
- * successful logout, and partial failure (keyring error) handling.
6
- */
7
- export {};
8
- //# sourceMappingURL=logout.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logout.test.d.ts","sourceRoot":"","sources":["../../../src/commands/logout.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,137 +0,0 @@
1
- /**
2
- * SMI-2715: Logout Command Tests
3
- *
4
- * Tests for `skillsmith logout` — not-authenticated guard, confirmation prompt,
5
- * successful logout, and partial failure (keyring error) handling.
6
- */
7
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
8
- // ---------------------------------------------------------------------------
9
- // Mocks
10
- // ---------------------------------------------------------------------------
11
- vi.mock('@skillsmith/core', () => ({
12
- getAuthStatus: vi.fn(),
13
- clearApiKey: vi.fn(),
14
- }));
15
- vi.mock('@inquirer/prompts', () => ({
16
- confirm: vi.fn(),
17
- }));
18
- // ---------------------------------------------------------------------------
19
- // Imports
20
- // ---------------------------------------------------------------------------
21
- import { createLogoutCommand } from './logout.js';
22
- import { getAuthStatus, clearApiKey } from '@skillsmith/core';
23
- import { confirm } from '@inquirer/prompts';
24
- const mockGetAuthStatus = vi.mocked(getAuthStatus);
25
- const mockClearApiKey = vi.mocked(clearApiKey);
26
- const mockConfirm = vi.mocked(confirm);
27
- // ---------------------------------------------------------------------------
28
- // Helpers
29
- // ---------------------------------------------------------------------------
30
- async function runCommand(args = []) {
31
- const cmd = createLogoutCommand();
32
- await cmd.parseAsync(['node', 'logout', ...args]);
33
- }
34
- // ---------------------------------------------------------------------------
35
- // Tests
36
- // ---------------------------------------------------------------------------
37
- describe('createLogoutCommand', () => {
38
- let consoleLogSpy;
39
- let processExitSpy;
40
- beforeEach(() => {
41
- // clearAllMocks resets call history on module-level mocks (declared above).
42
- // Must run BEFORE setting up spies so the spy implementations are not cleared.
43
- vi.clearAllMocks();
44
- consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
45
- processExitSpy = vi
46
- .spyOn(process, 'exit')
47
- .mockImplementation((code) => {
48
- throw new Error(`process.exit(${code ?? 0})`);
49
- });
50
- });
51
- afterEach(() => {
52
- consoleLogSpy.mockRestore();
53
- processExitSpy.mockRestore();
54
- });
55
- describe('command metadata', () => {
56
- it('has the correct name', () => {
57
- expect(createLogoutCommand().name()).toBe('logout');
58
- });
59
- it('has a description', () => {
60
- expect(createLogoutCommand().description()).toBeTruthy();
61
- });
62
- });
63
- describe('not authenticated guard', () => {
64
- it('exits 0 when not authenticated', async () => {
65
- mockGetAuthStatus.mockResolvedValue({
66
- authenticated: false,
67
- keyPrefix: null,
68
- source: 'none',
69
- });
70
- await expect(runCommand()).rejects.toThrow('process.exit(0)');
71
- const output = consoleLogSpy.mock.calls.flat().join('\n');
72
- expect(output).toContain('Not authenticated');
73
- expect(mockClearApiKey).not.toHaveBeenCalled();
74
- });
75
- });
76
- describe('confirmation prompt', () => {
77
- beforeEach(() => {
78
- mockGetAuthStatus.mockResolvedValue({
79
- authenticated: true,
80
- keyPrefix: 'sk_live_xxxx',
81
- source: 'keyring',
82
- });
83
- });
84
- it('cancels without clearing when user declines', async () => {
85
- mockConfirm.mockResolvedValue(false);
86
- await expect(runCommand()).rejects.toThrow('process.exit(0)');
87
- expect(mockClearApiKey).not.toHaveBeenCalled();
88
- const output = consoleLogSpy.mock.calls.flat().join('\n');
89
- expect(output).toContain('Cancelled');
90
- });
91
- it('clears key when user confirms', async () => {
92
- mockConfirm.mockResolvedValue(true);
93
- mockClearApiKey.mockResolvedValue({ success: true, source: 'keyring and config file' });
94
- await expect(runCommand()).rejects.toThrow('process.exit(0)');
95
- expect(mockClearApiKey).toHaveBeenCalledOnce();
96
- });
97
- });
98
- describe('successful logout', () => {
99
- beforeEach(() => {
100
- mockGetAuthStatus.mockResolvedValue({
101
- authenticated: true,
102
- keyPrefix: 'sk_live_xxxx',
103
- source: 'config',
104
- });
105
- mockConfirm.mockResolvedValue(true);
106
- });
107
- it('prints success message with source', async () => {
108
- mockClearApiKey.mockResolvedValue({ success: true, source: 'config file' });
109
- await expect(runCommand()).rejects.toThrow('process.exit(0)');
110
- const output = consoleLogSpy.mock.calls.flat().join('\n');
111
- expect(output).toContain('Logged out');
112
- expect(output).toContain('config file');
113
- });
114
- });
115
- describe('partial failure (keyring error)', () => {
116
- beforeEach(() => {
117
- mockGetAuthStatus.mockResolvedValue({
118
- authenticated: true,
119
- keyPrefix: 'sk_live_xxxx',
120
- source: 'keyring',
121
- });
122
- mockConfirm.mockResolvedValue(true);
123
- });
124
- it('warns about keyring error but still reports logout', async () => {
125
- mockClearApiKey.mockResolvedValue({
126
- success: false,
127
- source: 'config file',
128
- error: 'access denied',
129
- });
130
- await expect(runCommand()).rejects.toThrow('process.exit(0)');
131
- const output = consoleLogSpy.mock.calls.flat().join('\n');
132
- expect(output).toContain('access denied');
133
- expect(output).toContain('OS keyring');
134
- });
135
- });
136
- });
137
- //# sourceMappingURL=logout.test.js.map