@factiii/stack 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +420 -0
  2. package/bin/factiii +229 -0
  3. package/dist/cli/check-config.d.ts +9 -0
  4. package/dist/cli/check-config.d.ts.map +1 -0
  5. package/dist/cli/check-config.js +19 -0
  6. package/dist/cli/check-config.js.map +1 -0
  7. package/dist/cli/deploy-secrets.d.ts +16 -0
  8. package/dist/cli/deploy-secrets.d.ts.map +1 -0
  9. package/dist/cli/deploy-secrets.js +227 -0
  10. package/dist/cli/deploy-secrets.js.map +1 -0
  11. package/dist/cli/deploy.d.ts +30 -0
  12. package/dist/cli/deploy.d.ts.map +1 -0
  13. package/dist/cli/deploy.js +306 -0
  14. package/dist/cli/deploy.js.map +1 -0
  15. package/dist/cli/deployer.d.ts +13 -0
  16. package/dist/cli/deployer.d.ts.map +1 -0
  17. package/dist/cli/deployer.js +21 -0
  18. package/dist/cli/deployer.js.map +1 -0
  19. package/dist/cli/dev-sync.d.ts +30 -0
  20. package/dist/cli/dev-sync.d.ts.map +1 -0
  21. package/dist/cli/dev-sync.js +500 -0
  22. package/dist/cli/dev-sync.js.map +1 -0
  23. package/dist/cli/execute-plugin-command.d.ts +25 -0
  24. package/dist/cli/execute-plugin-command.d.ts.map +1 -0
  25. package/dist/cli/execute-plugin-command.js +237 -0
  26. package/dist/cli/execute-plugin-command.js.map +1 -0
  27. package/dist/cli/fix.d.ts +22 -0
  28. package/dist/cli/fix.d.ts.map +1 -0
  29. package/dist/cli/fix.js +267 -0
  30. package/dist/cli/fix.js.map +1 -0
  31. package/dist/cli/index.d.ts +17 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +31 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/cli/init.d.ts +9 -0
  36. package/dist/cli/init.d.ts.map +1 -0
  37. package/dist/cli/init.js +190 -0
  38. package/dist/cli/init.js.map +1 -0
  39. package/dist/cli/plugin-commands.d.ts +22 -0
  40. package/dist/cli/plugin-commands.d.ts.map +1 -0
  41. package/dist/cli/plugin-commands.js +121 -0
  42. package/dist/cli/plugin-commands.js.map +1 -0
  43. package/dist/cli/scan.d.ts +66 -0
  44. package/dist/cli/scan.d.ts.map +1 -0
  45. package/dist/cli/scan.js +511 -0
  46. package/dist/cli/scan.js.map +1 -0
  47. package/dist/cli/secrets.d.ts +19 -0
  48. package/dist/cli/secrets.d.ts.map +1 -0
  49. package/dist/cli/secrets.js +318 -0
  50. package/dist/cli/secrets.js.map +1 -0
  51. package/dist/cli/undeploy.d.ts +9 -0
  52. package/dist/cli/undeploy.d.ts.map +1 -0
  53. package/dist/cli/undeploy.js +95 -0
  54. package/dist/cli/undeploy.js.map +1 -0
  55. package/dist/cli/upgrade.d.ts +9 -0
  56. package/dist/cli/upgrade.d.ts.map +1 -0
  57. package/dist/cli/upgrade.js +24 -0
  58. package/dist/cli/upgrade.js.map +1 -0
  59. package/dist/cli/validate.d.ts +9 -0
  60. package/dist/cli/validate.d.ts.map +1 -0
  61. package/dist/cli/validate.js +20 -0
  62. package/dist/cli/validate.js.map +1 -0
  63. package/dist/generators/generate-factiii-auto.d.ts +31 -0
  64. package/dist/generators/generate-factiii-auto.d.ts.map +1 -0
  65. package/dist/generators/generate-factiii-auto.js +251 -0
  66. package/dist/generators/generate-factiii-auto.js.map +1 -0
  67. package/dist/generators/generate-factiii-yml.d.ts +23 -0
  68. package/dist/generators/generate-factiii-yml.d.ts.map +1 -0
  69. package/dist/generators/generate-factiii-yml.js +228 -0
  70. package/dist/generators/generate-factiii-yml.js.map +1 -0
  71. package/dist/generators/index.d.ts +8 -0
  72. package/dist/generators/index.d.ts.map +1 -0
  73. package/dist/generators/index.js +14 -0
  74. package/dist/generators/index.js.map +1 -0
  75. package/dist/index.d.ts +39 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +90 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/plugins/addons/server-mode/index.d.ts +57 -0
  80. package/dist/plugins/addons/server-mode/index.d.ts.map +1 -0
  81. package/dist/plugins/addons/server-mode/index.js +136 -0
  82. package/dist/plugins/addons/server-mode/index.js.map +1 -0
  83. package/dist/plugins/addons/server-mode/scanfix/mac.d.ts +17 -0
  84. package/dist/plugins/addons/server-mode/scanfix/mac.d.ts.map +1 -0
  85. package/dist/plugins/addons/server-mode/scanfix/mac.js +461 -0
  86. package/dist/plugins/addons/server-mode/scanfix/mac.js.map +1 -0
  87. package/dist/plugins/addons/server-mode/scanfix/ubuntu.d.ts +12 -0
  88. package/dist/plugins/addons/server-mode/scanfix/ubuntu.d.ts.map +1 -0
  89. package/dist/plugins/addons/server-mode/scanfix/ubuntu.js +246 -0
  90. package/dist/plugins/addons/server-mode/scanfix/ubuntu.js.map +1 -0
  91. package/dist/plugins/addons/server-mode/scanfix/windows.d.ts +14 -0
  92. package/dist/plugins/addons/server-mode/scanfix/windows.d.ts.map +1 -0
  93. package/dist/plugins/addons/server-mode/scanfix/windows.js +113 -0
  94. package/dist/plugins/addons/server-mode/scanfix/windows.js.map +1 -0
  95. package/dist/plugins/approved.json +13 -0
  96. package/dist/plugins/frameworks/prisma-trpc/index.d.ts +65 -0
  97. package/dist/plugins/frameworks/prisma-trpc/index.d.ts.map +1 -0
  98. package/dist/plugins/frameworks/prisma-trpc/index.js +668 -0
  99. package/dist/plugins/frameworks/prisma-trpc/index.js.map +1 -0
  100. package/dist/plugins/index.d.ts +101 -0
  101. package/dist/plugins/index.d.ts.map +1 -0
  102. package/dist/plugins/index.js +411 -0
  103. package/dist/plugins/index.js.map +1 -0
  104. package/dist/plugins/interfaces/addon.d.ts +43 -0
  105. package/dist/plugins/interfaces/addon.d.ts.map +1 -0
  106. package/dist/plugins/interfaces/addon.js +53 -0
  107. package/dist/plugins/interfaces/addon.js.map +1 -0
  108. package/dist/plugins/interfaces/framework.d.ts +43 -0
  109. package/dist/plugins/interfaces/framework.d.ts.map +1 -0
  110. package/dist/plugins/interfaces/framework.js +53 -0
  111. package/dist/plugins/interfaces/framework.js.map +1 -0
  112. package/dist/plugins/interfaces/index.d.ts +10 -0
  113. package/dist/plugins/interfaces/index.d.ts.map +1 -0
  114. package/dist/plugins/interfaces/index.js +17 -0
  115. package/dist/plugins/interfaces/index.js.map +1 -0
  116. package/dist/plugins/interfaces/pipeline.d.ts +78 -0
  117. package/dist/plugins/interfaces/pipeline.d.ts.map +1 -0
  118. package/dist/plugins/interfaces/pipeline.js +82 -0
  119. package/dist/plugins/interfaces/pipeline.js.map +1 -0
  120. package/dist/plugins/interfaces/server.d.ts +65 -0
  121. package/dist/plugins/interfaces/server.d.ts.map +1 -0
  122. package/dist/plugins/interfaces/server.js +72 -0
  123. package/dist/plugins/interfaces/server.js.map +1 -0
  124. package/dist/plugins/pipelines/aws/configs/ec2.d.ts +9 -0
  125. package/dist/plugins/pipelines/aws/configs/ec2.d.ts.map +1 -0
  126. package/dist/plugins/pipelines/aws/configs/ec2.js +34 -0
  127. package/dist/plugins/pipelines/aws/configs/ec2.js.map +1 -0
  128. package/dist/plugins/pipelines/aws/configs/free-tier.d.ts +13 -0
  129. package/dist/plugins/pipelines/aws/configs/free-tier.d.ts.map +1 -0
  130. package/dist/plugins/pipelines/aws/configs/free-tier.js +86 -0
  131. package/dist/plugins/pipelines/aws/configs/free-tier.js.map +1 -0
  132. package/dist/plugins/pipelines/aws/configs/index.d.ts +14 -0
  133. package/dist/plugins/pipelines/aws/configs/index.d.ts.map +1 -0
  134. package/dist/plugins/pipelines/aws/configs/index.js +21 -0
  135. package/dist/plugins/pipelines/aws/configs/index.js.map +1 -0
  136. package/dist/plugins/pipelines/aws/configs/types.d.ts +36 -0
  137. package/dist/plugins/pipelines/aws/configs/types.d.ts.map +1 -0
  138. package/dist/plugins/pipelines/aws/configs/types.js +9 -0
  139. package/dist/plugins/pipelines/aws/configs/types.js.map +1 -0
  140. package/dist/plugins/pipelines/aws/dev.d.ts +10 -0
  141. package/dist/plugins/pipelines/aws/dev.d.ts.map +1 -0
  142. package/dist/plugins/pipelines/aws/dev.js +70 -0
  143. package/dist/plugins/pipelines/aws/dev.js.map +1 -0
  144. package/dist/plugins/pipelines/aws/index.d.ts +118 -0
  145. package/dist/plugins/pipelines/aws/index.d.ts.map +1 -0
  146. package/dist/plugins/pipelines/aws/index.js +346 -0
  147. package/dist/plugins/pipelines/aws/index.js.map +1 -0
  148. package/dist/plugins/pipelines/aws/prod.d.ts +19 -0
  149. package/dist/plugins/pipelines/aws/prod.d.ts.map +1 -0
  150. package/dist/plugins/pipelines/aws/prod.js +362 -0
  151. package/dist/plugins/pipelines/aws/prod.js.map +1 -0
  152. package/dist/plugins/pipelines/aws/scanfix/aws-cli.d.ts +7 -0
  153. package/dist/plugins/pipelines/aws/scanfix/aws-cli.d.ts.map +1 -0
  154. package/dist/plugins/pipelines/aws/scanfix/aws-cli.js +31 -0
  155. package/dist/plugins/pipelines/aws/scanfix/aws-cli.js.map +1 -0
  156. package/dist/plugins/pipelines/aws/scanfix/config.d.ts +7 -0
  157. package/dist/plugins/pipelines/aws/scanfix/config.d.ts.map +1 -0
  158. package/dist/plugins/pipelines/aws/scanfix/config.js +134 -0
  159. package/dist/plugins/pipelines/aws/scanfix/config.js.map +1 -0
  160. package/dist/plugins/pipelines/factiii/github-secrets-store.d.ts +65 -0
  161. package/dist/plugins/pipelines/factiii/github-secrets-store.d.ts.map +1 -0
  162. package/dist/plugins/pipelines/factiii/github-secrets-store.js +221 -0
  163. package/dist/plugins/pipelines/factiii/github-secrets-store.js.map +1 -0
  164. package/dist/plugins/pipelines/factiii/index.d.ts +195 -0
  165. package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -0
  166. package/dist/plugins/pipelines/factiii/index.js +862 -0
  167. package/dist/plugins/pipelines/factiii/index.js.map +1 -0
  168. package/dist/plugins/pipelines/factiii/prod.d.ts +17 -0
  169. package/dist/plugins/pipelines/factiii/prod.d.ts.map +1 -0
  170. package/dist/plugins/pipelines/factiii/prod.js +282 -0
  171. package/dist/plugins/pipelines/factiii/prod.js.map +1 -0
  172. package/dist/plugins/pipelines/factiii/scanfix/config.d.ts +7 -0
  173. package/dist/plugins/pipelines/factiii/scanfix/config.d.ts.map +1 -0
  174. package/dist/plugins/pipelines/factiii/scanfix/config.js +80 -0
  175. package/dist/plugins/pipelines/factiii/scanfix/config.js.map +1 -0
  176. package/dist/plugins/pipelines/factiii/scanfix/github-cli.d.ts +7 -0
  177. package/dist/plugins/pipelines/factiii/scanfix/github-cli.d.ts.map +1 -0
  178. package/dist/plugins/pipelines/factiii/scanfix/github-cli.js +43 -0
  179. package/dist/plugins/pipelines/factiii/scanfix/github-cli.js.map +1 -0
  180. package/dist/plugins/pipelines/factiii/scanfix/secrets.d.ts +7 -0
  181. package/dist/plugins/pipelines/factiii/scanfix/secrets.d.ts.map +1 -0
  182. package/dist/plugins/pipelines/factiii/scanfix/secrets.js +237 -0
  183. package/dist/plugins/pipelines/factiii/scanfix/secrets.js.map +1 -0
  184. package/dist/plugins/pipelines/factiii/scanfix/workflows.d.ts +7 -0
  185. package/dist/plugins/pipelines/factiii/scanfix/workflows.d.ts.map +1 -0
  186. package/dist/plugins/pipelines/factiii/scanfix/workflows.js +169 -0
  187. package/dist/plugins/pipelines/factiii/scanfix/workflows.js.map +1 -0
  188. package/dist/plugins/pipelines/factiii/staging.d.ts +25 -0
  189. package/dist/plugins/pipelines/factiii/staging.d.ts.map +1 -0
  190. package/dist/plugins/pipelines/factiii/staging.js +223 -0
  191. package/dist/plugins/pipelines/factiii/staging.js.map +1 -0
  192. package/dist/plugins/pipelines/factiii/utils/detection.d.ts +36 -0
  193. package/dist/plugins/pipelines/factiii/utils/detection.d.ts.map +1 -0
  194. package/dist/plugins/pipelines/factiii/utils/detection.js +140 -0
  195. package/dist/plugins/pipelines/factiii/utils/detection.js.map +1 -0
  196. package/dist/plugins/pipelines/factiii/utils/workflows.d.ts +16 -0
  197. package/dist/plugins/pipelines/factiii/utils/workflows.d.ts.map +1 -0
  198. package/dist/plugins/pipelines/factiii/utils/workflows.js +129 -0
  199. package/dist/plugins/pipelines/factiii/utils/workflows.js.map +1 -0
  200. package/dist/plugins/pipelines/factiii/workflows/factiii-cicd-prod.yml +112 -0
  201. package/dist/plugins/pipelines/factiii/workflows/factiii-cicd-staging.yml +112 -0
  202. package/dist/plugins/pipelines/factiii/workflows/factiii-command.yml +130 -0
  203. package/dist/plugins/pipelines/factiii/workflows/factiii-deploy.yml +198 -0
  204. package/dist/plugins/pipelines/factiii/workflows/factiii-dev-sync.yml +179 -0
  205. package/dist/plugins/pipelines/factiii/workflows/factiii-fix.yml +176 -0
  206. package/dist/plugins/pipelines/factiii/workflows/factiii-scan.yml +176 -0
  207. package/dist/plugins/pipelines/factiii/workflows/factiii-undeploy.yml +95 -0
  208. package/dist/plugins/servers/amazon-linux/index.d.ts +93 -0
  209. package/dist/plugins/servers/amazon-linux/index.d.ts.map +1 -0
  210. package/dist/plugins/servers/amazon-linux/index.js +217 -0
  211. package/dist/plugins/servers/amazon-linux/index.js.map +1 -0
  212. package/dist/plugins/servers/mac/dev.d.ts +10 -0
  213. package/dist/plugins/servers/mac/dev.d.ts.map +1 -0
  214. package/dist/plugins/servers/mac/dev.js +71 -0
  215. package/dist/plugins/servers/mac/dev.js.map +1 -0
  216. package/dist/plugins/servers/mac/index.d.ts +101 -0
  217. package/dist/plugins/servers/mac/index.d.ts.map +1 -0
  218. package/dist/plugins/servers/mac/index.js +257 -0
  219. package/dist/plugins/servers/mac/index.js.map +1 -0
  220. package/dist/plugins/servers/mac/scanfix/config.d.ts +7 -0
  221. package/dist/plugins/servers/mac/scanfix/config.d.ts.map +1 -0
  222. package/dist/plugins/servers/mac/scanfix/config.js +168 -0
  223. package/dist/plugins/servers/mac/scanfix/config.js.map +1 -0
  224. package/dist/plugins/servers/mac/scanfix/containers.d.ts +7 -0
  225. package/dist/plugins/servers/mac/scanfix/containers.d.ts.map +1 -0
  226. package/dist/plugins/servers/mac/scanfix/containers.js +167 -0
  227. package/dist/plugins/servers/mac/scanfix/containers.js.map +1 -0
  228. package/dist/plugins/servers/mac/scanfix/system.d.ts +7 -0
  229. package/dist/plugins/servers/mac/scanfix/system.d.ts.map +1 -0
  230. package/dist/plugins/servers/mac/scanfix/system.js +144 -0
  231. package/dist/plugins/servers/mac/scanfix/system.js.map +1 -0
  232. package/dist/plugins/servers/mac/staging.d.ts +21 -0
  233. package/dist/plugins/servers/mac/staging.d.ts.map +1 -0
  234. package/dist/plugins/servers/mac/staging.js +708 -0
  235. package/dist/plugins/servers/mac/staging.js.map +1 -0
  236. package/dist/plugins/servers/ubuntu/index.d.ts +93 -0
  237. package/dist/plugins/servers/ubuntu/index.d.ts.map +1 -0
  238. package/dist/plugins/servers/ubuntu/index.js +224 -0
  239. package/dist/plugins/servers/ubuntu/index.js.map +1 -0
  240. package/dist/plugins/servers/windows/index.d.ts +90 -0
  241. package/dist/plugins/servers/windows/index.d.ts.map +1 -0
  242. package/dist/plugins/servers/windows/index.js +205 -0
  243. package/dist/plugins/servers/windows/index.js.map +1 -0
  244. package/dist/scanfix/commands/index.d.ts +27 -0
  245. package/dist/scanfix/commands/index.d.ts.map +1 -0
  246. package/dist/scanfix/commands/index.js +97 -0
  247. package/dist/scanfix/commands/index.js.map +1 -0
  248. package/dist/scanfix/commands/mac.d.ts +11 -0
  249. package/dist/scanfix/commands/mac.d.ts.map +1 -0
  250. package/dist/scanfix/commands/mac.js +31 -0
  251. package/dist/scanfix/commands/mac.js.map +1 -0
  252. package/dist/scanfix/commands/ubuntu.d.ts +11 -0
  253. package/dist/scanfix/commands/ubuntu.d.ts.map +1 -0
  254. package/dist/scanfix/commands/ubuntu.js +30 -0
  255. package/dist/scanfix/commands/ubuntu.js.map +1 -0
  256. package/dist/scanfix/fixes/certbot.d.ts +25 -0
  257. package/dist/scanfix/fixes/certbot.d.ts.map +1 -0
  258. package/dist/scanfix/fixes/certbot.js +136 -0
  259. package/dist/scanfix/fixes/certbot.js.map +1 -0
  260. package/dist/scanfix/fixes/docker.d.ts +29 -0
  261. package/dist/scanfix/fixes/docker.d.ts.map +1 -0
  262. package/dist/scanfix/fixes/docker.js +149 -0
  263. package/dist/scanfix/fixes/docker.js.map +1 -0
  264. package/dist/scanfix/fixes/git.d.ts +20 -0
  265. package/dist/scanfix/fixes/git.d.ts.map +1 -0
  266. package/dist/scanfix/fixes/git.js +71 -0
  267. package/dist/scanfix/fixes/git.js.map +1 -0
  268. package/dist/scanfix/fixes/index.d.ts +11 -0
  269. package/dist/scanfix/fixes/index.d.ts.map +1 -0
  270. package/dist/scanfix/fixes/index.js +27 -0
  271. package/dist/scanfix/fixes/index.js.map +1 -0
  272. package/dist/scanfix/fixes/node.d.ts +20 -0
  273. package/dist/scanfix/fixes/node.d.ts.map +1 -0
  274. package/dist/scanfix/fixes/node.js +71 -0
  275. package/dist/scanfix/fixes/node.js.map +1 -0
  276. package/dist/scanfix/fixes/pnpm.d.ts +20 -0
  277. package/dist/scanfix/fixes/pnpm.d.ts.map +1 -0
  278. package/dist/scanfix/fixes/pnpm.js +122 -0
  279. package/dist/scanfix/fixes/pnpm.js.map +1 -0
  280. package/dist/scanfix/index.d.ts +23 -0
  281. package/dist/scanfix/index.d.ts.map +1 -0
  282. package/dist/scanfix/index.js +44 -0
  283. package/dist/scanfix/index.js.map +1 -0
  284. package/dist/scanfix/platform.d.ts +20 -0
  285. package/dist/scanfix/platform.d.ts.map +1 -0
  286. package/dist/scanfix/platform.js +48 -0
  287. package/dist/scanfix/platform.js.map +1 -0
  288. package/dist/scanfix/ssl-cert-helper.d.ts +27 -0
  289. package/dist/scanfix/ssl-cert-helper.d.ts.map +1 -0
  290. package/dist/scanfix/ssl-cert-helper.js +117 -0
  291. package/dist/scanfix/ssl-cert-helper.js.map +1 -0
  292. package/dist/scanfix/types.d.ts +27 -0
  293. package/dist/scanfix/types.d.ts.map +1 -0
  294. package/dist/scanfix/types.js +8 -0
  295. package/dist/scanfix/types.js.map +1 -0
  296. package/dist/scripts/check-existing-secrets.d.ts +6 -0
  297. package/dist/scripts/check-existing-secrets.d.ts.map +1 -0
  298. package/dist/scripts/check-existing-secrets.js +86 -0
  299. package/dist/scripts/check-existing-secrets.js.map +1 -0
  300. package/dist/scripts/generate-all.d.ts +40 -0
  301. package/dist/scripts/generate-all.d.ts.map +1 -0
  302. package/dist/scripts/generate-all.js +373 -0
  303. package/dist/scripts/generate-all.js.map +1 -0
  304. package/dist/scripts/get-repo-name.d.ts +6 -0
  305. package/dist/scripts/get-repo-name.d.ts.map +1 -0
  306. package/dist/scripts/get-repo-name.js +54 -0
  307. package/dist/scripts/get-repo-name.js.map +1 -0
  308. package/dist/scripts/index.d.ts +7 -0
  309. package/dist/scripts/index.d.ts.map +1 -0
  310. package/dist/scripts/index.js +14 -0
  311. package/dist/scripts/index.js.map +1 -0
  312. package/dist/scripts/validate-env-files.d.ts +6 -0
  313. package/dist/scripts/validate-env-files.d.ts.map +1 -0
  314. package/dist/scripts/validate-env-files.js +126 -0
  315. package/dist/scripts/validate-env-files.js.map +1 -0
  316. package/dist/scripts/validate-example-values.d.ts +8 -0
  317. package/dist/scripts/validate-example-values.d.ts.map +1 -0
  318. package/dist/scripts/validate-example-values.js +88 -0
  319. package/dist/scripts/validate-example-values.js.map +1 -0
  320. package/dist/scripts/validate-factiii-yml.d.ts +6 -0
  321. package/dist/scripts/validate-factiii-yml.d.ts.map +1 -0
  322. package/dist/scripts/validate-factiii-yml.js +71 -0
  323. package/dist/scripts/validate-factiii-yml.js.map +1 -0
  324. package/dist/types/cli.d.ts +138 -0
  325. package/dist/types/cli.d.ts.map +1 -0
  326. package/dist/types/cli.js +8 -0
  327. package/dist/types/cli.js.map +1 -0
  328. package/dist/types/config.d.ts +113 -0
  329. package/dist/types/config.d.ts.map +1 -0
  330. package/dist/types/config.js +8 -0
  331. package/dist/types/config.js.map +1 -0
  332. package/dist/types/index.d.ts +9 -0
  333. package/dist/types/index.d.ts.map +1 -0
  334. package/dist/types/index.js +25 -0
  335. package/dist/types/index.js.map +1 -0
  336. package/dist/types/plugin.d.ts +352 -0
  337. package/dist/types/plugin.d.ts.map +1 -0
  338. package/dist/types/plugin.js +8 -0
  339. package/dist/types/plugin.js.map +1 -0
  340. package/dist/utils/ansible-vault-secrets.d.ts +95 -0
  341. package/dist/utils/ansible-vault-secrets.d.ts.map +1 -0
  342. package/dist/utils/ansible-vault-secrets.js +406 -0
  343. package/dist/utils/ansible-vault-secrets.js.map +1 -0
  344. package/dist/utils/config-helpers.d.ts +72 -0
  345. package/dist/utils/config-helpers.d.ts.map +1 -0
  346. package/dist/utils/config-helpers.js +171 -0
  347. package/dist/utils/config-helpers.js.map +1 -0
  348. package/dist/utils/config-schema.d.ts +17 -0
  349. package/dist/utils/config-schema.d.ts.map +1 -0
  350. package/dist/utils/config-schema.js +100 -0
  351. package/dist/utils/config-schema.js.map +1 -0
  352. package/dist/utils/config-validator.d.ts +29 -0
  353. package/dist/utils/config-validator.d.ts.map +1 -0
  354. package/dist/utils/config-validator.js +146 -0
  355. package/dist/utils/config-validator.js.map +1 -0
  356. package/dist/utils/deployment-report.d.ts +100 -0
  357. package/dist/utils/deployment-report.d.ts.map +1 -0
  358. package/dist/utils/deployment-report.js +225 -0
  359. package/dist/utils/deployment-report.js.map +1 -0
  360. package/dist/utils/dns-validator.d.ts +19 -0
  361. package/dist/utils/dns-validator.d.ts.map +1 -0
  362. package/dist/utils/dns-validator.js +94 -0
  363. package/dist/utils/dns-validator.js.map +1 -0
  364. package/dist/utils/env-validator.d.ts +108 -0
  365. package/dist/utils/env-validator.d.ts.map +1 -0
  366. package/dist/utils/env-validator.js +342 -0
  367. package/dist/utils/env-validator.js.map +1 -0
  368. package/dist/utils/github-workflow-monitor.d.ts +49 -0
  369. package/dist/utils/github-workflow-monitor.d.ts.map +1 -0
  370. package/dist/utils/github-workflow-monitor.js +145 -0
  371. package/dist/utils/github-workflow-monitor.js.map +1 -0
  372. package/dist/utils/index.d.ts +18 -0
  373. package/dist/utils/index.d.ts.map +1 -0
  374. package/dist/utils/index.js +48 -0
  375. package/dist/utils/index.js.map +1 -0
  376. package/dist/utils/secret-prompts.d.ts +67 -0
  377. package/dist/utils/secret-prompts.d.ts.map +1 -0
  378. package/dist/utils/secret-prompts.js +369 -0
  379. package/dist/utils/secret-prompts.js.map +1 -0
  380. package/dist/utils/server-check.d.ts +43 -0
  381. package/dist/utils/server-check.d.ts.map +1 -0
  382. package/dist/utils/server-check.js +397 -0
  383. package/dist/utils/server-check.js.map +1 -0
  384. package/dist/utils/ssh-deploy.d.ts +70 -0
  385. package/dist/utils/ssh-deploy.d.ts.map +1 -0
  386. package/dist/utils/ssh-deploy.js +268 -0
  387. package/dist/utils/ssh-deploy.js.map +1 -0
  388. package/dist/utils/ssh-helper.d.ts +40 -0
  389. package/dist/utils/ssh-helper.d.ts.map +1 -0
  390. package/dist/utils/ssh-helper.js +221 -0
  391. package/dist/utils/ssh-helper.js.map +1 -0
  392. package/dist/utils/template-generator.d.ts +42 -0
  393. package/dist/utils/template-generator.d.ts.map +1 -0
  394. package/dist/utils/template-generator.js +223 -0
  395. package/dist/utils/template-generator.js.map +1 -0
  396. package/dist/utils/version-check.d.ts +69 -0
  397. package/dist/utils/version-check.d.ts.map +1 -0
  398. package/dist/utils/version-check.js +211 -0
  399. package/dist/utils/version-check.js.map +1 -0
  400. package/package.json +82 -0
@@ -0,0 +1,112 @@
1
+ name: Factiii CI/CD Prod
2
+
3
+ # Generated by @factiii/stack v{VERSION}
4
+ # CI/CD: Auto-deploy to prod on push to prod branch
5
+ # This is the app's CI/CD pipeline, NOT infrastructure management.
6
+ # For manual infrastructure operations, use factiii-deploy.yml
7
+
8
+ on:
9
+ push:
10
+ branches:
11
+ - prod
12
+
13
+ jobs:
14
+ deploy:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout code
18
+ uses: actions/checkout@v4
19
+
20
+ - name: Install yq
21
+ run: |
22
+ sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
23
+ sudo chmod +x /usr/local/bin/yq
24
+
25
+ - name: Read config
26
+ id: config
27
+ run: |
28
+ if [ ! -f "factiii.yml" ]; then
29
+ echo "❌ factiii.yml not found"
30
+ exit 1
31
+ fi
32
+
33
+ REPO_NAME=$(yq eval '.name' factiii.yml)
34
+ HOST=$(yq eval '.prod.domain // ""' factiii.yml)
35
+ SSH_USER=$(yq eval '.prod.ssh_user // "ubuntu"' factiii.yml)
36
+
37
+ echo "repo_name=$REPO_NAME" >> $GITHUB_OUTPUT
38
+ echo "host=$HOST" >> $GITHUB_OUTPUT
39
+ echo "ssh_user=$SSH_USER" >> $GITHUB_OUTPUT
40
+
41
+ - name: Check if prod configured
42
+ id: check_prod
43
+ run: |
44
+ HAS_PROD=$(yq eval '.prod != null' factiii.yml)
45
+ echo "has_prod=$HAS_PROD" >> $GITHUB_OUTPUT
46
+
47
+ if [ "$HAS_PROD" != "true" ]; then
48
+ echo "⏭️ Prod environment not configured in factiii.yml - skipping deployment"
49
+ exit 0
50
+ fi
51
+
52
+ - name: Setup SSH
53
+ if: steps.check_prod.outputs.has_prod == 'true'
54
+ env:
55
+ SSH_KEY: ${{ secrets.PROD_SSH }}
56
+ run: |
57
+ if [ -z "$SSH_KEY" ]; then
58
+ echo "❌ Missing PROD_SSH secret"
59
+ exit 1
60
+ fi
61
+
62
+ mkdir -p ~/.ssh
63
+ echo "$SSH_KEY" > ~/.ssh/deploy_key
64
+ chmod 600 ~/.ssh/deploy_key
65
+
66
+ - name: Deploy via CLI
67
+ if: steps.check_prod.outputs.has_prod == 'true'
68
+ env:
69
+ HOST: ${{ steps.config.outputs.host }}
70
+ USER: ${{ steps.config.outputs.ssh_user }}
71
+ REPO_NAME: ${{ steps.config.outputs.repo_name }}
72
+ COMMIT_HASH: ${{ github.sha }}
73
+ BRANCH: ${{ github.ref_name }}
74
+ GITHUB_REPO: ${{ github.repository }}
75
+ PROD_ENVS: ${{ secrets.PROD_ENVS }}
76
+ run: |
77
+ if [ -z "$HOST" ]; then
78
+ echo "❌ Missing domain in factiii.yml: prod.domain"
79
+ exit 1
80
+ fi
81
+
82
+ echo "🚀 Deploying to prod ($HOST)..."
83
+
84
+ # Prepare environment variables for SSH (base64 encode to handle special characters)
85
+ ENV_VARS_EXPORT=""
86
+ if [ -n "$PROD_ENVS" ]; then
87
+ ENV_VARS_B64=$(echo -n "$PROD_ENVS" | base64 -w 0)
88
+ ENV_VARS_EXPORT="PROD_ENVS=\$(echo '$ENV_VARS_B64' | base64 -d) && export PROD_ENVS && "
89
+ fi
90
+
91
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" \
92
+ "export PATH=\"/opt/homebrew/bin:/usr/local/bin:\$PATH\" && \
93
+ REPO_DIR=\"\$HOME/.factiii/$REPO_NAME\" && \
94
+ if [ -d \"\$REPO_DIR\" ]; then \
95
+ cd \"\$REPO_DIR\" && \
96
+ $ENV_VARS_EXPORT GITHUB_ACTIONS=true COMMIT_HASH=$COMMIT_HASH BRANCH=$BRANCH GITHUB_REPO=$GITHUB_REPO \
97
+ npx factiii deploy --prod --commit $COMMIT_HASH --branch $BRANCH; \
98
+ else \
99
+ echo \"❌ Repo directory not found at \$REPO_DIR\"; \
100
+ echo \"Run deployment first to clone the repository\"; \
101
+ exit 1; \
102
+ fi"
103
+
104
+ DEPLOY_EXIT_CODE=$?
105
+ rm -f ~/.ssh/deploy_key
106
+
107
+ if [ $DEPLOY_EXIT_CODE -eq 0 ]; then
108
+ echo "✅ Prod deployment complete!"
109
+ else
110
+ echo "❌ Prod deployment failed with exit code $DEPLOY_EXIT_CODE"
111
+ exit $DEPLOY_EXIT_CODE
112
+ fi
@@ -0,0 +1,112 @@
1
+ name: Factiii CI/CD Staging
2
+
3
+ # Generated by @factiii/stack v{VERSION}
4
+ # CI/CD: Auto-deploy to staging on push to main branch
5
+ # This is the app's CI/CD pipeline, NOT infrastructure management.
6
+ # For manual infrastructure operations, use factiii-deploy.yml
7
+
8
+ on:
9
+ push:
10
+ branches:
11
+ - main
12
+
13
+ jobs:
14
+ deploy:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - name: Checkout code
18
+ uses: actions/checkout@v4
19
+
20
+ - name: Install yq
21
+ run: |
22
+ sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
23
+ sudo chmod +x /usr/local/bin/yq
24
+
25
+ - name: Read config
26
+ id: config
27
+ run: |
28
+ if [ ! -f "factiii.yml" ]; then
29
+ echo "❌ factiii.yml not found"
30
+ exit 1
31
+ fi
32
+
33
+ REPO_NAME=$(yq eval '.name' factiii.yml)
34
+ HOST=$(yq eval '.staging.domain // ""' factiii.yml)
35
+ SSH_USER=$(yq eval '.staging.ssh_user // "ubuntu"' factiii.yml)
36
+
37
+ echo "repo_name=$REPO_NAME" >> $GITHUB_OUTPUT
38
+ echo "host=$HOST" >> $GITHUB_OUTPUT
39
+ echo "ssh_user=$SSH_USER" >> $GITHUB_OUTPUT
40
+
41
+ - name: Check if staging configured
42
+ id: check_staging
43
+ run: |
44
+ HAS_STAGING=$(yq eval '.staging != null' factiii.yml)
45
+ echo "has_staging=$HAS_STAGING" >> $GITHUB_OUTPUT
46
+
47
+ if [ "$HAS_STAGING" != "true" ]; then
48
+ echo "⏭️ Staging environment not configured in factiii.yml - skipping deployment"
49
+ exit 0
50
+ fi
51
+
52
+ - name: Setup SSH
53
+ if: steps.check_staging.outputs.has_staging == 'true'
54
+ env:
55
+ SSH_KEY: ${{ secrets.STAGING_SSH }}
56
+ run: |
57
+ if [ -z "$SSH_KEY" ]; then
58
+ echo "❌ Missing STAGING_SSH secret"
59
+ exit 1
60
+ fi
61
+
62
+ mkdir -p ~/.ssh
63
+ echo "$SSH_KEY" > ~/.ssh/deploy_key
64
+ chmod 600 ~/.ssh/deploy_key
65
+
66
+ - name: Deploy via CLI
67
+ if: steps.check_staging.outputs.has_staging == 'true'
68
+ env:
69
+ HOST: ${{ steps.config.outputs.host }}
70
+ USER: ${{ steps.config.outputs.ssh_user }}
71
+ REPO_NAME: ${{ steps.config.outputs.repo_name }}
72
+ COMMIT_HASH: ${{ github.sha }}
73
+ BRANCH: ${{ github.ref_name }}
74
+ GITHUB_REPO: ${{ github.repository }}
75
+ STAGING_ENVS: ${{ secrets.STAGING_ENVS }}
76
+ run: |
77
+ if [ -z "$HOST" ]; then
78
+ echo "❌ Missing domain in factiii.yml: staging.domain"
79
+ exit 1
80
+ fi
81
+
82
+ echo "🚀 Deploying to staging ($HOST)..."
83
+
84
+ # Prepare environment variables for SSH (base64 encode to handle special characters)
85
+ ENV_VARS_EXPORT=""
86
+ if [ -n "$STAGING_ENVS" ]; then
87
+ ENV_VARS_B64=$(echo -n "$STAGING_ENVS" | base64 -w 0)
88
+ ENV_VARS_EXPORT="STAGING_ENVS=\$(echo '$ENV_VARS_B64' | base64 -d) && export STAGING_ENVS && "
89
+ fi
90
+
91
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" \
92
+ "export PATH=\"/opt/homebrew/bin:/usr/local/bin:\$PATH\" && \
93
+ REPO_DIR=\"\$HOME/.factiii/$REPO_NAME\" && \
94
+ if [ -d \"\$REPO_DIR\" ]; then \
95
+ cd \"\$REPO_DIR\" && \
96
+ $ENV_VARS_EXPORT GITHUB_ACTIONS=true COMMIT_HASH=$COMMIT_HASH BRANCH=$BRANCH GITHUB_REPO=$GITHUB_REPO \
97
+ npx factiii deploy --staging --commit $COMMIT_HASH --branch $BRANCH; \
98
+ else \
99
+ echo \"❌ Repo directory not found at \$REPO_DIR\"; \
100
+ echo \"Run deployment first to clone the repository\"; \
101
+ exit 1; \
102
+ fi"
103
+
104
+ DEPLOY_EXIT_CODE=$?
105
+ rm -f ~/.ssh/deploy_key
106
+
107
+ if [ $DEPLOY_EXIT_CODE -eq 0 ]; then
108
+ echo "✅ Staging deployment complete!"
109
+ else
110
+ echo "❌ Staging deployment failed with exit code $DEPLOY_EXIT_CODE"
111
+ exit $DEPLOY_EXIT_CODE
112
+ fi
@@ -0,0 +1,130 @@
1
+ name: Factiii Command
2
+
3
+ # Generated by @factiii/stack v{VERSION}
4
+ # INFRASTRUCTURE: Run plugin commands on remote servers
5
+ # Run: npx factiii db seed --staging (triggers this workflow)
6
+
7
+ on:
8
+ workflow_dispatch:
9
+ inputs:
10
+ category:
11
+ description: 'Command category (db, ops, backup)'
12
+ required: true
13
+ type: string
14
+ command:
15
+ description: 'Command to run (e.g., seed, migrate, logs)'
16
+ required: true
17
+ type: string
18
+ stage:
19
+ description: 'Target environment'
20
+ required: true
21
+ type: choice
22
+ options:
23
+ - staging
24
+ - prod
25
+ options:
26
+ description: 'Command options (JSON)'
27
+ required: false
28
+ default: '{}'
29
+
30
+ jobs:
31
+ run-command:
32
+ runs-on: ubuntu-latest
33
+ steps:
34
+ - name: Checkout code
35
+ uses: actions/checkout@v4
36
+
37
+ - name: Install yq
38
+ run: |
39
+ sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
40
+ sudo chmod +x /usr/local/bin/yq
41
+
42
+ - name: Read config
43
+ id: config
44
+ env:
45
+ STAGE: ${{ inputs.stage }}
46
+ run: |
47
+ if [ ! -f "factiii.yml" ]; then
48
+ echo "factiii.yml not found"
49
+ exit 1
50
+ fi
51
+
52
+ REPO_NAME=$(yq eval '.name' factiii.yml)
53
+ HOST=$(yq eval ".$STAGE.domain // \"\"" factiii.yml)
54
+ SSH_USER=$(yq eval ".$STAGE.ssh_user // \"ubuntu\"" factiii.yml)
55
+
56
+ echo "repo_name=$REPO_NAME" >> $GITHUB_OUTPUT
57
+ echo "host=$HOST" >> $GITHUB_OUTPUT
58
+ echo "ssh_user=$SSH_USER" >> $GITHUB_OUTPUT
59
+
60
+ - name: Check environment configured
61
+ env:
62
+ STAGE: ${{ inputs.stage }}
63
+ run: |
64
+ HAS_ENV=$(yq eval ".$STAGE != null" factiii.yml)
65
+ if [ "$HAS_ENV" != "true" ]; then
66
+ echo "$STAGE environment not configured in factiii.yml"
67
+ exit 1
68
+ fi
69
+
70
+ - name: Check SSH secret
71
+ env:
72
+ STAGE: ${{ inputs.stage }}
73
+ SSH_KEY: ${{ inputs.stage == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
74
+ run: |
75
+ if [ -z "$SSH_KEY" ]; then
76
+ SECRET_NAME="${STAGE^^}_SSH"
77
+ echo "${SECRET_NAME} secret not found"
78
+ echo "Add it at: https://github.com/${{ github.repository }}/settings/secrets/actions"
79
+ exit 1
80
+ fi
81
+
82
+ - name: Setup SSH
83
+ env:
84
+ SSH_KEY: ${{ inputs.stage == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
85
+ run: |
86
+ mkdir -p ~/.ssh
87
+ echo "$SSH_KEY" > ~/.ssh/deploy_key
88
+ chmod 600 ~/.ssh/deploy_key
89
+
90
+ - name: Run command via SSH
91
+ env:
92
+ HOST: ${{ steps.config.outputs.host }}
93
+ USER: ${{ steps.config.outputs.ssh_user }}
94
+ REPO_NAME: ${{ steps.config.outputs.repo_name }}
95
+ CATEGORY: ${{ inputs.category }}
96
+ COMMAND: ${{ inputs.command }}
97
+ STAGE: ${{ inputs.stage }}
98
+ run: |
99
+ if [ -z "$HOST" ]; then
100
+ echo "Missing domain in factiii.yml: $STAGE.domain"
101
+ exit 1
102
+ fi
103
+
104
+ echo "Running: factiii $CATEGORY $COMMAND --$STAGE"
105
+ echo "Server: $USER@$HOST"
106
+ echo ""
107
+
108
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no -o ConnectTimeout=10 -o ServerAliveInterval=60 -o ServerAliveCountMax=5 "$USER@$HOST" \
109
+ "export PATH=\"/opt/homebrew/bin:/usr/local/bin:\$PATH\" && \
110
+ REPO_DIR=\"\$HOME/.factiii/$REPO_NAME\" && \
111
+ if [ -d \"\$REPO_DIR\" ]; then \
112
+ cd \"\$REPO_DIR\" && \
113
+ GITHUB_ACTIONS=true npx factiii $CATEGORY $COMMAND --$STAGE; \
114
+ else \
115
+ echo \"Repo directory not found at \$REPO_DIR\"; \
116
+ echo \"Run deployment first to clone the repository\"; \
117
+ exit 1; \
118
+ fi"
119
+
120
+ EXIT_CODE=$?
121
+ rm -f ~/.ssh/deploy_key
122
+
123
+ if [ $EXIT_CODE -eq 0 ]; then
124
+ echo ""
125
+ echo "Command completed successfully"
126
+ else
127
+ echo ""
128
+ echo "Command failed with exit code $EXIT_CODE"
129
+ exit $EXIT_CODE
130
+ fi
@@ -0,0 +1,198 @@
1
+ name: Factiii Deploy
2
+
3
+ # Generated by @factiii/stack v{VERSION}
4
+ # INFRASTRUCTURE: Manual deployment triggered via CLI
5
+ # Run: npx factiii deploy --staging or npx factiii deploy --prod
6
+ # For auto-deploy on push, see factiii-cicd-staging.yml / factiii-cicd-prod.yml
7
+
8
+ on:
9
+ workflow_dispatch:
10
+ inputs:
11
+ environment:
12
+ description: 'Environment to deploy'
13
+ required: true
14
+ type: choice
15
+ options:
16
+ - staging
17
+ - prod
18
+
19
+ jobs:
20
+ deploy:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - name: Checkout code
24
+ uses: actions/checkout@v4
25
+
26
+ - name: Install yq
27
+ run: |
28
+ sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
29
+ sudo chmod +x /usr/local/bin/yq
30
+
31
+ - name: Read config
32
+ id: config
33
+ run: |
34
+ if [ ! -f "factiii.yml" ]; then
35
+ echo "❌ factiii.yml not found"
36
+ exit 1
37
+ fi
38
+
39
+ REPO_NAME=$(yq eval '.name' factiii.yml)
40
+
41
+ if [ "${{ inputs.environment }}" == "staging" ]; then
42
+ HOST=$(yq eval '.staging.domain // ""' factiii.yml)
43
+ SSH_USER=$(yq eval '.staging.ssh_user // "ubuntu"' factiii.yml)
44
+ else
45
+ HOST=$(yq eval '.prod.domain // ""' factiii.yml)
46
+ SSH_USER=$(yq eval '.prod.ssh_user // "ubuntu"' factiii.yml)
47
+ fi
48
+
49
+ echo "repo_name=$REPO_NAME" >> $GITHUB_OUTPUT
50
+ echo "host=$HOST" >> $GITHUB_OUTPUT
51
+ echo "ssh_user=$SSH_USER" >> $GITHUB_OUTPUT
52
+
53
+ - name: Check if environment configured
54
+ id: check_env
55
+ run: |
56
+ if [ "${{ inputs.environment }}" == "staging" ]; then
57
+ HAS_ENV=$(yq eval '.staging != null' factiii.yml)
58
+ else
59
+ HAS_ENV=$(yq eval '.prod != null' factiii.yml)
60
+ fi
61
+
62
+ echo "has_env=$HAS_ENV" >> $GITHUB_OUTPUT
63
+
64
+ if [ "$HAS_ENV" != "true" ]; then
65
+ echo "⏭️ ${{ inputs.environment }} environment not configured in factiii.yml"
66
+ exit 1
67
+ fi
68
+
69
+ - name: Read staging config (for prod builds)
70
+ if: steps.check_env.outputs.has_env == 'true' && inputs.environment == 'prod'
71
+ id: staging_config
72
+ run: |
73
+ STAGING_HOST=$(yq eval '.staging.domain // ""' factiii.yml)
74
+ STAGING_SSH_USER=$(yq eval '.staging.ssh_user // "ubuntu"' factiii.yml)
75
+
76
+ echo "staging_host=$STAGING_HOST" >> $GITHUB_OUTPUT
77
+ echo "staging_ssh_user=$STAGING_SSH_USER" >> $GITHUB_OUTPUT
78
+
79
+ - name: Setup Node.js
80
+ if: steps.check_env.outputs.has_env == 'true'
81
+ uses: actions/setup-node@v4
82
+ with:
83
+ node-version: '20'
84
+
85
+ - name: Load SSH keys from Ansible Vault
86
+ if: steps.check_env.outputs.has_env == 'true'
87
+ env:
88
+ ANSIBLE_VAULT_PASSWORD: ${{ secrets.ANSIBLE_VAULT_PASSWORD }}
89
+ run: |
90
+ if [ -z "$ANSIBLE_VAULT_PASSWORD" ]; then
91
+ echo "❌ Missing ANSIBLE_VAULT_PASSWORD secret (vault password)"
92
+ exit 1
93
+ fi
94
+
95
+ npx factiii secrets write-ssh-keys
96
+
97
+ # Create deploy_key symlink for current environment
98
+ if [ "${{ inputs.environment }}" == "staging" ]; then
99
+ ln -sf ~/.ssh/staging_deploy_key ~/.ssh/deploy_key
100
+ else
101
+ ln -sf ~/.ssh/prod_deploy_key ~/.ssh/deploy_key
102
+ fi
103
+
104
+ - name: Build production image on staging (prod only)
105
+ if: steps.check_env.outputs.has_env == 'true' && inputs.environment == 'prod'
106
+ env:
107
+ STAGING_HOST: ${{ steps.staging_config.outputs.staging_host }}
108
+ STAGING_USER: ${{ steps.staging_config.outputs.staging_ssh_user }}
109
+ REPO_NAME: ${{ steps.config.outputs.repo_name }}
110
+ COMMIT_HASH: ${{ github.sha }}
111
+ BRANCH: ${{ github.ref_name }}
112
+ GITHUB_REPO: ${{ github.repository }}
113
+ run: |
114
+ if [ -z "$STAGING_HOST" ]; then
115
+ echo "⚠️ Staging host not configured, skipping build step"
116
+ exit 0
117
+ fi
118
+
119
+ echo "🔨 Building production image on staging server ($STAGING_HOST)..."
120
+
121
+ ssh -i ~/.ssh/staging_deploy_key -o StrictHostKeyChecking=no "$STAGING_USER@$STAGING_HOST" \
122
+ "export PATH=\"/opt/homebrew/bin:/usr/local/bin:\$PATH\" && \
123
+ REPO_DIR=\"\$HOME/.factiii/$REPO_NAME\" && \
124
+ if [ -d \"\$REPO_DIR\" ]; then \
125
+ cd \"\$REPO_DIR\" && \
126
+ GITHUB_ACTIONS=true COMMIT_HASH=$COMMIT_HASH BRANCH=$BRANCH GITHUB_REPO=$GITHUB_REPO \
127
+ npx factiii deploy --prod --commit $COMMIT_HASH --branch $BRANCH; \
128
+ else \
129
+ echo \"❌ Repo directory not found at \$REPO_DIR\"; \
130
+ exit 1; \
131
+ fi"
132
+
133
+ BUILD_EXIT_CODE=$?
134
+ if [ $BUILD_EXIT_CODE -ne 0 ]; then
135
+ echo "❌ Build step failed with exit code $BUILD_EXIT_CODE"
136
+ exit $BUILD_EXIT_CODE
137
+ fi
138
+
139
+ echo "✅ Production image built and pushed to ECR"
140
+
141
+ - name: Deploy via CLI
142
+ if: steps.check_env.outputs.has_env == 'true'
143
+ env:
144
+ HOST: ${{ steps.config.outputs.host }}
145
+ USER: ${{ steps.config.outputs.ssh_user }}
146
+ REPO_NAME: ${{ steps.config.outputs.repo_name }}
147
+ ENVIRONMENT: ${{ inputs.environment }}
148
+ COMMIT_HASH: ${{ github.sha }}
149
+ BRANCH: ${{ github.ref_name }}
150
+ GITHUB_REPO: ${{ github.repository }}
151
+ STAGING_ENVS: ${{ inputs.environment == 'staging' && secrets.STAGING_ENVS || '' }}
152
+ PROD_ENVS: ${{ inputs.environment == 'prod' && secrets.PROD_ENVS || '' }}
153
+ run: |
154
+ if [ -z "$HOST" ]; then
155
+ echo "❌ Missing domain in factiii.yml: $ENVIRONMENT.domain"
156
+ exit 1
157
+ fi
158
+
159
+ echo "🚀 Deploying to $ENVIRONMENT ($HOST)..."
160
+
161
+ # For prod, skip build step (already done in previous step)
162
+ SKIP_BUILD_FLAG=""
163
+ if [ "$ENVIRONMENT" == "prod" ]; then
164
+ SKIP_BUILD_FLAG="SKIP_BUILD=true"
165
+ fi
166
+
167
+ # Prepare environment variables for SSH (base64 encode to handle special characters)
168
+ ENV_VARS_EXPORT=""
169
+ if [ "$ENVIRONMENT" == "staging" ] && [ -n "$STAGING_ENVS" ]; then
170
+ ENV_VARS_B64=$(echo -n "$STAGING_ENVS" | base64 -w 0)
171
+ ENV_VARS_EXPORT="STAGING_ENVS=\$(echo '$ENV_VARS_B64' | base64 -d) && export STAGING_ENVS && "
172
+ elif [ "$ENVIRONMENT" == "prod" ] && [ -n "$PROD_ENVS" ]; then
173
+ ENV_VARS_B64=$(echo -n "$PROD_ENVS" | base64 -w 0)
174
+ ENV_VARS_EXPORT="PROD_ENVS=\$(echo '$ENV_VARS_B64' | base64 -d) && export PROD_ENVS && "
175
+ fi
176
+
177
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" \
178
+ "export PATH=\"/opt/homebrew/bin:/usr/local/bin:\$PATH\" && \
179
+ REPO_DIR=\"\$HOME/.factiii/$REPO_NAME\" && \
180
+ if [ -d \"\$REPO_DIR\" ]; then \
181
+ cd \"\$REPO_DIR\" && \
182
+ $ENV_VARS_EXPORT$SKIP_BUILD_FLAG GITHUB_ACTIONS=true COMMIT_HASH=$COMMIT_HASH BRANCH=$BRANCH GITHUB_REPO=$GITHUB_REPO \
183
+ npx factiii deploy --$ENVIRONMENT --commit $COMMIT_HASH --branch $BRANCH; \
184
+ else \
185
+ echo \"❌ Repo directory not found at \$REPO_DIR\"; \
186
+ echo \"Run deployment first to clone the repository\"; \
187
+ exit 1; \
188
+ fi"
189
+
190
+ DEPLOY_EXIT_CODE=$?
191
+ rm -f ~/.ssh/deploy_key ~/.ssh/staging_deploy_key ~/.ssh/prod_deploy_key
192
+
193
+ if [ $DEPLOY_EXIT_CODE -eq 0 ]; then
194
+ echo "✅ Deployment complete!"
195
+ else
196
+ echo "❌ Deployment failed with exit code $DEPLOY_EXIT_CODE"
197
+ exit $DEPLOY_EXIT_CODE
198
+ fi