@insureco/cli 0.1.0

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 (174) hide show
  1. package/README.md +168 -0
  2. package/dist/commands/backup.d.ts +11 -0
  3. package/dist/commands/backup.d.ts.map +1 -0
  4. package/dist/commands/backup.js +112 -0
  5. package/dist/commands/backup.js.map +1 -0
  6. package/dist/commands/config.d.ts +10 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +41 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/deploy.d.ts +16 -0
  11. package/dist/commands/deploy.d.ts.map +1 -0
  12. package/dist/commands/deploy.js +219 -0
  13. package/dist/commands/deploy.js.map +1 -0
  14. package/dist/commands/destroy.d.ts +12 -0
  15. package/dist/commands/destroy.d.ts.map +1 -0
  16. package/dist/commands/destroy.js +62 -0
  17. package/dist/commands/destroy.js.map +1 -0
  18. package/dist/commands/env.d.ts +7 -0
  19. package/dist/commands/env.d.ts.map +1 -0
  20. package/dist/commands/env.js +42 -0
  21. package/dist/commands/env.js.map +1 -0
  22. package/dist/commands/init-ai.d.ts +7 -0
  23. package/dist/commands/init-ai.d.ts.map +1 -0
  24. package/dist/commands/init-ai.js +257 -0
  25. package/dist/commands/init-ai.js.map +1 -0
  26. package/dist/commands/init.d.ts +8 -0
  27. package/dist/commands/init.d.ts.map +1 -0
  28. package/dist/commands/init.js +228 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/link.d.ts +10 -0
  31. package/dist/commands/link.d.ts.map +1 -0
  32. package/dist/commands/link.js +193 -0
  33. package/dist/commands/link.js.map +1 -0
  34. package/dist/commands/login.d.ts +8 -0
  35. package/dist/commands/login.d.ts.map +1 -0
  36. package/dist/commands/login.js +164 -0
  37. package/dist/commands/login.js.map +1 -0
  38. package/dist/commands/logs.d.ts +16 -0
  39. package/dist/commands/logs.d.ts.map +1 -0
  40. package/dist/commands/logs.js +362 -0
  41. package/dist/commands/logs.js.map +1 -0
  42. package/dist/commands/preflight.d.ts +8 -0
  43. package/dist/commands/preflight.d.ts.map +1 -0
  44. package/dist/commands/preflight.js +188 -0
  45. package/dist/commands/preflight.js.map +1 -0
  46. package/dist/commands/program.d.ts +7 -0
  47. package/dist/commands/program.d.ts.map +1 -0
  48. package/dist/commands/program.js +59 -0
  49. package/dist/commands/program.js.map +1 -0
  50. package/dist/commands/push.d.ts +12 -0
  51. package/dist/commands/push.d.ts.map +1 -0
  52. package/dist/commands/push.js +171 -0
  53. package/dist/commands/push.js.map +1 -0
  54. package/dist/commands/register.d.ts +7 -0
  55. package/dist/commands/register.d.ts.map +1 -0
  56. package/dist/commands/register.js +124 -0
  57. package/dist/commands/register.js.map +1 -0
  58. package/dist/commands/rollback.d.ts +11 -0
  59. package/dist/commands/rollback.d.ts.map +1 -0
  60. package/dist/commands/rollback.js +172 -0
  61. package/dist/commands/rollback.js.map +1 -0
  62. package/dist/commands/sample.d.ts +11 -0
  63. package/dist/commands/sample.d.ts.map +1 -0
  64. package/dist/commands/sample.js +114 -0
  65. package/dist/commands/sample.js.map +1 -0
  66. package/dist/commands/services.d.ts +13 -0
  67. package/dist/commands/services.d.ts.map +1 -0
  68. package/dist/commands/services.js +95 -0
  69. package/dist/commands/services.js.map +1 -0
  70. package/dist/commands/status.d.ts +9 -0
  71. package/dist/commands/status.d.ts.map +1 -0
  72. package/dist/commands/status.js +170 -0
  73. package/dist/commands/status.js.map +1 -0
  74. package/dist/commands/troubleshoot.d.ts +19 -0
  75. package/dist/commands/troubleshoot.d.ts.map +1 -0
  76. package/dist/commands/troubleshoot.js +465 -0
  77. package/dist/commands/troubleshoot.js.map +1 -0
  78. package/dist/commands/versions.d.ts +16 -0
  79. package/dist/commands/versions.d.ts.map +1 -0
  80. package/dist/commands/versions.js +162 -0
  81. package/dist/commands/versions.js.map +1 -0
  82. package/dist/index.d.ts +3 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +294 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/lib/ai/client.d.ts +36 -0
  87. package/dist/lib/ai/client.d.ts.map +1 -0
  88. package/dist/lib/ai/client.js +140 -0
  89. package/dist/lib/ai/client.js.map +1 -0
  90. package/dist/lib/ai/generator.d.ts +17 -0
  91. package/dist/lib/ai/generator.d.ts.map +1 -0
  92. package/dist/lib/ai/generator.js +338 -0
  93. package/dist/lib/ai/generator.js.map +1 -0
  94. package/dist/lib/ai/prompts.d.ts +47 -0
  95. package/dist/lib/ai/prompts.d.ts.map +1 -0
  96. package/dist/lib/ai/prompts.js +247 -0
  97. package/dist/lib/ai/prompts.js.map +1 -0
  98. package/dist/lib/ai/scanner.d.ts +50 -0
  99. package/dist/lib/ai/scanner.d.ts.map +1 -0
  100. package/dist/lib/ai/scanner.js +237 -0
  101. package/dist/lib/ai/scanner.js.map +1 -0
  102. package/dist/lib/api.d.ts +18 -0
  103. package/dist/lib/api.d.ts.map +1 -0
  104. package/dist/lib/api.js +67 -0
  105. package/dist/lib/api.js.map +1 -0
  106. package/dist/lib/builder.d.ts +34 -0
  107. package/dist/lib/builder.d.ts.map +1 -0
  108. package/dist/lib/builder.js +132 -0
  109. package/dist/lib/builder.js.map +1 -0
  110. package/dist/lib/config.d.ts +20 -0
  111. package/dist/lib/config.d.ts.map +1 -0
  112. package/dist/lib/config.js +124 -0
  113. package/dist/lib/config.js.map +1 -0
  114. package/dist/lib/output.d.ts +12 -0
  115. package/dist/lib/output.d.ts.map +1 -0
  116. package/dist/lib/output.js +39 -0
  117. package/dist/lib/output.js.map +1 -0
  118. package/dist/lib/scaffold.d.ts +29 -0
  119. package/dist/lib/scaffold.d.ts.map +1 -0
  120. package/dist/lib/scaffold.js +166 -0
  121. package/dist/lib/scaffold.js.map +1 -0
  122. package/dist/lib/troubleshoot/analyzer.d.ts +14 -0
  123. package/dist/lib/troubleshoot/analyzer.d.ts.map +1 -0
  124. package/dist/lib/troubleshoot/analyzer.js +541 -0
  125. package/dist/lib/troubleshoot/analyzer.js.map +1 -0
  126. package/dist/lib/troubleshoot/auto-fix.d.ts +29 -0
  127. package/dist/lib/troubleshoot/auto-fix.d.ts.map +1 -0
  128. package/dist/lib/troubleshoot/auto-fix.js +373 -0
  129. package/dist/lib/troubleshoot/auto-fix.js.map +1 -0
  130. package/dist/lib/troubleshoot/index.d.ts +5 -0
  131. package/dist/lib/troubleshoot/index.d.ts.map +1 -0
  132. package/dist/lib/troubleshoot/index.js +6 -0
  133. package/dist/lib/troubleshoot/index.js.map +1 -0
  134. package/dist/lib/troubleshoot/log-fetcher.d.ts +43 -0
  135. package/dist/lib/troubleshoot/log-fetcher.d.ts.map +1 -0
  136. package/dist/lib/troubleshoot/log-fetcher.js +431 -0
  137. package/dist/lib/troubleshoot/log-fetcher.js.map +1 -0
  138. package/dist/lib/troubleshoot/redactor.d.ts +35 -0
  139. package/dist/lib/troubleshoot/redactor.d.ts.map +1 -0
  140. package/dist/lib/troubleshoot/redactor.js +208 -0
  141. package/dist/lib/troubleshoot/redactor.js.map +1 -0
  142. package/dist/lib/validators/catalog-validator.d.ts +3 -0
  143. package/dist/lib/validators/catalog-validator.d.ts.map +1 -0
  144. package/dist/lib/validators/catalog-validator.js +205 -0
  145. package/dist/lib/validators/catalog-validator.js.map +1 -0
  146. package/dist/lib/validators/dockerfile-validator.d.ts +4 -0
  147. package/dist/lib/validators/dockerfile-validator.d.ts.map +1 -0
  148. package/dist/lib/validators/dockerfile-validator.js +262 -0
  149. package/dist/lib/validators/dockerfile-validator.js.map +1 -0
  150. package/dist/lib/validators/env-validator.d.ts +3 -0
  151. package/dist/lib/validators/env-validator.d.ts.map +1 -0
  152. package/dist/lib/validators/env-validator.js +268 -0
  153. package/dist/lib/validators/env-validator.js.map +1 -0
  154. package/dist/lib/validators/git-validator.d.ts +3 -0
  155. package/dist/lib/validators/git-validator.d.ts.map +1 -0
  156. package/dist/lib/validators/git-validator.js +236 -0
  157. package/dist/lib/validators/git-validator.js.map +1 -0
  158. package/dist/lib/validators/health-detector.d.ts +4 -0
  159. package/dist/lib/validators/health-detector.d.ts.map +1 -0
  160. package/dist/lib/validators/health-detector.js +159 -0
  161. package/dist/lib/validators/health-detector.js.map +1 -0
  162. package/dist/lib/validators/index.d.ts +7 -0
  163. package/dist/lib/validators/index.d.ts.map +1 -0
  164. package/dist/lib/validators/index.js +7 -0
  165. package/dist/lib/validators/index.js.map +1 -0
  166. package/dist/lib/validators/route-validator.d.ts +3 -0
  167. package/dist/lib/validators/route-validator.d.ts.map +1 -0
  168. package/dist/lib/validators/route-validator.js +238 -0
  169. package/dist/lib/validators/route-validator.js.map +1 -0
  170. package/dist/types/index.d.ts +455 -0
  171. package/dist/types/index.d.ts.map +1 -0
  172. package/dist/types/index.js +37 -0
  173. package/dist/types/index.js.map +1 -0
  174. package/package.json +58 -0
@@ -0,0 +1,262 @@
1
+ import { readFile, access } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ // Framework detection patterns
4
+ const FRAMEWORK_PATTERNS = [
5
+ {
6
+ name: 'Next.js',
7
+ files: ['next.config.js', 'next.config.mjs', 'next.config.ts'],
8
+ packageJson: { dependencies: ['next'] },
9
+ dockerfile: 'Dockerfile.nextjs',
10
+ defaultPort: 3000,
11
+ healthPath: '/api/health',
12
+ },
13
+ {
14
+ name: 'NestJS',
15
+ files: ['nest-cli.json'],
16
+ packageJson: { dependencies: ['@nestjs/core'] },
17
+ dockerfile: 'Dockerfile.nestjs',
18
+ defaultPort: 3000,
19
+ healthPath: '/health',
20
+ },
21
+ {
22
+ name: 'Express',
23
+ files: [],
24
+ packageJson: { dependencies: ['express'] },
25
+ dockerfile: 'Dockerfile.express',
26
+ defaultPort: 3000,
27
+ healthPath: '/health',
28
+ },
29
+ {
30
+ name: 'Fastify',
31
+ files: [],
32
+ packageJson: { dependencies: ['fastify'] },
33
+ dockerfile: 'Dockerfile.fastify',
34
+ defaultPort: 3000,
35
+ healthPath: '/health',
36
+ },
37
+ {
38
+ name: 'Go',
39
+ files: ['go.mod', 'go.sum'],
40
+ dockerfile: 'Dockerfile.go',
41
+ defaultPort: 8080,
42
+ healthPath: '/health',
43
+ },
44
+ {
45
+ name: 'Python/FastAPI',
46
+ files: ['requirements.txt', 'pyproject.toml'],
47
+ dockerfile: 'Dockerfile.python',
48
+ defaultPort: 8000,
49
+ healthPath: '/health',
50
+ },
51
+ {
52
+ name: 'Rust',
53
+ files: ['Cargo.toml'],
54
+ dockerfile: 'Dockerfile.rust',
55
+ defaultPort: 8080,
56
+ healthPath: '/health',
57
+ },
58
+ ];
59
+ export async function validateDockerfile(cwd = process.cwd()) {
60
+ const checks = [];
61
+ // Check for Dockerfile
62
+ const dockerfilePath = join(cwd, 'Dockerfile');
63
+ const dockerfileExists = await fileExists(dockerfilePath);
64
+ if (dockerfileExists) {
65
+ const dockerfileCheck = await analyzeDockerfile(dockerfilePath);
66
+ checks.push(dockerfileCheck);
67
+ }
68
+ else {
69
+ // Detect framework and suggest Dockerfile
70
+ const frameworkInfo = await detectFramework(cwd);
71
+ if (frameworkInfo) {
72
+ checks.push({
73
+ name: 'Dockerfile exists',
74
+ status: 'warn',
75
+ message: `No Dockerfile found, but detected ${frameworkInfo.name} project`,
76
+ details: [
77
+ `Suggested Dockerfile: ${frameworkInfo.dockerfile}`,
78
+ `Default port: ${frameworkInfo.defaultPort}`,
79
+ `Health endpoint: ${frameworkInfo.healthPath}`,
80
+ ],
81
+ remediation: `Run "iec init --dockerfile" to generate a Dockerfile for ${frameworkInfo.name}`,
82
+ });
83
+ }
84
+ else {
85
+ checks.push({
86
+ name: 'Dockerfile exists',
87
+ status: 'fail',
88
+ message: 'No Dockerfile found and could not detect framework',
89
+ remediation: 'Create a Dockerfile or run "iec init --dockerfile" to generate one',
90
+ });
91
+ }
92
+ }
93
+ // Check for .dockerignore
94
+ const dockerignorePath = join(cwd, '.dockerignore');
95
+ const dockerignoreExists = await fileExists(dockerignorePath);
96
+ if (dockerignoreExists) {
97
+ const ignoreCheck = await analyzeDockerignore(dockerignorePath);
98
+ checks.push(ignoreCheck);
99
+ }
100
+ else {
101
+ checks.push({
102
+ name: '.dockerignore exists',
103
+ status: 'warn',
104
+ message: 'No .dockerignore found',
105
+ details: ['Build context may include unnecessary files'],
106
+ remediation: 'Create a .dockerignore file to exclude node_modules, .git, etc.',
107
+ });
108
+ }
109
+ return { checks };
110
+ }
111
+ export async function detectFramework(cwd) {
112
+ // Check for framework-specific files
113
+ for (const framework of FRAMEWORK_PATTERNS) {
114
+ for (const file of framework.files) {
115
+ if (await fileExists(join(cwd, file))) {
116
+ return {
117
+ name: framework.name,
118
+ dockerfile: framework.dockerfile,
119
+ defaultPort: framework.defaultPort,
120
+ healthPath: framework.healthPath,
121
+ };
122
+ }
123
+ }
124
+ }
125
+ // Check package.json for Node.js frameworks
126
+ const packageJsonPath = join(cwd, 'package.json');
127
+ if (await fileExists(packageJsonPath)) {
128
+ try {
129
+ const content = await readFile(packageJsonPath, 'utf-8');
130
+ const pkg = JSON.parse(content);
131
+ const allDeps = {
132
+ ...pkg.dependencies,
133
+ ...pkg.devDependencies,
134
+ };
135
+ for (const framework of FRAMEWORK_PATTERNS) {
136
+ if (!framework.packageJson)
137
+ continue;
138
+ const deps = [
139
+ ...(framework.packageJson.dependencies || []),
140
+ ...(framework.packageJson.devDependencies || []),
141
+ ];
142
+ for (const dep of deps) {
143
+ if (allDeps[dep]) {
144
+ return {
145
+ name: framework.name,
146
+ dockerfile: framework.dockerfile,
147
+ defaultPort: framework.defaultPort,
148
+ healthPath: framework.healthPath,
149
+ };
150
+ }
151
+ }
152
+ }
153
+ // Default to generic Node.js
154
+ return {
155
+ name: 'Node.js',
156
+ dockerfile: 'Dockerfile.node',
157
+ defaultPort: 3000,
158
+ healthPath: '/health',
159
+ };
160
+ }
161
+ catch {
162
+ // Ignore parse errors
163
+ }
164
+ }
165
+ return null;
166
+ }
167
+ async function analyzeDockerfile(path) {
168
+ try {
169
+ const content = await readFile(path, 'utf-8');
170
+ const issues = [];
171
+ const details = [];
172
+ // Check for multi-stage build
173
+ const stageCount = (content.match(/^FROM\s+/gm) || []).length;
174
+ if (stageCount > 1) {
175
+ details.push(`Multi-stage build: ${stageCount} stages`);
176
+ }
177
+ else {
178
+ issues.push('Consider using multi-stage build for smaller images');
179
+ }
180
+ // Check for EXPOSE
181
+ const exposeMatch = content.match(/^EXPOSE\s+(\d+)/m);
182
+ if (exposeMatch) {
183
+ details.push(`Exposed port: ${exposeMatch[1]}`);
184
+ }
185
+ else {
186
+ issues.push('No EXPOSE instruction found');
187
+ }
188
+ // Check for HEALTHCHECK
189
+ if (content.includes('HEALTHCHECK')) {
190
+ details.push('HEALTHCHECK instruction present');
191
+ }
192
+ else {
193
+ issues.push('No HEALTHCHECK instruction found');
194
+ }
195
+ // Check for non-root user
196
+ if (content.match(/^USER\s+(?!root)/m)) {
197
+ details.push('Runs as non-root user');
198
+ }
199
+ else {
200
+ issues.push('Consider running as non-root user for security');
201
+ }
202
+ // Check for .dockerignore patterns that should be in Dockerfile
203
+ if (content.includes('COPY . .') && !content.includes('.dockerignore')) {
204
+ issues.push('COPY . . found - ensure .dockerignore excludes unnecessary files');
205
+ }
206
+ const status = issues.length === 0 ? 'pass' : issues.length <= 2 ? 'warn' : 'fail';
207
+ return {
208
+ name: 'Dockerfile valid',
209
+ status,
210
+ message: status === 'pass' ? 'Dockerfile follows best practices' : 'Dockerfile has potential issues',
211
+ details: [...details, ...issues.map(i => `Warning: ${i}`)],
212
+ remediation: issues.length > 0 ? 'Review Dockerfile best practices at https://docs.docker.com/develop/develop-images/dockerfile_best-practices/' : undefined,
213
+ };
214
+ }
215
+ catch (error) {
216
+ return {
217
+ name: 'Dockerfile valid',
218
+ status: 'fail',
219
+ message: `Failed to read Dockerfile: ${error instanceof Error ? error.message : 'Unknown error'}`,
220
+ };
221
+ }
222
+ }
223
+ async function analyzeDockerignore(path) {
224
+ try {
225
+ const content = await readFile(path, 'utf-8');
226
+ const lines = content.split('\n').filter(l => l.trim() && !l.startsWith('#'));
227
+ const recommended = ['node_modules', '.git', '*.log', '.env', 'coverage', 'dist'];
228
+ const missing = recommended.filter(r => !lines.some(l => l.includes(r)));
229
+ if (missing.length === 0) {
230
+ return {
231
+ name: '.dockerignore complete',
232
+ status: 'pass',
233
+ message: '.dockerignore includes recommended patterns',
234
+ details: [`${lines.length} patterns defined`],
235
+ };
236
+ }
237
+ return {
238
+ name: '.dockerignore complete',
239
+ status: 'warn',
240
+ message: '.dockerignore may be missing patterns',
241
+ details: missing.map(m => `Missing: ${m}`),
242
+ remediation: `Add missing patterns to .dockerignore: ${missing.join(', ')}`,
243
+ };
244
+ }
245
+ catch (error) {
246
+ return {
247
+ name: '.dockerignore complete',
248
+ status: 'fail',
249
+ message: `Failed to read .dockerignore: ${error instanceof Error ? error.message : 'Unknown error'}`,
250
+ };
251
+ }
252
+ }
253
+ async function fileExists(path) {
254
+ try {
255
+ await access(path);
256
+ return true;
257
+ }
258
+ catch {
259
+ return false;
260
+ }
261
+ }
262
+ //# sourceMappingURL=dockerfile-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dockerfile-validator.js","sourceRoot":"","sources":["../../../src/lib/validators/dockerfile-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PreflightResult } from '../../types/index.js';
2
+ export declare function validateEnvVars(cwd?: string): Promise<PreflightResult>;
3
+ //# sourceMappingURL=env-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/env-validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAmC,MAAM,sBAAsB,CAAA;AA+B5F,wBAAsB,eAAe,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CA6G3F"}
@@ -0,0 +1,268 @@
1
+ import { readFile, readdir, access } from 'node:fs/promises';
2
+ import { join, extname } from 'node:path';
3
+ import { parse } from 'yaml';
4
+ // Patterns to detect environment variable usage
5
+ const ENV_PATTERNS = [
6
+ // Node.js
7
+ /process\.env\.([A-Z][A-Z0-9_]*)/g,
8
+ /process\.env\[['"]([A-Z][A-Z0-9_]*)['"]\]/g,
9
+ // Go
10
+ /os\.Getenv\s*\(\s*['"]([A-Z][A-Z0-9_]*)['"]\s*\)/g,
11
+ // Python
12
+ /os\.environ(?:\.get)?\s*\(\s*['"]([A-Z][A-Z0-9_]*)['"]/g,
13
+ /os\.getenv\s*\(\s*['"]([A-Z][A-Z0-9_]*)['"]/g,
14
+ // Rust
15
+ /std::env::var\s*\(\s*['"]([A-Z][A-Z0-9_]*)['"]\s*\)/g,
16
+ // Generic ${VAR} pattern in config files
17
+ /\$\{([A-Z][A-Z0-9_]*)\}/g,
18
+ ];
19
+ // System/common env vars to ignore
20
+ const SYSTEM_ENV_VARS = new Set([
21
+ 'NODE_ENV', 'PORT', 'HOST', 'HOME', 'PATH', 'USER', 'PWD',
22
+ 'SHELL', 'TERM', 'LANG', 'LC_ALL', 'TZ', 'DEBUG',
23
+ 'CI', 'GITHUB_ACTIONS', 'GITLAB_CI', 'VERCEL',
24
+ ]);
25
+ // File extensions to scan
26
+ const SCAN_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.go', '.py', '.rs', '.yaml', '.yml', '.json'];
27
+ // Directories to skip
28
+ const SKIP_DIRS = ['node_modules', '.git', 'dist', 'build', 'coverage', '.next', '__pycache__', 'target', 'vendor'];
29
+ export async function validateEnvVars(cwd = process.cwd()) {
30
+ const checks = [];
31
+ try {
32
+ // Find env vars used in code
33
+ const codeEnvVars = await scanForEnvVars(cwd);
34
+ // Find env vars defined in Helm values
35
+ const helmEnvVars = await getHelmEnvVars(cwd);
36
+ // Find env vars in .env.example
37
+ const exampleEnvVars = await getExampleEnvVars(cwd);
38
+ // Cross-reference: vars used in code but not in Helm
39
+ const missingInHelm = codeEnvVars.filter(v => !SYSTEM_ENV_VARS.has(v.name) &&
40
+ !helmEnvVars.has(v.name));
41
+ // Group by variable name
42
+ const missingByName = new Map();
43
+ for (const ref of missingInHelm) {
44
+ const existing = missingByName.get(ref.name) || [];
45
+ missingByName.set(ref.name, [...existing, ref]);
46
+ }
47
+ if (missingByName.size > 0) {
48
+ const details = Array.from(missingByName.entries()).map(([name, refs]) => {
49
+ const locations = refs.slice(0, 3).map(r => `${r.file}:${r.line}`).join(', ');
50
+ const more = refs.length > 3 ? ` (+${refs.length - 3} more)` : '';
51
+ return `${name}: ${locations}${more}`;
52
+ });
53
+ checks.push({
54
+ name: 'Environment variables in Helm',
55
+ status: 'warn',
56
+ message: `${missingByName.size} env var(s) used in code but not found in Helm values`,
57
+ details,
58
+ remediation: 'Add missing environment variables to helm/values.yaml under env: section',
59
+ });
60
+ }
61
+ else if (codeEnvVars.length > 0) {
62
+ checks.push({
63
+ name: 'Environment variables in Helm',
64
+ status: 'pass',
65
+ message: 'All environment variables are defined in Helm values',
66
+ details: [`Found ${helmEnvVars.size} env vars in Helm, ${codeEnvVars.length} references in code`],
67
+ });
68
+ }
69
+ else {
70
+ checks.push({
71
+ name: 'Environment variables in Helm',
72
+ status: 'skip',
73
+ message: 'No environment variable usage detected in code',
74
+ });
75
+ }
76
+ // Check for .env.example
77
+ if (exampleEnvVars.size > 0) {
78
+ const missingInExample = Array.from(new Set(codeEnvVars.map(v => v.name)))
79
+ .filter(name => !SYSTEM_ENV_VARS.has(name) && !exampleEnvVars.has(name));
80
+ if (missingInExample.length > 0) {
81
+ checks.push({
82
+ name: '.env.example complete',
83
+ status: 'warn',
84
+ message: `${missingInExample.length} env var(s) missing from .env.example`,
85
+ details: missingInExample.slice(0, 10),
86
+ remediation: 'Add missing variables to .env.example for documentation',
87
+ });
88
+ }
89
+ else {
90
+ checks.push({
91
+ name: '.env.example complete',
92
+ status: 'pass',
93
+ message: '.env.example contains all required variables',
94
+ });
95
+ }
96
+ }
97
+ else {
98
+ checks.push({
99
+ name: '.env.example exists',
100
+ status: 'warn',
101
+ message: 'No .env.example file found',
102
+ remediation: 'Create .env.example to document required environment variables',
103
+ });
104
+ }
105
+ // Check for secrets that might be in code
106
+ const sensitivePatterns = ['_KEY', '_SECRET', '_PASSWORD', '_TOKEN', 'API_KEY', 'AUTH_'];
107
+ const potentialSecrets = codeEnvVars.filter(v => sensitivePatterns.some(p => v.name.includes(p)));
108
+ if (potentialSecrets.length > 0) {
109
+ const secretNames = [...new Set(potentialSecrets.map(v => v.name))];
110
+ checks.push({
111
+ name: 'Secrets management',
112
+ status: 'warn',
113
+ message: `${secretNames.length} potential secret(s) detected`,
114
+ details: secretNames.slice(0, 10),
115
+ remediation: 'Ensure secrets are stored in Kubernetes Secrets, not ConfigMaps or values.yaml',
116
+ });
117
+ }
118
+ }
119
+ catch (error) {
120
+ checks.push({
121
+ name: 'Environment variable scan',
122
+ status: 'fail',
123
+ message: `Failed to scan environment variables: ${error instanceof Error ? error.message : 'Unknown error'}`,
124
+ });
125
+ }
126
+ return { checks };
127
+ }
128
+ async function scanForEnvVars(dir, baseDir = dir) {
129
+ const refs = [];
130
+ try {
131
+ const entries = await readdir(dir, { withFileTypes: true });
132
+ for (const entry of entries) {
133
+ const fullPath = join(dir, entry.name);
134
+ if (entry.isDirectory()) {
135
+ if (!SKIP_DIRS.includes(entry.name) && !entry.name.startsWith('.')) {
136
+ const subRefs = await scanForEnvVars(fullPath, baseDir);
137
+ refs.push(...subRefs);
138
+ }
139
+ }
140
+ else if (entry.isFile()) {
141
+ const ext = extname(entry.name);
142
+ if (SCAN_EXTENSIONS.includes(ext)) {
143
+ const fileRefs = await scanFileForEnvVars(fullPath, baseDir);
144
+ refs.push(...fileRefs);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ catch {
150
+ // Ignore permission errors
151
+ }
152
+ return refs;
153
+ }
154
+ async function scanFileForEnvVars(filePath, baseDir) {
155
+ const refs = [];
156
+ try {
157
+ const content = await readFile(filePath, 'utf-8');
158
+ const lines = content.split('\n');
159
+ const relativePath = filePath.replace(baseDir + '/', '');
160
+ for (let i = 0; i < lines.length; i++) {
161
+ const line = lines[i];
162
+ for (const pattern of ENV_PATTERNS) {
163
+ pattern.lastIndex = 0;
164
+ let match;
165
+ while ((match = pattern.exec(line)) !== null) {
166
+ refs.push({
167
+ name: match[1],
168
+ file: relativePath,
169
+ line: i + 1,
170
+ });
171
+ }
172
+ }
173
+ }
174
+ }
175
+ catch {
176
+ // Ignore read errors
177
+ }
178
+ return refs;
179
+ }
180
+ async function getHelmEnvVars(cwd) {
181
+ const envVars = new Set();
182
+ const helmPaths = [
183
+ join(cwd, 'helm', 'values.yaml'),
184
+ join(cwd, 'chart', 'values.yaml'),
185
+ join(cwd, 'values.yaml'),
186
+ ];
187
+ for (const helmPath of helmPaths) {
188
+ try {
189
+ await access(helmPath);
190
+ const content = await readFile(helmPath, 'utf-8');
191
+ const values = parse(content);
192
+ // Look for env vars in common locations
193
+ extractEnvVarsFromObject(values, envVars);
194
+ }
195
+ catch {
196
+ // File doesn't exist or can't be parsed
197
+ }
198
+ }
199
+ return envVars;
200
+ }
201
+ function extractEnvVarsFromObject(obj, envVars, path = '') {
202
+ if (!obj || typeof obj !== 'object')
203
+ return;
204
+ if (Array.isArray(obj)) {
205
+ for (const item of obj) {
206
+ if (typeof item === 'object' && item !== null) {
207
+ const envItem = item;
208
+ if (envItem.name && typeof envItem.name === 'string') {
209
+ envVars.add(envItem.name);
210
+ }
211
+ }
212
+ extractEnvVarsFromObject(item, envVars, path);
213
+ }
214
+ }
215
+ else {
216
+ const record = obj;
217
+ for (const [key, value] of Object.entries(record)) {
218
+ // Common patterns for env vars in Helm
219
+ if (key === 'env' || key === 'envVars' || key === 'environment') {
220
+ if (Array.isArray(value)) {
221
+ for (const item of value) {
222
+ const envItem = item;
223
+ if (envItem.name) {
224
+ envVars.add(envItem.name);
225
+ }
226
+ }
227
+ }
228
+ else if (typeof value === 'object' && value !== null) {
229
+ for (const envName of Object.keys(value)) {
230
+ envVars.add(envName);
231
+ }
232
+ }
233
+ }
234
+ else if (key === 'extraEnv' || key === 'extraEnvVars') {
235
+ extractEnvVarsFromObject(value, envVars, `${path}.${key}`);
236
+ }
237
+ else {
238
+ extractEnvVarsFromObject(value, envVars, `${path}.${key}`);
239
+ }
240
+ }
241
+ }
242
+ }
243
+ async function getExampleEnvVars(cwd) {
244
+ const envVars = new Set();
245
+ const envPaths = [
246
+ join(cwd, '.env.example'),
247
+ join(cwd, '.env.sample'),
248
+ join(cwd, '.env.template'),
249
+ ];
250
+ for (const envPath of envPaths) {
251
+ try {
252
+ await access(envPath);
253
+ const content = await readFile(envPath, 'utf-8');
254
+ const lines = content.split('\n');
255
+ for (const line of lines) {
256
+ const match = line.match(/^([A-Z][A-Z0-9_]*)=/);
257
+ if (match) {
258
+ envVars.add(match[1]);
259
+ }
260
+ }
261
+ }
262
+ catch {
263
+ // File doesn't exist
264
+ }
265
+ }
266
+ return envVars;
267
+ }
268
+ //# sourceMappingURL=env-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-validator.js","sourceRoot":"","sources":["../../../src/lib/validators/env-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PreflightResult } from '../../types/index.js';
2
+ export declare function validateGit(cwd?: string): Promise<PreflightResult>;
3
+ //# sourceMappingURL=git-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/git-validator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,sBAAsB,CAAA;AAI3E,wBAAsB,WAAW,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiKvF"}