@cbnventures/nova 0.17.0 → 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 (643) hide show
  1. package/LICENSE +22 -0
  2. package/build/package.json +1 -1
  3. package/build/src/api/node-releases.d.ts +4 -4
  4. package/build/src/api/node-releases.d.ts.map +1 -1
  5. package/build/src/api/node-releases.js +14 -14
  6. package/build/src/api/node-releases.js.map +1 -1
  7. package/build/src/api/spdx-licenses.d.ts +4 -4
  8. package/build/src/api/spdx-licenses.d.ts.map +1 -1
  9. package/build/src/api/spdx-licenses.js +12 -12
  10. package/build/src/api/spdx-licenses.js.map +1 -1
  11. package/build/src/cli/generate/github/funding.d.ts +3 -3
  12. package/build/src/cli/generate/github/funding.d.ts.map +1 -1
  13. package/build/src/cli/generate/github/funding.js +5 -5
  14. package/build/src/cli/generate/github/funding.js.map +1 -1
  15. package/build/src/cli/generate/github/issue-template.d.ts +3 -3
  16. package/build/src/cli/generate/github/issue-template.d.ts.map +1 -1
  17. package/build/src/cli/generate/github/issue-template.js +14 -12
  18. package/build/src/cli/generate/github/issue-template.js.map +1 -1
  19. package/build/src/cli/generate/github/workflows.d.ts +10 -10
  20. package/build/src/cli/generate/github/workflows.d.ts.map +1 -1
  21. package/build/src/cli/generate/github/workflows.js +222 -104
  22. package/build/src/cli/generate/github/workflows.js.map +1 -1
  23. package/build/src/cli/generate/must-haves/agent-conventions.d.ts +3 -3
  24. package/build/src/cli/generate/must-haves/agent-conventions.d.ts.map +1 -1
  25. package/build/src/cli/generate/must-haves/agent-conventions.js +11 -11
  26. package/build/src/cli/generate/must-haves/agent-conventions.js.map +1 -1
  27. package/build/src/cli/generate/must-haves/dotenv.d.ts +3 -3
  28. package/build/src/cli/generate/must-haves/dotenv.d.ts.map +1 -1
  29. package/build/src/cli/generate/must-haves/dotenv.js +69 -69
  30. package/build/src/cli/generate/must-haves/dotenv.js.map +1 -1
  31. package/build/src/cli/generate/must-haves/editorconfig.d.ts +3 -3
  32. package/build/src/cli/generate/must-haves/editorconfig.d.ts.map +1 -1
  33. package/build/src/cli/generate/must-haves/editorconfig.js +3 -3
  34. package/build/src/cli/generate/must-haves/editorconfig.js.map +1 -1
  35. package/build/src/cli/generate/must-haves/gitignore.d.ts +3 -3
  36. package/build/src/cli/generate/must-haves/gitignore.d.ts.map +1 -1
  37. package/build/src/cli/generate/must-haves/gitignore.js +69 -67
  38. package/build/src/cli/generate/must-haves/gitignore.js.map +1 -1
  39. package/build/src/cli/generate/must-haves/license.d.ts +3 -3
  40. package/build/src/cli/generate/must-haves/license.d.ts.map +1 -1
  41. package/build/src/cli/generate/must-haves/license.js +11 -7
  42. package/build/src/cli/generate/must-haves/license.js.map +1 -1
  43. package/build/src/cli/generate/must-haves/read-me.d.ts +3 -3
  44. package/build/src/cli/generate/must-haves/read-me.d.ts.map +1 -1
  45. package/build/src/cli/generate/must-haves/read-me.js +20 -27
  46. package/build/src/cli/generate/must-haves/read-me.js.map +1 -1
  47. package/build/src/cli/index.js +81 -34
  48. package/build/src/cli/index.js.map +1 -1
  49. package/build/src/cli/recipe/github/handle-gh-failure.d.ts +3 -0
  50. package/build/src/cli/recipe/github/handle-gh-failure.d.ts.map +1 -0
  51. package/build/src/cli/recipe/github/handle-gh-failure.js +22 -0
  52. package/build/src/cli/recipe/github/handle-gh-failure.js.map +1 -0
  53. package/build/src/cli/recipe/github/sync-features.d.ts +5 -0
  54. package/build/src/cli/recipe/github/sync-features.d.ts.map +1 -0
  55. package/build/src/cli/recipe/github/sync-features.js +145 -0
  56. package/build/src/cli/recipe/github/sync-features.js.map +1 -0
  57. package/build/src/cli/recipe/github/sync-identity.d.ts +6 -0
  58. package/build/src/cli/recipe/github/sync-identity.d.ts.map +1 -0
  59. package/build/src/cli/recipe/github/sync-identity.js +191 -0
  60. package/build/src/cli/recipe/github/sync-identity.js.map +1 -0
  61. package/build/src/cli/recipe/github/sync-policies.d.ts +5 -0
  62. package/build/src/cli/recipe/github/sync-policies.d.ts.map +1 -0
  63. package/build/src/cli/recipe/github/sync-policies.js +154 -0
  64. package/build/src/cli/recipe/github/sync-policies.js.map +1 -0
  65. package/build/src/cli/recipe/index.d.ts +2 -2
  66. package/build/src/cli/recipe/index.d.ts.map +1 -1
  67. package/build/src/cli/recipe/index.js +66 -56
  68. package/build/src/cli/recipe/index.js.map +1 -1
  69. package/build/src/cli/recipe/package-json/cleanup.d.ts +3 -3
  70. package/build/src/cli/recipe/package-json/cleanup.d.ts.map +1 -1
  71. package/build/src/cli/recipe/package-json/cleanup.js +25 -24
  72. package/build/src/cli/recipe/package-json/cleanup.js.map +1 -1
  73. package/build/src/cli/recipe/package-json/normalize-artifacts.d.ts +3 -3
  74. package/build/src/cli/recipe/package-json/normalize-artifacts.d.ts.map +1 -1
  75. package/build/src/cli/recipe/package-json/normalize-artifacts.js +35 -35
  76. package/build/src/cli/recipe/package-json/normalize-artifacts.js.map +1 -1
  77. package/build/src/cli/recipe/package-json/normalize-bundler.d.ts +3 -3
  78. package/build/src/cli/recipe/package-json/normalize-bundler.d.ts.map +1 -1
  79. package/build/src/cli/recipe/package-json/normalize-bundler.js +22 -22
  80. package/build/src/cli/recipe/package-json/normalize-bundler.js.map +1 -1
  81. package/build/src/cli/recipe/package-json/normalize-dependencies.d.ts +3 -3
  82. package/build/src/cli/recipe/package-json/normalize-dependencies.d.ts.map +1 -1
  83. package/build/src/cli/recipe/package-json/normalize-dependencies.js +37 -37
  84. package/build/src/cli/recipe/package-json/normalize-dependencies.js.map +1 -1
  85. package/build/src/cli/recipe/package-json/normalize-modules.d.ts +3 -3
  86. package/build/src/cli/recipe/package-json/normalize-modules.d.ts.map +1 -1
  87. package/build/src/cli/recipe/package-json/normalize-modules.js +47 -47
  88. package/build/src/cli/recipe/package-json/normalize-modules.js.map +1 -1
  89. package/build/src/cli/recipe/package-json/normalize-tooling.d.ts +3 -3
  90. package/build/src/cli/recipe/package-json/normalize-tooling.d.ts.map +1 -1
  91. package/build/src/cli/recipe/package-json/normalize-tooling.js +23 -23
  92. package/build/src/cli/recipe/package-json/normalize-tooling.js.map +1 -1
  93. package/build/src/cli/recipe/package-json/sync-environment.d.ts +3 -3
  94. package/build/src/cli/recipe/package-json/sync-environment.d.ts.map +1 -1
  95. package/build/src/cli/recipe/package-json/sync-environment.js +37 -37
  96. package/build/src/cli/recipe/package-json/sync-environment.js.map +1 -1
  97. package/build/src/cli/recipe/package-json/sync-identity.d.ts +3 -3
  98. package/build/src/cli/recipe/package-json/sync-identity.d.ts.map +1 -1
  99. package/build/src/cli/recipe/package-json/sync-identity.js +20 -20
  100. package/build/src/cli/recipe/package-json/sync-identity.js.map +1 -1
  101. package/build/src/cli/recipe/package-json/sync-ownership.d.ts +3 -3
  102. package/build/src/cli/recipe/package-json/sync-ownership.d.ts.map +1 -1
  103. package/build/src/cli/recipe/package-json/sync-ownership.js +28 -28
  104. package/build/src/cli/recipe/package-json/sync-ownership.js.map +1 -1
  105. package/build/src/cli/scaffold/app/expressjs.d.ts +3 -3
  106. package/build/src/cli/scaffold/app/expressjs.d.ts.map +1 -1
  107. package/build/src/cli/scaffold/app/expressjs.js +1 -1
  108. package/build/src/cli/scaffold/app/expressjs.js.map +1 -1
  109. package/build/src/cli/scaffold/app/nextjs.d.ts +3 -3
  110. package/build/src/cli/scaffold/app/nextjs.d.ts.map +1 -1
  111. package/build/src/cli/scaffold/app/nextjs.js +1 -1
  112. package/build/src/cli/scaffold/app/nextjs.js.map +1 -1
  113. package/build/src/cli/scaffold/app/vite.d.ts +3 -3
  114. package/build/src/cli/scaffold/app/vite.d.ts.map +1 -1
  115. package/build/src/cli/scaffold/app/vite.js +1 -1
  116. package/build/src/cli/scaffold/app/vite.js.map +1 -1
  117. package/build/src/cli/scaffold/app/workers.d.ts +3 -3
  118. package/build/src/cli/scaffold/app/workers.d.ts.map +1 -1
  119. package/build/src/cli/scaffold/app/workers.js +1 -1
  120. package/build/src/cli/scaffold/app/workers.js.map +1 -1
  121. package/build/src/cli/scaffold/docs/docusaurus.d.ts +3 -3
  122. package/build/src/cli/scaffold/docs/docusaurus.d.ts.map +1 -1
  123. package/build/src/cli/scaffold/docs/docusaurus.js +1 -1
  124. package/build/src/cli/scaffold/docs/docusaurus.js.map +1 -1
  125. package/build/src/cli/scaffold/starter/base.d.ts +3 -3
  126. package/build/src/cli/scaffold/starter/base.d.ts.map +1 -1
  127. package/build/src/cli/scaffold/starter/base.js +7 -7
  128. package/build/src/cli/scaffold/starter/base.js.map +1 -1
  129. package/build/src/cli/utility/changelog.d.ts +4 -3
  130. package/build/src/cli/utility/changelog.d.ts.map +1 -1
  131. package/build/src/cli/utility/changelog.js +84 -83
  132. package/build/src/cli/utility/changelog.js.map +1 -1
  133. package/build/src/cli/utility/initialize.d.ts +5 -3
  134. package/build/src/cli/utility/initialize.d.ts.map +1 -1
  135. package/build/src/cli/utility/initialize.js +805 -244
  136. package/build/src/cli/utility/initialize.js.map +1 -1
  137. package/build/src/cli/utility/run-recipes.d.ts +3 -3
  138. package/build/src/cli/utility/run-recipes.d.ts.map +1 -1
  139. package/build/src/cli/utility/run-recipes.js +43 -12
  140. package/build/src/cli/utility/run-recipes.js.map +1 -1
  141. package/build/src/cli/utility/run-scripts.d.ts +3 -3
  142. package/build/src/cli/utility/run-scripts.d.ts.map +1 -1
  143. package/build/src/cli/utility/run-scripts.js +9 -8
  144. package/build/src/cli/utility/run-scripts.js.map +1 -1
  145. package/build/src/cli/utility/transpile.d.ts +3 -3
  146. package/build/src/cli/utility/transpile.d.ts.map +1 -1
  147. package/build/src/cli/utility/transpile.js +4 -4
  148. package/build/src/cli/utility/transpile.js.map +1 -1
  149. package/build/src/cli/utility/type-check.d.ts +3 -3
  150. package/build/src/cli/utility/type-check.d.ts.map +1 -1
  151. package/build/src/cli/utility/type-check.js +4 -4
  152. package/build/src/cli/utility/type-check.js.map +1 -1
  153. package/build/src/cli/utility/version.d.ts +3 -3
  154. package/build/src/cli/utility/version.d.ts.map +1 -1
  155. package/build/src/cli/utility/version.js +102 -102
  156. package/build/src/cli/utility/version.js.map +1 -1
  157. package/build/src/lib/constants.d.ts +3 -2
  158. package/build/src/lib/constants.d.ts.map +1 -1
  159. package/build/src/lib/constants.js +1 -0
  160. package/build/src/lib/constants.js.map +1 -1
  161. package/build/src/lib/item.d.ts +32 -31
  162. package/build/src/lib/item.d.ts.map +1 -1
  163. package/build/src/lib/item.js +3 -1
  164. package/build/src/lib/item.js.map +1 -1
  165. package/build/src/lib/nova-config.d.ts +11 -5
  166. package/build/src/lib/nova-config.d.ts.map +1 -1
  167. package/build/src/lib/nova-config.js +143 -8
  168. package/build/src/lib/nova-config.js.map +1 -1
  169. package/build/src/lib/regex.d.ts +15 -1
  170. package/build/src/lib/regex.d.ts.map +1 -1
  171. package/build/src/lib/regex.js +15 -1
  172. package/build/src/lib/regex.js.map +1 -1
  173. package/build/src/lib/scaffold.d.ts +9 -9
  174. package/build/src/lib/scaffold.d.ts.map +1 -1
  175. package/build/src/lib/scaffold.js +45 -44
  176. package/build/src/lib/scaffold.js.map +1 -1
  177. package/build/src/lib/utility.d.ts +26 -22
  178. package/build/src/lib/utility.d.ts.map +1 -1
  179. package/build/src/lib/utility.js +83 -17
  180. package/build/src/lib/utility.js.map +1 -1
  181. package/build/src/lib/workflow-templates.d.ts +2 -2
  182. package/build/src/lib/workflow-templates.d.ts.map +1 -1
  183. package/build/src/lib/workflow-templates.js +42 -0
  184. package/build/src/lib/workflow-templates.js.map +1 -1
  185. package/build/src/presets/eslint/dx-code-style.d.ts +2 -2
  186. package/build/src/presets/eslint/dx-code-style.d.ts.map +1 -1
  187. package/build/src/presets/eslint/dx-code-style.js.map +1 -1
  188. package/build/src/presets/eslint/dx-ignore.d.ts +2 -2
  189. package/build/src/presets/eslint/dx-ignore.d.ts.map +1 -1
  190. package/build/src/presets/eslint/dx-ignore.js.map +1 -1
  191. package/build/src/presets/eslint/fw-docusaurus.d.ts +2 -2
  192. package/build/src/presets/eslint/fw-docusaurus.d.ts.map +1 -1
  193. package/build/src/presets/eslint/fw-docusaurus.js.map +1 -1
  194. package/build/src/presets/eslint/fw-expressjs.d.ts +2 -2
  195. package/build/src/presets/eslint/fw-expressjs.d.ts.map +1 -1
  196. package/build/src/presets/eslint/fw-expressjs.js.map +1 -1
  197. package/build/src/presets/eslint/fw-nextjs.d.ts +2 -2
  198. package/build/src/presets/eslint/fw-nextjs.d.ts.map +1 -1
  199. package/build/src/presets/eslint/fw-nextjs.js.map +1 -1
  200. package/build/src/presets/eslint/lang-javascript.d.ts +2 -2
  201. package/build/src/presets/eslint/lang-javascript.d.ts.map +1 -1
  202. package/build/src/presets/eslint/lang-javascript.js.map +1 -1
  203. package/build/src/presets/eslint/lang-mdx.d.ts +2 -2
  204. package/build/src/presets/eslint/lang-mdx.d.ts.map +1 -1
  205. package/build/src/presets/eslint/lang-mdx.js.map +1 -1
  206. package/build/src/presets/eslint/lang-typescript.d.ts +2 -2
  207. package/build/src/presets/eslint/lang-typescript.d.ts.map +1 -1
  208. package/build/src/presets/eslint/lang-typescript.js.map +1 -1
  209. package/build/src/presets/eslint/runtime-browser.d.ts +2 -2
  210. package/build/src/presets/eslint/runtime-browser.d.ts.map +1 -1
  211. package/build/src/presets/eslint/runtime-browser.js.map +1 -1
  212. package/build/src/presets/eslint/runtime-cloudflare-workers.d.ts +2 -2
  213. package/build/src/presets/eslint/runtime-cloudflare-workers.d.ts.map +1 -1
  214. package/build/src/presets/eslint/runtime-cloudflare-workers.js.map +1 -1
  215. package/build/src/presets/eslint/runtime-edge.d.ts +2 -2
  216. package/build/src/presets/eslint/runtime-edge.d.ts.map +1 -1
  217. package/build/src/presets/eslint/runtime-edge.js.map +1 -1
  218. package/build/src/presets/eslint/runtime-node.d.ts +2 -2
  219. package/build/src/presets/eslint/runtime-node.d.ts.map +1 -1
  220. package/build/src/presets/eslint/runtime-node.js.map +1 -1
  221. package/build/src/presets/eslint/runtime-service-worker.d.ts +2 -2
  222. package/build/src/presets/eslint/runtime-service-worker.d.ts.map +1 -1
  223. package/build/src/presets/eslint/runtime-service-worker.js.map +1 -1
  224. package/build/src/presets/eslint/runtime-web-worker.d.ts +2 -2
  225. package/build/src/presets/eslint/runtime-web-worker.d.ts.map +1 -1
  226. package/build/src/presets/eslint/runtime-web-worker.js.map +1 -1
  227. package/build/src/presets/eslint/tool-vite.d.ts +2 -2
  228. package/build/src/presets/eslint/tool-vite.d.ts.map +1 -1
  229. package/build/src/presets/eslint/tool-vite.js.map +1 -1
  230. package/build/src/rules/eslint/conventions/no-default-export-declaration.d.ts +3 -3
  231. package/build/src/rules/eslint/conventions/no-default-export-declaration.d.ts.map +1 -1
  232. package/build/src/rules/eslint/conventions/no-default-export-declaration.js +2 -2
  233. package/build/src/rules/eslint/conventions/no-default-export-declaration.js.map +1 -1
  234. package/build/src/rules/eslint/conventions/no-implicit-boolean.d.ts +3 -3
  235. package/build/src/rules/eslint/conventions/no-implicit-boolean.d.ts.map +1 -1
  236. package/build/src/rules/eslint/conventions/no-implicit-boolean.js +14 -14
  237. package/build/src/rules/eslint/conventions/no-implicit-boolean.js.map +1 -1
  238. package/build/src/rules/eslint/conventions/require-explicit-return.d.ts +6 -6
  239. package/build/src/rules/eslint/conventions/require-explicit-return.d.ts.map +1 -1
  240. package/build/src/rules/eslint/conventions/require-explicit-return.js +14 -14
  241. package/build/src/rules/eslint/conventions/require-explicit-return.js.map +1 -1
  242. package/build/src/rules/eslint/conventions/require-hash-private.d.ts +4 -4
  243. package/build/src/rules/eslint/conventions/require-hash-private.d.ts.map +1 -1
  244. package/build/src/rules/eslint/conventions/require-hash-private.js +3 -3
  245. package/build/src/rules/eslint/conventions/require-hash-private.js.map +1 -1
  246. package/build/src/rules/eslint/conventions/require-kebab-case-filename.d.ts +4 -4
  247. package/build/src/rules/eslint/conventions/require-kebab-case-filename.d.ts.map +1 -1
  248. package/build/src/rules/eslint/conventions/require-kebab-case-filename.js +4 -4
  249. package/build/src/rules/eslint/conventions/require-kebab-case-filename.js.map +1 -1
  250. package/build/src/rules/eslint/conventions/require-naming-convention.d.ts +16 -16
  251. package/build/src/rules/eslint/conventions/require-naming-convention.d.ts.map +1 -1
  252. package/build/src/rules/eslint/conventions/require-naming-convention.js +34 -31
  253. package/build/src/rules/eslint/conventions/require-naming-convention.js.map +1 -1
  254. package/build/src/rules/eslint/conventions/require-undefined-init.d.ts +3 -3
  255. package/build/src/rules/eslint/conventions/require-undefined-init.d.ts.map +1 -1
  256. package/build/src/rules/eslint/conventions/require-undefined-init.js +2 -2
  257. package/build/src/rules/eslint/conventions/require-undefined-init.js.map +1 -1
  258. package/build/src/rules/eslint/conventions/switch-case-blocks.d.ts +4 -4
  259. package/build/src/rules/eslint/conventions/switch-case-blocks.d.ts.map +1 -1
  260. package/build/src/rules/eslint/conventions/switch-case-blocks.js +3 -3
  261. package/build/src/rules/eslint/conventions/switch-case-blocks.js.map +1 -1
  262. package/build/src/rules/eslint/formatting/no-complex-arrow-concise.d.ts +5 -5
  263. package/build/src/rules/eslint/formatting/no-complex-arrow-concise.d.ts.map +1 -1
  264. package/build/src/rules/eslint/formatting/no-complex-arrow-concise.js +16 -16
  265. package/build/src/rules/eslint/formatting/no-complex-arrow-concise.js.map +1 -1
  266. package/build/src/rules/eslint/formatting/no-multiline-strings.d.ts +4 -4
  267. package/build/src/rules/eslint/formatting/no-multiline-strings.d.ts.map +1 -1
  268. package/build/src/rules/eslint/formatting/no-multiline-strings.js +19 -19
  269. package/build/src/rules/eslint/formatting/no-multiline-strings.js.map +1 -1
  270. package/build/src/rules/eslint/formatting/no-raw-text-in-code.d.ts +3 -3
  271. package/build/src/rules/eslint/formatting/no-raw-text-in-code.d.ts.map +1 -1
  272. package/build/src/rules/eslint/formatting/no-raw-text-in-code.js +2 -2
  273. package/build/src/rules/eslint/formatting/no-raw-text-in-code.js.map +1 -1
  274. package/build/src/rules/eslint/formatting/no-ternary-in-template-literal.d.ts +3 -3
  275. package/build/src/rules/eslint/formatting/no-ternary-in-template-literal.d.ts.map +1 -1
  276. package/build/src/rules/eslint/formatting/no-ternary-in-template-literal.js +2 -2
  277. package/build/src/rules/eslint/formatting/no-ternary-in-template-literal.js.map +1 -1
  278. package/build/src/rules/eslint/formatting/require-import-order.d.ts +3 -3
  279. package/build/src/rules/eslint/formatting/require-import-order.d.ts.map +1 -1
  280. package/build/src/rules/eslint/formatting/require-import-order.js +6 -6
  281. package/build/src/rules/eslint/formatting/require-import-order.js.map +1 -1
  282. package/build/src/rules/eslint/formatting/require-multiline-condition-groups.d.ts +4 -4
  283. package/build/src/rules/eslint/formatting/require-multiline-condition-groups.d.ts.map +1 -1
  284. package/build/src/rules/eslint/formatting/require-multiline-condition-groups.js +5 -5
  285. package/build/src/rules/eslint/formatting/require-multiline-condition-groups.js.map +1 -1
  286. package/build/src/rules/eslint/formatting/require-multiline-conditions.d.ts +4 -4
  287. package/build/src/rules/eslint/formatting/require-multiline-conditions.d.ts.map +1 -1
  288. package/build/src/rules/eslint/formatting/require-multiline-conditions.js +5 -5
  289. package/build/src/rules/eslint/formatting/require-multiline-conditions.js.map +1 -1
  290. package/build/src/rules/eslint/formatting/require-padding-lines.d.ts +9 -9
  291. package/build/src/rules/eslint/formatting/require-padding-lines.d.ts.map +1 -1
  292. package/build/src/rules/eslint/formatting/require-padding-lines.js +20 -20
  293. package/build/src/rules/eslint/formatting/require-padding-lines.js.map +1 -1
  294. package/build/src/rules/eslint/formatting/require-ternary-parens.d.ts +3 -3
  295. package/build/src/rules/eslint/formatting/require-ternary-parens.d.ts.map +1 -1
  296. package/build/src/rules/eslint/formatting/require-ternary-parens.js +2 -2
  297. package/build/src/rules/eslint/formatting/require-ternary-parens.js.map +1 -1
  298. package/build/src/rules/eslint/index.d.ts +44 -44
  299. package/build/src/rules/eslint/index.d.ts.map +1 -1
  300. package/build/src/rules/eslint/index.js +44 -44
  301. package/build/src/rules/eslint/index.js.map +1 -1
  302. package/build/src/rules/eslint/jsdoc/require-jsdoc-body.d.ts +7 -7
  303. package/build/src/rules/eslint/jsdoc/require-jsdoc-body.d.ts.map +1 -1
  304. package/build/src/rules/eslint/jsdoc/require-jsdoc-body.js +7 -7
  305. package/build/src/rules/eslint/jsdoc/require-jsdoc-body.js.map +1 -1
  306. package/build/src/rules/eslint/jsdoc/require-jsdoc-hierarchy.d.ts +9 -7
  307. package/build/src/rules/eslint/jsdoc/require-jsdoc-hierarchy.d.ts.map +1 -1
  308. package/build/src/rules/eslint/jsdoc/require-jsdoc-hierarchy.js +115 -61
  309. package/build/src/rules/eslint/jsdoc/require-jsdoc-hierarchy.js.map +1 -1
  310. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-alignment.d.ts +3 -3
  311. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-alignment.d.ts.map +1 -1
  312. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-alignment.js +6 -6
  313. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-alignment.js.map +1 -1
  314. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-name.d.ts +3 -3
  315. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-name.d.ts.map +1 -1
  316. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-name.js +3 -3
  317. package/build/src/rules/eslint/jsdoc/require-jsdoc-param-name.js.map +1 -1
  318. package/build/src/rules/eslint/jsdoc/require-jsdoc-private.d.ts +3 -3
  319. package/build/src/rules/eslint/jsdoc/require-jsdoc-private.d.ts.map +1 -1
  320. package/build/src/rules/eslint/jsdoc/require-jsdoc-private.js +3 -3
  321. package/build/src/rules/eslint/jsdoc/require-jsdoc-private.js.map +1 -1
  322. package/build/src/rules/eslint/jsdoc/require-jsdoc-since.d.ts +3 -3
  323. package/build/src/rules/eslint/jsdoc/require-jsdoc-since.d.ts.map +1 -1
  324. package/build/src/rules/eslint/jsdoc/require-jsdoc-since.js +8 -8
  325. package/build/src/rules/eslint/jsdoc/require-jsdoc-since.js.map +1 -1
  326. package/build/src/rules/eslint/nova/no-logger-dev.d.ts +3 -3
  327. package/build/src/rules/eslint/nova/no-logger-dev.d.ts.map +1 -1
  328. package/build/src/rules/eslint/nova/no-logger-dev.js +5 -5
  329. package/build/src/rules/eslint/nova/no-logger-dev.js.map +1 -1
  330. package/build/src/rules/eslint/patterns/no-assign-then-return.d.ts +3 -3
  331. package/build/src/rules/eslint/patterns/no-assign-then-return.d.ts.map +1 -1
  332. package/build/src/rules/eslint/patterns/no-assign-then-return.js +2 -2
  333. package/build/src/rules/eslint/patterns/no-assign-then-return.js.map +1 -1
  334. package/build/src/rules/eslint/patterns/no-await-in-loop.d.ts +7 -7
  335. package/build/src/rules/eslint/patterns/no-await-in-loop.d.ts.map +1 -1
  336. package/build/src/rules/eslint/patterns/no-await-in-loop.js +4 -4
  337. package/build/src/rules/eslint/patterns/no-await-in-loop.js.map +1 -1
  338. package/build/src/rules/eslint/patterns/no-boolean-var-for-if.d.ts +3 -3
  339. package/build/src/rules/eslint/patterns/no-boolean-var-for-if.d.ts.map +1 -1
  340. package/build/src/rules/eslint/patterns/no-boolean-var-for-if.js +2 -2
  341. package/build/src/rules/eslint/patterns/no-boolean-var-for-if.js.map +1 -1
  342. package/build/src/rules/eslint/patterns/no-bracket-assignment.d.ts +3 -3
  343. package/build/src/rules/eslint/patterns/no-bracket-assignment.d.ts.map +1 -1
  344. package/build/src/rules/eslint/patterns/no-bracket-assignment.js +2 -2
  345. package/build/src/rules/eslint/patterns/no-bracket-assignment.js.map +1 -1
  346. package/build/src/rules/eslint/patterns/no-bracket-method-call.d.ts +4 -4
  347. package/build/src/rules/eslint/patterns/no-bracket-method-call.d.ts.map +1 -1
  348. package/build/src/rules/eslint/patterns/no-bracket-method-call.js +2 -2
  349. package/build/src/rules/eslint/patterns/no-bracket-method-call.js.map +1 -1
  350. package/build/src/rules/eslint/patterns/no-template-curly-in-string.d.ts +3 -3
  351. package/build/src/rules/eslint/patterns/no-template-curly-in-string.d.ts.map +1 -1
  352. package/build/src/rules/eslint/patterns/no-template-curly-in-string.js +2 -2
  353. package/build/src/rules/eslint/patterns/no-template-curly-in-string.js.map +1 -1
  354. package/build/src/rules/eslint/patterns/no-use-before-define.d.ts +7 -7
  355. package/build/src/rules/eslint/patterns/no-use-before-define.d.ts.map +1 -1
  356. package/build/src/rules/eslint/patterns/no-use-before-define.js +2 -2
  357. package/build/src/rules/eslint/patterns/no-use-before-define.js.map +1 -1
  358. package/build/src/rules/eslint/regex/no-regex-literal-flags.d.ts +3 -3
  359. package/build/src/rules/eslint/regex/no-regex-literal-flags.d.ts.map +1 -1
  360. package/build/src/rules/eslint/regex/no-regex-literal-flags.js +2 -2
  361. package/build/src/rules/eslint/regex/no-regex-literal-flags.js.map +1 -1
  362. package/build/src/rules/eslint/regex/no-regex-literals.d.ts +4 -4
  363. package/build/src/rules/eslint/regex/no-regex-literals.d.ts.map +1 -1
  364. package/build/src/rules/eslint/regex/no-regex-literals.js +2 -2
  365. package/build/src/rules/eslint/regex/no-regex-literals.js.map +1 -1
  366. package/build/src/rules/eslint/safety/no-script-url.d.ts +4 -4
  367. package/build/src/rules/eslint/safety/no-script-url.d.ts.map +1 -1
  368. package/build/src/rules/eslint/safety/no-script-url.js +2 -2
  369. package/build/src/rules/eslint/safety/no-script-url.js.map +1 -1
  370. package/build/src/rules/eslint/syntax/no-destructuring.d.ts +8 -8
  371. package/build/src/rules/eslint/syntax/no-destructuring.d.ts.map +1 -1
  372. package/build/src/rules/eslint/syntax/no-destructuring.js +10 -10
  373. package/build/src/rules/eslint/syntax/no-destructuring.js.map +1 -1
  374. package/build/src/rules/eslint/syntax/no-numeric-literals.d.ts +6 -6
  375. package/build/src/rules/eslint/syntax/no-numeric-literals.d.ts.map +1 -1
  376. package/build/src/rules/eslint/syntax/no-numeric-literals.js +2 -2
  377. package/build/src/rules/eslint/syntax/no-numeric-literals.js.map +1 -1
  378. package/build/src/rules/eslint/syntax/no-optional-chaining.d.ts +3 -3
  379. package/build/src/rules/eslint/syntax/no-optional-chaining.d.ts.map +1 -1
  380. package/build/src/rules/eslint/syntax/no-optional-chaining.js +2 -2
  381. package/build/src/rules/eslint/syntax/no-optional-chaining.js.map +1 -1
  382. package/build/src/rules/eslint/syntax/no-rest-params.d.ts +4 -4
  383. package/build/src/rules/eslint/syntax/no-rest-params.d.ts.map +1 -1
  384. package/build/src/rules/eslint/syntax/no-rest-params.js +8 -8
  385. package/build/src/rules/eslint/syntax/no-rest-params.js.map +1 -1
  386. package/build/src/rules/eslint/typescript/no-catch-unknown-annotation.d.ts +3 -3
  387. package/build/src/rules/eslint/typescript/no-catch-unknown-annotation.d.ts.map +1 -1
  388. package/build/src/rules/eslint/typescript/no-catch-unknown-annotation.js +2 -2
  389. package/build/src/rules/eslint/typescript/no-catch-unknown-annotation.js.map +1 -1
  390. package/build/src/rules/eslint/typescript/no-explicit-any.d.ts +3 -3
  391. package/build/src/rules/eslint/typescript/no-explicit-any.d.ts.map +1 -1
  392. package/build/src/rules/eslint/typescript/no-explicit-any.js +2 -2
  393. package/build/src/rules/eslint/typescript/no-explicit-any.js.map +1 -1
  394. package/build/src/rules/eslint/typescript/no-inline-type-annotation.d.ts +3 -3
  395. package/build/src/rules/eslint/typescript/no-inline-type-annotation.d.ts.map +1 -1
  396. package/build/src/rules/eslint/typescript/no-inline-type-annotation.js +9 -9
  397. package/build/src/rules/eslint/typescript/no-inline-type-annotation.js.map +1 -1
  398. package/build/src/rules/eslint/typescript/no-shared-type-import.d.ts +4 -4
  399. package/build/src/rules/eslint/typescript/no-shared-type-import.d.ts.map +1 -1
  400. package/build/src/rules/eslint/typescript/no-shared-type-import.js +2 -2
  401. package/build/src/rules/eslint/typescript/no-shared-type-import.js.map +1 -1
  402. package/build/src/rules/eslint/typescript/require-bracket-property-access.d.ts +4 -4
  403. package/build/src/rules/eslint/typescript/require-bracket-property-access.d.ts.map +1 -1
  404. package/build/src/rules/eslint/typescript/require-bracket-property-access.js +2 -2
  405. package/build/src/rules/eslint/typescript/require-bracket-property-access.js.map +1 -1
  406. package/build/src/rules/eslint/typescript/require-type-naming.d.ts +6 -4
  407. package/build/src/rules/eslint/typescript/require-type-naming.d.ts.map +1 -1
  408. package/build/src/rules/eslint/typescript/require-type-naming.js +54 -8
  409. package/build/src/rules/eslint/typescript/require-type-naming.js.map +1 -1
  410. package/build/src/toolkit/bootstrap.d.ts +10 -10
  411. package/build/src/toolkit/bootstrap.d.ts.map +1 -1
  412. package/build/src/toolkit/bootstrap.js +33 -33
  413. package/build/src/toolkit/bootstrap.js.map +1 -1
  414. package/build/src/toolkit/cli-header.d.ts +4 -4
  415. package/build/src/toolkit/cli-header.d.ts.map +1 -1
  416. package/build/src/toolkit/cli-header.js +22 -22
  417. package/build/src/toolkit/cli-header.js.map +1 -1
  418. package/build/src/toolkit/logger.d.ts +9 -9
  419. package/build/src/toolkit/logger.d.ts.map +1 -1
  420. package/build/src/toolkit/logger.js +16 -16
  421. package/build/src/toolkit/logger.js.map +1 -1
  422. package/build/src/toolkit/markdown-table.d.ts +6 -6
  423. package/build/src/toolkit/markdown-table.d.ts.map +1 -1
  424. package/build/src/toolkit/markdown-table.js +2 -2
  425. package/build/src/toolkit/markdown-table.js.map +1 -1
  426. package/build/src/types/api/node-releases.d.ts +14 -14
  427. package/build/src/types/api/spdx-licenses.d.ts +17 -17
  428. package/build/src/types/cli/generate/github/funding.d.ts +28 -28
  429. package/build/src/types/cli/generate/github/issue-template.d.ts +87 -71
  430. package/build/src/types/cli/generate/github/workflows.d.ts +359 -311
  431. package/build/src/types/cli/generate/must-haves/agent-conventions.d.ts +28 -22
  432. package/build/src/types/cli/generate/must-haves/dotenv.d.ts +208 -206
  433. package/build/src/types/cli/generate/must-haves/editorconfig.d.ts +16 -16
  434. package/build/src/types/cli/generate/must-haves/gitignore.d.ts +188 -156
  435. package/build/src/types/cli/generate/must-haves/license.d.ts +28 -26
  436. package/build/src/types/cli/generate/must-haves/read-me.d.ts +105 -95
  437. package/build/src/types/cli/index.d.ts +73 -84
  438. package/build/src/types/cli/recipe/github/handle-gh-failure.d.ts +18 -0
  439. package/build/src/types/cli/recipe/github/sync-features.d.ts +67 -0
  440. package/build/src/types/cli/recipe/github/sync-identity.d.ts +107 -0
  441. package/build/src/types/cli/recipe/github/sync-policies.d.ts +70 -0
  442. package/build/src/types/cli/recipe/index.d.ts +21 -16
  443. package/build/src/types/cli/recipe/package-json/cleanup.d.ts +57 -55
  444. package/build/src/types/cli/recipe/package-json/normalize-artifacts.d.ts +44 -44
  445. package/build/src/types/cli/recipe/package-json/normalize-bundler.d.ts +36 -36
  446. package/build/src/types/cli/recipe/package-json/normalize-dependencies.d.ts +65 -65
  447. package/build/src/types/cli/recipe/package-json/normalize-modules.d.ts +37 -35
  448. package/build/src/types/cli/recipe/package-json/normalize-tooling.d.ts +39 -39
  449. package/build/src/types/cli/recipe/package-json/sync-environment.d.ts +60 -60
  450. package/build/src/types/cli/recipe/package-json/sync-identity.d.ts +51 -51
  451. package/build/src/types/cli/recipe/package-json/sync-ownership.d.ts +78 -78
  452. package/build/src/types/cli/scaffold/app/expressjs.d.ts +10 -10
  453. package/build/src/types/cli/scaffold/app/nextjs.d.ts +10 -10
  454. package/build/src/types/cli/scaffold/app/vite.d.ts +10 -10
  455. package/build/src/types/cli/scaffold/app/workers.d.ts +10 -10
  456. package/build/src/types/cli/scaffold/docs/docusaurus.d.ts +10 -10
  457. package/build/src/types/cli/scaffold/starter/base.d.ts +27 -27
  458. package/build/src/types/cli/utility/changelog.d.ts +189 -180
  459. package/build/src/types/cli/utility/initialize.d.ts +1135 -690
  460. package/build/src/types/cli/utility/run-recipes.d.ts +32 -11
  461. package/build/src/types/cli/utility/run-scripts.d.ts +126 -52
  462. package/build/src/types/cli/utility/transpile.d.ts +30 -30
  463. package/build/src/types/cli/utility/type-check.d.ts +30 -30
  464. package/build/src/types/cli/utility/version.d.ts +130 -130
  465. package/build/src/types/lib/constants.d.ts +8 -1
  466. package/build/src/types/lib/item.d.ts +158 -149
  467. package/build/src/types/lib/nova-config.d.ts +379 -191
  468. package/build/src/types/lib/regex.d.ts +762 -0
  469. package/build/src/types/lib/scaffold.d.ts +176 -149
  470. package/build/src/types/lib/utility.d.ts +369 -220
  471. package/build/src/types/lib/workflow-templates.d.ts +61 -56
  472. package/build/src/types/presets/eslint/dx-code-style.d.ts +1 -1
  473. package/build/src/types/presets/eslint/dx-ignore.d.ts +1 -1
  474. package/build/src/types/presets/eslint/fw-docusaurus.d.ts +1 -1
  475. package/build/src/types/presets/eslint/fw-expressjs.d.ts +1 -1
  476. package/build/src/types/presets/eslint/fw-nextjs.d.ts +1 -1
  477. package/build/src/types/presets/eslint/lang-javascript.d.ts +1 -1
  478. package/build/src/types/presets/eslint/lang-mdx.d.ts +1 -1
  479. package/build/src/types/presets/eslint/lang-typescript.d.ts +1 -1
  480. package/build/src/types/presets/eslint/runtime-browser.d.ts +1 -1
  481. package/build/src/types/presets/eslint/runtime-cloudflare-workers.d.ts +1 -1
  482. package/build/src/types/presets/eslint/runtime-edge.d.ts +1 -1
  483. package/build/src/types/presets/eslint/runtime-node.d.ts +1 -1
  484. package/build/src/types/presets/eslint/runtime-service-worker.d.ts +1 -1
  485. package/build/src/types/presets/eslint/runtime-web-worker.d.ts +1 -1
  486. package/build/src/types/presets/eslint/tool-vite.d.ts +1 -1
  487. package/build/src/types/rules/eslint/conventions/no-default-export-declaration.d.ts +30 -13
  488. package/build/src/types/rules/eslint/conventions/no-implicit-boolean.d.ts +84 -25
  489. package/build/src/types/rules/eslint/conventions/require-explicit-return.d.ts +47 -42
  490. package/build/src/types/rules/eslint/conventions/require-hash-private.d.ts +35 -12
  491. package/build/src/types/rules/eslint/conventions/require-kebab-case-filename.d.ts +35 -29
  492. package/build/src/types/rules/eslint/conventions/require-naming-convention.d.ts +212 -115
  493. package/build/src/types/rules/eslint/conventions/require-undefined-init.d.ts +34 -11
  494. package/build/src/types/rules/eslint/conventions/switch-case-blocks.d.ts +41 -18
  495. package/build/src/types/rules/eslint/formatting/no-complex-arrow-concise.d.ts +44 -30
  496. package/build/src/types/rules/eslint/formatting/no-multiline-strings.d.ts +67 -44
  497. package/build/src/types/rules/eslint/formatting/no-raw-text-in-code.d.ts +24 -10
  498. package/build/src/types/rules/eslint/formatting/no-ternary-in-template-literal.d.ts +23 -9
  499. package/build/src/types/rules/eslint/formatting/require-import-order.d.ts +51 -39
  500. package/build/src/types/rules/eslint/formatting/require-multiline-condition-groups.d.ts +42 -26
  501. package/build/src/types/rules/eslint/formatting/require-multiline-conditions.d.ts +36 -20
  502. package/build/src/types/rules/eslint/formatting/require-padding-lines.d.ts +144 -103
  503. package/build/src/types/rules/eslint/formatting/require-ternary-parens.d.ts +35 -12
  504. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-body.d.ts +65 -29
  505. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-hierarchy.d.ts +308 -134
  506. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-param-alignment.d.ts +59 -52
  507. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-param-name.d.ts +41 -26
  508. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-private.d.ts +49 -17
  509. package/build/src/types/rules/eslint/jsdoc/require-jsdoc-since.d.ts +79 -11
  510. package/build/src/types/rules/eslint/nova/no-logger-dev.d.ts +35 -25
  511. package/build/src/types/rules/eslint/patterns/no-assign-then-return.d.ts +40 -17
  512. package/build/src/types/rules/eslint/patterns/no-await-in-loop.d.ts +53 -45
  513. package/build/src/types/rules/eslint/patterns/no-boolean-var-for-if.d.ts +34 -20
  514. package/build/src/types/rules/eslint/patterns/no-bracket-assignment.d.ts +36 -13
  515. package/build/src/types/rules/eslint/patterns/no-bracket-method-call.d.ts +43 -20
  516. package/build/src/types/rules/eslint/patterns/no-template-curly-in-string.d.ts +26 -12
  517. package/build/src/types/rules/eslint/patterns/no-use-before-define.d.ts +59 -45
  518. package/build/src/types/rules/eslint/regex/no-regex-literal-flags.d.ts +23 -9
  519. package/build/src/types/rules/eslint/regex/no-regex-literals.d.ts +31 -17
  520. package/build/src/types/rules/eslint/safety/no-script-url.d.ts +29 -15
  521. package/build/src/types/rules/eslint/syntax/no-destructuring.d.ts +61 -58
  522. package/build/src/types/rules/eslint/syntax/no-numeric-literals.d.ts +43 -29
  523. package/build/src/types/rules/eslint/syntax/no-optional-chaining.d.ts +23 -9
  524. package/build/src/types/rules/eslint/syntax/no-rest-params.d.ts +63 -31
  525. package/build/src/types/rules/eslint/typescript/no-catch-unknown-annotation.d.ts +34 -11
  526. package/build/src/types/rules/eslint/typescript/no-explicit-any.d.ts +23 -9
  527. package/build/src/types/rules/eslint/typescript/no-inline-type-annotation.d.ts +58 -32
  528. package/build/src/types/rules/eslint/typescript/no-shared-type-import.d.ts +32 -18
  529. package/build/src/types/rules/eslint/typescript/require-bracket-property-access.d.ts +50 -22
  530. package/build/src/types/rules/eslint/typescript/require-type-naming.d.ts +87 -20
  531. package/build/src/types/shared.d.ts +410 -365
  532. package/build/src/types/tests/api/node-releases.test.d.ts +87 -6
  533. package/build/src/types/tests/api/spdx-licenses.test.d.ts +48 -8
  534. package/build/src/types/tests/cli/generate/github/funding.test.d.ts +25 -7
  535. package/build/src/types/tests/cli/generate/github/issue-template.test.d.ts +25 -7
  536. package/build/src/types/tests/cli/generate/github/workflows-helpers.test.d.ts +193 -30
  537. package/build/src/types/tests/cli/generate/github/workflows.test.d.ts +550 -35
  538. package/build/src/types/tests/cli/generate/must-haves/agent-conventions.test.d.ts +39 -14
  539. package/build/src/types/tests/cli/generate/must-haves/dotenv.test.d.ts +26 -8
  540. package/build/src/types/tests/cli/generate/must-haves/editorconfig.test.d.ts +22 -6
  541. package/build/src/types/tests/cli/generate/must-haves/gitignore.test.d.ts +24 -6
  542. package/build/src/types/tests/cli/generate/must-haves/license.test.d.ts +150 -12
  543. package/build/src/types/tests/cli/generate/must-haves/read-me.test.d.ts +211 -23
  544. package/build/src/types/tests/cli/recipe/github/handle-gh-failure.test.d.ts +96 -0
  545. package/build/src/types/tests/cli/recipe/github/sync-features.test.d.ts +357 -0
  546. package/build/src/types/tests/cli/recipe/github/sync-identity.test.d.ts +475 -0
  547. package/build/src/types/tests/cli/recipe/github/sync-policies.test.d.ts +408 -0
  548. package/build/src/types/tests/cli/recipe/package-json/cleanup.test.d.ts +159 -20
  549. package/build/src/types/tests/cli/recipe/package-json/normalize-artifacts.test.d.ts +102 -15
  550. package/build/src/types/tests/cli/recipe/package-json/normalize-bundler.test.d.ts +102 -15
  551. package/build/src/types/tests/cli/recipe/package-json/normalize-dependencies.test.d.ts +106 -19
  552. package/build/src/types/tests/cli/recipe/package-json/normalize-modules.test.d.ts +101 -14
  553. package/build/src/types/tests/cli/recipe/package-json/normalize-tooling.test.d.ts +126 -14
  554. package/build/src/types/tests/cli/recipe/package-json/sync-environment.test.d.ts +101 -14
  555. package/build/src/types/tests/cli/recipe/package-json/sync-identity.test.d.ts +101 -14
  556. package/build/src/types/tests/cli/recipe/package-json/sync-ownership.test.d.ts +101 -14
  557. package/build/src/types/tests/cli/scaffold/app/expressjs.test.d.ts +59 -18
  558. package/build/src/types/tests/cli/scaffold/app/nextjs.test.d.ts +62 -19
  559. package/build/src/types/tests/cli/scaffold/app/vite.test.d.ts +60 -19
  560. package/build/src/types/tests/cli/scaffold/app/workers.test.d.ts +59 -18
  561. package/build/src/types/tests/cli/scaffold/docs/docusaurus.test.d.ts +59 -18
  562. package/build/src/types/tests/cli/scaffold/starter/base.test.d.ts +55 -18
  563. package/build/src/types/tests/cli/utility/changelog.test.d.ts +161 -32
  564. package/build/src/types/tests/cli/utility/initialize.test.d.ts +211 -5
  565. package/build/src/types/tests/cli/utility/run-recipes.test.d.ts +87 -9
  566. package/build/src/types/tests/cli/utility/run-scripts.test.d.ts +124 -24
  567. package/build/src/types/tests/cli/utility/transpile.test.d.ts +23 -11
  568. package/build/src/types/tests/cli/utility/type-check.test.d.ts +34 -9
  569. package/build/src/types/tests/cli/utility/version.test.d.ts +33 -4
  570. package/build/src/types/tests/lib/item.test.d.ts +191 -37
  571. package/build/src/types/tests/lib/nova-config.test.d.ts +1032 -69
  572. package/build/src/types/tests/lib/regex.test.d.ts +453 -27
  573. package/build/src/types/tests/lib/scaffold.test.d.ts +55 -12
  574. package/build/src/types/tests/lib/schema.test.d.ts +171 -16
  575. package/build/src/types/tests/lib/utility.test.d.ts +1131 -164
  576. package/build/src/types/tests/lib/workflow-templates.test.d.ts +17 -17
  577. package/build/src/types/tests/rules/eslint/conventions/no-default-export-declaration.test.d.ts +1 -1
  578. package/build/src/types/tests/rules/eslint/conventions/no-implicit-boolean.test.d.ts +1 -1
  579. package/build/src/types/tests/rules/eslint/conventions/require-explicit-return.test.d.ts +1 -1
  580. package/build/src/types/tests/rules/eslint/conventions/require-hash-private.test.d.ts +1 -1
  581. package/build/src/types/tests/rules/eslint/conventions/require-kebab-case-filename.test.d.ts +1 -1
  582. package/build/src/types/tests/rules/eslint/conventions/require-naming-convention.test.d.ts +1 -1
  583. package/build/src/types/tests/rules/eslint/conventions/require-undefined-init.test.d.ts +1 -1
  584. package/build/src/types/tests/rules/eslint/conventions/switch-case-blocks.test.d.ts +1 -1
  585. package/build/src/types/tests/rules/eslint/formatting/no-complex-arrow-concise.test.d.ts +1 -1
  586. package/build/src/types/tests/rules/eslint/formatting/no-multiline-strings.test.d.ts +1 -1
  587. package/build/src/types/tests/rules/eslint/formatting/no-raw-text-in-code.test.d.ts +1 -1
  588. package/build/src/types/tests/rules/eslint/formatting/no-ternary-in-template-literal.test.d.ts +1 -1
  589. package/build/src/types/tests/rules/eslint/formatting/require-import-order.test.d.ts +1 -1
  590. package/build/src/types/tests/rules/eslint/formatting/require-multiline-condition-groups.test.d.ts +1 -1
  591. package/build/src/types/tests/rules/eslint/formatting/require-multiline-conditions.test.d.ts +1 -1
  592. package/build/src/types/tests/rules/eslint/formatting/require-padding-lines.test.d.ts +1 -1
  593. package/build/src/types/tests/rules/eslint/formatting/require-ternary-parens.test.d.ts +1 -1
  594. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-body.test.d.ts +1 -1
  595. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-hierarchy.test.d.ts +1 -1
  596. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-param-alignment.test.d.ts +1 -1
  597. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-param-name.test.d.ts +1 -1
  598. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-private.test.d.ts +1 -1
  599. package/build/src/types/tests/rules/eslint/jsdoc/require-jsdoc-since.test.d.ts +1 -1
  600. package/build/src/types/tests/rules/eslint/nova/no-logger-dev.test.d.ts +1 -1
  601. package/build/src/types/tests/rules/eslint/patterns/no-assign-then-return.test.d.ts +1 -1
  602. package/build/src/types/tests/rules/eslint/patterns/no-await-in-loop.test.d.ts +1 -1
  603. package/build/src/types/tests/rules/eslint/patterns/no-boolean-var-for-if.test.d.ts +1 -1
  604. package/build/src/types/tests/rules/eslint/patterns/no-bracket-assignment.test.d.ts +1 -1
  605. package/build/src/types/tests/rules/eslint/patterns/no-bracket-method-call.test.d.ts +1 -1
  606. package/build/src/types/tests/rules/eslint/patterns/no-template-curly-in-string.test.d.ts +1 -1
  607. package/build/src/types/tests/rules/eslint/patterns/no-use-before-define.test.d.ts +1 -1
  608. package/build/src/types/tests/rules/eslint/regex/no-regex-literal-flags.test.d.ts +1 -1
  609. package/build/src/types/tests/rules/eslint/regex/no-regex-literals.test.d.ts +1 -1
  610. package/build/src/types/tests/rules/eslint/safety/no-script-url.test.d.ts +1 -1
  611. package/build/src/types/tests/rules/eslint/syntax/no-destructuring.test.d.ts +1 -1
  612. package/build/src/types/tests/rules/eslint/syntax/no-numeric-literals.test.d.ts +1 -1
  613. package/build/src/types/tests/rules/eslint/syntax/no-optional-chaining.test.d.ts +1 -1
  614. package/build/src/types/tests/rules/eslint/syntax/no-rest-params.test.d.ts +1 -1
  615. package/build/src/types/tests/rules/eslint/typescript/no-catch-unknown-annotation.test.d.ts +1 -1
  616. package/build/src/types/tests/rules/eslint/typescript/no-explicit-any.test.d.ts +1 -1
  617. package/build/src/types/tests/rules/eslint/typescript/no-inline-type-annotation.test.d.ts +1 -1
  618. package/build/src/types/tests/rules/eslint/typescript/no-shared-type-import.test.d.ts +1 -1
  619. package/build/src/types/tests/rules/eslint/typescript/require-bracket-property-access.test.d.ts +3 -3
  620. package/build/src/types/tests/rules/eslint/typescript/require-type-naming.test.d.ts +1 -1
  621. package/build/src/types/tests/toolkit/bootstrap.test.d.ts +155 -40
  622. package/build/src/types/tests/toolkit/cli-header.test.d.ts +135 -22
  623. package/build/src/types/tests/toolkit/logger.test.d.ts +113 -5
  624. package/build/src/types/tests/toolkit/markdown-table.test.d.ts +150 -27
  625. package/build/src/types/tests/type-declarations.test.d.ts +4683 -300
  626. package/build/src/types/toolkit/bootstrap.d.ts +71 -47
  627. package/build/src/types/toolkit/cli-header.d.ts +98 -88
  628. package/build/src/types/toolkit/logger.d.ts +98 -53
  629. package/build/src/types/toolkit/markdown-table.d.ts +74 -72
  630. package/build/templates/generators/github/workflows/publish/targets/aws-amplify-nextjs.yml +1 -1
  631. package/build/templates/generators/github/workflows/publish/targets/cloudflare-pages-docusaurus.yml +1 -1
  632. package/build/templates/generators/github/workflows/publish/targets/github-action.yml +121 -0
  633. package/build/templates/generators/github/workflows/publish/targets/github-packages.yml +1 -1
  634. package/build/templates/generators/github/workflows/publish/targets/github-pages-docusaurus.yml +1 -1
  635. package/build/templates/generators/github/workflows/publish/targets/npm.yml +1 -1
  636. package/build/templates/generators/github/workflows/publish/targets/vercel-nextjs.yml +1 -1
  637. package/build/templates/generators/must-haves/agent-conventions/AGENTS.md +1 -0
  638. package/build/templates/generators/must-haves/agent-conventions/CLAUDE.md +1 -0
  639. package/build/templates/generators/must-haves/agent-conventions/PROJECT_RULES.md +1 -1
  640. package/build/templates/generators/must-haves/agent-conventions/conventions/typescript.md +412 -148
  641. package/build/templates/generators/must-haves/agent-conventions/conventions/universal.md +27 -3
  642. package/build/templates/generators/must-haves/agent-conventions/cursorrules +1 -0
  643. 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,26 +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 uploadArtifactStep = CliGenerateGithubWorkflows.renderUploadArtifactSteps(entryTargets, targetsMetadata);
465
+ const uploadArtifactStep = Runner.renderUploadArtifactSteps(entryTargets, targetsMetadata);
348
466
  content = content.replace('[__UPLOAD_ARTIFACT_STEP__]', uploadArtifactStep);
349
467
  const resolvedTargetFragments = [];
350
468
  let hasTargetFragmentError = false;
351
469
  for (const entryTarget of entryTargets) {
352
470
  const currentEntryTarget = entryTarget;
353
- const targetType = currentEntryTarget['type'];
354
- const targetWorkingDir = currentEntryTarget['workingDir'];
355
- 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`);
356
474
  const targetFragmentExists = await pathExists(targetFragmentPath);
357
475
  if (targetFragmentExists !== true) {
358
476
  Logger.customize({
359
- name: 'CliGenerateGithubWorkflows.run',
477
+ name: 'Runner.run',
360
478
  purpose: 'validate',
361
- }).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.`);
362
480
  hasTargetFragmentError = true;
363
481
  break;
364
482
  }
@@ -368,38 +486,38 @@ export class CliGenerateGithubWorkflows {
368
486
  }
369
487
  catch {
370
488
  Logger.customize({
371
- name: 'CliGenerateGithubWorkflows.run',
489
+ name: 'Runner.run',
372
490
  purpose: 'read',
373
- }).error(`Failed to read target fragment ${chalk.cyan(`"${targetType}.yml"`)}. Skipping.`);
491
+ }).error(`Failed to read target fragment ${chalk.cyan(`"${fragmentTargetType}.yml"`)}. Skipping.`);
374
492
  hasTargetFragmentError = true;
375
493
  break;
376
494
  }
377
- const targetId = CliGenerateGithubWorkflows.slugifyWorkingDir(targetWorkingDir);
495
+ const targetId = Runner.slugifyWorkingDir(fragmentTargetWorkingDir);
378
496
  let targetFragmentResolvedContent = targetFragmentRawContent;
379
497
  targetFragmentResolvedContent = targetFragmentResolvedContent.replaceAll('[__TARGET_ID__]', targetId);
380
- targetFragmentResolvedContent = targetFragmentResolvedContent.replaceAll('[__WORKING_DIR__]', targetWorkingDir);
381
- const artifactName = CliGenerateGithubWorkflows.buildArtifactName(targetType, targetId);
498
+ targetFragmentResolvedContent = targetFragmentResolvedContent.replaceAll('[__WORKING_DIR__]', fragmentTargetWorkingDir);
499
+ const artifactName = Runner.buildArtifactName(fragmentTargetType, targetId);
382
500
  targetFragmentResolvedContent = targetFragmentResolvedContent.replaceAll('[__ARTIFACT_NAME__]', artifactName);
383
501
  const targetNeeds = currentEntryTarget['needs'] ?? [];
384
- const targetNeedsJobIds = targetNeeds.map((targetNeedWorkingDir) => `publish-${targetType}-${CliGenerateGithubWorkflows.slugifyWorkingDir(targetNeedWorkingDir)}`);
502
+ const targetNeedsJobIds = targetNeeds.map((targetNeedWorkingDir) => `publish-${fragmentTargetType}-${Runner.slugifyWorkingDir(targetNeedWorkingDir)}`);
385
503
  const targetNeedsValue = (targetNeedsJobIds.length === 0) ? '"build"' : `["build", ${targetNeedsJobIds.map((targetNeedsJobId) => `"${targetNeedsJobId}"`).join(', ')}]`;
386
504
  targetFragmentResolvedContent = targetFragmentResolvedContent.replace('[__NEEDS__]', targetNeedsValue);
387
505
  const targetJobsConditionLine = (mergedJobsCondition !== '') ? ` if: "${mergedJobsCondition}"\n` : '';
388
506
  targetFragmentResolvedContent = targetFragmentResolvedContent.replace('[__JOBS_CONDITION__]\n', targetJobsConditionLine);
389
- const targetMetadata = targetsMetadata[targetType];
507
+ const targetMetadata = targetsMetadata[fragmentTargetType];
390
508
  const mergedVariables = {
391
509
  ...metadataEntry['variables'],
392
510
  ...(targetMetadata !== undefined) ? targetMetadata['variables'] : {},
393
511
  };
394
- targetFragmentResolvedContent = CliGenerateGithubWorkflows.substituteVariables(targetFragmentResolvedContent, mergedVariables, entry['settings']);
512
+ targetFragmentResolvedContent = Runner.substituteVariables(targetFragmentResolvedContent, mergedVariables, entry['settings']);
395
513
  try {
396
514
  parseYaml(targetFragmentResolvedContent);
397
515
  }
398
516
  catch {
399
517
  Logger.customize({
400
- name: 'CliGenerateGithubWorkflows.run',
518
+ name: 'Runner.run',
401
519
  purpose: 'validate',
402
- }).error(`Target fragment ${chalk.cyan(`"${targetType}.yml"`)} produced invalid YAML. Skipping.`);
520
+ }).error(`Target fragment ${chalk.cyan(`"${fragmentTargetType}.yml"`)} produced invalid YAML. Skipping.`);
403
521
  hasTargetFragmentError = true;
404
522
  break;
405
523
  }
@@ -422,7 +540,7 @@ export class CliGenerateGithubWorkflows {
422
540
  }
423
541
  catch {
424
542
  Logger.customize({
425
- name: 'CliGenerateGithubWorkflows.run',
543
+ name: 'Runner.run',
426
544
  purpose: 'validate',
427
545
  }).error(`Base template for ${chalk.cyan(`"${templateName}"`)} produced invalid YAML after target injection. Skipping.`);
428
546
  continue;
@@ -431,24 +549,24 @@ export class CliGenerateGithubWorkflows {
431
549
  }
432
550
  }
433
551
  content = content.replaceAll('[__WORKFLOW_ID__]', (workflowSuffix !== undefined) ? ` (${workflowSuffix})` : '');
434
- const substituted = CliGenerateGithubWorkflows.substituteVariables(content, metadataEntry['variables'], entry['settings']);
552
+ const substituted = Runner.substituteVariables(content, metadataEntry['variables'], entry['settings']);
435
553
  try {
436
554
  parseYaml(substituted);
437
555
  }
438
556
  catch {
439
557
  Logger.customize({
440
- name: 'CliGenerateGithubWorkflows.run',
558
+ name: 'Runner.run',
441
559
  purpose: 'validate',
442
560
  }).error(`Generated YAML for ${chalk.cyan(`"${outputFileName}"`)} is invalid. Skipping.`);
443
561
  continue;
444
562
  }
445
563
  generatedSet.add(outputFileName);
446
- const entrySetupLines = CliGenerateGithubWorkflows.buildEntrySetupLines(entry, metadataEntry, outputFileName);
564
+ const entrySetupLines = Runner.buildEntrySetupLines(entry, metadataEntry, outputFileName);
447
565
  setupLines.push(...entrySetupLines);
448
566
  if (isDryRun === true) {
449
567
  const displayPath = `.github/workflows/${outputFileName}`;
450
568
  Logger.customize({
451
- name: 'CliGenerateGithubWorkflows.run',
569
+ name: 'Runner.run',
452
570
  purpose: 'dry-run',
453
571
  }).info(`Would generate ${chalk.cyan(`"${displayPath}"`)}.`);
454
572
  continue;
@@ -468,31 +586,31 @@ export class CliGenerateGithubWorkflows {
468
586
  catch {
469
587
  }
470
588
  for (const existingEntry of existingEntries) {
471
- const entry = existingEntry;
472
- if (entry.isFile() !== true) {
589
+ const existingDirent = existingEntry;
590
+ if (existingDirent.isFile() !== true) {
473
591
  continue;
474
592
  }
475
- const isOrphan = entry.name.startsWith('nova-') === true
476
- && entry.name.endsWith('.yml') === true
477
- && generatedSet.has(entry.name) === false;
478
- 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;
479
597
  if (isOrphan !== true || isBackup === true) {
480
598
  continue;
481
599
  }
482
- const orphanPath = join(workflowsDirectory, entry.name);
600
+ const orphanPath = join(workflowsDirectory, existingDirent.name);
483
601
  if (isReplaceFile === true) {
484
602
  await fs.unlink(orphanPath);
485
603
  Logger.customize({
486
- name: 'CliGenerateGithubWorkflows.run',
604
+ name: 'Runner.run',
487
605
  purpose: 'cleanup',
488
- }).info(`Deleted orphan ${chalk.cyan(`"${entry.name}"`)}.`);
606
+ }).info(`Deleted orphan ${chalk.cyan(`"${existingDirent.name}"`)}.`);
489
607
  }
490
608
  else {
491
609
  await renameFileWithDate(orphanPath);
492
610
  Logger.customize({
493
- name: 'CliGenerateGithubWorkflows.run',
611
+ name: 'Runner.run',
494
612
  purpose: 'cleanup',
495
- }).info(`Backed up orphan ${chalk.cyan(`"${entry.name}"`)}.`);
613
+ }).info(`Backed up orphan ${chalk.cyan(`"${existingDirent.name}"`)}.`);
496
614
  }
497
615
  }
498
616
  }
@@ -502,7 +620,7 @@ export class CliGenerateGithubWorkflows {
502
620
  setupLines.join('\n'),
503
621
  ].join('\n');
504
622
  Logger.customize({
505
- name: 'CliGenerateGithubWorkflows.run',
623
+ name: 'Runner.run',
506
624
  purpose: 'setup',
507
625
  padTop: 1,
508
626
  }).info(setupMessage);
@@ -610,12 +728,12 @@ export class CliGenerateGithubWorkflows {
610
728
  continue;
611
729
  }
612
730
  if (variableMeta['format'] === 'secret') {
613
- const resolvedName = (entry['settings'] !== undefined && entry['settings'][variableName] !== undefined) ? entry['settings'][variableName] : (variableMeta['default'] ?? variableName);
614
- 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)}`);
615
733
  }
616
734
  if (variableMeta['format'] === 'var') {
617
- const resolvedName = (entry['settings'] !== undefined && entry['settings'][variableName] !== undefined) ? entry['settings'][variableName] : (variableMeta['default'] ?? variableName);
618
- 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)}`);
619
737
  }
620
738
  }
621
739
  if (entry['targets'] !== undefined && metadataEntry['targets'] !== undefined) {
@@ -633,12 +751,12 @@ export class CliGenerateGithubWorkflows {
633
751
  continue;
634
752
  }
635
753
  if (targetVariableMeta['format'] === 'secret') {
636
- const targetResolvedName = (entry['settings'] !== undefined && entry['settings'][targetVariableName] !== undefined) ? entry['settings'][targetVariableName] : (targetVariableMeta['default'] ?? targetVariableName);
637
- 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)}`);
638
756
  }
639
757
  if (targetVariableMeta['format'] === 'var') {
640
- const targetResolvedName = (entry['settings'] !== undefined && entry['settings'][targetVariableName] !== undefined) ? entry['settings'][targetVariableName] : (targetVariableMeta['default'] ?? targetVariableName);
641
- 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)}`);
642
760
  }
643
761
  }
644
762
  }
@@ -653,22 +771,22 @@ export class CliGenerateGithubWorkflows {
653
771
  const regex = new RegExp(`\\$\\{\\{\\s*(?:secrets|vars)\\.${variableName}\\s*\\}\\}`, 'g');
654
772
  const settingValue = (settings !== undefined && settings[variableName] !== undefined) ? settings[variableName] : undefined;
655
773
  if (variableMeta['format'] === 'secret') {
656
- const resolvedName = settingValue
774
+ const secretResolvedName = settingValue
657
775
  ?? variableMeta['default']
658
776
  ?? variableName;
659
- const replacement = `\${{ secrets.${resolvedName} }}`;
660
- result = result.replace(regex, replacement);
777
+ const secretReplacement = `\${{ secrets.${secretResolvedName} }}`;
778
+ result = result.replace(regex, secretReplacement);
661
779
  }
662
780
  if (variableMeta['format'] === 'var') {
663
- const resolvedName = settingValue
781
+ const varResolvedName = settingValue
664
782
  ?? variableMeta['default']
665
783
  ?? variableName;
666
- const replacement = `\${{ vars.${resolvedName} }}`;
667
- result = result.replace(regex, replacement);
784
+ const varReplacement = `\${{ vars.${varResolvedName} }}`;
785
+ result = result.replace(regex, varReplacement);
668
786
  }
669
787
  if (variableMeta['format'] === 'literal') {
670
- const replacement = (settingValue ?? '').replaceAll('\n', '\\n');
671
- result = result.replace(regex, replacement);
788
+ const literalReplacement = (settingValue ?? '').replaceAll('\n', '\\n');
789
+ result = result.replace(regex, () => literalReplacement);
672
790
  }
673
791
  }
674
792
  return result;
@@ -698,11 +816,11 @@ export class CliGenerateGithubWorkflows {
698
816
  }
699
817
  static buildCommand(scriptName, workspaceNames, useTurbo) {
700
818
  if (useTurbo === true) {
701
- const flags = workspaceNames.map((name) => `--filter=${name}`);
702
- 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`;
703
821
  }
704
- const flags = workspaceNames.map((name) => `-w ${name}`);
705
- return `npm run ${scriptName} ${flags.join(' ')}`;
822
+ const npmFlags = workspaceNames.map((name) => `-w ${name}`);
823
+ return `npm run ${scriptName} ${npmFlags.join(' ')}`;
706
824
  }
707
825
  static renderUploadArtifactSteps(targets, targetsMetadata) {
708
826
  const steps = [];
@@ -715,12 +833,12 @@ export class CliGenerateGithubWorkflows {
715
833
  continue;
716
834
  }
717
835
  const strippedDir = target['workingDir'].replace(LIB_REGEX_PATTERN_LEADING_DOT_SLASH, '');
718
- const targetId = CliGenerateGithubWorkflows.slugifyWorkingDir(target['workingDir']);
719
- const artifactName = CliGenerateGithubWorkflows.buildArtifactName(target['type'], targetId);
836
+ const targetId = Runner.slugifyWorkingDir(target['workingDir']);
837
+ const artifactName = Runner.buildArtifactName(target['type'], targetId);
720
838
  const pathLines = metadata['artifactPaths'].map((template) => ` ${template.replaceAll('{workingDir}', strippedDir)}`);
721
839
  const stepLines = [
722
840
  ` - name: "Upload build artifacts (${target['type']}/${targetId})"`,
723
- ' uses: "actions/upload-artifact@v4"',
841
+ ' uses: "actions/upload-artifact@v7"',
724
842
  ' with:',
725
843
  ` name: "${artifactName}"`,
726
844
  ' retention-days: 1',