@skillsmith/cli 0.7.1 → 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 +9 -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 -283
  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 -97
  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,149 +0,0 @@
1
- /**
2
- * Unit tests for tool-analyzer.ts pure logic functions
3
- *
4
- * Tests analyzeToolRequirements, formatToolList, parseToolsString, validateTools.
5
- * No mocking required — all functions are pure.
6
- */
7
- import { describe, it, expect } from 'vitest';
8
- import { analyzeToolRequirements, formatToolList, parseToolsString, validateTools, TOOL_PATTERNS, } from '../src/utils/tool-analyzer.js';
9
- // ============================================================================
10
- // analyzeToolRequirements
11
- // ============================================================================
12
- describe('analyzeToolRequirements', () => {
13
- it('always includes Read tool', () => {
14
- const result = analyzeToolRequirements('');
15
- expect(result.requiredTools).toContain('Read');
16
- });
17
- it('detects Write from content', () => {
18
- const result = analyzeToolRequirements('This skill will write files to disk');
19
- expect(result.requiredTools).toContain('Write');
20
- });
21
- it('detects Edit from content', () => {
22
- const result = analyzeToolRequirements('Modify existing configuration files');
23
- expect(result.requiredTools).toContain('Edit');
24
- });
25
- it('detects Bash from npm keyword', () => {
26
- const result = analyzeToolRequirements('Run npm install to set up dependencies');
27
- expect(result.requiredTools).toContain('Bash');
28
- });
29
- it('detects Bash from docker keyword', () => {
30
- const result = analyzeToolRequirements('Execute docker compose up');
31
- expect(result.requiredTools).toContain('Bash');
32
- });
33
- it('detects Bash from git keyword', () => {
34
- const result = analyzeToolRequirements('Use git commit to save changes');
35
- expect(result.requiredTools).toContain('Bash');
36
- });
37
- it('detects Grep from search keywords', () => {
38
- const result = analyzeToolRequirements('Search for all TODO comments');
39
- expect(result.requiredTools).toContain('Grep');
40
- });
41
- it('detects Glob from file pattern keywords', () => {
42
- const result = analyzeToolRequirements('Find files matching the pattern');
43
- expect(result.requiredTools).toContain('Glob');
44
- });
45
- it('detects WebFetch from http keywords', () => {
46
- const result = analyzeToolRequirements('Fetch data from http endpoints');
47
- expect(result.requiredTools).toContain('WebFetch');
48
- });
49
- it('detects WebSearch from search online keywords', () => {
50
- const result = analyzeToolRequirements('Search online for best practices');
51
- expect(result.requiredTools).toContain('WebSearch');
52
- });
53
- it('returns high confidence for 3+ pattern matches', () => {
54
- const result = analyzeToolRequirements('Write files, run npm commands, and search for patterns in the codebase');
55
- expect(result.confidence).toBe('high');
56
- });
57
- it('returns medium confidence for 1-2 pattern matches', () => {
58
- const result = analyzeToolRequirements('Edit a single configuration file');
59
- expect(result.confidence).toBe('medium');
60
- });
61
- it('returns low confidence for no pattern matches', () => {
62
- const result = analyzeToolRequirements('A purely informational skill');
63
- expect(result.confidence).toBe('low');
64
- });
65
- it('records detected patterns', () => {
66
- const result = analyzeToolRequirements('Write output to file and run npm build');
67
- expect(result.detectedPatterns.length).toBeGreaterThan(0);
68
- expect(result.detectedPatterns.some((p) => p.startsWith('Write:'))).toBe(true);
69
- expect(result.detectedPatterns.some((p) => p.startsWith('Bash:'))).toBe(true);
70
- });
71
- it('only matches one pattern per tool', () => {
72
- const result = analyzeToolRequirements('Write to file, save data, create file, generate file');
73
- const writePatterns = result.detectedPatterns.filter((p) => p.startsWith('Write:'));
74
- expect(writePatterns).toHaveLength(1);
75
- });
76
- it('is case-insensitive', () => {
77
- const result = analyzeToolRequirements('NPM INSTALL and DOCKER BUILD');
78
- expect(result.requiredTools).toContain('Bash');
79
- });
80
- it('requiredTools and recommendedTools are identical', () => {
81
- const result = analyzeToolRequirements('Write, edit, search, and run commands');
82
- expect(result.requiredTools).toEqual(result.recommendedTools);
83
- });
84
- });
85
- // ============================================================================
86
- // formatToolList
87
- // ============================================================================
88
- describe('formatToolList', () => {
89
- it('returns "Read" for empty array', () => {
90
- expect(formatToolList([])).toBe('Read');
91
- });
92
- it('joins tools with comma and space', () => {
93
- expect(formatToolList(['Read', 'Write', 'Bash'])).toBe('Read, Write, Bash');
94
- });
95
- it('returns single tool as-is', () => {
96
- expect(formatToolList(['Edit'])).toBe('Edit');
97
- });
98
- });
99
- // ============================================================================
100
- // parseToolsString
101
- // ============================================================================
102
- describe('parseToolsString', () => {
103
- it('parses comma-separated tools', () => {
104
- expect(parseToolsString('Read, Write, Bash')).toEqual(['Read', 'Write', 'Bash']);
105
- });
106
- it('trims whitespace', () => {
107
- expect(parseToolsString(' Read , Write ')).toEqual(['Read', 'Write']);
108
- });
109
- it('filters empty strings', () => {
110
- expect(parseToolsString('Read,,Write,')).toEqual(['Read', 'Write']);
111
- });
112
- it('handles single tool', () => {
113
- expect(parseToolsString('Read')).toEqual(['Read']);
114
- });
115
- it('returns empty array for empty string', () => {
116
- expect(parseToolsString('')).toEqual([]);
117
- });
118
- });
119
- // ============================================================================
120
- // validateTools
121
- // ============================================================================
122
- describe('validateTools', () => {
123
- it('validates known tools', () => {
124
- const result = validateTools(['Read', 'Write', 'Bash']);
125
- expect(result.valid).toBe(true);
126
- expect(result.unrecognized).toEqual([]);
127
- });
128
- it('reports unrecognized tools', () => {
129
- const result = validateTools(['Read', 'FlyToMoon']);
130
- expect(result.valid).toBe(false);
131
- expect(result.unrecognized).toEqual(['FlyToMoon']);
132
- });
133
- it('validates all TOOL_PATTERNS keys', () => {
134
- const allTools = Object.keys(TOOL_PATTERNS);
135
- const result = validateTools(allTools);
136
- expect(result.valid).toBe(true);
137
- });
138
- it('handles empty array', () => {
139
- const result = validateTools([]);
140
- expect(result.valid).toBe(true);
141
- expect(result.unrecognized).toEqual([]);
142
- });
143
- it('reports multiple unrecognized tools', () => {
144
- const result = validateTools(['FlyToMoon', 'TimeTravel']);
145
- expect(result.valid).toBe(false);
146
- expect(result.unrecognized).toHaveLength(2);
147
- });
148
- });
149
- //# sourceMappingURL=tool-analyzer.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-analyzer.test.js","sourceRoot":"","sources":["../../tests/tool-analyzer.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * SMI-3484: CLI Install Command Tests (Wave 1)
3
- *
4
- * Tests for the install command that installs skills from registry/GitHub.
5
- */
6
- export {};
7
- //# sourceMappingURL=install.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install.test.d.ts","sourceRoot":"","sources":["../../../../tests/unit/commands/install.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -1,482 +0,0 @@
1
- /**
2
- * SMI-3484: CLI Install Command Tests (Wave 1)
3
- *
4
- * Tests for the install command that installs skills from registry/GitHub.
5
- */
6
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
- import { Command } from 'commander';
8
- // ============================================================================
9
- // Mock Setup - Must be before imports
10
- // ============================================================================
11
- const mocks = vi.hoisted(() => ({
12
- spinner: {
13
- start: vi.fn().mockReturnThis(),
14
- stop: vi.fn().mockReturnThis(),
15
- succeed: vi.fn().mockReturnThis(),
16
- fail: vi.fn().mockReturnThis(),
17
- warn: vi.fn().mockReturnThis(),
18
- text: '',
19
- },
20
- installFn: vi.fn(),
21
- createDatabaseAsync: vi.fn(),
22
- initializeSchema: vi.fn(),
23
- dbClose: vi.fn(),
24
- // SMI-4795: hoisted so tests can assert install-telemetry payloads.
25
- emitInstallEvent: vi.fn(async (_payload) => undefined),
26
- }));
27
- vi.mock('ora', () => ({
28
- default: () => mocks.spinner,
29
- }));
30
- vi.mock('@skillsmith/core', () => ({
31
- createDatabaseAsync: (...args) => mocks.createDatabaseAsync(...args),
32
- initializeSchema: (...args) => mocks.initializeSchema(...args),
33
- SkillRepository: vi.fn().mockImplementation(function () {
34
- return {
35
- findById: vi.fn(() => null),
36
- findAll: vi.fn(() => ({ items: [], total: 0, limit: 1000, offset: 0, hasMore: false })),
37
- };
38
- }),
39
- SkillDependencyRepository: vi.fn().mockImplementation(function () {
40
- return {
41
- clearAll: vi.fn(),
42
- };
43
- }),
44
- SkillInstallationService: vi.fn().mockImplementation(function () {
45
- return {
46
- install: mocks.installFn,
47
- };
48
- }),
49
- isGitHubUrl: vi.fn((url) => url.startsWith('https://github.com/')),
50
- emitInstallEvent: (payload) => mocks.emitInstallEvent(payload),
51
- }));
52
- // Mock console and process.exit
53
- const originalConsoleLog = console.log;
54
- const originalConsoleError = console.error;
55
- const mockConsoleLog = vi.fn();
56
- const mockConsoleError = vi.fn();
57
- const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => undefined);
58
- // ============================================================================
59
- // Tests
60
- // ============================================================================
61
- describe('SMI-3484: CLI Install Command', () => {
62
- beforeEach(() => {
63
- vi.clearAllMocks();
64
- console.log = mockConsoleLog;
65
- console.error = mockConsoleError;
66
- // Default: database opens and closes successfully
67
- const mockDb = { close: mocks.dbClose };
68
- mocks.createDatabaseAsync.mockResolvedValue(mockDb);
69
- // Default: install succeeds
70
- mocks.installFn.mockResolvedValue({
71
- success: true,
72
- skillId: 'community/jest-helper',
73
- installPath: '/tmp/.claude/skills/jest-helper',
74
- trustTier: 'community',
75
- });
76
- });
77
- afterEach(() => {
78
- console.log = originalConsoleLog;
79
- console.error = originalConsoleError;
80
- });
81
- // ==========================================================================
82
- // Command Registration
83
- // ==========================================================================
84
- describe('command registration', () => {
85
- it('should create a Command instance named "install"', async () => {
86
- const { createInstallCommand } = await import('../../../src/commands/install.js');
87
- const cmd = createInstallCommand();
88
- expect(cmd).toBeInstanceOf(Command);
89
- expect(cmd.name()).toBe('install');
90
- });
91
- it('should have a description mentioning install', async () => {
92
- const { createInstallCommand } = await import('../../../src/commands/install.js');
93
- const cmd = createInstallCommand();
94
- expect(cmd.description().toLowerCase()).toContain('install');
95
- });
96
- it('should have --force option with short flag -f', async () => {
97
- const { createInstallCommand } = await import('../../../src/commands/install.js');
98
- const cmd = createInstallCommand();
99
- const forceOpt = cmd.options.find((o) => o.short === '-f');
100
- expect(forceOpt).toBeDefined();
101
- expect(forceOpt?.long).toBe('--force');
102
- });
103
- it('should have --skip-scan option', async () => {
104
- const { createInstallCommand } = await import('../../../src/commands/install.js');
105
- const cmd = createInstallCommand();
106
- const opt = cmd.options.find((o) => o.long === '--skip-scan');
107
- expect(opt).toBeDefined();
108
- });
109
- it('should have --skip-optimize option', async () => {
110
- const { createInstallCommand } = await import('../../../src/commands/install.js');
111
- const cmd = createInstallCommand();
112
- const opt = cmd.options.find((o) => o.long === '--skip-optimize');
113
- expect(opt).toBeDefined();
114
- });
115
- it('should have --quiet option with short flag -q', async () => {
116
- const { createInstallCommand } = await import('../../../src/commands/install.js');
117
- const cmd = createInstallCommand();
118
- const opt = cmd.options.find((o) => o.short === '-q');
119
- expect(opt).toBeDefined();
120
- expect(opt?.long).toBe('--quiet');
121
- });
122
- it('should have --json option', async () => {
123
- const { createInstallCommand } = await import('../../../src/commands/install.js');
124
- const cmd = createInstallCommand();
125
- const opt = cmd.options.find((o) => o.long === '--json');
126
- expect(opt).toBeDefined();
127
- });
128
- it('should have --db option with short flag -d', async () => {
129
- const { createInstallCommand } = await import('../../../src/commands/install.js');
130
- const cmd = createInstallCommand();
131
- const opt = cmd.options.find((o) => o.short === '-d');
132
- expect(opt).toBeDefined();
133
- expect(opt?.long).toBe('--db');
134
- });
135
- it('should require a skillId argument', async () => {
136
- const { createInstallCommand } = await import('../../../src/commands/install.js');
137
- const cmd = createInstallCommand();
138
- expect(cmd.registeredArguments.length).toBe(1);
139
- expect(cmd.registeredArguments[0]?.required).toBe(true);
140
- });
141
- });
142
- // ==========================================================================
143
- // Argument Parsing
144
- // ==========================================================================
145
- describe('argument parsing', () => {
146
- it('should accept valid author/name format', async () => {
147
- const { createInstallCommand } = await import('../../../src/commands/install.js');
148
- const cmd = createInstallCommand();
149
- await cmd.parseAsync(['node', 'test', 'community/jest-helper']);
150
- expect(mocks.installFn).toHaveBeenCalledWith('community/jest-helper', expect.any(Object));
151
- });
152
- it('should accept GitHub URL', async () => {
153
- const { createInstallCommand } = await import('../../../src/commands/install.js');
154
- const cmd = createInstallCommand();
155
- const url = 'https://github.com/owner/repo';
156
- await cmd.parseAsync(['node', 'test', url]);
157
- expect(mocks.installFn).toHaveBeenCalledWith(url, expect.any(Object));
158
- });
159
- it('should reject bare name without author prefix', async () => {
160
- const { createInstallCommand } = await import('../../../src/commands/install.js');
161
- const cmd = createInstallCommand();
162
- await cmd.parseAsync(['node', 'test', 'jest-helper']);
163
- expect(mockExit).toHaveBeenCalledWith(1);
164
- expect(mocks.installFn).not.toHaveBeenCalled();
165
- });
166
- it('should reject invalid format with multiple slashes', async () => {
167
- const { createInstallCommand } = await import('../../../src/commands/install.js');
168
- const cmd = createInstallCommand();
169
- await cmd.parseAsync(['node', 'test', 'a/b/c']);
170
- expect(mockExit).toHaveBeenCalledWith(1);
171
- expect(mocks.installFn).not.toHaveBeenCalled();
172
- });
173
- it('should reject empty author segment', async () => {
174
- const { createInstallCommand } = await import('../../../src/commands/install.js');
175
- const cmd = createInstallCommand();
176
- await cmd.parseAsync(['node', 'test', '/name']);
177
- expect(mockExit).toHaveBeenCalledWith(1);
178
- expect(mocks.installFn).not.toHaveBeenCalled();
179
- });
180
- });
181
- // ==========================================================================
182
- // Happy Path
183
- // ==========================================================================
184
- describe('happy path', () => {
185
- it('should install a skill and show success', async () => {
186
- const { createInstallCommand } = await import('../../../src/commands/install.js');
187
- const cmd = createInstallCommand();
188
- await cmd.parseAsync(['node', 'test', 'community/jest-helper']);
189
- expect(mocks.spinner.succeed).toHaveBeenCalledWith('Skill installed');
190
- expect(mocks.dbClose).toHaveBeenCalled();
191
- });
192
- it('should pass --force option to install service', async () => {
193
- const { createInstallCommand } = await import('../../../src/commands/install.js');
194
- const cmd = createInstallCommand();
195
- await cmd.parseAsync(['node', 'test', 'community/jest-helper', '--force']);
196
- expect(mocks.installFn).toHaveBeenCalledWith('community/jest-helper', expect.objectContaining({ force: true }));
197
- });
198
- it('should pass --skip-scan option to install service', async () => {
199
- const { createInstallCommand } = await import('../../../src/commands/install.js');
200
- const cmd = createInstallCommand();
201
- await cmd.parseAsync(['node', 'test', 'community/jest-helper', '--skip-scan']);
202
- expect(mocks.installFn).toHaveBeenCalledWith('community/jest-helper', expect.objectContaining({ skipScan: true }));
203
- });
204
- it('should pass --skip-optimize option to install service', async () => {
205
- const { createInstallCommand } = await import('../../../src/commands/install.js');
206
- const cmd = createInstallCommand();
207
- await cmd.parseAsync(['node', 'test', 'community/jest-helper', '--skip-optimize']);
208
- expect(mocks.installFn).toHaveBeenCalledWith('community/jest-helper', expect.objectContaining({ skipOptimize: true }));
209
- });
210
- it('should close database after successful install', async () => {
211
- const { createInstallCommand } = await import('../../../src/commands/install.js');
212
- const cmd = createInstallCommand();
213
- await cmd.parseAsync(['node', 'test', 'community/jest-helper']);
214
- expect(mocks.dbClose).toHaveBeenCalled();
215
- });
216
- });
217
- // ==========================================================================
218
- // Already Installed
219
- // ==========================================================================
220
- describe('already installed', () => {
221
- it('should fail when skill is already installed', async () => {
222
- mocks.installFn.mockResolvedValue({
223
- success: false,
224
- skillId: 'community/jest-helper',
225
- installPath: '/tmp/.claude/skills/jest-helper',
226
- error: 'Skill "jest-helper" is already installed. Use force=true to reinstall.',
227
- });
228
- const { createInstallCommand } = await import('../../../src/commands/install.js');
229
- const cmd = createInstallCommand();
230
- await cmd.parseAsync(['node', 'test', 'community/jest-helper']);
231
- expect(mocks.spinner.fail).toHaveBeenCalledWith('Installation failed');
232
- expect(mockExit).toHaveBeenCalledWith(1);
233
- });
234
- it('should succeed with --force when already installed', async () => {
235
- mocks.installFn.mockResolvedValue({
236
- success: true,
237
- skillId: 'community/jest-helper',
238
- installPath: '/tmp/.claude/skills/jest-helper',
239
- });
240
- const { createInstallCommand } = await import('../../../src/commands/install.js');
241
- const cmd = createInstallCommand();
242
- await cmd.parseAsync(['node', 'test', 'community/jest-helper', '--force']);
243
- expect(mocks.installFn).toHaveBeenCalledWith('community/jest-helper', expect.objectContaining({ force: true }));
244
- expect(mocks.spinner.succeed).toHaveBeenCalled();
245
- });
246
- });
247
- // ==========================================================================
248
- // --quiet Flag
249
- // ==========================================================================
250
- describe('--quiet flag', () => {
251
- it('should suppress advisory output when --quiet is set', async () => {
252
- mocks.installFn.mockResolvedValue({
253
- success: true,
254
- skillId: 'community/jest-helper',
255
- installPath: '/tmp/.claude/skills/jest-helper',
256
- tips: ['Tip: Use the skill by invoking /jest-helper'],
257
- optimization: {
258
- optimized: true,
259
- tokenReductionPercent: 30,
260
- subSkills: ['sub1.md'],
261
- },
262
- });
263
- const { createInstallCommand } = await import('../../../src/commands/install.js');
264
- const cmd = createInstallCommand();
265
- await cmd.parseAsync(['node', 'test', 'community/jest-helper', '--quiet']);
266
- // Tips and optimization info should be suppressed
267
- const allOutput = mockConsoleLog.mock.calls.map((c) => c.join(' ')).join('\n');
268
- expect(allOutput).not.toContain('Tip:');
269
- expect(allOutput).not.toContain('reduction');
270
- });
271
- it('should still show security-critical errors when --quiet is set', async () => {
272
- mocks.installFn.mockResolvedValue({
273
- success: false,
274
- skillId: 'community/dangerous-skill',
275
- installPath: '',
276
- error: 'Security scan failed with 2 critical/high findings',
277
- securityReport: {
278
- passed: false,
279
- riskScore: 85,
280
- findings: [{ severity: 'critical', message: 'Dangerous command execution detected' }],
281
- },
282
- });
283
- const { createInstallCommand } = await import('../../../src/commands/install.js');
284
- const cmd = createInstallCommand();
285
- await cmd.parseAsync(['node', 'test', 'community/dangerous-skill', '--quiet']);
286
- const errorOutput = mockConsoleError.mock.calls.map((c) => c.join(' ')).join('\n');
287
- expect(errorOutput).toContain('Security scan failed');
288
- });
289
- });
290
- // ==========================================================================
291
- // --json Flag
292
- // ==========================================================================
293
- describe('--json flag', () => {
294
- it('should output structured JSON on success', async () => {
295
- mocks.installFn.mockResolvedValue({
296
- success: true,
297
- skillId: 'community/jest-helper',
298
- installPath: '/tmp/.claude/skills/jest-helper',
299
- trustTier: 'community',
300
- });
301
- const { createInstallCommand } = await import('../../../src/commands/install.js');
302
- const cmd = createInstallCommand();
303
- await cmd.parseAsync(['node', 'test', 'community/jest-helper', '--json']);
304
- // Find the JSON output call
305
- const jsonCalls = mockConsoleLog.mock.calls.filter((c) => {
306
- try {
307
- JSON.parse(c[0]);
308
- return true;
309
- }
310
- catch {
311
- return false;
312
- }
313
- });
314
- expect(jsonCalls.length).toBeGreaterThan(0);
315
- const parsed = JSON.parse(jsonCalls[0][0]);
316
- expect(parsed.success).toBe(true);
317
- expect(parsed.skillId).toBe('community/jest-helper');
318
- expect(parsed.installPath).toBe('/tmp/.claude/skills/jest-helper');
319
- });
320
- it('should output structured JSON on failure', async () => {
321
- mocks.installFn.mockResolvedValue({
322
- success: false,
323
- skillId: 'community/missing',
324
- installPath: '',
325
- error: 'Skill not found',
326
- });
327
- const { createInstallCommand } = await import('../../../src/commands/install.js');
328
- const cmd = createInstallCommand();
329
- await cmd.parseAsync(['node', 'test', 'community/missing', '--json']);
330
- const jsonCalls = mockConsoleLog.mock.calls.filter((c) => {
331
- try {
332
- JSON.parse(c[0]);
333
- return true;
334
- }
335
- catch {
336
- return false;
337
- }
338
- });
339
- expect(jsonCalls.length).toBeGreaterThan(0);
340
- const parsed = JSON.parse(jsonCalls[0][0]);
341
- expect(parsed.success).toBe(false);
342
- expect(parsed.error).toBe('Skill not found');
343
- });
344
- it('should output JSON for invalid format errors', async () => {
345
- const { createInstallCommand } = await import('../../../src/commands/install.js');
346
- const cmd = createInstallCommand();
347
- await cmd.parseAsync(['node', 'test', 'invalid', '--json']);
348
- const jsonCalls = mockConsoleLog.mock.calls.filter((c) => {
349
- try {
350
- JSON.parse(c[0]);
351
- return true;
352
- }
353
- catch {
354
- return false;
355
- }
356
- });
357
- expect(jsonCalls.length).toBeGreaterThan(0);
358
- const parsed = JSON.parse(jsonCalls[0][0]);
359
- expect(parsed.success).toBe(false);
360
- expect(parsed.error).toContain('Invalid skill ID format');
361
- });
362
- it('should not show spinner when --json is set', async () => {
363
- const { createInstallCommand } = await import('../../../src/commands/install.js');
364
- const cmd = createInstallCommand();
365
- await cmd.parseAsync(['node', 'test', 'community/jest-helper', '--json']);
366
- // Spinner should not be started in JSON mode
367
- expect(mocks.spinner.start).not.toHaveBeenCalled();
368
- });
369
- });
370
- // ==========================================================================
371
- // Error Handling
372
- // ==========================================================================
373
- describe('error handling', () => {
374
- it('should exit with code 1 on install failure', async () => {
375
- mocks.installFn.mockResolvedValue({
376
- success: false,
377
- skillId: 'community/missing',
378
- installPath: '',
379
- error: 'Skill not found',
380
- });
381
- const { createInstallCommand } = await import('../../../src/commands/install.js');
382
- const cmd = createInstallCommand();
383
- await cmd.parseAsync(['node', 'test', 'community/missing']);
384
- expect(mockExit).toHaveBeenCalledWith(1);
385
- });
386
- it('should handle database connection errors', async () => {
387
- mocks.createDatabaseAsync.mockRejectedValue(new Error('Database locked'));
388
- const { createInstallCommand } = await import('../../../src/commands/install.js');
389
- const cmd = createInstallCommand();
390
- await cmd.parseAsync(['node', 'test', 'community/jest-helper']);
391
- expect(mockExit).toHaveBeenCalledWith(1);
392
- });
393
- it('should sanitize error messages', async () => {
394
- mocks.createDatabaseAsync.mockRejectedValue(new Error('Error at /Users/testuser/secret/path'));
395
- const { createInstallCommand } = await import('../../../src/commands/install.js');
396
- const cmd = createInstallCommand();
397
- await cmd.parseAsync(['node', 'test', 'community/jest-helper']);
398
- const errorOutput = mockConsoleError.mock.calls.map((c) => c.join(' ')).join(' ');
399
- expect(errorOutput).not.toContain('/Users/testuser/');
400
- });
401
- it('should close database even on error', async () => {
402
- mocks.installFn.mockRejectedValue(new Error('Unexpected error'));
403
- const { createInstallCommand } = await import('../../../src/commands/install.js');
404
- const cmd = createInstallCommand();
405
- await cmd.parseAsync(['node', 'test', 'community/jest-helper']);
406
- expect(mocks.dbClose).toHaveBeenCalled();
407
- });
408
- });
409
- // ==========================================================================
410
- // SMI-4795: install telemetry must thread errorCode + trustTier
411
- //
412
- // CLI emit site previously forwarded only {skillId, source, success,
413
- // durationMs}. After SMI-4795 trustTier is included on every event (when
414
- // the service surfaces it) and errorCode is included only on failures.
415
- // ==========================================================================
416
- describe('SMI-4795: emitInstallEvent receives errorCode + trustTier', () => {
417
- function getEmittedPayload() {
418
- const calls = mocks.emitInstallEvent.mock.calls;
419
- expect(calls.length).toBeGreaterThan(0);
420
- const firstCall = calls[0];
421
- expect(firstCall).toBeDefined();
422
- const payload = firstCall[0];
423
- expect(payload).toBeDefined();
424
- return payload;
425
- }
426
- it('forwards trustTier and errorCode on a failed install', async () => {
427
- mocks.installFn.mockResolvedValueOnce({
428
- success: false,
429
- skillId: 'community/jest-helper',
430
- installPath: '/tmp/.claude/skills/jest-helper',
431
- errorCode: 'SCAN_REJECTED',
432
- trustTier: 'community',
433
- error: 'Security scan failed',
434
- });
435
- const { createInstallCommand } = await import('../../../src/commands/install.js');
436
- const cmd = createInstallCommand();
437
- await cmd.parseAsync(['node', 'test', 'community/jest-helper']);
438
- expect(mocks.emitInstallEvent).toHaveBeenCalledTimes(1);
439
- const payload = getEmittedPayload();
440
- expect(payload).toMatchObject({
441
- skillId: 'community/jest-helper',
442
- source: 'cli',
443
- success: false,
444
- errorCode: 'SCAN_REJECTED',
445
- trustTier: 'community',
446
- });
447
- expect(typeof payload.durationMs).toBe('number');
448
- });
449
- it('forwards trustTier on success but omits errorCode', async () => {
450
- // Default beforeEach already returns success+trustTier:'community'.
451
- const { createInstallCommand } = await import('../../../src/commands/install.js');
452
- const cmd = createInstallCommand();
453
- await cmd.parseAsync(['node', 'test', 'community/jest-helper']);
454
- expect(mocks.emitInstallEvent).toHaveBeenCalledTimes(1);
455
- const payload = getEmittedPayload();
456
- expect(payload).toMatchObject({
457
- skillId: 'community/jest-helper',
458
- source: 'cli',
459
- success: true,
460
- trustTier: 'community',
461
- });
462
- expect(payload.errorCode).toBeUndefined();
463
- });
464
- it('omits both fields when service result lacks them', async () => {
465
- mocks.installFn.mockResolvedValueOnce({
466
- success: false,
467
- skillId: 'community/jest-helper',
468
- installPath: '',
469
- error: 'legacy failure',
470
- });
471
- const { createInstallCommand } = await import('../../../src/commands/install.js');
472
- const cmd = createInstallCommand();
473
- await cmd.parseAsync(['node', 'test', 'community/jest-helper']);
474
- expect(mocks.emitInstallEvent).toHaveBeenCalledTimes(1);
475
- const payload = getEmittedPayload();
476
- expect(payload.errorCode).toBeUndefined();
477
- expect(payload.trustTier).toBeUndefined();
478
- expect(payload.success).toBe(false);
479
- });
480
- });
481
- });
482
- //# sourceMappingURL=install.test.js.map