@panguard-ai/panguard 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/dist/cli/auth-guard.d.ts +79 -0
- package/dist/cli/auth-guard.d.ts.map +1 -0
- package/dist/cli/auth-guard.js +337 -0
- package/dist/cli/auth-guard.js.map +1 -0
- package/dist/cli/commands/admin.d.ts.map +1 -0
- package/dist/cli/commands/admin.js +129 -0
- package/dist/cli/commands/admin.js.map +1 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +75 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/config.d.ts +12 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +94 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/demo.d.ts.map +1 -0
- package/dist/cli/commands/demo.js +170 -0
- package/dist/cli/commands/demo.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +9 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js +242 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/guard.d.ts.map +1 -0
- package/dist/cli/commands/guard.js +82 -0
- package/dist/cli/commands/guard.js.map +1 -0
- package/dist/cli/commands/hardening.d.ts +9 -0
- package/dist/cli/commands/hardening.d.ts.map +1 -0
- package/dist/cli/commands/hardening.js +114 -0
- package/dist/cli/commands/hardening.js.map +1 -0
- package/dist/cli/commands/init.d.ts +9 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +43 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/login.d.ts +12 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +269 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +11 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +48 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/manager.d.ts +7 -0
- package/dist/cli/commands/manager.d.ts.map +1 -0
- package/dist/cli/commands/manager.js +104 -0
- package/dist/cli/commands/manager.js.map +1 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +69 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +279 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +598 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.d.ts +9 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +258 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/threat.d.ts.map +1 -0
- package/dist/cli/commands/threat.js +115 -0
- package/dist/cli/commands/threat.js.map +1 -0
- package/dist/cli/commands/trap.d.ts.map +1 -0
- package/dist/cli/commands/trap.js +62 -0
- package/dist/cli/commands/trap.js.map +1 -0
- package/dist/cli/commands/upgrade.d.ts +12 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +258 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +9 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +78 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/cli/credentials.d.ts +71 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +207 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/index.d.ts +12 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +82 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/interactive.d.ts +10 -0
- package/dist/cli/interactive.d.ts.map +1 -0
- package/dist/cli/interactive.js +822 -0
- package/dist/cli/interactive.js.map +1 -0
- package/dist/cli/menu.d.ts +54 -0
- package/dist/cli/menu.d.ts.map +1 -0
- package/dist/cli/menu.js +254 -0
- package/dist/cli/menu.js.map +1 -0
- package/dist/cli/theme.d.ts +32 -0
- package/dist/cli/theme.d.ts.map +1 -0
- package/dist/cli/theme.js +79 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli/ux-helpers.d.ts +30 -0
- package/dist/cli/ux-helpers.d.ts.map +1 -0
- package/dist/cli/ux-helpers.js +63 -0
- package/dist/cli/ux-helpers.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/init/config-writer.d.ts +20 -0
- package/dist/init/config-writer.d.ts.map +1 -0
- package/dist/init/config-writer.js +149 -0
- package/dist/init/config-writer.js.map +1 -0
- package/dist/init/environment.d.ts +31 -0
- package/dist/init/environment.d.ts.map +1 -0
- package/dist/init/environment.js +62 -0
- package/dist/init/environment.js.map +1 -0
- package/dist/init/index.d.ts +12 -0
- package/dist/init/index.d.ts.map +1 -0
- package/dist/init/index.js +11 -0
- package/dist/init/index.js.map +1 -0
- package/dist/init/steps.d.ts +15 -0
- package/dist/init/steps.d.ts.map +1 -0
- package/dist/init/steps.js +359 -0
- package/dist/init/steps.js.map +1 -0
- package/dist/init/types.d.ts +98 -0
- package/dist/init/types.d.ts.map +1 -0
- package/dist/init/types.js +8 -0
- package/dist/init/types.js.map +1 -0
- package/dist/init/wizard-runner.d.ts +12 -0
- package/dist/init/wizard-runner.d.ts.map +1 -0
- package/dist/init/wizard-runner.js +204 -0
- package/dist/init/wizard-runner.js.map +1 -0
- package/dist/manager/manager-server.d.ts +102 -0
- package/dist/manager/manager-server.d.ts.map +1 -0
- package/dist/manager/manager-server.js +515 -0
- package/dist/manager/manager-server.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* panguard chat - Notification system management
|
|
3
|
+
* panguard chat - 通知系統管理
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { runCLI } from '@panguard-ai/panguard-chat';
|
|
7
|
+
import { withAuth } from '../auth-guard.js';
|
|
8
|
+
export function chatCommand() {
|
|
9
|
+
const cmd = new Command('chat').description('Notification system management / \u901A\u77E5\u7CFB\u7D71\u7BA1\u7406');
|
|
10
|
+
cmd
|
|
11
|
+
.command('setup')
|
|
12
|
+
.description('Interactive notification setup / \u4E92\u52D5\u5F0F\u901A\u77E5\u8A2D\u5B9A')
|
|
13
|
+
.option('--lang <lang>', 'Language: en or zh-TW / \u8A9E\u8A00', 'zh-TW')
|
|
14
|
+
.option('--channel <type>', 'Channel type (telegram, slack, email, webhook)')
|
|
15
|
+
.option('--user-type <type>', 'User type (developer, boss, it_admin)')
|
|
16
|
+
.action(withAuth('solo', async (opts) => {
|
|
17
|
+
const args = ['setup'];
|
|
18
|
+
if (opts['lang'])
|
|
19
|
+
args.push('--lang', opts['lang']);
|
|
20
|
+
if (opts['channel'])
|
|
21
|
+
args.push('--channel', opts['channel']);
|
|
22
|
+
if (opts['userType'])
|
|
23
|
+
args.push('--user-type', opts['userType']);
|
|
24
|
+
await runCLI(args);
|
|
25
|
+
}));
|
|
26
|
+
cmd
|
|
27
|
+
.command('test')
|
|
28
|
+
.description('Send a test notification / 發送測試通知')
|
|
29
|
+
.option('--channel <type>', 'Channel type', 'webhook')
|
|
30
|
+
.option('--url <url>', 'Webhook URL')
|
|
31
|
+
.option('--lang <lang>', 'Language', 'zh-TW')
|
|
32
|
+
.action(withAuth('solo', async (opts) => {
|
|
33
|
+
const args = ['test'];
|
|
34
|
+
if (opts['channel'])
|
|
35
|
+
args.push('--channel', opts['channel']);
|
|
36
|
+
if (opts['url'])
|
|
37
|
+
args.push('--url', opts['url']);
|
|
38
|
+
if (opts['lang'])
|
|
39
|
+
args.push('--lang', opts['lang']);
|
|
40
|
+
await runCLI(args);
|
|
41
|
+
}));
|
|
42
|
+
cmd
|
|
43
|
+
.command('status')
|
|
44
|
+
.description('Show channel status / 顯示管道狀態')
|
|
45
|
+
.action(async () => {
|
|
46
|
+
await runCLI(['status']);
|
|
47
|
+
});
|
|
48
|
+
cmd
|
|
49
|
+
.command('config')
|
|
50
|
+
.description('Show current configuration / 顯示當前配置')
|
|
51
|
+
.action(async () => {
|
|
52
|
+
await runCLI(['config']);
|
|
53
|
+
});
|
|
54
|
+
cmd
|
|
55
|
+
.command('prefs')
|
|
56
|
+
.description('View/update notification preferences / 查看/更新通知偏好')
|
|
57
|
+
.option('--critical <on|off>', 'Critical alerts / 緊急警報')
|
|
58
|
+
.option('--daily <on|off>', 'Daily summary / 每日摘要')
|
|
59
|
+
.option('--weekly <on|off>', 'Weekly summary / 每週摘要')
|
|
60
|
+
.option('--peaceful <on|off>', 'Peaceful report / 平安報告')
|
|
61
|
+
.action(withAuth('solo', async (opts) => {
|
|
62
|
+
const args = ['prefs'];
|
|
63
|
+
if (opts['critical'])
|
|
64
|
+
args.push('--critical', opts['critical']);
|
|
65
|
+
if (opts['daily'])
|
|
66
|
+
args.push('--daily', opts['daily']);
|
|
67
|
+
if (opts['weekly'])
|
|
68
|
+
args.push('--weekly', opts['weekly']);
|
|
69
|
+
if (opts['peaceful'])
|
|
70
|
+
args.push('--peaceful', opts['peaceful']);
|
|
71
|
+
await runCLI(args);
|
|
72
|
+
}));
|
|
73
|
+
return cmd;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* panguard config - Manage local configuration
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* panguard config llm --provider claude --api-key sk-xxx
|
|
6
|
+
* panguard config llm --provider ollama --endpoint http://localhost:11434
|
|
7
|
+
* panguard config llm --show
|
|
8
|
+
* panguard config llm --clear
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
export declare function configCommand(): Command;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,aAAa,IAAI,OAAO,CA+GvC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* panguard config - Manage local configuration
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* panguard config llm --provider claude --api-key sk-xxx
|
|
6
|
+
* panguard config llm --provider ollama --endpoint http://localhost:11434
|
|
7
|
+
* panguard config llm --show
|
|
8
|
+
* panguard config llm --clear
|
|
9
|
+
*/
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import { c, banner } from '@panguard-ai/core';
|
|
12
|
+
import { saveLlmConfig, loadLlmConfig, deleteLlmConfig } from '../credentials.js';
|
|
13
|
+
export function configCommand() {
|
|
14
|
+
const cmd = new Command('config').description('Manage local configuration / 管理本地設定');
|
|
15
|
+
cmd
|
|
16
|
+
.command('llm')
|
|
17
|
+
.description('Configure LLM provider for AI analysis / 設定 AI 分析的 LLM 提供者')
|
|
18
|
+
.option('--provider <provider>', 'LLM provider: claude, openai, ollama')
|
|
19
|
+
.option('--api-key <key>', 'API key (for claude/openai)')
|
|
20
|
+
.option('--model <model>', 'Model override (e.g., claude-haiku-4-5-20251001, gpt-4o)')
|
|
21
|
+
.option('--endpoint <url>', 'Endpoint URL (for ollama, default: http://localhost:11434)')
|
|
22
|
+
.option('--show', 'Show current LLM configuration')
|
|
23
|
+
.option('--clear', 'Remove stored LLM configuration')
|
|
24
|
+
.action((options) => {
|
|
25
|
+
console.log(banner());
|
|
26
|
+
if (options.show) {
|
|
27
|
+
const config = loadLlmConfig();
|
|
28
|
+
if (!config) {
|
|
29
|
+
console.log(` ${c.dim('No LLM configuration found.')}`);
|
|
30
|
+
console.log(` ${c.dim('Set one with:')} panguard config llm --provider claude --api-key sk-...`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
console.log(` ${c.sage('LLM Configuration')}`);
|
|
34
|
+
console.log(` Provider: ${c.bold(config.provider)}`);
|
|
35
|
+
console.log(` API Key: ${config.apiKey ? c.safe(config.apiKey.slice(0, 8) + '...' + config.apiKey.slice(-4)) : c.dim('none')}`);
|
|
36
|
+
console.log(` Model: ${config.model ? c.bold(config.model) : c.dim('default')}`);
|
|
37
|
+
console.log(` Endpoint: ${config.endpoint ? c.bold(config.endpoint) : c.dim('default')}`);
|
|
38
|
+
console.log(` Saved: ${c.dim(config.savedAt)}`);
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log(` ${c.dim('Stored encrypted at ~/.panguard/llm.enc')}`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (options.clear) {
|
|
44
|
+
const removed = deleteLlmConfig();
|
|
45
|
+
if (removed) {
|
|
46
|
+
console.log(` ${c.safe('LLM configuration removed.')}`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log(` ${c.dim('No LLM configuration to remove.')}`);
|
|
50
|
+
}
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (!options.provider) {
|
|
54
|
+
console.log(` ${c.caution('--provider is required.')}`);
|
|
55
|
+
console.log('');
|
|
56
|
+
console.log(' Examples:');
|
|
57
|
+
console.log(` ${c.dim('$')} panguard config llm --provider claude --api-key sk-ant-xxx`);
|
|
58
|
+
console.log(` ${c.dim('$')} panguard config llm --provider openai --api-key sk-xxx`);
|
|
59
|
+
console.log(` ${c.dim('$')} panguard config llm --provider ollama`);
|
|
60
|
+
console.log(` ${c.dim('$')} panguard config llm --show`);
|
|
61
|
+
console.log(` ${c.dim('$')} panguard config llm --clear`);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const validProviders = ['claude', 'openai', 'ollama'];
|
|
65
|
+
if (!validProviders.includes(options.provider)) {
|
|
66
|
+
console.log(` ${c.caution(`Invalid provider: ${options.provider}. Must be one of: ${validProviders.join(', ')}`)}`);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (options.provider !== 'ollama' && !options.apiKey) {
|
|
70
|
+
console.log(` ${c.caution(`--api-key is required for provider '${options.provider}'.`)}`);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
saveLlmConfig({
|
|
74
|
+
provider: options.provider,
|
|
75
|
+
apiKey: options.apiKey,
|
|
76
|
+
model: options.model,
|
|
77
|
+
endpoint: options.endpoint,
|
|
78
|
+
savedAt: new Date().toISOString(),
|
|
79
|
+
});
|
|
80
|
+
console.log(` ${c.safe('LLM configuration saved.')}`);
|
|
81
|
+
console.log(` Provider: ${c.bold(options.provider)}`);
|
|
82
|
+
if (options.apiKey) {
|
|
83
|
+
console.log(` API Key: ${c.safe(options.apiKey.slice(0, 8) + '...' + options.apiKey.slice(-4))}`);
|
|
84
|
+
}
|
|
85
|
+
if (options.model) {
|
|
86
|
+
console.log(` Model: ${c.bold(options.model)}`);
|
|
87
|
+
}
|
|
88
|
+
console.log('');
|
|
89
|
+
console.log(` ${c.dim('Encrypted and stored at ~/.panguard/llm.enc')}`);
|
|
90
|
+
console.log(` ${c.dim('The Guard engine will use this configuration automatically.')}`);
|
|
91
|
+
});
|
|
92
|
+
return cmd;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/demo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,WAAW,IAAI,OAAO,CA6LrC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* panguard demo - Automated demo sequence
|
|
3
|
+
* panguard demo - 自動化展示序列
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { c, banner, spinner, statusPanel, divider, scoreDisplay, symbols, formatDuration, } from '@panguard-ai/core';
|
|
7
|
+
import { runScan } from '@panguard-ai/panguard-scan';
|
|
8
|
+
import { generateComplianceReport, generateSummaryText } from '@panguard-ai/panguard-report';
|
|
9
|
+
export function demoCommand() {
|
|
10
|
+
return new Command('demo')
|
|
11
|
+
.description('Run an automated demo sequence / 執行自動化展示')
|
|
12
|
+
.option('--lang <language>', 'Language: en or zh-TW / 語言', 'en')
|
|
13
|
+
.action(async (_opts) => {
|
|
14
|
+
console.log(banner());
|
|
15
|
+
console.log(` ${symbols.info} ${c.bold('Panguard AI - Automated Demo')}`);
|
|
16
|
+
console.log(` ${c.dim('Running through all security modules...')}`);
|
|
17
|
+
console.log('');
|
|
18
|
+
const moduleStatus = {
|
|
19
|
+
'Security Scan': 'critical',
|
|
20
|
+
'Compliance Report': 'critical',
|
|
21
|
+
'Guard Engine': 'critical',
|
|
22
|
+
'Honeypot System': 'critical',
|
|
23
|
+
'Notification System': 'critical',
|
|
24
|
+
};
|
|
25
|
+
// ---------------------------------------------------------------
|
|
26
|
+
// 1. Security Scan
|
|
27
|
+
// ---------------------------------------------------------------
|
|
28
|
+
console.log(divider('1. Security Scan'));
|
|
29
|
+
console.log('');
|
|
30
|
+
const scanSp = spinner('Running quick security scan...');
|
|
31
|
+
try {
|
|
32
|
+
const result = await runScan({ depth: 'quick', lang: 'en', verbose: false });
|
|
33
|
+
scanSp.succeed(`Scan complete ${c.dim(`(${formatDuration(result.scanDuration)})`)}`);
|
|
34
|
+
const safetyScore = Math.max(0, 100 - result.riskScore);
|
|
35
|
+
const grade = safetyScore >= 90
|
|
36
|
+
? 'A'
|
|
37
|
+
: safetyScore >= 75
|
|
38
|
+
? 'B'
|
|
39
|
+
: safetyScore >= 60
|
|
40
|
+
? 'C'
|
|
41
|
+
: safetyScore >= 40
|
|
42
|
+
? 'D'
|
|
43
|
+
: 'F';
|
|
44
|
+
console.log(scoreDisplay(safetyScore, grade));
|
|
45
|
+
console.log(statusPanel('Scan Results', [
|
|
46
|
+
{
|
|
47
|
+
label: 'Risk Score',
|
|
48
|
+
value: `${result.riskScore}/100`,
|
|
49
|
+
status: result.riskScore <= 25 ? 'safe' : result.riskScore <= 50 ? 'caution' : 'critical',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
label: 'Findings',
|
|
53
|
+
value: String(result.findings.length),
|
|
54
|
+
status: result.findings.length === 0 ? 'safe' : 'caution',
|
|
55
|
+
},
|
|
56
|
+
]));
|
|
57
|
+
moduleStatus['Security Scan'] = 'safe';
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
scanSp.fail(`Scan failed: ${err instanceof Error ? err.message : err}`);
|
|
61
|
+
}
|
|
62
|
+
// ---------------------------------------------------------------
|
|
63
|
+
// 2. Compliance Report
|
|
64
|
+
// ---------------------------------------------------------------
|
|
65
|
+
console.log(divider('2. Compliance Report (ISO 27001)'));
|
|
66
|
+
console.log('');
|
|
67
|
+
const reportSp = spinner('Generating ISO 27001 compliance report...');
|
|
68
|
+
try {
|
|
69
|
+
const findings = [
|
|
70
|
+
{
|
|
71
|
+
findingId: 'DEMO-001',
|
|
72
|
+
severity: 'high',
|
|
73
|
+
title: 'Missing information security policy',
|
|
74
|
+
description: 'No formal information security policy document found.',
|
|
75
|
+
category: 'policy',
|
|
76
|
+
timestamp: new Date(),
|
|
77
|
+
source: 'panguard-scan',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
findingId: 'DEMO-002',
|
|
81
|
+
severity: 'medium',
|
|
82
|
+
title: 'Unencrypted data at rest',
|
|
83
|
+
description: 'Database storage does not use encryption at rest.',
|
|
84
|
+
category: 'encryption',
|
|
85
|
+
timestamp: new Date(),
|
|
86
|
+
source: 'panguard-scan',
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
const report = generateComplianceReport(findings, 'iso27001', 'en', {
|
|
90
|
+
includeRecommendations: true,
|
|
91
|
+
});
|
|
92
|
+
const summary = generateSummaryText(report);
|
|
93
|
+
reportSp.succeed('ISO 27001 report generated');
|
|
94
|
+
// Show first portion of summary
|
|
95
|
+
const summaryLines = summary.split('\n').slice(0, 15);
|
|
96
|
+
console.log('');
|
|
97
|
+
for (const line of summaryLines) {
|
|
98
|
+
console.log(` ${c.dim(line)}`);
|
|
99
|
+
}
|
|
100
|
+
console.log(` ${c.dim('...')}`);
|
|
101
|
+
console.log('');
|
|
102
|
+
moduleStatus['Compliance Report'] = 'safe';
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
reportSp.fail(`Report failed: ${err instanceof Error ? err.message : err}`);
|
|
106
|
+
}
|
|
107
|
+
// ---------------------------------------------------------------
|
|
108
|
+
// 3. Guard Engine Status
|
|
109
|
+
// ---------------------------------------------------------------
|
|
110
|
+
console.log(divider('3. Guard Engine'));
|
|
111
|
+
console.log('');
|
|
112
|
+
try {
|
|
113
|
+
const { runCLI: guardCLI } = await import('@panguard-ai/panguard-guard');
|
|
114
|
+
await guardCLI(['status']);
|
|
115
|
+
moduleStatus['Guard Engine'] = 'safe';
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
console.log(` ${symbols.info} Guard engine: ${c.dim('not running (normal for demo)')}`);
|
|
119
|
+
moduleStatus['Guard Engine'] = 'caution';
|
|
120
|
+
}
|
|
121
|
+
console.log('');
|
|
122
|
+
// ---------------------------------------------------------------
|
|
123
|
+
// 4. Honeypot Configuration
|
|
124
|
+
// ---------------------------------------------------------------
|
|
125
|
+
console.log(divider('4. Honeypot System'));
|
|
126
|
+
console.log('');
|
|
127
|
+
try {
|
|
128
|
+
const { executeCli: trapCLI } = await import('@panguard-ai/panguard-trap');
|
|
129
|
+
await trapCLI(['config', '--services', 'ssh,http']);
|
|
130
|
+
moduleStatus['Honeypot System'] = 'safe';
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
console.log(` ${symbols.fail} Trap config failed: ${err instanceof Error ? err.message : err}`);
|
|
134
|
+
}
|
|
135
|
+
console.log('');
|
|
136
|
+
// ---------------------------------------------------------------
|
|
137
|
+
// 5. Notification System
|
|
138
|
+
// ---------------------------------------------------------------
|
|
139
|
+
console.log(divider('5. Notification System'));
|
|
140
|
+
console.log('');
|
|
141
|
+
try {
|
|
142
|
+
const { runCLI: chatCLI } = await import('@panguard-ai/panguard-chat');
|
|
143
|
+
await chatCLI(['status']);
|
|
144
|
+
moduleStatus['Notification System'] = 'safe';
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
console.log(` ${symbols.fail} Chat status failed: ${err instanceof Error ? err.message : err}`);
|
|
148
|
+
}
|
|
149
|
+
console.log('');
|
|
150
|
+
// ---------------------------------------------------------------
|
|
151
|
+
// Summary
|
|
152
|
+
// ---------------------------------------------------------------
|
|
153
|
+
console.log(divider('Demo Complete'));
|
|
154
|
+
console.log('');
|
|
155
|
+
const statusLabel = (s) => s === 'safe' ? c.safe('PASS') : s === 'caution' ? c.caution('WARN') : c.critical('FAIL');
|
|
156
|
+
const passed = Object.values(moduleStatus).filter((s) => s === 'safe').length;
|
|
157
|
+
const total = Object.keys(moduleStatus).length;
|
|
158
|
+
console.log(statusPanel(`PANGUARD AI - Demo Summary (${passed}/${total} passed)`, Object.entries(moduleStatus).map(([label, status]) => ({
|
|
159
|
+
label,
|
|
160
|
+
value: statusLabel(status),
|
|
161
|
+
status,
|
|
162
|
+
}))));
|
|
163
|
+
console.log(` ${c.dim('Next steps:')}`);
|
|
164
|
+
console.log(` ${c.sage('panguard')} ${c.dim('Interactive mode')}`);
|
|
165
|
+
console.log(` ${c.sage('panguard scan')} ${c.dim('Full security scan')}`);
|
|
166
|
+
console.log(` ${c.sage('panguard guard start')} ${c.dim('Start real-time monitoring')}`);
|
|
167
|
+
console.log('');
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../../../src/cli/commands/demo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `panguard deploy` - Deploy configured services
|
|
3
|
+
* `panguard deploy` - 部署已配置的服務
|
|
4
|
+
*
|
|
5
|
+
* @module @panguard-ai/panguard/cli/commands/deploy
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
export declare function deployCommand(): Command;
|
|
9
|
+
//# sourceMappingURL=deploy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,aAAa,IAAI,OAAO,CAWvC"}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `panguard deploy` - Deploy configured services
|
|
3
|
+
* `panguard deploy` - 部署已配置的服務
|
|
4
|
+
*
|
|
5
|
+
* @module @panguard-ai/panguard/cli/commands/deploy
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { homedir } from 'node:os';
|
|
10
|
+
import { c, symbols, spinner, box, statusPanel, divider } from '@panguard-ai/core';
|
|
11
|
+
import { readConfig } from '../../init/config-writer.js';
|
|
12
|
+
import { withAuth } from '../auth-guard.js';
|
|
13
|
+
export function deployCommand() {
|
|
14
|
+
return new Command('deploy')
|
|
15
|
+
.description('Deploy configured services / \u90E8\u7F72\u5DF2\u914D\u7F6E\u7684\u670D\u52D9')
|
|
16
|
+
.option('--config <path>', 'Config path', join(homedir(), '.panguard', 'config.json'))
|
|
17
|
+
.option('--dry-run', 'Show deployment plan without executing')
|
|
18
|
+
.option('--lang <language>', 'Language override')
|
|
19
|
+
.action(withAuth('solo', async (opts) => {
|
|
20
|
+
await runDeploy(opts);
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
async function runDeploy(opts) {
|
|
24
|
+
// ── Load config ─────────────────────────────────────────
|
|
25
|
+
const config = readConfig();
|
|
26
|
+
const lang = opts.lang ?? config?.meta?.language ?? 'zh-TW';
|
|
27
|
+
if (!config) {
|
|
28
|
+
console.log('');
|
|
29
|
+
console.log(` ${symbols.fail} ${lang === 'zh-TW'
|
|
30
|
+
? '\u627E\u4E0D\u5230\u914D\u7F6E\u6A94\u3002\u8ACB\u5148\u57F7\u884C: panguard init'
|
|
31
|
+
: 'No config found. Run: panguard init'}`);
|
|
32
|
+
console.log('');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// ── Show deployment plan ────────────────────────────────
|
|
36
|
+
console.log('');
|
|
37
|
+
console.log(divider(lang === 'zh-TW' ? '\u90E8\u7F72\u8A08\u756B' : 'Deployment Plan'));
|
|
38
|
+
console.log('');
|
|
39
|
+
const planItems = [];
|
|
40
|
+
if (config.modules.guard) {
|
|
41
|
+
planItems.push({
|
|
42
|
+
label: lang === 'zh-TW' ? '\u5B88\u8B77\u5F15\u64CE' : 'Guard Engine',
|
|
43
|
+
value: `${config.guard.mode} mode (${config.security.protectionLevel})`,
|
|
44
|
+
status: 'safe',
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
if (config.modules.scan) {
|
|
48
|
+
planItems.push({
|
|
49
|
+
label: lang === 'zh-TW' ? '\u5B89\u5168\u6383\u63CF' : 'Security Scan',
|
|
50
|
+
value: lang === 'zh-TW' ? '\u5DF2\u555F\u7528' : 'Enabled',
|
|
51
|
+
status: 'safe',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (config.modules.trap && config.trap.enabled) {
|
|
55
|
+
planItems.push({
|
|
56
|
+
label: lang === 'zh-TW' ? '\u871C\u7F50\u670D\u52D9' : 'Honeypot',
|
|
57
|
+
value: config.trap.services.join(', ').toUpperCase(),
|
|
58
|
+
status: 'caution',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (config.notifications.channel !== 'none') {
|
|
62
|
+
planItems.push({
|
|
63
|
+
label: lang === 'zh-TW' ? '\u901A\u77E5\u7BA1\u9053' : 'Notifications',
|
|
64
|
+
value: config.notifications.channel.toUpperCase(),
|
|
65
|
+
status: 'safe',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
planItems.push({
|
|
69
|
+
label: 'AI',
|
|
70
|
+
value: config.ai.preference === 'cloud_ai'
|
|
71
|
+
? 'Cloud AI'
|
|
72
|
+
: config.ai.preference === 'local_ai'
|
|
73
|
+
? 'Local AI (Ollama)'
|
|
74
|
+
: lang === 'zh-TW'
|
|
75
|
+
? '\u50C5\u898F\u5247'
|
|
76
|
+
: 'Rules Only',
|
|
77
|
+
});
|
|
78
|
+
console.log(statusPanel(lang === 'zh-TW' ? 'Panguard AI \u90E8\u7F72\u8A08\u756B' : 'Panguard AI Deployment Plan', planItems));
|
|
79
|
+
// ── Dry run: stop here ─────────────────────────────────
|
|
80
|
+
if (opts.dryRun) {
|
|
81
|
+
console.log(` ${symbols.info} ${lang === 'zh-TW' ? 'Dry run \u6A21\u5F0F\uFF0C\u672A\u5BE6\u969B\u57F7\u884C\u3002' : 'Dry run mode, nothing executed.'}`);
|
|
82
|
+
console.log('');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// ── Execute deployment ──────────────────────────────────
|
|
86
|
+
console.log(divider(lang === 'zh-TW' ? '\u57F7\u884C\u90E8\u7F72' : 'Deploying'));
|
|
87
|
+
console.log('');
|
|
88
|
+
let step = 1;
|
|
89
|
+
const totalSteps = countDeploySteps(config);
|
|
90
|
+
// Step: Initialize data directory
|
|
91
|
+
const dirSp = spinner(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? '\u521D\u59CB\u5316\u8CC7\u6599\u76EE\u9304...' : 'Initializing data directory...'}`);
|
|
92
|
+
try {
|
|
93
|
+
const { mkdirSync } = await import('node:fs');
|
|
94
|
+
mkdirSync(join(homedir(), '.panguard-guard'), { recursive: true });
|
|
95
|
+
mkdirSync(join(homedir(), '.panguard', 'logs'), { recursive: true });
|
|
96
|
+
dirSp.succeed(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? '\u8CC7\u6599\u76EE\u9304\u5DF2\u521D\u59CB\u5316' : 'Data directory initialized'}`);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
dirSp.warn(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? '\u8CC7\u6599\u76EE\u9304\u521D\u59CB\u5316\u5931\u6557' : 'Directory init failed'}`);
|
|
100
|
+
}
|
|
101
|
+
step++;
|
|
102
|
+
// Step: Guard engine config
|
|
103
|
+
if (config.modules.guard) {
|
|
104
|
+
const guardSp = spinner(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? '\u5BEB\u5165\u5B88\u8B77\u5F15\u64CE\u914D\u7F6E...' : 'Writing guard engine config...'}`);
|
|
105
|
+
try {
|
|
106
|
+
const guardConfigPath = join(homedir(), '.panguard-guard', 'config.json');
|
|
107
|
+
const { writeFileSync } = await import('node:fs');
|
|
108
|
+
writeFileSync(guardConfigPath, JSON.stringify({
|
|
109
|
+
mode: config.guard.mode,
|
|
110
|
+
learningDays: config.guard.learningDays,
|
|
111
|
+
actionThresholds: config.guard.actionPolicy,
|
|
112
|
+
monitors: config.guard.monitors,
|
|
113
|
+
}, null, 2));
|
|
114
|
+
guardSp.succeed(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? '\u5B88\u8B77\u5F15\u64CE\u914D\u7F6E\u5DF2\u5BEB\u5165' : 'Guard engine configured'}`);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
guardSp.warn(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? '\u5B88\u8B77\u914D\u7F6E\u5BEB\u5165\u5931\u6557' : 'Guard config failed'}`);
|
|
118
|
+
}
|
|
119
|
+
step++;
|
|
120
|
+
}
|
|
121
|
+
// Step: Test notification
|
|
122
|
+
if (config.notifications.channel !== 'none') {
|
|
123
|
+
const notifSp = spinner(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? '\u6E2C\u8A66\u901A\u77E5\u7BA1\u9053...' : 'Testing notification channel...'}`);
|
|
124
|
+
try {
|
|
125
|
+
const { ChatAgent, WebhookChannel, TelegramChannel, SlackChannel, EmailChannel } = await import('@panguard-ai/panguard-chat');
|
|
126
|
+
const ch = config.notifications.channel;
|
|
127
|
+
const cfg = config.notifications.config;
|
|
128
|
+
const agent = new ChatAgent({
|
|
129
|
+
userProfile: {
|
|
130
|
+
type: 'it_admin',
|
|
131
|
+
language: lang === 'zh-TW' ? 'zh-TW' : 'en',
|
|
132
|
+
notificationChannel: ch,
|
|
133
|
+
preferences: {
|
|
134
|
+
criticalAlerts: true,
|
|
135
|
+
dailySummary: true,
|
|
136
|
+
weeklySummary: true,
|
|
137
|
+
peacefulReport: true,
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
channels: {},
|
|
141
|
+
maxFollowUpTokens: 2000,
|
|
142
|
+
});
|
|
143
|
+
if (ch === 'webhook' && cfg['url']) {
|
|
144
|
+
agent.registerChannel(new WebhookChannel({
|
|
145
|
+
endpoint: cfg['url'],
|
|
146
|
+
secret: cfg['secret'] ?? '',
|
|
147
|
+
authMethod: 'bearer_token',
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
else if (ch === 'telegram' && cfg['botToken'] && cfg['chatId']) {
|
|
151
|
+
agent.registerChannel(new TelegramChannel({ botToken: cfg['botToken'], chatId: cfg['chatId'] }));
|
|
152
|
+
}
|
|
153
|
+
else if (ch === 'slack' && cfg['botToken']) {
|
|
154
|
+
agent.registerChannel(new SlackChannel({
|
|
155
|
+
botToken: cfg['botToken'],
|
|
156
|
+
signingSecret: cfg['signingSecret'] ?? '',
|
|
157
|
+
defaultChannel: cfg['channel'] ?? '#security',
|
|
158
|
+
}));
|
|
159
|
+
}
|
|
160
|
+
else if (ch === 'email' && cfg['host']) {
|
|
161
|
+
agent.registerChannel(new EmailChannel({
|
|
162
|
+
host: cfg['host'],
|
|
163
|
+
port: Number(cfg['port'] ?? 587),
|
|
164
|
+
secure: cfg['secure'] === 'true',
|
|
165
|
+
auth: { user: cfg['user'] ?? '', pass: cfg['pass'] ?? '' },
|
|
166
|
+
from: cfg['from'] ?? '',
|
|
167
|
+
to: [cfg['to'] ?? ''],
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
const result = await agent.sendAlert('deploy-test', {
|
|
171
|
+
severity: 'low',
|
|
172
|
+
conclusion: 'benign',
|
|
173
|
+
confidence: 1.0,
|
|
174
|
+
humanSummary: lang === 'zh-TW'
|
|
175
|
+
? 'Panguard AI 部署測試通知'
|
|
176
|
+
: 'Panguard AI deployment test notification',
|
|
177
|
+
reasoning: 'Deploy command notification channel verification',
|
|
178
|
+
recommendedAction: lang === 'zh-TW' ? '無需動作 - 這是部署測試' : 'No action required - deployment test',
|
|
179
|
+
eventDescription: 'Deployment notification test',
|
|
180
|
+
actionsTaken: [],
|
|
181
|
+
timestamp: new Date().toISOString(),
|
|
182
|
+
});
|
|
183
|
+
if (result.success) {
|
|
184
|
+
notifSp.succeed(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? '\u901A\u77E5\u7BA1\u9053\u6E2C\u8A66\u6210\u529F' : 'Notification channel test passed'}`);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
notifSp.warn(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? `\u901A\u77E5\u6E2C\u8A66\u5931\u6557: ${result.error}` : `Notification test failed: ${result.error}`}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
192
|
+
notifSp.warn(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? `\u901A\u77E5\u6E2C\u8A66\u5931\u6557: ${msg}` : `Notification test failed: ${msg}`}`);
|
|
193
|
+
}
|
|
194
|
+
step++;
|
|
195
|
+
}
|
|
196
|
+
// Step: Initial scan
|
|
197
|
+
if (config.modules.scan) {
|
|
198
|
+
const scanSp = spinner(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? '\u57F7\u884C\u521D\u59CB\u6383\u63CF...' : 'Running initial scan...'}`);
|
|
199
|
+
try {
|
|
200
|
+
const { runScan } = await import('@panguard-ai/panguard-scan');
|
|
201
|
+
const result = await runScan({ depth: 'quick', lang });
|
|
202
|
+
scanSp.succeed(`[${step}/${totalSteps}] ${lang === 'zh-TW'
|
|
203
|
+
? `\u6383\u63CF\u5B8C\u6210\uFF01\u98A8\u96AA: ${result.riskScore}/100`
|
|
204
|
+
: `Scan complete! Risk: ${result.riskScore}/100`}`);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
scanSp.warn(`[${step}/${totalSteps}] ${lang === 'zh-TW' ? '\u6383\u63CF\u5931\u6557\uFF08\u7A0D\u5F8C\u7528 panguard scan\uFF09' : 'Scan failed (run panguard scan later)'}`);
|
|
208
|
+
}
|
|
209
|
+
step++;
|
|
210
|
+
}
|
|
211
|
+
// ── Completion summary ──────────────────────────────────
|
|
212
|
+
console.log('');
|
|
213
|
+
console.log(box(lang === 'zh-TW'
|
|
214
|
+
? [
|
|
215
|
+
`${symbols.pass} \u90E8\u7F72\u5B8C\u6210\uFF01`,
|
|
216
|
+
'',
|
|
217
|
+
`\u63A5\u4E0B\u4F86\uFF1A`,
|
|
218
|
+
` ${c.sage('panguard guard start')} \u555F\u52D5\u5373\u6642\u9632\u8B77`,
|
|
219
|
+
` ${c.sage('panguard status')} \u67E5\u770B\u7CFB\u7D71\u72C0\u614B`,
|
|
220
|
+
` ${c.sage('panguard scan --full')} \u57F7\u884C\u5B8C\u6574\u6383\u63CF`,
|
|
221
|
+
].join('\n')
|
|
222
|
+
: [
|
|
223
|
+
`${symbols.pass} Deployment complete!`,
|
|
224
|
+
'',
|
|
225
|
+
`Next:`,
|
|
226
|
+
` ${c.sage('panguard guard start')} Start real-time protection`,
|
|
227
|
+
` ${c.sage('panguard status')} Check system status`,
|
|
228
|
+
` ${c.sage('panguard scan --full')} Run a full scan`,
|
|
229
|
+
].join('\n'), { borderColor: c.safe }));
|
|
230
|
+
console.log('');
|
|
231
|
+
}
|
|
232
|
+
function countDeploySteps(config) {
|
|
233
|
+
let count = 1; // always: init data dir
|
|
234
|
+
if (config.modules.guard)
|
|
235
|
+
count++;
|
|
236
|
+
if (config.notifications.channel !== 'none')
|
|
237
|
+
count++;
|
|
238
|
+
if (config.modules.scan)
|
|
239
|
+
count++;
|
|
240
|
+
return count;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=deploy.js.map
|