@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.
- package/README.md +168 -0
- package/dist/commands/backup.d.ts +11 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +112 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/config.d.ts +10 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +41 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/deploy.d.ts +16 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +219 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/destroy.d.ts +12 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +62 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/env.d.ts +7 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +42 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/init-ai.d.ts +7 -0
- package/dist/commands/init-ai.d.ts.map +1 -0
- package/dist/commands/init-ai.js +257 -0
- package/dist/commands/init-ai.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +228 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/link.d.ts +10 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +193 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +8 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +164 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +16 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +362 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/preflight.d.ts +8 -0
- package/dist/commands/preflight.d.ts.map +1 -0
- package/dist/commands/preflight.js +188 -0
- package/dist/commands/preflight.js.map +1 -0
- package/dist/commands/program.d.ts +7 -0
- package/dist/commands/program.d.ts.map +1 -0
- package/dist/commands/program.js +59 -0
- package/dist/commands/program.js.map +1 -0
- package/dist/commands/push.d.ts +12 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +171 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/register.d.ts +7 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +124 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/rollback.d.ts +11 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +172 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/sample.d.ts +11 -0
- package/dist/commands/sample.d.ts.map +1 -0
- package/dist/commands/sample.js +114 -0
- package/dist/commands/sample.js.map +1 -0
- package/dist/commands/services.d.ts +13 -0
- package/dist/commands/services.d.ts.map +1 -0
- package/dist/commands/services.js +95 -0
- package/dist/commands/services.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +170 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/troubleshoot.d.ts +19 -0
- package/dist/commands/troubleshoot.d.ts.map +1 -0
- package/dist/commands/troubleshoot.js +465 -0
- package/dist/commands/troubleshoot.js.map +1 -0
- package/dist/commands/versions.d.ts +16 -0
- package/dist/commands/versions.d.ts.map +1 -0
- package/dist/commands/versions.js +162 -0
- package/dist/commands/versions.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +294 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/ai/client.d.ts +36 -0
- package/dist/lib/ai/client.d.ts.map +1 -0
- package/dist/lib/ai/client.js +140 -0
- package/dist/lib/ai/client.js.map +1 -0
- package/dist/lib/ai/generator.d.ts +17 -0
- package/dist/lib/ai/generator.d.ts.map +1 -0
- package/dist/lib/ai/generator.js +338 -0
- package/dist/lib/ai/generator.js.map +1 -0
- package/dist/lib/ai/prompts.d.ts +47 -0
- package/dist/lib/ai/prompts.d.ts.map +1 -0
- package/dist/lib/ai/prompts.js +247 -0
- package/dist/lib/ai/prompts.js.map +1 -0
- package/dist/lib/ai/scanner.d.ts +50 -0
- package/dist/lib/ai/scanner.d.ts.map +1 -0
- package/dist/lib/ai/scanner.js +237 -0
- package/dist/lib/ai/scanner.js.map +1 -0
- package/dist/lib/api.d.ts +18 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +67 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/builder.d.ts +34 -0
- package/dist/lib/builder.d.ts.map +1 -0
- package/dist/lib/builder.js +132 -0
- package/dist/lib/builder.js.map +1 -0
- package/dist/lib/config.d.ts +20 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +124 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/output.d.ts +12 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +39 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/scaffold.d.ts +29 -0
- package/dist/lib/scaffold.d.ts.map +1 -0
- package/dist/lib/scaffold.js +166 -0
- package/dist/lib/scaffold.js.map +1 -0
- package/dist/lib/troubleshoot/analyzer.d.ts +14 -0
- package/dist/lib/troubleshoot/analyzer.d.ts.map +1 -0
- package/dist/lib/troubleshoot/analyzer.js +541 -0
- package/dist/lib/troubleshoot/analyzer.js.map +1 -0
- package/dist/lib/troubleshoot/auto-fix.d.ts +29 -0
- package/dist/lib/troubleshoot/auto-fix.d.ts.map +1 -0
- package/dist/lib/troubleshoot/auto-fix.js +373 -0
- package/dist/lib/troubleshoot/auto-fix.js.map +1 -0
- package/dist/lib/troubleshoot/index.d.ts +5 -0
- package/dist/lib/troubleshoot/index.d.ts.map +1 -0
- package/dist/lib/troubleshoot/index.js +6 -0
- package/dist/lib/troubleshoot/index.js.map +1 -0
- package/dist/lib/troubleshoot/log-fetcher.d.ts +43 -0
- package/dist/lib/troubleshoot/log-fetcher.d.ts.map +1 -0
- package/dist/lib/troubleshoot/log-fetcher.js +431 -0
- package/dist/lib/troubleshoot/log-fetcher.js.map +1 -0
- package/dist/lib/troubleshoot/redactor.d.ts +35 -0
- package/dist/lib/troubleshoot/redactor.d.ts.map +1 -0
- package/dist/lib/troubleshoot/redactor.js +208 -0
- package/dist/lib/troubleshoot/redactor.js.map +1 -0
- package/dist/lib/validators/catalog-validator.d.ts +3 -0
- package/dist/lib/validators/catalog-validator.d.ts.map +1 -0
- package/dist/lib/validators/catalog-validator.js +205 -0
- package/dist/lib/validators/catalog-validator.js.map +1 -0
- package/dist/lib/validators/dockerfile-validator.d.ts +4 -0
- package/dist/lib/validators/dockerfile-validator.d.ts.map +1 -0
- package/dist/lib/validators/dockerfile-validator.js +262 -0
- package/dist/lib/validators/dockerfile-validator.js.map +1 -0
- package/dist/lib/validators/env-validator.d.ts +3 -0
- package/dist/lib/validators/env-validator.d.ts.map +1 -0
- package/dist/lib/validators/env-validator.js +268 -0
- package/dist/lib/validators/env-validator.js.map +1 -0
- package/dist/lib/validators/git-validator.d.ts +3 -0
- package/dist/lib/validators/git-validator.d.ts.map +1 -0
- package/dist/lib/validators/git-validator.js +236 -0
- package/dist/lib/validators/git-validator.js.map +1 -0
- package/dist/lib/validators/health-detector.d.ts +4 -0
- package/dist/lib/validators/health-detector.d.ts.map +1 -0
- package/dist/lib/validators/health-detector.js +159 -0
- package/dist/lib/validators/health-detector.js.map +1 -0
- package/dist/lib/validators/index.d.ts +7 -0
- package/dist/lib/validators/index.d.ts.map +1 -0
- package/dist/lib/validators/index.js +7 -0
- package/dist/lib/validators/index.js.map +1 -0
- package/dist/lib/validators/route-validator.d.ts +3 -0
- package/dist/lib/validators/route-validator.d.ts.map +1 -0
- package/dist/lib/validators/route-validator.js +238 -0
- package/dist/lib/validators/route-validator.js.map +1 -0
- package/dist/types/index.d.ts +455 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +37 -0
- package/dist/types/index.js.map +1 -0
- 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 @@
|
|
|
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"}
|