@panguard-ai/panguard 0.2.5 → 0.3.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/LICENSE +1 -1
- package/dist/bridges/scan-to-report.d.ts +34 -0
- package/dist/bridges/scan-to-report.d.ts.map +1 -0
- package/dist/bridges/scan-to-report.js +28 -0
- package/dist/bridges/scan-to-report.js.map +1 -0
- package/dist/cli/auth-guard.d.ts +3 -2
- package/dist/cli/auth-guard.d.ts.map +1 -1
- package/dist/cli/auth-guard.js +6 -18
- package/dist/cli/auth-guard.js.map +1 -1
- package/dist/cli/commands/audit.d.ts +7 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +85 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/deploy.js +34 -1
- package/dist/cli/commands/deploy.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +22 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +502 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +209 -0
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +17 -8
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/login.js +5 -2
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/manager.d.ts.map +1 -1
- package/dist/cli/commands/manager.js +43 -34
- package/dist/cli/commands/manager.js.map +1 -1
- package/dist/cli/commands/scan.d.ts.map +1 -1
- package/dist/cli/commands/scan.js +102 -8
- package/dist/cli/commands/scan.js.map +1 -1
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/serve.js +173 -4
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/threat.d.ts.map +1 -1
- package/dist/cli/commands/threat.js +8 -1
- package/dist/cli/commands/threat.js.map +1 -1
- package/dist/cli/credentials.d.ts +2 -2
- package/dist/cli/credentials.d.ts.map +1 -1
- package/dist/cli/credentials.js +3 -7
- package/dist/cli/credentials.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/interactive.d.ts +2 -2
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +450 -211
- package/dist/cli/interactive.js.map +1 -1
- package/dist/cli/menu.d.ts +25 -15
- package/dist/cli/menu.d.ts.map +1 -1
- package/dist/cli/menu.js +117 -124
- package/dist/cli/menu.js.map +1 -1
- package/dist/cli/theme.d.ts +1 -1
- package/dist/cli/theme.d.ts.map +1 -1
- package/dist/cli/theme.js +1 -2
- package/dist/cli/theme.js.map +1 -1
- package/dist/cli/ux-helpers.d.ts +4 -0
- package/dist/cli/ux-helpers.d.ts.map +1 -1
- package/dist/cli/ux-helpers.js +10 -0
- package/dist/cli/ux-helpers.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/init/config-writer.d.ts +12 -1
- package/dist/init/config-writer.d.ts.map +1 -1
- package/dist/init/config-writer.js +149 -6
- package/dist/init/config-writer.js.map +1 -1
- package/dist/init/environment.d.ts +9 -0
- package/dist/init/environment.d.ts.map +1 -1
- package/dist/init/environment.js +127 -0
- package/dist/init/environment.js.map +1 -1
- package/dist/init/index.d.ts +4 -4
- package/dist/init/index.d.ts.map +1 -1
- package/dist/init/index.js +3 -3
- package/dist/init/index.js.map +1 -1
- package/dist/init/steps.d.ts +5 -0
- package/dist/init/steps.d.ts.map +1 -1
- package/dist/init/steps.js +155 -1
- package/dist/init/steps.js.map +1 -1
- package/dist/init/types.d.ts +13 -0
- package/dist/init/types.d.ts.map +1 -1
- package/dist/init/wizard-runner.d.ts +3 -2
- package/dist/init/wizard-runner.d.ts.map +1 -1
- package/dist/init/wizard-runner.js +30 -15
- package/dist/init/wizard-runner.js.map +1 -1
- package/package.json +8 -6
- package/dist/manager/manager-server.d.ts +0 -102
- package/dist/manager/manager-server.d.ts.map +0 -1
- package/dist/manager/manager-server.js +0 -515
- package/dist/manager/manager-server.js.map +0 -1
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `panguard doctor` - Health diagnostic command
|
|
3
|
+
* `panguard doctor` - 健康診斷指令
|
|
4
|
+
*
|
|
5
|
+
* Runs a 10-stage pipeline of system checks and reports pass/warn/fail
|
|
6
|
+
* for each, with fix suggestions for non-passing items.
|
|
7
|
+
*
|
|
8
|
+
* @module @panguard-ai/panguard/cli/commands/doctor
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { c, symbols, box, header } from '@panguard-ai/core';
|
|
15
|
+
import { PANGUARD_VERSION } from '../../index.js';
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Paths
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
const HOME = homedir();
|
|
20
|
+
const PANGUARD_DIR = join(HOME, '.panguard');
|
|
21
|
+
const CONFIG_PATH = join(PANGUARD_DIR, 'config.json');
|
|
22
|
+
const CREDENTIALS_PATH = join(PANGUARD_DIR, 'credentials.enc');
|
|
23
|
+
const LEGACY_CREDENTIALS_PATH = join(PANGUARD_DIR, 'credentials.json');
|
|
24
|
+
const LAST_SCAN_PATH = join(PANGUARD_DIR, 'last-scan.json');
|
|
25
|
+
const GUARD_PID_PATH = join(HOME, '.panguard-guard', 'panguard-guard.pid');
|
|
26
|
+
const LAUNCHD_PLIST_PATH = join(HOME, 'Library', 'LaunchAgents', 'ai.panguard.guard.plist');
|
|
27
|
+
const ZSH_COMPLETIONS_PATH = join(HOME, '.zsh', 'completions', '_panguard');
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Individual checks
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
function checkInstallation() {
|
|
32
|
+
const hasVersion = Boolean(PANGUARD_VERSION);
|
|
33
|
+
return {
|
|
34
|
+
status: hasVersion ? 'pass' : 'fail',
|
|
35
|
+
label: 'Installation integrity',
|
|
36
|
+
detail: hasVersion ? `Binary OK, v${PANGUARD_VERSION}` : 'Cannot determine version',
|
|
37
|
+
fix: hasVersion ? undefined : 'Reinstall panguard: npm install -g @panguard-ai/panguard',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
function checkConfiguration() {
|
|
41
|
+
if (!existsSync(CONFIG_PATH)) {
|
|
42
|
+
return {
|
|
43
|
+
status: 'fail',
|
|
44
|
+
label: 'Configuration valid',
|
|
45
|
+
detail: '~/.panguard/config.json not found',
|
|
46
|
+
fix: 'Run "panguard init" to create your configuration',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const raw = readFileSync(CONFIG_PATH, 'utf-8');
|
|
51
|
+
JSON.parse(raw);
|
|
52
|
+
return {
|
|
53
|
+
status: 'pass',
|
|
54
|
+
label: 'Configuration valid',
|
|
55
|
+
detail: '~/.panguard/config.json',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return {
|
|
60
|
+
status: 'fail',
|
|
61
|
+
label: 'Configuration valid',
|
|
62
|
+
detail: '~/.panguard/config.json is not valid JSON',
|
|
63
|
+
fix: 'Run "panguard init" to regenerate the configuration file',
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function checkCredentials() {
|
|
68
|
+
const hasEncrypted = existsSync(CREDENTIALS_PATH);
|
|
69
|
+
const hasLegacy = existsSync(LEGACY_CREDENTIALS_PATH);
|
|
70
|
+
if (!hasEncrypted && !hasLegacy) {
|
|
71
|
+
return {
|
|
72
|
+
status: 'warn',
|
|
73
|
+
label: 'License / credentials',
|
|
74
|
+
detail: 'No credentials found',
|
|
75
|
+
fix: 'Run "panguard login" to authenticate and activate your plan',
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const credPath = hasEncrypted ? CREDENTIALS_PATH : LEGACY_CREDENTIALS_PATH;
|
|
79
|
+
try {
|
|
80
|
+
if (!hasEncrypted && hasLegacy) {
|
|
81
|
+
// Legacy plaintext — can read directly
|
|
82
|
+
const raw = readFileSync(credPath, 'utf-8');
|
|
83
|
+
const data = JSON.parse(raw);
|
|
84
|
+
const tier = data.tier ?? 'unknown';
|
|
85
|
+
const expiry = data.expiresAt ? data.expiresAt.slice(0, 10) : 'unknown';
|
|
86
|
+
return {
|
|
87
|
+
status: 'pass',
|
|
88
|
+
label: 'License / credentials',
|
|
89
|
+
detail: `${capitalise(tier)} plan, expires ${expiry}`,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Encrypted — only report presence, not content (no key available here)
|
|
93
|
+
return {
|
|
94
|
+
status: 'pass',
|
|
95
|
+
label: 'License / credentials',
|
|
96
|
+
detail: 'Credentials file present (~/.panguard/credentials.enc)',
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return {
|
|
101
|
+
status: 'warn',
|
|
102
|
+
label: 'License / credentials',
|
|
103
|
+
detail: 'Credentials file present but could not be read',
|
|
104
|
+
fix: 'Run "panguard login" to re-authenticate',
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function checkAiProvider() {
|
|
109
|
+
// Check environment variables
|
|
110
|
+
const hasOllama = Boolean(process.env['OLLAMA_HOST']);
|
|
111
|
+
const hasOpenAi = Boolean(process.env['OPENAI_API_KEY']);
|
|
112
|
+
const hasAnthropic = Boolean(process.env['ANTHROPIC_API_KEY']);
|
|
113
|
+
if (hasOllama || hasOpenAi || hasAnthropic) {
|
|
114
|
+
const providers = [];
|
|
115
|
+
if (hasOllama)
|
|
116
|
+
providers.push('Ollama');
|
|
117
|
+
if (hasOpenAi)
|
|
118
|
+
providers.push('OpenAI');
|
|
119
|
+
if (hasAnthropic)
|
|
120
|
+
providers.push('Anthropic');
|
|
121
|
+
return {
|
|
122
|
+
status: 'pass',
|
|
123
|
+
label: 'AI provider',
|
|
124
|
+
detail: `API key set (${providers.join(', ')})`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// Fall back to config file
|
|
128
|
+
if (existsSync(CONFIG_PATH)) {
|
|
129
|
+
try {
|
|
130
|
+
const raw = readFileSync(CONFIG_PATH, 'utf-8');
|
|
131
|
+
const cfg = JSON.parse(raw);
|
|
132
|
+
if (cfg.ai?.preference === 'rules_only') {
|
|
133
|
+
return {
|
|
134
|
+
status: 'pass',
|
|
135
|
+
label: 'AI provider',
|
|
136
|
+
detail: 'Rules-only mode (no AI provider required)',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
if (cfg.ai?.provider) {
|
|
140
|
+
return {
|
|
141
|
+
status: 'pass',
|
|
142
|
+
label: 'AI provider',
|
|
143
|
+
detail: `Provider configured: ${cfg.ai.provider}`,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// fall through to warn
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
status: 'warn',
|
|
153
|
+
label: 'AI provider',
|
|
154
|
+
detail: 'No AI provider configured',
|
|
155
|
+
fix: 'Set OPENAI_API_KEY / ANTHROPIC_API_KEY env var, or run "panguard config llm --provider ollama"',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function checkGuardEngine() {
|
|
159
|
+
if (!existsSync(GUARD_PID_PATH)) {
|
|
160
|
+
return {
|
|
161
|
+
status: 'fail',
|
|
162
|
+
label: 'Guard engine',
|
|
163
|
+
detail: 'Daemon not running (no PID file)',
|
|
164
|
+
fix: 'Run "panguard guard start" to start the guard daemon',
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
try {
|
|
168
|
+
const pidStr = readFileSync(GUARD_PID_PATH, 'utf-8').trim();
|
|
169
|
+
const pid = parseInt(pidStr, 10);
|
|
170
|
+
if (isNaN(pid))
|
|
171
|
+
throw new Error('Invalid PID');
|
|
172
|
+
process.kill(pid, 0); // signal 0 checks existence without killing
|
|
173
|
+
return {
|
|
174
|
+
status: 'pass',
|
|
175
|
+
label: 'Guard engine',
|
|
176
|
+
detail: `Daemon running (PID ${pid})`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return {
|
|
181
|
+
status: 'fail',
|
|
182
|
+
label: 'Guard engine',
|
|
183
|
+
detail: 'PID file exists but daemon is not running',
|
|
184
|
+
fix: 'Run "panguard guard start" to restart the guard daemon',
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function checkNotificationChannels() {
|
|
189
|
+
if (!existsSync(CONFIG_PATH)) {
|
|
190
|
+
return {
|
|
191
|
+
status: 'warn',
|
|
192
|
+
label: 'Notification channels',
|
|
193
|
+
detail: 'Config not found — cannot verify channels',
|
|
194
|
+
fix: 'Run "panguard init" to set up notification channels',
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
const raw = readFileSync(CONFIG_PATH, 'utf-8');
|
|
199
|
+
const cfg = JSON.parse(raw);
|
|
200
|
+
const channel = cfg.notifications?.channel ?? 'none';
|
|
201
|
+
if (channel === 'none' || channel === '') {
|
|
202
|
+
return {
|
|
203
|
+
status: 'warn',
|
|
204
|
+
label: 'Notification channels',
|
|
205
|
+
detail: 'No notification channel configured',
|
|
206
|
+
fix: 'Run "panguard init" and configure a Telegram, Slack, or webhook channel',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
status: 'pass',
|
|
211
|
+
label: 'Notification channels',
|
|
212
|
+
detail: capitalise(channel) + ': connected',
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return {
|
|
217
|
+
status: 'warn',
|
|
218
|
+
label: 'Notification channels',
|
|
219
|
+
detail: 'Could not parse config to verify channels',
|
|
220
|
+
fix: 'Run "panguard init" to reconfigure',
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
function checkLastScan() {
|
|
225
|
+
if (!existsSync(LAST_SCAN_PATH)) {
|
|
226
|
+
return {
|
|
227
|
+
status: 'warn',
|
|
228
|
+
label: 'Last scan',
|
|
229
|
+
detail: 'No scan result found',
|
|
230
|
+
fix: 'Run "panguard scan" to perform your first scan',
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
const raw = readFileSync(LAST_SCAN_PATH, 'utf-8');
|
|
235
|
+
const data = JSON.parse(raw);
|
|
236
|
+
const scannedAt = data.scannedAt ? new Date(data.scannedAt) : null;
|
|
237
|
+
if (!scannedAt || isNaN(scannedAt.getTime())) {
|
|
238
|
+
return {
|
|
239
|
+
status: 'warn',
|
|
240
|
+
label: 'Last scan',
|
|
241
|
+
detail: 'Scan record found but timestamp is invalid',
|
|
242
|
+
fix: 'Run "panguard scan" to perform a fresh scan',
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
const diffDays = Math.floor((Date.now() - scannedAt.getTime()) / 86_400_000);
|
|
246
|
+
if (diffDays > 7) {
|
|
247
|
+
return {
|
|
248
|
+
status: 'warn',
|
|
249
|
+
label: 'Last scan',
|
|
250
|
+
detail: `${diffDays} days ago (recommend weekly)`,
|
|
251
|
+
fix: 'Run "panguard scan" to perform a fresh scan',
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
status: 'pass',
|
|
256
|
+
label: 'Last scan',
|
|
257
|
+
detail: diffDays === 0 ? 'Today' : `${diffDays} day${diffDays === 1 ? '' : 's'} ago`,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return {
|
|
262
|
+
status: 'warn',
|
|
263
|
+
label: 'Last scan',
|
|
264
|
+
detail: 'Could not read last scan record',
|
|
265
|
+
fix: 'Run "panguard scan" to generate a fresh scan result',
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function checkThreatCloud() {
|
|
270
|
+
if (!existsSync(CONFIG_PATH)) {
|
|
271
|
+
return {
|
|
272
|
+
status: 'warn',
|
|
273
|
+
label: 'Threat Cloud',
|
|
274
|
+
detail: 'Config not found — cannot verify Threat Cloud endpoint',
|
|
275
|
+
fix: 'Run "panguard init" to configure Threat Cloud connectivity',
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
try {
|
|
279
|
+
const raw = readFileSync(CONFIG_PATH, 'utf-8');
|
|
280
|
+
const cfg = JSON.parse(raw);
|
|
281
|
+
const endpoint = cfg.threatCloud?.endpoint;
|
|
282
|
+
const enabled = cfg.threatCloud?.enabled ?? false;
|
|
283
|
+
if (!endpoint && !enabled) {
|
|
284
|
+
// Threat Cloud is optional — not a failure
|
|
285
|
+
return {
|
|
286
|
+
status: 'warn',
|
|
287
|
+
label: 'Threat Cloud',
|
|
288
|
+
detail: 'Threat Cloud endpoint not configured',
|
|
289
|
+
fix: 'Configure a Threat Cloud endpoint in your config to enable shared threat intelligence',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
const displayEndpoint = endpoint ?? 'tc.panguard.ai';
|
|
293
|
+
return {
|
|
294
|
+
status: 'pass',
|
|
295
|
+
label: 'Threat Cloud',
|
|
296
|
+
detail: `Connected to ${displayEndpoint}`,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return {
|
|
301
|
+
status: 'warn',
|
|
302
|
+
label: 'Threat Cloud',
|
|
303
|
+
detail: 'Could not parse config to verify Threat Cloud',
|
|
304
|
+
fix: 'Run "panguard init" to reconfigure',
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
function checkSystemService() {
|
|
309
|
+
const isMacOS = process.platform === 'darwin';
|
|
310
|
+
if (!isMacOS) {
|
|
311
|
+
// On non-macOS platforms skip launchd check
|
|
312
|
+
return {
|
|
313
|
+
status: 'pass',
|
|
314
|
+
label: 'System service',
|
|
315
|
+
detail: `Platform: ${process.platform} (launchd check skipped)`,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
if (!existsSync(LAUNCHD_PLIST_PATH)) {
|
|
319
|
+
return {
|
|
320
|
+
status: 'warn',
|
|
321
|
+
label: 'System service',
|
|
322
|
+
detail: 'launchd plist not found',
|
|
323
|
+
fix: 'Run "panguard guard install" to install the system service',
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
// Verify plist references the config
|
|
327
|
+
try {
|
|
328
|
+
const plistContent = readFileSync(LAUNCHD_PLIST_PATH, 'utf-8');
|
|
329
|
+
const matchesConfig = plistContent.includes('panguard');
|
|
330
|
+
return {
|
|
331
|
+
status: matchesConfig ? 'pass' : 'warn',
|
|
332
|
+
label: 'System service',
|
|
333
|
+
detail: matchesConfig
|
|
334
|
+
? 'launchd unit matches config'
|
|
335
|
+
: 'launchd plist exists but may be outdated',
|
|
336
|
+
fix: matchesConfig
|
|
337
|
+
? undefined
|
|
338
|
+
: 'Run "panguard guard install" to reinstall the service',
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
return {
|
|
343
|
+
status: 'warn',
|
|
344
|
+
label: 'System service',
|
|
345
|
+
detail: 'launchd plist found but could not be read',
|
|
346
|
+
fix: 'Run "panguard guard install" to reinstall the service',
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
function checkShellCompletions() {
|
|
351
|
+
if (existsSync(ZSH_COMPLETIONS_PATH)) {
|
|
352
|
+
return {
|
|
353
|
+
status: 'pass',
|
|
354
|
+
label: 'Shell completions',
|
|
355
|
+
detail: 'zsh completions installed',
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
// Also check common homebrew completion paths
|
|
359
|
+
const altPaths = [
|
|
360
|
+
join(HOME, '.oh-my-zsh', 'completions', '_panguard'),
|
|
361
|
+
'/usr/local/share/zsh/site-functions/_panguard',
|
|
362
|
+
'/opt/homebrew/share/zsh/site-functions/_panguard',
|
|
363
|
+
];
|
|
364
|
+
for (const alt of altPaths) {
|
|
365
|
+
if (existsSync(alt)) {
|
|
366
|
+
return {
|
|
367
|
+
status: 'pass',
|
|
368
|
+
label: 'Shell completions',
|
|
369
|
+
detail: `zsh completions installed (${alt})`,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return {
|
|
374
|
+
status: 'warn',
|
|
375
|
+
label: 'Shell completions',
|
|
376
|
+
detail: 'zsh completions not found',
|
|
377
|
+
fix: 'Run "panguard completion install" to install shell completions',
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
// ---------------------------------------------------------------------------
|
|
381
|
+
// Run all checks
|
|
382
|
+
// ---------------------------------------------------------------------------
|
|
383
|
+
function runAllChecks() {
|
|
384
|
+
return [
|
|
385
|
+
checkInstallation(),
|
|
386
|
+
checkConfiguration(),
|
|
387
|
+
checkCredentials(),
|
|
388
|
+
checkAiProvider(),
|
|
389
|
+
checkGuardEngine(),
|
|
390
|
+
checkNotificationChannels(),
|
|
391
|
+
checkLastScan(),
|
|
392
|
+
checkThreatCloud(),
|
|
393
|
+
checkSystemService(),
|
|
394
|
+
checkShellCompletions(),
|
|
395
|
+
];
|
|
396
|
+
}
|
|
397
|
+
// ---------------------------------------------------------------------------
|
|
398
|
+
// Rendering helpers
|
|
399
|
+
// ---------------------------------------------------------------------------
|
|
400
|
+
function statusSymbol(status) {
|
|
401
|
+
switch (status) {
|
|
402
|
+
case 'pass':
|
|
403
|
+
return symbols.pass;
|
|
404
|
+
case 'warn':
|
|
405
|
+
return symbols.warn;
|
|
406
|
+
case 'fail':
|
|
407
|
+
return symbols.fail;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
function statusColor(status) {
|
|
411
|
+
switch (status) {
|
|
412
|
+
case 'pass':
|
|
413
|
+
return c.sage;
|
|
414
|
+
case 'warn':
|
|
415
|
+
return c.caution;
|
|
416
|
+
case 'fail':
|
|
417
|
+
return c.critical;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
function capitalise(text) {
|
|
421
|
+
if (!text)
|
|
422
|
+
return text;
|
|
423
|
+
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
424
|
+
}
|
|
425
|
+
// ---------------------------------------------------------------------------
|
|
426
|
+
// runDoctor — interactive display (called from interactive.ts)
|
|
427
|
+
// ---------------------------------------------------------------------------
|
|
428
|
+
export async function runDoctor(lang) {
|
|
429
|
+
const results = runAllChecks();
|
|
430
|
+
console.log('');
|
|
431
|
+
console.log(header(lang === 'zh-TW' ? 'Panguard AI 健康診斷' : 'Panguard AI Health Check'));
|
|
432
|
+
// Label column width for alignment
|
|
433
|
+
const labelWidth = Math.max(...results.map((r) => r.label.length));
|
|
434
|
+
for (const result of results) {
|
|
435
|
+
const sym = statusSymbol(result.status);
|
|
436
|
+
const color = statusColor(result.status);
|
|
437
|
+
const paddedLabel = result.label.padEnd(labelWidth);
|
|
438
|
+
console.log(` ${sym} ${color(paddedLabel)} ${c.dim(result.detail)}`);
|
|
439
|
+
if (result.status !== 'pass' && result.fix) {
|
|
440
|
+
console.log(` ${c.dim('fix:')} ${result.fix}`);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
console.log('');
|
|
444
|
+
// Summary
|
|
445
|
+
const passed = results.filter((r) => r.status === 'pass').length;
|
|
446
|
+
const warned = results.filter((r) => r.status === 'warn').length;
|
|
447
|
+
const failed = results.filter((r) => r.status === 'fail').length;
|
|
448
|
+
const summaryParts = [
|
|
449
|
+
c.sage(`${passed} passed`),
|
|
450
|
+
warned > 0 ? c.caution(`${warned} warning${warned === 1 ? '' : 's'}`) : c.dim('0 warnings'),
|
|
451
|
+
failed > 0 ? c.critical(`${failed} failed`) : c.dim('0 failed'),
|
|
452
|
+
];
|
|
453
|
+
const summaryLine = summaryParts.join(c.dim(' · '));
|
|
454
|
+
console.log(box(summaryLine, { title: lang === 'zh-TW' ? '診斷摘要' : 'Summary' }));
|
|
455
|
+
console.log('');
|
|
456
|
+
}
|
|
457
|
+
// ---------------------------------------------------------------------------
|
|
458
|
+
// doctorCommand — Commander command for CLI registration
|
|
459
|
+
// ---------------------------------------------------------------------------
|
|
460
|
+
export function doctorCommand() {
|
|
461
|
+
return new Command('doctor')
|
|
462
|
+
.description('Run health diagnostics / \u57F7\u884C\u5065\u5EB7\u8A3A\u65B7')
|
|
463
|
+
.option('--json', 'Output results as JSON')
|
|
464
|
+
.option('--fix', 'Attempt auto-repair of detected issues')
|
|
465
|
+
.option('--lang <language>', 'Language override (en | zh-TW)')
|
|
466
|
+
.action(async (opts) => {
|
|
467
|
+
const lang = opts.lang === 'en' ? 'en' : 'zh-TW';
|
|
468
|
+
const results = runAllChecks();
|
|
469
|
+
if (opts.json) {
|
|
470
|
+
console.log(JSON.stringify(results, null, 2));
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
if (opts.fix) {
|
|
474
|
+
console.log('');
|
|
475
|
+
console.log(header(lang === 'zh-TW' ? 'Panguard AI 健康診斷 — 自動修復' : 'Panguard AI Health Check — Auto-fix'));
|
|
476
|
+
const fixable = results.filter((r) => r.status !== 'pass' && r.fix);
|
|
477
|
+
if (fixable.length === 0) {
|
|
478
|
+
console.log(` ${symbols.pass} ${c.sage('No issues require fixing.')}`);
|
|
479
|
+
console.log('');
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
for (const result of fixable) {
|
|
483
|
+
const sym = statusSymbol(result.status);
|
|
484
|
+
console.log(` ${sym} ${c.bold(result.label)}`);
|
|
485
|
+
console.log(` ${c.dim('Would run:')} ${result.fix}`);
|
|
486
|
+
}
|
|
487
|
+
console.log('');
|
|
488
|
+
console.log(` ${symbols.info} ${c.dim(lang === 'zh-TW'
|
|
489
|
+
? '自動修復功能即將推出。請手動執行上述指令。'
|
|
490
|
+
: 'Automated fix execution coming soon. Please run the above commands manually.')}`);
|
|
491
|
+
console.log('');
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
// Default: same as interactive display
|
|
495
|
+
await runDoctor(lang);
|
|
496
|
+
const hasFailure = results.some((r) => r.status === 'fail');
|
|
497
|
+
if (hasFailure) {
|
|
498
|
+
process.exitCode = 1;
|
|
499
|
+
}
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/guard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,YAAY,IAAI,OAAO,CAoGtC"}
|