@wtf/release-docs 8.2.0 → 8.2.2

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 (557) hide show
  1. package/README.md +56 -44
  2. package/api/@wtf/release-cargo/auth/functions/mask.md +1 -1
  3. package/api/@wtf/release-cargo/auth/functions/tokenVariableOf.md +1 -1
  4. package/api/@wtf/release-cargo/auth/functions/trustedPublishing.md +1 -1
  5. package/api/@wtf/release-cargo/auth/interfaces/HttpResponse.md +5 -5
  6. package/api/@wtf/release-cargo/auth/interfaces/TrustedPublishing.md +5 -5
  7. package/api/@wtf/release-cargo/auth/interfaces/TrustedPublishingOptions.md +6 -6
  8. package/api/@wtf/release-cargo/auth/type-aliases/HttpFetch.md +1 -1
  9. package/api/@wtf/release-cargo/auth/variables/CRATES_IO_API.md +1 -1
  10. package/api/@wtf/release-cargo/auth/variables/ID_TOKEN_VARIABLE.md +1 -1
  11. package/api/@wtf/release-cargo/auth/variables/USER_AGENT.md +1 -1
  12. package/api/@wtf/release-cargo/crates/functions/publishOrder.md +1 -1
  13. package/api/@wtf/release-cargo/crates/functions/publishable.md +1 -1
  14. package/api/@wtf/release-cargo/crates/functions/readWorkspace.md +1 -1
  15. package/api/@wtf/release-cargo/crates/functions/selectCrates.md +1 -1
  16. package/api/@wtf/release-cargo/crates/interfaces/Selection.md +5 -5
  17. package/api/@wtf/release-cargo/ecosystem/functions/packagesAt.md +1 -1
  18. package/api/@wtf/release-cargo/ecosystem/functions/packagesOfTree.md +1 -1
  19. package/api/@wtf/release-cargo/ecosystem/functions/packagesOfWorkspace.md +1 -1
  20. package/api/@wtf/release-cargo/ecosystem/functions/resolveRequirement.md +1 -1
  21. package/api/@wtf/release-cargo/ecosystem/functions/satisfiesRequirement.md +1 -1
  22. package/api/@wtf/release-cargo/ecosystem/functions/semverRange.md +1 -1
  23. package/api/@wtf/release-cargo/ecosystem/interfaces/CargoPackage.md +7 -7
  24. package/api/@wtf/release-cargo/ecosystem/variables/cargoEcosystem.md +1 -1
  25. package/api/@wtf/release-cargo/errors/classes/CargoError.md +5 -5
  26. package/api/@wtf/release-cargo/errors/type-aliases/CargoErrorCode.md +1 -1
  27. package/api/@wtf/release-cargo/errors/variables/CARGO_ERRORS.md +1 -1
  28. package/api/@wtf/release-cargo/interfaces/Crate.md +6 -6
  29. package/api/@wtf/release-cargo/interfaces/CrateDependency.md +6 -6
  30. package/api/@wtf/release-cargo/interfaces/Workspace.md +3 -3
  31. package/api/@wtf/release-cargo/publish/functions/publishCrates.md +1 -1
  32. package/api/@wtf/release-cargo/publish/interfaces/PublishCratesOptions.md +11 -11
  33. package/api/@wtf/release-cargo/publish/interfaces/PublishedCrate.md +5 -5
  34. package/api/@wtf/release-cargo/publish/type-aliases/CrateStatus.md +1 -1
  35. package/api/@wtf/release-cargo/publish/variables/RECHECK_WAITS.md +1 -1
  36. package/api/@wtf/release-cargo/registry/functions/crateUrl.md +1 -1
  37. package/api/@wtf/release-cargo/registry/functions/indexHasVersion.md +1 -1
  38. package/api/@wtf/release-cargo/registry/functions/indexPath.md +1 -1
  39. package/api/@wtf/release-cargo/registry/variables/CRATES_IO_INDEX.md +1 -1
  40. package/api/@wtf/release-cargo/stamp/functions/checkVersions.md +1 -1
  41. package/api/@wtf/release-cargo/stamp/functions/inheritsVersion.md +1 -1
  42. package/api/@wtf/release-cargo/stamp/functions/stampManifest.md +1 -1
  43. package/api/@wtf/release-cargo/stamp/functions/stampWorkspace.md +1 -1
  44. package/api/@wtf/release-cargo/stamp/interfaces/StampOptions.md +4 -4
  45. package/api/@wtf/release-cargo/stamp/interfaces/Stamped.md +3 -3
  46. package/api/@wtf/release-cargo/stamp/interfaces/StampedWorkspace.md +3 -3
  47. package/api/@wtf/release-cargo/type-aliases/DependencyKind.md +1 -1
  48. package/api/@wtf/release-go/ecosystem/functions/packagesOfModules.md +1 -1
  49. package/api/@wtf/release-go/ecosystem/functions/packagesOfRepo.md +1 -1
  50. package/api/@wtf/release-go/ecosystem/functions/resolveVersion.md +1 -1
  51. package/api/@wtf/release-go/ecosystem/functions/satisfiesVersion.md +1 -1
  52. package/api/@wtf/release-go/ecosystem/interfaces/GoPackage.md +7 -7
  53. package/api/@wtf/release-go/ecosystem/variables/goEcosystem.md +1 -1
  54. package/api/@wtf/release-go/errors/classes/GoError.md +5 -5
  55. package/api/@wtf/release-go/errors/type-aliases/GoErrorCode.md +1 -1
  56. package/api/@wtf/release-go/errors/variables/GO_ERRORS.md +1 -1
  57. package/api/@wtf/release-go/gomod/functions/entriesOf.md +1 -1
  58. package/api/@wtf/release-go/gomod/functions/linesOf.md +1 -1
  59. package/api/@wtf/release-go/gomod/functions/readGoMod.md +1 -1
  60. package/api/@wtf/release-go/gomod/functions/tokensOf.md +1 -1
  61. package/api/@wtf/release-go/gomod/interfaces/Entry.md +4 -4
  62. package/api/@wtf/release-go/gomod/interfaces/GoMod.md +4 -4
  63. package/api/@wtf/release-go/gomod/interfaces/GoReplace.md +6 -6
  64. package/api/@wtf/release-go/gomod/interfaces/GoRequire.md +4 -4
  65. package/api/@wtf/release-go/gomod/interfaces/Token.md +5 -5
  66. package/api/@wtf/release-go/interfaces/GoModule.md +6 -6
  67. package/api/@wtf/release-go/modules/functions/isFetchable.md +1 -1
  68. package/api/@wtf/release-go/modules/functions/isGoMod.md +1 -1
  69. package/api/@wtf/release-go/modules/functions/majorErrors.md +1 -1
  70. package/api/@wtf/release-go/modules/functions/majorOfPath.md +1 -1
  71. package/api/@wtf/release-go/modules/functions/modulesAt.md +1 -1
  72. package/api/@wtf/release-go/modules/functions/modulesOf.md +1 -1
  73. package/api/@wtf/release-go/modules/functions/readModules.md +1 -1
  74. package/api/@wtf/release-go/modules/functions/selectModules.md +1 -1
  75. package/api/@wtf/release-go/modules/interfaces/Selection.md +4 -4
  76. package/api/@wtf/release-go/stamp/functions/checkVersions.md +1 -1
  77. package/api/@wtf/release-go/stamp/functions/stampGoMod.md +1 -1
  78. package/api/@wtf/release-go/stamp/functions/stampModules.md +1 -1
  79. package/api/@wtf/release-go/stamp/interfaces/Stamped.md +3 -3
  80. package/api/@wtf/release-go/stamp/interfaces/StampedModules.md +3 -3
  81. package/api/@wtf/release-go/tags/functions/askProxy.md +1 -1
  82. package/api/@wtf/release-go/tags/functions/maskCredentials.md +1 -1
  83. package/api/@wtf/release-go/tags/functions/releaseCommit.md +1 -1
  84. package/api/@wtf/release-go/tags/functions/remoteTags.md +1 -1
  85. package/api/@wtf/release-go/tags/functions/tagModules.md +1 -1
  86. package/api/@wtf/release-go/tags/functions/tagOfModule.md +1 -1
  87. package/api/@wtf/release-go/tags/functions/tagPrefix.md +1 -1
  88. package/api/@wtf/release-go/tags/interfaces/TagModulesOptions.md +8 -8
  89. package/api/@wtf/release-go/tags/interfaces/TaggedModule.md +5 -5
  90. package/api/@wtf/release-go/tags/type-aliases/ModuleStatus.md +1 -1
  91. package/api/@wtf/release-go/tags/variables/RELEASE_AUTHOR.md +1 -1
  92. package/api/@wtf/release-maven/artifacts/functions/groupIdOf.md +1 -1
  93. package/api/@wtf/release-maven/artifacts/functions/installsOf.md +1 -1
  94. package/api/@wtf/release-maven/artifacts/functions/isPomFile.md +1 -1
  95. package/api/@wtf/release-maven/artifacts/functions/isRange.md +1 -1
  96. package/api/@wtf/release-maven/artifacts/functions/modulesOf.md +1 -1
  97. package/api/@wtf/release-maven/artifacts/functions/nameOf.md +1 -1
  98. package/api/@wtf/release-maven/artifacts/functions/publishOrder.md +1 -1
  99. package/api/@wtf/release-maven/artifacts/functions/readModules.md +1 -1
  100. package/api/@wtf/release-maven/artifacts/functions/readPoms.md +1 -1
  101. package/api/@wtf/release-maven/artifacts/functions/selectArtifacts.md +1 -1
  102. package/api/@wtf/release-maven/artifacts/interfaces/Selection.md +4 -4
  103. package/api/@wtf/release-maven/ecosystem/functions/compareVersions.md +1 -1
  104. package/api/@wtf/release-maven/ecosystem/functions/parseRange.md +1 -1
  105. package/api/@wtf/release-maven/ecosystem/functions/resolveVersion.md +1 -1
  106. package/api/@wtf/release-maven/ecosystem/functions/satisfiesVersion.md +1 -1
  107. package/api/@wtf/release-maven/ecosystem/interfaces/Bound.md +3 -3
  108. package/api/@wtf/release-maven/ecosystem/interfaces/Restriction.md +3 -3
  109. package/api/@wtf/release-maven/ecosystem/variables/mavenEcosystem.md +1 -1
  110. package/api/@wtf/release-maven/errors/classes/MavenError.md +5 -5
  111. package/api/@wtf/release-maven/errors/type-aliases/MavenErrorCode.md +1 -1
  112. package/api/@wtf/release-maven/errors/variables/MAVEN_ERRORS.md +1 -1
  113. package/api/@wtf/release-maven/interfaces/MavenModule.md +14 -14
  114. package/api/@wtf/release-maven/pom/functions/childOf.md +1 -1
  115. package/api/@wtf/release-maven/pom/functions/childrenOf.md +1 -1
  116. package/api/@wtf/release-maven/pom/functions/dependencyOf.md +1 -1
  117. package/api/@wtf/release-maven/pom/functions/escapeXml.md +1 -1
  118. package/api/@wtf/release-maven/pom/functions/parseXml.md +1 -1
  119. package/api/@wtf/release-maven/pom/functions/readPom.md +1 -1
  120. package/api/@wtf/release-maven/pom/functions/textAt.md +1 -1
  121. package/api/@wtf/release-maven/pom/interfaces/Pom.md +15 -15
  122. package/api/@wtf/release-maven/pom/interfaces/PomDependency.md +5 -5
  123. package/api/@wtf/release-maven/pom/interfaces/PomParent.md +4 -4
  124. package/api/@wtf/release-maven/pom/interfaces/PomPlugin.md +5 -5
  125. package/api/@wtf/release-maven/pom/interfaces/PomRepository.md +3 -3
  126. package/api/@wtf/release-maven/pom/interfaces/Span.md +3 -3
  127. package/api/@wtf/release-maven/pom/interfaces/XmlElement.md +7 -7
  128. package/api/@wtf/release-maven/pom/variables/PLUGIN_GROUP.md +1 -1
  129. package/api/@wtf/release-maven/publish/functions/deployModules.md +1 -1
  130. package/api/@wtf/release-maven/publish/interfaces/DeployModulesOptions.md +11 -11
  131. package/api/@wtf/release-maven/publish/interfaces/DeployedModule.md +4 -4
  132. package/api/@wtf/release-maven/publish/type-aliases/ModuleStatus.md +1 -1
  133. package/api/@wtf/release-maven/repository/functions/deployTargets.md +1 -1
  134. package/api/@wtf/release-maven/repository/functions/expandValues.md +1 -1
  135. package/api/@wtf/release-maven/repository/functions/hasPom.md +1 -1
  136. package/api/@wtf/release-maven/repository/functions/pomPath.md +1 -1
  137. package/api/@wtf/release-maven/repository/functions/pomUrl.md +1 -1
  138. package/api/@wtf/release-maven/repository/interfaces/Repository.md +3 -3
  139. package/api/@wtf/release-maven/repository/interfaces/ValuesOf.md +3 -3
  140. package/api/@wtf/release-maven/repository/variables/MAVEN_CENTRAL.md +1 -1
  141. package/api/@wtf/release-maven/stamp/functions/checkVersions.md +1 -1
  142. package/api/@wtf/release-maven/stamp/functions/stampModules.md +1 -1
  143. package/api/@wtf/release-maven/stamp/functions/stampPom.md +1 -1
  144. package/api/@wtf/release-maven/stamp/interfaces/PomStampOptions.md +5 -5
  145. package/api/@wtf/release-maven/stamp/interfaces/Stamped.md +3 -3
  146. package/api/@wtf/release-maven/stamp/interfaces/StampedModules.md +3 -3
  147. package/api/@wtf/release-npm/check/functions/checkPackages.md +1 -1
  148. package/api/@wtf/release-npm/check/functions/formatIssue.md +1 -1
  149. package/api/@wtf/release-npm/check/interfaces/CheckOptions.md +6 -6
  150. package/api/@wtf/release-npm/check/interfaces/Issue.md +5 -5
  151. package/api/@wtf/release-npm/check/type-aliases/CheckedPackage.md +1 -1
  152. package/api/@wtf/release-npm/check/type-aliases/IssueCode.md +1 -1
  153. package/api/@wtf/release-npm/ecosystem/variables/npmEcosystem.md +1 -1
  154. package/api/@wtf/release-npm/errors/type-aliases/NpmErrorCode.md +1 -1
  155. package/api/@wtf/release-npm/errors/variables/NPM_ERRORS.md +1 -1
  156. package/api/@wtf/release-npm/interfaces/Lookup.md +3 -3
  157. package/api/@wtf/release-npm/interfaces/PublishOptions.md +6 -6
  158. package/api/@wtf/release-npm/interfaces/PublishPackage.md +5 -5
  159. package/api/@wtf/release-npm/interfaces/PublishTrainOptions.md +13 -13
  160. package/api/@wtf/release-npm/interfaces/Publisher.md +7 -7
  161. package/api/@wtf/release-npm/interfaces/PublisherContext.md +7 -7
  162. package/api/@wtf/release-npm/manifests/functions/concreteRange.md +1 -1
  163. package/api/@wtf/release-npm/manifests/functions/manifestsAt.md +1 -1
  164. package/api/@wtf/release-npm/manifests/functions/packageOf.md +1 -1
  165. package/api/@wtf/release-npm/manifests/functions/packagesOfManifests.md +1 -1
  166. package/api/@wtf/release-npm/manifests/functions/readManifests.md +1 -1
  167. package/api/@wtf/release-npm/manifests/functions/resolveSpecifier.md +1 -1
  168. package/api/@wtf/release-npm/manifests/functions/runtimeDependenciesOf.md +1 -1
  169. package/api/@wtf/release-npm/manifests/functions/satisfiesRange.md +1 -1
  170. package/api/@wtf/release-npm/manifests/interfaces/Manifest.md +5 -5
  171. package/api/@wtf/release-npm/manifests/interfaces/NpmPackage.md +7 -7
  172. package/api/@wtf/release-npm/manifests/type-aliases/DependencyField.md +1 -1
  173. package/api/@wtf/release-npm/manifests/variables/DEPENDENCY_FIELDS.md +1 -1
  174. package/api/@wtf/release-npm/manifests/variables/FIELD_KINDS.md +1 -1
  175. package/api/@wtf/release-npm/manifests/variables/RUNTIME_FIELDS.md +1 -1
  176. package/api/@wtf/release-npm/prepare/functions/isTypeScriptSource.md +1 -1
  177. package/api/@wtf/release-npm/prepare/functions/prepareManifest.md +1 -1
  178. package/api/@wtf/release-npm/prepare/functions/stripSourceConditions.md +1 -1
  179. package/api/@wtf/release-npm/prepare/interfaces/PrepareOptions.md +5 -5
  180. package/api/@wtf/release-npm/prepare/interfaces/PreparedManifest.md +6 -6
  181. package/api/@wtf/release-npm/prepare/variables/SOURCE_CONDITIONS.md +1 -1
  182. package/api/@wtf/release-npm/publishers/functions/builtInPublisher.md +1 -1
  183. package/api/@wtf/release-npm/publishers/functions/isPublisher.md +1 -1
  184. package/api/@wtf/release-npm/publishers/variables/NPM_REGISTRY.md +1 -1
  185. package/api/@wtf/release-npm/publishers/variables/PUBLISHERS.md +1 -1
  186. package/api/@wtf/release-npm/publishers/variables/npmPublisher.md +1 -1
  187. package/api/@wtf/release-npm/publishers/variables/pnpmPublisher.md +1 -1
  188. package/api/@wtf/release-npm/release/functions/checkTrain.md +1 -1
  189. package/api/@wtf/release-npm/release/functions/distTagOf.md +1 -1
  190. package/api/@wtf/release-npm/release/functions/packTrain.md +1 -1
  191. package/api/@wtf/release-npm/release/functions/publishPacked.md +1 -1
  192. package/api/@wtf/release-npm/release/functions/publishTrain.md +1 -1
  193. package/api/@wtf/release-npm/release/functions/publishedOf.md +1 -1
  194. package/api/@wtf/release-npm/release/functions/publishedOfResolved.md +1 -1
  195. package/api/@wtf/release-npm/release/functions/releaseTrain.md +1 -1
  196. package/api/@wtf/release-npm/release/functions/resolveManifests.md +1 -1
  197. package/api/@wtf/release-npm/release/functions/tagTrain.md +1 -1
  198. package/api/@wtf/release-npm/release/interfaces/CheckRelease.md +16 -16
  199. package/api/@wtf/release-npm/release/interfaces/PackOptions.md +8 -8
  200. package/api/@wtf/release-npm/release/interfaces/PackedTrain.md +12 -12
  201. package/api/@wtf/release-npm/release/interfaces/PublishRun.md +11 -11
  202. package/api/@wtf/release-npm/release/interfaces/PublishedOf.md +4 -4
  203. package/api/@wtf/release-npm/release/interfaces/PublishedPackage.md +7 -7
  204. package/api/@wtf/release-npm/release/interfaces/PublishedTrain.md +5 -5
  205. package/api/@wtf/release-npm/release/interfaces/ResolveRelease.md +17 -17
  206. package/api/@wtf/release-npm/release/interfaces/ResolvedPackage.md +4 -4
  207. package/api/@wtf/release-npm/release/interfaces/ResolvedTrain.md +6 -6
  208. package/api/@wtf/release-npm/release/interfaces/TagRelease.md +14 -14
  209. package/api/@wtf/release-npm/release/type-aliases/LookedUpTrain.md +1 -1
  210. package/api/@wtf/release-npm/release/type-aliases/ReleaseRun.md +1 -1
  211. package/api/@wtf/release-npm/release/variables/ID_TOKENS.md +1 -1
  212. package/api/@wtf/release-npm/release/variables/RUNNER_ENVIRONMENTS.md +1 -1
  213. package/api/@wtf/release-npm/workspace/functions/pnpmWorkspaceGlobs.md +1 -1
  214. package/api/@wtf/release-npm/workspace/functions/publishableOf.md +1 -1
  215. package/api/@wtf/release-npm/workspace/functions/readWorkspace.md +1 -1
  216. package/api/@wtf/release-npm/workspace/functions/workspaceFolders.md +1 -1
  217. package/api/@wtf/release-npm/workspace/functions/workspaceGlobs.md +1 -1
  218. package/api/@wtf/release-npm/workspace/interfaces/WorkspaceGlobs.md +3 -3
  219. package/api/@wtf/release-npm/workspace/interfaces/WorkspaceOptions.md +2 -2
  220. package/api/@wtf/release-replace/errors/classes/ReplaceError.md +5 -5
  221. package/api/@wtf/release-replace/errors/type-aliases/ReplaceErrorCode.md +1 -1
  222. package/api/@wtf/release-replace/errors/variables/REPLACE_ERRORS.md +1 -1
  223. package/api/@wtf/release-replace/files/functions/filesMatcher.md +1 -1
  224. package/api/@wtf/release-replace/interfaces/ReplaceMatch.md +5 -5
  225. package/api/@wtf/release-replace/interfaces/ReplacementOf.md +5 -5
  226. package/api/@wtf/release-replace/replace/functions/regExpOf.md +1 -1
  227. package/api/@wtf/release-replace/replace/functions/replaceFiles.md +1 -1
  228. package/api/@wtf/release-replace/replace/functions/replaceText.md +1 -1
  229. package/api/@wtf/release-replace/replace/interfaces/ReplaceOptions.md +10 -10
  230. package/api/@wtf/release-replace/replace/interfaces/TextOptions.md +5 -5
  231. package/api/@wtf/release-replace/replace/type-aliases/To.md +1 -1
  232. package/api/@wtf/release-replace/templates/functions/mergeTemplates.md +1 -1
  233. package/api/@wtf/release-replace/templates/functions/resolveReplacement.md +1 -1
  234. package/api/@wtf/release-replace/templates/functions/resolveReplacements.md +1 -1
  235. package/api/@wtf/release-replace/type-aliases/Escape.md +1 -1
  236. package/api/@wtf/release-replace/type-aliases/ReplaceFunction.md +1 -1
  237. package/api/@wtf/release-replace/type-aliases/Replacement.md +1 -1
  238. package/api/@wtf/release-replace/type-aliases/ReplacementSpec.md +1 -1
  239. package/api/@wtf/release-replace/type-aliases/TemplateUse.md +1 -1
  240. package/api/@wtf/release-replace/type-aliases/Templates.md +1 -1
  241. package/api/@wtf/release-replace/values/functions/escapeValue.md +1 -1
  242. package/api/@wtf/release-replace/values/functions/textOf.md +1 -1
  243. package/api/@wtf/release-replace/values/functions/valueAt.md +1 -1
  244. package/api/@wtf/release-replace/values/variables/ESCAPES.md +1 -1
  245. package/api/@wtf/release-replace/values/variables/VALUE.md +1 -1
  246. package/api/@wtf/release-system/errors/classes/ReleaseError.md +5 -5
  247. package/api/@wtf/release-system/errors/functions/throwAll.md +1 -1
  248. package/api/@wtf/release-system/errors/type-aliases/ErrorClass.md +1 -1
  249. package/api/@wtf/release-system/errors/type-aliases/SystemErrorCode.md +1 -1
  250. package/api/@wtf/release-system/errors/variables/SYSTEM_ERRORS.md +1 -1
  251. package/api/@wtf/release-system/git/functions/commitsSince.md +1 -1
  252. package/api/@wtf/release-system/git/functions/filesOfCommits.md +1 -1
  253. package/api/@wtf/release-system/git/functions/git.md +1 -1
  254. package/api/@wtf/release-system/git/functions/gitOf.md +1 -1
  255. package/api/@wtf/release-system/git/functions/trackedFiles.md +1 -1
  256. package/api/@wtf/release-system/git/interfaces/GitContext.md +4 -4
  257. package/api/@wtf/release-system/git/interfaces/LogCommit.md +5 -5
  258. package/api/@wtf/release-system/node/functions/nodeSystem.md +1 -1
  259. package/api/@wtf/release-system/node/functions/realPathOf.md +1 -1
  260. package/api/@wtf/release-system/node/functions/systemOf.md +1 -1
  261. package/api/@wtf/release-system/paths/functions/normalizePath.md +1 -1
  262. package/api/@wtf/release-system/paths/functions/pathMatcher.md +1 -1
  263. package/api/@wtf/release-system/paths/type-aliases/PathMatcher.md +1 -1
  264. package/api/@wtf/release-system/posix/functions/basenameOf.md +1 -1
  265. package/api/@wtf/release-system/posix/functions/dirnameOf.md +1 -1
  266. package/api/@wtf/release-system/posix/functions/joinPath.md +1 -1
  267. package/api/@wtf/release-system/posix/functions/relativePath.md +1 -1
  268. package/api/@wtf/release-system/posix/functions/resolvePath.md +1 -1
  269. package/api/@wtf/release-system/system/interfaces/DirEntry.md +3 -3
  270. package/api/@wtf/release-system/system/interfaces/ExecOptions.md +4 -4
  271. package/api/@wtf/release-system/system/interfaces/ExecResult.md +4 -4
  272. package/api/@wtf/release-system/system/interfaces/System.md +7 -7
  273. package/api/@wtf/release-system/system/interfaces/SystemFs.md +8 -8
  274. package/api/@wtf/release-system/system/type-aliases/Exec.md +1 -1
  275. package/api/@wtf/release-system/system/type-aliases/SystemInput.md +1 -1
  276. package/api/@wtf/release-system/validator/functions/allOf.md +1 -1
  277. package/api/@wtf/release-system/validator/functions/anyObject.md +1 -1
  278. package/api/@wtf/release-system/validator/functions/anyOf.md +1 -1
  279. package/api/@wtf/release-system/validator/functions/arrayOf.md +1 -1
  280. package/api/@wtf/release-system/validator/functions/booleanOf.md +1 -1
  281. package/api/@wtf/release-system/validator/functions/errorOf.md +1 -1
  282. package/api/@wtf/release-system/validator/functions/errorsOf.md +1 -1
  283. package/api/@wtf/release-system/validator/functions/exclusive.md +1 -1
  284. package/api/@wtf/release-system/validator/functions/issuesOf.md +1 -1
  285. package/api/@wtf/release-system/validator/functions/objectOf.md +1 -1
  286. package/api/@wtf/release-system/validator/functions/oneOf.md +1 -1
  287. package/api/@wtf/release-system/validator/functions/orFunction.md +1 -1
  288. package/api/@wtf/release-system/validator/functions/pathText.md +1 -1
  289. package/api/@wtf/release-system/validator/functions/pluginEntriesOf.md +1 -1
  290. package/api/@wtf/release-system/validator/functions/recordOf.md +1 -1
  291. package/api/@wtf/release-system/validator/functions/refined.md +1 -1
  292. package/api/@wtf/release-system/validator/functions/stringOf.md +1 -1
  293. package/api/@wtf/release-system/validator/functions/tupleOf.md +1 -1
  294. package/api/@wtf/release-system/validator/interfaces/ArrayOptions.md +5 -5
  295. package/api/@wtf/release-system/validator/interfaces/IssueOptions.md +4 -4
  296. package/api/@wtf/release-system/validator/interfaces/ObjectOptions.md +5 -5
  297. package/api/@wtf/release-system/validator/interfaces/OptionIssue.md +4 -4
  298. package/api/@wtf/release-system/validator/interfaces/Property.md +4 -4
  299. package/api/@wtf/release-system/validator/interfaces/RecordOptions.md +6 -6
  300. package/api/@wtf/release-system/validator/interfaces/StringOptions.md +6 -6
  301. package/api/@wtf/release-system/validator/interfaces/Validator.md +4 -4
  302. package/api/@wtf/release-system/validator/type-aliases/JsonSchema.md +1 -1
  303. package/api/@wtf/release-system/validator/type-aliases/Path.md +1 -1
  304. package/api/@wtf/release-trains/cascade/functions/cascadeNotes.md +1 -1
  305. package/api/@wtf/release-trains/cascade/functions/cascadeText.md +1 -1
  306. package/api/@wtf/release-trains/cascade/functions/cascadeType.md +1 -1
  307. package/api/@wtf/release-trains/cascade/functions/cascadesOf.md +1 -1
  308. package/api/@wtf/release-trains/cascade/functions/higherType.md +1 -1
  309. package/api/@wtf/release-trains/cascade/interfaces/Cascade.md +11 -11
  310. package/api/@wtf/release-trains/cascade/interfaces/CascadeCheck.md +8 -8
  311. package/api/@wtf/release-trains/cascade/type-aliases/CascadeKind.md +1 -1
  312. package/api/@wtf/release-trains/cascade/type-aliases/ReleaseType.md +1 -1
  313. package/api/@wtf/release-trains/cascade/variables/RELEASE_TYPES.md +1 -1
  314. package/api/@wtf/release-trains/ecosystem/functions/isEcosystem.md +1 -1
  315. package/api/@wtf/release-trains/ecosystem/functions/loadEcosystems.md +1 -1
  316. package/api/@wtf/release-trains/ecosystem/functions/readPackages.md +1 -1
  317. package/api/@wtf/release-trains/ecosystem/interfaces/Dependency.md +4 -4
  318. package/api/@wtf/release-trains/ecosystem/interfaces/Ecosystem.md +5 -5
  319. package/api/@wtf/release-trains/ecosystem/interfaces/EcosystemContext.md +5 -5
  320. package/api/@wtf/release-trains/ecosystem/interfaces/EcosystemPackages.md +3 -3
  321. package/api/@wtf/release-trains/ecosystem/interfaces/Package.md +6 -6
  322. package/api/@wtf/release-trains/ecosystem/type-aliases/DependencyKind.md +1 -1
  323. package/api/@wtf/release-trains/ecosystem/type-aliases/ModuleLoader.md +1 -1
  324. package/api/@wtf/release-trains/ecosystem/variables/DEPENDENCY_KINDS.md +1 -1
  325. package/api/@wtf/release-trains/errors/classes/TrainsError.md +5 -5
  326. package/api/@wtf/release-trains/errors/type-aliases/TrainsErrorCode.md +1 -1
  327. package/api/@wtf/release-trains/errors/variables/TRAINS_ERRORS.md +1 -1
  328. package/api/@wtf/release-trains/generated/functions/filesIn.md +1 -1
  329. package/api/@wtf/release-trains/generated/functions/formatGenerated.md +1 -1
  330. package/api/@wtf/release-trains/generated/functions/listGenerated.md +1 -1
  331. package/api/@wtf/release-trains/generated/functions/parseGenerated.md +1 -1
  332. package/api/@wtf/release-trains/generated/functions/readGenerated.md +1 -1
  333. package/api/@wtf/release-trains/generated/functions/stageGenerated.md +1 -1
  334. package/api/@wtf/release-trains/generated/functions/stageGeneratedFolders.md +1 -1
  335. package/api/@wtf/release-trains/generated/functions/unlistedIn.md +1 -1
  336. package/api/@wtf/release-trains/generated/interfaces/GeneratedOptions.md +2 -2
  337. package/api/@wtf/release-trains/generated/interfaces/StageOptions.md +6 -6
  338. package/api/@wtf/release-trains/generated/variables/GENERATED.md +1 -1
  339. package/api/@wtf/release-trains/git/functions/tagOf.md +1 -1
  340. package/api/@wtf/release-trains/git/functions/tagsOf.md +1 -1
  341. package/api/@wtf/release-trains/git/functions/versionOfTag.md +1 -1
  342. package/api/@wtf/release-trains/git/interfaces/TrainTag.md +3 -3
  343. package/api/@wtf/release-trains/interfaces/Train.md +7 -7
  344. package/api/@wtf/release-trains/packages/functions/dependencyEdges.md +1 -1
  345. package/api/@wtf/release-trains/packages/functions/dependencyText.md +1 -1
  346. package/api/@wtf/release-trains/packages/functions/dependsOnErrors.md +1 -1
  347. package/api/@wtf/release-trains/packages/functions/normalizeDir.md +1 -1
  348. package/api/@wtf/release-trains/packages/functions/ownersOf.md +1 -1
  349. package/api/@wtf/release-trains/packages/functions/packagesOf.md +1 -1
  350. package/api/@wtf/release-trains/packages/functions/publishOrder.md +1 -1
  351. package/api/@wtf/release-trains/packages/functions/releasedVersions.md +1 -1
  352. package/api/@wtf/release-trains/packages/functions/trainDependencies.md +1 -1
  353. package/api/@wtf/release-trains/packages/functions/trainOrder.md +1 -1
  354. package/api/@wtf/release-trains/packages/functions/unsatisfiedErrors.md +1 -1
  355. package/api/@wtf/release-trains/packages/interfaces/DependencyEdge.md +6 -6
  356. package/api/@wtf/release-trains/packages/interfaces/OrderFault.md +4 -4
  357. package/api/@wtf/release-trains/packages/interfaces/OrderPins.md +3 -3
  358. package/api/@wtf/release-trains/packages/interfaces/PublishOrder.md +3 -3
  359. package/api/@wtf/release-trains/packages/interfaces/TrainDependency.md +3 -3
  360. package/api/@wtf/release-trains/packages/interfaces/VersionsRelease.md +7 -7
  361. package/api/@wtf/release-trains/paths/functions/filterCommits.md +1 -1
  362. package/api/@wtf/release-trains/paths/functions/gitFilesOf.md +1 -1
  363. package/api/@wtf/release-trains/paths/functions/overlapError.md +1 -1
  364. package/api/@wtf/release-trains/paths/functions/trainOfPath.md +1 -1
  365. package/api/@wtf/release-trains/paths/functions/trainsOfCommit.md +1 -1
  366. package/api/@wtf/release-trains/paths/functions/trainsOfPath.md +1 -1
  367. package/api/@wtf/release-trains/paths/type-aliases/FilesOf.md +1 -1
  368. package/api/@wtf/release-trains/schema/interfaces/ConfigPart.md +6 -6
  369. package/api/@wtf/release-trains/schema/interfaces/RootOptions.md +7 -7
  370. package/api/@wtf/release-trains/schema/type-aliases/DependencyRule.md +1 -1
  371. package/api/@wtf/release-trains/schema/variables/DEPENDENCY_RULES.md +1 -1
  372. package/api/@wtf/release-trains/schema/variables/TAG_FORMAT_PATTERN.md +1 -1
  373. package/api/@wtf/release-trains/schema/variables/TRAIN_NAME_PATTERN.md +1 -1
  374. package/api/@wtf/release-trains/schema/variables/configSchema.md +1 -1
  375. package/api/@wtf/release-trains/schema/variables/jsonSchema.md +1 -1
  376. package/api/@wtf/release-trains/schema/variables/rootOptionsSchema.md +1 -1
  377. package/api/@wtf/release-trains/schema/variables/trainSchema.md +1 -1
  378. package/api/@wtf/release-trains/schema/variables/trainsSchema.md +1 -1
  379. package/api/@wtf/release-trains/trains/functions/changelogOf.md +1 -1
  380. package/api/@wtf/release-trains/trains/functions/matchersOf.md +1 -1
  381. package/api/@wtf/release-trains/trains/functions/overlapErrors.md +1 -1
  382. package/api/@wtf/release-trains/trains/functions/selectTrain.md +1 -1
  383. package/api/@wtf/release-trains/trains/functions/tagFormatOf.md +1 -1
  384. package/api/@wtf/release-trains/trains/functions/trainHeadedNotes.md +1 -1
  385. package/api/@wtf/release-trains/trains/functions/trainOfRun.md +1 -1
  386. package/api/@wtf/release-trains/trains/functions/trainOfTag.md +1 -1
  387. package/api/@wtf/release-trains/trains/functions/trainsErrors.md +1 -1
  388. package/api/@wtf/release-trains/trains/functions/trainsOfOptions.md +1 -1
  389. package/api/@wtf/release-trains/trains/variables/TRAIN_VARIABLE.md +1 -1
  390. package/api/@wtf/release-trains/trains/variables/VERSION.md +1 -1
  391. package/api/@wtf/release-trains/type-aliases/BranchSpec.md +1 -1
  392. package/api/@wtf/release-trains/type-aliases/Trains.md +1 -1
  393. package/api/@wtf/release-trains/verify/functions/unreleasedDependencies.md +1 -1
  394. package/api/@wtf/release-trains/verify/functions/verifyTrain.md +1 -1
  395. package/api/@wtf/release-trains/verify/interfaces/UnreleasedDependencies.md +10 -10
  396. package/api/@wtf/release-trains/verify/interfaces/VerifiedTrain.md +5 -5
  397. package/api/@wtf/release-trains/verify/interfaces/VerifyRelease.md +8 -8
  398. package/api/@wtf/release-validate/errors/classes/ValidateError.md +5 -5
  399. package/api/@wtf/release-validate/errors/type-aliases/ValidateErrorCode.md +1 -1
  400. package/api/@wtf/release-validate/errors/variables/VALIDATE_ERRORS.md +1 -1
  401. package/api/@wtf/release-validate/interfaces/ConfigIssue.md +4 -4
  402. package/api/@wtf/release-validate/json-schema/functions/fromJsonSchema.md +1 -1
  403. package/api/@wtf/release-validate/json-schema/functions/pathOfPointer.md +1 -1
  404. package/api/@wtf/release-validate/json-schema/interfaces/JsonSchemaError.md +3 -3
  405. package/api/@wtf/release-validate/json-schema/interfaces/JsonSchemaValidator.md +3 -3
  406. package/api/@wtf/release-validate/validate/functions/configErrors.md +1 -1
  407. package/api/@wtf/release-validate/validate/functions/isStandardSchema.md +1 -1
  408. package/api/@wtf/release-validate/validate/functions/pathText.md +1 -1
  409. package/api/@wtf/release-validate/validate/functions/validateConfig.md +1 -1
  410. package/api/@wtf/semantic-release-cargo/functions/indexLookup.md +1 -1
  411. package/api/@wtf/semantic-release-cargo/functions/prepare.md +1 -1
  412. package/api/@wtf/semantic-release-cargo/functions/publish.md +1 -1
  413. package/api/@wtf/semantic-release-cargo/functions/verifyConditions.md +1 -1
  414. package/api/@wtf/semantic-release-cargo/interfaces/CargoPluginOptions.md +12 -12
  415. package/api/@wtf/semantic-release-cargo/interfaces/CargoRelease.md +3 -3
  416. package/api/@wtf/semantic-release-cargo/schema/type-aliases/CargoOptions.md +1 -1
  417. package/api/@wtf/semantic-release-cargo/schema/variables/cargoOptionsSchema.md +1 -1
  418. package/api/@wtf/semantic-release-cargo/schema/variables/cargoSchema.md +1 -1
  419. package/api/@wtf/semantic-release-cargo/schema/variables/configSchema.md +1 -1
  420. package/api/@wtf/semantic-release-cargo/schema/variables/jsonSchema.md +1 -1
  421. package/api/@wtf/semantic-release-cargo/variables/default.md +1 -1
  422. package/api/@wtf/semantic-release-go/functions/prepare.md +1 -1
  423. package/api/@wtf/semantic-release-go/functions/publish.md +1 -1
  424. package/api/@wtf/semantic-release-go/functions/verifyConditions.md +1 -1
  425. package/api/@wtf/semantic-release-go/functions/verifyRelease.md +1 -1
  426. package/api/@wtf/semantic-release-go/interfaces/GoPluginOptions.md +8 -8
  427. package/api/@wtf/semantic-release-go/interfaces/GoRelease.md +3 -3
  428. package/api/@wtf/semantic-release-go/schema/type-aliases/GoOptions.md +1 -1
  429. package/api/@wtf/semantic-release-go/schema/variables/configSchema.md +1 -1
  430. package/api/@wtf/semantic-release-go/schema/variables/goOptionsSchema.md +1 -1
  431. package/api/@wtf/semantic-release-go/schema/variables/goSchema.md +1 -1
  432. package/api/@wtf/semantic-release-go/schema/variables/jsonSchema.md +1 -1
  433. package/api/@wtf/semantic-release-go/variables/default.md +1 -1
  434. package/api/@wtf/semantic-release-maven/functions/pomLookup.md +1 -1
  435. package/api/@wtf/semantic-release-maven/functions/prepare.md +1 -1
  436. package/api/@wtf/semantic-release-maven/functions/publish.md +1 -1
  437. package/api/@wtf/semantic-release-maven/functions/verifyConditions.md +1 -1
  438. package/api/@wtf/semantic-release-maven/interfaces/LookupAuth.md +3 -3
  439. package/api/@wtf/semantic-release-maven/interfaces/MavenPluginOptions.md +12 -12
  440. package/api/@wtf/semantic-release-maven/interfaces/MavenRelease.md +2 -2
  441. package/api/@wtf/semantic-release-maven/schema/type-aliases/MavenOptions.md +1 -1
  442. package/api/@wtf/semantic-release-maven/schema/variables/configSchema.md +1 -1
  443. package/api/@wtf/semantic-release-maven/schema/variables/jsonSchema.md +1 -1
  444. package/api/@wtf/semantic-release-maven/schema/variables/mavenOptionsSchema.md +1 -1
  445. package/api/@wtf/semantic-release-maven/schema/variables/mavenSchema.md +1 -1
  446. package/api/@wtf/semantic-release-maven/variables/default.md +1 -1
  447. package/api/@wtf/semantic-release-npm/functions/addChannel.md +1 -1
  448. package/api/@wtf/semantic-release-npm/functions/fail.md +1 -1
  449. package/api/@wtf/semantic-release-npm/functions/loadPublisher.md +1 -1
  450. package/api/@wtf/semantic-release-npm/functions/prepare.md +1 -1
  451. package/api/@wtf/semantic-release-npm/functions/publish.md +1 -1
  452. package/api/@wtf/semantic-release-npm/functions/verifyConditions.md +1 -1
  453. package/api/@wtf/semantic-release-npm/interfaces/PublishPluginOptions.md +18 -18
  454. package/api/@wtf/semantic-release-npm/interfaces/PublishedRelease.md +4 -4
  455. package/api/@wtf/semantic-release-npm/interfaces/SmokeOption.md +2 -2
  456. package/api/@wtf/semantic-release-npm/schema/type-aliases/PublishOptions.md +1 -1
  457. package/api/@wtf/semantic-release-npm/schema/variables/configSchema.md +1 -1
  458. package/api/@wtf/semantic-release-npm/schema/variables/jsonSchema.md +1 -1
  459. package/api/@wtf/semantic-release-npm/schema/variables/publishOptionsSchema.md +1 -1
  460. package/api/@wtf/semantic-release-npm/schema/variables/publishSchema.md +1 -1
  461. package/api/@wtf/semantic-release-npm/type-aliases/PublisherSpec.md +1 -1
  462. package/api/@wtf/semantic-release-npm/variables/default.md +1 -1
  463. package/api/@wtf/semantic-release-replace/functions/functionOf.md +1 -1
  464. package/api/@wtf/semantic-release-replace/functions/prepare.md +1 -1
  465. package/api/@wtf/semantic-release-replace/functions/templatesOf.md +1 -1
  466. package/api/@wtf/semantic-release-replace/functions/verifyConditions.md +1 -1
  467. package/api/@wtf/semantic-release-replace/interfaces/ReplacePluginOptions.md +5 -5
  468. package/api/@wtf/semantic-release-replace/schema/interfaces/ModuleExport.md +3 -3
  469. package/api/@wtf/semantic-release-replace/schema/interfaces/ReplaceOptions.md +4 -4
  470. package/api/@wtf/semantic-release-replace/schema/interfaces/RootTemplates.md +2 -2
  471. package/api/@wtf/semantic-release-replace/schema/type-aliases/PluginReplacement.md +1 -1
  472. package/api/@wtf/semantic-release-replace/schema/type-aliases/PluginReplacementSpec.md +1 -1
  473. package/api/@wtf/semantic-release-replace/schema/type-aliases/PluginTemplates.md +1 -1
  474. package/api/@wtf/semantic-release-replace/schema/type-aliases/PluginTo.md +1 -1
  475. package/api/@wtf/semantic-release-replace/schema/type-aliases/TemplateSet.md +1 -1
  476. package/api/@wtf/semantic-release-replace/schema/type-aliases/TemplatesOption.md +1 -1
  477. package/api/@wtf/semantic-release-replace/schema/variables/configSchema.md +1 -1
  478. package/api/@wtf/semantic-release-replace/schema/variables/exportedSetSchema.md +1 -1
  479. package/api/@wtf/semantic-release-replace/schema/variables/jsonSchema.md +1 -1
  480. package/api/@wtf/semantic-release-replace/schema/variables/replaceOptionsSchema.md +1 -1
  481. package/api/@wtf/semantic-release-replace/schema/variables/replacementSchema.md +1 -1
  482. package/api/@wtf/semantic-release-replace/schema/variables/rootTemplatesSchema.md +1 -1
  483. package/api/@wtf/semantic-release-replace/schema/variables/templateSchema.md +1 -1
  484. package/api/@wtf/semantic-release-replace/schema/variables/templatesSchema.md +1 -1
  485. package/api/@wtf/semantic-release-replace/variables/default.md +1 -1
  486. package/api/@wtf/semantic-release-trains/config/functions/skipPlugins.md +1 -1
  487. package/api/@wtf/semantic-release-trains/config/functions/stepId.md +1 -1
  488. package/api/@wtf/semantic-release-trains/config/functions/trainAssets.md +1 -1
  489. package/api/@wtf/semantic-release-trains/config/functions/trainChangelog.md +1 -1
  490. package/api/@wtf/semantic-release-trains/config/functions/trainOfTag.md +1 -1
  491. package/api/@wtf/semantic-release-trains/config/functions/trainTagFormat.md +1 -1
  492. package/api/@wtf/semantic-release-trains/config/interfaces/AssetsOptions.md +4 -4
  493. package/api/@wtf/semantic-release-trains/config/interfaces/SkipOptions.md +3 -3
  494. package/api/@wtf/semantic-release-trains/config/variables/BRANCHES.md +1 -1
  495. package/api/@wtf/semantic-release-trains/config/variables/BREAKING.md +1 -1
  496. package/api/@wtf/semantic-release-trains/config/variables/TITLE.md +1 -1
  497. package/api/@wtf/semantic-release-trains/defaults/functions/skipRuleOf.md +1 -1
  498. package/api/@wtf/semantic-release-trains/defaults/functions/skips.md +1 -1
  499. package/api/@wtf/semantic-release-trains/defaults/functions/trainOptionsOf.md +1 -1
  500. package/api/@wtf/semantic-release-trains/defaults/interfaces/SkipContext.md +5 -5
  501. package/api/@wtf/semantic-release-trains/defaults/type-aliases/SkipCheck.md +1 -1
  502. package/api/@wtf/semantic-release-trains/defaults/type-aliases/TrainOptions.md +1 -1
  503. package/api/@wtf/semantic-release-trains/defaults/variables/SKIP_RULES.md +1 -1
  504. package/api/@wtf/semantic-release-trains/defaults/variables/TRAIN_OPTIONS.md +4 -3
  505. package/api/@wtf/semantic-release-trains/defaults/variables/TRAIN_SKIP.md +1 -1
  506. package/api/@wtf/semantic-release-trains/errors/type-aliases/PluginErrorCode.md +1 -1
  507. package/api/@wtf/semantic-release-trains/errors/variables/PLUGIN_ERRORS.md +1 -1
  508. package/api/@wtf/semantic-release-trains/info/functions/decideTrain.md +1 -1
  509. package/api/@wtf/semantic-release-trains/info/functions/dotenvOf.md +1 -1
  510. package/api/@wtf/semantic-release-trains/info/functions/infoOf.md +1 -1
  511. package/api/@wtf/semantic-release-trains/info/interfaces/DecideRun.md +4 -4
  512. package/api/@wtf/semantic-release-trains/info/interfaces/InfoRun.md +8 -8
  513. package/api/@wtf/semantic-release-trains/info/interfaces/TrainDecision.md +5 -5
  514. package/api/@wtf/semantic-release-trains/info/interfaces/TrainInfo.md +5 -5
  515. package/api/@wtf/semantic-release-trains/interfaces/TrainsEntryOptions.md +5 -5
  516. package/api/@wtf/semantic-release-trains/interfaces/TrainsOptions.md +7 -7
  517. package/api/@wtf/semantic-release-trains/schema/variables/configSchema.md +1 -1
  518. package/api/@wtf/semantic-release-trains/schema/variables/jsonSchema.md +1 -1
  519. package/api/@wtf/semantic-release-trains/schema/variables/pluginSpecSchema.md +1 -1
  520. package/api/@wtf/semantic-release-trains/schema/variables/skipRuleSchema.md +1 -1
  521. package/api/@wtf/semantic-release-trains/schema/variables/trainsEntrySchema.md +1 -1
  522. package/api/@wtf/semantic-release-trains/schema/variables/trainsPluginSchema.md +1 -1
  523. package/api/@wtf/semantic-release-trains/type-aliases/PluginSpec.md +1 -1
  524. package/api/@wtf/semantic-release-trains/type-aliases/TrainsPluginOptions.md +1 -1
  525. package/api/@wtf/semantic-release-trains/variables/addChannel.md +1 -1
  526. package/api/@wtf/semantic-release-trains/variables/analyzeCommits.md +1 -1
  527. package/api/@wtf/semantic-release-trains/variables/default.md +1 -1
  528. package/api/@wtf/semantic-release-trains/variables/fail.md +1 -1
  529. package/api/@wtf/semantic-release-trains/variables/generateNotes.md +1 -1
  530. package/api/@wtf/semantic-release-trains/variables/prepare.md +1 -1
  531. package/api/@wtf/semantic-release-trains/variables/publish.md +1 -1
  532. package/api/@wtf/semantic-release-trains/variables/success.md +1 -1
  533. package/api/@wtf/semantic-release-trains/variables/verifyConditions.md +1 -1
  534. package/api/@wtf/semantic-release-trains/variables/verifyRelease.md +1 -1
  535. package/api/@wtf/semantic-release-validate/functions/configOf.md +1 -1
  536. package/api/@wtf/semantic-release-validate/functions/loadSchema.md +1 -1
  537. package/api/@wtf/semantic-release-validate/functions/verifyConditions.md +1 -1
  538. package/api/@wtf/semantic-release-validate/interfaces/ValidatePluginOptions.md +2 -2
  539. package/api/@wtf/semantic-release-validate/schema/interfaces/Validator.md +2 -2
  540. package/api/@wtf/semantic-release-validate/schema/variables/configSchema.md +1 -1
  541. package/api/@wtf/semantic-release-validate/schema/variables/jsonSchema.md +1 -1
  542. package/api/@wtf/semantic-release-validate/schema/variables/validateOptionsSchema.md +1 -1
  543. package/api/@wtf/semantic-release-validate/variables/default.md +1 -1
  544. package/guides/changelogs.md +39 -28
  545. package/guides/ci-recipes.md +393 -271
  546. package/guides/configuring-trains.md +291 -203
  547. package/guides/dependency-rules.md +171 -113
  548. package/guides/ecosystems.md +222 -156
  549. package/guides/getting-started.md +135 -69
  550. package/guides/publishing-crates.md +208 -143
  551. package/guides/publishing-go-modules.md +170 -110
  552. package/guides/publishing-maven.md +197 -123
  553. package/guides/publishing.md +278 -191
  554. package/guides/system.md +50 -34
  555. package/guides/troubleshooting.md +358 -92
  556. package/guides/validating-a-config.md +68 -49
  557. package/package.json +3 -3
@@ -1,31 +1,48 @@
1
- # CI recipes
1
+ # Run releases in CI
2
2
 
3
- Each train is one run of semantic-release, so CI runs one job for each train. Two rules apply to
4
- all CI systems:
3
+ This page shows how to run the releases of your trains in CI, on GitLab CI and on GitHub Actions.
4
+ Pick the recipe that matches your setup, and copy its YAML.
5
5
 
6
- - **One push at a time.** Each run pushes a release commit and a tag to the same branch. Two runs at
7
- the same time race: the second push is rejected. Serialize the jobs.
8
- - **The full history.** The plugin reads the files of each commit and the tags of each train.
9
- Clone with all of the history and all of the tags, not a shallow clone.
6
+ ## How a release runs in CI
10
7
 
11
- Give the jobs the token that semantic-release pushes with, as for any run of semantic-release:
12
- `GITLAB_TOKEN` on GitLab, `GITHUB_TOKEN` on GitHub.
8
+ Each train is one run of semantic-release. CI runs semantic-release once for each train: either in
9
+ one job per train, or in one job that runs the trains in turn. Every recipe on this page follows the
10
+ same rules:
13
11
 
14
- Build before the release, in a job of its own, and give the release job what it built: the release
15
- runs no build. A build that generates a folder the release commits, as an API reference, lists what
16
- it wrote in the folder's `.generated` (`listGenerated` of `@wtf/release-trains/generated`), so the
17
- release stages it as built, deletions too. Nothing else runs between the plugins.
12
+ - **One push at a time.** Each run pushes a release commit and a tag to the same branch. When two
13
+ runs push at the same time, the second push is rejected. Run the releases one after another.
14
+ - **The full history.** The plugin reads the files that each commit changes, and the tags of each
15
+ train. Clone all of the history and all of the tags. A shallow clone does not work.
16
+ - **A token that can push.** Give the jobs the token that semantic-release pushes with, as for any
17
+ semantic-release run: `GITLAB_TOKEN` on GitLab, `GITHUB_TOKEN` on GitHub.
18
+ - **Build first.** Build in a job of its own before the release, and pass what it built to the
19
+ release job. The release runs no build. Nothing else runs between the plugins.
20
+
21
+ Some builds generate a folder that the release commits, such as an API reference. Such a build
22
+ lists what it wrote in the folder's `.generated` file, with `listGenerated` from
23
+ `@wtf/release-trains/generated`. The release then stages the folder exactly as it was built,
24
+ deletions included.
18
25
 
19
26
  ## GitLab CI
20
27
 
21
- A `parallel: matrix` gives one job for each train. A `resource_group` lets only one job of the group
22
- run at a time, so the pushes do not race. Each job fetches the branch again before it starts, and
23
- checks out its tip, as semantic-release releases nothing of a commit behind the tip: so it sees the
24
- release commit of the job before it, and a retry of a job whose publish failed runs at its own
25
- release commit. The tip must be the pipeline's commit with release commits alone on top: a commit
26
- merged since was not built, and the job stops. A release commit is known by its subject; where
27
- anyone may push one by hand, check what it changes too, as `git diff --quiet` of the pipeline's
28
- commit and the tip, of all but the changelogs and the generated folders.
28
+ This recipe releases each train in a manual job of its own, one job at a time. Each part of the
29
+ YAML below does one thing:
30
+
31
+ 1. `parallel: matrix` creates one job for each train, with `RELEASE_TRAIN` set to the train. List
32
+ the trains in the order of their dependencies.
33
+ 2. `resource_group: release` lets only one job of the group run at a time, so the pushes do not
34
+ race.
35
+ 3. `needs: [build]` gives the job what the build job built: each `dist`, and the generated folders
36
+ with their lists.
37
+ 4. The script fetches the branch again and checks out its tip. semantic-release releases nothing
38
+ from a commit that is behind the tip. On the tip, the job sees the release commit that the job
39
+ before it pushed. A retry of a job whose publish failed also runs at its own release commit.
40
+ 5. Before the checkout, the script checks that the tip is the pipeline's commit with only release
41
+ commits on top. A commit merged since then was not built, so the job stops.
42
+
43
+ The check knows a release commit by its subject. If anyone can push such a commit by hand, also
44
+ check what it changes. For example, run `git diff --quiet` between the pipeline's commit and the
45
+ tip, on everything except the changelogs and the generated folders.
29
46
 
30
47
  ```yaml
31
48
  release:
@@ -61,8 +78,8 @@ release:
61
78
  - pnpm exec semantic-release
62
79
  ```
63
80
 
64
- With a JSON config, as `.releaserc.json`, which cannot write the tag format of the train, the job
65
- gives it on the command line, of `RELEASE_TRAIN`:
81
+ A JSON config, such as `.releaserc.json`, cannot write the train's tag format. Pass the tag format
82
+ on the command line instead, built from `RELEASE_TRAIN`:
66
83
 
67
84
  ```yaml
68
85
  release:
@@ -73,23 +90,36 @@ release:
73
90
  - pnpm exec semantic-release --tag-format "${RELEASE_TRAIN}-v\${version}"
74
91
  ```
75
92
 
76
- GitLab runs the jobs of a resource group one at a time, in no fixed order by default. When the order
77
- matters, set the `process_mode` of the resource group to `oldest_first` with the API
78
- (`PUT /projects/:id/resource_groups/release`), or write one job for each train, each with `needs:`
79
- on the job of the train that it depends on.
80
-
81
- The job publishes too, when the config lists the publish plugin: it packs in `prepare`, and
82
- publishes in the `publish` step, after the release commit and the tag are pushed. A job that fails
83
- there has pushed both: delete the tag on the remote and retry the job, which checks the branch out
84
- at the release commit and publishes what the registry lacks (see
85
- [Publishing](publishing.md#when-a-publish-fails)). A retry that finds the tag still on the remote
86
- finds the release done, publishes nothing, and passes: delete the tag first, or have the job fail
87
- where `git ls-remote --exit-code --tags origin` finds the tag of the train at the release commit's
88
- version. Of a repo of one train, a tag of the release commit, found by its hash, serves as well, of
89
- no tag format; not of a matrix, whose job runs at the release commit of the train before it, with
90
- that train's tag.
91
- Give the job the ID token of npm's trusted publishing, or the token of npm in an `.npmrc`, and
92
- Sigstore's, which npm signs the provenance by:
93
+ ### Release the trains in order
94
+
95
+ GitLab runs the jobs of a resource group one at a time, but in no fixed order by default. When the
96
+ order matters, do one of these:
97
+
98
+ - Set the resource group's `process_mode` to `oldest_first` with the API
99
+ (`PUT /projects/:id/resource_groups/release`).
100
+ - Write one job for each train, each with `needs:` on the job of the train that it depends on.
101
+
102
+ ### Publish in the release job
103
+
104
+ When the config lists the publish plugin, the release job publishes too. It packs in `prepare`. It
105
+ publishes in the `publish` step, after it has pushed the release commit and the tag.
106
+
107
+ So a job that fails in `publish` has already pushed both. To finish the release:
108
+
109
+ 1. Delete the tag on the remote.
110
+ 2. Retry the job. It checks out the branch at the release commit, and publishes what the registry
111
+ does not have yet. See [Publishing](publishing.md#when-a-publish-fails).
112
+
113
+ If the tag is still on the remote, the retry finds the release done. It publishes nothing and
114
+ passes. So delete the tag first, or make the job fail when
115
+ `git ls-remote --exit-code --tags origin` finds the train's tag for the release commit's version.
116
+
117
+ In a repo with one train, you can instead look for a tag on the release commit by its hash,
118
+ whatever the tag format. This does not work in a matrix: there, the job runs at the release commit
119
+ of the train before it, which carries that train's tag.
120
+
121
+ Give the job the ID token of npm's trusted publishing, or an npm token in an `.npmrc`. Also give it
122
+ Sigstore's ID token: npm signs the provenance with it.
93
123
 
94
124
  ```yaml
95
125
  release:
@@ -105,25 +135,41 @@ release:
105
135
  when: script_failure
106
136
  ```
107
137
 
108
- ### Publishing from the tag
109
-
110
- Or publish in a job of the tag's pipeline, not in the release job, by the same plugins: the release
111
- job's run lists no publish plugin, so it writes the changelog, commits, and pushes the tag alone,
112
- and the tag's job runs the plugins of the publish and of the release of the host of the tagged
113
- commit, as its pipeline built it. A publish that fails is then a retry of that job alone:
114
- semantic-release runs once a release, so the stock `@semantic-release/changelog` serves, and the
115
- release of the host comes after the publish, so it names no version the registry has not. The
116
- release job still runs at its pipeline's commit: one that fails after `@semantic-release/git` pushed
117
- the release commit, as of the push of the tag, cannot be retried, as the retry runs behind the
118
- release commit and releases nothing; finish that release by hand.
119
-
120
- semantic-release releases no tag it has, so the tag's job runs `semantic-release-trains-tag`, the
121
- bin of `@wtf/semantic-release-trains/tag`: semantic-release's own config, plugins and branches, of
122
- its run but its decision and its tag. The version is the tag's; the branch the one semantic-release
123
- released it on, of its note of the tag, and so its channel and dist-tag; the notes those the notes
124
- generator writes again of the same commits. Then `verifyConditions`, `verifyRelease`,
125
- `generateNotes`, `prepare`, `publish` and `success`, or `fail` of an error. It sets `RELEASE_TAG`
126
- before it loads the config, which gives the tag's run its plugins by it:
138
+ ### Publish from the tag pipeline
139
+
140
+ You can publish in a job of the tag's pipeline instead of in the release job, with the same
141
+ plugins. The release then happens in two parts:
142
+
143
+ - The branch run lists no publish plugin. It only writes the changelog, commits, and pushes the
144
+ tag.
145
+ - The tag's job runs the publish plugin and the host's release plugin on the tagged commit, as the
146
+ tag's pipeline built it.
147
+
148
+ This has three advantages:
149
+
150
+ - When a publish fails, you retry only that job.
151
+ - semantic-release runs once for each release, so the stock `@semantic-release/changelog` works.
152
+ - The host's release comes after the publish, so it never names a version that the registry does
153
+ not have.
154
+
155
+ One limit remains. The release job still runs at its pipeline's commit. If it fails after
156
+ `@semantic-release/git` pushed the release commit, for example when it pushes the tag, you cannot
157
+ retry it. The retry runs behind the release commit and releases nothing. Finish that release by
158
+ hand.
159
+
160
+ semantic-release does not release a tag that it already has. So the tag's job runs
161
+ `semantic-release-trains-tag`, the bin of `@wtf/semantic-release-trains/tag`. The bin uses
162
+ semantic-release's own config, plugins and branches for the run. It only replaces semantic-release's
163
+ decision and its tag:
164
+
165
+ - The version is the tag's.
166
+ - The branch is the one semantic-release released the tag on, read from semantic-release's note on
167
+ the tag. The branch sets the channel and the dist-tag.
168
+ - The notes are written again by the notes generator, from the same commits.
169
+
170
+ Then the bin runs `verifyConditions`, `verifyRelease`, `generateNotes`, `prepare`, `publish` and
171
+ `success`, or `fail` on an error. It sets `RELEASE_TAG` before it loads the config. The config
172
+ reads it to give the tag's run its plugins:
127
173
 
128
174
  ```js train=trains
129
175
  // release.config.mjs
@@ -166,22 +212,29 @@ publish-release:
166
212
  - pnpm exec semantic-release-trains-tag
167
213
  ```
168
214
 
169
- The tag is the bin's argument, else `CI_COMMIT_TAG`, or `GITHUB_REF_NAME` of a tag's run of GitHub
170
- Actions; `--dry-run` runs no `prepare`, `publish` or `success`, and logs the notes. A version below
171
- the one its dist-tag points at on npm publishes nothing (`EPUBLISHBEHIND`), so a retry of an older
172
- release's job, run after a newer one, moves no dist-tag back; one that npm has already is skipped.
173
- A channel semantic-release adds the release to later, as of a branch merged into another, pushes a
174
- note and no tag, so it starts no pipeline: of such branches, move the dist-tag by `tagTrain`, or by
175
- hand. The bin runs modules of semantic-release that are not its API, of semantic-release 25: check
176
- an upgrade of semantic-release with a `--dry-run` of a tag.
215
+ What the bin does:
216
+
217
+ - It takes the tag as its argument. Without one, it reads `CI_COMMIT_TAG`, or `GITHUB_REF_NAME` in
218
+ a GitHub Actions run for a tag.
219
+ - With `--dry-run`, it runs no `prepare`, `publish` or `success`, and logs the notes.
220
+ - A version below the one its dist-tag points at on npm publishes nothing (`EPUBLISHBEHIND`). So
221
+ when you retry an older release's job after a newer one, no dist-tag moves back. A version that
222
+ npm already has is skipped.
223
+ - When semantic-release later adds a release to another channel, for example when you merge one
224
+ branch into another, it pushes a note and no tag. No pipeline starts. On such branches, move the
225
+ dist-tag with `tagTrain`, or by hand.
226
+ - The bin runs modules of semantic-release 25 that are not semantic-release's API. Check an upgrade
227
+ of semantic-release with a `--dry-run` of a tag.
228
+
229
+ The publish job runs in the tag's pipeline, not in the release commit's pipeline on the branch. The
230
+ `workflow:` rule below skips the release commit's pipeline only on a branch (`$CI_COMMIT_BRANCH`). A
231
+ tag's pipeline has no branch, so it still runs. Make the publish job `needs:` the checks of the
232
+ tagged commit, not only the build, so that a check that fails publishes nothing.
177
233
 
178
- Its pipeline runs of the tag, not of the release commit on the branch: the rule below that skips
179
- the release commit's pipeline is of a branch alone, `$CI_COMMIT_BRANCH`, so the tag's pipeline,
180
- which has none, still runs. Have the publish job `needs:` the checks of the tagged commit, not the
181
- build alone, so a check that fails publishes nothing.
234
+ ### Skip the pipeline of a release commit
182
235
 
183
- The release commit of a train is `chore(release): <train> <version>`. Its pipeline on the branch has
184
- nothing to build, so a `workflow:` rule can skip it:
236
+ A train's release commit has the subject `chore(release): <train> <version>`. Its pipeline on the
237
+ branch has nothing to build, so a `workflow:` rule can skip it:
185
238
 
186
239
  ```yaml
187
240
  workflow:
@@ -191,39 +244,45 @@ workflow:
191
244
  - when: always
192
245
  ```
193
246
 
194
- ### The semantic-release component of to-be-continuous
247
+ ### Use the to-be-continuous semantic-release component
195
248
 
196
249
  The [semantic-release component](https://gitlab.com/to-be-continuous/semantic-release) of
197
- to-be-continuous runs a global install of semantic-release, of no install of the repo: its
198
- `before_script` makes `.releaserc.json` of a `release.config.mjs`, by
199
- `node -pe "JSON.stringify(require('./release.config.mjs').default, null, 2)"`, then installs, by
200
- `npm install --global`, semantic-release and each name of `plugins` (`yq '.plugins[] | select(kind
201
- == "scalar") // .[0]'`), and each line of `semrel-required-plugins.txt`. The plugins of the trains
202
- serve it as it is:
203
-
204
- - the config is [of literals](configuring-trains.md#a-config-of-literals): `require()` takes no
205
- top-level `await`, and the packages of the repo are not installed yet, so it imports nothing;
206
- - each plugin is a package of its own, which the install installs by the name the config gives it,
207
- as many times as the config lists it, and each of its options is JSON, as the config is made
208
- JSON: the plugin of the trains is one package, of an entry for each role;
209
- - an entry of `wrap` finds the plugin it wraps as semantic-release finds a plugin: the commit
210
- analyzer and the release notes generator in the node_modules of the global semantic-release, and
211
- any other beside it, of the global install; a wrapped plugin that is no dependency of
212
- semantic-release, as `@semantic-release/gitlab`, is not a name of `plugins`: list it in
213
- `semrel-required-plugins.txt`;
214
- - `@wtf/semantic-release-replace` imports a package of templates beside it, of the global install
215
- too: list it in `semrel-required-plugins.txt` as well;
216
- - the jobs of [the pipeline of a tag](#the-pipeline-of-a-tag) install of the component too, and
217
- load the plugins of the tag's run, which no run of a branch names, as
218
- `@wtf/semantic-release-npm`: list each in `semrel-required-plugins.txt`;
219
- - the config names each ecosystem by the `./ecosystem` of its plugin, as
220
- `'@wtf/semantic-release-npm/ecosystem'`, which the install of the plugin brings: the package of
221
- the ecosystem, as `@wtf/release-npm`, lands in the plugin's own node_modules, where the plugin of
222
- the trains does not look, so a config of that name fails with `EECOSYSTEM`.
223
-
224
- The component adds each line of the file to its `npm install` as it is, so the file holds names
225
- alone, with no comment. Of a plugin a wrap needs, a package of templates, as the
226
- `@wtf/replace-shields` of Configuring trains, and the publish of the tag's run:
250
+ to-be-continuous installs semantic-release globally, and does not install your repo. Its
251
+ `before_script` does three things:
252
+
253
+ 1. It writes `.releaserc.json` from your `release.config.mjs`, with
254
+ `node -pe "JSON.stringify(require('./release.config.mjs').default, null, 2)"`.
255
+ 2. It installs semantic-release and each name in `plugins` with `npm install --global`. It reads
256
+ the names with `yq '.plugins[] | select(kind == "scalar") // .[0]'`.
257
+ 3. It also installs each line of `semrel-required-plugins.txt`.
258
+
259
+ The trains' plugins work with the component as it is. Keep these points in mind:
260
+
261
+ - The config must be [a config of literals](configuring-trains.md#a-config-of-literals).
262
+ `require()` does not support a top-level `await`, and the repo's packages are not installed yet,
263
+ so the config imports nothing.
264
+ - Each plugin is a package of its own. The install installs it by the name that the config gives
265
+ it, as many times as the config lists it. Each of its options must be JSON, because the config is
266
+ turned into JSON. The trains plugin is one package, with an entry for each role.
267
+ - A `wrap` entry finds the plugin it wraps the way semantic-release finds a plugin. The commit
268
+ analyzer and the release notes generator are in the node_modules of the global semantic-release.
269
+ Any other wrapped plugin must sit beside it, in the global install. A wrapped plugin that is not a
270
+ dependency of semantic-release, such as `@semantic-release/gitlab`, is not a name in `plugins`:
271
+ list it in `semrel-required-plugins.txt`.
272
+ - `@wtf/semantic-release-replace` imports a package of templates, which must also be in the global
273
+ install. List that package in `semrel-required-plugins.txt` too.
274
+ - The jobs of [the tag pipeline](#build-smoke-test-and-publish-in-a-tag-pipeline) also install
275
+ through the component. They load the plugins of the tag's run, which no branch run names, such as
276
+ `@wtf/semantic-release-npm`. List each of them in `semrel-required-plugins.txt`.
277
+ - Name each ecosystem by its plugin's `./ecosystem` export, such as
278
+ `'@wtf/semantic-release-npm/ecosystem'`. The plugin's install brings it. The ecosystem's own
279
+ package, such as `@wtf/release-npm`, lands in the plugin's own node_modules, where the trains
280
+ plugin does not look. A config that names that package fails with `EECOSYSTEM`.
281
+
282
+ The component adds each line of the file to its `npm install` as it is. So the file holds only
283
+ names, with no comments. This file lists a plugin that a wrap needs, a package of templates (the
284
+ `@wtf/replace-shields` of [Configure trains](configuring-trains.md)), and the publish plugin of the
285
+ tag's run:
227
286
 
228
287
  ```text
229
288
  @semantic-release/gitlab
@@ -231,11 +290,14 @@ alone, with no comment. Of a plugin a wrap needs, a package of templates, as the
231
290
  @wtf/semantic-release-npm
232
291
  ```
233
292
 
234
- One job of the component releases the trains, one run of semantic-release for each train that
235
- `RELEASE_TRAINS` names, in the order of the trains of the config, so one click releases them all. A train with no commit that releases
236
- it releases nothing and passes, and the next one runs; so a retry of the job, after a run that
237
- failed, passes the trains it released already, as each has nothing left to release, and goes on
238
- from the train that failed. Of the trains of these guides, the job releases `system`, `trains`,
293
+ #### Release every train in one job
294
+
295
+ One job of the component releases the trains. It runs semantic-release once for each train that
296
+ `RELEASE_TRAINS` names, in the order of the config's trains, so one click releases them all.
297
+
298
+ A train that has no commit to release releases nothing and passes, and the next train runs. So when
299
+ you retry the job after a failed run, it passes the trains that it released already, and goes on
300
+ from the train that failed. For the trains of these guides, the job releases `system`, `trains`,
239
301
  `replace`, `validate` and `docs`:
240
302
 
241
303
  ```yaml
@@ -316,33 +378,38 @@ semantic-release:
316
378
  done
317
379
  ```
318
380
 
319
- `RELEASE_TRAINS` is the input `release-trains` of the pipeline, a multi-select of the trains, all of
320
- them by default. A component of to-be-continuous maps each of its inputs to a variable, which a
321
- variable of the same name overrides: so a variable of the CI/CD settings, of "Run pipeline", or of
322
- the start of the manual job, as `RELEASE_TRAINS=docs`, names the trains instead. Whichever names
323
- them, and in whatever order, the job releases them in the order of the trains of the config, each
324
- after the trains it depends on, and fails on a name of no train.
325
-
326
- The component installs the plugins of one config, which its `before_script` makes
327
- `.releaserc.json` of, by the `RELEASE_TRAIN` of the job: give it the train whose run names every
328
- plugin that a run of any train names, so its one install serves every run. Of the config below,
329
- that is `docs`, whose run names the others' plugins, and the build of the reference too. The script
330
- removes `.releaserc.json`, which semantic-release would read before `release.config.mjs`, and runs
331
- each train of its own `RELEASE_TRAIN`, so each reads `release.config.mjs` again, of its own train
332
- and tag format.
333
-
334
- The job releases from the tip of the branch, as a run of a train pushes its release commit, which
335
- the run of the next train starts from, in the same job; and a retry starts behind the release
336
- commits of the run that failed. Its `before_script` checks out the tip only when every commit past
337
- the pipeline's commit is a `chore(release):` commit, which the pipeline built; of any other commit,
338
- it fails, and the pipeline of the tip releases it.
339
-
340
- The order is the config's to hold: with `dependencies: 'fail'` at the root, a run of `trains` or of
341
- `replace` fails while `system` has commits it has not released, and a run of `docs`, of
342
- `dependsOn`, while any train it names has. So a set out of order, or a train chosen alone, fails rather than release against
343
- what is not released; release the train it names first. A train whose dependency train released a
344
- version outside a range that its last release published releases too, of no commit of its own
345
- (`cascade`): a major of `system` releases `trains` and `replace` after it, in the same click. See
381
+ Each part of the YAML does one thing:
382
+
383
+ 1. **Choose the trains.** `RELEASE_TRAINS` is the pipeline's input `release-trains`, a multi-select
384
+ of the trains, all of them by default. A to-be-continuous component maps each input to a
385
+ variable, and a variable of the same name overrides it. So you can also name the trains with a
386
+ variable in the CI/CD settings, in "Run pipeline", or when you start the manual job, such as
387
+ `RELEASE_TRAINS=docs`.
388
+ 2. **Install the plugins of one train.** The component's `before_script` writes `.releaserc.json`
389
+ from the config of the job's `RELEASE_TRAIN`, and installs that config's plugins. Give it the
390
+ train whose run names every plugin that any train's run names, so that one install serves every
391
+ run. In the config below, that train is `docs`: its run names the other trains' plugins, and the
392
+ build of the reference too.
393
+ 3. **Start from the tip of the branch.** Each train's run pushes its release commit, and the next
394
+ train's run starts from it, in the same job. A retry starts behind the release commits of the run
395
+ that failed. So the `before_script` checks out the tip, but only when every commit past the
396
+ pipeline's commit is a `chore(release):` commit, which the pipeline built. If there is any other
397
+ commit, the job fails, and the tip's pipeline releases it.
398
+ 4. **Release in the config's order.** The script removes `.releaserc.json`, which semantic-release
399
+ would read before `release.config.mjs`. It then runs each train with its own `RELEASE_TRAIN`, so
400
+ each run reads `release.config.mjs` again, with its own train and tag format. Whatever names the
401
+ trains, and in whatever order, the job releases them in the order of the config's trains, each
402
+ after the trains it depends on. It fails on a name that is not a train.
403
+
404
+ The config keeps the order safe. With `dependencies: 'fail'` at the root, a run of `trains` or
405
+ `replace` fails while `system` has commits that it has not released. A run of `docs` fails, through
406
+ its `dependsOn`, while any train it names has unreleased commits. So a set out of order, or a train
407
+ chosen alone, fails instead of releasing against what is not released. Release the train it names
408
+ first.
409
+
410
+ A train also releases with no commit of its own when a dependency train released a version outside
411
+ a range that the train's last release published (`cascade`). For example, a major of `system`
412
+ releases `trains` and `replace` after it, in the same click. See
346
413
  [Dependency rules](dependency-rules.md).
347
414
 
348
415
  ```js train=docs
@@ -392,29 +459,43 @@ export default {
392
459
  }
393
460
  ```
394
461
 
395
- The job needs `GITLAB_TOKEN`, a token that can push to the branch and create tags, which
396
- `CI_JOB_TOKEN` cannot, as a variable that reaches each ref it releases: a protected variable reaches
397
- only protected refs, so protect each branch of `branches`, and the tags of the trains by their
398
- patterns, `system-v*`, `trains-v*`, `replace-v*`, `validate-v*` and `docs-v*`, whose pipelines
399
- publish. `GITLAB_TOKEN` is such a variable, as a protected one of the group: a tag of a train left
400
- unprotected starts a pipeline that has no token, and its publish fails. Of a ref
401
- it does not reach, the run fails in `verifyConditions` (`EGITNOPERMISSION`).
462
+ #### Give the job a token
463
+
464
+ The job needs `GITLAB_TOKEN`: a token that can push to the branch and create tags. `CI_JOB_TOKEN`
465
+ cannot. The variable must reach every ref that the job releases, and a protected variable reaches
466
+ only protected refs. So protect:
467
+
468
+ - each branch in `branches`;
469
+ - the trains' tags, whose pipelines publish, by their patterns: `system-v*`, `trains-v*`,
470
+ `replace-v*`, `validate-v*` and `docs-v*`.
471
+
472
+ Here `GITLAB_TOKEN` is a protected variable of the group. A train's tag that you leave unprotected
473
+ starts a pipeline that has no token, and its publish fails. On a ref that the variable does not
474
+ reach, the run fails in `verifyConditions` (`EGITNOPERMISSION`).
475
+
476
+ #### Turn off the component's info job
402
477
 
403
- The component's `semantic-release-info` job, a dry run of the root of the config alone, with an
404
- analyzer of its own and of no train, reads every commit of the repo: leave it off (`info-on` empty,
405
- its default), and define the job again for every train, by `semantic-release-trains-info` (see
406
- [The next release of each train](#the-next-release-of-each-train)).
478
+ The component's `semantic-release-info` job does a dry run of the config's root only, with an
479
+ analyzer of its own and no train. So it reads every commit in the repo. Leave it off (`info-on`
480
+ empty, its default). Define the job again for every train with `semantic-release-trains-info`
481
+ instead: see [Predict the next release of each train](#predict-the-next-release-of-each-train).
407
482
 
408
- ### The next release of each train
483
+ ### Predict the next release of each train
409
484
 
410
- A build that names its own version, in a link of its docs, a banner or a header, needs the version
485
+ A build that prints its own version, in a link of its docs, a banner or a header, needs that version
411
486
  before the release makes it. `semantic-release-trains-info` of `@wtf/semantic-release-trains`
412
- decides it for every train of the config: one dry run of each, in the order of the config, as one
413
- click of the release job makes them. A dry run tags nothing, so the bin tags `HEAD` as each release it
414
- predicts, for the dry runs of the trains after it, which then see the train they depend on as
415
- released (no `EDEPENDENCYUNRELEASED`), and its release cascades into them by the ranges of their
416
- packages; it removes the tags when it is done, of a run that fails too. The config is read once of
417
- each train, as it reads `RELEASE_TRAIN` as it loads, so each dry run is a process of its own.
487
+ predicts the next release of every train in the config. It does one dry run of each train, in the
488
+ config's order, the same order that one click of the release job uses.
489
+
490
+ How the bin works:
491
+
492
+ - A dry run tags nothing. So the bin tags `HEAD` with each release it predicts, for the dry runs of
493
+ the trains after it. Those trains then see the train they depend on as released (no
494
+ `EDEPENDENCYUNRELEASED`), and its release cascades into them through their packages' ranges.
495
+ - The bin removes these tags when it is done, also after a run that fails. When `SIGINT` or
496
+ `SIGTERM` stops it, as when the job is cancelled, it removes them before it exits.
497
+ - The config reads `RELEASE_TRAIN` as it loads, so the bin loads it once for each train. Each dry
498
+ run is a process of its own.
418
499
 
419
500
  ```yaml
420
501
  semantic-release-info:
@@ -427,15 +508,17 @@ semantic-release-info:
427
508
  dotenv: semrel.out.env
428
509
  ```
429
510
 
430
- The bin loads the config to read its trains, and runs each train in a process of its own with
431
- `RELEASE_TRAIN` of that train. A config that names a train as it loads, as one whose plugins are of
432
- the train of the run, needs `RELEASE_TRAIN` in the job too: any train of it serves, and the run of
433
- each train names its own. A job that extends the component's install, which makes `.releaserc.json`
434
- of the config, removes it first (`rm -f .releaserc.json`), as semantic-release reads it before
435
- `release.config.mjs`, and each train would be decided as the train it was made of.
511
+ The bin first loads the config to read its trains. It then runs each train in a process of its
512
+ own, with `RELEASE_TRAIN` set to that train.
436
513
 
437
- The file, and the output of the bin, hold three variables of each train, its name upper-cased, each
438
- character that is no letter or digit an underscore:
514
+ - If your config needs a train as it loads, for example because its plugins depend on the run's
515
+ train, set `RELEASE_TRAIN` in the job too. Any of its trains works: each train's run sets its own.
516
+ - If the job extends the component's install, which writes `.releaserc.json` from the config,
517
+ remove that file first (`rm -f .releaserc.json`). semantic-release reads it before
518
+ `release.config.mjs`, so every train would be decided as the train that the file was made from.
519
+
520
+ The bin writes three variables for each train, to its output and to the file. Each name holds the
521
+ train's name in upper case, with an underscore for each character that is not a letter or a digit:
439
522
 
440
523
  ```text
441
524
  SEMREL_INFO_CORE_LAST_VERSION=1.2.0
@@ -443,35 +526,43 @@ SEMREL_INFO_CORE_NEXT_VERSION=1.3.0
443
526
  SEMREL_INFO_CORE_NEXT_VERSION_TYPE=minor
444
527
  ```
445
528
 
446
- A train with nothing to release has an empty next version and type, as the component's job writes
447
- them, so a build tells it by an empty value; its last version is the release semantic-release counts
448
- of the branch, so a prerelease merged into `main` is not `main`'s last. A train that has made no
449
- release has an empty last version. Two trains whose names make the same variables, as `a-b` and
450
- `a_b`, fail the bin (`EINFOVARIABLE`). Stopped by `SIGINT` or `SIGTERM`, as of a cancelled job, the
451
- bin removes the tags it stood in before it exits. The jobs after the job get the variables by
452
- `dotenv`, as the component's own, which this replaces: keep `info-on` empty, its default, so the
453
- component's job is off. The value is a prediction of the commit of the pipeline: a push after it, or
454
- a release commit of another train, can change what the release job decides.
455
-
456
- ### The pipeline of a tag
457
-
458
- The pipeline of a release tag runs three jobs, and no other: `node-build` of the
459
- [node component](https://gitlab.com/to-be-continuous/node) builds the tagged commit,
460
- `release-pack-smoke` packs every train of that build and tries each package as a consumer installs
461
- it, and `publish-release` packs the same build and publishes it. The tagged commit passed every
462
- check of its branch on its way to the tag: a check run again of the tag fails after the release is
463
- pushed, as of a flaky test, and a retry of the pipeline runs every check again, where the retry of
464
- one job finishes a publish. So every other job of the pipeline, of a component or not, starts its
465
- `rules` with `if: $CI_COMMIT_TAG`, `when: never`; of a job of a component, the `rules` of the job
466
- replace the component's, so restate the component's after it.
467
-
468
- `publish-release` holds the ID tokens of npm and of Sigstore, which expire at the job's own
469
- `timeout`, or at 5 minutes of a job that sets none, not at the project's: a job that builds,
470
- smoke-tests and publishes a train of many packages runs past them, and npm answers `ENEEDAUTH`. So it
471
- does no more than it must: the build and the smoke run before it, in jobs that hold no token, and it
472
- sets a `timeout` of its own. `RELEASE_SMOKED` tells the config that `release-pack-smoke` tried the
473
- build already, so the tag's run of `@wtf/semantic-release-npm` packs it with no `smoke`,
474
- as `smoke: process.env.RELEASE_SMOKED !== 'true'`.
529
+ - A train with nothing to release has an empty next version and type, as the component's job
530
+ writes them. A build can tell by the empty value.
531
+ - The last version is the release that semantic-release counts on the branch. So a prerelease
532
+ merged into `main` is not `main`'s last version.
533
+ - A train that has made no release has an empty last version.
534
+ - If the names of two trains make the same variables, such as `a-b` and `a_b`, the bin fails
535
+ (`EINFOVARIABLE`).
536
+ - The jobs after it get the variables through `dotenv`, as from the component's own job, which this
537
+ job replaces. Keep `info-on` empty, its default, so that the component's job stays off.
538
+ - The values predict the release of the pipeline's commit. A push after it, or a release commit of
539
+ another train, can change what the release job decides.
540
+
541
+ ### Build, smoke-test and publish in a tag pipeline
542
+
543
+ A release tag's pipeline runs three jobs, and no others:
544
+
545
+ 1. `node-build`, of the [node component](https://gitlab.com/to-be-continuous/node), builds the
546
+ tagged commit.
547
+ 2. `release-pack-smoke` packs every train from that build, and tries each package the way a
548
+ consumer installs it.
549
+ 3. `publish-release` packs the same build and publishes it.
550
+
551
+ The tagged commit passed every check on its branch before it was tagged. A check that runs again on
552
+ the tag can fail after the release is pushed, as a flaky test does. A retry of the pipeline then
553
+ runs every check again, while a retry of one job is enough to finish a publish. So start the
554
+ `rules` of every other job, from a component or not, with `if: $CI_COMMIT_TAG`, `when: never`. A
555
+ job's `rules` replace its component's rules, so restate the component's rules after yours.
556
+
557
+ Keep `publish-release` short. It holds the ID tokens of npm and Sigstore, which expire at the job's
558
+ own `timeout`, or after 5 minutes when the job sets none. The project's timeout does not apply. A
559
+ job that builds, smoke-tests and publishes a train of many packages runs past them, and npm answers
560
+ `ENEEDAUTH`. So the build and the smoke test run before it, in jobs that hold no token, and
561
+ `publish-release` sets a `timeout` of its own.
562
+
563
+ `RELEASE_SMOKED` tells the config that `release-pack-smoke` already tried the build. The tag's run
564
+ of `@wtf/semantic-release-npm` then packs it with no `smoke`, through
565
+ `smoke: process.env.RELEASE_SMOKED !== 'true'` in the config.
475
566
 
476
567
  ```yaml
477
568
  # The build of the component, of a release tag and of no other tag. It is what the publish packs, kept
@@ -548,60 +639,82 @@ publish-release:
548
639
  - semantic-release-trains-tag
549
640
  ```
550
641
 
551
- `release-pack-smoke` and `publish-release` extend `.semrel-base` of the semantic-release component,
552
- as its `semantic-release` job does: its image, and its global install of semantic-release at the
553
- component's `version`, of each plugin the config names, and of each line of
554
- `semrel-required-plugins.txt`. So the branch's release and the tag's publish install of one source.
555
- The component's `before_script` reads the config of the job's environment, of no `RELEASE_TAG`, so
556
- it names the plugins of a run of a branch: the file names those of the tag's run, and
557
- `@wtf/semantic-release-npm` gives the bin `semantic-release-npm-smoke`, as
558
- `@wtf/semantic-release-trains` gives `semantic-release-trains-tag`. A config that needs a train as it
559
- loads, of `trainTagFormat`, needs `RELEASE_TRAIN` in the `variables` of each job, as the
560
- `semantic-release` job sets it; `semantic-release-npm-smoke` loads the config once of the
561
- environment of its job too, before it loads it of each train. Each job removes the
562
- `.releaserc.json` the install makes, which semantic-release reads before `release.config.mjs`.
563
-
564
- `publish-release` is of the
565
- `resource_group` of the `semantic-release` job; set the group's `process_mode` to `oldest_first`
566
- with the API (`PUT /projects/:id/resource_groups/release`), so the publishes of several tags run in
567
- the order of their tags.
568
-
569
- A publish that fails part way is finished by a retry of `publish-release` alone: it packs the build
570
- `node-build` keeps, and skips each package the registry has. Past the week of that build, retry
571
- `node-build` and `release-pack-smoke` first.
572
-
573
- ### The pipeline of this repo
574
-
575
- This repo releases its packages in the trains of these guides, `system`, `trains`, `replace`,
576
- `validate` and `docs`, by the `semantic-release` job above, with two differences, as its own plugins are packages of
577
- its workspace, of versions npm may not have yet. The component's global install of the plugins is
578
- left out: the job installs the workspace from its lockfile, as the build does, and semantic-release
579
- and each plugin with it, and runs the semantic-release of the lockfile. So its `release.config.mjs`
580
- imports the values of `@wtf/semantic-release-trains/config` from the workspace, of what the build
581
- built, and is no config of literals: the component still makes `.releaserc.json` of it by
582
- `require()`, of the job's `RELEASE_TRAIN`, so it awaits nothing, and the job removes the file. And
583
- the build of the pipeline, the reference of `docs` among it, is restored over the checkout: the job
584
- checks out the tip of the branch, past release commits alone, without `--force`, which would put
585
- back the tip's reference over the one the build wrote.
586
-
587
- Its `semantic-release-info` job gives the build the next release of every train, and the build of
588
- `docs` its own, `SEMREL_INFO_DOCS_NEXT_VERSION`, so each source link of the reference names the tag
589
- `docs-v<version>` of the release that commits it. See
590
- [The next release of each train](#the-next-release-of-each-train). The tag's `publish-release` job runs `semantic-release-trains-tag` of the workspace, whose
591
- config finds the train of the tag by `trainOfTag`, and publishes the build of the tag's pipeline.
592
- The tags of every train, `system-v*`, `trains-v*`, `replace-v*`, `validate-v*` and `docs-v*`, are
593
- protected, as `GITLAB_TOKEN` is a protected variable of the group.
594
-
595
- ### Skipping steps
596
-
597
- `skipPlugins` of `@wtf/semantic-release-trains/config`, of a config that imports it, leaves out each
598
- entry of `plugins` whose step id a pattern matches, unanchored, as of a variable a person sets as
599
- they start the job: the plugin's name, or of an entry of options, `<name>:<the plugin it wraps>` of
600
- an entry of `wrap`, `<name>:generated` of an entry of `generated`, or `<name>:<value>` of its first
601
- short `name`, `pkgRoot`, `path`, `tagFormat` or `train` (`stepId`). It refuses a pattern that leaves out a plugin of `required`, as
602
- the release commit: a tag of no release commit names a tree that does not declare the release.
603
- It says what it left out and what it kept by `log`, which it requires: the config, the root of
604
- its run, names where, as stderr.
642
+ Notes on these jobs:
643
+
644
+ - `release-pack-smoke` and `publish-release` extend the component's `.semrel-base`, as its
645
+ `semantic-release` job does. They get its image and its global install: semantic-release at the
646
+ component's `version`, each plugin that the config names, and each line of
647
+ `semrel-required-plugins.txt`. So the branch's release and the tag's publish install from one
648
+ source.
649
+ - The component's `before_script` reads the config in the job's environment, where `RELEASE_TAG` is
650
+ not set. So it installs the plugins of a branch run. `semrel-required-plugins.txt` names the
651
+ plugins of the tag's run. `@wtf/semantic-release-npm` brings the bin `semantic-release-npm-smoke`,
652
+ as `@wtf/semantic-release-trains` brings `semantic-release-trains-tag`.
653
+ - If your config needs a train as it loads, for `trainTagFormat`, set `RELEASE_TRAIN` in each job's
654
+ `variables`, as the `semantic-release` job does. `semantic-release-npm-smoke` also loads the
655
+ config once in its job's environment, before it loads it for each train.
656
+ - Each job removes the `.releaserc.json` that the install writes, because semantic-release reads it
657
+ before `release.config.mjs`.
658
+ - `publish-release` is in the `resource_group` of the `semantic-release` job. Set the group's
659
+ `process_mode` to `oldest_first` with the API (`PUT /projects/:id/resource_groups/release`), so
660
+ that the publishes of several tags run in the order of their tags.
661
+
662
+ To finish a publish that failed part way, retry `publish-release` alone. It packs the build that
663
+ `node-build` keeps, and skips each package that the registry has. After the week that the build is
664
+ kept, retry `node-build` and `release-pack-smoke` first.
665
+
666
+ ### Smoke-test packages in a merge request
667
+
668
+ `semantic-release-npm-smoke`, the bin of `@wtf/semantic-release-npm`, tries your packages in a merge
669
+ request job, which releases nothing. It packs every train of the config, or each train you name with
670
+ `--train`, from what the build wrote. Then it tries each package the way a consumer installs it, as
671
+ the plugin's `smoke` option does in `prepare`:
672
+
673
+ - It packs each train at `0.0.0-smoke.0`, a version that no registry has.
674
+ - It packs each train with its `@wtf/semantic-release-npm` options, as the config gives them to the
675
+ run of its tag. To read them, it sets `RELEASE_TRAIN` and `RELEASE_TAG` in the environment of a
676
+ Node process of its own, which loads the config.
677
+ - It resolves each range on another train to that train's smoke version.
678
+ - It packs each private package in a train's `pack` beside the train's packages, as a demo.
679
+ - It installs every package from the tarballs of all trains, and imports it, with the `forbid` of
680
+ the `smoke` option and the `conditions` of each entry.
681
+
682
+ So a demo that would not install from the packages of its release fails the merge request, not the
683
+ tag's pipeline. With the to-be-continuous components, this is the `release-pack-smoke` job of
684
+ [the tag pipeline](#build-smoke-test-and-publish-in-a-tag-pipeline), which also runs in merge
685
+ requests and on the branch. Without a component:
686
+
687
+ ```yaml
688
+ smoke:
689
+ stage: test
690
+ needs: [build]
691
+ script:
692
+ - pnpm exec semantic-release-npm-smoke
693
+ ```
694
+
695
+ ### Skip a step when you start a job
696
+
697
+ Sometimes you want to start a job without one of its steps, for example to run a release again
698
+ whose tree is prepared already. `skipPlugins` of `@wtf/semantic-release-trains/config` does this
699
+ in a config that imports it. It leaves out each entry of `plugins` whose step id matches a pattern. The
700
+ pattern usually comes from a variable that a person sets when they start the job.
701
+
702
+ The step id (`stepId`) of an entry is:
703
+
704
+ | Entry | Step id |
705
+ | -------------------------- | ------------------------------------------------------------------------------------- |
706
+ | A plugin's name | The name |
707
+ | An entry with `wrap` | `<name>:<the plugin it wraps>` |
708
+ | An entry with `generated` | `<name>:generated` |
709
+ | Another entry with options | `<name>:<value>` of its first short `name`, `pkgRoot`, `path`, `tagFormat` or `train` |
710
+
711
+ - The pattern is unanchored: `exec` matches every step of `@semantic-release/exec`. Pin the end of
712
+ a short pattern with `$`.
713
+ - `skipPlugins` refuses a pattern that leaves out a plugin listed in `required`, such as the one
714
+ that makes the release commit. A tag with no release commit names a tree that does not declare
715
+ the release.
716
+ - It says what it left out and what it kept through `log`, which it requires. The config is the
717
+ root of its run, so it names where to write, such as stderr.
605
718
 
606
719
  ```js norun
607
720
  // release.config.mjs
@@ -624,33 +737,42 @@ export default {
624
737
  }
625
738
  ```
626
739
 
627
- ### The smoke of a merge request
628
-
629
- `semantic-release-npm-smoke`, the bin of `@wtf/semantic-release-npm`, packs every train
630
- of the config, or each `--train` named, of what the build wrote, and tries each package as a consumer
631
- installs it, as the option `smoke` of the plugin does in `prepare`: a job of a merge request runs it,
632
- of no release. Each train is packed at `0.0.0-smoke.0`, a version no registry has, of its options of
633
- `@wtf/semantic-release-npm` as the config gives them the run of its tag (`RELEASE_TRAIN`
634
- and `RELEASE_TAG` set in the environment of a Node of its own that loads the config), each range of
635
- another train resolved to it, each private package of its `pack` packed beside its packages, as a
636
- demo, and every package installed of the tarballs of all, and imported, of its `forbid` and its
637
- `conditions`. So a demo that would not install of the packages of its release fails the merge
638
- request, not the pipeline of the tag. Of the components of to-be-continuous, it is the job
639
- `release-pack-smoke` of [the pipeline of a tag](#the-pipeline-of-a-tag), which runs of a merge
640
- request and of the branch too; of no component:
641
-
642
- ```yaml
643
- smoke:
644
- stage: test
645
- needs: [build]
646
- script:
647
- - pnpm exec semantic-release-npm-smoke
648
- ```
740
+ ### How this repo's pipeline differs
741
+
742
+ This repo releases its packages in the trains of these guides: `system`, `trains`, `replace`,
743
+ `validate` and `docs`. It uses the `semantic-release` job above, with two differences, because its
744
+ own plugins are packages of its workspace, at versions that npm may not have yet:
745
+
746
+ 1. **No global install of the plugins.** The job installs the workspace from its lockfile, as the
747
+ build does, and semantic-release and each plugin with it. It runs the semantic-release of the
748
+ lockfile. So its `release.config.mjs` imports the values of `@wtf/semantic-release-trains/config`
749
+ from the workspace, as the build built them, and is not a config of literals. The component still
750
+ writes `.releaserc.json` from it with `require()`, for the job's `RELEASE_TRAIN`, so the config
751
+ awaits nothing. The job removes the file.
752
+ 2. **The build is restored over the checkout,** including the reference of `docs`. The job checks
753
+ out the tip of the branch, past release commits only, without `--force`. `--force` would put the
754
+ tip's reference back over the one that the build wrote.
755
+
756
+ Its other parts:
757
+
758
+ - Its `semantic-release-info` job gives the build the next release of every train. The build of
759
+ `docs` uses its own, `SEMREL_INFO_DOCS_NEXT_VERSION`, so each source link in the reference names
760
+ the tag `docs-v<version>` of the release that commits it. See
761
+ [Predict the next release of each train](#predict-the-next-release-of-each-train).
762
+ - The tag's `publish-release` job runs the workspace's `semantic-release-trains-tag`. Its config
763
+ finds the tag's train with `trainOfTag`. The job publishes the build of the tag's pipeline.
764
+ - The tags of every train, `system-v*`, `trains-v*`, `replace-v*`, `validate-v*` and `docs-v*`, are
765
+ protected, because `GITLAB_TOKEN` is a protected variable of the group.
649
766
 
650
767
  ## GitHub Actions
651
768
 
652
- A matrix with `max-parallel: 1` runs one train at a time, in the order of the list. A `concurrency`
653
- group keeps two workflows from releasing at the same time.
769
+ This workflow releases each train in a job of its own, one train at a time:
770
+
771
+ - The matrix lists the trains in the order of their dependencies. `max-parallel: 1` runs one train
772
+ at a time, in the order of the list.
773
+ - The `concurrency` group keeps two workflows from releasing at the same time.
774
+ - Each job pulls the branch first, so it starts from the release commit that the job before it
775
+ pushed.
654
776
 
655
777
  ```yaml
656
778
  name: release
@@ -689,7 +811,7 @@ jobs:
689
811
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
690
812
  ```
691
813
 
692
- `@semantic-release/github` makes a GitHub release of each train. List it last:
814
+ To make a GitHub release of each train, wrap `@semantic-release/github`, and list it last:
693
815
 
694
816
  ```js train=replace
695
817
  // release.config.mjs