@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,179 @@
1
+ name: Factiii Dev Sync
2
+
3
+ # Generated by @factiii/stack v{VERSION}
4
+ # DEV/TESTING ONLY - Deploys locally built infrastructure for testing beta features
5
+ # This workflow receives infrastructure changes and deploys them to servers
6
+ # Use: npx factiii dev-sync
7
+ #
8
+ # ⚠️ WARNING: This is for developing @factiii/stack itself, not for app deployments
9
+ # Only use this when testing new infrastructure features before releasing them
10
+
11
+ on:
12
+ workflow_dispatch:
13
+ inputs:
14
+ environment:
15
+ description: 'Environment to sync'
16
+ required: true
17
+ type: choice
18
+ options:
19
+ - staging
20
+ - prod
21
+ release_id:
22
+ description: 'GitHub Release ID containing artifact'
23
+ required: true
24
+ type: string
25
+ asset_id:
26
+ description: 'Release Asset ID for infrastructure tarball'
27
+ required: true
28
+ type: string
29
+ deploy:
30
+ description: 'Deploy after syncing'
31
+ required: false
32
+ type: boolean
33
+ default: false
34
+
35
+ jobs:
36
+ dev-sync:
37
+ runs-on: ubuntu-latest
38
+ steps:
39
+ - name: Checkout code
40
+ uses: actions/checkout@v4
41
+
42
+ - name: Install yq
43
+ run: |
44
+ sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
45
+ sudo chmod +x /usr/local/bin/yq
46
+
47
+ - name: Read config
48
+ id: config
49
+ run: |
50
+ if [ ! -f "factiii.yml" ]; then
51
+ echo "❌ factiii.yml not found"
52
+ exit 1
53
+ fi
54
+
55
+ REPO_NAME=$(yq eval '.name' factiii.yml)
56
+
57
+ if [ "${{ inputs.environment }}" == "staging" ]; then
58
+ HOST=$(yq eval '.environments.staging.domain // ""' factiii.yml)
59
+ SSH_USER=$(yq eval '.environments.staging.ssh_user // "ubuntu"' factiii.yml)
60
+ else
61
+ HOST=$(yq eval '.environments.prod.domain // ""' factiii.yml)
62
+ SSH_USER=$(yq eval '.environments.prod.ssh_user // "ubuntu"' factiii.yml)
63
+ fi
64
+
65
+ echo "repo_name=$REPO_NAME" >> $GITHUB_OUTPUT
66
+ echo "host=$HOST" >> $GITHUB_OUTPUT
67
+ echo "ssh_user=$SSH_USER" >> $GITHUB_OUTPUT
68
+
69
+ - name: Check if environment configured
70
+ id: check_env
71
+ run: |
72
+ if [ "${{ inputs.environment }}" == "staging" ]; then
73
+ HAS_ENV=$(yq eval '.environments.staging != null' factiii.yml)
74
+ else
75
+ HAS_ENV=$(yq eval '.environments.prod != null' factiii.yml)
76
+ fi
77
+
78
+ echo "has_env=$HAS_ENV" >> $GITHUB_OUTPUT
79
+
80
+ if [ "$HAS_ENV" != "true" ]; then
81
+ echo "⏭️ ${{ inputs.environment }} environment not configured in factiii.yml"
82
+ exit 1
83
+ fi
84
+
85
+ - name: Setup SSH
86
+ if: steps.check_env.outputs.has_env == 'true'
87
+ env:
88
+ SSH_KEY: ${{ inputs.environment == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
89
+ run: |
90
+ if [ -z "$SSH_KEY" ]; then
91
+ echo "❌ Missing ${{ inputs.environment == 'staging' && 'STAGING_SSH' || 'PROD_SSH' }} secret"
92
+ exit 1
93
+ fi
94
+
95
+ mkdir -p ~/.ssh
96
+ echo "$SSH_KEY" > ~/.ssh/deploy_key
97
+ chmod 600 ~/.ssh/deploy_key
98
+
99
+ - name: Download infrastructure artifact from release
100
+ if: steps.check_env.outputs.has_env == 'true'
101
+ env:
102
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
103
+ RELEASE_ID: ${{ inputs.release_id }}
104
+ ASSET_ID: ${{ inputs.asset_id }}
105
+ run: |
106
+ echo "⚠️ DEV SYNC MODE - Using infrastructure from local build"
107
+ echo " This syncs uncommitted infrastructure changes for testing"
108
+ echo " Release ID: $RELEASE_ID"
109
+ echo " Asset ID: $ASSET_ID"
110
+
111
+ echo "📦 Downloading infrastructure artifact..."
112
+
113
+ # Download release asset using GitHub API
114
+ curl -L \
115
+ -H "Accept: application/octet-stream" \
116
+ -H "Authorization: Bearer $GITHUB_TOKEN" \
117
+ -H "X-GitHub-Api-Version: 2022-11-28" \
118
+ "https://api.github.com/repos/${{ github.repository }}/releases/assets/$ASSET_ID" \
119
+ -o infrastructure.tar.gz
120
+
121
+ # Verify download
122
+ if [ ! -f infrastructure.tar.gz ]; then
123
+ echo "❌ Failed to download artifact"
124
+ exit 1
125
+ fi
126
+
127
+ SIZE=$(du -h infrastructure.tar.gz | cut -f1)
128
+ echo "✅ Downloaded artifact ($SIZE)"
129
+
130
+ - name: Deploy infrastructure to server
131
+ if: steps.check_env.outputs.has_env == 'true'
132
+ env:
133
+ HOST: ${{ steps.config.outputs.host }}
134
+ USER: ${{ steps.config.outputs.ssh_user }}
135
+ DEPLOY: ${{ inputs.deploy }}
136
+ REPO_NAME: ${{ steps.config.outputs.repo_name }}
137
+ ENVIRONMENT: ${{ inputs.environment }}
138
+ run: |
139
+ if [ -z "$HOST" ]; then
140
+ echo "❌ Missing domain in factiii.yml: environments.$ENVIRONMENT.domain"
141
+ exit 1
142
+ fi
143
+
144
+ echo "🚀 Syncing infrastructure to $ENVIRONMENT ($HOST)..."
145
+
146
+ # Copy infrastructure to server
147
+ echo "📤 Uploading infrastructure package..."
148
+ scp -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no infrastructure.tar.gz "$USER@$HOST:/tmp/"
149
+
150
+ # Extract and setup on server
151
+ echo "📦 Extracting infrastructure on server..."
152
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" \
153
+ "export PATH=\"/opt/homebrew/bin:/usr/local/bin:\$PATH\" && \
154
+ echo \"📦 Setting up infrastructure...\" && \
155
+ mkdir -p ~/.factiii/infrastructure && \
156
+ cd ~/.factiii/infrastructure && \
157
+ tar -xzf /tmp/infrastructure.tar.gz && \
158
+ rm /tmp/infrastructure.tar.gz && \
159
+ echo \"\" && \
160
+ echo \"📋 Verifying version...\" && \
161
+ VERSION=\$(cat package.json | grep '\"version\"' | head -1 | sed 's/.*: \"\(.*\)\".*/\1/') && \
162
+ echo \" Version: \$VERSION\" && \
163
+ echo \"\" && \
164
+ echo \"✅ Infrastructure synced successfully\""
165
+
166
+ # Optionally deploy
167
+ if [ "$DEPLOY" == "true" ]; then
168
+ echo ""
169
+ echo "🚀 Deploying to $ENVIRONMENT..."
170
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" \
171
+ "export PATH=\"/opt/homebrew/bin:/usr/local/bin:\$PATH\" && \
172
+ cd ~/.factiii/$REPO_NAME && \
173
+ GITHUB_ACTIONS=true node ~/.factiii/infrastructure/bin/factiii deploy --$ENVIRONMENT"
174
+ fi
175
+
176
+ rm -f ~/.ssh/deploy_key
177
+ echo ""
178
+ echo "✅ Dev sync complete!"
179
+
@@ -0,0 +1,176 @@
1
+ name: Factiii Fix
2
+
3
+ # Generated by @factiii/stack v{VERSION}
4
+ # INFRASTRUCTURE: Fix server issues via CLI
5
+ # Run: npx factiii fix (triggers this workflow)
6
+ # Runs on configured environments in parallel using matrix strategy
7
+
8
+ on:
9
+ workflow_dispatch:
10
+ inputs:
11
+ environment:
12
+ description: 'Environment to fix'
13
+ required: true
14
+ type: choice
15
+ options:
16
+ - all
17
+ - staging
18
+ - prod
19
+ default: all
20
+
21
+ jobs:
22
+ setup:
23
+ runs-on: ubuntu-latest
24
+ outputs:
25
+ matrix: ${{ steps.set-matrix.outputs.matrix }}
26
+ steps:
27
+ - name: Checkout code
28
+ uses: actions/checkout@v4
29
+
30
+ - name: Install yq
31
+ run: |
32
+ sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
33
+ sudo chmod +x /usr/local/bin/yq
34
+
35
+ - name: Determine environments
36
+ id: set-matrix
37
+ run: |
38
+ ENVS="[]"
39
+
40
+ if [ "${{ inputs.environment }}" == "all" ]; then
41
+ # Check which environments are configured
42
+ HAS_STAGING=$(yq eval '.staging != null' factiii.yml)
43
+ HAS_PROD=$(yq eval '.prod != null' factiii.yml)
44
+
45
+ if [ "$HAS_STAGING" == "true" ] && [ "$HAS_PROD" == "true" ]; then
46
+ ENVS='["staging", "prod"]'
47
+ elif [ "$HAS_STAGING" == "true" ]; then
48
+ ENVS='["staging"]'
49
+ elif [ "$HAS_PROD" == "true" ]; then
50
+ ENVS='["prod"]'
51
+ fi
52
+ else
53
+ ENVS='["${{ inputs.environment }}"]'
54
+ fi
55
+
56
+ echo "matrix={\"environment\":$ENVS}" >> $GITHUB_OUTPUT
57
+
58
+ fix:
59
+ needs: setup
60
+ runs-on: ubuntu-latest
61
+ strategy:
62
+ fail-fast: false
63
+ matrix: ${{ fromJson(needs.setup.outputs.matrix) }}
64
+ steps:
65
+ - name: Checkout code
66
+ uses: actions/checkout@v4
67
+
68
+ - name: Install yq
69
+ run: |
70
+ sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
71
+ sudo chmod +x /usr/local/bin/yq
72
+
73
+ - name: Read config
74
+ id: config
75
+ env:
76
+ ENVIRONMENT: ${{ matrix.environment }}
77
+ run: |
78
+ if [ ! -f "factiii.yml" ]; then
79
+ echo "❌ factiii.yml not found"
80
+ exit 1
81
+ fi
82
+
83
+ REPO_NAME=$(yq eval '.name' factiii.yml)
84
+ HOST=$(yq eval ".$ENVIRONMENT.domain // \"\"" factiii.yml)
85
+ SSH_USER=$(yq eval ".$ENVIRONMENT.ssh_user // \"ubuntu\"" factiii.yml)
86
+
87
+ echo "repo_name=$REPO_NAME" >> $GITHUB_OUTPUT
88
+ echo "host=$HOST" >> $GITHUB_OUTPUT
89
+ echo "ssh_user=$SSH_USER" >> $GITHUB_OUTPUT
90
+
91
+ - name: Check if environment configured
92
+ id: check_env
93
+ env:
94
+ ENVIRONMENT: ${{ matrix.environment }}
95
+ run: |
96
+ HAS_ENV=$(yq eval ".$ENVIRONMENT != null" factiii.yml)
97
+ echo "has_env=$HAS_ENV" >> $GITHUB_OUTPUT
98
+
99
+ if [ "$HAS_ENV" != "true" ]; then
100
+ echo "⏭️ $ENVIRONMENT environment not configured in factiii.yml"
101
+ exit 0
102
+ fi
103
+
104
+ - name: Check SSH secret
105
+ if: steps.check_env.outputs.has_env == 'true'
106
+ env:
107
+ ENVIRONMENT: ${{ matrix.environment }}
108
+ SSH_KEY: ${{ matrix.environment == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
109
+ run: |
110
+ if [ -z "$SSH_KEY" ]; then
111
+ SECRET_NAME="${ENVIRONMENT^^}_SSH"
112
+ echo "❌ ${SECRET_NAME} secret not found"
113
+ echo "Add it at: https://github.com/${{ github.repository }}/settings/secrets/actions"
114
+ exit 1
115
+ fi
116
+ echo "✅ SSH secret exists for $ENVIRONMENT"
117
+
118
+ - name: Setup SSH
119
+ if: steps.check_env.outputs.has_env == 'true'
120
+ env:
121
+ SSH_KEY: ${{ matrix.environment == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
122
+ run: |
123
+ mkdir -p ~/.ssh
124
+ echo "$SSH_KEY" > ~/.ssh/deploy_key
125
+ chmod 600 ~/.ssh/deploy_key
126
+
127
+ - name: Bootstrap Node.js (one-time)
128
+ if: steps.check_env.outputs.has_env == 'true'
129
+ env:
130
+ HOST: ${{ steps.config.outputs.host }}
131
+ USER: ${{ steps.config.outputs.ssh_user }}
132
+ run: |
133
+ echo "🔍 Checking Node.js on server..."
134
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" \
135
+ 'if ! command -v node &> /dev/null; then
136
+ echo "📦 Installing Node.js...";
137
+ if [ -f /opt/homebrew/bin/brew ] || [ -f /usr/local/bin/brew ]; then
138
+ export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH";
139
+ brew install node;
140
+ else
141
+ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs;
142
+ fi;
143
+ else
144
+ echo "✅ Node.js already installed";
145
+ fi'
146
+
147
+ - name: Fix via SSH
148
+ if: steps.check_env.outputs.has_env == 'true'
149
+ env:
150
+ HOST: ${{ steps.config.outputs.host }}
151
+ USER: ${{ steps.config.outputs.ssh_user }}
152
+ REPO_NAME: ${{ steps.config.outputs.repo_name }}
153
+ ENVIRONMENT: ${{ matrix.environment }}
154
+ run: |
155
+ if [ -z "$HOST" ]; then
156
+ echo "❌ Missing domain in factiii.yml: $ENVIRONMENT.domain"
157
+ exit 1
158
+ fi
159
+
160
+ echo "🔧 Fixing $ENVIRONMENT ($HOST)..."
161
+
162
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no -o ConnectTimeout=10 -o ServerAliveInterval=60 -o ServerAliveCountMax=5 "$USER@$HOST" \
163
+ "export PATH=\"/opt/homebrew/bin:/usr/local/bin:\$PATH\" && \
164
+ REPO_DIR=\"\$HOME/.factiii/$REPO_NAME\" && \
165
+ if [ -d \"\$REPO_DIR\" ]; then \
166
+ cd \"\$REPO_DIR\" && \
167
+ export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH" && \
168
+ GITHUB_ACTIONS=true npx factiii fix --$ENVIRONMENT; \
169
+ else \
170
+ echo \"❌ Repo directory not found at \$REPO_DIR\"; \
171
+ echo \"Run deployment first to clone the repository\"; \
172
+ exit 1; \
173
+ fi"
174
+
175
+ rm -f ~/.ssh/deploy_key
176
+ echo "✅ $ENVIRONMENT fix complete!"
@@ -0,0 +1,176 @@
1
+ name: Factiii Scan
2
+
3
+ # Generated by @factiii/stack v{VERSION}
4
+ # INFRASTRUCTURE: Scan servers for issues via CLI
5
+ # Run: npx factiii scan (triggers this workflow for remote environments)
6
+ # Runs on configured environments in parallel using matrix strategy
7
+
8
+ on:
9
+ workflow_dispatch:
10
+ inputs:
11
+ environment:
12
+ description: 'Environment to scan'
13
+ required: true
14
+ type: choice
15
+ options:
16
+ - all
17
+ - staging
18
+ - prod
19
+ default: all
20
+
21
+ jobs:
22
+ setup:
23
+ runs-on: ubuntu-latest
24
+ outputs:
25
+ matrix: ${{ steps.set-matrix.outputs.matrix }}
26
+ steps:
27
+ - name: Checkout code
28
+ uses: actions/checkout@v4
29
+
30
+ - name: Install yq
31
+ run: |
32
+ sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
33
+ sudo chmod +x /usr/local/bin/yq
34
+
35
+ - name: Determine environments
36
+ id: set-matrix
37
+ run: |
38
+ ENVS="[]"
39
+
40
+ if [ "${{ inputs.environment }}" == "all" ]; then
41
+ # Check which environments are configured
42
+ HAS_STAGING=$(yq eval '.environments.staging != null' factiii.yml)
43
+ HAS_PROD=$(yq eval '.environments.prod != null' factiii.yml)
44
+
45
+ if [ "$HAS_STAGING" == "true" ] && [ "$HAS_PROD" == "true" ]; then
46
+ ENVS='["staging", "prod"]'
47
+ elif [ "$HAS_STAGING" == "true" ]; then
48
+ ENVS='["staging"]'
49
+ elif [ "$HAS_PROD" == "true" ]; then
50
+ ENVS='["prod"]'
51
+ fi
52
+ else
53
+ ENVS='["${{ inputs.environment }}"]'
54
+ fi
55
+
56
+ echo "matrix={\"environment\":$ENVS}" >> $GITHUB_OUTPUT
57
+
58
+ scan:
59
+ needs: setup
60
+ runs-on: ubuntu-latest
61
+ strategy:
62
+ fail-fast: false
63
+ matrix: ${{ fromJson(needs.setup.outputs.matrix) }}
64
+ steps:
65
+ - name: Checkout code
66
+ uses: actions/checkout@v4
67
+
68
+ - name: Install yq
69
+ run: |
70
+ sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
71
+ sudo chmod +x /usr/local/bin/yq
72
+
73
+ - name: Read config
74
+ id: config
75
+ env:
76
+ ENVIRONMENT: ${{ matrix.environment }}
77
+ run: |
78
+ if [ ! -f "factiii.yml" ]; then
79
+ echo "❌ factiii.yml not found"
80
+ exit 1
81
+ fi
82
+
83
+ REPO_NAME=$(yq eval '.name' factiii.yml)
84
+ HOST=$(yq eval ".environments.$ENVIRONMENT.domain // \"\"" factiii.yml)
85
+ SSH_USER=$(yq eval ".environments.$ENVIRONMENT.ssh_user // \"ubuntu\"" factiii.yml)
86
+
87
+ echo "repo_name=$REPO_NAME" >> $GITHUB_OUTPUT
88
+ echo "host=$HOST" >> $GITHUB_OUTPUT
89
+ echo "ssh_user=$SSH_USER" >> $GITHUB_OUTPUT
90
+
91
+ - name: Check if environment configured
92
+ id: check_env
93
+ env:
94
+ ENVIRONMENT: ${{ matrix.environment }}
95
+ run: |
96
+ HAS_ENV=$(yq eval ".environments.$ENVIRONMENT != null" factiii.yml)
97
+ echo "has_env=$HAS_ENV" >> $GITHUB_OUTPUT
98
+
99
+ if [ "$HAS_ENV" != "true" ]; then
100
+ echo "⏭️ $ENVIRONMENT environment not configured in factiii.yml"
101
+ exit 0
102
+ fi
103
+
104
+ - name: Check SSH secret
105
+ if: steps.check_env.outputs.has_env == 'true'
106
+ env:
107
+ ENVIRONMENT: ${{ matrix.environment }}
108
+ SSH_KEY: ${{ matrix.environment == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
109
+ run: |
110
+ if [ -z "$SSH_KEY" ]; then
111
+ SECRET_NAME="${ENVIRONMENT^^}_SSH"
112
+ echo "❌ ${SECRET_NAME} secret not found"
113
+ echo "Add it at: https://github.com/${{ github.repository }}/settings/secrets/actions"
114
+ exit 1
115
+ fi
116
+ echo "✅ SSH secret exists for $ENVIRONMENT"
117
+
118
+ - name: Setup SSH
119
+ if: steps.check_env.outputs.has_env == 'true'
120
+ env:
121
+ SSH_KEY: ${{ matrix.environment == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
122
+ run: |
123
+ mkdir -p ~/.ssh
124
+ echo "$SSH_KEY" > ~/.ssh/deploy_key
125
+ chmod 600 ~/.ssh/deploy_key
126
+
127
+ - name: Bootstrap Node.js (one-time)
128
+ if: steps.check_env.outputs.has_env == 'true'
129
+ env:
130
+ HOST: ${{ steps.config.outputs.host }}
131
+ USER: ${{ steps.config.outputs.ssh_user }}
132
+ run: |
133
+ echo "🔍 Checking Node.js on server..."
134
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" \
135
+ 'if ! command -v node &> /dev/null; then
136
+ echo "📦 Installing Node.js...";
137
+ if [ -f /opt/homebrew/bin/brew ] || [ -f /usr/local/bin/brew ]; then
138
+ export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH";
139
+ brew install node;
140
+ else
141
+ curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs;
142
+ fi;
143
+ else
144
+ echo "✅ Node.js already installed";
145
+ fi'
146
+
147
+ - name: Scan via SSH
148
+ if: steps.check_env.outputs.has_env == 'true'
149
+ env:
150
+ HOST: ${{ steps.config.outputs.host }}
151
+ USER: ${{ steps.config.outputs.ssh_user }}
152
+ REPO_NAME: ${{ steps.config.outputs.repo_name }}
153
+ ENVIRONMENT: ${{ matrix.environment }}
154
+ run: |
155
+ if [ -z "$HOST" ]; then
156
+ echo "❌ Missing domain in factiii.yml: environments.$ENVIRONMENT.domain"
157
+ exit 1
158
+ fi
159
+
160
+ echo "🔍 Scanning $ENVIRONMENT ($HOST)..."
161
+
162
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" \
163
+ "export PATH=\"/opt/homebrew/bin:/usr/local/bin:\$PATH\" && \
164
+ REPO_DIR=\"\$HOME/.factiii/$REPO_NAME\" && \
165
+ if [ -d \"\$REPO_DIR\" ]; then \
166
+ cd \"\$REPO_DIR\" && \
167
+ export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH" && \
168
+ GITHUB_ACTIONS=true npx factiii scan --$ENVIRONMENT; \
169
+ else \
170
+ echo \"❌ Repo directory not found at \$REPO_DIR\"; \
171
+ echo \"Run deployment first to clone the repository\"; \
172
+ exit 1; \
173
+ fi"
174
+
175
+ rm -f ~/.ssh/deploy_key
176
+ echo "✅ $ENVIRONMENT scan complete!"
@@ -0,0 +1,95 @@
1
+ name: Factiii Undeploy
2
+
3
+ # Generated by @factiii/stack v{VERSION}
4
+ # Manual workflow to remove deployment from a server
5
+ # Thin workflow - just SSH and call CLI
6
+
7
+ on:
8
+ workflow_dispatch:
9
+ inputs:
10
+ environment:
11
+ description: 'Environment to undeploy'
12
+ required: true
13
+ type: choice
14
+ options:
15
+ - staging
16
+ - prod
17
+
18
+ jobs:
19
+ undeploy:
20
+ runs-on: ubuntu-latest
21
+ steps:
22
+ - name: Checkout code
23
+ uses: actions/checkout@v4
24
+
25
+ - name: Install yq
26
+ run: |
27
+ sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
28
+ sudo chmod +x /usr/local/bin/yq
29
+
30
+ - name: Read config
31
+ id: config
32
+ run: |
33
+ if [ ! -f "factiii.yml" ]; then
34
+ echo "❌ factiii.yml not found"
35
+ exit 1
36
+ fi
37
+
38
+ REPO_NAME=$(yq eval '.name' factiii.yml)
39
+
40
+ if [ "${{ inputs.environment }}" == "staging" ]; then
41
+ HOST=$(yq eval '.environments.staging.domain // ""' factiii.yml)
42
+ SSH_USER=$(yq eval '.environments.staging.ssh_user // "ubuntu"' factiii.yml)
43
+ else
44
+ HOST=$(yq eval '.environments.prod.domain // ""' factiii.yml)
45
+ SSH_USER=$(yq eval '.environments.prod.ssh_user // "ubuntu"' factiii.yml)
46
+ fi
47
+
48
+ echo "repo_name=$REPO_NAME" >> $GITHUB_OUTPUT
49
+ echo "host=$HOST" >> $GITHUB_OUTPUT
50
+ echo "ssh_user=$SSH_USER" >> $GITHUB_OUTPUT
51
+
52
+ - name: Setup SSH
53
+ env:
54
+ SSH_KEY: ${{ inputs.environment == 'staging' && secrets.STAGING_SSH || secrets.PROD_SSH }}
55
+ run: |
56
+ if [ -z "$SSH_KEY" ]; then
57
+ echo "❌ Missing ${{ inputs.environment == 'staging' && 'STAGING_SSH' || 'PROD_SSH' }} secret"
58
+ exit 1
59
+ fi
60
+
61
+ mkdir -p ~/.ssh
62
+ echo "$SSH_KEY" > ~/.ssh/deploy_key
63
+ chmod 600 ~/.ssh/deploy_key
64
+
65
+ - name: Undeploy via CLI
66
+ env:
67
+ HOST: ${{ steps.config.outputs.host }}
68
+ USER: ${{ steps.config.outputs.ssh_user }}
69
+ REPO_NAME: ${{ steps.config.outputs.repo_name }}
70
+ ENVIRONMENT: ${{ inputs.environment }}
71
+ run: |
72
+ if [ -z "$HOST" ]; then
73
+ echo "❌ Missing domain in factiii.yml: environments.$ENVIRONMENT.domain"
74
+ exit 1
75
+ fi
76
+
77
+ echo "🗑️ Undeploying from $ENVIRONMENT ($HOST)..."
78
+
79
+ ssh -i ~/.ssh/deploy_key -o StrictHostKeyChecking=no "$USER@$HOST" bash -s << EOF
80
+ set -e
81
+ REPO_DIR=~/.factiii/$REPO_NAME
82
+
83
+ if [ -d "\$REPO_DIR" ]; then
84
+ cd \$REPO_DIR
85
+ echo "🚀 Running undeploy..."
86
+ export PATH="/opt/homebrew/bin:/usr/local/bin:$PATH" && \
87
+ GITHUB_ACTIONS=true npx factiii undeploy --$ENVIRONMENT || true
88
+ else
89
+ echo "⚠️ Repo directory not found, nothing to undeploy"
90
+ fi
91
+ EOF
92
+
93
+ rm -f ~/.ssh/deploy_key
94
+ echo "✅ Undeploy complete!"
95
+