@factiii/stack 0.1.41 → 0.1.44
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.
- package/dist/cli/deploy-secrets.d.ts.map +1 -1
- package/dist/cli/deploy-secrets.js +5 -52
- package/dist/cli/deploy-secrets.js.map +1 -1
- package/dist/cli/deploy.d.ts.map +1 -1
- package/dist/cli/deploy.js +1 -24
- package/dist/cli/deploy.js.map +1 -1
- package/dist/cli/dev-sync.d.ts.map +1 -1
- package/dist/cli/dev-sync.js +5 -20
- package/dist/cli/dev-sync.js.map +1 -1
- package/dist/cli/execute-plugin-command.d.ts.map +1 -1
- package/dist/cli/execute-plugin-command.js +2 -57
- package/dist/cli/execute-plugin-command.js.map +1 -1
- package/dist/cli/fix.d.ts.map +1 -1
- package/dist/cli/fix.js +3 -58
- package/dist/cli/fix.js.map +1 -1
- package/dist/cli/init.d.ts +5 -7
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +17 -298
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/pr-check.d.ts.map +1 -1
- package/dist/cli/pr-check.js +1 -17
- package/dist/cli/pr-check.js.map +1 -1
- package/dist/cli/scan.d.ts.map +1 -1
- package/dist/cli/scan.js +35 -51
- package/dist/cli/scan.js.map +1 -1
- package/dist/cli/secrets.d.ts.map +1 -1
- package/dist/cli/secrets.js +6 -15
- package/dist/cli/secrets.js.map +1 -1
- package/dist/cli/undeploy.d.ts.map +1 -1
- package/dist/cli/undeploy.js +2 -57
- package/dist/cli/undeploy.js.map +1 -1
- package/dist/generators/generate-stack-auto.d.ts.map +1 -1
- package/dist/generators/generate-stack-auto.js +15 -0
- package/dist/generators/generate-stack-auto.js.map +1 -1
- package/dist/generators/generate-stack-yml.d.ts +8 -20
- package/dist/generators/generate-stack-yml.d.ts.map +1 -1
- package/dist/generators/generate-stack-yml.js +28 -204
- package/dist/generators/generate-stack-yml.js.map +1 -1
- package/dist/generators/index.d.ts +1 -1
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +2 -3
- package/dist/generators/index.js.map +1 -1
- package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/index.js +2 -0
- package/dist/plugins/pipelines/factiii/index.js.map +1 -1
- package/dist/plugins/pipelines/factiii/scanfix/secrets.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/scanfix/secrets.js +1 -2
- package/dist/plugins/pipelines/factiii/scanfix/secrets.js.map +1 -1
- package/dist/plugins/pipelines/factiii/scanfix/vault.d.ts +13 -0
- package/dist/plugins/pipelines/factiii/scanfix/vault.d.ts.map +1 -0
- package/dist/plugins/pipelines/factiii/scanfix/vault.js +97 -0
- package/dist/plugins/pipelines/factiii/scanfix/vault.js.map +1 -0
- package/dist/plugins/servers/mac/staging.d.ts.map +1 -1
- package/dist/plugins/servers/mac/staging.js +9 -8
- package/dist/plugins/servers/mac/staging.js.map +1 -1
- package/dist/utils/config-helpers.d.ts +8 -0
- package/dist/utils/config-helpers.d.ts.map +1 -1
- package/dist/utils/config-helpers.js +50 -0
- package/dist/utils/config-helpers.js.map +1 -1
- package/dist/utils/secret-prompts.d.ts +2 -0
- package/dist/utils/secret-prompts.d.ts.map +1 -1
- package/dist/utils/secret-prompts.js +14 -2
- package/dist/utils/secret-prompts.js.map +1 -1
- package/dist/utils/ssh-helper.d.ts.map +1 -1
- package/dist/utils/ssh-helper.js +16 -8
- package/dist/utils/ssh-helper.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/init.js
CHANGED
|
@@ -2,14 +2,12 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Init Command
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* - Secret prompting (SSH keys, AWS credentials)
|
|
8
|
-
* - --force flag to regenerate stack.yml from scratch
|
|
5
|
+
* Scans the codebase and creates stack.yml with auto-detected settings
|
|
6
|
+
* and EXAMPLE_ placeholder values for the user to fill in.
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* factiii pipeline
|
|
8
|
+
* This command only initializes config files — it does not fix anything.
|
|
9
|
+
* Vault setup, secrets, and all other fixes are handled by scanfixes
|
|
10
|
+
* in the factiii pipeline (run: npx stack scan / npx stack fix).
|
|
13
11
|
*/
|
|
14
12
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
13
|
if (k2 === undefined) k2 = k;
|
|
@@ -44,232 +42,22 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
44
42
|
return result;
|
|
45
43
|
};
|
|
46
44
|
})();
|
|
47
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
48
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
49
|
-
};
|
|
50
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
46
|
exports.init = init;
|
|
52
|
-
const path = __importStar(require("path"));
|
|
53
|
-
const config_files_js_1 = require("../constants/config-files.js");
|
|
54
47
|
const fs = __importStar(require("fs"));
|
|
55
|
-
const
|
|
56
|
-
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
57
|
-
const child_process_1 = require("child_process");
|
|
48
|
+
const config_files_js_1 = require("../constants/config-files.js");
|
|
58
49
|
const generate_stack_yml_js_1 = require("../generators/generate-stack-yml.js");
|
|
59
|
-
const secret_prompts_js_1 = require("../utils/secret-prompts.js");
|
|
60
|
-
const config_helpers_js_1 = require("../utils/config-helpers.js");
|
|
61
|
-
/**
|
|
62
|
-
* Check if ansible-vault CLI is available
|
|
63
|
-
*/
|
|
64
|
-
function checkAnsibleVault() {
|
|
65
|
-
try {
|
|
66
|
-
(0, child_process_1.execSync)('ansible-vault --version', { stdio: 'pipe' });
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
catch {
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Ensure group_vars/all/ directory and encrypted vault file exist.
|
|
75
|
-
* Returns what was fixed (empty array if nothing needed fixing).
|
|
76
|
-
*/
|
|
77
|
-
async function ensureVaultSetup(rootDir, _vaultPassFile) {
|
|
78
|
-
const fixed = [];
|
|
79
|
-
const groupVarsDir = path.join(rootDir, 'group_vars', 'all');
|
|
80
|
-
if (!fs.existsSync(groupVarsDir)) {
|
|
81
|
-
fs.mkdirSync(groupVarsDir, { recursive: true });
|
|
82
|
-
fixed.push('Created ' + groupVarsDir);
|
|
83
|
-
}
|
|
84
|
-
const vaultFilePath = path.join(rootDir, 'group_vars', 'all', 'vault.yml');
|
|
85
|
-
if (!fs.existsSync(vaultFilePath)) {
|
|
86
|
-
try {
|
|
87
|
-
const { AnsibleVaultSecrets } = await Promise.resolve().then(() => __importStar(require('../utils/ansible-vault-secrets.js')));
|
|
88
|
-
const vault = new AnsibleVaultSecrets({
|
|
89
|
-
vault_path: 'group_vars/all/vault.yml',
|
|
90
|
-
vault_password_file: '~/.vault_pass',
|
|
91
|
-
rootDir,
|
|
92
|
-
});
|
|
93
|
-
await vault.setSecret('_initialized', 'true');
|
|
94
|
-
fixed.push('Created encrypted vault at group_vars/all/vault.yml');
|
|
95
|
-
}
|
|
96
|
-
catch (e) {
|
|
97
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
98
|
-
fixed.push('Failed to create vault: ' + msg);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return fixed;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Extract SSH key from vault to ~/.ssh/{stage}_deploy_key
|
|
105
|
-
* With safety check: asks before overwriting existing key
|
|
106
|
-
*/
|
|
107
|
-
async function extractSSHKeyToFile(vault, stage, _rootDir) {
|
|
108
|
-
const keyName = stage + '_deploy_key';
|
|
109
|
-
const sshDir = path.join(os.homedir(), '.ssh');
|
|
110
|
-
const keyPath = path.join(sshDir, keyName);
|
|
111
|
-
// Safety check: don't overwrite existing keys without asking
|
|
112
|
-
if (fs.existsSync(keyPath)) {
|
|
113
|
-
const overwrite = await (0, secret_prompts_js_1.confirm)(' SSH key already exists at ' + keyPath + ' - overwrite?', false);
|
|
114
|
-
if (!overwrite) {
|
|
115
|
-
console.log(' [--] Keeping existing key at ' + keyPath);
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
try {
|
|
120
|
-
const key = await vault.getSSHKey(stage);
|
|
121
|
-
if (!key) {
|
|
122
|
-
console.log(' [!] No ' + stage.toUpperCase() + '_SSH key found in vault');
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
if (!fs.existsSync(sshDir)) {
|
|
126
|
-
fs.mkdirSync(sshDir, { recursive: true });
|
|
127
|
-
}
|
|
128
|
-
fs.writeFileSync(keyPath, key, 'utf8');
|
|
129
|
-
try {
|
|
130
|
-
fs.chmodSync(keyPath, 0o600);
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
// Windows doesn't support chmod
|
|
134
|
-
}
|
|
135
|
-
console.log(' [OK] Wrote SSH key to ' + keyPath);
|
|
136
|
-
}
|
|
137
|
-
catch (e) {
|
|
138
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
139
|
-
console.log(' [!] Failed to extract SSH key: ' + msg);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Load config and prompt for missing secrets (SSH keys, AWS credentials)
|
|
144
|
-
*/
|
|
145
|
-
async function promptForMissingSecrets(rootDir) {
|
|
146
|
-
const configPath = (0, config_files_js_1.getStackConfigPath)(rootDir);
|
|
147
|
-
if (!fs.existsSync(configPath))
|
|
148
|
-
return;
|
|
149
|
-
let config;
|
|
150
|
-
try {
|
|
151
|
-
config = js_yaml_1.default.load(fs.readFileSync(configPath, 'utf8')) ?? {};
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
if (!config.ansible?.vault_path)
|
|
157
|
-
return;
|
|
158
|
-
const environments = (0, config_helpers_js_1.extractEnvironments)(config);
|
|
159
|
-
const hasStaging = !!environments.staging;
|
|
160
|
-
const hasProd = !!environments.prod || !!environments.production;
|
|
161
|
-
const hasAWS = Object.values(environments).some((env) => env.pipeline === 'aws' || env.access_key_id);
|
|
162
|
-
if (!hasStaging && !hasProd && !hasAWS)
|
|
163
|
-
return;
|
|
164
|
-
let vault;
|
|
165
|
-
try {
|
|
166
|
-
const { AnsibleVaultSecrets } = await Promise.resolve().then(() => __importStar(require('../utils/ansible-vault-secrets.js')));
|
|
167
|
-
vault = new AnsibleVaultSecrets({
|
|
168
|
-
vault_path: config.ansible.vault_path,
|
|
169
|
-
vault_password_file: config.ansible.vault_password_file ?? '~/.vault_pass',
|
|
170
|
-
rootDir,
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
return;
|
|
175
|
-
}
|
|
176
|
-
console.log('\n Checking secrets...\n');
|
|
177
|
-
// Check STAGING_SSH
|
|
178
|
-
if (hasStaging) {
|
|
179
|
-
try {
|
|
180
|
-
const check = await vault.checkSecrets(['STAGING_SSH']);
|
|
181
|
-
if (check.missing.includes('STAGING_SSH')) {
|
|
182
|
-
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);
|
|
183
|
-
if (addNow) {
|
|
184
|
-
const value = await (0, secret_prompts_js_1.promptForSecret)('STAGING_SSH', config);
|
|
185
|
-
if (value) {
|
|
186
|
-
await vault.setSecret('STAGING_SSH', value);
|
|
187
|
-
console.log(' [OK] STAGING_SSH stored in vault');
|
|
188
|
-
await extractSSHKeyToFile(vault, 'staging', rootDir);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
console.log(' [--] Skipped STAGING_SSH');
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
else {
|
|
196
|
-
console.log(' [OK] STAGING_SSH already in vault');
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
catch (e) {
|
|
200
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
201
|
-
console.log(' [!] Could not check STAGING_SSH: ' + msg);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
// Check PROD_SSH
|
|
205
|
-
if (hasProd) {
|
|
206
|
-
try {
|
|
207
|
-
const check = await vault.checkSecrets(['PROD_SSH']);
|
|
208
|
-
if (check.missing.includes('PROD_SSH')) {
|
|
209
|
-
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);
|
|
210
|
-
if (addNow) {
|
|
211
|
-
const value = await (0, secret_prompts_js_1.promptForSecret)('PROD_SSH', config);
|
|
212
|
-
if (value) {
|
|
213
|
-
await vault.setSecret('PROD_SSH', value);
|
|
214
|
-
console.log(' [OK] PROD_SSH stored in vault');
|
|
215
|
-
await extractSSHKeyToFile(vault, 'prod', rootDir);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
console.log(' [--] Skipped PROD_SSH');
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
console.log(' [OK] PROD_SSH already in vault');
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
catch (e) {
|
|
227
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
228
|
-
console.log(' [!] Could not check PROD_SSH: ' + msg);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
// Check AWS_SECRET_ACCESS_KEY
|
|
232
|
-
if (hasAWS) {
|
|
233
|
-
try {
|
|
234
|
-
const check = await vault.checkSecrets(['AWS_SECRET_ACCESS_KEY']);
|
|
235
|
-
if (check.missing.includes('AWS_SECRET_ACCESS_KEY')) {
|
|
236
|
-
const addNow = await (0, secret_prompts_js_1.confirm)(' Add AWS Secret Access Key now?', false);
|
|
237
|
-
if (addNow) {
|
|
238
|
-
const value = await (0, secret_prompts_js_1.promptForSecret)('AWS_SECRET_ACCESS_KEY', config);
|
|
239
|
-
if (value) {
|
|
240
|
-
await vault.setSecret('AWS_SECRET_ACCESS_KEY', value);
|
|
241
|
-
console.log(' [OK] AWS_SECRET_ACCESS_KEY stored in vault');
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
console.log(' [--] Skipped AWS_SECRET_ACCESS_KEY');
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
console.log(' [OK] AWS_SECRET_ACCESS_KEY already in vault');
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
catch (e) {
|
|
253
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
254
|
-
console.log(' [!] Could not check AWS_SECRET_ACCESS_KEY: ' + msg);
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
50
|
async function init(options = {}) {
|
|
259
51
|
const rootDir = options.rootDir ?? process.cwd();
|
|
260
52
|
const configPath = (0, config_files_js_1.getStackConfigPath)(rootDir);
|
|
261
53
|
const isFirstRun = !fs.existsSync(configPath);
|
|
262
|
-
// ============================================================
|
|
263
|
-
// Step 1: Create stack.yml (scan codebase + generate template)
|
|
264
|
-
// ============================================================
|
|
265
54
|
if (options.force) {
|
|
266
55
|
console.log('Regenerating ' + config_files_js_1.STACK_CONFIG_FILENAME + '...\n');
|
|
267
|
-
(0, generate_stack_yml_js_1.
|
|
56
|
+
(0, generate_stack_yml_js_1.generateSmartStackYml)(rootDir, { force: true });
|
|
268
57
|
}
|
|
269
58
|
else if (isFirstRun) {
|
|
270
59
|
console.log('Scanning codebase...\n');
|
|
271
|
-
const
|
|
272
|
-
const created = generateSmartStackYml(rootDir);
|
|
60
|
+
const created = (0, generate_stack_yml_js_1.generateSmartStackYml)(rootDir);
|
|
273
61
|
if (created) {
|
|
274
62
|
console.log('');
|
|
275
63
|
console.log(' ' + config_files_js_1.STACK_CONFIG_FILENAME + ' is the configuration for everything.');
|
|
@@ -281,84 +69,15 @@ async function init(options = {}) {
|
|
|
281
69
|
console.log('[OK] ' + config_files_js_1.STACK_CONFIG_FILENAME + ' already exists');
|
|
282
70
|
console.log(' (use --force to regenerate)\n');
|
|
283
71
|
}
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
async function setupVaultAndSecrets(rootDir) {
|
|
294
|
-
console.log('Checking prerequisites...\n');
|
|
295
|
-
const hasAnsibleVault = checkAnsibleVault();
|
|
296
|
-
if (hasAnsibleVault) {
|
|
297
|
-
console.log(' [OK] ansible-vault is installed');
|
|
298
|
-
}
|
|
299
|
-
else {
|
|
300
|
-
console.log(' [!] ansible-vault not found');
|
|
301
|
-
console.log(' Ansible Vault is required for managing secrets.');
|
|
302
|
-
console.log(' Install:');
|
|
303
|
-
if (process.platform === 'darwin') {
|
|
304
|
-
console.log(' brew install ansible');
|
|
305
|
-
}
|
|
306
|
-
else if (process.platform === 'win32') {
|
|
307
|
-
console.log(' pip install ansible');
|
|
308
|
-
}
|
|
309
|
-
else {
|
|
310
|
-
console.log(' sudo apt install ansible (Debian/Ubuntu)');
|
|
311
|
-
console.log(' sudo yum install ansible (RHEL/CentOS)');
|
|
312
|
-
}
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
// Vault setup (interactive)
|
|
316
|
-
const vaultPassFile = path.join(os.homedir(), '.vault_pass');
|
|
317
|
-
const hasExistingVaultPass = fs.existsSync(vaultPassFile);
|
|
318
|
-
if (hasExistingVaultPass) {
|
|
319
|
-
console.log(' [OK] Vault password file exists at ' + vaultPassFile);
|
|
320
|
-
// Auto-create vault structure if password exists
|
|
321
|
-
const vaultFixes = await ensureVaultSetup(rootDir, vaultPassFile);
|
|
322
|
-
for (const fix of vaultFixes) {
|
|
323
|
-
console.log(' [OK] ' + fix);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
else {
|
|
327
|
-
console.log('');
|
|
328
|
-
const setupVault = await (0, secret_prompts_js_1.confirm)('Set up Ansible Vault for secrets now?', true);
|
|
329
|
-
if (setupVault) {
|
|
330
|
-
console.log('\n Create a vault password (keep this safe - you need it to access secrets):');
|
|
331
|
-
const vaultPassword = await (0, secret_prompts_js_1.promptSingleLine)(' Vault password: ', { hidden: true });
|
|
332
|
-
if (vaultPassword && vaultPassword.trim().length > 0) {
|
|
333
|
-
fs.writeFileSync(vaultPassFile, vaultPassword.trim(), 'utf8');
|
|
334
|
-
try {
|
|
335
|
-
fs.chmodSync(vaultPassFile, 0o600);
|
|
336
|
-
}
|
|
337
|
-
catch {
|
|
338
|
-
// Windows doesn't support chmod - that's OK
|
|
339
|
-
}
|
|
340
|
-
console.log(' [OK] Vault password saved to ' + vaultPassFile);
|
|
341
|
-
const vaultFixes = await ensureVaultSetup(rootDir, vaultPassFile);
|
|
342
|
-
for (const fix of vaultFixes) {
|
|
343
|
-
console.log(' [OK] ' + fix);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
console.log(' [!] Skipped vault setup (no password provided)');
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
351
|
-
console.log(' [!] Skipped vault setup. Set up later:');
|
|
352
|
-
console.log(' 1. Create vault password: echo "your-password" > ~/.vault_pass');
|
|
353
|
-
console.log(' 2. Store a secret: npx stack secrets set STAGING_SSH');
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
// Prompt for missing secrets (SSH keys, AWS credentials)
|
|
357
|
-
await promptForMissingSecrets(rootDir);
|
|
358
|
-
console.log('\n ────────────────────────────────────────────────');
|
|
359
|
-
console.log(' Config files are managed by `npx stack` (scan/fix).');
|
|
360
|
-
console.log(' This command only handles vault and secrets setup.');
|
|
361
|
-
console.log(' ────────────────────────────────────────────────\n');
|
|
72
|
+
console.log(' ────────────────────────────────────────────────');
|
|
73
|
+
console.log(' NEXT STEPS');
|
|
74
|
+
console.log(' ────────────────────────────────────────────────');
|
|
75
|
+
console.log('');
|
|
76
|
+
console.log(' 1. Replace all EXAMPLE_ values in ' + config_files_js_1.STACK_CONFIG_FILENAME);
|
|
77
|
+
console.log(' 2. npx stack scan -> check what needs fixing');
|
|
78
|
+
console.log(' 3. npx stack fix -> auto-fix issues');
|
|
79
|
+
console.log(' 4. npx stack secrets set -> store SSH keys & credentials');
|
|
80
|
+
console.log('');
|
|
362
81
|
}
|
|
363
82
|
exports.default = init;
|
|
364
83
|
//# sourceMappingURL=init.js.map
|
package/dist/cli/init.js.map
CHANGED
|
@@ -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":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOH,oBA+BC;AApCD,uCAAyB;AACzB,kEAAyF;AACzF,+EAA4E;AAGrE,KAAK,UAAU,IAAI,CAAC,UAAuB,EAAE;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,IAAA,oCAAkB,EAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAE9C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,uCAAqB,GAAG,OAAO,CAAC,CAAC;QAC/D,IAAA,6CAAqB,EAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAA,6CAAqB,EAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,uCAAqB,GAAG,uCAAuC,CAAC,CAAC;YACpF,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,uCAAqB,GAAG,iBAAiB,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,sCAAsC,GAAG,uCAAqB,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,kBAAe,IAAI,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-check.d.ts","sourceRoot":"","sources":["../../src/cli/pr-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"pr-check.d.ts","sourceRoot":"","sources":["../../src/cli/pr-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2BH,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;AAcD;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAqFlF;AAED,eAAe,OAAO,CAAC"}
|
package/dist/cli/pr-check.js
CHANGED
|
@@ -42,32 +42,16 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
42
42
|
return result;
|
|
43
43
|
};
|
|
44
44
|
})();
|
|
45
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
46
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
47
|
-
};
|
|
48
45
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
46
|
exports.prCheck = prCheck;
|
|
50
47
|
const fs = __importStar(require("fs"));
|
|
51
48
|
const path = __importStar(require("path"));
|
|
52
|
-
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
53
49
|
const config_files_js_1 = require("../constants/config-files.js");
|
|
54
50
|
const index_js_1 = require("../plugins/index.js");
|
|
55
51
|
const ssh_helper_js_1 = require("../utils/ssh-helper.js");
|
|
56
52
|
const github_status_js_1 = require("../utils/github-status.js");
|
|
57
53
|
const pr_check_js_1 = require("../plugins/pipelines/factiii/pr-check.js");
|
|
58
54
|
const config_helpers_js_1 = require("../utils/config-helpers.js");
|
|
59
|
-
function loadConfig(rootDir) {
|
|
60
|
-
const configPath = (0, config_files_js_1.getStackConfigPath)(rootDir);
|
|
61
|
-
if (!fs.existsSync(configPath)) {
|
|
62
|
-
return {};
|
|
63
|
-
}
|
|
64
|
-
try {
|
|
65
|
-
return js_yaml_1.default.load(fs.readFileSync(configPath, 'utf8')) ?? {};
|
|
66
|
-
}
|
|
67
|
-
catch {
|
|
68
|
-
return {};
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
55
|
function formatBuildReport(results) {
|
|
72
56
|
const lines = ['## Factiii PR Check – Build Results\n'];
|
|
73
57
|
for (const r of results) {
|
|
@@ -83,7 +67,7 @@ function formatBuildReport(results) {
|
|
|
83
67
|
*/
|
|
84
68
|
async function prCheck(options = {}) {
|
|
85
69
|
const rootDir = options.rootDir ?? process.cwd();
|
|
86
|
-
const config = loadConfig(rootDir);
|
|
70
|
+
const config = (0, config_helpers_js_1.loadConfig)(rootDir);
|
|
87
71
|
const environments = (0, config_helpers_js_1.extractEnvironments)(config);
|
|
88
72
|
const stagingConfig = environments.staging;
|
|
89
73
|
if (!stagingConfig?.domain) {
|
package/dist/cli/pr-check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-check.js","sourceRoot":"","sources":["../../src/cli/pr-check.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG
|
|
1
|
+
{"version":3,"file":"pr-check.js","sourceRoot":"","sources":["../../src/cli/pr-check.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/scan.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/cli/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AAOH,OAAO,KAAK,EAA2C,WAAW,EAAE,YAAY,EAAY,MAAM,mBAAmB,CAAC;AA4XtH;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,GAAE,WAAgB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,CA0L7F;AAED,eAAe,IAAI,CAAC"}
|
package/dist/cli/scan.js
CHANGED
|
@@ -91,15 +91,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
91
91
|
return result;
|
|
92
92
|
};
|
|
93
93
|
})();
|
|
94
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
95
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
96
|
-
};
|
|
97
94
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
98
95
|
exports.scan = scan;
|
|
99
96
|
const fs = __importStar(require("fs"));
|
|
100
97
|
const path = __importStar(require("path"));
|
|
101
98
|
const child_process_1 = require("child_process");
|
|
102
|
-
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
103
99
|
const config_files_js_1 = require("../constants/config-files.js");
|
|
104
100
|
const index_js_1 = require("../plugins/index.js");
|
|
105
101
|
const config_helpers_js_1 = require("../utils/config-helpers.js");
|
|
@@ -108,23 +104,21 @@ const config_helpers_js_1 = require("../utils/config-helpers.js");
|
|
|
108
104
|
* Returns null if no config exists (bootstrap needed).
|
|
109
105
|
*/
|
|
110
106
|
async function loadPlugins(rootDir) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (!
|
|
114
|
-
const configPath = (0, config_files_js_1.getStackConfigPath)(rootDir);
|
|
115
|
-
if (fs.existsSync(configPath)) {
|
|
116
|
-
const content = fs.readFileSync(configPath, 'utf8');
|
|
117
|
-
if (!content || content.trim().length === 0) {
|
|
118
|
-
return null; // Empty config — needs bootstrap
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
console.error('\n[ERROR] Config contains no valid configuration.');
|
|
122
|
-
console.error(' Check your YAML syntax or run: npx stack init --force\n');
|
|
123
|
-
process.exit(1);
|
|
124
|
-
}
|
|
125
|
-
}
|
|
107
|
+
// Check if stack.yml exists (must exist before merging stackAuto.yml)
|
|
108
|
+
const configPath = (0, config_files_js_1.getStackConfigPath)(rootDir);
|
|
109
|
+
if (!fs.existsSync(configPath)) {
|
|
126
110
|
return null; // No config file — needs bootstrap
|
|
127
111
|
}
|
|
112
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
113
|
+
if (!content || content.trim().length === 0) {
|
|
114
|
+
return null; // Empty config — needs bootstrap
|
|
115
|
+
}
|
|
116
|
+
const config = (0, config_helpers_js_1.loadConfig)(rootDir);
|
|
117
|
+
if (!config || Object.keys(config).length === 0) {
|
|
118
|
+
console.error('\n[ERROR] Config contains no valid configuration.');
|
|
119
|
+
console.error(' Check your YAML syntax or run: npx stack init --force\n');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
128
122
|
return (await (0, index_js_1.loadRelevantPlugins)(rootDir, config));
|
|
129
123
|
}
|
|
130
124
|
/**
|
|
@@ -174,23 +168,6 @@ async function runBootstrapFixes(plugins, rootDir) {
|
|
|
174
168
|
}
|
|
175
169
|
}
|
|
176
170
|
}
|
|
177
|
-
/**
|
|
178
|
-
* Load config from stack.yml (or legacy stack.yml)
|
|
179
|
-
*/
|
|
180
|
-
function loadConfig(rootDir) {
|
|
181
|
-
const configPath = (0, config_files_js_1.getStackConfigPath)(rootDir);
|
|
182
|
-
if (!fs.existsSync(configPath)) {
|
|
183
|
-
return {};
|
|
184
|
-
}
|
|
185
|
-
try {
|
|
186
|
-
return js_yaml_1.default.load(fs.readFileSync(configPath, 'utf8')) ?? {};
|
|
187
|
-
}
|
|
188
|
-
catch (e) {
|
|
189
|
-
const errorMessage = e instanceof Error ? e.message : String(e);
|
|
190
|
-
console.error('[!] Error parsing config: ' + errorMessage);
|
|
191
|
-
return {};
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
171
|
/**
|
|
195
172
|
* Generate env var fixes from plugin requiredEnvVars
|
|
196
173
|
*/
|
|
@@ -223,7 +200,8 @@ function generateEnvVarFixes(plugin, rootDir, _config) {
|
|
|
223
200
|
plugin: plugin.id,
|
|
224
201
|
scan: async (config) => {
|
|
225
202
|
// Only check if staging environment is defined in config
|
|
226
|
-
const
|
|
203
|
+
const { extractEnvironments: getEnvs } = await Promise.resolve().then(() => __importStar(require('../utils/config-helpers.js')));
|
|
204
|
+
const hasStagingEnv = getEnvs(config).staging;
|
|
227
205
|
if (!hasStagingEnv)
|
|
228
206
|
return false; // Skip check if staging not configured
|
|
229
207
|
const envPath = path.join(rootDir, '.env.staging');
|
|
@@ -244,7 +222,9 @@ function generateEnvVarFixes(plugin, rootDir, _config) {
|
|
|
244
222
|
plugin: plugin.id,
|
|
245
223
|
scan: async (config) => {
|
|
246
224
|
// Only check if prod environment is defined in config
|
|
247
|
-
const
|
|
225
|
+
const { extractEnvironments: getEnvs } = await Promise.resolve().then(() => __importStar(require('../utils/config-helpers.js')));
|
|
226
|
+
const envs = getEnvs(config);
|
|
227
|
+
const hasProdEnv = envs.prod || envs.production;
|
|
248
228
|
if (!hasProdEnv)
|
|
249
229
|
return false; // Skip check if prod not configured
|
|
250
230
|
const envPath = path.join(rootDir, '.env.prod');
|
|
@@ -353,26 +333,23 @@ function displayProblems(problems, reachability, options = {}) {
|
|
|
353
333
|
console.log(' ansible:');
|
|
354
334
|
console.log(' vault_path: group_vars/all/vault.yml');
|
|
355
335
|
console.log(' vault_password_file: ~/.vault_pass');
|
|
356
|
-
console.log(' Or run: npx stack init');
|
|
357
336
|
}
|
|
358
337
|
else if (reasonLower.includes('vault password') || reasonLower.includes('vault_pass')) {
|
|
359
338
|
console.log(' Fix: Create vault password file:');
|
|
360
|
-
console.log(' echo "your-password" > ~/.vault_pass');
|
|
361
|
-
console.log(' Or run: npx stack init');
|
|
339
|
+
console.log(' echo "your-password" > ~/.vault_pass && chmod 600 ~/.vault_pass');
|
|
362
340
|
}
|
|
363
341
|
else if (reasonLower.includes('ssh') || reasonLower.includes('deploy_key')) {
|
|
364
342
|
console.log(' Fix: Set up SSH key for ' + stage + ':');
|
|
365
|
-
console.log(' npx stack init (guided setup)');
|
|
366
343
|
console.log(' npx stack secrets set ' + stage.toUpperCase() + '_SSH (add key to vault)');
|
|
367
344
|
console.log(' npx stack secrets write-ssh-keys (extract keys to ~/.ssh/)');
|
|
368
345
|
}
|
|
369
346
|
else if (reasonLower.includes('github_token')) {
|
|
370
347
|
console.log(' Fix: export GITHUB_TOKEN=your_token');
|
|
371
348
|
console.log(' Or set up SSH keys instead (preferred):');
|
|
372
|
-
console.log(' npx stack
|
|
349
|
+
console.log(' npx stack fix --secrets');
|
|
373
350
|
}
|
|
374
351
|
else {
|
|
375
|
-
console.log(' Fix: npx stack
|
|
352
|
+
console.log(' Fix: npx stack fix');
|
|
376
353
|
}
|
|
377
354
|
console.log('');
|
|
378
355
|
}
|
|
@@ -458,12 +435,12 @@ async function scan(options = {}, _isRerun = false) {
|
|
|
458
435
|
console.log('');
|
|
459
436
|
console.log(' Run: npx stack init');
|
|
460
437
|
console.log('');
|
|
461
|
-
console.log(' This will scan your codebase
|
|
462
|
-
console.log(' EXAMPLE_ values
|
|
438
|
+
console.log(' This will scan your codebase and create stack.yml');
|
|
439
|
+
console.log(' with EXAMPLE_ values for you to fill in.');
|
|
463
440
|
console.log('');
|
|
464
441
|
return { dev: [], secrets: [], staging: [], prod: [] };
|
|
465
442
|
}
|
|
466
|
-
const config = loadConfig(rootDir);
|
|
443
|
+
const config = (0, config_helpers_js_1.loadConfig)(rootDir);
|
|
467
444
|
// If commit hash provided, verify we're scanning the right code
|
|
468
445
|
if (options.commit) {
|
|
469
446
|
try {
|
|
@@ -523,11 +500,16 @@ async function scan(options = {}, _isRerun = false) {
|
|
|
523
500
|
localStages.push(stage);
|
|
524
501
|
}
|
|
525
502
|
}
|
|
526
|
-
// Collect all fixes from all plugins
|
|
503
|
+
// Collect all fixes from all plugins (deduplicate by id+stage)
|
|
527
504
|
const allFixes = [];
|
|
505
|
+
const seenFixKeys = new Set();
|
|
528
506
|
for (const plugin of plugins) {
|
|
529
507
|
// Add plugin fixes
|
|
530
508
|
for (const fix of plugin.fixes ?? []) {
|
|
509
|
+
const key = fix.id + ':' + fix.stage;
|
|
510
|
+
if (seenFixKeys.has(key))
|
|
511
|
+
continue; // Skip duplicate
|
|
512
|
+
seenFixKeys.add(key);
|
|
531
513
|
allFixes.push({ ...fix, plugin: plugin.id });
|
|
532
514
|
}
|
|
533
515
|
// Add auto-generated env var fixes
|
|
@@ -599,10 +581,12 @@ async function scan(options = {}, _isRerun = false) {
|
|
|
599
581
|
// Remote stages: delegate to pipeline plugin
|
|
600
582
|
if (remoteStages.length > 0 && !options.silent) {
|
|
601
583
|
const PipelineClass = pipelinePlugin;
|
|
602
|
-
if (PipelineClass) {
|
|
584
|
+
if (PipelineClass && typeof PipelineClass === 'function') {
|
|
603
585
|
const pipeline = new PipelineClass(config);
|
|
604
|
-
|
|
605
|
-
|
|
586
|
+
if (typeof pipeline.scanStage === 'function') {
|
|
587
|
+
for (const stage of remoteStages) {
|
|
588
|
+
await pipeline.scanStage(stage, {});
|
|
589
|
+
}
|
|
606
590
|
}
|
|
607
591
|
}
|
|
608
592
|
}
|