intershell 0.3.0

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 (357) hide show
  1. package/README.md +301 -0
  2. package/dist/commands/ci/act.d.ts +13 -0
  3. package/dist/commands/ci/act.d.ts.map +1 -0
  4. package/dist/commands/ci/act.js +89 -0
  5. package/dist/commands/ci/act.js.map +1 -0
  6. package/dist/commands/ci/attach-affected.d.ts +12 -0
  7. package/dist/commands/ci/attach-affected.d.ts.map +1 -0
  8. package/dist/commands/ci/attach-affected.js +83 -0
  9. package/dist/commands/ci/attach-affected.js.map +1 -0
  10. package/dist/commands/ci/attach-service-ports.d.ts +10 -0
  11. package/dist/commands/ci/attach-service-ports.d.ts.map +1 -0
  12. package/dist/commands/ci/attach-service-ports.js +25 -0
  13. package/dist/commands/ci/attach-service-ports.js.map +1 -0
  14. package/dist/commands/commit-check.d.ts +13 -0
  15. package/dist/commands/commit-check.d.ts.map +1 -0
  16. package/dist/commands/commit-check.js +110 -0
  17. package/dist/commands/commit-check.js.map +1 -0
  18. package/dist/commands/commit.d.ts +16 -0
  19. package/dist/commands/commit.d.ts.map +1 -0
  20. package/dist/commands/commit.js +91 -0
  21. package/dist/commands/commit.js.map +1 -0
  22. package/dist/commands/dev/check.d.ts +13 -0
  23. package/dist/commands/dev/check.d.ts.map +1 -0
  24. package/dist/commands/dev/check.js +91 -0
  25. package/dist/commands/dev/check.js.map +1 -0
  26. package/dist/commands/dev/cleanup.d.ts +10 -0
  27. package/dist/commands/dev/cleanup.d.ts.map +1 -0
  28. package/dist/commands/dev/cleanup.js +28 -0
  29. package/dist/commands/dev/cleanup.js.map +1 -0
  30. package/dist/commands/dev/rm.d.ts +12 -0
  31. package/dist/commands/dev/rm.d.ts.map +1 -0
  32. package/dist/commands/dev/rm.js +49 -0
  33. package/dist/commands/dev/rm.js.map +1 -0
  34. package/dist/commands/dev/setup.d.ts +10 -0
  35. package/dist/commands/dev/setup.d.ts.map +1 -0
  36. package/dist/commands/dev/setup.js +40 -0
  37. package/dist/commands/dev/setup.js.map +1 -0
  38. package/dist/commands/local/cleanup.d.ts +12 -0
  39. package/dist/commands/local/cleanup.d.ts.map +1 -0
  40. package/dist/commands/local/cleanup.js +62 -0
  41. package/dist/commands/local/cleanup.js.map +1 -0
  42. package/dist/commands/local/setup.d.ts +11 -0
  43. package/dist/commands/local/setup.d.ts.map +1 -0
  44. package/dist/commands/local/setup.js +55 -0
  45. package/dist/commands/local/setup.js.map +1 -0
  46. package/dist/commands/local/vscode.d.ts +17 -0
  47. package/dist/commands/local/vscode.d.ts.map +1 -0
  48. package/dist/commands/local/vscode.js +94 -0
  49. package/dist/commands/local/vscode.js.map +1 -0
  50. package/dist/commands/update-package-json.d.ts +12 -0
  51. package/dist/commands/update-package-json.d.ts.map +1 -0
  52. package/dist/commands/update-package-json.js +82 -0
  53. package/dist/commands/update-package-json.js.map +1 -0
  54. package/dist/commands/version/apply.d.ts +16 -0
  55. package/dist/commands/version/apply.d.ts.map +1 -0
  56. package/dist/commands/version/apply.js +120 -0
  57. package/dist/commands/version/apply.js.map +1 -0
  58. package/dist/commands/version/ci.d.ts +12 -0
  59. package/dist/commands/version/ci.d.ts.map +1 -0
  60. package/dist/commands/version/ci.js +67 -0
  61. package/dist/commands/version/ci.js.map +1 -0
  62. package/dist/commands/version/prepare.d.ts +19 -0
  63. package/dist/commands/version/prepare.d.ts.map +1 -0
  64. package/dist/commands/version/prepare.js +153 -0
  65. package/dist/commands/version/prepare.js.map +1 -0
  66. package/dist/core/colorify.d.ts +21 -0
  67. package/dist/core/colorify.d.ts.map +1 -0
  68. package/dist/core/colorify.js +56 -0
  69. package/dist/core/colorify.js.map +1 -0
  70. package/dist/core/index.d.ts +4 -0
  71. package/dist/core/index.d.ts.map +1 -0
  72. package/dist/core/index.js +3 -0
  73. package/dist/core/index.js.map +1 -0
  74. package/dist/core/types.d.ts +181 -0
  75. package/dist/core/types.d.ts.map +1 -0
  76. package/dist/core/types.js +5 -0
  77. package/dist/core/types.js.map +1 -0
  78. package/dist/core/wrapshell.d.ts +19 -0
  79. package/dist/core/wrapshell.d.ts.map +1 -0
  80. package/dist/core/wrapshell.js +323 -0
  81. package/dist/core/wrapshell.js.map +1 -0
  82. package/dist/entities/affected/affected.d.ts +4 -0
  83. package/dist/entities/affected/affected.d.ts.map +1 -0
  84. package/dist/entities/affected/affected.js +20 -0
  85. package/dist/entities/affected/affected.js.map +1 -0
  86. package/dist/entities/affected/affected.test.d.ts +2 -0
  87. package/dist/entities/affected/affected.test.d.ts.map +1 -0
  88. package/dist/entities/affected/affected.test.js +305 -0
  89. package/dist/entities/affected/affected.test.js.map +1 -0
  90. package/dist/entities/affected/index.d.ts +2 -0
  91. package/dist/entities/affected/index.d.ts.map +1 -0
  92. package/dist/entities/affected/index.js +2 -0
  93. package/dist/entities/affected/index.js.map +1 -0
  94. package/dist/entities/branch/branch.d.ts +8 -0
  95. package/dist/entities/branch/branch.d.ts.map +1 -0
  96. package/dist/entities/branch/branch.js +74 -0
  97. package/dist/entities/branch/branch.js.map +1 -0
  98. package/dist/entities/branch/branch.test.d.ts +2 -0
  99. package/dist/entities/branch/branch.test.d.ts.map +1 -0
  100. package/dist/entities/branch/branch.test.js +316 -0
  101. package/dist/entities/branch/branch.test.js.map +1 -0
  102. package/dist/entities/branch/branch.types.d.ts +6 -0
  103. package/dist/entities/branch/branch.types.d.ts.map +1 -0
  104. package/dist/entities/branch/branch.types.js +2 -0
  105. package/dist/entities/branch/branch.types.js.map +1 -0
  106. package/dist/entities/branch/index.d.ts +3 -0
  107. package/dist/entities/branch/index.d.ts.map +1 -0
  108. package/dist/entities/branch/index.js +3 -0
  109. package/dist/entities/branch/index.js.map +1 -0
  110. package/dist/entities/commit/commit.d.ts +15 -0
  111. package/dist/entities/commit/commit.d.ts.map +1 -0
  112. package/dist/entities/commit/commit.js +196 -0
  113. package/dist/entities/commit/commit.js.map +1 -0
  114. package/dist/entities/commit/commit.test.d.ts +26 -0
  115. package/dist/entities/commit/commit.test.d.ts.map +1 -0
  116. package/dist/entities/commit/commit.test.js +550 -0
  117. package/dist/entities/commit/commit.test.js.map +1 -0
  118. package/dist/entities/commit/commit.types.d.ts +49 -0
  119. package/dist/entities/commit/commit.types.d.ts.map +1 -0
  120. package/dist/entities/commit/commit.types.js +31 -0
  121. package/dist/entities/commit/commit.types.js.map +1 -0
  122. package/dist/entities/commit/index.d.ts +3 -0
  123. package/dist/entities/commit/index.d.ts.map +1 -0
  124. package/dist/entities/commit/index.js +3 -0
  125. package/dist/entities/commit/index.js.map +1 -0
  126. package/dist/entities/commit/pr.d.ts +11 -0
  127. package/dist/entities/commit/pr.d.ts.map +1 -0
  128. package/dist/entities/commit/pr.js +201 -0
  129. package/dist/entities/commit/pr.js.map +1 -0
  130. package/dist/entities/commit/pr.test.d.ts +2 -0
  131. package/dist/entities/commit/pr.test.d.ts.map +1 -0
  132. package/dist/entities/commit/pr.test.js +782 -0
  133. package/dist/entities/commit/pr.test.js.map +1 -0
  134. package/dist/entities/compose/compose.d.ts +18 -0
  135. package/dist/entities/compose/compose.d.ts.map +1 -0
  136. package/dist/entities/compose/compose.js +197 -0
  137. package/dist/entities/compose/compose.js.map +1 -0
  138. package/dist/entities/compose/compose.test.d.ts +2 -0
  139. package/dist/entities/compose/compose.test.d.ts.map +1 -0
  140. package/dist/entities/compose/compose.test.js +406 -0
  141. package/dist/entities/compose/compose.test.js.map +1 -0
  142. package/dist/entities/compose/compose.types.d.ts +77 -0
  143. package/dist/entities/compose/compose.types.d.ts.map +1 -0
  144. package/dist/entities/compose/compose.types.js +2 -0
  145. package/dist/entities/compose/compose.types.js.map +1 -0
  146. package/dist/entities/compose/index.d.ts +3 -0
  147. package/dist/entities/compose/index.d.ts.map +1 -0
  148. package/dist/entities/compose/index.js +3 -0
  149. package/dist/entities/compose/index.js.map +1 -0
  150. package/dist/entities/entities.shell.d.ts +29 -0
  151. package/dist/entities/entities.shell.d.ts.map +1 -0
  152. package/dist/entities/entities.shell.js +27 -0
  153. package/dist/entities/entities.shell.js.map +1 -0
  154. package/dist/entities/entities.shell.test.d.ts +2 -0
  155. package/dist/entities/entities.shell.test.d.ts.map +1 -0
  156. package/dist/entities/entities.shell.test.js +23 -0
  157. package/dist/entities/entities.shell.test.js.map +1 -0
  158. package/dist/entities/index.d.ts +12 -0
  159. package/dist/entities/index.d.ts.map +1 -0
  160. package/dist/entities/index.js +12 -0
  161. package/dist/entities/index.js.map +1 -0
  162. package/dist/entities/intershell-config/intershell-config.d.ts +11 -0
  163. package/dist/entities/intershell-config/intershell-config.d.ts.map +1 -0
  164. package/dist/entities/intershell-config/intershell-config.default.d.ts +188 -0
  165. package/dist/entities/intershell-config/intershell-config.default.d.ts.map +1 -0
  166. package/dist/entities/intershell-config/intershell-config.default.js +225 -0
  167. package/dist/entities/intershell-config/intershell-config.default.js.map +1 -0
  168. package/dist/entities/intershell-config/intershell-config.js +132 -0
  169. package/dist/entities/intershell-config/intershell-config.js.map +1 -0
  170. package/dist/entities/intershell-config/intershell-config.test.d.ts +2 -0
  171. package/dist/entities/intershell-config/intershell-config.test.d.ts.map +1 -0
  172. package/dist/entities/intershell-config/intershell-config.test.js +102 -0
  173. package/dist/entities/intershell-config/intershell-config.test.js.map +1 -0
  174. package/dist/entities/intershell-config/intershell-config.types.d.ts +103 -0
  175. package/dist/entities/intershell-config/intershell-config.types.d.ts.map +1 -0
  176. package/dist/entities/intershell-config/intershell-config.types.js +2 -0
  177. package/dist/entities/intershell-config/intershell-config.types.js.map +1 -0
  178. package/dist/entities/package/index.d.ts +4 -0
  179. package/dist/entities/package/index.d.ts.map +1 -0
  180. package/dist/entities/package/index.js +4 -0
  181. package/dist/entities/package/index.js.map +1 -0
  182. package/dist/entities/package/package.d.ts +49 -0
  183. package/dist/entities/package/package.d.ts.map +1 -0
  184. package/dist/entities/package/package.js +234 -0
  185. package/dist/entities/package/package.js.map +1 -0
  186. package/dist/entities/package/package.shell.d.ts +48 -0
  187. package/dist/entities/package/package.shell.d.ts.map +1 -0
  188. package/dist/entities/package/package.shell.js +118 -0
  189. package/dist/entities/package/package.shell.js.map +1 -0
  190. package/dist/entities/package/package.test.d.ts +23 -0
  191. package/dist/entities/package/package.test.d.ts.map +1 -0
  192. package/dist/entities/package/package.test.js +637 -0
  193. package/dist/entities/package/package.test.js.map +1 -0
  194. package/dist/entities/package/package.types.d.ts +48 -0
  195. package/dist/entities/package/package.types.d.ts.map +1 -0
  196. package/dist/entities/package/package.types.js +2 -0
  197. package/dist/entities/package/package.types.js.map +1 -0
  198. package/dist/entities/package-changelog/index.d.ts +4 -0
  199. package/dist/entities/package-changelog/index.d.ts.map +1 -0
  200. package/dist/entities/package-changelog/index.js +4 -0
  201. package/dist/entities/package-changelog/index.js.map +1 -0
  202. package/dist/entities/package-changelog/package-changelog.d.ts +20 -0
  203. package/dist/entities/package-changelog/package-changelog.d.ts.map +1 -0
  204. package/dist/entities/package-changelog/package-changelog.js +59 -0
  205. package/dist/entities/package-changelog/package-changelog.js.map +1 -0
  206. package/dist/entities/package-changelog/package-changelog.types.d.ts +25 -0
  207. package/dist/entities/package-changelog/package-changelog.types.d.ts.map +1 -0
  208. package/dist/entities/package-changelog/package-changelog.types.js +2 -0
  209. package/dist/entities/package-changelog/package-changelog.types.js.map +1 -0
  210. package/dist/entities/package-changelog/template.d.ts +20 -0
  211. package/dist/entities/package-changelog/template.d.ts.map +1 -0
  212. package/dist/entities/package-changelog/template.default.d.ts +10 -0
  213. package/dist/entities/package-changelog/template.default.d.ts.map +1 -0
  214. package/dist/entities/package-changelog/template.default.js +85 -0
  215. package/dist/entities/package-changelog/template.default.js.map +1 -0
  216. package/dist/entities/package-changelog/template.js +90 -0
  217. package/dist/entities/package-changelog/template.js.map +1 -0
  218. package/dist/entities/package-commits/dependency-analyzer.d.ts +35 -0
  219. package/dist/entities/package-commits/dependency-analyzer.d.ts.map +1 -0
  220. package/dist/entities/package-commits/dependency-analyzer.js +169 -0
  221. package/dist/entities/package-commits/dependency-analyzer.js.map +1 -0
  222. package/dist/entities/package-commits/dependency-analyzer.test.d.ts +2 -0
  223. package/dist/entities/package-commits/dependency-analyzer.test.d.ts.map +1 -0
  224. package/dist/entities/package-commits/dependency-analyzer.test.js +25 -0
  225. package/dist/entities/package-commits/dependency-analyzer.test.js.map +1 -0
  226. package/dist/entities/package-commits/index.d.ts +3 -0
  227. package/dist/entities/package-commits/index.d.ts.map +1 -0
  228. package/dist/entities/package-commits/index.js +3 -0
  229. package/dist/entities/package-commits/index.js.map +1 -0
  230. package/dist/entities/package-commits/package-commits.d.ts +33 -0
  231. package/dist/entities/package-commits/package-commits.d.ts.map +1 -0
  232. package/dist/entities/package-commits/package-commits.js +149 -0
  233. package/dist/entities/package-commits/package-commits.js.map +1 -0
  234. package/dist/entities/package-commits/package-commits.test.d.ts +2 -0
  235. package/dist/entities/package-commits/package-commits.test.d.ts.map +1 -0
  236. package/dist/entities/package-commits/package-commits.test.js +40 -0
  237. package/dist/entities/package-commits/package-commits.test.js.map +1 -0
  238. package/dist/entities/package-tags/index.d.ts +2 -0
  239. package/dist/entities/package-tags/index.d.ts.map +1 -0
  240. package/dist/entities/package-tags/index.js +2 -0
  241. package/dist/entities/package-tags/index.js.map +1 -0
  242. package/dist/entities/package-tags/package-tags.d.ts +24 -0
  243. package/dist/entities/package-tags/package-tags.d.ts.map +1 -0
  244. package/dist/entities/package-tags/package-tags.js +197 -0
  245. package/dist/entities/package-tags/package-tags.js.map +1 -0
  246. package/dist/entities/package-tags/package-tags.test.d.ts +2 -0
  247. package/dist/entities/package-tags/package-tags.test.d.ts.map +1 -0
  248. package/dist/entities/package-tags/package-tags.test.js +60 -0
  249. package/dist/entities/package-tags/package-tags.test.js.map +1 -0
  250. package/dist/entities/package-version/index.d.ts +3 -0
  251. package/dist/entities/package-version/index.d.ts.map +1 -0
  252. package/dist/entities/package-version/index.js +3 -0
  253. package/dist/entities/package-version/index.js.map +1 -0
  254. package/dist/entities/package-version/package-version.d.ts +16 -0
  255. package/dist/entities/package-version/package-version.d.ts.map +1 -0
  256. package/dist/entities/package-version/package-version.js +166 -0
  257. package/dist/entities/package-version/package-version.js.map +1 -0
  258. package/dist/entities/package-version/package-version.test.d.ts +2 -0
  259. package/dist/entities/package-version/package-version.test.d.ts.map +1 -0
  260. package/dist/entities/package-version/package-version.test.js +113 -0
  261. package/dist/entities/package-version/package-version.test.js.map +1 -0
  262. package/dist/entities/package-version/package-version.types.d.ts +31 -0
  263. package/dist/entities/package-version/package-version.types.d.ts.map +1 -0
  264. package/dist/entities/package-version/package-version.types.js +2 -0
  265. package/dist/entities/package-version/package-version.types.js.map +1 -0
  266. package/dist/entities/tag/index.d.ts +3 -0
  267. package/dist/entities/tag/index.d.ts.map +1 -0
  268. package/dist/entities/tag/index.js +3 -0
  269. package/dist/entities/tag/index.js.map +1 -0
  270. package/dist/entities/tag/tag.d.ts +24 -0
  271. package/dist/entities/tag/tag.d.ts.map +1 -0
  272. package/dist/entities/tag/tag.js +168 -0
  273. package/dist/entities/tag/tag.js.map +1 -0
  274. package/dist/entities/tag/tag.test.d.ts +2 -0
  275. package/dist/entities/tag/tag.test.d.ts.map +1 -0
  276. package/dist/entities/tag/tag.test.js +638 -0
  277. package/dist/entities/tag/tag.test.js.map +1 -0
  278. package/dist/entities/tag/tag.types.d.ts +35 -0
  279. package/dist/entities/tag/tag.types.d.ts.map +1 -0
  280. package/dist/entities/tag/tag.types.js +2 -0
  281. package/dist/entities/tag/tag.types.js.map +1 -0
  282. package/dist/index.d.ts +3 -0
  283. package/dist/index.d.ts.map +1 -0
  284. package/dist/index.js +6 -0
  285. package/dist/index.js.map +1 -0
  286. package/package.json +73 -0
  287. package/src/commands/ci/act.ts +95 -0
  288. package/src/commands/ci/attach-affected.ts +93 -0
  289. package/src/commands/ci/attach-service-ports.ts +31 -0
  290. package/src/commands/commit-check.ts +124 -0
  291. package/src/commands/commit.ts +103 -0
  292. package/src/commands/dev/check.ts +117 -0
  293. package/src/commands/dev/cleanup.ts +34 -0
  294. package/src/commands/dev/rm.ts +66 -0
  295. package/src/commands/dev/setup.ts +48 -0
  296. package/src/commands/local/cleanup.ts +74 -0
  297. package/src/commands/local/setup.ts +68 -0
  298. package/src/commands/local/vscode.ts +118 -0
  299. package/src/commands/update-package-json.ts +104 -0
  300. package/src/commands/version/apply.ts +156 -0
  301. package/src/commands/version/ci.ts +85 -0
  302. package/src/commands/version/prepare.ts +217 -0
  303. package/src/core/colorify.ts +61 -0
  304. package/src/core/index.ts +3 -0
  305. package/src/core/types.ts +262 -0
  306. package/src/core/wrapshell.ts +388 -0
  307. package/src/entities/affected/affected.test.ts +427 -0
  308. package/src/entities/affected/affected.ts +22 -0
  309. package/src/entities/affected/index.ts +1 -0
  310. package/src/entities/branch/branch.test.ts +348 -0
  311. package/src/entities/branch/branch.ts +89 -0
  312. package/src/entities/branch/branch.types.ts +5 -0
  313. package/src/entities/branch/index.ts +2 -0
  314. package/src/entities/commit/commit.test.ts +769 -0
  315. package/src/entities/commit/commit.ts +245 -0
  316. package/src/entities/commit/commit.types.ts +81 -0
  317. package/src/entities/commit/index.ts +2 -0
  318. package/src/entities/commit/pr.test.ts +860 -0
  319. package/src/entities/commit/pr.ts +241 -0
  320. package/src/entities/compose/compose.test.ts +496 -0
  321. package/src/entities/compose/compose.ts +251 -0
  322. package/src/entities/compose/compose.types.ts +88 -0
  323. package/src/entities/compose/index.ts +2 -0
  324. package/src/entities/entities.shell.test.ts +35 -0
  325. package/src/entities/entities.shell.ts +81 -0
  326. package/src/entities/index.ts +11 -0
  327. package/src/entities/intershell-config/intershell-config.default.ts +229 -0
  328. package/src/entities/intershell-config/intershell-config.test.ts +117 -0
  329. package/src/entities/intershell-config/intershell-config.ts +143 -0
  330. package/src/entities/intershell-config/intershell-config.types.ts +118 -0
  331. package/src/entities/package/index.ts +3 -0
  332. package/src/entities/package/package.shell.ts +124 -0
  333. package/src/entities/package/package.test.ts +830 -0
  334. package/src/entities/package/package.ts +267 -0
  335. package/src/entities/package/package.types.ts +49 -0
  336. package/src/entities/package-changelog/index.ts +3 -0
  337. package/src/entities/package-changelog/package-changelog.ts +81 -0
  338. package/src/entities/package-changelog/package-changelog.types.ts +30 -0
  339. package/src/entities/package-changelog/template.default.ts +109 -0
  340. package/src/entities/package-changelog/template.ts +118 -0
  341. package/src/entities/package-commits/dependency-analyzer.test.ts +29 -0
  342. package/src/entities/package-commits/dependency-analyzer.ts +194 -0
  343. package/src/entities/package-commits/index.ts +2 -0
  344. package/src/entities/package-commits/package-commits.test.ts +44 -0
  345. package/src/entities/package-commits/package-commits.ts +191 -0
  346. package/src/entities/package-tags/index.ts +1 -0
  347. package/src/entities/package-tags/package-tags.test.ts +73 -0
  348. package/src/entities/package-tags/package-tags.ts +234 -0
  349. package/src/entities/package-version/index.ts +2 -0
  350. package/src/entities/package-version/package-version.test.ts +141 -0
  351. package/src/entities/package-version/package-version.ts +234 -0
  352. package/src/entities/package-version/package-version.types.ts +35 -0
  353. package/src/entities/tag/index.ts +2 -0
  354. package/src/entities/tag/tag.test.ts +844 -0
  355. package/src/entities/tag/tag.ts +208 -0
  356. package/src/entities/tag/tag.types.ts +37 -0
  357. package/src/index.ts +7 -0
@@ -0,0 +1,234 @@
1
+ import { entitiesShell } from "../entities.shell";
2
+ import { EntityPackage } from "../package";
3
+ import { EntityPackageCommits } from "../package-commits";
4
+ import type {
5
+ EntityGitTagVersion,
6
+ EntityPackageVersionHistory,
7
+ } from "../package-version/package-version.types";
8
+ import { EntityTag } from "../tag";
9
+
10
+ export class EntityPackageTags {
11
+ private package: EntityPackage;
12
+ private packageCommits: EntityPackageCommits;
13
+
14
+ constructor(packageInstance: EntityPackage) {
15
+ this.package = packageInstance;
16
+ this.packageCommits = new EntityPackageCommits(this.package);
17
+ }
18
+
19
+ async getTagPrefix(): Promise<string> {
20
+ return this.package.getTagSeriesName() || "v";
21
+ }
22
+
23
+ async createPackageTag(version: string, message?: string): Promise<void> {
24
+ const prefix = await this.getTagPrefix();
25
+ const tagName = `${prefix}${version}`;
26
+ const tagMessage = message || `Release ${this.package.getName()} version ${version}`;
27
+
28
+ // Validate the tag prefix for this package before creating the tag
29
+ this.validateTagPrefixForPackage(tagName);
30
+
31
+ await EntityTag.createTag(tagName, tagMessage);
32
+ }
33
+
34
+ async listPackageTags(): Promise<string[]> {
35
+ return await EntityTag.listTags(await this.getTagPrefix());
36
+ }
37
+
38
+ async packageTagExists(version: string): Promise<boolean> {
39
+ const prefix = await this.getTagPrefix();
40
+ const tagName = `${prefix}${version}`;
41
+ return await EntityTag.tagExists(tagName);
42
+ }
43
+
44
+ // Convenience methods for changelog and scripts
45
+ async getBaseTagShaForPackage(from?: string): Promise<string> {
46
+ if (!from) {
47
+ const latestTag = await EntityTag.getLatestTag(await this.getTagPrefix());
48
+ if (latestTag) {
49
+ return await EntityTag.getTagSha(latestTag);
50
+ }
51
+ // For first-time versioning, find the first commit where this specific package was introduced
52
+ return await this.packageCommits.getFirstCommitForPackage();
53
+ }
54
+
55
+ // Check if it's already a valid reference
56
+ try {
57
+ return await EntityTag.getTagSha(from);
58
+ } catch {
59
+ // Fall back to generic commit resolution
60
+ return await EntityTag.getBaseCommitSha(from);
61
+ }
62
+ }
63
+
64
+ async getTagsInRangeForPackage(
65
+ from: string,
66
+ to: string,
67
+ ): Promise<Array<{ tag: string; previousTag?: string }>> {
68
+ const allTags = await this.listPackageTags();
69
+
70
+ // Find tags between from and to commits
71
+ const tagsInRange: Array<{ tag: string; previousTag?: string }> = [];
72
+
73
+ for (let i = 0; i < allTags.length; i++) {
74
+ const tag = allTags[i];
75
+ try {
76
+ const tagSha = await EntityTag.getTagSha(tag);
77
+
78
+ // Check if tag is in the commit range using git merge-base
79
+ const isAfterFrom = await entitiesShell.gitMergeBaseIsAncestor(from, tagSha);
80
+ const isBeforeTo = await entitiesShell.gitMergeBaseIsAncestor(tagSha, to);
81
+
82
+ if (isAfterFrom.exitCode === 0 && isBeforeTo.exitCode === 0) {
83
+ tagsInRange.push({
84
+ tag,
85
+ previousTag: i < allTags.length - 1 ? allTags[i + 1] : undefined,
86
+ });
87
+ }
88
+ } catch (error) {
89
+ console.warn(`Failed to process tag ${tag}:`, error);
90
+ }
91
+ }
92
+
93
+ return tagsInRange;
94
+ }
95
+
96
+ // Version history and tracking
97
+ async getPackageVersionHistory(): Promise<EntityPackageVersionHistory> {
98
+ try {
99
+ const tags = await this.listPackageTags();
100
+ const versions: EntityGitTagVersion[] = [];
101
+
102
+ for (const tag of tags) {
103
+ try {
104
+ const versionData = await this.getPackageVersionAtTag(tag);
105
+ if (versionData) {
106
+ versions.push(versionData);
107
+ }
108
+ } catch (error) {
109
+ console.warn(`Failed to get version for tag ${tag}:`, error);
110
+ }
111
+ }
112
+
113
+ // Sort by semantic version (newest first)
114
+ versions.sort((a, b) => this.compareVersions(b.version, a.version));
115
+
116
+ return {
117
+ packageName: this.package.getName(),
118
+ versions,
119
+ };
120
+ } catch (error) {
121
+ console.warn("Failed to get git tags:", error);
122
+ return {
123
+ packageName: this.package.getName(),
124
+ versions: [],
125
+ };
126
+ }
127
+ }
128
+
129
+ async getLatestPackageVersionInHistory(): Promise<string | null> {
130
+ const history = await this.getPackageVersionHistory();
131
+ return history.versions.length > 0 ? history.versions[0].version : null;
132
+ }
133
+
134
+ async packageVersionExistsInHistory(version: string): Promise<boolean> {
135
+ const history = await this.getPackageVersionHistory();
136
+ return history.versions.some((v) => v.version === version);
137
+ }
138
+
139
+ async getPackageVersionAtTag(tagName: string): Promise<EntityGitTagVersion | null> {
140
+ try {
141
+ const packageJsonPath = this.package.getJsonPath().replace(/^\.\//, "");
142
+
143
+ const result = await entitiesShell.gitShowPackageJsonAtTag(tagName, packageJsonPath);
144
+ if (result.exitCode !== 0) {
145
+ return null;
146
+ }
147
+
148
+ const packageJson = JSON.parse(result.text());
149
+ const version = packageJson.version;
150
+ if (!version) {
151
+ return null;
152
+ }
153
+
154
+ const tagInfo = await EntityTag.getTagInfo(tagName);
155
+ const tagSha = await EntityTag.getTagSha(tagName);
156
+
157
+ return {
158
+ tag: tagName,
159
+ version,
160
+ commitHash: tagSha,
161
+ date: new Date(tagInfo.date),
162
+ };
163
+ } catch (error) {
164
+ console.warn(`Failed to get package version at tag ${tagName}:`, error);
165
+ return null;
166
+ }
167
+ }
168
+
169
+ // Package validation methods
170
+ async validateTagPrefixForPackage(tagName: string): Promise<void> {
171
+ const prefix = this.detectTagPrefix(tagName);
172
+ if (prefix) {
173
+ // Extract package name from prefix and check if it should be versioned
174
+ let packageName: string;
175
+ if (prefix === "v") {
176
+ packageName = "root";
177
+ } else if (prefix.endsWith("-v")) {
178
+ // Get all packages and find the one that matches this tag prefix
179
+ const allPackages = await EntityPackage.getAllPackages();
180
+ const matchingPackage = allPackages.find((pkg) => {
181
+ const packageInstance = new EntityPackage(pkg);
182
+ return packageInstance.getTagSeriesName() === prefix;
183
+ });
184
+
185
+ if (!matchingPackage) {
186
+ throw new Error(`No package found with tag prefix "${prefix}"`);
187
+ }
188
+
189
+ packageName = matchingPackage;
190
+ } else {
191
+ throw new Error(
192
+ `Invalid tag prefix format: "${prefix}". Expected format: v (root) or package-name-v (e.g., api-v, intershell-v)`,
193
+ );
194
+ }
195
+
196
+ // Check if this package should be versioned
197
+ const packageInstance = new EntityPackage(packageName);
198
+ if (!packageInstance.shouldVersion()) {
199
+ throw new Error(`Package "${packageName}" should not be versioned (private package)`);
200
+ }
201
+ }
202
+ }
203
+
204
+ // Helper methods
205
+ detectTagPrefix(tagName: string): string | undefined {
206
+ // Check for root package tag (v1.0.0)
207
+ if (/^v\d+\.\d+\.\d+/.test(tagName)) {
208
+ return "v";
209
+ }
210
+
211
+ // Check for package-specific tag (package-name-v1.0.0)
212
+ const packageTagMatch = tagName.match(/^(.+-v)\d+\.\d+\.\d+/);
213
+ if (packageTagMatch) {
214
+ return packageTagMatch[1];
215
+ }
216
+
217
+ return undefined;
218
+ }
219
+
220
+ compareVersions(version1: string, version2: string): number {
221
+ const v1Parts = version1.split(".").map(Number);
222
+ const v2Parts = version2.split(".").map(Number);
223
+
224
+ for (let i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) {
225
+ const v1Part = v1Parts[i] || 0;
226
+ const v2Part = v2Parts[i] || 0;
227
+
228
+ if (v1Part > v2Part) return 1;
229
+ if (v1Part < v2Part) return -1;
230
+ }
231
+
232
+ return 0;
233
+ }
234
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./package-version";
2
+ export * from "./package-version.types";
@@ -0,0 +1,141 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import type { ParsedCommitData } from "../commit";
3
+ import { EntityPackage } from "../package";
4
+ import { EntityPackageCommits } from "../package-commits";
5
+ import { EntityPackageTags } from "../package-tags";
6
+ import { EntityPackageVersion } from "./package-version";
7
+
8
+ // Helper function to create EntityPackageVersion instances
9
+ function createEntityPackageVersion(packageName: string): EntityPackageVersion {
10
+ const packageInstance = new EntityPackage(packageName);
11
+ const commitPackage = new EntityPackageCommits(packageInstance);
12
+ const tagPackage = new EntityPackageTags(packageInstance);
13
+ return new EntityPackageVersion(packageInstance, commitPackage, tagPackage);
14
+ }
15
+
16
+ describe("EntityPackageVersion", () => {
17
+ test("should create instance", () => {
18
+ const EntityPackageVersion = createEntityPackageVersion("api");
19
+ expect(EntityPackageVersion).toBeDefined();
20
+ });
21
+
22
+ test("should create root instance", () => {
23
+ const EntityPackageVersion = createEntityPackageVersion("root");
24
+ expect(EntityPackageVersion).toBeDefined();
25
+ });
26
+
27
+ test("should calculate bump type for regular package", async () => {
28
+ const EntityPackageVersion = createEntityPackageVersion("api");
29
+
30
+ const commits: ParsedCommitData[] = [
31
+ {
32
+ message: { type: "feat", description: "add new feature", isBreaking: false },
33
+ files: ["src/feature.ts"],
34
+ } as ParsedCommitData,
35
+ ];
36
+
37
+ const versionData = await EntityPackageVersion.calculateVersionData(commits);
38
+ expect(versionData.bumpType).toBe("minor");
39
+ });
40
+
41
+ test("should calculate bump type for breaking changes", async () => {
42
+ const EntityPackageVersion = createEntityPackageVersion("api");
43
+
44
+ const commits: ParsedCommitData[] = [
45
+ {
46
+ message: { type: "feat", description: "add new feature", isBreaking: true },
47
+ files: ["src/feature.ts"],
48
+ } as ParsedCommitData,
49
+ ];
50
+
51
+ const versionData = await EntityPackageVersion.calculateVersionData(commits);
52
+ expect(versionData.bumpType).toBe("major");
53
+ });
54
+
55
+ test("should calculate bump type for patch changes", async () => {
56
+ const EntityPackageVersion = createEntityPackageVersion("api");
57
+
58
+ const commits: ParsedCommitData[] = [
59
+ {
60
+ message: { type: "fix", description: "fix bug", isBreaking: false },
61
+ files: ["src/bug.ts"],
62
+ } as ParsedCommitData,
63
+ ];
64
+
65
+ const versionData = await EntityPackageVersion.calculateVersionData(commits);
66
+ expect(versionData.bumpType).toBe("patch");
67
+ });
68
+
69
+ test("should return none for empty commits", async () => {
70
+ const EntityPackageVersion = createEntityPackageVersion("api");
71
+ const versionData = await EntityPackageVersion.calculateVersionData([]);
72
+ expect(versionData.bumpType).toBe("none");
73
+ });
74
+
75
+ test("should calculate version data for first version", async () => {
76
+ const EntityPackageVersion = createEntityPackageVersion("api");
77
+
78
+ const versionData = await EntityPackageVersion.calculateVersionData([]);
79
+
80
+ // The api package already has version 0.1.0, so no bump needed
81
+ expect(versionData.shouldBump).toBe(false);
82
+ expect(versionData.targetVersion).toBe("0.1.0");
83
+ expect(versionData.bumpType).toBe("none");
84
+ expect(versionData.reason).toBe("No commits in range");
85
+ });
86
+
87
+ test("should not bump when no commits", async () => {
88
+ const EntityPackageVersion = createEntityPackageVersion("api");
89
+
90
+ const versionData = await EntityPackageVersion.calculateVersionData([]);
91
+
92
+ expect(versionData.shouldBump).toBe(false);
93
+ expect(versionData.targetVersion).toBe("0.1.0"); // api package version
94
+ expect(versionData.bumpType).toBe("none");
95
+ expect(versionData.reason).toBe("No commits in range");
96
+ });
97
+
98
+ test("should throw error when version on disk is higher", async () => {
99
+ // This test needs to be updated since the method now gets version from package.json internally
100
+ // We'll need to mock the package version or create a different test
101
+ expect(true).toBe(true); // Placeholder - this test needs to be redesigned
102
+ });
103
+
104
+ test("should calculate bump type for root package", async () => {
105
+ const EntityPackageVersion = createEntityPackageVersion("root");
106
+
107
+ const commits: ParsedCommitData[] = [
108
+ {
109
+ message: { type: "feat", description: "add feature", isBreaking: false, scopes: ["root"] },
110
+ files: ["package.json"],
111
+ } as ParsedCommitData,
112
+ ];
113
+
114
+ const versionData = await EntityPackageVersion.calculateVersionData(commits);
115
+ expect(versionData.bumpType).toBe("minor");
116
+ });
117
+
118
+ test("should use override bump type when provided", async () => {
119
+ const EntityPackageVersion = createEntityPackageVersion("api");
120
+
121
+ const commits: ParsedCommitData[] = [
122
+ {
123
+ message: { type: "feat", description: "add new feature", isBreaking: false },
124
+ files: ["src/feature.ts"],
125
+ } as ParsedCommitData,
126
+ ];
127
+
128
+ // Test with major override (should override the automatic minor bump)
129
+ const versionDataMajor = await EntityPackageVersion.calculateVersionData(commits, "major");
130
+ expect(versionDataMajor.bumpType).toBe("major");
131
+
132
+ // Test with patch override (should override the automatic minor bump)
133
+ const versionDataPatch = await EntityPackageVersion.calculateVersionData(commits, "patch");
134
+ expect(versionDataPatch.bumpType).toBe("patch");
135
+
136
+ // Test with none override (should prevent version bump)
137
+ const versionDataNone = await EntityPackageVersion.calculateVersionData(commits, "none");
138
+ expect(versionDataNone.bumpType).toBe("none");
139
+ expect(versionDataNone.shouldBump).toBe(false);
140
+ });
141
+ });
@@ -0,0 +1,234 @@
1
+ import type { ParsedCommitData } from "../commit";
2
+ import type { EntityPackage } from "../package";
3
+ import type { EntityPackageCommits } from "../package-commits";
4
+ import type { EntityPackageTags } from "../package-tags";
5
+ import type {
6
+ EntityPackageVersionBumpType,
7
+ EntityPackageVersionData,
8
+ } from "./package-version.types";
9
+
10
+ export class EntityPackageVersion {
11
+ private package: EntityPackage;
12
+ private packageTags: EntityPackageTags;
13
+ private packageCommits: EntityPackageCommits;
14
+
15
+ constructor(
16
+ packageInstance: EntityPackage,
17
+ packageCommits: EntityPackageCommits,
18
+ packageTags: EntityPackageTags,
19
+ ) {
20
+ this.package = packageInstance;
21
+ this.packageCommits = packageCommits;
22
+ this.packageTags = packageTags;
23
+ }
24
+
25
+ async calculateVersionData(
26
+ commits: ParsedCommitData[],
27
+ overrideBumpType?: EntityPackageVersionBumpType,
28
+ ): Promise<EntityPackageVersionData> {
29
+ const versionOnDisk = this.package.readVersion() || "0.0.0";
30
+ const currentVersion = (await this.packageTags.getLatestPackageVersionInHistory()) || "0.0.0";
31
+
32
+ // Check if version on disk is higher than the current version (early validation)
33
+ const currentVersionComparison = this.packageTags.compareVersions(
34
+ versionOnDisk,
35
+ currentVersion,
36
+ );
37
+ if (currentVersionComparison > 0) {
38
+ throw new Error(
39
+ `Package version on disk (${versionOnDisk}) is higher than current git tag version (${currentVersion}). ` +
40
+ `Please clean up the disk changes and revert package.json to version ${currentVersion} before running version preparation.`,
41
+ );
42
+ }
43
+
44
+ // If no commits, check if this is a first version (0.0.0)
45
+ if (commits.length === 0) {
46
+ if (currentVersion === "0.0.0") {
47
+ // First version - bump to 0.1.0 even with no commits
48
+ return {
49
+ currentVersion,
50
+ shouldBump: true,
51
+ targetVersion: "0.1.0",
52
+ bumpType: "minor",
53
+ reason: "First version bump from 0.0.0",
54
+ };
55
+ }
56
+ // No new commits, no version change needed
57
+ return {
58
+ currentVersion,
59
+ shouldBump: false,
60
+ targetVersion: currentVersion,
61
+ bumpType: "none",
62
+ reason: "No commits in range",
63
+ };
64
+ }
65
+
66
+ const bumpType = overrideBumpType || (await this.calculateBumpType(commits));
67
+ if (bumpType === "none") {
68
+ return {
69
+ currentVersion,
70
+ shouldBump: false,
71
+ targetVersion: currentVersion,
72
+ bumpType: "none",
73
+ reason: "No version bump needed",
74
+ };
75
+ }
76
+
77
+ const nextVersion = this.calculateNextVersion(currentVersion, bumpType);
78
+ const versionAlreadyExists = await this.packageTags.packageVersionExistsInHistory(nextVersion);
79
+ if (versionAlreadyExists) {
80
+ return {
81
+ currentVersion,
82
+ shouldBump: false,
83
+ targetVersion: currentVersion,
84
+ bumpType: "none",
85
+ reason: `Version ${nextVersion} already exists in git tags`,
86
+ };
87
+ }
88
+
89
+ if (currentVersion === nextVersion) {
90
+ return {
91
+ currentVersion,
92
+ shouldBump: false,
93
+ targetVersion: currentVersion,
94
+ bumpType: "none",
95
+ reason: `Package version ${currentVersion} already matches next version ${nextVersion}`,
96
+ };
97
+ }
98
+
99
+ const latestPackageVersionInHistory = await this.packageTags.getLatestPackageVersionInHistory();
100
+ if (latestPackageVersionInHistory && latestPackageVersionInHistory !== currentVersion) {
101
+ // Check if current version is actually behind the git tag version
102
+ const versionComparison = this.packageTags.compareVersions(
103
+ currentVersion,
104
+ latestPackageVersionInHistory,
105
+ );
106
+ if (versionComparison < 0) {
107
+ throw new Error(
108
+ `Package version ${currentVersion} is behind git tag version ${latestPackageVersionInHistory}`,
109
+ );
110
+ }
111
+ // If current version is ahead of git tag version, that's fine - we can proceed
112
+ }
113
+
114
+ // Check if version on disk is already synced
115
+ if (versionOnDisk === nextVersion) {
116
+ return {
117
+ currentVersion: versionOnDisk,
118
+ shouldBump: false,
119
+ targetVersion: nextVersion,
120
+ bumpType: "synced",
121
+ reason: `Package version on disk is already synced to ${nextVersion}`,
122
+ };
123
+ }
124
+
125
+ // Normal version bump - if we have commits and the next version doesn't exist, we should bump
126
+ return {
127
+ currentVersion: versionOnDisk,
128
+ shouldBump: true,
129
+ targetVersion: nextVersion,
130
+ bumpType,
131
+ reason: `New ${bumpType} version bump to ${nextVersion}`,
132
+ };
133
+ }
134
+
135
+ private calculateNextVersion(
136
+ currentVersion: string,
137
+ bumpType: EntityPackageVersionBumpType,
138
+ ): string {
139
+ const versionParts = currentVersion.split(".").map(Number);
140
+
141
+ if (versionParts.length !== 3 || versionParts.some(Number.isNaN)) {
142
+ throw new Error(`Invalid version: ${currentVersion}`);
143
+ }
144
+
145
+ const [major, minor, patch] = versionParts;
146
+
147
+ switch (bumpType) {
148
+ case "major":
149
+ return `${major + 1}.0.0`;
150
+ case "minor":
151
+ return `${major}.${minor + 1}.0`;
152
+ case "patch":
153
+ return `${major}.${minor}.${patch + 1}`;
154
+ case "none":
155
+ return currentVersion;
156
+ default:
157
+ throw new Error(`Invalid bump type: ${bumpType}`);
158
+ }
159
+ }
160
+
161
+ // Version bump calculation
162
+ private async calculateBumpType(
163
+ commits: ParsedCommitData[],
164
+ ): Promise<EntityPackageVersionBumpType> {
165
+ if (commits.length === 0) {
166
+ return "none";
167
+ }
168
+
169
+ // Root package has special bump logic
170
+ if (this.package.isRoot()) {
171
+ return await this.calculateRootBumpType(commits);
172
+ }
173
+
174
+ // Regular package bump logic
175
+ const hasBreaking = commits.some((commit) => commit.message.isBreaking);
176
+ if (hasBreaking) {
177
+ return "major";
178
+ }
179
+
180
+ const hasFeature = commits.some((commit) => commit.message.type === "feat");
181
+ if (hasFeature) {
182
+ return "minor";
183
+ }
184
+
185
+ return "patch";
186
+ }
187
+
188
+ private async calculateRootBumpType(
189
+ commits: ParsedCommitData[],
190
+ ): Promise<EntityPackageVersionBumpType> {
191
+ // Check for app-level breaking changes first (should be minor for root)
192
+ const hasAppBreaking = commits.some(
193
+ (commit) =>
194
+ commit.message.isBreaking && commit.files?.some((file) => file.startsWith("apps/")),
195
+ );
196
+ if (hasAppBreaking) {
197
+ return "minor";
198
+ }
199
+
200
+ // Check for workspace-level breaking changes
201
+ const hasWorkspaceBreaking = commits.some(
202
+ (commit) =>
203
+ commit.message.isBreaking &&
204
+ (commit.message.scopes?.includes("root") || commit.message.scopes?.length === 0),
205
+ );
206
+ if (hasWorkspaceBreaking) {
207
+ return "major";
208
+ }
209
+
210
+ // Check for root-level features
211
+ const hasWorkspaceFeature = commits.some(
212
+ (commit) =>
213
+ commit.message.type === "feat" &&
214
+ (commit.message.scopes?.includes("root") || commit.message.scopes?.length === 0),
215
+ );
216
+ if (hasWorkspaceFeature) {
217
+ return "minor";
218
+ }
219
+
220
+ // Check for dependency changes using the new commit analysis
221
+ const hasDependencyChanges = await Promise.all(
222
+ commits.map(async (commit) => {
223
+ const affected = await this.packageCommits.getCommitAffectedPackages(commit);
224
+ return affected.direct !== null || affected.dependencies.length > 0;
225
+ }),
226
+ ).then((results) => results.some(Boolean));
227
+
228
+ if (hasDependencyChanges) {
229
+ return "patch";
230
+ }
231
+
232
+ return "patch";
233
+ }
234
+ }
@@ -0,0 +1,35 @@
1
+ export interface VersionHistory {
2
+ readonly packageName: string;
3
+ readonly versions: TagVersion[];
4
+ readonly latestVersion: string;
5
+ }
6
+
7
+ export interface TagVersion {
8
+ readonly tag: string;
9
+ readonly version: string;
10
+ readonly commit: string;
11
+ readonly date: Date;
12
+ readonly message: string;
13
+ }
14
+
15
+ export type EntityPackageVersionBumpType = "major" | "minor" | "patch" | "none" | "synced";
16
+
17
+ export interface EntityPackageVersionData {
18
+ readonly currentVersion: string;
19
+ readonly bumpType: EntityPackageVersionBumpType;
20
+ readonly shouldBump: boolean;
21
+ readonly targetVersion: string;
22
+ readonly reason: string;
23
+ }
24
+
25
+ export interface EntityGitTagVersion {
26
+ readonly tag: string;
27
+ readonly version: string;
28
+ readonly commitHash: string;
29
+ readonly date: Date;
30
+ }
31
+
32
+ export interface EntityPackageVersionHistory {
33
+ readonly packageName: string;
34
+ readonly versions: EntityGitTagVersion[];
35
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./tag";
2
+ export * from "./tag.types";