@factiii/stack 0.1.189 → 0.1.191

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 (65) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +403 -441
  3. package/bin/stack +333 -300
  4. package/dist/cli/dev-sync.js +16 -16
  5. package/dist/cli/secrets.d.ts +6 -1
  6. package/dist/cli/secrets.d.ts.map +1 -1
  7. package/dist/cli/secrets.js +228 -0
  8. package/dist/cli/secrets.js.map +1 -1
  9. package/dist/plugins/addons/auth/index.js +7 -7
  10. package/dist/plugins/addons/dns/index.d.ts +47 -0
  11. package/dist/plugins/addons/dns/index.d.ts.map +1 -0
  12. package/dist/plugins/addons/dns/index.js +104 -0
  13. package/dist/plugins/addons/dns/index.js.map +1 -0
  14. package/dist/plugins/addons/dns/scanfix/dev.d.ts +13 -0
  15. package/dist/plugins/addons/dns/scanfix/dev.d.ts.map +1 -0
  16. package/dist/plugins/addons/dns/scanfix/dev.js +235 -0
  17. package/dist/plugins/addons/dns/scanfix/dev.js.map +1 -0
  18. package/dist/plugins/addons/server-mode/index.d.ts.map +1 -1
  19. package/dist/plugins/addons/server-mode/index.js +6 -0
  20. package/dist/plugins/addons/server-mode/index.js.map +1 -1
  21. package/dist/plugins/addons/server-mode/scanfix/env-marker.d.ts +17 -0
  22. package/dist/plugins/addons/server-mode/scanfix/env-marker.d.ts.map +1 -0
  23. package/dist/plugins/addons/server-mode/scanfix/env-marker.js +195 -0
  24. package/dist/plugins/addons/server-mode/scanfix/env-marker.js.map +1 -0
  25. package/dist/plugins/addons/server-mode/scanfix/tailscale.d.ts +16 -0
  26. package/dist/plugins/addons/server-mode/scanfix/tailscale.d.ts.map +1 -0
  27. package/dist/plugins/addons/server-mode/scanfix/tailscale.js +211 -0
  28. package/dist/plugins/addons/server-mode/scanfix/tailscale.js.map +1 -0
  29. package/dist/plugins/addons/vercel/index.js +9 -9
  30. package/dist/plugins/addons/vercel/scanfix/config.js +10 -10
  31. package/dist/plugins/addons/vercel/scanfix/token.js +15 -15
  32. package/dist/plugins/approved.json +13 -13
  33. package/dist/plugins/index.d.ts.map +1 -1
  34. package/dist/plugins/index.js +8 -0
  35. package/dist/plugins/index.js.map +1 -1
  36. package/dist/plugins/pipelines/aws/index.js +12 -12
  37. package/dist/plugins/pipelines/aws/policies/bootstrap-policy.json +135 -135
  38. package/dist/plugins/pipelines/aws/prod.js +1 -1
  39. package/dist/plugins/pipelines/factiii/prod.d.ts +1 -1
  40. package/dist/plugins/pipelines/factiii/prod.d.ts.map +1 -1
  41. package/dist/plugins/pipelines/factiii/prod.js +66 -25
  42. package/dist/plugins/pipelines/factiii/prod.js.map +1 -1
  43. package/dist/plugins/pipelines/factiii/scanfix/start-sh.d.ts.map +1 -1
  44. package/dist/plugins/pipelines/factiii/scanfix/start-sh.js +3 -11
  45. package/dist/plugins/pipelines/factiii/scanfix/start-sh.js.map +1 -1
  46. package/dist/plugins/pipelines/factiii/staging.js +23 -23
  47. package/dist/plugins/pipelines/factiii/workflows/stack-ci.yml +75 -75
  48. package/dist/plugins/pipelines/factiii/workflows/stack-cicd-prod.yml +73 -73
  49. package/dist/plugins/servers/amazon-linux/index.js +16 -16
  50. package/dist/plugins/servers/mac/index.js +12 -12
  51. package/dist/plugins/servers/mac/staging.js +2 -2
  52. package/dist/plugins/servers/ubuntu/index.js +23 -23
  53. package/dist/plugins/servers/windows/index.js +15 -15
  54. package/dist/scripts/generate-all.js +73 -73
  55. package/dist/utils/ansible-vault-secrets.d.ts +8 -0
  56. package/dist/utils/ansible-vault-secrets.d.ts.map +1 -1
  57. package/dist/utils/ansible-vault-secrets.js +54 -0
  58. package/dist/utils/ansible-vault-secrets.js.map +1 -1
  59. package/dist/utils/deployment-report.js +2 -2
  60. package/dist/utils/secret-prompts.js +34 -34
  61. package/dist/utils/ssh-helper.d.ts.map +1 -1
  62. package/dist/utils/ssh-helper.js +25 -5
  63. package/dist/utils/ssh-helper.js.map +1 -1
  64. package/dist/utils/template-generator.js +74 -74
  65. package/package.json +100 -100
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ /**
3
+ * DNS Dev Stage Fixes
4
+ *
5
+ * Checks that domains configured in stack.yml resolve to the expected targets.
6
+ * Does NOT call any DNS provider API — just does local DNS lookups and compares
7
+ * against the expected values cached in stackAuto.yml.
8
+ *
9
+ * If a mismatch is found, tells the user to update their DNS provider manually.
10
+ * The fix function offers to acknowledge the warning so it stops appearing.
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ var __importDefault = (this && this.__importDefault) || function (mod) {
46
+ return (mod && mod.__esModule) ? mod : { "default": mod };
47
+ };
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.dnsFixes = void 0;
50
+ const dns = __importStar(require("dns"));
51
+ const fs = __importStar(require("fs"));
52
+ const js_yaml_1 = __importDefault(require("js-yaml"));
53
+ const config_files_js_1 = require("../../../../constants/config-files.js");
54
+ const dnsPromises = dns.promises;
55
+ // ============================================================
56
+ // Helpers
57
+ // ============================================================
58
+ /**
59
+ * Build the FQDN from the environment domain + record host label.
60
+ * e.g. domain="dev.example.com", host="api" => "api.dev.example.com"
61
+ * domain="dev.example.com", host="" => "dev.example.com"
62
+ */
63
+ function buildFqdn(domain, host) {
64
+ if (!host || host === '@')
65
+ return domain;
66
+ return host + '.' + domain;
67
+ }
68
+ /**
69
+ * Resolve a hostname and return what it points to (CNAME chain or A record).
70
+ */
71
+ async function resolveTarget(fqdn) {
72
+ // Try CNAME first
73
+ try {
74
+ const cnames = await dnsPromises.resolveCname(fqdn);
75
+ if (cnames.length > 0)
76
+ return cnames[0] ?? null;
77
+ }
78
+ catch {
79
+ // Not a CNAME, try A record
80
+ }
81
+ try {
82
+ const addresses = await dnsPromises.resolve4(fqdn);
83
+ if (addresses.length > 0)
84
+ return addresses[0] ?? null;
85
+ }
86
+ catch {
87
+ // No A record either
88
+ }
89
+ return null;
90
+ }
91
+ /**
92
+ * Read the dns section from stackAuto.yml
93
+ */
94
+ function readDnsAuto(rootDir) {
95
+ try {
96
+ const autoPath = (0, config_files_js_1.getStackAutoPath)(rootDir);
97
+ if (!fs.existsSync(autoPath))
98
+ return {};
99
+ const content = fs.readFileSync(autoPath, 'utf8');
100
+ return js_yaml_1.default.load(content) || {};
101
+ }
102
+ catch {
103
+ return {};
104
+ }
105
+ }
106
+ /**
107
+ * Check if a specific record has been acknowledged in stackAuto.yml
108
+ */
109
+ function isAcknowledged(rootDir, fqdn) {
110
+ const auto = readDnsAuto(rootDir);
111
+ if (!auto.dns?.records)
112
+ return false;
113
+ return auto.dns.records.some(r => buildFqdn('', r.host) === fqdn && r.acknowledged === true);
114
+ }
115
+ /**
116
+ * Write acknowledgement for a record into stackAuto.yml
117
+ */
118
+ function acknowledgeRecord(rootDir, fqdn, target) {
119
+ const autoPath = (0, config_files_js_1.getStackAutoPath)(rootDir);
120
+ let autoConfig = {};
121
+ try {
122
+ if (fs.existsSync(autoPath)) {
123
+ autoConfig = js_yaml_1.default.load(fs.readFileSync(autoPath, 'utf8')) || {};
124
+ }
125
+ }
126
+ catch {
127
+ autoConfig = {};
128
+ }
129
+ // Ensure dns.records array exists
130
+ if (!autoConfig.dns || typeof autoConfig.dns !== 'object') {
131
+ autoConfig.dns = { records: [] };
132
+ }
133
+ const dnsSection = autoConfig.dns;
134
+ if (!dnsSection.records) {
135
+ dnsSection.records = [];
136
+ }
137
+ // Update or add the record
138
+ const existing = dnsSection.records.find(r => r.fqdn === fqdn);
139
+ if (existing) {
140
+ existing.target = target;
141
+ existing.acknowledged = true;
142
+ }
143
+ else {
144
+ dnsSection.records.push({ fqdn, target, acknowledged: true });
145
+ }
146
+ fs.writeFileSync(autoPath, js_yaml_1.default.dump(autoConfig, { lineWidth: -1, noRefs: true }));
147
+ }
148
+ /**
149
+ * Get DNS records from the dev environment's plugins.dns config
150
+ */
151
+ function getDnsRecords(config) {
152
+ // Look for dev environment
153
+ const dev = config.dev;
154
+ if (!dev?.domain)
155
+ return null;
156
+ const dnsPlugin = dev.plugins?.dns;
157
+ if (!dnsPlugin?.records || dnsPlugin.records.length === 0)
158
+ return null;
159
+ return { domain: dev.domain, records: dnsPlugin.records };
160
+ }
161
+ // ============================================================
162
+ // Fixes
163
+ // ============================================================
164
+ exports.dnsFixes = [];
165
+ // Single dev-stage fix that checks all configured DNS records
166
+ exports.dnsFixes.push({
167
+ id: 'dns-records-dev',
168
+ stage: 'dev',
169
+ severity: 'warning',
170
+ description: 'DNS records not pointing to expected targets',
171
+ plugin: 'dns',
172
+ scan: async (config, rootDir) => {
173
+ const dnsConfig = getDnsRecords(config);
174
+ if (!dnsConfig)
175
+ return false; // No DNS config = nothing to check
176
+ const { domain, records } = dnsConfig;
177
+ for (const record of records) {
178
+ const fqdn = buildFqdn(domain, record.host);
179
+ // Skip if user already acknowledged this warning
180
+ const auto = readDnsAuto(rootDir);
181
+ const autoRecord = auto.dns?.records?.find((r) => (r.fqdn === fqdn || buildFqdn(domain, r.host || '') === fqdn) &&
182
+ r.target === record.target &&
183
+ r.acknowledged === true);
184
+ if (autoRecord)
185
+ continue;
186
+ // Do DNS lookup
187
+ const resolved = await resolveTarget(fqdn);
188
+ if (!resolved) {
189
+ console.log(' ⚠️ ' + fqdn + ' does not resolve (expected: ' + record.target + ')');
190
+ return true;
191
+ }
192
+ // Normalize trailing dots for comparison
193
+ const normalizedResolved = resolved.replace(/\.$/, '');
194
+ const normalizedTarget = record.target.replace(/\.$/, '');
195
+ if (normalizedResolved !== normalizedTarget) {
196
+ console.log(' ⚠️ ' + fqdn + ' points to ' + resolved + ' (expected: ' + record.target + ')');
197
+ return true;
198
+ }
199
+ }
200
+ return false; // All records match or are acknowledged
201
+ },
202
+ fix: async (config, rootDir) => {
203
+ const dnsConfig = getDnsRecords(config);
204
+ if (!dnsConfig)
205
+ return false;
206
+ const { domain, records } = dnsConfig;
207
+ let hasIssues = false;
208
+ for (const record of records) {
209
+ const fqdn = buildFqdn(domain, record.host);
210
+ const resolved = await resolveTarget(fqdn);
211
+ const normalizedResolved = resolved?.replace(/\.$/, '') || '';
212
+ const normalizedTarget = record.target.replace(/\.$/, '');
213
+ if (normalizedResolved !== normalizedTarget) {
214
+ hasIssues = true;
215
+ if (!resolved) {
216
+ console.log(' ⚠️ ' + fqdn + ' does not resolve');
217
+ }
218
+ else {
219
+ console.log(' ⚠️ ' + fqdn + ' → ' + resolved + ' (expected: ' + record.target + ')');
220
+ }
221
+ console.log(' Update this DNS record at your DNS provider (Dynu, Cloudflare, etc.)');
222
+ console.log('');
223
+ // Acknowledge so it doesn't keep warning
224
+ acknowledgeRecord(rootDir, fqdn, record.target);
225
+ console.log(' ✅ Warning acknowledged — will re-check if target changes in stack.yml');
226
+ }
227
+ }
228
+ if (!hasIssues) {
229
+ console.log(' ✅ All DNS records are correct');
230
+ }
231
+ return true;
232
+ },
233
+ manualFix: 'Update DNS records at your DNS provider to match the targets in stack.yml dev.plugins.dns.records',
234
+ });
235
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../../src/plugins/addons/dns/scanfix/dev.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/addons/server-mode/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,GAAG,EACH,QAAQ,EACT,MAAM,yBAAyB,CAAC;AAQjC,cAAM,eAAe;IAKnB,MAAM,CAAC,QAAQ,CAAC,EAAE,iBAAiB;IACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,iBAAiB;IACrC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAW;IAC5C,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAGlC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAM;IAG/C,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEnD;IAGF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAE9D;;;OAGG;WACU,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBlF,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAS1B;IAMF;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE;IAYzC,OAAO,CAAC,OAAO,CAAgB;gBAEnB,MAAM,EAAE,aAAa;CAGlC;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/addons/server-mode/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,GAAG,EACH,QAAQ,EACT,MAAM,yBAAyB,CAAC;AAUjC,cAAM,eAAe;IAKnB,MAAM,CAAC,QAAQ,CAAC,EAAE,iBAAiB;IACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,iBAAiB;IACrC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAW;IAC5C,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAGlC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,CAAM;IAG/C,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEnD;IAGF,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAE9D;;;OAGG;WACU,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBlF,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,CAa1B;IAMF;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,GAAG,EAAE;IAYzC,OAAO,CAAC,OAAO,CAAgB;gBAEnB,MAAM,EAAE,aAAa;CAGlC;AAED,eAAe,eAAe,CAAC"}
@@ -67,7 +67,9 @@ var __importStar = (this && this.__importStar) || (function () {
67
67
  })();
68
68
  Object.defineProperty(exports, "__esModule", { value: true });
69
69
  // Import OS-specific scanfix arrays
70
+ const env_marker_js_1 = require("./scanfix/env-marker.js");
70
71
  const mac_js_1 = require("./scanfix/mac.js");
72
+ const tailscale_js_1 = require("./scanfix/tailscale.js");
71
73
  const ubuntu_js_1 = require("./scanfix/ubuntu.js");
72
74
  const windows_js_1 = require("./scanfix/windows.js");
73
75
  const tart_js_1 = require("./scanfix/tart.js");
@@ -105,6 +107,10 @@ class ServerModeAddon {
105
107
  static fixes = [
106
108
  // Mac fixes
107
109
  ...mac_js_1.macFixes,
110
+ // Environment markers (all servers)
111
+ ...env_marker_js_1.envMarkerFixes,
112
+ // Tailscale (Mac + Ubuntu)
113
+ ...tailscale_js_1.tailscaleFixes,
108
114
  // Ubuntu fixes
109
115
  ...ubuntu_js_1.ubuntuFixes,
110
116
  // Windows fixes
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/addons/server-mode/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQH,oCAAoC;AACpC,6CAA4C;AAC5C,mDAAkD;AAClD,qDAAoD;AACpD,+CAA8C;AAE9C,MAAM,eAAe;IACnB,+DAA+D;IAC/D,kBAAkB;IAClB,+DAA+D;IAE/D,MAAM,CAAU,EAAE,GAAG,aAAa,CAAC;IACnC,MAAM,CAAU,IAAI,GAAG,aAAa,CAAC;IACrC,MAAM,CAAU,QAAQ,GAAY,OAAO,CAAC;IAC5C,MAAM,CAAU,OAAO,GAAG,OAAO,CAAC;IAElC,+BAA+B;IAC/B,MAAM,CAAU,eAAe,GAAa,EAAE,CAAC;IAE/C,uCAAuC;IACvC,MAAM,CAAU,YAAY,GAA4B;IACtD,8DAA8D;KAC/D,CAAC;IAEF,6CAA6C;IAC7C,MAAM,CAAU,gBAAgB,GAA2B,EAAE,CAAC;IAE9D;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,MAAqB;QAC7D,MAAM,EAAE,mBAAmB,EAAE,GAAG,wDAAa,kCAAkC,GAAC,CAAC;QACjF,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEjD,mDAAmD;QACnD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC5C,GAAG,CAAC,WAAW,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CACxD,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,uDAAuD;IACvD,+DAA+D;IAC/D,kDAAkD;IAClD,+DAA+D;IAE/D,MAAM,CAAU,KAAK,GAAU;QAC7B,YAAY;QACZ,GAAG,iBAAQ;QACX,eAAe;QACf,GAAG,uBAAW;QACd,gBAAgB;QAChB,GAAG,yBAAY;QACf,+BAA+B;QAC/B,GAAG,mBAAS;KACb,CAAC;IAEF,+DAA+D;IAC/D,iBAAiB;IACjB,+DAA+D;IAE/D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EAAY;QAC/B,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC,CAAC,gCAAgC;YAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACtD,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,mBAAmB;IACnB,+DAA+D;IAEvD,OAAO,CAAgB;IAE/B,YAAY,MAAqB;QAC/B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;;AAGH,kBAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/addons/server-mode/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQH,oCAAoC;AACpC,2DAAyD;AACzD,6CAA4C;AAC5C,yDAAwD;AACxD,mDAAkD;AAClD,qDAAoD;AACpD,+CAA8C;AAE9C,MAAM,eAAe;IACnB,+DAA+D;IAC/D,kBAAkB;IAClB,+DAA+D;IAE/D,MAAM,CAAU,EAAE,GAAG,aAAa,CAAC;IACnC,MAAM,CAAU,IAAI,GAAG,aAAa,CAAC;IACrC,MAAM,CAAU,QAAQ,GAAY,OAAO,CAAC;IAC5C,MAAM,CAAU,OAAO,GAAG,OAAO,CAAC;IAElC,+BAA+B;IAC/B,MAAM,CAAU,eAAe,GAAa,EAAE,CAAC;IAE/C,uCAAuC;IACvC,MAAM,CAAU,YAAY,GAA4B;IACtD,8DAA8D;KAC/D,CAAC;IAEF,6CAA6C;IAC7C,MAAM,CAAU,gBAAgB,GAA2B,EAAE,CAAC;IAE9D;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,QAAgB,EAAE,MAAqB;QAC7D,MAAM,EAAE,mBAAmB,EAAE,GAAG,wDAAa,kCAAkC,GAAC,CAAC;QACjF,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEjD,mDAAmD;QACnD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC5C,GAAG,CAAC,WAAW,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CACxD,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,uDAAuD;IACvD,+DAA+D;IAC/D,kDAAkD;IAClD,+DAA+D;IAE/D,MAAM,CAAU,KAAK,GAAU;QAC7B,YAAY;QACZ,GAAG,iBAAQ;QACX,oCAAoC;QACpC,GAAG,8BAAc;QACjB,2BAA2B;QAC3B,GAAG,6BAAc;QACjB,eAAe;QACf,GAAG,uBAAW;QACd,gBAAgB;QAChB,GAAG,yBAAY;QACf,+BAA+B;QAC/B,GAAG,mBAAS;KACb,CAAC;IAEF,+DAA+D;IAC/D,iBAAiB;IACjB,+DAA+D;IAE/D;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,EAAY;QAC/B,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,IAAI,CAAC,CAAC,gCAAgC;YAC1D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACtD,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,+DAA+D;IAC/D,mBAAmB;IACnB,+DAA+D;IAEvD,OAAO,CAAgB;IAE/B,YAAY,MAAqB;QAC/B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;;AAGH,kBAAe,eAAe,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Environment Marker Scanfix
3
+ *
4
+ * Writes /etc/factiii/environment on servers so you can identify
5
+ * which environment you're on when SSH'd in.
6
+ *
7
+ * Usage after setup:
8
+ * cat /etc/factiii/environment → "staging" or "prod"
9
+ * factiii-env → prints environment name
10
+ *
11
+ * Also sets PS1 prompt coloring:
12
+ * staging = yellow prompt
13
+ * prod = red prompt
14
+ */
15
+ import type { Fix } from '../../../../types/index.js';
16
+ export declare const envMarkerFixes: Fix[];
17
+ //# sourceMappingURL=env-marker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-marker.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/addons/server-mode/scanfix/env-marker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,GAAG,EAAiB,MAAM,4BAA4B,CAAC;AAqFrE,eAAO,MAAM,cAAc,EAAE,GAAG,EAkE/B,CAAC"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ /**
3
+ * Environment Marker Scanfix
4
+ *
5
+ * Writes /etc/factiii/environment on servers so you can identify
6
+ * which environment you're on when SSH'd in.
7
+ *
8
+ * Usage after setup:
9
+ * cat /etc/factiii/environment → "staging" or "prod"
10
+ * factiii-env → prints environment name
11
+ *
12
+ * Also sets PS1 prompt coloring:
13
+ * staging = yellow prompt
14
+ * prod = red prompt
15
+ */
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.envMarkerFixes = void 0;
51
+ const child_process_1 = require("child_process");
52
+ const fs = __importStar(require("fs"));
53
+ const MARKER_PATH = '/etc/factiii/environment';
54
+ const PROFILE_MARKER = '# factiii-env-prompt';
55
+ function getCurrentMarker() {
56
+ try {
57
+ return fs.readFileSync(MARKER_PATH, 'utf8').trim();
58
+ }
59
+ catch {
60
+ // Try via sudo (file may be root-owned)
61
+ try {
62
+ return (0, child_process_1.execSync)('sudo cat ' + MARKER_PATH + ' 2>/dev/null', {
63
+ encoding: 'utf8',
64
+ stdio: ['pipe', 'pipe', 'pipe'],
65
+ }).trim();
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ }
72
+ function hasPromptMarker() {
73
+ try {
74
+ const profilePaths = [
75
+ process.env.HOME + '/.bashrc',
76
+ process.env.HOME + '/.zshrc',
77
+ ];
78
+ for (const p of profilePaths) {
79
+ try {
80
+ const content = fs.readFileSync(p, 'utf8');
81
+ if (content.includes(PROFILE_MARKER))
82
+ return true;
83
+ }
84
+ catch {
85
+ continue;
86
+ }
87
+ }
88
+ return false;
89
+ }
90
+ catch {
91
+ return false;
92
+ }
93
+ }
94
+ function writeEnvMarker(stage) {
95
+ try {
96
+ (0, child_process_1.execSync)('sudo mkdir -p /etc/factiii && echo "' + stage + '" | sudo tee ' + MARKER_PATH + ' > /dev/null', { stdio: 'inherit' });
97
+ // Also create a convenience command
98
+ (0, child_process_1.execSync)('echo \'#!/bin/sh\ncat ' + MARKER_PATH + '\' | sudo tee /usr/local/bin/factiii-env > /dev/null && sudo chmod +x /usr/local/bin/factiii-env', { stdio: 'inherit' });
99
+ return true;
100
+ }
101
+ catch {
102
+ return false;
103
+ }
104
+ }
105
+ function writePromptColor(stage) {
106
+ const color = stage === 'prod' ? '\\033[0;31m' : '\\033[0;33m'; // red : yellow
107
+ const reset = '\\033[0m';
108
+ const label = stage.toUpperCase();
109
+ // Snippet that prepends [STAGING] or [PROD] to PS1
110
+ const snippet = '\n' + PROFILE_MARKER + '\n' +
111
+ 'if [ -f ' + MARKER_PATH + ' ]; then\n' +
112
+ ' _FACTIII_ENV=$(cat ' + MARKER_PATH + ')\n' +
113
+ ' PS1="' + color + '[' + label + ']' + reset + ' $PS1"\n' +
114
+ 'fi\n';
115
+ try {
116
+ // Detect shell and write to the right rc file
117
+ const shell = process.env.SHELL || '/bin/bash';
118
+ const rcFile = shell.includes('zsh')
119
+ ? process.env.HOME + '/.zshrc'
120
+ : process.env.HOME + '/.bashrc';
121
+ fs.appendFileSync(rcFile, snippet);
122
+ console.log(' Added [' + label + '] prompt indicator to ' + rcFile);
123
+ return true;
124
+ }
125
+ catch {
126
+ return false;
127
+ }
128
+ }
129
+ exports.envMarkerFixes = [
130
+ // ── Staging marker ─────────────────────────────────────────
131
+ {
132
+ id: 'env-marker-missing-staging',
133
+ stage: 'staging',
134
+ severity: 'info',
135
+ description: 'No /etc/factiii/environment marker (hard to tell which server you\'re on)',
136
+ scan: async () => {
137
+ return getCurrentMarker() !== 'staging';
138
+ },
139
+ fix: async () => {
140
+ console.log(' Writing environment marker: staging');
141
+ return writeEnvMarker('staging');
142
+ },
143
+ manualFix: 'Run: sudo mkdir -p /etc/factiii && echo "staging" | sudo tee /etc/factiii/environment',
144
+ },
145
+ // ── Prod marker ────────────────────────────────────────────
146
+ {
147
+ id: 'env-marker-missing-prod',
148
+ stage: 'prod',
149
+ severity: 'info',
150
+ description: 'No /etc/factiii/environment marker (hard to tell which server you\'re on)',
151
+ scan: async () => {
152
+ return getCurrentMarker() !== 'prod';
153
+ },
154
+ fix: async () => {
155
+ console.log(' Writing environment marker: prod');
156
+ return writeEnvMarker('prod');
157
+ },
158
+ manualFix: 'Run: sudo mkdir -p /etc/factiii && echo "prod" | sudo tee /etc/factiii/environment',
159
+ },
160
+ // ── Staging prompt ─────────────────────────────────────────
161
+ {
162
+ id: 'env-prompt-missing-staging',
163
+ stage: 'staging',
164
+ severity: 'info',
165
+ description: 'Shell prompt doesn\'t show environment (easy to run prod commands on staging)',
166
+ scan: async () => {
167
+ if (getCurrentMarker() !== 'staging')
168
+ return false; // Marker first
169
+ return !hasPromptMarker();
170
+ },
171
+ fix: async () => {
172
+ return writePromptColor('staging');
173
+ },
174
+ manualFix: 'Add to ~/.bashrc or ~/.zshrc:\n' +
175
+ ' PS1="\\033[0;33m[STAGING]\\033[0m $PS1"',
176
+ },
177
+ // ── Prod prompt ────────────────────────────────────────────
178
+ {
179
+ id: 'env-prompt-missing-prod',
180
+ stage: 'prod',
181
+ severity: 'info',
182
+ description: 'Shell prompt doesn\'t show environment (easy to run staging commands on prod)',
183
+ scan: async () => {
184
+ if (getCurrentMarker() !== 'prod')
185
+ return false; // Marker first
186
+ return !hasPromptMarker();
187
+ },
188
+ fix: async () => {
189
+ return writePromptColor('prod');
190
+ },
191
+ manualFix: 'Add to ~/.bashrc or ~/.zshrc:\n' +
192
+ ' PS1="\\033[0;31m[PROD]\\033[0m $PS1"',
193
+ },
194
+ ];
195
+ //# sourceMappingURL=env-marker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-marker.js","sourceRoot":"","sources":["../../../../../src/plugins/addons/server-mode/scanfix/env-marker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tailscale VPN Scanfix
3
+ *
4
+ * Installs and configures Tailscale on Mac/Linux servers for reliable
5
+ * remote access. Tailscale creates a WireGuard tunnel that survives
6
+ * firewall changes, port closures, and SSH misconfigurations.
7
+ *
8
+ * Auth key is stored in the Ansible Vault via:
9
+ * npx stack deploy --secrets set TAILSCALE_AUTH_KEY
10
+ *
11
+ * Generate the key at: https://login.tailscale.com/admin/settings/keys
12
+ * - Reusable + Pre-approved for servers
13
+ */
14
+ import type { Fix } from '../../../../types/index.js';
15
+ export declare const tailscaleFixes: Fix[];
16
+ //# sourceMappingURL=tailscale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailscale.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/addons/server-mode/scanfix/tailscale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,GAAG,EAA2B,MAAM,4BAA4B,CAAC;AAuF/E,eAAO,MAAM,cAAc,EAAE,GAAG,EAiF/B,CAAC"}