@cbnventures/nova 0.16.2 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (650) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +8 -0
  3. package/build/package.json +1 -1
  4. package/build/src/api/node-releases.d.ts +4 -4
  5. package/build/src/api/node-releases.d.ts.map +1 -1
  6. package/build/src/api/node-releases.js +14 -14
  7. package/build/src/api/node-releases.js.map +1 -1
  8. package/build/src/api/spdx-licenses.d.ts +4 -4
  9. package/build/src/api/spdx-licenses.d.ts.map +1 -1
  10. package/build/src/api/spdx-licenses.js +12 -12
  11. package/build/src/api/spdx-licenses.js.map +1 -1
  12. package/build/src/cli/generate/github/funding.d.ts +3 -3
  13. package/build/src/cli/generate/github/funding.d.ts.map +1 -1
  14. package/build/src/cli/generate/github/funding.js +10 -6
  15. package/build/src/cli/generate/github/funding.js.map +1 -1
  16. package/build/src/cli/generate/github/issue-template.d.ts +3 -3
  17. package/build/src/cli/generate/github/issue-template.d.ts.map +1 -1
  18. package/build/src/cli/generate/github/issue-template.js +20 -13
  19. package/build/src/cli/generate/github/issue-template.js.map +1 -1
  20. package/build/src/cli/generate/github/workflows.d.ts +10 -9
  21. package/build/src/cli/generate/github/workflows.d.ts.map +1 -1
  22. package/build/src/cli/generate/github/workflows.js +249 -129
  23. package/build/src/cli/generate/github/workflows.js.map +1 -1
  24. package/build/src/cli/generate/must-haves/agent-conventions.d.ts +3 -3
  25. package/build/src/cli/generate/must-haves/agent-conventions.d.ts.map +1 -1
  26. package/build/src/cli/generate/must-haves/agent-conventions.js +16 -13
  27. package/build/src/cli/generate/must-haves/agent-conventions.js.map +1 -1
  28. package/build/src/cli/generate/must-haves/dotenv.d.ts +3 -3
  29. package/build/src/cli/generate/must-haves/dotenv.d.ts.map +1 -1
  30. package/build/src/cli/generate/must-haves/dotenv.js +90 -77
  31. package/build/src/cli/generate/must-haves/dotenv.js.map +1 -1
  32. package/build/src/cli/generate/must-haves/editorconfig.d.ts +3 -3
  33. package/build/src/cli/generate/must-haves/editorconfig.d.ts.map +1 -1
  34. package/build/src/cli/generate/must-haves/editorconfig.js +9 -5
  35. package/build/src/cli/generate/must-haves/editorconfig.js.map +1 -1
  36. package/build/src/cli/generate/must-haves/gitignore.d.ts +3 -3
  37. package/build/src/cli/generate/must-haves/gitignore.d.ts.map +1 -1
  38. package/build/src/cli/generate/must-haves/gitignore.js +81 -71
  39. package/build/src/cli/generate/must-haves/gitignore.js.map +1 -1
  40. package/build/src/cli/generate/must-haves/license.d.ts +3 -3
  41. package/build/src/cli/generate/must-haves/license.d.ts.map +1 -1
  42. package/build/src/cli/generate/must-haves/license.js +19 -86
  43. package/build/src/cli/generate/must-haves/license.js.map +1 -1
  44. package/build/src/cli/generate/must-haves/read-me.d.ts +3 -3
  45. package/build/src/cli/generate/must-haves/read-me.d.ts.map +1 -1
  46. package/build/src/cli/generate/must-haves/read-me.js +26 -28
  47. package/build/src/cli/generate/must-haves/read-me.js.map +1 -1
  48. package/build/src/cli/index.js +81 -34
  49. package/build/src/cli/index.js.map +1 -1
  50. package/build/src/cli/recipe/github/handle-gh-failure.d.ts +3 -0
  51. package/build/src/cli/recipe/github/handle-gh-failure.d.ts.map +1 -0
  52. package/build/src/cli/recipe/github/handle-gh-failure.js +22 -0
  53. package/build/src/cli/recipe/github/handle-gh-failure.js.map +1 -0
  54. package/build/src/cli/recipe/github/sync-features.d.ts +5 -0
  55. package/build/src/cli/recipe/github/sync-features.d.ts.map +1 -0
  56. package/build/src/cli/recipe/github/sync-features.js +145 -0
  57. package/build/src/cli/recipe/github/sync-features.js.map +1 -0
  58. package/build/src/cli/recipe/github/sync-identity.d.ts +6 -0
  59. package/build/src/cli/recipe/github/sync-identity.d.ts.map +1 -0
  60. package/build/src/cli/recipe/github/sync-identity.js +191 -0
  61. package/build/src/cli/recipe/github/sync-identity.js.map +1 -0
  62. package/build/src/cli/recipe/github/sync-policies.d.ts +5 -0
  63. package/build/src/cli/recipe/github/sync-policies.d.ts.map +1 -0
  64. package/build/src/cli/recipe/github/sync-policies.js +154 -0
  65. package/build/src/cli/recipe/github/sync-policies.js.map +1 -0
  66. package/build/src/cli/recipe/index.d.ts +2 -2
  67. package/build/src/cli/recipe/index.d.ts.map +1 -1
  68. package/build/src/cli/recipe/index.js +66 -56
  69. package/build/src/cli/recipe/index.js.map +1 -1
  70. package/build/src/cli/recipe/package-json/cleanup.d.ts +3 -3
  71. package/build/src/cli/recipe/package-json/cleanup.d.ts.map +1 -1
  72. package/build/src/cli/recipe/package-json/cleanup.js +27 -25
  73. package/build/src/cli/recipe/package-json/cleanup.js.map +1 -1
  74. package/build/src/cli/recipe/package-json/normalize-artifacts.d.ts +3 -3
  75. package/build/src/cli/recipe/package-json/normalize-artifacts.d.ts.map +1 -1
  76. package/build/src/cli/recipe/package-json/normalize-artifacts.js +35 -35
  77. package/build/src/cli/recipe/package-json/normalize-artifacts.js.map +1 -1
  78. package/build/src/cli/recipe/package-json/normalize-bundler.d.ts +3 -3
  79. package/build/src/cli/recipe/package-json/normalize-bundler.d.ts.map +1 -1
  80. package/build/src/cli/recipe/package-json/normalize-bundler.js +22 -22
  81. package/build/src/cli/recipe/package-json/normalize-bundler.js.map +1 -1
  82. package/build/src/cli/recipe/package-json/normalize-dependencies.d.ts +3 -3
  83. package/build/src/cli/recipe/package-json/normalize-dependencies.d.ts.map +1 -1
  84. package/build/src/cli/recipe/package-json/normalize-dependencies.js +37 -37
  85. package/build/src/cli/recipe/package-json/normalize-dependencies.js.map +1 -1
  86. package/build/src/cli/recipe/package-json/normalize-modules.d.ts +3 -3
  87. package/build/src/cli/recipe/package-json/normalize-modules.d.ts.map +1 -1
  88. package/build/src/cli/recipe/package-json/normalize-modules.js +47 -47
  89. package/build/src/cli/recipe/package-json/normalize-modules.js.map +1 -1
  90. package/build/src/cli/recipe/package-json/normalize-tooling.d.ts +3 -3
  91. package/build/src/cli/recipe/package-json/normalize-tooling.d.ts.map +1 -1
  92. package/build/src/cli/recipe/package-json/normalize-tooling.js +23 -23
  93. package/build/src/cli/recipe/package-json/normalize-tooling.js.map +1 -1
  94. package/build/src/cli/recipe/package-json/sync-environment.d.ts +3 -3
  95. package/build/src/cli/recipe/package-json/sync-environment.d.ts.map +1 -1
  96. package/build/src/cli/recipe/package-json/sync-environment.js +37 -37
  97. package/build/src/cli/recipe/package-json/sync-environment.js.map +1 -1
  98. package/build/src/cli/recipe/package-json/sync-identity.d.ts +3 -3
  99. package/build/src/cli/recipe/package-json/sync-identity.d.ts.map +1 -1
  100. package/build/src/cli/recipe/package-json/sync-identity.js +20 -20
  101. package/build/src/cli/recipe/package-json/sync-identity.js.map +1 -1
  102. package/build/src/cli/recipe/package-json/sync-ownership.d.ts +3 -3
  103. package/build/src/cli/recipe/package-json/sync-ownership.d.ts.map +1 -1
  104. package/build/src/cli/recipe/package-json/sync-ownership.js +28 -28
  105. package/build/src/cli/recipe/package-json/sync-ownership.js.map +1 -1
  106. package/build/src/cli/scaffold/app/expressjs.d.ts +3 -3
  107. package/build/src/cli/scaffold/app/expressjs.d.ts.map +1 -1
  108. package/build/src/cli/scaffold/app/expressjs.js +1 -1
  109. package/build/src/cli/scaffold/app/expressjs.js.map +1 -1
  110. package/build/src/cli/scaffold/app/nextjs.d.ts +3 -3
  111. package/build/src/cli/scaffold/app/nextjs.d.ts.map +1 -1
  112. package/build/src/cli/scaffold/app/nextjs.js +1 -1
  113. package/build/src/cli/scaffold/app/nextjs.js.map +1 -1
  114. package/build/src/cli/scaffold/app/vite.d.ts +3 -3
  115. package/build/src/cli/scaffold/app/vite.d.ts.map +1 -1
  116. package/build/src/cli/scaffold/app/vite.js +1 -1
  117. package/build/src/cli/scaffold/app/vite.js.map +1 -1
  118. package/build/src/cli/scaffold/app/workers.d.ts +3 -3
  119. package/build/src/cli/scaffold/app/workers.d.ts.map +1 -1
  120. package/build/src/cli/scaffold/app/workers.js +1 -1
  121. package/build/src/cli/scaffold/app/workers.js.map +1 -1
  122. package/build/src/cli/scaffold/docs/docusaurus.d.ts +3 -3
  123. package/build/src/cli/scaffold/docs/docusaurus.d.ts.map +1 -1
  124. package/build/src/cli/scaffold/docs/docusaurus.js +1 -1
  125. package/build/src/cli/scaffold/docs/docusaurus.js.map +1 -1
  126. package/build/src/cli/scaffold/starter/base.d.ts +3 -3
  127. package/build/src/cli/scaffold/starter/base.d.ts.map +1 -1
  128. package/build/src/cli/scaffold/starter/base.js +7 -7
  129. package/build/src/cli/scaffold/starter/base.js.map +1 -1
  130. package/build/src/cli/utility/changelog.d.ts +4 -3
  131. package/build/src/cli/utility/changelog.d.ts.map +1 -1
  132. package/build/src/cli/utility/changelog.js +86 -84
  133. package/build/src/cli/utility/changelog.js.map +1 -1
  134. package/build/src/cli/utility/initialize.d.ts +5 -3
  135. package/build/src/cli/utility/initialize.d.ts.map +1 -1
  136. package/build/src/cli/utility/initialize.js +805 -244
  137. package/build/src/cli/utility/initialize.js.map +1 -1
  138. package/build/src/cli/utility/run-recipes.d.ts +3 -3
  139. package/build/src/cli/utility/run-recipes.d.ts.map +1 -1
  140. package/build/src/cli/utility/run-recipes.js +43 -12
  141. package/build/src/cli/utility/run-recipes.js.map +1 -1
  142. package/build/src/cli/utility/run-scripts.d.ts +3 -3
  143. package/build/src/cli/utility/run-scripts.d.ts.map +1 -1
  144. package/build/src/cli/utility/run-scripts.js +9 -8
  145. package/build/src/cli/utility/run-scripts.js.map +1 -1
  146. package/build/src/cli/utility/transpile.d.ts +3 -3
  147. package/build/src/cli/utility/transpile.d.ts.map +1 -1
  148. package/build/src/cli/utility/transpile.js +4 -4
  149. package/build/src/cli/utility/transpile.js.map +1 -1
  150. package/build/src/cli/utility/type-check.d.ts +3 -3
  151. package/build/src/cli/utility/type-check.d.ts.map +1 -1
  152. package/build/src/cli/utility/type-check.js +4 -4
  153. package/build/src/cli/utility/type-check.js.map +1 -1
  154. package/build/src/cli/utility/version.d.ts +3 -3
  155. package/build/src/cli/utility/version.d.ts.map +1 -1
  156. package/build/src/cli/utility/version.js +102 -102
  157. package/build/src/cli/utility/version.js.map +1 -1
  158. package/build/src/lib/constants.d.ts +4 -0
  159. package/build/src/lib/constants.d.ts.map +1 -0
  160. package/build/src/lib/constants.js +3 -0
  161. package/build/src/lib/constants.js.map +1 -0
  162. package/build/src/lib/item.d.ts +32 -31
  163. package/build/src/lib/item.d.ts.map +1 -1
  164. package/build/src/lib/item.js +3 -1
  165. package/build/src/lib/item.js.map +1 -1
  166. package/build/src/lib/nova-config.d.ts +11 -5
  167. package/build/src/lib/nova-config.d.ts.map +1 -1
  168. package/build/src/lib/nova-config.js +143 -8
  169. package/build/src/lib/nova-config.js.map +1 -1
  170. package/build/src/lib/regex.d.ts +15 -1
  171. package/build/src/lib/regex.d.ts.map +1 -1
  172. package/build/src/lib/regex.js +15 -1
  173. package/build/src/lib/regex.js.map +1 -1
  174. package/build/src/lib/scaffold.d.ts +9 -9
  175. package/build/src/lib/scaffold.d.ts.map +1 -1
  176. package/build/src/lib/scaffold.js +45 -44
  177. package/build/src/lib/scaffold.js.map +1 -1
  178. package/build/src/lib/utility.d.ts +26 -21
  179. package/build/src/lib/utility.d.ts.map +1 -1
  180. package/build/src/lib/utility.js +139 -19
  181. package/build/src/lib/utility.js.map +1 -1
  182. package/build/src/lib/workflow-templates.d.ts +2 -2
  183. package/build/src/lib/workflow-templates.d.ts.map +1 -1
  184. package/build/src/lib/workflow-templates.js +44 -2
  185. package/build/src/lib/workflow-templates.js.map +1 -1
  186. package/build/src/presets/eslint/dx-code-style.d.ts +2 -2
  187. package/build/src/presets/eslint/dx-code-style.d.ts.map +1 -1
  188. package/build/src/presets/eslint/dx-code-style.js.map +1 -1
  189. package/build/src/presets/eslint/dx-ignore.d.ts +2 -2
  190. package/build/src/presets/eslint/dx-ignore.d.ts.map +1 -1
  191. package/build/src/presets/eslint/dx-ignore.js +7 -0
  192. package/build/src/presets/eslint/dx-ignore.js.map +1 -1
  193. package/build/src/presets/eslint/fw-docusaurus.d.ts +2 -2
  194. package/build/src/presets/eslint/fw-docusaurus.d.ts.map +1 -1
  195. package/build/src/presets/eslint/fw-docusaurus.js.map +1 -1
  196. package/build/src/presets/eslint/fw-expressjs.d.ts +2 -2
  197. package/build/src/presets/eslint/fw-expressjs.d.ts.map +1 -1
  198. package/build/src/presets/eslint/fw-expressjs.js.map +1 -1
  199. package/build/src/presets/eslint/fw-nextjs.d.ts +2 -2
  200. package/build/src/presets/eslint/fw-nextjs.d.ts.map +1 -1
  201. package/build/src/presets/eslint/fw-nextjs.js.map +1 -1
  202. package/build/src/presets/eslint/lang-javascript.d.ts +2 -2
  203. package/build/src/presets/eslint/lang-javascript.d.ts.map +1 -1
  204. package/build/src/presets/eslint/lang-javascript.js.map +1 -1
  205. package/build/src/presets/eslint/lang-mdx.d.ts +2 -2
  206. package/build/src/presets/eslint/lang-mdx.d.ts.map +1 -1
  207. package/build/src/presets/eslint/lang-mdx.js.map +1 -1
  208. package/build/src/presets/eslint/lang-typescript.d.ts +2 -2
  209. package/build/src/presets/eslint/lang-typescript.d.ts.map +1 -1
  210. package/build/src/presets/eslint/lang-typescript.js.map +1 -1
  211. package/build/src/presets/eslint/runtime-browser.d.ts +2 -2
  212. package/build/src/presets/eslint/runtime-browser.d.ts.map +1 -1
  213. package/build/src/presets/eslint/runtime-browser.js.map +1 -1
  214. package/build/src/presets/eslint/runtime-cloudflare-workers.d.ts +2 -2
  215. package/build/src/presets/eslint/runtime-cloudflare-workers.d.ts.map +1 -1
  216. package/build/src/presets/eslint/runtime-cloudflare-workers.js.map +1 -1
  217. package/build/src/presets/eslint/runtime-edge.d.ts +2 -2
  218. package/build/src/presets/eslint/runtime-edge.d.ts.map +1 -1
  219. package/build/src/presets/eslint/runtime-edge.js.map +1 -1
  220. package/build/src/presets/eslint/runtime-node.d.ts +2 -2
  221. package/build/src/presets/eslint/runtime-node.d.ts.map +1 -1
  222. package/build/src/presets/eslint/runtime-node.js.map +1 -1
  223. package/build/src/presets/eslint/runtime-service-worker.d.ts +2 -2
  224. package/build/src/presets/eslint/runtime-service-worker.d.ts.map +1 -1
  225. package/build/src/presets/eslint/runtime-service-worker.js.map +1 -1
  226. package/build/src/presets/eslint/runtime-web-worker.d.ts +2 -2
  227. package/build/src/presets/eslint/runtime-web-worker.d.ts.map +1 -1
  228. package/build/src/presets/eslint/runtime-web-worker.js.map +1 -1
  229. package/build/src/presets/eslint/tool-vite.d.ts +2 -2
  230. package/build/src/presets/eslint/tool-vite.d.ts.map +1 -1
  231. package/build/src/presets/eslint/tool-vite.js.map +1 -1
  232. package/build/src/rules/eslint/conventions/no-default-export-declaration.d.ts +3 -3
  233. package/build/src/rules/eslint/conventions/no-default-export-declaration.d.ts.map +1 -1
  234. package/build/src/rules/eslint/conventions/no-default-export-declaration.js +2 -2
  235. package/build/src/rules/eslint/conventions/no-default-export-declaration.js.map +1 -1
  236. package/build/src/rules/eslint/conventions/no-implicit-boolean.d.ts +3 -3
  237. package/build/src/rules/eslint/conventions/no-implicit-boolean.d.ts.map +1 -1
  238. package/build/src/rules/eslint/conventions/no-implicit-boolean.js +14 -14
  239. package/build/src/rules/eslint/conventions/no-implicit-boolean.js.map +1 -1
  240. package/build/src/rules/eslint/conventions/require-explicit-return.d.ts +6 -6
  241. package/build/src/rules/eslint/conventions/require-explicit-return.d.ts.map +1 -1
  242. package/build/src/rules/eslint/conventions/require-explicit-return.js +14 -14
  243. package/build/src/rules/eslint/conventions/require-explicit-return.js.map +1 -1
  244. package/build/src/rules/eslint/conventions/require-hash-private.d.ts +4 -4
  245. package/build/src/rules/eslint/conventions/require-hash-private.d.ts.map +1 -1
  246. package/build/src/rules/eslint/conventions/require-hash-private.js +3 -3
  247. package/build/src/rules/eslint/conventions/require-hash-private.js.map +1 -1
  248. package/build/src/rules/eslint/conventions/require-kebab-case-filename.d.ts +4 -4
  249. package/build/src/rules/eslint/conventions/require-kebab-case-filename.d.ts.map +1 -1
  250. package/build/src/rules/eslint/conventions/require-kebab-case-filename.js +4 -4
  251. package/build/src/rules/eslint/conventions/require-kebab-case-filename.js.map +1 -1
  252. package/build/src/rules/eslint/conventions/require-naming-convention.d.ts +16 -16
  253. package/build/src/rules/eslint/conventions/require-naming-convention.d.ts.map +1 -1
  254. package/build/src/rules/eslint/conventions/require-naming-convention.js +34 -31
  255. package/build/src/rules/eslint/conventions/require-naming-convention.js.map +1 -1
  256. package/build/src/rules/eslint/conventions/require-undefined-init.d.ts +3 -3
  257. package/build/src/rules/eslint/conventions/require-undefined-init.d.ts.map +1 -1
  258. package/build/src/rules/eslint/conventions/require-undefined-init.js +2 -2
  259. package/build/src/rules/eslint/conventions/require-undefined-init.js.map +1 -1
  260. package/build/src/rules/eslint/conventions/switch-case-blocks.d.ts +4 -4
  261. package/build/src/rules/eslint/conventions/switch-case-blocks.d.ts.map +1 -1
  262. package/build/src/rules/eslint/conventions/switch-case-blocks.js +3 -3
  263. package/build/src/rules/eslint/conventions/switch-case-blocks.js.map +1 -1
  264. package/build/src/rules/eslint/formatting/no-complex-arrow-concise.d.ts +5 -5
  265. package/build/src/rules/eslint/formatting/no-complex-arrow-concise.d.ts.map +1 -1
  266. package/build/src/rules/eslint/formatting/no-complex-arrow-concise.js +16 -16
  267. package/build/src/rules/eslint/formatting/no-complex-arrow-concise.js.map +1 -1
  268. package/build/src/rules/eslint/formatting/no-multiline-strings.d.ts +4 -4
  269. package/build/src/rules/eslint/formatting/no-multiline-strings.d.ts.map +1 -1
  270. package/build/src/rules/eslint/formatting/no-multiline-strings.js +19 -19
  271. package/build/src/rules/eslint/formatting/no-multiline-strings.js.map +1 -1
  272. package/build/src/rules/eslint/formatting/no-raw-text-in-code.d.ts +3 -3
  273. package/build/src/rules/eslint/formatting/no-raw-text-in-code.d.ts.map +1 -1
  274. package/build/src/rules/eslint/formatting/no-raw-text-in-code.js +2 -2
  275. package/build/src/rules/eslint/formatting/no-raw-text-in-code.js.map +1 -1
  276. package/build/src/rules/eslint/formatting/no-ternary-in-template-literal.d.ts +3 -3
  277. package/build/src/rules/eslint/formatting/no-ternary-in-template-literal.d.ts.map +1 -1
  278. package/build/src/rules/eslint/formatting/no-ternary-in-template-literal.js +2 -2
  279. package/build/src/rules/eslint/formatting/no-ternary-in-template-literal.js.map +1 -1
  280. package/build/src/rules/eslint/formatting/require-import-order.d.ts +3 -3
  281. package/build/src/rules/eslint/formatting/require-import-order.d.ts.map +1 -1
  282. package/build/src/rules/eslint/formatting/require-import-order.js +6 -6
  283. package/build/src/rules/eslint/formatting/require-import-order.js.map +1 -1
  284. package/build/src/rules/eslint/formatting/require-multiline-condition-groups.d.ts +4 -4
  285. package/build/src/rules/eslint/formatting/require-multiline-condition-groups.d.ts.map +1 -1
  286. package/build/src/rules/eslint/formatting/require-multiline-condition-groups.js +5 -5
  287. package/build/src/rules/eslint/formatting/require-multiline-condition-groups.js.map +1 -1
  288. package/build/src/rules/eslint/formatting/require-multiline-conditions.d.ts +4 -4
  289. package/build/src/rules/eslint/formatting/require-multiline-conditions.d.ts.map +1 -1
  290. package/build/src/rules/eslint/formatting/require-multiline-conditions.js +5 -5
  291. package/build/src/rules/eslint/formatting/require-multiline-conditions.js.map +1 -1
  292. package/build/src/rules/eslint/formatting/require-padding-lines.d.ts +9 -9
  293. package/build/src/rules/eslint/formatting/require-padding-lines.d.ts.map +1 -1
  294. package/build/src/rules/eslint/formatting/require-padding-lines.js +20 -20
  295. package/build/src/rules/eslint/formatting/require-padding-lines.js.map +1 -1
  296. package/build/src/rules/eslint/formatting/require-ternary-parens.d.ts +3 -3
  297. package/build/src/rules/eslint/formatting/require-ternary-parens.d.ts.map +1 -1
  298. package/build/src/rules/eslint/formatting/require-ternary-parens.js +2 -2
  299. package/build/src/rules/eslint/formatting/require-ternary-parens.js.map +1 -1
  300. package/build/src/rules/eslint/index.d.ts +44 -44
  301. package/build/src/rules/eslint/index.d.ts.map +1 -1
  302. package/build/src/rules/eslint/index.js +44 -44
  303. package/build/src/rules/eslint/index.js.map +1 -1
  304. package/build/src/rules/eslint/jsdoc/require-jsdoc-body.d.ts +7 -7
  305. package/build/src/rules/eslint/jsdoc/require-jsdoc-body.d.ts.map +1 -1
  306. package/build/src/rules/eslint/jsdoc/require-jsdoc-body.js +7 -7
  307. package/build/src/rules/eslint/jsdoc/require-jsdoc-body.js.map +1 -1
  308. package/build/src/rules/eslint/jsdoc/require-jsdoc-hierarchy.d.ts +9 -7
  309. package/build/src/rules/eslint/jsdoc/require-jsdoc-hierarchy.d.ts.map +1 -1
  310. package/build/src/rules/eslint/jsdoc/require-jsdoc-hierarchy.js +115 -61
  311. package/build/src/rules/eslint/jsdoc/require-jsdoc-hierarchy.js.map +1 -1
  312. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-alignment.d.ts +3 -3
  313. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-alignment.d.ts.map +1 -1
  314. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-alignment.js +6 -6
  315. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-alignment.js.map +1 -1
  316. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-name.d.ts +3 -3
  317. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-name.d.ts.map +1 -1
  318. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-name.js +3 -3
  319. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-name.js.map +1 -1
  320. package/build/src/rules/eslint/jsdoc/require-jsdoc-private.d.ts +3 -3
  321. package/build/src/rules/eslint/jsdoc/require-jsdoc-private.d.ts.map +1 -1
  322. package/build/src/rules/eslint/jsdoc/require-jsdoc-private.js +3 -3
  323. package/build/src/rules/eslint/jsdoc/require-jsdoc-private.js.map +1 -1
  324. package/build/src/rules/eslint/jsdoc/require-jsdoc-since.d.ts +3 -3
  325. package/build/src/rules/eslint/jsdoc/require-jsdoc-since.d.ts.map +1 -1
  326. package/build/src/rules/eslint/jsdoc/require-jsdoc-since.js +8 -8
  327. package/build/src/rules/eslint/jsdoc/require-jsdoc-since.js.map +1 -1
  328. package/build/src/rules/eslint/nova/no-logger-dev.d.ts +3 -3
  329. package/build/src/rules/eslint/nova/no-logger-dev.d.ts.map +1 -1
  330. package/build/src/rules/eslint/nova/no-logger-dev.js +5 -5
  331. package/build/src/rules/eslint/nova/no-logger-dev.js.map +1 -1
  332. package/build/src/rules/eslint/patterns/no-assign-then-return.d.ts +3 -3
  333. package/build/src/rules/eslint/patterns/no-assign-then-return.d.ts.map +1 -1
  334. package/build/src/rules/eslint/patterns/no-assign-then-return.js +2 -2
  335. package/build/src/rules/eslint/patterns/no-assign-then-return.js.map +1 -1
  336. package/build/src/rules/eslint/patterns/no-await-in-loop.d.ts +7 -7
  337. package/build/src/rules/eslint/patterns/no-await-in-loop.d.ts.map +1 -1
  338. package/build/src/rules/eslint/patterns/no-await-in-loop.js +4 -4
  339. package/build/src/rules/eslint/patterns/no-await-in-loop.js.map +1 -1
  340. package/build/src/rules/eslint/patterns/no-boolean-var-for-if.d.ts +3 -3
  341. package/build/src/rules/eslint/patterns/no-boolean-var-for-if.d.ts.map +1 -1
  342. package/build/src/rules/eslint/patterns/no-boolean-var-for-if.js +2 -2
  343. package/build/src/rules/eslint/patterns/no-boolean-var-for-if.js.map +1 -1
  344. package/build/src/rules/eslint/patterns/no-bracket-assignment.d.ts +3 -3
  345. package/build/src/rules/eslint/patterns/no-bracket-assignment.d.ts.map +1 -1
  346. package/build/src/rules/eslint/patterns/no-bracket-assignment.js +2 -2
  347. package/build/src/rules/eslint/patterns/no-bracket-assignment.js.map +1 -1
  348. package/build/src/rules/eslint/patterns/no-bracket-method-call.d.ts +4 -4
  349. package/build/src/rules/eslint/patterns/no-bracket-method-call.d.ts.map +1 -1
  350. package/build/src/rules/eslint/patterns/no-bracket-method-call.js +2 -2
  351. package/build/src/rules/eslint/patterns/no-bracket-method-call.js.map +1 -1
  352. package/build/src/rules/eslint/patterns/no-template-curly-in-string.d.ts +3 -3
  353. package/build/src/rules/eslint/patterns/no-template-curly-in-string.d.ts.map +1 -1
  354. package/build/src/rules/eslint/patterns/no-template-curly-in-string.js +2 -2
  355. package/build/src/rules/eslint/patterns/no-template-curly-in-string.js.map +1 -1
  356. package/build/src/rules/eslint/patterns/no-use-before-define.d.ts +7 -7
  357. package/build/src/rules/eslint/patterns/no-use-before-define.d.ts.map +1 -1
  358. package/build/src/rules/eslint/patterns/no-use-before-define.js +2 -2
  359. package/build/src/rules/eslint/patterns/no-use-before-define.js.map +1 -1
  360. package/build/src/rules/eslint/regex/no-regex-literal-flags.d.ts +3 -3
  361. package/build/src/rules/eslint/regex/no-regex-literal-flags.d.ts.map +1 -1
  362. package/build/src/rules/eslint/regex/no-regex-literal-flags.js +2 -2
  363. package/build/src/rules/eslint/regex/no-regex-literal-flags.js.map +1 -1
  364. package/build/src/rules/eslint/regex/no-regex-literals.d.ts +4 -4
  365. package/build/src/rules/eslint/regex/no-regex-literals.d.ts.map +1 -1
  366. package/build/src/rules/eslint/regex/no-regex-literals.js +2 -2
  367. package/build/src/rules/eslint/regex/no-regex-literals.js.map +1 -1
  368. package/build/src/rules/eslint/safety/no-script-url.d.ts +4 -4
  369. package/build/src/rules/eslint/safety/no-script-url.d.ts.map +1 -1
  370. package/build/src/rules/eslint/safety/no-script-url.js +2 -2
  371. package/build/src/rules/eslint/safety/no-script-url.js.map +1 -1
  372. package/build/src/rules/eslint/syntax/no-destructuring.d.ts +8 -8
  373. package/build/src/rules/eslint/syntax/no-destructuring.d.ts.map +1 -1
  374. package/build/src/rules/eslint/syntax/no-destructuring.js +10 -10
  375. package/build/src/rules/eslint/syntax/no-destructuring.js.map +1 -1
  376. package/build/src/rules/eslint/syntax/no-numeric-literals.d.ts +6 -6
  377. package/build/src/rules/eslint/syntax/no-numeric-literals.d.ts.map +1 -1
  378. package/build/src/rules/eslint/syntax/no-numeric-literals.js +2 -2
  379. package/build/src/rules/eslint/syntax/no-numeric-literals.js.map +1 -1
  380. package/build/src/rules/eslint/syntax/no-optional-chaining.d.ts +3 -3
  381. package/build/src/rules/eslint/syntax/no-optional-chaining.d.ts.map +1 -1
  382. package/build/src/rules/eslint/syntax/no-optional-chaining.js +2 -2
  383. package/build/src/rules/eslint/syntax/no-optional-chaining.js.map +1 -1
  384. package/build/src/rules/eslint/syntax/no-rest-params.d.ts +4 -4
  385. package/build/src/rules/eslint/syntax/no-rest-params.d.ts.map +1 -1
  386. package/build/src/rules/eslint/syntax/no-rest-params.js +8 -8
  387. package/build/src/rules/eslint/syntax/no-rest-params.js.map +1 -1
  388. package/build/src/rules/eslint/typescript/no-catch-unknown-annotation.d.ts +3 -3
  389. package/build/src/rules/eslint/typescript/no-catch-unknown-annotation.d.ts.map +1 -1
  390. package/build/src/rules/eslint/typescript/no-catch-unknown-annotation.js +2 -2
  391. package/build/src/rules/eslint/typescript/no-catch-unknown-annotation.js.map +1 -1
  392. package/build/src/rules/eslint/typescript/no-explicit-any.d.ts +3 -3
  393. package/build/src/rules/eslint/typescript/no-explicit-any.d.ts.map +1 -1
  394. package/build/src/rules/eslint/typescript/no-explicit-any.js +2 -2
  395. package/build/src/rules/eslint/typescript/no-explicit-any.js.map +1 -1
  396. package/build/src/rules/eslint/typescript/no-inline-type-annotation.d.ts +3 -3
  397. package/build/src/rules/eslint/typescript/no-inline-type-annotation.d.ts.map +1 -1
  398. package/build/src/rules/eslint/typescript/no-inline-type-annotation.js +9 -9
  399. package/build/src/rules/eslint/typescript/no-inline-type-annotation.js.map +1 -1
  400. package/build/src/rules/eslint/typescript/no-shared-type-import.d.ts +4 -4
  401. package/build/src/rules/eslint/typescript/no-shared-type-import.d.ts.map +1 -1
  402. package/build/src/rules/eslint/typescript/no-shared-type-import.js +2 -2
  403. package/build/src/rules/eslint/typescript/no-shared-type-import.js.map +1 -1
  404. package/build/src/rules/eslint/typescript/require-bracket-property-access.d.ts +4 -4
  405. package/build/src/rules/eslint/typescript/require-bracket-property-access.d.ts.map +1 -1
  406. package/build/src/rules/eslint/typescript/require-bracket-property-access.js +2 -2
  407. package/build/src/rules/eslint/typescript/require-bracket-property-access.js.map +1 -1
  408. package/build/src/rules/eslint/typescript/require-type-naming.d.ts +6 -4
  409. package/build/src/rules/eslint/typescript/require-type-naming.d.ts.map +1 -1
  410. package/build/src/rules/eslint/typescript/require-type-naming.js +54 -8
  411. package/build/src/rules/eslint/typescript/require-type-naming.js.map +1 -1
  412. package/build/src/toolkit/bootstrap.d.ts +10 -10
  413. package/build/src/toolkit/bootstrap.d.ts.map +1 -1
  414. package/build/src/toolkit/bootstrap.js +33 -33
  415. package/build/src/toolkit/bootstrap.js.map +1 -1
  416. package/build/src/toolkit/cli-header.d.ts +4 -4
  417. package/build/src/toolkit/cli-header.d.ts.map +1 -1
  418. package/build/src/toolkit/cli-header.js +22 -22
  419. package/build/src/toolkit/cli-header.js.map +1 -1
  420. package/build/src/toolkit/logger.d.ts +9 -9
  421. package/build/src/toolkit/logger.d.ts.map +1 -1
  422. package/build/src/toolkit/logger.js +16 -16
  423. package/build/src/toolkit/logger.js.map +1 -1
  424. package/build/src/toolkit/markdown-table.d.ts +6 -6
  425. package/build/src/toolkit/markdown-table.d.ts.map +1 -1
  426. package/build/src/toolkit/markdown-table.js +2 -2
  427. package/build/src/toolkit/markdown-table.js.map +1 -1
  428. package/build/src/types/api/node-releases.d.ts +14 -14
  429. package/build/src/types/api/spdx-licenses.d.ts +17 -17
  430. package/build/src/types/cli/generate/github/funding.d.ts +28 -28
  431. package/build/src/types/cli/generate/github/issue-template.d.ts +87 -71
  432. package/build/src/types/cli/generate/github/workflows.d.ts +365 -302
  433. package/build/src/types/cli/generate/must-haves/agent-conventions.d.ts +29 -21
  434. package/build/src/types/cli/generate/must-haves/dotenv.d.ts +209 -205
  435. package/build/src/types/cli/generate/must-haves/editorconfig.d.ts +16 -16
  436. package/build/src/types/cli/generate/must-haves/gitignore.d.ts +188 -156
  437. package/build/src/types/cli/generate/must-haves/license.d.ts +27 -42
  438. package/build/src/types/cli/generate/must-haves/read-me.d.ts +105 -95
  439. package/build/src/types/cli/index.d.ts +73 -84
  440. package/build/src/types/cli/recipe/github/handle-gh-failure.d.ts +18 -0
  441. package/build/src/types/cli/recipe/github/sync-features.d.ts +67 -0
  442. package/build/src/types/cli/recipe/github/sync-identity.d.ts +107 -0
  443. package/build/src/types/cli/recipe/github/sync-policies.d.ts +70 -0
  444. package/build/src/types/cli/recipe/index.d.ts +21 -16
  445. package/build/src/types/cli/recipe/package-json/cleanup.d.ts +57 -55
  446. package/build/src/types/cli/recipe/package-json/normalize-artifacts.d.ts +44 -44
  447. package/build/src/types/cli/recipe/package-json/normalize-bundler.d.ts +36 -36
  448. package/build/src/types/cli/recipe/package-json/normalize-dependencies.d.ts +65 -65
  449. package/build/src/types/cli/recipe/package-json/normalize-modules.d.ts +37 -35
  450. package/build/src/types/cli/recipe/package-json/normalize-tooling.d.ts +39 -39
  451. package/build/src/types/cli/recipe/package-json/sync-environment.d.ts +60 -60
  452. package/build/src/types/cli/recipe/package-json/sync-identity.d.ts +51 -51
  453. package/build/src/types/cli/recipe/package-json/sync-ownership.d.ts +78 -78
  454. package/build/src/types/cli/scaffold/app/expressjs.d.ts +10 -10
  455. package/build/src/types/cli/scaffold/app/nextjs.d.ts +10 -10
  456. package/build/src/types/cli/scaffold/app/vite.d.ts +10 -10
  457. package/build/src/types/cli/scaffold/app/workers.d.ts +10 -10
  458. package/build/src/types/cli/scaffold/docs/docusaurus.d.ts +10 -10
  459. package/build/src/types/cli/scaffold/starter/base.d.ts +27 -27
  460. package/build/src/types/cli/utility/changelog.d.ts +189 -180
  461. package/build/src/types/cli/utility/initialize.d.ts +1135 -690
  462. package/build/src/types/cli/utility/run-recipes.d.ts +32 -11
  463. package/build/src/types/cli/utility/run-scripts.d.ts +126 -52
  464. package/build/src/types/cli/utility/transpile.d.ts +30 -30
  465. package/build/src/types/cli/utility/type-check.d.ts +30 -30
  466. package/build/src/types/cli/utility/version.d.ts +130 -130
  467. package/build/src/types/lib/constants.d.ts +13 -0
  468. package/build/src/types/lib/item.d.ts +158 -149
  469. package/build/src/types/lib/nova-config.d.ts +379 -191
  470. package/build/src/types/lib/regex.d.ts +762 -0
  471. package/build/src/types/lib/scaffold.d.ts +176 -149
  472. package/build/src/types/lib/utility.d.ts +395 -194
  473. package/build/src/types/lib/workflow-templates.d.ts +61 -56
  474. package/build/src/types/presets/eslint/dx-code-style.d.ts +1 -1
  475. package/build/src/types/presets/eslint/dx-ignore.d.ts +1 -1
  476. package/build/src/types/presets/eslint/fw-docusaurus.d.ts +1 -1
  477. package/build/src/types/presets/eslint/fw-expressjs.d.ts +1 -1
  478. package/build/src/types/presets/eslint/fw-nextjs.d.ts +1 -1
  479. package/build/src/types/presets/eslint/lang-javascript.d.ts +1 -1
  480. package/build/src/types/presets/eslint/lang-mdx.d.ts +1 -1
  481. package/build/src/types/presets/eslint/lang-typescript.d.ts +1 -1
  482. package/build/src/types/presets/eslint/runtime-browser.d.ts +1 -1
  483. package/build/src/types/presets/eslint/runtime-cloudflare-workers.d.ts +1 -1
  484. package/build/src/types/presets/eslint/runtime-edge.d.ts +1 -1
  485. package/build/src/types/presets/eslint/runtime-node.d.ts +1 -1
  486. package/build/src/types/presets/eslint/runtime-service-worker.d.ts +1 -1
  487. package/build/src/types/presets/eslint/runtime-web-worker.d.ts +1 -1
  488. package/build/src/types/presets/eslint/tool-vite.d.ts +1 -1
  489. package/build/src/types/rules/eslint/conventions/no-default-export-declaration.d.ts +30 -13
  490. package/build/src/types/rules/eslint/conventions/no-implicit-boolean.d.ts +84 -25
  491. package/build/src/types/rules/eslint/conventions/require-explicit-return.d.ts +47 -42
  492. package/build/src/types/rules/eslint/conventions/require-hash-private.d.ts +35 -12
  493. package/build/src/types/rules/eslint/conventions/require-kebab-case-filename.d.ts +35 -29
  494. package/build/src/types/rules/eslint/conventions/require-naming-convention.d.ts +212 -115
  495. package/build/src/types/rules/eslint/conventions/require-undefined-init.d.ts +34 -11
  496. package/build/src/types/rules/eslint/conventions/switch-case-blocks.d.ts +41 -18
  497. package/build/src/types/rules/eslint/formatting/no-complex-arrow-concise.d.ts +44 -30
  498. package/build/src/types/rules/eslint/formatting/no-multiline-strings.d.ts +67 -44
  499. package/build/src/types/rules/eslint/formatting/no-raw-text-in-code.d.ts +24 -10
  500. package/build/src/types/rules/eslint/formatting/no-ternary-in-template-literal.d.ts +23 -9
  501. package/build/src/types/rules/eslint/formatting/require-import-order.d.ts +51 -39
  502. package/build/src/types/rules/eslint/formatting/require-multiline-condition-groups.d.ts +42 -26
  503. package/build/src/types/rules/eslint/formatting/require-multiline-conditions.d.ts +36 -20
  504. package/build/src/types/rules/eslint/formatting/require-padding-lines.d.ts +144 -103
  505. package/build/src/types/rules/eslint/formatting/require-ternary-parens.d.ts +35 -12
  506. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-body.d.ts +65 -29
  507. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-hierarchy.d.ts +308 -134
  508. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-param-alignment.d.ts +59 -52
  509. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-param-name.d.ts +41 -26
  510. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-private.d.ts +49 -17
  511. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-since.d.ts +79 -11
  512. package/build/src/types/rules/eslint/nova/no-logger-dev.d.ts +35 -25
  513. package/build/src/types/rules/eslint/patterns/no-assign-then-return.d.ts +40 -17
  514. package/build/src/types/rules/eslint/patterns/no-await-in-loop.d.ts +53 -45
  515. package/build/src/types/rules/eslint/patterns/no-boolean-var-for-if.d.ts +34 -20
  516. package/build/src/types/rules/eslint/patterns/no-bracket-assignment.d.ts +36 -13
  517. package/build/src/types/rules/eslint/patterns/no-bracket-method-call.d.ts +43 -20
  518. package/build/src/types/rules/eslint/patterns/no-template-curly-in-string.d.ts +26 -12
  519. package/build/src/types/rules/eslint/patterns/no-use-before-define.d.ts +59 -45
  520. package/build/src/types/rules/eslint/regex/no-regex-literal-flags.d.ts +23 -9
  521. package/build/src/types/rules/eslint/regex/no-regex-literals.d.ts +31 -17
  522. package/build/src/types/rules/eslint/safety/no-script-url.d.ts +29 -15
  523. package/build/src/types/rules/eslint/syntax/no-destructuring.d.ts +61 -58
  524. package/build/src/types/rules/eslint/syntax/no-numeric-literals.d.ts +43 -29
  525. package/build/src/types/rules/eslint/syntax/no-optional-chaining.d.ts +23 -9
  526. package/build/src/types/rules/eslint/syntax/no-rest-params.d.ts +63 -31
  527. package/build/src/types/rules/eslint/typescript/no-catch-unknown-annotation.d.ts +34 -11
  528. package/build/src/types/rules/eslint/typescript/no-explicit-any.d.ts +23 -9
  529. package/build/src/types/rules/eslint/typescript/no-inline-type-annotation.d.ts +58 -32
  530. package/build/src/types/rules/eslint/typescript/no-shared-type-import.d.ts +32 -18
  531. package/build/src/types/rules/eslint/typescript/require-bracket-property-access.d.ts +50 -22
  532. package/build/src/types/rules/eslint/typescript/require-type-naming.d.ts +87 -20
  533. package/build/src/types/shared.d.ts +410 -365
  534. package/build/src/types/tests/api/node-releases.test.d.ts +87 -6
  535. package/build/src/types/tests/api/spdx-licenses.test.d.ts +48 -8
  536. package/build/src/types/tests/cli/generate/github/funding.test.d.ts +21 -13
  537. package/build/src/types/tests/cli/generate/github/issue-template.test.d.ts +26 -6
  538. package/build/src/types/tests/cli/generate/github/workflows-helpers.test.d.ts +206 -21
  539. package/build/src/types/tests/cli/generate/github/workflows.test.d.ts +556 -29
  540. package/build/src/types/tests/cli/generate/must-haves/agent-conventions.test.d.ts +39 -14
  541. package/build/src/types/tests/cli/generate/must-haves/dotenv.test.d.ts +28 -6
  542. package/build/src/types/tests/cli/generate/must-haves/editorconfig.test.d.ts +19 -11
  543. package/build/src/types/tests/cli/generate/must-haves/gitignore.test.d.ts +24 -6
  544. package/build/src/types/tests/cli/generate/must-haves/license.test.d.ts +151 -11
  545. package/build/src/types/tests/cli/generate/must-haves/read-me.test.d.ts +216 -18
  546. package/build/src/types/tests/cli/recipe/github/handle-gh-failure.test.d.ts +96 -0
  547. package/build/src/types/tests/cli/recipe/github/sync-features.test.d.ts +357 -0
  548. package/build/src/types/tests/cli/recipe/github/sync-identity.test.d.ts +475 -0
  549. package/build/src/types/tests/cli/recipe/github/sync-policies.test.d.ts +408 -0
  550. package/build/src/types/tests/cli/recipe/package-json/cleanup.test.d.ts +159 -20
  551. package/build/src/types/tests/cli/recipe/package-json/normalize-artifacts.test.d.ts +102 -15
  552. package/build/src/types/tests/cli/recipe/package-json/normalize-bundler.test.d.ts +102 -15
  553. package/build/src/types/tests/cli/recipe/package-json/normalize-dependencies.test.d.ts +106 -19
  554. package/build/src/types/tests/cli/recipe/package-json/normalize-modules.test.d.ts +101 -14
  555. package/build/src/types/tests/cli/recipe/package-json/normalize-tooling.test.d.ts +126 -14
  556. package/build/src/types/tests/cli/recipe/package-json/sync-environment.test.d.ts +101 -14
  557. package/build/src/types/tests/cli/recipe/package-json/sync-identity.test.d.ts +101 -14
  558. package/build/src/types/tests/cli/recipe/package-json/sync-ownership.test.d.ts +101 -14
  559. package/build/src/types/tests/cli/scaffold/app/expressjs.test.d.ts +59 -18
  560. package/build/src/types/tests/cli/scaffold/app/nextjs.test.d.ts +62 -19
  561. package/build/src/types/tests/cli/scaffold/app/vite.test.d.ts +60 -19
  562. package/build/src/types/tests/cli/scaffold/app/workers.test.d.ts +59 -18
  563. package/build/src/types/tests/cli/scaffold/docs/docusaurus.test.d.ts +59 -18
  564. package/build/src/types/tests/cli/scaffold/starter/base.test.d.ts +55 -18
  565. package/build/src/types/tests/cli/utility/changelog.test.d.ts +161 -32
  566. package/build/src/types/tests/cli/utility/initialize.test.d.ts +211 -5
  567. package/build/src/types/tests/cli/utility/run-recipes.test.d.ts +87 -9
  568. package/build/src/types/tests/cli/utility/run-scripts.test.d.ts +124 -24
  569. package/build/src/types/tests/cli/utility/transpile.test.d.ts +23 -11
  570. package/build/src/types/tests/cli/utility/type-check.test.d.ts +34 -9
  571. package/build/src/types/tests/cli/utility/version.test.d.ts +33 -4
  572. package/build/src/types/tests/lib/item.test.d.ts +191 -37
  573. package/build/src/types/tests/lib/nova-config.test.d.ts +1032 -69
  574. package/build/src/types/tests/lib/regex.test.d.ts +453 -27
  575. package/build/src/types/tests/lib/scaffold.test.d.ts +55 -12
  576. package/build/src/types/tests/lib/schema.test.d.ts +171 -16
  577. package/build/src/types/tests/lib/utility.test.d.ts +1151 -142
  578. package/build/src/types/tests/lib/workflow-templates.test.d.ts +17 -17
  579. package/build/src/types/tests/rules/eslint/conventions/no-default-export-declaration.test.d.ts +1 -1
  580. package/build/src/types/tests/rules/eslint/conventions/no-implicit-boolean.test.d.ts +1 -1
  581. package/build/src/types/tests/rules/eslint/conventions/require-explicit-return.test.d.ts +1 -1
  582. package/build/src/types/tests/rules/eslint/conventions/require-hash-private.test.d.ts +1 -1
  583. package/build/src/types/tests/rules/eslint/conventions/require-kebab-case-filename.test.d.ts +1 -1
  584. package/build/src/types/tests/rules/eslint/conventions/require-naming-convention.test.d.ts +1 -1
  585. package/build/src/types/tests/rules/eslint/conventions/require-undefined-init.test.d.ts +1 -1
  586. package/build/src/types/tests/rules/eslint/conventions/switch-case-blocks.test.d.ts +1 -1
  587. package/build/src/types/tests/rules/eslint/formatting/no-complex-arrow-concise.test.d.ts +1 -1
  588. package/build/src/types/tests/rules/eslint/formatting/no-multiline-strings.test.d.ts +1 -1
  589. package/build/src/types/tests/rules/eslint/formatting/no-raw-text-in-code.test.d.ts +1 -1
  590. package/build/src/types/tests/rules/eslint/formatting/no-ternary-in-template-literal.test.d.ts +1 -1
  591. package/build/src/types/tests/rules/eslint/formatting/require-import-order.test.d.ts +1 -1
  592. package/build/src/types/tests/rules/eslint/formatting/require-multiline-condition-groups.test.d.ts +1 -1
  593. package/build/src/types/tests/rules/eslint/formatting/require-multiline-conditions.test.d.ts +1 -1
  594. package/build/src/types/tests/rules/eslint/formatting/require-padding-lines.test.d.ts +1 -1
  595. package/build/src/types/tests/rules/eslint/formatting/require-ternary-parens.test.d.ts +1 -1
  596. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-body.test.d.ts +1 -1
  597. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-hierarchy.test.d.ts +1 -1
  598. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-param-alignment.test.d.ts +1 -1
  599. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-param-name.test.d.ts +1 -1
  600. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-private.test.d.ts +1 -1
  601. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-since.test.d.ts +1 -1
  602. package/build/src/types/tests/rules/eslint/nova/no-logger-dev.test.d.ts +1 -1
  603. package/build/src/types/tests/rules/eslint/patterns/no-assign-then-return.test.d.ts +1 -1
  604. package/build/src/types/tests/rules/eslint/patterns/no-await-in-loop.test.d.ts +1 -1
  605. package/build/src/types/tests/rules/eslint/patterns/no-boolean-var-for-if.test.d.ts +1 -1
  606. package/build/src/types/tests/rules/eslint/patterns/no-bracket-assignment.test.d.ts +1 -1
  607. package/build/src/types/tests/rules/eslint/patterns/no-bracket-method-call.test.d.ts +1 -1
  608. package/build/src/types/tests/rules/eslint/patterns/no-template-curly-in-string.test.d.ts +1 -1
  609. package/build/src/types/tests/rules/eslint/patterns/no-use-before-define.test.d.ts +1 -1
  610. package/build/src/types/tests/rules/eslint/regex/no-regex-literal-flags.test.d.ts +1 -1
  611. package/build/src/types/tests/rules/eslint/regex/no-regex-literals.test.d.ts +1 -1
  612. package/build/src/types/tests/rules/eslint/safety/no-script-url.test.d.ts +1 -1
  613. package/build/src/types/tests/rules/eslint/syntax/no-destructuring.test.d.ts +1 -1
  614. package/build/src/types/tests/rules/eslint/syntax/no-numeric-literals.test.d.ts +1 -1
  615. package/build/src/types/tests/rules/eslint/syntax/no-optional-chaining.test.d.ts +1 -1
  616. package/build/src/types/tests/rules/eslint/syntax/no-rest-params.test.d.ts +1 -1
  617. package/build/src/types/tests/rules/eslint/typescript/no-catch-unknown-annotation.test.d.ts +1 -1
  618. package/build/src/types/tests/rules/eslint/typescript/no-explicit-any.test.d.ts +1 -1
  619. package/build/src/types/tests/rules/eslint/typescript/no-inline-type-annotation.test.d.ts +1 -1
  620. package/build/src/types/tests/rules/eslint/typescript/no-shared-type-import.test.d.ts +1 -1
  621. package/build/src/types/tests/rules/eslint/typescript/require-bracket-property-access.test.d.ts +3 -3
  622. package/build/src/types/tests/rules/eslint/typescript/require-type-naming.test.d.ts +1 -1
  623. package/build/src/types/tests/toolkit/bootstrap.test.d.ts +155 -40
  624. package/build/src/types/tests/toolkit/cli-header.test.d.ts +135 -22
  625. package/build/src/types/tests/toolkit/logger.test.d.ts +113 -5
  626. package/build/src/types/tests/toolkit/markdown-table.test.d.ts +150 -27
  627. package/build/src/types/tests/type-declarations.test.d.ts +4683 -300
  628. package/build/src/types/toolkit/bootstrap.d.ts +71 -47
  629. package/build/src/types/toolkit/cli-header.d.ts +98 -88
  630. package/build/src/types/toolkit/logger.d.ts +98 -53
  631. package/build/src/types/toolkit/markdown-table.d.ts +74 -72
  632. package/build/templates/generators/github/workflows/publish/targets/aws-amplify-nextjs.yml +2 -2
  633. package/build/templates/generators/github/workflows/publish/targets/cloudflare-pages-docusaurus.yml +2 -2
  634. package/build/templates/generators/github/workflows/publish/targets/github-action.yml +121 -0
  635. package/build/templates/generators/github/workflows/publish/targets/github-packages.yml +3 -2
  636. package/build/templates/generators/github/workflows/publish/targets/github-pages-docusaurus.yml +2 -2
  637. package/build/templates/generators/github/workflows/publish/targets/npm.yml +3 -2
  638. package/build/templates/generators/github/workflows/publish/targets/vercel-nextjs.yml +2 -2
  639. package/build/templates/generators/must-haves/agent-conventions/AGENTS.md +1 -0
  640. package/build/templates/generators/must-haves/agent-conventions/CLAUDE.md +1 -0
  641. package/build/templates/generators/must-haves/agent-conventions/PROJECT_RULES.md +1 -1
  642. package/build/templates/generators/must-haves/agent-conventions/conventions/typescript.md +412 -148
  643. package/build/templates/generators/must-haves/agent-conventions/conventions/universal.md +27 -3
  644. package/build/templates/generators/must-haves/agent-conventions/cursorrules +55 -0
  645. package/build/templates/generators/must-haves/dotenv/env +14 -0
  646. package/build/templates/generators/must-haves/dotenv/env.sample +14 -0
  647. package/build/templates/generators/must-haves/editorconfig/editorconfig +212 -0
  648. package/build/templates/generators/must-haves/gitignore/gitignore +179 -0
  649. package/build/templates/scaffold/app/nextjs/next.config.mjs +3 -1
  650. package/package.json +1 -1
@@ -2,12 +2,12 @@ import { promises as fs } from 'fs';
2
2
  import { join } from 'path';
3
3
  import chalk from 'chalk';
4
4
  import { parse as parseYaml, stringify as stringifyYaml, } from 'yaml';
5
- import { LibNovaConfig } from '../../../lib/nova-config.js';
5
+ import { Runner as LibNovaConfig } from '../../../lib/nova-config.js';
6
6
  import { LIB_REGEX_PATTERN_LEADING_DOT_SLASH, LIB_REGEX_PATTERN_TRAILING_NEWLINES, LIB_REGEX_PATTERN_TRAILING_NEWLINES_OR_NONE, LIB_REGEX_PATTERN_TRAILING_SLASH, LIB_REGEX_PATTERN_WORKFLOW_CONTEXT_EXPRESSION, LIB_REGEX_PATTERN_WORKFLOW_CONTEXT_SEPARATOR, LIB_REGEX_PATTERN_WORKFLOW_CONTEXT_WRAPPER_END, LIB_REGEX_PATTERN_WORKFLOW_CONTEXT_WRAPPER_START, LIB_REGEX_PATTERN_WORKFLOW_NAME, LIB_REGEX_PATTERN_WORKFLOW_RUN_NAME_CAPTURE, } from '../../../lib/regex.js';
7
7
  import { isProjectRoot, pathExists, renameFileWithDate, resolveTemplatePath, saveGeneratedFile, } from '../../../lib/utility.js';
8
8
  import { libWorkflowTemplatesMetadata } from '../../../lib/workflow-templates.js';
9
9
  import { Logger } from '../../../toolkit/index.js';
10
- export class CliGenerateGithubWorkflows {
10
+ export class Runner {
11
11
  static async run(options) {
12
12
  const currentDirectory = process.cwd();
13
13
  const isAtProjectRoot = await isProjectRoot(currentDirectory);
@@ -19,14 +19,14 @@ export class CliGenerateGithubWorkflows {
19
19
  const isReplaceFile = options['replaceFile'] === true;
20
20
  if (isDryRun === true) {
21
21
  Logger.customize({
22
- name: 'CliGenerateGithubWorkflows.run',
22
+ name: 'Runner.run',
23
23
  purpose: 'options',
24
24
  }).warn('Dry run enabled. File changes will not be made in this session.');
25
25
  }
26
26
  if (isReplaceFile === true) {
27
27
  const replaceFileNotice = (isDryRun === true) ? 'This option has no effect during a dry run session.' : 'Backup file will not be created.';
28
28
  Logger.customize({
29
- name: 'CliGenerateGithubWorkflows.run',
29
+ name: 'Runner.run',
30
30
  purpose: 'options',
31
31
  }).warn(`Replace file enabled. ${replaceFileNotice}`);
32
32
  }
@@ -34,7 +34,7 @@ export class CliGenerateGithubWorkflows {
34
34
  const workflows = config['workflows'];
35
35
  if (workflows === undefined || workflows.length === 0) {
36
36
  Logger.customize({
37
- name: 'CliGenerateGithubWorkflows.run',
37
+ name: 'Runner.run',
38
38
  purpose: 'skip',
39
39
  }).info('No workflows configured.');
40
40
  return 'completed';
@@ -47,7 +47,7 @@ export class CliGenerateGithubWorkflows {
47
47
  const duplicateKey = (entry['suffix'] !== undefined) ? `${entry['template']}-${entry['suffix']}` : entry['template'];
48
48
  if (duplicateSet.has(duplicateKey) === true) {
49
49
  Logger.customize({
50
- name: 'CliGenerateGithubWorkflows.run',
50
+ name: 'Runner.run',
51
51
  purpose: 'validate',
52
52
  }).error(`Duplicate workflow ${chalk.cyan(`"${duplicateKey}"`)}. Each template must have a unique suffix when used multiple times.`);
53
53
  hasDuplicateError = true;
@@ -58,24 +58,160 @@ export class CliGenerateGithubWorkflows {
58
58
  process.exitCode = 1;
59
59
  return 'cancelled';
60
60
  }
61
- if (CliGenerateGithubWorkflows.detectCircularDependsOn(workflows) === true) {
61
+ if (Runner.detectCircularDependsOn(workflows) === true) {
62
62
  Logger.customize({
63
- name: 'CliGenerateGithubWorkflows.run',
63
+ name: 'Runner.run',
64
64
  purpose: 'validate',
65
65
  }).error('Circular depends-on references detected. Aborting.');
66
66
  process.exitCode = 1;
67
67
  return 'cancelled';
68
68
  }
69
+ const skippedWorkflowKeys = new Set();
70
+ for (const literalWorkflowEntry of workflows) {
71
+ const literalEntry = literalWorkflowEntry;
72
+ const literalTemplateName = literalEntry['template'];
73
+ const literalSuffix = literalEntry['suffix'];
74
+ const literalWorkflowKey = (literalSuffix !== undefined) ? `${literalTemplateName}-${literalSuffix}` : literalTemplateName;
75
+ const literalMetadataEntry = libWorkflowTemplatesMetadata.find((m) => m['name'] === literalTemplateName);
76
+ if (literalMetadataEntry === undefined) {
77
+ continue;
78
+ }
79
+ const missingLiterals = [];
80
+ for (const variableEntry of Object.entries(literalMetadataEntry['variables'])) {
81
+ const templateVariableName = variableEntry[0];
82
+ const templateVariableMeta = variableEntry[1];
83
+ if (templateVariableMeta['format'] === 'literal') {
84
+ const templateLiteralValue = (literalEntry['settings'] !== undefined) ? literalEntry['settings'][templateVariableName] : undefined;
85
+ if (typeof templateLiteralValue !== 'string' || templateLiteralValue.trim() === '') {
86
+ missingLiterals.push(templateVariableName);
87
+ }
88
+ }
89
+ }
90
+ const targetsMetadataForValidation = literalMetadataEntry['targets'] ?? {};
91
+ const entryTargetsForValidation = literalEntry['targets'] ?? [];
92
+ for (const entryTargetForValidation of entryTargetsForValidation) {
93
+ const targetTypeForValidation = entryTargetForValidation['type'];
94
+ const targetMetadataForValidation = targetsMetadataForValidation[targetTypeForValidation];
95
+ if (targetMetadataForValidation === undefined) {
96
+ continue;
97
+ }
98
+ for (const variableEntry of Object.entries(targetMetadataForValidation['variables'])) {
99
+ const validationVariableName = variableEntry[0];
100
+ const validationVariableMeta = variableEntry[1];
101
+ if (validationVariableMeta['format'] === 'literal') {
102
+ const validationLiteralValue = (literalEntry['settings'] !== undefined) ? literalEntry['settings'][validationVariableName] : undefined;
103
+ if (typeof validationLiteralValue !== 'string' || validationLiteralValue.trim() === '') {
104
+ if (missingLiterals.includes(validationVariableName) === false) {
105
+ missingLiterals.push(validationVariableName);
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
111
+ if (missingLiterals.length > 0) {
112
+ Logger.customize({
113
+ name: 'Runner.run',
114
+ purpose: 'validate',
115
+ }).error(`Workflow ${chalk.cyan(`"${literalWorkflowKey}"`)} is missing required literal settings: ${missingLiterals.join(', ')}. Skipping.`);
116
+ skippedWorkflowKeys.add(literalWorkflowKey);
117
+ }
118
+ }
119
+ const globalUniquenessMap = new Map();
120
+ const uniquenessErrors = [];
121
+ for (const uniquenessWorkflowEntry of workflows) {
122
+ const uniquenessEntry = uniquenessWorkflowEntry;
123
+ const uniquenessTemplateName = uniquenessEntry['template'];
124
+ const uniquenessSuffix = uniquenessEntry['suffix'];
125
+ const uniquenessWorkflowKey = (uniquenessSuffix !== undefined) ? `${uniquenessTemplateName}-${uniquenessSuffix}` : uniquenessTemplateName;
126
+ if (skippedWorkflowKeys.has(uniquenessWorkflowKey) === true) {
127
+ continue;
128
+ }
129
+ const uniquenessMetadataEntry = libWorkflowTemplatesMetadata.find((m) => m['name'] === uniquenessTemplateName);
130
+ if (uniquenessMetadataEntry === undefined) {
131
+ continue;
132
+ }
133
+ const uniquenessTargetsMetadata = uniquenessMetadataEntry['targets'] ?? {};
134
+ const uniquenessEntryTargets = uniquenessEntry['targets'] ?? [];
135
+ for (const uniquenessTarget of uniquenessEntryTargets) {
136
+ const entryTargetForUniqueness = uniquenessTarget;
137
+ const targetTypeForUniqueness = entryTargetForUniqueness['type'];
138
+ const targetMetadataForUniqueness = uniquenessTargetsMetadata[targetTypeForUniqueness];
139
+ if (targetMetadataForUniqueness === undefined) {
140
+ continue;
141
+ }
142
+ const uniquenessKeyForTarget = targetMetadataForUniqueness['uniquenessKey'];
143
+ if (uniquenessKeyForTarget === undefined) {
144
+ continue;
145
+ }
146
+ const uniquenessKeyResolvedValues = [];
147
+ const uniquenessKeyDetailEntries = [];
148
+ for (const uniquenessKeyVariableName of uniquenessKeyForTarget) {
149
+ const variableName = uniquenessKeyVariableName;
150
+ const variableMeta = targetMetadataForUniqueness['variables'][variableName];
151
+ const settingValue = (uniquenessEntry['settings'] !== undefined) ? uniquenessEntry['settings'][variableName] : undefined;
152
+ const resolvedValue = settingValue
153
+ ?? (variableMeta !== undefined ? variableMeta['default'] : undefined)
154
+ ?? variableName;
155
+ const uniquenessKeyDetailEntry = `${variableName}=${resolvedValue}`;
156
+ uniquenessKeyResolvedValues.push(resolvedValue);
157
+ uniquenessKeyDetailEntries.push(uniquenessKeyDetailEntry);
158
+ }
159
+ const uniquenessKeyComposite = [
160
+ targetTypeForUniqueness,
161
+ ...uniquenessKeyResolvedValues,
162
+ ].join('::');
163
+ const uniquenessKeyExisting = globalUniquenessMap.get(uniquenessKeyComposite);
164
+ if (uniquenessKeyExisting !== undefined) {
165
+ skippedWorkflowKeys.add(uniquenessKeyExisting['workflowKey']);
166
+ skippedWorkflowKeys.add(uniquenessWorkflowKey);
167
+ const isSameWorkflow = uniquenessKeyExisting['workflowKey'] === uniquenessWorkflowKey;
168
+ if (uniquenessKeyDetailEntries.length === 0) {
169
+ if (isSameWorkflow === true) {
170
+ uniquenessErrors.push(`Singleton target violation: workflow "${uniquenessWorkflowKey}" declares multiple "${targetTypeForUniqueness}" targets, but only one is allowed.`);
171
+ }
172
+ else {
173
+ uniquenessErrors.push(`Singleton target collision: only one "${targetTypeForUniqueness}" target may be declared across all workflows. Found in workflow "${uniquenessKeyExisting['workflowKey']}" and again in workflow "${uniquenessWorkflowKey}".`);
174
+ }
175
+ }
176
+ else if (isSameWorkflow === true) {
177
+ uniquenessErrors.push(`Destination collision in workflow "${uniquenessWorkflowKey}": multiple "${targetTypeForUniqueness}" targets declare the same destination (${uniquenessKeyDetailEntries.join(', ')}). Each destination must be declared in only one target.`);
178
+ }
179
+ else {
180
+ uniquenessErrors.push(`Cross-workflow destination collision: target "${targetTypeForUniqueness}" with destination (${uniquenessKeyDetailEntries.join(', ')}) is declared in workflow "${uniquenessKeyExisting['workflowKey']}" and again in workflow "${uniquenessWorkflowKey}". Each destination must be declared in only one workflow.`);
181
+ }
182
+ continue;
183
+ }
184
+ const uniquenessKeyMapValue = {
185
+ workflowKey: uniquenessWorkflowKey,
186
+ targetType: targetTypeForUniqueness,
187
+ detailEntries: uniquenessKeyDetailEntries,
188
+ };
189
+ globalUniquenessMap.set(uniquenessKeyComposite, uniquenessKeyMapValue);
190
+ }
191
+ }
192
+ if (uniquenessErrors.length > 0) {
193
+ for (const uniquenessError of uniquenessErrors) {
194
+ Logger.customize({
195
+ name: 'Runner.run',
196
+ purpose: 'validate',
197
+ }).error(uniquenessError);
198
+ }
199
+ }
69
200
  const generatedSet = new Set();
70
201
  const outputFileNames = new Set();
71
202
  const setupLines = [];
72
203
  for (const workflowEntry of workflows) {
73
204
  const entry = workflowEntry;
74
205
  const templateName = entry['template'];
206
+ const workflowSuffix = entry['suffix'];
207
+ const entryWorkflowKey = (workflowSuffix !== undefined) ? `${templateName}-${workflowSuffix}` : templateName;
208
+ if (skippedWorkflowKeys.has(entryWorkflowKey) === true) {
209
+ continue;
210
+ }
75
211
  const metadataEntry = libWorkflowTemplatesMetadata.find((m) => m['name'] === templateName);
76
212
  if (metadataEntry === undefined) {
77
213
  Logger.customize({
78
- name: 'CliGenerateGithubWorkflows.run',
214
+ name: 'Runner.run',
79
215
  purpose: 'validate',
80
216
  }).error(`Unknown template ${chalk.cyan(`"${templateName}"`)}. Skipping.`);
81
217
  continue;
@@ -84,33 +220,15 @@ export class CliGenerateGithubWorkflows {
84
220
  const templateDirExists = await pathExists(templateDirPath);
85
221
  if (templateDirExists !== true) {
86
222
  Logger.customize({
87
- name: 'CliGenerateGithubWorkflows.run',
223
+ name: 'Runner.run',
88
224
  purpose: 'validate',
89
225
  }).error(`Template directory ${chalk.cyan(`"${templateName}"`)} not found. Skipping.`);
90
226
  continue;
91
227
  }
92
- const missingLiterals = [];
93
- for (const variableEntry of Object.entries(metadataEntry['variables'])) {
94
- const variableName = variableEntry[0];
95
- const variableMeta = variableEntry[1];
96
- if (variableMeta['format'] === 'literal') {
97
- if (entry['settings'] === undefined || entry['settings'][variableName] === undefined) {
98
- missingLiterals.push(variableName);
99
- }
100
- }
101
- }
102
- if (missingLiterals.length > 0) {
103
- Logger.customize({
104
- name: 'CliGenerateGithubWorkflows.run',
105
- purpose: 'validate',
106
- }).error(`Template ${chalk.cyan(`"${templateName}"`)} is missing required literal settings: ${missingLiterals.join(', ')}. Skipping.`);
107
- continue;
108
- }
109
- const workflowSuffix = entry['suffix'];
110
228
  const outputFileName = (workflowSuffix !== undefined) ? `nova-${templateName}-${workflowSuffix}.yml` : `nova-${templateName}.yml`;
111
229
  if (outputFileNames.has(outputFileName) === true) {
112
230
  Logger.customize({
113
- name: 'CliGenerateGithubWorkflows.run',
231
+ name: 'Runner.run',
114
232
  purpose: 'validate',
115
233
  }).error(`Duplicate output filename ${chalk.cyan(`"${outputFileName}"`)}. Skipping.`);
116
234
  continue;
@@ -123,7 +241,7 @@ export class CliGenerateGithubWorkflows {
123
241
  }
124
242
  catch {
125
243
  Logger.customize({
126
- name: 'CliGenerateGithubWorkflows.run',
244
+ name: 'Runner.run',
127
245
  purpose: 'read',
128
246
  }).error(`Failed to read base template ${chalk.cyan(`"${templateName}/base.yml"`)}. Skipping.`);
129
247
  continue;
@@ -140,7 +258,7 @@ export class CliGenerateGithubWorkflows {
140
258
  const triggerFileExists = await pathExists(triggerFilePath);
141
259
  if (triggerFileExists !== true) {
142
260
  Logger.customize({
143
- name: 'CliGenerateGithubWorkflows.run',
261
+ name: 'Runner.run',
144
262
  purpose: 'validate',
145
263
  }).error(`Trigger file ${chalk.cyan(`"${triggerFileName}"`)} not found for template ${chalk.cyan(`"${templateName}"`)}. Skipping workflow.`);
146
264
  hasTriggerError = true;
@@ -152,7 +270,7 @@ export class CliGenerateGithubWorkflows {
152
270
  }
153
271
  catch {
154
272
  Logger.customize({
155
- name: 'CliGenerateGithubWorkflows.run',
273
+ name: 'Runner.run',
156
274
  purpose: 'read',
157
275
  }).error(`Failed to read trigger file ${chalk.cyan(`"${triggerFileName}"`)}. Skipping workflow.`);
158
276
  hasTriggerError = true;
@@ -182,7 +300,7 @@ export class CliGenerateGithubWorkflows {
182
300
  const entryLabel = (workflowSuffix !== undefined) ? `${templateName}-${workflowSuffix}` : templateName;
183
301
  if (dependsOnEntries.length === 0) {
184
302
  Logger.customize({
185
- name: 'CliGenerateGithubWorkflows.run',
303
+ name: 'Runner.run',
186
304
  purpose: 'validate',
187
305
  }).error(`Workflow ${chalk.cyan(`"${entryLabel}"`)} uses a trigger that requires depends-on, but no depends-on value is configured. Skipping.`);
188
306
  continue;
@@ -197,7 +315,7 @@ export class CliGenerateGithubWorkflows {
197
315
  });
198
316
  if (dependsOnTarget === undefined) {
199
317
  Logger.customize({
200
- name: 'CliGenerateGithubWorkflows.run',
318
+ name: 'Runner.run',
201
319
  purpose: 'validate',
202
320
  }).error(`Workflow ${chalk.cyan(`"${entryLabel}"`)} depends on ${chalk.cyan(`"${entry2}"`)} which does not exist. Skipping.`);
203
321
  hasDependsOnError = true;
@@ -216,7 +334,7 @@ export class CliGenerateGithubWorkflows {
216
334
  }
217
335
  catch {
218
336
  Logger.customize({
219
- name: 'CliGenerateGithubWorkflows.run',
337
+ name: 'Runner.run',
220
338
  purpose: 'read',
221
339
  }).error(`Failed to resolve depends-on workflow name for ${chalk.cyan(`"${entry2}"`)}. Skipping.`);
222
340
  hasDependsOnError = true;
@@ -250,9 +368,9 @@ export class CliGenerateGithubWorkflows {
250
368
  const indentedTriggerLines = triggerYaml.split('\n').map((line) => (line.trim() === '') ? '' : ` ${line}`);
251
369
  const indentedTriggerYaml = indentedTriggerLines.join('\n').replace(LIB_REGEX_PATTERN_TRAILING_NEWLINES, '');
252
370
  const needsManuallyFallback = metadataEntry['needsManuallyFallback'] ?? true;
253
- const mergedRunName = CliGenerateGithubWorkflows.buildMergedRunName(triggerDataList, needsManuallyFallback);
254
- const mergedPublishCondition = CliGenerateGithubWorkflows.buildMergedPublishCondition(triggerDataList);
255
- const mergedJobsCondition = CliGenerateGithubWorkflows.buildMergedJobsCondition(triggerDataList);
371
+ const mergedRunName = Runner.buildMergedRunName(triggerDataList, needsManuallyFallback);
372
+ const mergedPublishCondition = Runner.buildMergedPublishCondition(triggerDataList);
373
+ const mergedJobsCondition = Runner.buildMergedJobsCondition(triggerDataList);
256
374
  const jobsConditionLine = (mergedJobsCondition !== '') ? ` if: "${mergedJobsCondition}"\n` : '';
257
375
  content = content.replace('[__RUN_NAME__]', mergedRunName);
258
376
  content = content.replace('[__TRIGGERS__]', indentedTriggerYaml);
@@ -265,14 +383,14 @@ export class CliGenerateGithubWorkflows {
265
383
  let hasPublishValidationError = false;
266
384
  if (supportsTargets !== true && entryTargets.length > 0) {
267
385
  Logger.customize({
268
- name: 'CliGenerateGithubWorkflows.run',
386
+ name: 'Runner.run',
269
387
  purpose: 'validate',
270
388
  }).error(`Template ${chalk.cyan(`"${templateName}"`)} does not support targets but the workflow entry declares targets. Skipping.`);
271
389
  hasPublishValidationError = true;
272
390
  }
273
391
  if (supportsScopes !== true && entryScopes.length > 0) {
274
392
  Logger.customize({
275
- name: 'CliGenerateGithubWorkflows.run',
393
+ name: 'Runner.run',
276
394
  purpose: 'validate',
277
395
  }).error(`Template ${chalk.cyan(`"${templateName}"`)} does not support scopes but the workflow entry declares scopes. Skipping.`);
278
396
  hasPublishValidationError = true;
@@ -289,7 +407,7 @@ export class CliGenerateGithubWorkflows {
289
407
  const targetWorkingDir = entryTarget['workingDir'];
290
408
  if (targetsMetadata[targetType] === undefined) {
291
409
  Logger.customize({
292
- name: 'CliGenerateGithubWorkflows.run',
410
+ name: 'Runner.run',
293
411
  purpose: 'validate',
294
412
  }).error(`Target type ${chalk.cyan(`"${targetType}"`)} is not supported by template ${chalk.cyan(`"${templateName}"`)}. Skipping.`);
295
413
  hasPublishValidationError = true;
@@ -298,7 +416,7 @@ export class CliGenerateGithubWorkflows {
298
416
  const targetTupleKey = `${targetType}::${targetWorkingDir}`;
299
417
  if (targetTupleSet.has(targetTupleKey) === true) {
300
418
  Logger.customize({
301
- name: 'CliGenerateGithubWorkflows.run',
419
+ name: 'Runner.run',
302
420
  purpose: 'validate',
303
421
  }).error(`Duplicate target ${chalk.cyan(`"${targetType}"`)} at ${chalk.cyan(`"${targetWorkingDir}"`)}. Each target type and working directory pair must be unique. Skipping.`);
304
422
  hasPublishValidationError = true;
@@ -307,7 +425,7 @@ export class CliGenerateGithubWorkflows {
307
425
  targetTupleSet.add(targetTupleKey);
308
426
  if (configWorkspaces[targetWorkingDir] === undefined) {
309
427
  Logger.customize({
310
- name: 'CliGenerateGithubWorkflows.run',
428
+ name: 'Runner.run',
311
429
  purpose: 'validate',
312
430
  }).error(`Target working directory ${chalk.cyan(`"${targetWorkingDir}"`)} is not a registered workspace. Skipping.`);
313
431
  hasPublishValidationError = true;
@@ -322,10 +440,10 @@ export class CliGenerateGithubWorkflows {
322
440
  if (supportsScopes === true && entryScopes.length > 0) {
323
441
  for (const entryScope of entryScopes) {
324
442
  const scopePath = entryScope;
325
- const resolvedWorkspaceName = CliGenerateGithubWorkflows.resolveWorkspaceName(configWorkspaces, scopePath);
443
+ const resolvedWorkspaceName = Runner.resolveWorkspaceName(configWorkspaces, scopePath);
326
444
  if (resolvedWorkspaceName === undefined) {
327
445
  Logger.customize({
328
- name: 'CliGenerateGithubWorkflows.run',
446
+ name: 'Runner.run',
329
447
  purpose: 'validate',
330
448
  }).error(`Scope ${chalk.cyan(`"${scopePath}"`)} is not a registered workspace. Skipping.`);
331
449
  hasPublishValidationError = true;
@@ -339,39 +457,26 @@ export class CliGenerateGithubWorkflows {
339
457
  continue;
340
458
  }
341
459
  if (supportsTargets === true) {
342
- const useTurbo = await CliGenerateGithubWorkflows.detectTurbo(currentDirectory);
343
- const checkCommand = CliGenerateGithubWorkflows.buildCommand('check', resolvedWorkspaceNames, useTurbo);
344
- const buildCommand = CliGenerateGithubWorkflows.buildCommand('build', resolvedWorkspaceNames, useTurbo);
460
+ const useTurbo = await Runner.detectTurbo(currentDirectory);
461
+ const checkCommand = Runner.buildCommand('check', resolvedWorkspaceNames, useTurbo);
462
+ const buildCommand = Runner.buildCommand('build', resolvedWorkspaceNames, useTurbo);
345
463
  content = content.replace('[__CHECK_COMMAND__]', checkCommand);
346
464
  content = content.replace('[__BUILD_COMMAND__]', buildCommand);
347
- const artifactPathsBlock = CliGenerateGithubWorkflows.renderArtifactPaths(entryTargets, targetsMetadata);
348
- let uploadArtifactStep = '';
349
- if (artifactPathsBlock !== '') {
350
- const uploadArtifactStepLines = [
351
- ' - name: "Upload build artifacts"',
352
- ' uses: "actions/upload-artifact@v4"',
353
- ' with:',
354
- ' name: "build-output"',
355
- ' retention-days: 1',
356
- ' path: |',
357
- artifactPathsBlock,
358
- ];
359
- uploadArtifactStep = uploadArtifactStepLines.join('\n');
360
- }
465
+ const uploadArtifactStep = Runner.renderUploadArtifactSteps(entryTargets, targetsMetadata);
361
466
  content = content.replace('[__UPLOAD_ARTIFACT_STEP__]', uploadArtifactStep);
362
467
  const resolvedTargetFragments = [];
363
468
  let hasTargetFragmentError = false;
364
469
  for (const entryTarget of entryTargets) {
365
470
  const currentEntryTarget = entryTarget;
366
- const targetType = currentEntryTarget['type'];
367
- const targetWorkingDir = currentEntryTarget['workingDir'];
368
- const targetFragmentPath = join(templateDirPath, 'targets', `${targetType}.yml`);
471
+ const fragmentTargetType = currentEntryTarget['type'];
472
+ const fragmentTargetWorkingDir = currentEntryTarget['workingDir'];
473
+ const targetFragmentPath = join(templateDirPath, 'targets', `${fragmentTargetType}.yml`);
369
474
  const targetFragmentExists = await pathExists(targetFragmentPath);
370
475
  if (targetFragmentExists !== true) {
371
476
  Logger.customize({
372
- name: 'CliGenerateGithubWorkflows.run',
477
+ name: 'Runner.run',
373
478
  purpose: 'validate',
374
- }).error(`Target fragment ${chalk.cyan(`"${targetType}.yml"`)} not found for template ${chalk.cyan(`"${templateName}"`)}. Skipping.`);
479
+ }).error(`Target fragment ${chalk.cyan(`"${fragmentTargetType}.yml"`)} not found for template ${chalk.cyan(`"${templateName}"`)}. Skipping.`);
375
480
  hasTargetFragmentError = true;
376
481
  break;
377
482
  }
@@ -381,36 +486,38 @@ export class CliGenerateGithubWorkflows {
381
486
  }
382
487
  catch {
383
488
  Logger.customize({
384
- name: 'CliGenerateGithubWorkflows.run',
489
+ name: 'Runner.run',
385
490
  purpose: 'read',
386
- }).error(`Failed to read target fragment ${chalk.cyan(`"${targetType}.yml"`)}. Skipping.`);
491
+ }).error(`Failed to read target fragment ${chalk.cyan(`"${fragmentTargetType}.yml"`)}. Skipping.`);
387
492
  hasTargetFragmentError = true;
388
493
  break;
389
494
  }
390
- const targetId = CliGenerateGithubWorkflows.slugifyWorkingDir(targetWorkingDir);
495
+ const targetId = Runner.slugifyWorkingDir(fragmentTargetWorkingDir);
391
496
  let targetFragmentResolvedContent = targetFragmentRawContent;
392
497
  targetFragmentResolvedContent = targetFragmentResolvedContent.replaceAll('[__TARGET_ID__]', targetId);
393
- targetFragmentResolvedContent = targetFragmentResolvedContent.replaceAll('[__WORKING_DIR__]', targetWorkingDir);
498
+ targetFragmentResolvedContent = targetFragmentResolvedContent.replaceAll('[__WORKING_DIR__]', fragmentTargetWorkingDir);
499
+ const artifactName = Runner.buildArtifactName(fragmentTargetType, targetId);
500
+ targetFragmentResolvedContent = targetFragmentResolvedContent.replaceAll('[__ARTIFACT_NAME__]', artifactName);
394
501
  const targetNeeds = currentEntryTarget['needs'] ?? [];
395
- const targetNeedsJobIds = targetNeeds.map((targetNeedWorkingDir) => `publish-${targetType}-${CliGenerateGithubWorkflows.slugifyWorkingDir(targetNeedWorkingDir)}`);
502
+ const targetNeedsJobIds = targetNeeds.map((targetNeedWorkingDir) => `publish-${fragmentTargetType}-${Runner.slugifyWorkingDir(targetNeedWorkingDir)}`);
396
503
  const targetNeedsValue = (targetNeedsJobIds.length === 0) ? '"build"' : `["build", ${targetNeedsJobIds.map((targetNeedsJobId) => `"${targetNeedsJobId}"`).join(', ')}]`;
397
504
  targetFragmentResolvedContent = targetFragmentResolvedContent.replace('[__NEEDS__]', targetNeedsValue);
398
505
  const targetJobsConditionLine = (mergedJobsCondition !== '') ? ` if: "${mergedJobsCondition}"\n` : '';
399
506
  targetFragmentResolvedContent = targetFragmentResolvedContent.replace('[__JOBS_CONDITION__]\n', targetJobsConditionLine);
400
- const targetMetadata = targetsMetadata[targetType];
507
+ const targetMetadata = targetsMetadata[fragmentTargetType];
401
508
  const mergedVariables = {
402
509
  ...metadataEntry['variables'],
403
510
  ...(targetMetadata !== undefined) ? targetMetadata['variables'] : {},
404
511
  };
405
- targetFragmentResolvedContent = CliGenerateGithubWorkflows.substituteVariables(targetFragmentResolvedContent, mergedVariables, entry['settings']);
512
+ targetFragmentResolvedContent = Runner.substituteVariables(targetFragmentResolvedContent, mergedVariables, entry['settings']);
406
513
  try {
407
514
  parseYaml(targetFragmentResolvedContent);
408
515
  }
409
516
  catch {
410
517
  Logger.customize({
411
- name: 'CliGenerateGithubWorkflows.run',
518
+ name: 'Runner.run',
412
519
  purpose: 'validate',
413
- }).error(`Target fragment ${chalk.cyan(`"${targetType}.yml"`)} produced invalid YAML. Skipping.`);
520
+ }).error(`Target fragment ${chalk.cyan(`"${fragmentTargetType}.yml"`)} produced invalid YAML. Skipping.`);
414
521
  hasTargetFragmentError = true;
415
522
  break;
416
523
  }
@@ -433,7 +540,7 @@ export class CliGenerateGithubWorkflows {
433
540
  }
434
541
  catch {
435
542
  Logger.customize({
436
- name: 'CliGenerateGithubWorkflows.run',
543
+ name: 'Runner.run',
437
544
  purpose: 'validate',
438
545
  }).error(`Base template for ${chalk.cyan(`"${templateName}"`)} produced invalid YAML after target injection. Skipping.`);
439
546
  continue;
@@ -442,30 +549,34 @@ export class CliGenerateGithubWorkflows {
442
549
  }
443
550
  }
444
551
  content = content.replaceAll('[__WORKFLOW_ID__]', (workflowSuffix !== undefined) ? ` (${workflowSuffix})` : '');
445
- const substituted = CliGenerateGithubWorkflows.substituteVariables(content, metadataEntry['variables'], entry['settings']);
552
+ const substituted = Runner.substituteVariables(content, metadataEntry['variables'], entry['settings']);
446
553
  try {
447
554
  parseYaml(substituted);
448
555
  }
449
556
  catch {
450
557
  Logger.customize({
451
- name: 'CliGenerateGithubWorkflows.run',
558
+ name: 'Runner.run',
452
559
  purpose: 'validate',
453
560
  }).error(`Generated YAML for ${chalk.cyan(`"${outputFileName}"`)} is invalid. Skipping.`);
454
561
  continue;
455
562
  }
456
563
  generatedSet.add(outputFileName);
457
- const entrySetupLines = CliGenerateGithubWorkflows.buildEntrySetupLines(entry, metadataEntry, outputFileName);
564
+ const entrySetupLines = Runner.buildEntrySetupLines(entry, metadataEntry, outputFileName);
458
565
  setupLines.push(...entrySetupLines);
459
566
  if (isDryRun === true) {
460
567
  const displayPath = `.github/workflows/${outputFileName}`;
461
568
  Logger.customize({
462
- name: 'CliGenerateGithubWorkflows.run',
569
+ name: 'Runner.run',
463
570
  purpose: 'dry-run',
464
571
  }).info(`Would generate ${chalk.cyan(`"${displayPath}"`)}.`);
465
572
  continue;
466
573
  }
467
574
  const targetPath = join(workflowsDirectory, outputFileName);
468
- await saveGeneratedFile(targetPath, substituted, isReplaceFile);
575
+ await saveGeneratedFile(targetPath, substituted, isReplaceFile, {
576
+ command: 'nova generate github workflows',
577
+ docsSlug: 'cli/generators/github/workflows',
578
+ mode: 'strict',
579
+ });
469
580
  }
470
581
  if (isDryRun !== true && await pathExists(workflowsDirectory) === true) {
471
582
  let existingEntries = [];
@@ -475,31 +586,31 @@ export class CliGenerateGithubWorkflows {
475
586
  catch {
476
587
  }
477
588
  for (const existingEntry of existingEntries) {
478
- const entry = existingEntry;
479
- if (entry.isFile() !== true) {
589
+ const existingDirent = existingEntry;
590
+ if (existingDirent.isFile() !== true) {
480
591
  continue;
481
592
  }
482
- const isOrphan = entry.name.startsWith('nova-') === true
483
- && entry.name.endsWith('.yml') === true
484
- && generatedSet.has(entry.name) === false;
485
- const isBackup = entry.name.includes('.nova-backup.') === true;
593
+ const isOrphan = existingDirent.name.startsWith('nova-') === true
594
+ && existingDirent.name.endsWith('.yml') === true
595
+ && generatedSet.has(existingDirent.name) === false;
596
+ const isBackup = existingDirent.name.includes('.nova-backup.') === true;
486
597
  if (isOrphan !== true || isBackup === true) {
487
598
  continue;
488
599
  }
489
- const orphanPath = join(workflowsDirectory, entry.name);
600
+ const orphanPath = join(workflowsDirectory, existingDirent.name);
490
601
  if (isReplaceFile === true) {
491
602
  await fs.unlink(orphanPath);
492
603
  Logger.customize({
493
- name: 'CliGenerateGithubWorkflows.run',
604
+ name: 'Runner.run',
494
605
  purpose: 'cleanup',
495
- }).info(`Deleted orphan ${chalk.cyan(`"${entry.name}"`)}.`);
606
+ }).info(`Deleted orphan ${chalk.cyan(`"${existingDirent.name}"`)}.`);
496
607
  }
497
608
  else {
498
609
  await renameFileWithDate(orphanPath);
499
610
  Logger.customize({
500
- name: 'CliGenerateGithubWorkflows.run',
611
+ name: 'Runner.run',
501
612
  purpose: 'cleanup',
502
- }).info(`Backed up orphan ${chalk.cyan(`"${entry.name}"`)}.`);
613
+ }).info(`Backed up orphan ${chalk.cyan(`"${existingDirent.name}"`)}.`);
503
614
  }
504
615
  }
505
616
  }
@@ -509,7 +620,7 @@ export class CliGenerateGithubWorkflows {
509
620
  setupLines.join('\n'),
510
621
  ].join('\n');
511
622
  Logger.customize({
512
- name: 'CliGenerateGithubWorkflows.run',
623
+ name: 'Runner.run',
513
624
  purpose: 'setup',
514
625
  padTop: 1,
515
626
  }).info(setupMessage);
@@ -617,12 +728,12 @@ export class CliGenerateGithubWorkflows {
617
728
  continue;
618
729
  }
619
730
  if (variableMeta['format'] === 'secret') {
620
- const resolvedName = (entry['settings'] !== undefined && entry['settings'][variableName] !== undefined) ? entry['settings'][variableName] : (variableMeta['default'] ?? variableName);
621
- lines.push(` - ${chalk.cyan(outputFileName)}: Secret ${chalk.yellow(resolvedName)}`);
731
+ const secretResolvedName = (entry['settings'] !== undefined && entry['settings'][variableName] !== undefined) ? entry['settings'][variableName] : (variableMeta['default'] ?? variableName);
732
+ lines.push(` - ${chalk.cyan(outputFileName)}: Secret ${chalk.yellow(secretResolvedName)}`);
622
733
  }
623
734
  if (variableMeta['format'] === 'var') {
624
- const resolvedName = (entry['settings'] !== undefined && entry['settings'][variableName] !== undefined) ? entry['settings'][variableName] : (variableMeta['default'] ?? variableName);
625
- lines.push(` - ${chalk.cyan(outputFileName)}: Variable ${chalk.yellow(resolvedName)}`);
735
+ const varResolvedName = (entry['settings'] !== undefined && entry['settings'][variableName] !== undefined) ? entry['settings'][variableName] : (variableMeta['default'] ?? variableName);
736
+ lines.push(` - ${chalk.cyan(outputFileName)}: Variable ${chalk.yellow(varResolvedName)}`);
626
737
  }
627
738
  }
628
739
  if (entry['targets'] !== undefined && metadataEntry['targets'] !== undefined) {
@@ -640,12 +751,12 @@ export class CliGenerateGithubWorkflows {
640
751
  continue;
641
752
  }
642
753
  if (targetVariableMeta['format'] === 'secret') {
643
- const targetResolvedName = (entry['settings'] !== undefined && entry['settings'][targetVariableName] !== undefined) ? entry['settings'][targetVariableName] : (targetVariableMeta['default'] ?? targetVariableName);
644
- lines.push(` - ${chalk.cyan(outputFileName)}: Secret ${chalk.yellow(targetResolvedName)}`);
754
+ const targetSecretResolvedName = (entry['settings'] !== undefined && entry['settings'][targetVariableName] !== undefined) ? entry['settings'][targetVariableName] : (targetVariableMeta['default'] ?? targetVariableName);
755
+ lines.push(` - ${chalk.cyan(outputFileName)}: Secret ${chalk.yellow(targetSecretResolvedName)}`);
645
756
  }
646
757
  if (targetVariableMeta['format'] === 'var') {
647
- const targetResolvedName = (entry['settings'] !== undefined && entry['settings'][targetVariableName] !== undefined) ? entry['settings'][targetVariableName] : (targetVariableMeta['default'] ?? targetVariableName);
648
- lines.push(` - ${chalk.cyan(outputFileName)}: Variable ${chalk.yellow(targetResolvedName)}`);
758
+ const targetVarResolvedName = (entry['settings'] !== undefined && entry['settings'][targetVariableName] !== undefined) ? entry['settings'][targetVariableName] : (targetVariableMeta['default'] ?? targetVariableName);
759
+ lines.push(` - ${chalk.cyan(outputFileName)}: Variable ${chalk.yellow(targetVarResolvedName)}`);
649
760
  }
650
761
  }
651
762
  }
@@ -660,26 +771,29 @@ export class CliGenerateGithubWorkflows {
660
771
  const regex = new RegExp(`\\$\\{\\{\\s*(?:secrets|vars)\\.${variableName}\\s*\\}\\}`, 'g');
661
772
  const settingValue = (settings !== undefined && settings[variableName] !== undefined) ? settings[variableName] : undefined;
662
773
  if (variableMeta['format'] === 'secret') {
663
- const resolvedName = settingValue
774
+ const secretResolvedName = settingValue
664
775
  ?? variableMeta['default']
665
776
  ?? variableName;
666
- const replacement = `\${{ secrets.${resolvedName} }}`;
667
- result = result.replace(regex, replacement);
777
+ const secretReplacement = `\${{ secrets.${secretResolvedName} }}`;
778
+ result = result.replace(regex, secretReplacement);
668
779
  }
669
780
  if (variableMeta['format'] === 'var') {
670
- const resolvedName = settingValue
781
+ const varResolvedName = settingValue
671
782
  ?? variableMeta['default']
672
783
  ?? variableName;
673
- const replacement = `\${{ vars.${resolvedName} }}`;
674
- result = result.replace(regex, replacement);
784
+ const varReplacement = `\${{ vars.${varResolvedName} }}`;
785
+ result = result.replace(regex, varReplacement);
675
786
  }
676
787
  if (variableMeta['format'] === 'literal') {
677
- const replacement = (settingValue ?? '').replaceAll('\n', '\\n');
678
- result = result.replace(regex, replacement);
788
+ const literalReplacement = (settingValue ?? '').replaceAll('\n', '\\n');
789
+ result = result.replace(regex, () => literalReplacement);
679
790
  }
680
791
  }
681
792
  return result;
682
793
  }
794
+ static buildArtifactName(targetType, targetId) {
795
+ return `build-${targetType}-${targetId}`;
796
+ }
683
797
  static slugifyWorkingDir(input) {
684
798
  const trimmed = input
685
799
  .replace(LIB_REGEX_PATTERN_LEADING_DOT_SLASH, '')
@@ -702,35 +816,41 @@ export class CliGenerateGithubWorkflows {
702
816
  }
703
817
  static buildCommand(scriptName, workspaceNames, useTurbo) {
704
818
  if (useTurbo === true) {
705
- const flags = workspaceNames.map((name) => `--filter=${name}`);
706
- return `npx turbo run ${scriptName} ${flags.join(' ')} --concurrency=2`;
819
+ const turboFlags = workspaceNames.map((name) => `--filter=${name}`);
820
+ return `npx turbo run ${scriptName} ${turboFlags.join(' ')} --concurrency=2`;
707
821
  }
708
- const flags = workspaceNames.map((name) => `-w ${name}`);
709
- return `npm run ${scriptName} ${flags.join(' ')}`;
822
+ const npmFlags = workspaceNames.map((name) => `-w ${name}`);
823
+ return `npm run ${scriptName} ${npmFlags.join(' ')}`;
710
824
  }
711
- static renderArtifactPaths(targets, targetsMetadata) {
712
- const seen = new Set();
713
- const paths = [];
825
+ static renderUploadArtifactSteps(targets, targetsMetadata) {
826
+ const steps = [];
714
827
  for (const target of targets) {
715
- const targetEntry = target;
716
- const metadata = targetsMetadata[targetEntry['type']];
828
+ const metadata = targetsMetadata[target['type']];
717
829
  if (metadata === undefined) {
718
830
  continue;
719
831
  }
720
- const strippedDir = targetEntry['workingDir'].replace(LIB_REGEX_PATTERN_LEADING_DOT_SLASH, '');
721
- for (const template of metadata['artifactPaths']) {
722
- const resolved = template.replaceAll('{workingDir}', strippedDir);
723
- if (seen.has(resolved) === false) {
724
- seen.add(resolved);
725
- paths.push(resolved);
726
- }
832
+ if (metadata['artifactPaths'].length === 0) {
833
+ continue;
727
834
  }
835
+ const strippedDir = target['workingDir'].replace(LIB_REGEX_PATTERN_LEADING_DOT_SLASH, '');
836
+ const targetId = Runner.slugifyWorkingDir(target['workingDir']);
837
+ const artifactName = Runner.buildArtifactName(target['type'], targetId);
838
+ const pathLines = metadata['artifactPaths'].map((template) => ` ${template.replaceAll('{workingDir}', strippedDir)}`);
839
+ const stepLines = [
840
+ ` - name: "Upload build artifacts (${target['type']}/${targetId})"`,
841
+ ' uses: "actions/upload-artifact@v7"',
842
+ ' with:',
843
+ ` name: "${artifactName}"`,
844
+ ' retention-days: 1',
845
+ ' path: |',
846
+ ...pathLines,
847
+ ];
848
+ steps.push(stepLines.join('\n'));
728
849
  }
729
- if (paths.length === 0) {
850
+ if (steps.length === 0) {
730
851
  return '';
731
852
  }
732
- const lines = paths.map((path) => ` ${path}`);
733
- return lines.join('\n');
853
+ return steps.join('\n\n');
734
854
  }
735
855
  }
736
856
  //# sourceMappingURL=workflows.js.map