@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,236 @@
1
+ import { exec } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { access } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ const execAsync = promisify(exec);
6
+ export async function validateGit(cwd = process.cwd()) {
7
+ const checks = [];
8
+ // Check if git repo exists
9
+ const gitDir = join(cwd, '.git');
10
+ try {
11
+ await access(gitDir);
12
+ }
13
+ catch {
14
+ checks.push({
15
+ name: 'Git repository',
16
+ status: 'fail',
17
+ message: 'Not a git repository',
18
+ remediation: 'Run "git init" to initialize a git repository',
19
+ });
20
+ return { checks };
21
+ }
22
+ checks.push({
23
+ name: 'Git repository',
24
+ status: 'pass',
25
+ message: 'Git repository detected',
26
+ });
27
+ // Check for remote origin
28
+ try {
29
+ const { stdout: remoteUrl } = await execAsync('git remote get-url origin', { cwd });
30
+ const url = remoteUrl.trim();
31
+ checks.push({
32
+ name: 'Git remote origin',
33
+ status: 'pass',
34
+ message: 'Remote origin configured',
35
+ details: [url],
36
+ });
37
+ // Check if remote is accessible
38
+ const accessCheck = await checkRemoteAccess(cwd, url);
39
+ checks.push(accessCheck);
40
+ }
41
+ catch {
42
+ checks.push({
43
+ name: 'Git remote origin',
44
+ status: 'fail',
45
+ message: 'No remote origin configured',
46
+ remediation: 'Run "git remote add origin <url>" to add a remote',
47
+ });
48
+ }
49
+ // Check current branch
50
+ try {
51
+ const { stdout: branch } = await execAsync('git rev-parse --abbrev-ref HEAD', { cwd });
52
+ const currentBranch = branch.trim();
53
+ checks.push({
54
+ name: 'Git branch',
55
+ status: 'pass',
56
+ message: `Current branch: ${currentBranch}`,
57
+ });
58
+ // Check if branch exists on remote
59
+ const remoteBranchCheck = await checkRemoteBranch(cwd, currentBranch);
60
+ checks.push(remoteBranchCheck);
61
+ }
62
+ catch {
63
+ checks.push({
64
+ name: 'Git branch',
65
+ status: 'fail',
66
+ message: 'Could not determine current branch',
67
+ });
68
+ }
69
+ // Check for uncommitted changes
70
+ try {
71
+ const { stdout: status } = await execAsync('git status --porcelain', { cwd });
72
+ const lines = status.trim().split('\n').filter(l => l.trim());
73
+ if (lines.length > 0) {
74
+ const staged = lines.filter(l => l[0] !== ' ' && l[0] !== '?').length;
75
+ const unstaged = lines.filter(l => l[1] !== ' ' && l[0] !== '?').length;
76
+ const untracked = lines.filter(l => l.startsWith('??')).length;
77
+ const details = [];
78
+ if (staged > 0)
79
+ details.push(`${staged} staged change(s)`);
80
+ if (unstaged > 0)
81
+ details.push(`${unstaged} unstaged change(s)`);
82
+ if (untracked > 0)
83
+ details.push(`${untracked} untracked file(s)`);
84
+ checks.push({
85
+ name: 'Working tree clean',
86
+ status: 'warn',
87
+ message: 'Uncommitted changes detected',
88
+ details,
89
+ remediation: 'Commit or stash changes before deploying',
90
+ });
91
+ }
92
+ else {
93
+ checks.push({
94
+ name: 'Working tree clean',
95
+ status: 'pass',
96
+ message: 'Working tree is clean',
97
+ });
98
+ }
99
+ }
100
+ catch {
101
+ checks.push({
102
+ name: 'Working tree clean',
103
+ status: 'warn',
104
+ message: 'Could not check working tree status',
105
+ });
106
+ }
107
+ // Check if ahead/behind remote
108
+ try {
109
+ await execAsync('git fetch --dry-run', { cwd, timeout: 10000 });
110
+ const { stdout: revList } = await execAsync('git rev-list --left-right --count HEAD...@{upstream}', { cwd });
111
+ const [ahead, behind] = revList.trim().split('\t').map(Number);
112
+ if (ahead > 0 || behind > 0) {
113
+ const details = [];
114
+ if (ahead > 0)
115
+ details.push(`${ahead} commit(s) ahead of remote`);
116
+ if (behind > 0)
117
+ details.push(`${behind} commit(s) behind remote`);
118
+ checks.push({
119
+ name: 'In sync with remote',
120
+ status: behind > 0 ? 'warn' : 'pass',
121
+ message: ahead > 0 && behind > 0 ? 'Branch has diverged from remote' :
122
+ ahead > 0 ? 'Unpushed commits' : 'Behind remote',
123
+ details,
124
+ remediation: behind > 0 ? 'Run "git pull" to sync with remote' :
125
+ ahead > 0 ? 'Run "git push" to push local commits' : undefined,
126
+ });
127
+ }
128
+ else {
129
+ checks.push({
130
+ name: 'In sync with remote',
131
+ status: 'pass',
132
+ message: 'Branch is up to date with remote',
133
+ });
134
+ }
135
+ }
136
+ catch {
137
+ checks.push({
138
+ name: 'In sync with remote',
139
+ status: 'skip',
140
+ message: 'Could not check remote sync status',
141
+ details: ['Branch may not have an upstream configured'],
142
+ });
143
+ }
144
+ // Check for .gitignore
145
+ const gitignorePath = join(cwd, '.gitignore');
146
+ try {
147
+ await access(gitignorePath);
148
+ checks.push({
149
+ name: '.gitignore exists',
150
+ status: 'pass',
151
+ message: '.gitignore file found',
152
+ });
153
+ }
154
+ catch {
155
+ checks.push({
156
+ name: '.gitignore exists',
157
+ status: 'warn',
158
+ message: 'No .gitignore file found',
159
+ remediation: 'Create a .gitignore to exclude node_modules, .env, etc.',
160
+ });
161
+ }
162
+ return { checks };
163
+ }
164
+ async function checkRemoteAccess(cwd, url) {
165
+ try {
166
+ // Use git ls-remote to check if remote is accessible
167
+ await execAsync('git ls-remote --exit-code --heads origin', { cwd, timeout: 15000 });
168
+ return {
169
+ name: 'Remote accessible',
170
+ status: 'pass',
171
+ message: 'Remote repository is accessible',
172
+ };
173
+ }
174
+ catch (error) {
175
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
176
+ // Check for common error patterns
177
+ if (errorMessage.includes('Permission denied') || errorMessage.includes('publickey')) {
178
+ return {
179
+ name: 'Remote accessible',
180
+ status: 'fail',
181
+ message: 'SSH key not authorized for remote',
182
+ details: ['Authentication failed when accessing remote'],
183
+ remediation: 'Add your SSH key to GitHub/GitLab or configure HTTPS authentication',
184
+ };
185
+ }
186
+ if (errorMessage.includes('Could not resolve host') || errorMessage.includes('unable to access')) {
187
+ return {
188
+ name: 'Remote accessible',
189
+ status: 'fail',
190
+ message: 'Cannot reach remote repository',
191
+ details: ['Network error or invalid URL'],
192
+ remediation: 'Check network connection and verify remote URL is correct',
193
+ };
194
+ }
195
+ if (errorMessage.includes('Repository not found')) {
196
+ return {
197
+ name: 'Remote accessible',
198
+ status: 'fail',
199
+ message: 'Remote repository not found',
200
+ remediation: 'Verify the repository exists and you have access',
201
+ };
202
+ }
203
+ return {
204
+ name: 'Remote accessible',
205
+ status: 'warn',
206
+ message: 'Could not verify remote access',
207
+ details: [errorMessage.substring(0, 100)],
208
+ };
209
+ }
210
+ }
211
+ async function checkRemoteBranch(cwd, branch) {
212
+ try {
213
+ const { stdout } = await execAsync(`git ls-remote --heads origin ${branch}`, { cwd, timeout: 10000 });
214
+ if (stdout.trim()) {
215
+ return {
216
+ name: 'Branch on remote',
217
+ status: 'pass',
218
+ message: `Branch "${branch}" exists on remote`,
219
+ };
220
+ }
221
+ return {
222
+ name: 'Branch on remote',
223
+ status: 'warn',
224
+ message: `Branch "${branch}" does not exist on remote`,
225
+ remediation: `Run "git push -u origin ${branch}" to push branch to remote`,
226
+ };
227
+ }
228
+ catch {
229
+ return {
230
+ name: 'Branch on remote',
231
+ status: 'skip',
232
+ message: 'Could not check if branch exists on remote',
233
+ };
234
+ }
235
+ }
236
+ //# sourceMappingURL=git-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-validator.js","sourceRoot":"","sources":["../../../src/lib/validators/git-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PreflightResult } from '../../types/index.js';
2
+ export declare function detectHealthEndpoints(cwd?: string): Promise<PreflightResult>;
3
+ export declare function getHealthEndpointPath(cwd?: string): Promise<string | null>;
4
+ //# sourceMappingURL=health-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-detector.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/health-detector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,sBAAsB,CAAA;AA6B3E,wBAAsB,qBAAqB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CA8EjG;AAsED,wBAAsB,qBAAqB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS/F"}
@@ -0,0 +1,159 @@
1
+ import { readFile, readdir } from 'node:fs/promises';
2
+ import { join, extname } from 'node:path';
3
+ // Patterns that indicate health endpoint implementation
4
+ const HEALTH_PATTERNS = [
5
+ // Express/Fastify style
6
+ /(?:app|router|server)\s*\.\s*(?:get|use)\s*\(\s*['"](\/health|\/healthz|\/health\/live|\/health\/ready)['"]/gi,
7
+ // NestJS style
8
+ /@Get\s*\(\s*['"](health|healthz)['"]\s*\)/gi,
9
+ // Generic route definition
10
+ /['"](?:\/health|\/healthz|\/health\/live|\/health\/ready)['"]/gi,
11
+ // Go style
12
+ /(?:Handle|HandleFunc)\s*\(\s*['"](\/health|\/healthz)['"]/gi,
13
+ // Python/FastAPI style
14
+ /@(?:app|router)\s*\.\s*get\s*\(\s*['"](\/health|\/healthz)['"]/gi,
15
+ ];
16
+ // File extensions to scan
17
+ const SCAN_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.go', '.py', '.rs'];
18
+ // Directories to skip
19
+ const SKIP_DIRS = ['node_modules', '.git', 'dist', 'build', 'coverage', '.next', '__pycache__', 'target', 'vendor'];
20
+ export async function detectHealthEndpoints(cwd = process.cwd()) {
21
+ const checks = [];
22
+ try {
23
+ const matches = await scanForHealthEndpoints(cwd);
24
+ if (matches.length > 0) {
25
+ const details = matches.map(m => `${m.file}:${m.line} - ${m.path}`);
26
+ // Check if multiple health endpoints exist
27
+ const uniquePaths = [...new Set(matches.map(m => m.path))];
28
+ if (uniquePaths.length > 1) {
29
+ checks.push({
30
+ name: 'Health endpoint defined',
31
+ status: 'warn',
32
+ message: `Multiple health endpoint paths detected: ${uniquePaths.join(', ')}`,
33
+ details,
34
+ remediation: 'Consider consolidating to a single /health endpoint',
35
+ });
36
+ }
37
+ else {
38
+ checks.push({
39
+ name: 'Health endpoint defined',
40
+ status: 'pass',
41
+ message: `Health endpoint found at ${uniquePaths[0]}`,
42
+ details,
43
+ });
44
+ }
45
+ // Check for Kubernetes-style readiness/liveness probes
46
+ const hasLiveness = matches.some(m => m.path.includes('live') || m.path.includes('liveness'));
47
+ const hasReadiness = matches.some(m => m.path.includes('ready') || m.path.includes('readiness'));
48
+ if (hasLiveness && hasReadiness) {
49
+ checks.push({
50
+ name: 'Kubernetes probes',
51
+ status: 'pass',
52
+ message: 'Separate liveness and readiness probes detected',
53
+ });
54
+ }
55
+ else if (matches.length > 0) {
56
+ checks.push({
57
+ name: 'Kubernetes probes',
58
+ status: 'warn',
59
+ message: 'Consider adding separate liveness and readiness probes',
60
+ details: [
61
+ 'Liveness probe: /health/live - restart if unhealthy',
62
+ 'Readiness probe: /health/ready - remove from load balancer if not ready',
63
+ ],
64
+ remediation: 'Add /health/live and /health/ready endpoints for better Kubernetes integration',
65
+ });
66
+ }
67
+ }
68
+ else {
69
+ checks.push({
70
+ name: 'Health endpoint defined',
71
+ status: 'fail',
72
+ message: 'No health endpoint detected in source code',
73
+ details: [
74
+ 'Searched for: /health, /healthz, /health/live, /health/ready',
75
+ `Scanned extensions: ${SCAN_EXTENSIONS.join(', ')}`,
76
+ ],
77
+ remediation: 'Add a GET /health endpoint that returns 200 OK when the service is healthy',
78
+ });
79
+ }
80
+ }
81
+ catch (error) {
82
+ checks.push({
83
+ name: 'Health endpoint scan',
84
+ status: 'fail',
85
+ message: `Failed to scan for health endpoints: ${error instanceof Error ? error.message : 'Unknown error'}`,
86
+ });
87
+ }
88
+ return { checks };
89
+ }
90
+ async function scanForHealthEndpoints(dir, baseDir = dir) {
91
+ const matches = [];
92
+ try {
93
+ const entries = await readdir(dir, { withFileTypes: true });
94
+ for (const entry of entries) {
95
+ const fullPath = join(dir, entry.name);
96
+ if (entry.isDirectory()) {
97
+ if (!SKIP_DIRS.includes(entry.name)) {
98
+ const subMatches = await scanForHealthEndpoints(fullPath, baseDir);
99
+ matches.push(...subMatches);
100
+ }
101
+ }
102
+ else if (entry.isFile()) {
103
+ const ext = extname(entry.name);
104
+ if (SCAN_EXTENSIONS.includes(ext)) {
105
+ const fileMatches = await scanFile(fullPath, baseDir);
106
+ matches.push(...fileMatches);
107
+ }
108
+ }
109
+ }
110
+ }
111
+ catch {
112
+ // Ignore permission errors and continue
113
+ }
114
+ return matches;
115
+ }
116
+ async function scanFile(filePath, baseDir) {
117
+ const matches = [];
118
+ try {
119
+ const content = await readFile(filePath, 'utf-8');
120
+ const lines = content.split('\n');
121
+ const relativePath = filePath.replace(baseDir + '/', '');
122
+ for (let i = 0; i < lines.length; i++) {
123
+ const line = lines[i];
124
+ for (const pattern of HEALTH_PATTERNS) {
125
+ // Reset lastIndex for global patterns
126
+ pattern.lastIndex = 0;
127
+ const match = pattern.exec(line);
128
+ if (match) {
129
+ // Extract the health path from the match
130
+ const pathMatch = line.match(/['"](\/health[^'"]*)['"]/i);
131
+ const healthPath = pathMatch ? pathMatch[1] : '/health';
132
+ matches.push({
133
+ file: relativePath,
134
+ line: i + 1,
135
+ path: healthPath,
136
+ snippet: line.trim().substring(0, 100),
137
+ });
138
+ break; // Only one match per line
139
+ }
140
+ }
141
+ }
142
+ }
143
+ catch {
144
+ // Ignore read errors and continue
145
+ }
146
+ return matches;
147
+ }
148
+ // Export for use by other validators
149
+ export async function getHealthEndpointPath(cwd = process.cwd()) {
150
+ const matches = await scanForHealthEndpoints(cwd);
151
+ if (matches.length === 0)
152
+ return null;
153
+ // Prefer /health over others
154
+ const healthMatch = matches.find(m => m.path === '/health');
155
+ if (healthMatch)
156
+ return healthMatch.path;
157
+ return matches[0].path;
158
+ }
159
+ //# sourceMappingURL=health-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-detector.js","sourceRoot":"","sources":["../../../src/lib/validators/health-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { validateCatalog } from './catalog-validator.js';
2
+ export { validateDockerfile, detectFramework } from './dockerfile-validator.js';
3
+ export { detectHealthEndpoints, getHealthEndpointPath } from './health-detector.js';
4
+ export { validateEnvVars } from './env-validator.js';
5
+ export { validateRoutes } from './route-validator.js';
6
+ export { validateGit } from './git-validator.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC/E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,7 @@
1
+ export { validateCatalog } from './catalog-validator.js';
2
+ export { validateDockerfile, detectFramework } from './dockerfile-validator.js';
3
+ export { detectHealthEndpoints, getHealthEndpointPath } from './health-detector.js';
4
+ export { validateEnvVars } from './env-validator.js';
5
+ export { validateRoutes } from './route-validator.js';
6
+ export { validateGit } from './git-validator.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/validators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC/E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { PreflightResult } from '../../types/index.js';
2
+ export declare function validateRoutes(cwd?: string): Promise<PreflightResult>;
3
+ //# sourceMappingURL=route-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-validator.d.ts","sourceRoot":"","sources":["../../../src/lib/validators/route-validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAA8D,MAAM,sBAAsB,CAAA;AAavH,wBAAsB,cAAc,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAmF1F"}