@factiii/stack 0.1.24 → 0.1.26

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 (161) hide show
  1. package/README.md +81 -60
  2. package/bin/{factiii → stack} +12 -12
  3. package/dist/cli/check-config.js +1 -1
  4. package/dist/cli/check-config.js.map +1 -1
  5. package/dist/cli/deploy-secrets.d.ts.map +1 -1
  6. package/dist/cli/deploy-secrets.js +11 -11
  7. package/dist/cli/deploy-secrets.js.map +1 -1
  8. package/dist/cli/deploy.d.ts.map +1 -1
  9. package/dist/cli/deploy.js +19 -9
  10. package/dist/cli/deploy.js.map +1 -1
  11. package/dist/cli/dev-sync.d.ts.map +1 -1
  12. package/dist/cli/dev-sync.js +10 -9
  13. package/dist/cli/dev-sync.js.map +1 -1
  14. package/dist/cli/execute-plugin-command.d.ts.map +1 -1
  15. package/dist/cli/execute-plugin-command.js +7 -7
  16. package/dist/cli/execute-plugin-command.js.map +1 -1
  17. package/dist/cli/fix.d.ts.map +1 -1
  18. package/dist/cli/fix.js +24 -4
  19. package/dist/cli/fix.js.map +1 -1
  20. package/dist/cli/init.d.ts +3 -1
  21. package/dist/cli/init.d.ts.map +1 -1
  22. package/dist/cli/init.js +382 -69
  23. package/dist/cli/init.js.map +1 -1
  24. package/dist/cli/pr-check.d.ts.map +1 -1
  25. package/dist/cli/pr-check.js +5 -4
  26. package/dist/cli/pr-check.js.map +1 -1
  27. package/dist/cli/scan.d.ts +6 -6
  28. package/dist/cli/scan.d.ts.map +1 -1
  29. package/dist/cli/scan.js +46 -30
  30. package/dist/cli/scan.js.map +1 -1
  31. package/dist/cli/secrets.d.ts.map +1 -1
  32. package/dist/cli/secrets.js +17 -16
  33. package/dist/cli/secrets.js.map +1 -1
  34. package/dist/cli/undeploy.d.ts.map +1 -1
  35. package/dist/cli/undeploy.js +4 -4
  36. package/dist/cli/undeploy.js.map +1 -1
  37. package/dist/cli/upgrade.d.ts +1 -1
  38. package/dist/cli/upgrade.js +5 -5
  39. package/dist/cli/upgrade.js.map +1 -1
  40. package/dist/cli/validate.js +1 -1
  41. package/dist/cli/validate.js.map +1 -1
  42. package/dist/constants/config-files.d.ts +23 -0
  43. package/dist/constants/config-files.d.ts.map +1 -0
  44. package/dist/constants/config-files.js +88 -0
  45. package/dist/constants/config-files.js.map +1 -0
  46. package/dist/generators/{generate-factiii-auto.d.ts → generate-stack-auto.d.ts} +4 -4
  47. package/dist/generators/generate-stack-auto.d.ts.map +1 -0
  48. package/dist/generators/{generate-factiii-auto.js → generate-stack-auto.js} +15 -13
  49. package/dist/generators/generate-stack-auto.js.map +1 -0
  50. package/dist/generators/{generate-factiii-yml.d.ts → generate-stack-yml.d.ts} +5 -5
  51. package/dist/generators/generate-stack-yml.d.ts.map +1 -0
  52. package/dist/generators/{generate-factiii-yml.js → generate-stack-yml.js} +16 -15
  53. package/dist/generators/generate-stack-yml.js.map +1 -0
  54. package/dist/generators/index.d.ts +2 -2
  55. package/dist/generators/index.d.ts.map +1 -1
  56. package/dist/generators/index.js +5 -5
  57. package/dist/generators/index.js.map +1 -1
  58. package/dist/plugins/pipelines/aws/index.js +3 -3
  59. package/dist/plugins/pipelines/aws/index.js.map +1 -1
  60. package/dist/plugins/pipelines/aws/scanfix/credentials.d.ts.map +1 -1
  61. package/dist/plugins/pipelines/aws/scanfix/credentials.js +36 -44
  62. package/dist/plugins/pipelines/aws/scanfix/credentials.js.map +1 -1
  63. package/dist/plugins/pipelines/aws/scanfix/ec2.js +1 -1
  64. package/dist/plugins/pipelines/aws/scanfix/ec2.js.map +1 -1
  65. package/dist/plugins/pipelines/aws/scanfix/iam.js +2 -2
  66. package/dist/plugins/pipelines/aws/scanfix/iam.js.map +1 -1
  67. package/dist/plugins/pipelines/aws/scanfix/rds.js +2 -2
  68. package/dist/plugins/pipelines/aws/scanfix/rds.js.map +1 -1
  69. package/dist/plugins/pipelines/factiii/index.d.ts +5 -3
  70. package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -1
  71. package/dist/plugins/pipelines/factiii/index.js +14 -77
  72. package/dist/plugins/pipelines/factiii/index.js.map +1 -1
  73. package/dist/plugins/pipelines/factiii/pr-check.d.ts +1 -1
  74. package/dist/plugins/pipelines/factiii/pr-check.js +1 -1
  75. package/dist/plugins/pipelines/factiii/prod.d.ts.map +1 -1
  76. package/dist/plugins/pipelines/factiii/prod.js +3 -3
  77. package/dist/plugins/pipelines/factiii/prod.js.map +1 -1
  78. package/dist/plugins/pipelines/factiii/scanfix/config.d.ts +1 -1
  79. package/dist/plugins/pipelines/factiii/scanfix/config.d.ts.map +1 -1
  80. package/dist/plugins/pipelines/factiii/scanfix/config.js +10 -11
  81. package/dist/plugins/pipelines/factiii/scanfix/config.js.map +1 -1
  82. package/dist/plugins/pipelines/factiii/scanfix/env-files.d.ts +12 -0
  83. package/dist/plugins/pipelines/factiii/scanfix/env-files.d.ts.map +1 -0
  84. package/dist/plugins/pipelines/factiii/scanfix/env-files.js +310 -0
  85. package/dist/plugins/pipelines/factiii/scanfix/env-files.js.map +1 -0
  86. package/dist/plugins/pipelines/factiii/scanfix/local-config.d.ts +7 -0
  87. package/dist/plugins/pipelines/factiii/scanfix/local-config.d.ts.map +1 -0
  88. package/dist/plugins/pipelines/factiii/scanfix/local-config.js +70 -0
  89. package/dist/plugins/pipelines/factiii/scanfix/local-config.js.map +1 -0
  90. package/dist/plugins/pipelines/factiii/scanfix/secrets.js +6 -6
  91. package/dist/plugins/pipelines/factiii/scanfix/secrets.js.map +1 -1
  92. package/dist/plugins/pipelines/factiii/scanfix/workflows.d.ts.map +1 -1
  93. package/dist/plugins/pipelines/factiii/scanfix/workflows.js +16 -26
  94. package/dist/plugins/pipelines/factiii/scanfix/workflows.js.map +1 -1
  95. package/dist/plugins/pipelines/factiii/staging.d.ts +1 -1
  96. package/dist/plugins/pipelines/factiii/staging.d.ts.map +1 -1
  97. package/dist/plugins/pipelines/factiii/staging.js +3 -2
  98. package/dist/plugins/pipelines/factiii/staging.js.map +1 -1
  99. package/dist/plugins/pipelines/factiii/utils/workflows.d.ts.map +1 -1
  100. package/dist/plugins/pipelines/factiii/utils/workflows.js +6 -21
  101. package/dist/plugins/pipelines/factiii/utils/workflows.js.map +1 -1
  102. package/dist/plugins/pipelines/factiii/workflows/stack-ci.yml +56 -0
  103. package/dist/plugins/pipelines/factiii/workflows/stack-cicd-prod.yml +54 -0
  104. package/dist/plugins/servers/mac/scanfix/containers.js +1 -1
  105. package/dist/plugins/servers/mac/scanfix/containers.js.map +1 -1
  106. package/dist/scanfix/fixes/pnpm.d.ts.map +1 -1
  107. package/dist/scanfix/fixes/pnpm.js +2 -2
  108. package/dist/scanfix/fixes/pnpm.js.map +1 -1
  109. package/dist/scripts/generate-all.d.ts.map +1 -1
  110. package/dist/scripts/generate-all.js +9 -8
  111. package/dist/scripts/generate-all.js.map +1 -1
  112. package/dist/scripts/get-repo-name.d.ts +1 -1
  113. package/dist/scripts/get-repo-name.js +5 -3
  114. package/dist/scripts/get-repo-name.js.map +1 -1
  115. package/dist/scripts/validate-env-files.js +7 -1
  116. package/dist/scripts/validate-env-files.js.map +1 -1
  117. package/dist/scripts/validate-example-values.d.ts +1 -1
  118. package/dist/scripts/validate-example-values.js +3 -2
  119. package/dist/scripts/validate-example-values.js.map +1 -1
  120. package/dist/scripts/validate-stack-yml.d.ts +6 -0
  121. package/dist/scripts/validate-stack-yml.d.ts.map +1 -0
  122. package/dist/scripts/{validate-factiii-yml.js → validate-stack-yml.js} +15 -11
  123. package/dist/scripts/validate-stack-yml.js.map +1 -0
  124. package/dist/utils/config-helpers.d.ts +15 -0
  125. package/dist/utils/config-helpers.d.ts.map +1 -1
  126. package/dist/utils/config-helpers.js +57 -5
  127. package/dist/utils/config-helpers.js.map +1 -1
  128. package/dist/utils/config-validator.d.ts +2 -2
  129. package/dist/utils/config-validator.d.ts.map +1 -1
  130. package/dist/utils/config-validator.js +7 -6
  131. package/dist/utils/config-validator.js.map +1 -1
  132. package/dist/utils/config-writer.d.ts +2 -2
  133. package/dist/utils/config-writer.d.ts.map +1 -1
  134. package/dist/utils/config-writer.js +6 -6
  135. package/dist/utils/config-writer.js.map +1 -1
  136. package/dist/utils/deployment-report.js +4 -4
  137. package/dist/utils/deployment-report.js.map +1 -1
  138. package/dist/utils/ssh-helper.js +6 -6
  139. package/dist/utils/ssh-helper.js.map +1 -1
  140. package/dist/utils/template-generator.js +1 -1
  141. package/dist/utils/version-check.d.ts +1 -1
  142. package/dist/utils/version-check.d.ts.map +1 -1
  143. package/dist/utils/version-check.js +9 -8
  144. package/dist/utils/version-check.js.map +1 -1
  145. package/package.json +8 -2
  146. package/dist/generators/generate-factiii-auto.d.ts.map +0 -1
  147. package/dist/generators/generate-factiii-auto.js.map +0 -1
  148. package/dist/generators/generate-factiii-yml.d.ts.map +0 -1
  149. package/dist/generators/generate-factiii-yml.js.map +0 -1
  150. package/dist/plugins/pipelines/factiii/workflows/factiii-cicd-prod.yml +0 -112
  151. package/dist/plugins/pipelines/factiii/workflows/factiii-cicd-staging.yml +0 -117
  152. package/dist/plugins/pipelines/factiii/workflows/factiii-command.yml +0 -130
  153. package/dist/plugins/pipelines/factiii/workflows/factiii-deploy.yml +0 -198
  154. package/dist/plugins/pipelines/factiii/workflows/factiii-dev-sync.yml +0 -179
  155. package/dist/plugins/pipelines/factiii/workflows/factiii-fix.yml +0 -176
  156. package/dist/plugins/pipelines/factiii/workflows/factiii-pr-check.yml +0 -103
  157. package/dist/plugins/pipelines/factiii/workflows/factiii-scan.yml +0 -176
  158. package/dist/plugins/pipelines/factiii/workflows/factiii-undeploy.yml +0 -95
  159. package/dist/scripts/validate-factiii-yml.d.ts +0 -6
  160. package/dist/scripts/validate-factiii-yml.d.ts.map +0 -1
  161. package/dist/scripts/validate-factiii-yml.js.map +0 -1
package/dist/cli/init.js CHANGED
@@ -2,7 +2,9 @@
2
2
  /**
3
3
  * Init Command
4
4
  *
5
- * Initializes factiii.yml in a project
5
+ * First run: creates configs, sets up vault, explains what future runs will auto-fix.
6
+ * Subsequent runs: auto-fixes everything without prompts.
7
+ * Use --force to regenerate stack.yml from scratch.
6
8
  */
7
9
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
10
  if (k2 === undefined) k2 = k;
@@ -37,15 +39,262 @@ var __importStar = (this && this.__importStar) || (function () {
37
39
  return result;
38
40
  };
39
41
  })();
42
+ var __importDefault = (this && this.__importDefault) || function (mod) {
43
+ return (mod && mod.__esModule) ? mod : { "default": mod };
44
+ };
40
45
  Object.defineProperty(exports, "__esModule", { value: true });
41
46
  exports.init = init;
42
47
  const path = __importStar(require("path"));
48
+ const config_files_js_1 = require("../constants/config-files.js");
43
49
  const fs = __importStar(require("fs"));
44
50
  const os = __importStar(require("os"));
51
+ const js_yaml_1 = __importDefault(require("js-yaml"));
45
52
  const child_process_1 = require("child_process");
46
- const generate_factiii_yml_js_1 = require("../generators/generate-factiii-yml.js");
47
- const generate_factiii_auto_js_1 = require("../generators/generate-factiii-auto.js");
53
+ const generate_stack_yml_js_1 = require("../generators/generate-stack-yml.js");
54
+ const generate_stack_auto_js_1 = require("../generators/generate-stack-auto.js");
48
55
  const secret_prompts_js_1 = require("../utils/secret-prompts.js");
56
+ const config_helpers_js_1 = require("../utils/config-helpers.js");
57
+ /**
58
+ * Detect the dev OS from process.platform
59
+ */
60
+ function detectDevOS() {
61
+ if (process.platform === 'darwin')
62
+ return 'mac';
63
+ if (process.platform === 'win32')
64
+ return 'windows';
65
+ return 'ubuntu';
66
+ }
67
+ /**
68
+ * Append a line to .gitignore if not already present
69
+ */
70
+ function ensureGitignored(rootDir, entry) {
71
+ const gitignorePath = path.join(rootDir, '.gitignore');
72
+ let content = '';
73
+ if (fs.existsSync(gitignorePath)) {
74
+ content = fs.readFileSync(gitignorePath, 'utf8');
75
+ }
76
+ const lines = content.split('\n').map((l) => l.trim());
77
+ if (lines.includes(entry)) {
78
+ return false; // already present
79
+ }
80
+ const separator = content.length > 0 && !content.endsWith('\n') ? '\n' : '';
81
+ fs.appendFileSync(gitignorePath, separator + entry + '\n');
82
+ return true;
83
+ }
84
+ /**
85
+ * Create stack.local.yml with detected OS if it doesn't exist
86
+ */
87
+ function ensureLocalConfig(rootDir) {
88
+ const localPath = (0, config_files_js_1.getStackLocalPath)(rootDir);
89
+ if (fs.existsSync(localPath)) {
90
+ console.log(' [OK] ' + config_files_js_1.STACK_LOCAL_FILENAME + ' already exists');
91
+ return;
92
+ }
93
+ const devOS = detectDevOS();
94
+ const content = '# Local machine config (gitignored - each developer has their own)\n' +
95
+ '# Generated by: npx stack init\n' +
96
+ '\n' +
97
+ 'dev_os: ' + devOS + '\n';
98
+ fs.writeFileSync(localPath, content, 'utf8');
99
+ console.log(' [OK] Created ' + config_files_js_1.STACK_LOCAL_FILENAME + ' (dev_os: ' + devOS + ')');
100
+ // Ensure both naming conventions are gitignored
101
+ ensureGitignored(rootDir, config_files_js_1.STACK_LOCAL_FILENAME);
102
+ ensureGitignored(rootDir, 'factiii.local.yml');
103
+ }
104
+ /**
105
+ * Copy .env.example to .env.staging and .env.prod if they don't exist.
106
+ * Does NOT store in vault — user needs to edit values first.
107
+ */
108
+ function ensureEnvFiles(rootDir) {
109
+ const examplePath = path.join(rootDir, '.env.example');
110
+ if (!fs.existsSync(examplePath)) {
111
+ console.log(' [--] No .env.example found - skipping env file setup');
112
+ return;
113
+ }
114
+ const exampleContent = fs.readFileSync(examplePath, 'utf8');
115
+ let created = false;
116
+ const stagingPath = path.join(rootDir, '.env.staging');
117
+ if (!fs.existsSync(stagingPath)) {
118
+ fs.writeFileSync(stagingPath, exampleContent, 'utf8');
119
+ console.log(' [OK] Created .env.staging from .env.example');
120
+ created = true;
121
+ }
122
+ else {
123
+ console.log(' [OK] .env.staging already exists');
124
+ }
125
+ const prodPath = path.join(rootDir, '.env.prod');
126
+ if (!fs.existsSync(prodPath)) {
127
+ fs.writeFileSync(prodPath, exampleContent, 'utf8');
128
+ console.log(' [OK] Created .env.prod from .env.example');
129
+ created = true;
130
+ }
131
+ else {
132
+ console.log(' [OK] .env.prod already exists');
133
+ }
134
+ // Ensure env files are gitignored
135
+ ensureGitignored(rootDir, '.env.staging');
136
+ ensureGitignored(rootDir, '.env.prod');
137
+ if (created) {
138
+ console.log('');
139
+ console.log(' >> Edit .env.staging and .env.prod with real values,');
140
+ console.log(' then run `npx stack fix` to store them in the vault.');
141
+ }
142
+ }
143
+ /**
144
+ * Load config and prompt for missing secrets (SSH keys, AWS credentials)
145
+ */
146
+ async function promptForMissingSecrets(rootDir) {
147
+ const configPath = (0, config_files_js_1.getStackConfigPath)(rootDir);
148
+ if (!fs.existsSync(configPath))
149
+ return;
150
+ let config;
151
+ try {
152
+ config = js_yaml_1.default.load(fs.readFileSync(configPath, 'utf8')) ?? {};
153
+ }
154
+ catch {
155
+ return;
156
+ }
157
+ if (!config.ansible?.vault_path)
158
+ return;
159
+ const environments = (0, config_helpers_js_1.extractEnvironments)(config);
160
+ const hasStaging = !!environments.staging;
161
+ const hasProd = !!environments.prod || !!environments.production;
162
+ const hasAWS = Object.values(environments).some((env) => env.pipeline === 'aws' || env.access_key_id);
163
+ if (!hasStaging && !hasProd && !hasAWS)
164
+ return;
165
+ let vault;
166
+ try {
167
+ const { AnsibleVaultSecrets } = await Promise.resolve().then(() => __importStar(require('../utils/ansible-vault-secrets.js')));
168
+ vault = new AnsibleVaultSecrets({
169
+ vault_path: config.ansible.vault_path,
170
+ vault_password_file: config.ansible.vault_password_file ?? '~/.vault_pass',
171
+ rootDir,
172
+ });
173
+ }
174
+ catch {
175
+ return;
176
+ }
177
+ console.log('\n Checking secrets...\n');
178
+ // Check STAGING_SSH
179
+ if (hasStaging) {
180
+ try {
181
+ const check = await vault.checkSecrets(['STAGING_SSH']);
182
+ if (check.missing.includes('STAGING_SSH')) {
183
+ const addNow = await (0, secret_prompts_js_1.confirm)(' Add staging SSH key now? (skip to do later with: npx stack secrets set STAGING_SSH)', false);
184
+ if (addNow) {
185
+ const value = await (0, secret_prompts_js_1.promptForSecret)('STAGING_SSH', config);
186
+ if (value) {
187
+ await vault.setSecret('STAGING_SSH', value);
188
+ console.log(' [OK] STAGING_SSH stored in vault');
189
+ await extractSSHKeyToFile(vault, 'staging', rootDir);
190
+ }
191
+ }
192
+ else {
193
+ console.log(' [--] Skipped STAGING_SSH');
194
+ }
195
+ }
196
+ else {
197
+ console.log(' [OK] STAGING_SSH already in vault');
198
+ }
199
+ }
200
+ catch (e) {
201
+ const msg = e instanceof Error ? e.message : String(e);
202
+ console.log(' [!] Could not check STAGING_SSH: ' + msg);
203
+ }
204
+ }
205
+ // Check PROD_SSH
206
+ if (hasProd) {
207
+ try {
208
+ const check = await vault.checkSecrets(['PROD_SSH']);
209
+ if (check.missing.includes('PROD_SSH')) {
210
+ const addNow = await (0, secret_prompts_js_1.confirm)(' Add prod SSH key now? (skip to do later with: npx stack secrets set PROD_SSH)', false);
211
+ if (addNow) {
212
+ const value = await (0, secret_prompts_js_1.promptForSecret)('PROD_SSH', config);
213
+ if (value) {
214
+ await vault.setSecret('PROD_SSH', value);
215
+ console.log(' [OK] PROD_SSH stored in vault');
216
+ await extractSSHKeyToFile(vault, 'prod', rootDir);
217
+ }
218
+ }
219
+ else {
220
+ console.log(' [--] Skipped PROD_SSH');
221
+ }
222
+ }
223
+ else {
224
+ console.log(' [OK] PROD_SSH already in vault');
225
+ }
226
+ }
227
+ catch (e) {
228
+ const msg = e instanceof Error ? e.message : String(e);
229
+ console.log(' [!] Could not check PROD_SSH: ' + msg);
230
+ }
231
+ }
232
+ // Check AWS_SECRET_ACCESS_KEY
233
+ if (hasAWS) {
234
+ try {
235
+ const check = await vault.checkSecrets(['AWS_SECRET_ACCESS_KEY']);
236
+ if (check.missing.includes('AWS_SECRET_ACCESS_KEY')) {
237
+ const addNow = await (0, secret_prompts_js_1.confirm)(' Add AWS Secret Access Key now?', false);
238
+ if (addNow) {
239
+ const value = await (0, secret_prompts_js_1.promptForSecret)('AWS_SECRET_ACCESS_KEY', config);
240
+ if (value) {
241
+ await vault.setSecret('AWS_SECRET_ACCESS_KEY', value);
242
+ console.log(' [OK] AWS_SECRET_ACCESS_KEY stored in vault');
243
+ }
244
+ }
245
+ else {
246
+ console.log(' [--] Skipped AWS_SECRET_ACCESS_KEY');
247
+ }
248
+ }
249
+ else {
250
+ console.log(' [OK] AWS_SECRET_ACCESS_KEY already in vault');
251
+ }
252
+ }
253
+ catch (e) {
254
+ const msg = e instanceof Error ? e.message : String(e);
255
+ console.log(' [!] Could not check AWS_SECRET_ACCESS_KEY: ' + msg);
256
+ }
257
+ }
258
+ }
259
+ /**
260
+ * Extract SSH key from vault to ~/.ssh/{stage}_deploy_key
261
+ * With safety check: asks before overwriting existing key
262
+ */
263
+ async function extractSSHKeyToFile(vault, stage, _rootDir) {
264
+ const keyName = stage + '_deploy_key';
265
+ const sshDir = path.join(os.homedir(), '.ssh');
266
+ const keyPath = path.join(sshDir, keyName);
267
+ // Safety check: don't overwrite existing keys without asking
268
+ if (fs.existsSync(keyPath)) {
269
+ const overwrite = await (0, secret_prompts_js_1.confirm)(' SSH key already exists at ' + keyPath + ' - overwrite?', false);
270
+ if (!overwrite) {
271
+ console.log(' [--] Keeping existing key at ' + keyPath);
272
+ return;
273
+ }
274
+ }
275
+ try {
276
+ const key = await vault.getSSHKey(stage);
277
+ if (!key) {
278
+ console.log(' [!] No ' + stage.toUpperCase() + '_SSH key found in vault');
279
+ return;
280
+ }
281
+ if (!fs.existsSync(sshDir)) {
282
+ fs.mkdirSync(sshDir, { recursive: true });
283
+ }
284
+ fs.writeFileSync(keyPath, key, 'utf8');
285
+ try {
286
+ fs.chmodSync(keyPath, 0o600);
287
+ }
288
+ catch {
289
+ // Windows doesn't support chmod
290
+ }
291
+ console.log(' [OK] Wrote SSH key to ' + keyPath);
292
+ }
293
+ catch (e) {
294
+ const msg = e instanceof Error ? e.message : String(e);
295
+ console.log(' [!] Failed to extract SSH key: ' + msg);
296
+ }
297
+ }
49
298
  /**
50
299
  * Check if ansible-vault CLI is available
51
300
  */
@@ -58,53 +307,56 @@ function checkAnsibleVault() {
58
307
  return false;
59
308
  }
60
309
  }
61
- async function init(options = {}) {
62
- const rootDir = options.rootDir ?? process.cwd();
63
- console.log('Initializing Factiii Stack...\n');
64
- const factiiiYmlPath = path.join(rootDir, 'factiii.yml');
65
- const factiiiAutoYmlPath = path.join(rootDir, 'factiiiAuto.yml');
66
- // Check if files exist and prompt if not using --force
67
- let shouldCreateYml = options.force ?? false;
68
- let shouldCreateAuto = options.force ?? false;
69
- if (!fs.existsSync(factiiiYmlPath)) {
70
- shouldCreateYml = true; // File doesn't exist, create it
310
+ /**
311
+ * Ensure group_vars/all/ directory and encrypted vault file exist.
312
+ * Returns what was fixed (empty array if nothing needed fixing).
313
+ */
314
+ async function ensureVaultSetup(rootDir, vaultPassFile) {
315
+ const fixed = [];
316
+ const groupVarsDir = path.join(rootDir, 'group_vars', 'all');
317
+ if (!fs.existsSync(groupVarsDir)) {
318
+ fs.mkdirSync(groupVarsDir, { recursive: true });
319
+ fixed.push('Created ' + groupVarsDir);
71
320
  }
72
- else if (!options.force) {
73
- shouldCreateYml = await (0, secret_prompts_js_1.confirm)('factiii.yml already exists. Overwrite it?', false);
74
- if (!shouldCreateYml) {
75
- console.log('Skipping factiii.yml');
321
+ const vaultFilePath = path.join(rootDir, 'group_vars', 'all', 'vault.yml');
322
+ if (!fs.existsSync(vaultFilePath)) {
323
+ try {
324
+ const { AnsibleVaultSecrets } = await Promise.resolve().then(() => __importStar(require('../utils/ansible-vault-secrets.js')));
325
+ const vault = new AnsibleVaultSecrets({
326
+ vault_path: 'group_vars/all/vault.yml',
327
+ vault_password_file: '~/.vault_pass',
328
+ rootDir,
329
+ });
330
+ await vault.setSecret('_initialized', 'true');
331
+ fixed.push('Created encrypted vault at group_vars/all/vault.yml');
76
332
  }
77
- }
78
- if (!fs.existsSync(factiiiAutoYmlPath)) {
79
- shouldCreateAuto = true; // File doesn't exist, create it
80
- }
81
- else if (!options.force) {
82
- shouldCreateAuto = await (0, secret_prompts_js_1.confirm)('factiiiAuto.yml already exists. Overwrite it?', false);
83
- if (!shouldCreateAuto) {
84
- console.log('Skipping factiiiAuto.yml');
333
+ catch (e) {
334
+ const msg = e instanceof Error ? e.message : String(e);
335
+ fixed.push('Failed to create vault: ' + msg);
85
336
  }
86
337
  }
87
- // Generate factiii.yml
88
- if (shouldCreateYml) {
89
- const created = (0, generate_factiii_yml_js_1.generateFactiiiYml)(rootDir, { force: true });
90
- if (created) {
91
- // Generate factiiiAuto.yml (always update if yml was created/updated)
92
- await (0, generate_factiii_auto_js_1.generateFactiiiAuto)(rootDir, { force: shouldCreateAuto });
93
- }
338
+ return fixed;
339
+ }
340
+ async function init(options = {}) {
341
+ const rootDir = options.rootDir ?? process.cwd();
342
+ const configPath = (0, config_files_js_1.getStackConfigPath)(rootDir);
343
+ const isFirstRun = !fs.existsSync(configPath);
344
+ if (isFirstRun || options.force) {
345
+ await firstRun(rootDir, options);
94
346
  }
95
347
  else {
96
- // factiii.yml not created, but check if we should update factiiiAuto.yml
97
- if (shouldCreateAuto) {
98
- await (0, generate_factiii_auto_js_1.generateFactiiiAuto)(rootDir, { force: true });
99
- }
100
- else if (fs.existsSync(factiiiYmlPath)) {
101
- // factiii.yml exists and wasn't overwritten, but auto might need updating
102
- // (factiiiAuto.yml is auto-detected, so update if content changed)
103
- await (0, generate_factiii_auto_js_1.generateFactiiiAuto)(rootDir, { force: false });
104
- }
105
- else {
106
- console.log('\nNo configuration files to create.');
107
- }
348
+ await autoFix(rootDir);
349
+ }
350
+ }
351
+ /**
352
+ * First run: create configs, set up vault, explain what future runs will do.
353
+ */
354
+ async function firstRun(rootDir, options) {
355
+ console.log('Initializing Factiii Stack...\n');
356
+ // Generate stack.yml
357
+ const created = (0, generate_stack_yml_js_1.generateFactiiiYml)(rootDir, { force: true });
358
+ if (created) {
359
+ await (0, generate_stack_auto_js_1.generateFactiiiAuto)(rootDir, { force: true });
108
360
  }
109
361
  // Check prerequisites
110
362
  console.log('\nChecking prerequisites...\n');
@@ -127,12 +379,17 @@ async function init(options = {}) {
127
379
  console.log(' sudo yum install ansible (RHEL/CentOS)');
128
380
  }
129
381
  }
130
- // Vault setup (only if ansible is available and we created a new config)
131
- if (hasAnsibleVault && shouldCreateYml) {
382
+ // Vault setup (interactive, first time only)
383
+ if (hasAnsibleVault) {
132
384
  const vaultPassFile = path.join(os.homedir(), '.vault_pass');
133
385
  const hasExistingVaultPass = fs.existsSync(vaultPassFile);
134
386
  if (hasExistingVaultPass) {
135
387
  console.log(' [OK] Vault password file exists at ' + vaultPassFile);
388
+ // Auto-create vault structure if password exists
389
+ const vaultFixes = await ensureVaultSetup(rootDir, vaultPassFile);
390
+ for (const fix of vaultFixes) {
391
+ console.log(' [OK] ' + fix);
392
+ }
136
393
  }
137
394
  else {
138
395
  console.log('');
@@ -141,7 +398,6 @@ async function init(options = {}) {
141
398
  console.log('\n Create a vault password (keep this safe - you need it to access secrets):');
142
399
  const vaultPassword = await (0, secret_prompts_js_1.promptSingleLine)(' Vault password: ');
143
400
  if (vaultPassword && vaultPassword.trim().length > 0) {
144
- // Write vault password file
145
401
  fs.writeFileSync(vaultPassFile, vaultPassword.trim(), 'utf8');
146
402
  try {
147
403
  fs.chmodSync(vaultPassFile, 0o600);
@@ -150,27 +406,9 @@ async function init(options = {}) {
150
406
  // Windows doesn't support chmod - that's OK
151
407
  }
152
408
  console.log(' [OK] Vault password saved to ' + vaultPassFile);
153
- // Create group_vars/all/ directory
154
- const groupVarsDir = path.join(rootDir, 'group_vars', 'all');
155
- if (!fs.existsSync(groupVarsDir)) {
156
- fs.mkdirSync(groupVarsDir, { recursive: true });
157
- console.log(' [OK] Created ' + groupVarsDir);
158
- }
159
- // Initialize vault file
160
- try {
161
- const { AnsibleVaultSecrets } = await Promise.resolve().then(() => __importStar(require('../utils/ansible-vault-secrets.js')));
162
- const vault = new AnsibleVaultSecrets({
163
- vault_path: 'group_vars/all/vault.yml',
164
- vault_password_file: '~/.vault_pass',
165
- rootDir,
166
- });
167
- await vault.setSecret('_initialized', 'true');
168
- console.log(' [OK] Created encrypted vault at group_vars/all/vault.yml');
169
- }
170
- catch (e) {
171
- const msg = e instanceof Error ? e.message : String(e);
172
- console.log(' [!] Failed to create vault: ' + msg);
173
- console.log(' You can set it up later with: npx factiii secrets set <KEY>');
409
+ const vaultFixes = await ensureVaultSetup(rootDir, vaultPassFile);
410
+ for (const fix of vaultFixes) {
411
+ console.log(' [OK] ' + fix);
174
412
  }
175
413
  }
176
414
  else {
@@ -180,11 +418,86 @@ async function init(options = {}) {
180
418
  else {
181
419
  console.log(' [!] Skipped vault setup. Set up later:');
182
420
  console.log(' 1. Create vault password: echo "your-password" > ~/.vault_pass');
183
- console.log(' 2. Store a secret: npx factiii secrets set STAGING_SSH');
421
+ console.log(' 2. Store a secret: npx stack secrets set STAGING_SSH');
184
422
  }
185
423
  }
186
424
  }
425
+ // Create stack.local.yml with detected OS
426
+ console.log('');
427
+ ensureLocalConfig(rootDir);
428
+ // Copy .env.example to .env.staging / .env.prod
187
429
  console.log('');
430
+ ensureEnvFiles(rootDir);
431
+ // Prompt for missing secrets (SSH keys, AWS credentials)
432
+ if (hasAnsibleVault) {
433
+ await promptForMissingSecrets(rootDir);
434
+ }
435
+ // Tell the user what future runs will auto-fix
436
+ console.log('\n ────────────────────────────────────────────────');
437
+ console.log(' From now on, running `npx stack init` will auto-fix:');
438
+ console.log(' - Refresh auto-detected config (' + config_files_js_1.STACK_AUTO_FILENAME + ')');
439
+ console.log(' - Verify prerequisites (ansible-vault)');
440
+ console.log(' - Repair vault directory and files if missing');
441
+ console.log(' - Create ' + config_files_js_1.STACK_LOCAL_FILENAME + ' if missing');
442
+ console.log(' - Use --force to regenerate ' + config_files_js_1.STACK_CONFIG_FILENAME + ' from scratch');
443
+ console.log(' ────────────────────────────────────────────────\n');
444
+ }
445
+ /**
446
+ * Subsequent runs: auto-fix everything without prompts.
447
+ * Only reports what was actually changed.
448
+ */
449
+ async function autoFix(rootDir) {
450
+ const fixed = [];
451
+ // Always refresh auto-detected config
452
+ const autoPath = (0, config_files_js_1.getStackAutoPath)(rootDir);
453
+ const oldAutoContent = fs.existsSync(autoPath)
454
+ ? fs.readFileSync(autoPath, 'utf8')
455
+ : '';
456
+ await (0, generate_stack_auto_js_1.generateFactiiiAuto)(rootDir, { force: true });
457
+ const newAutoPath = (0, config_files_js_1.getStackAutoPath)(rootDir);
458
+ const newAutoContent = fs.existsSync(newAutoPath)
459
+ ? fs.readFileSync(newAutoPath, 'utf8')
460
+ : '';
461
+ if (oldAutoContent !== newAutoContent) {
462
+ fixed.push('Updated auto config with latest detection');
463
+ }
464
+ // Check prerequisites
465
+ const hasAnsibleVault = checkAnsibleVault();
466
+ if (!hasAnsibleVault) {
467
+ fixed.push('ansible-vault not found - install it to manage secrets');
468
+ }
469
+ // Auto-repair vault setup if vault password exists
470
+ if (hasAnsibleVault) {
471
+ const vaultPassFile = path.join(os.homedir(), '.vault_pass');
472
+ if (fs.existsSync(vaultPassFile)) {
473
+ const vaultFixes = await ensureVaultSetup(rootDir, vaultPassFile);
474
+ fixed.push(...vaultFixes);
475
+ }
476
+ }
477
+ // Auto-create stack.local.yml if missing
478
+ const localPath = (0, config_files_js_1.getStackLocalPath)(rootDir);
479
+ if (!fs.existsSync(localPath)) {
480
+ const devOS = detectDevOS();
481
+ const content = '# Local machine config (gitignored - each developer has their own)\n' +
482
+ '# Generated by: npx stack init\n' +
483
+ '\n' +
484
+ 'dev_os: ' + devOS + '\n';
485
+ fs.writeFileSync(localPath, content, 'utf8');
486
+ ensureGitignored(rootDir, config_files_js_1.STACK_LOCAL_FILENAME);
487
+ ensureGitignored(rootDir, 'factiii.local.yml');
488
+ fixed.push('Created ' + config_files_js_1.STACK_LOCAL_FILENAME + ' (dev_os: ' + devOS + ')');
489
+ }
490
+ // Report results
491
+ if (fixed.length === 0) {
492
+ console.log('Everything up to date.');
493
+ }
494
+ else {
495
+ console.log('Auto-fixed:\n');
496
+ for (const fix of fixed) {
497
+ console.log(' [OK] ' + fix);
498
+ }
499
+ console.log('');
500
+ }
188
501
  }
189
502
  exports.default = init;
190
503
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pr-check.d.ts","sourceRoot":"","sources":["../../src/cli/pr-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA4BH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAyBD;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAqFlF;AAED,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"pr-check.d.ts","sourceRoot":"","sources":["../../src/cli/pr-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA6BH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAyBD;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAqFlF;AAED,eAAe,OAAO,CAAC"}
@@ -50,13 +50,14 @@ exports.prCheck = prCheck;
50
50
  const fs = __importStar(require("fs"));
51
51
  const path = __importStar(require("path"));
52
52
  const js_yaml_1 = __importDefault(require("js-yaml"));
53
+ const config_files_js_1 = require("../constants/config-files.js");
53
54
  const index_js_1 = require("../plugins/index.js");
54
55
  const ssh_helper_js_1 = require("../utils/ssh-helper.js");
55
56
  const github_status_js_1 = require("../utils/github-status.js");
56
57
  const pr_check_js_1 = require("../plugins/pipelines/factiii/pr-check.js");
57
58
  const config_helpers_js_1 = require("../utils/config-helpers.js");
58
59
  function loadConfig(rootDir) {
59
- const configPath = path.join(rootDir, 'factiii.yml');
60
+ const configPath = (0, config_files_js_1.getStackConfigPath)(rootDir);
60
61
  if (!fs.existsSync(configPath)) {
61
62
  return {};
62
63
  }
@@ -86,7 +87,7 @@ async function prCheck(options = {}) {
86
87
  const environments = (0, config_helpers_js_1.extractEnvironments)(config);
87
88
  const stagingConfig = environments.staging;
88
89
  if (!stagingConfig?.domain) {
89
- console.log('\n❌ Staging not configured in factiii.yml (staging.domain required)');
90
+ console.log('\n❌ Staging not configured in config (staging.domain required)');
90
91
  return { success: false, error: 'Staging not configured' };
91
92
  }
92
93
  const plugins = await (0, index_js_1.loadRelevantPlugins)(rootDir, config);
@@ -102,10 +103,10 @@ async function prCheck(options = {}) {
102
103
  }
103
104
  // On server: run builds directly and report
104
105
  if (process.env.GITHUB_ACTIONS === 'true' || process.env.FACTIII_ON_SERVER === 'true') {
105
- // When SSH'd from workflow, we're run with cwd=repo (workflow does: cd $REPO_DIR && npx factiii pr-check)
106
+ // When SSH'd from workflow, we're run with cwd=repo (workflow does: cd $REPO_DIR && npx stack pr-check)
106
107
  const repoName = config.name ?? 'app';
107
108
  const defaultRepoDir = path.join(process.env.HOME ?? '', '.factiii', repoName);
108
- const repoDir = fs.existsSync(path.join(process.cwd(), 'factiii.yml'))
109
+ const repoDir = fs.existsSync((0, config_files_js_1.getStackConfigPath)(process.cwd()))
109
110
  ? process.cwd()
110
111
  : defaultRepoDir;
111
112
  if (!fs.existsSync(repoDir)) {
@@ -1 +1 @@
1
- {"version":3,"file":"pr-check.js","sourceRoot":"","sources":["../../src/cli/pr-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pr-check.js","sourceRoot":"","sources":["../../src/cli/pr-check.ts"],"names":[],"mappings":"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"}