@panguard-ai/panguard-scan 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/commands.d.ts +13 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +132 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +138 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/report/compliance-map.d.ts +91 -0
- package/dist/report/compliance-map.d.ts.map +1 -0
- package/dist/report/compliance-map.js +156 -0
- package/dist/report/compliance-map.js.map +1 -0
- package/dist/report/index.d.ts +14 -0
- package/dist/report/index.d.ts.map +1 -0
- package/dist/report/index.js +13 -0
- package/dist/report/index.js.map +1 -0
- package/dist/report/pdf-generator.d.ts +41 -0
- package/dist/report/pdf-generator.d.ts.map +1 -0
- package/dist/report/pdf-generator.js +238 -0
- package/dist/report/pdf-generator.js.map +1 -0
- package/dist/report/sections/compliance.d.ts +28 -0
- package/dist/report/sections/compliance.d.ts.map +1 -0
- package/dist/report/sections/compliance.js +227 -0
- package/dist/report/sections/compliance.js.map +1 -0
- package/dist/report/sections/cover.d.ts +22 -0
- package/dist/report/sections/cover.d.ts.map +1 -0
- package/dist/report/sections/cover.js +190 -0
- package/dist/report/sections/cover.js.map +1 -0
- package/dist/report/sections/executive-summary.d.ts +22 -0
- package/dist/report/sections/executive-summary.d.ts.map +1 -0
- package/dist/report/sections/executive-summary.js +206 -0
- package/dist/report/sections/executive-summary.js.map +1 -0
- package/dist/report/sections/findings-table.d.ts +28 -0
- package/dist/report/sections/findings-table.d.ts.map +1 -0
- package/dist/report/sections/findings-table.js +189 -0
- package/dist/report/sections/findings-table.js.map +1 -0
- package/dist/report/sections/remediation.d.ts +28 -0
- package/dist/report/sections/remediation.d.ts.map +1 -0
- package/dist/report/sections/remediation.js +157 -0
- package/dist/report/sections/remediation.js.map +1 -0
- package/dist/report/styles.d.ts +65 -0
- package/dist/report/styles.d.ts.map +1 -0
- package/dist/report/styles.js +80 -0
- package/dist/report/styles.js.map +1 -0
- package/dist/scanners/cve-checker.d.ts +21 -0
- package/dist/scanners/cve-checker.d.ts.map +1 -0
- package/dist/scanners/cve-checker.js +198 -0
- package/dist/scanners/cve-checker.js.map +1 -0
- package/dist/scanners/discovery-scanner.d.ts +24 -0
- package/dist/scanners/discovery-scanner.d.ts.map +1 -0
- package/dist/scanners/discovery-scanner.js +208 -0
- package/dist/scanners/discovery-scanner.js.map +1 -0
- package/dist/scanners/index.d.ts +54 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +328 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/open-ports.d.ts +25 -0
- package/dist/scanners/open-ports.d.ts.map +1 -0
- package/dist/scanners/open-ports.js +198 -0
- package/dist/scanners/open-ports.js.map +1 -0
- package/dist/scanners/password-policy.d.ts +23 -0
- package/dist/scanners/password-policy.d.ts.map +1 -0
- package/dist/scanners/password-policy.js +324 -0
- package/dist/scanners/password-policy.js.map +1 -0
- package/dist/scanners/remote/dns-checker.d.ts +21 -0
- package/dist/scanners/remote/dns-checker.d.ts.map +1 -0
- package/dist/scanners/remote/dns-checker.js +103 -0
- package/dist/scanners/remote/dns-checker.js.map +1 -0
- package/dist/scanners/remote/http-headers.d.ts +19 -0
- package/dist/scanners/remote/http-headers.d.ts.map +1 -0
- package/dist/scanners/remote/http-headers.js +65 -0
- package/dist/scanners/remote/http-headers.js.map +1 -0
- package/dist/scanners/remote/index.d.ts +22 -0
- package/dist/scanners/remote/index.d.ts.map +1 -0
- package/dist/scanners/remote/index.js +120 -0
- package/dist/scanners/remote/index.js.map +1 -0
- package/dist/scanners/remote/port-scanner.d.ts +20 -0
- package/dist/scanners/remote/port-scanner.d.ts.map +1 -0
- package/dist/scanners/remote/port-scanner.js +65 -0
- package/dist/scanners/remote/port-scanner.js.map +1 -0
- package/dist/scanners/remote/ssl-checker.d.ts +24 -0
- package/dist/scanners/remote/ssl-checker.d.ts.map +1 -0
- package/dist/scanners/remote/ssl-checker.js +109 -0
- package/dist/scanners/remote/ssl-checker.js.map +1 -0
- package/dist/scanners/scheduled-tasks.d.ts +26 -0
- package/dist/scanners/scheduled-tasks.d.ts.map +1 -0
- package/dist/scanners/scheduled-tasks.js +299 -0
- package/dist/scanners/scheduled-tasks.js.map +1 -0
- package/dist/scanners/shared-folders.d.ts +25 -0
- package/dist/scanners/shared-folders.d.ts.map +1 -0
- package/dist/scanners/shared-folders.js +310 -0
- package/dist/scanners/shared-folders.js.map +1 -0
- package/dist/scanners/ssl-checker.d.ts +27 -0
- package/dist/scanners/ssl-checker.d.ts.map +1 -0
- package/dist/scanners/ssl-checker.js +197 -0
- package/dist/scanners/ssl-checker.js.map +1 -0
- package/dist/scanners/types.d.ts +140 -0
- package/dist/scanners/types.d.ts.map +1 -0
- package/dist/scanners/types.js +31 -0
- package/dist/scanners/types.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PanguardScan CLI command implementations
|
|
3
|
+
* PanguardScan CLI 指令實作
|
|
4
|
+
*
|
|
5
|
+
* @module @panguard-ai/panguard-scan/cli/commands
|
|
6
|
+
*/
|
|
7
|
+
import type { ScanConfig } from '../scanners/types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Execute a security scan and generate a report
|
|
10
|
+
* 執行安全掃描並產生報告
|
|
11
|
+
*/
|
|
12
|
+
export declare function executeScan(config: ScanConfig): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIvD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+InE"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PanguardScan CLI command implementations
|
|
3
|
+
* PanguardScan CLI 指令實作
|
|
4
|
+
*
|
|
5
|
+
* @module @panguard-ai/panguard-scan/cli/commands
|
|
6
|
+
*/
|
|
7
|
+
import { initI18n, t, createLogger, setLogLevel, c, colorSeverity, banner, spinner, table, box, scoreDisplay, divider, formatDuration, symbols, statusPanel, } from '@panguard-ai/core';
|
|
8
|
+
import { runScan } from '../scanners/index.js';
|
|
9
|
+
import { generatePdfReport } from '../report/index.js';
|
|
10
|
+
const logger = createLogger('panguard-scan:cli');
|
|
11
|
+
/**
|
|
12
|
+
* Execute a security scan and generate a report
|
|
13
|
+
* 執行安全掃描並產生報告
|
|
14
|
+
*/
|
|
15
|
+
export async function executeScan(config) {
|
|
16
|
+
// Suppress structured JSON logs unless verbose mode
|
|
17
|
+
if (!config.verbose) {
|
|
18
|
+
setLogLevel('silent');
|
|
19
|
+
}
|
|
20
|
+
await initI18n(config.lang);
|
|
21
|
+
// Banner
|
|
22
|
+
console.log(banner());
|
|
23
|
+
const mode = config.depth === 'quick' ? t('panguard-scan:cli.quickMode') : t('panguard-scan:cli.fullMode');
|
|
24
|
+
console.log(` ${symbols.scan} ${mode}`);
|
|
25
|
+
console.log('');
|
|
26
|
+
// Scan with spinner
|
|
27
|
+
const sp = spinner(t('panguard-scan:cli.scanning', { defaultValue: 'Scanning system security...' }));
|
|
28
|
+
const result = await runScan(config);
|
|
29
|
+
sp.succeed(t('panguard-scan:cli.complete') + ` ${c.dim(`(${formatDuration(result.scanDuration)})`)}`);
|
|
30
|
+
// Security Score
|
|
31
|
+
const safetyScore = Math.max(0, 100 - result.riskScore);
|
|
32
|
+
const grade = safetyScore >= 90
|
|
33
|
+
? 'A'
|
|
34
|
+
: safetyScore >= 75
|
|
35
|
+
? 'B'
|
|
36
|
+
: safetyScore >= 60
|
|
37
|
+
? 'C'
|
|
38
|
+
: safetyScore >= 40
|
|
39
|
+
? 'D'
|
|
40
|
+
: 'F';
|
|
41
|
+
console.log(scoreDisplay(safetyScore, grade));
|
|
42
|
+
// Status panel (matching mockup "PANGUARD AI Security Status")
|
|
43
|
+
const riskLabel = t(`panguard-scan:severity.${result.riskLevel}`);
|
|
44
|
+
console.log(statusPanel('PANGUARD AI Security Status', [
|
|
45
|
+
{
|
|
46
|
+
label: 'Status',
|
|
47
|
+
value: result.riskScore <= 25
|
|
48
|
+
? c.safe('PROTECTED')
|
|
49
|
+
: result.riskScore <= 50
|
|
50
|
+
? c.caution('AT RISK')
|
|
51
|
+
: c.critical('VULNERABLE'),
|
|
52
|
+
status: result.riskScore <= 25 ? 'safe' : result.riskScore <= 50 ? 'caution' : 'critical',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
label: 'Risk Score',
|
|
56
|
+
value: `${result.riskScore}/100 (${riskLabel})`,
|
|
57
|
+
status: result.riskScore <= 25 ? 'safe' : result.riskScore <= 50 ? 'caution' : 'critical',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
label: 'Issues Found',
|
|
61
|
+
value: String(result.findings.length),
|
|
62
|
+
status: result.findings.length === 0 ? 'safe' : 'caution',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
label: 'Scan Duration',
|
|
66
|
+
value: formatDuration(result.scanDuration),
|
|
67
|
+
},
|
|
68
|
+
]));
|
|
69
|
+
// Findings table
|
|
70
|
+
if (result.findings.length > 0) {
|
|
71
|
+
console.log(divider(`${result.findings.length} Finding(s)`));
|
|
72
|
+
console.log('');
|
|
73
|
+
const columns = [
|
|
74
|
+
{ header: '#', key: 'num', width: 4, align: 'right' },
|
|
75
|
+
{ header: 'Severity', key: 'severity', width: 10 },
|
|
76
|
+
{ header: 'Finding', key: 'title', width: 42 },
|
|
77
|
+
{ header: 'Status', key: 'status', width: 8 },
|
|
78
|
+
];
|
|
79
|
+
const coloredRows = result.findings.map((finding, i) => ({
|
|
80
|
+
num: String(i + 1),
|
|
81
|
+
severity: colorSeverity(finding.severity),
|
|
82
|
+
title: finding.title,
|
|
83
|
+
status: finding['fixed']
|
|
84
|
+
? c.safe('Fixed')
|
|
85
|
+
: c.critical('Open'),
|
|
86
|
+
}));
|
|
87
|
+
console.log(table(columns, coloredRows));
|
|
88
|
+
console.log('');
|
|
89
|
+
// Summary counts
|
|
90
|
+
const critCount = result.findings.filter((f) => f.severity === 'critical').length;
|
|
91
|
+
const highCount = result.findings.filter((f) => f.severity === 'high').length;
|
|
92
|
+
const medCount = result.findings.filter((f) => f.severity === 'medium').length;
|
|
93
|
+
const lowCount = result.findings.filter((f) => f.severity === 'low').length;
|
|
94
|
+
const parts = [];
|
|
95
|
+
if (critCount > 0)
|
|
96
|
+
parts.push(c.critical(`${critCount} Critical`));
|
|
97
|
+
if (highCount > 0)
|
|
98
|
+
parts.push(c.alert(`${highCount} High`));
|
|
99
|
+
if (medCount > 0)
|
|
100
|
+
parts.push(c.caution(`${medCount} Medium`));
|
|
101
|
+
if (lowCount > 0)
|
|
102
|
+
parts.push(c.sage(`${lowCount} Low`));
|
|
103
|
+
if (parts.length > 0) {
|
|
104
|
+
console.log(` ${parts.join(c.dim(' | '))}`);
|
|
105
|
+
console.log('');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
console.log(box(`${symbols.pass} ${t('panguard-scan:cli.noFindings', { defaultValue: 'No security issues found!' })}`, { borderColor: c.safe, title: 'All Clear' }));
|
|
110
|
+
console.log('');
|
|
111
|
+
}
|
|
112
|
+
// PDF report
|
|
113
|
+
if (config.output) {
|
|
114
|
+
const reportSp = spinner(t('panguard-scan:cli.generating', { defaultValue: 'Generating PDF report...' }));
|
|
115
|
+
try {
|
|
116
|
+
await generatePdfReport(result, config.output, config.lang);
|
|
117
|
+
reportSp.succeed(t('panguard-scan:cli.reportSaved', {
|
|
118
|
+
path: config.output,
|
|
119
|
+
defaultValue: `Report saved: ${config.output}`,
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
reportSp.fail(`Error generating report: ${err instanceof Error ? err.message : err}`);
|
|
124
|
+
logger.error('Failed to generate PDF report', {
|
|
125
|
+
error: err instanceof Error ? err.message : String(err),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
console.log(c.dim(` Scan completed at ${new Date().toLocaleString()}`));
|
|
130
|
+
console.log('');
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* PanguardScan CLI Entry Point
|
|
4
|
+
* PanguardScan 命令列介面進入點
|
|
5
|
+
*
|
|
6
|
+
* @module @panguard-ai/panguard-scan/cli
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import { setLogLevel } from '@panguard-ai/core';
|
|
10
|
+
import { PANGUARD_SCAN_VERSION } from '../index.js';
|
|
11
|
+
import { executeScan } from './commands.js';
|
|
12
|
+
import { runRemoteScan } from '../scanners/remote/index.js';
|
|
13
|
+
const program = new Command();
|
|
14
|
+
program
|
|
15
|
+
.name('panguard-scan')
|
|
16
|
+
.description('PanguardScan - 60-second security health check tool / 60 秒資安健檢工具')
|
|
17
|
+
.version(PANGUARD_SCAN_VERSION)
|
|
18
|
+
.option('--quick', 'Quick scan mode (~30 seconds) / 快速掃描模式', false)
|
|
19
|
+
.option('--output <path>', 'Output PDF report path / 輸出 PDF 報告路徑', 'panguard-scan-report.pdf')
|
|
20
|
+
.option('--lang <language>', 'Language: en or zh-TW / 語言', 'en')
|
|
21
|
+
.option('--verbose', 'Verbose output / 詳細輸出', false)
|
|
22
|
+
.option('--json', 'Output pure JSON to stdout (for AI agents) / 輸出純 JSON', false)
|
|
23
|
+
.option('--target <host>', 'Remote target (IP or domain) / 遠端目標')
|
|
24
|
+
.action(async (options) => {
|
|
25
|
+
const lang = options.lang === 'zh-TW' ? 'zh-TW' : 'en';
|
|
26
|
+
// Remote scan mode
|
|
27
|
+
if (options.target) {
|
|
28
|
+
setLogLevel('silent');
|
|
29
|
+
const result = await runRemoteScan({ target: options.target, lang });
|
|
30
|
+
const safetyScore = Math.max(0, 100 - result.riskScore);
|
|
31
|
+
const grade = safetyScore >= 90
|
|
32
|
+
? 'A'
|
|
33
|
+
: safetyScore >= 75
|
|
34
|
+
? 'B'
|
|
35
|
+
: safetyScore >= 60
|
|
36
|
+
? 'C'
|
|
37
|
+
: safetyScore >= 40
|
|
38
|
+
? 'D'
|
|
39
|
+
: 'F';
|
|
40
|
+
if (options.json) {
|
|
41
|
+
console.log(JSON.stringify({
|
|
42
|
+
version: PANGUARD_SCAN_VERSION,
|
|
43
|
+
timestamp: result.scannedAt,
|
|
44
|
+
target: options.target,
|
|
45
|
+
risk_score: result.riskScore,
|
|
46
|
+
risk_level: result.riskLevel,
|
|
47
|
+
grade,
|
|
48
|
+
scan_duration_ms: result.scanDuration,
|
|
49
|
+
findings_count: result.findings.length,
|
|
50
|
+
findings: result.findings.map((f, i) => ({
|
|
51
|
+
id: i + 1,
|
|
52
|
+
severity: f.severity,
|
|
53
|
+
title: f.title,
|
|
54
|
+
category: f.category,
|
|
55
|
+
description: f.description,
|
|
56
|
+
remediation: f.remediation,
|
|
57
|
+
})),
|
|
58
|
+
powered_by: 'Panguard AI',
|
|
59
|
+
agent_friendly: true,
|
|
60
|
+
}, null, 2));
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Human-friendly remote output delegated to executeScan is not available here;
|
|
64
|
+
// print a simple summary
|
|
65
|
+
const { banner, scoreDisplay, symbols, c, formatDuration } = await import('@panguard-ai/core');
|
|
66
|
+
console.log(banner());
|
|
67
|
+
console.log(` ${symbols.scan} Remote Scan: ${c.bold(options.target)}`);
|
|
68
|
+
console.log(scoreDisplay(safetyScore, grade));
|
|
69
|
+
console.log(` Findings: ${result.findings.length} | Duration: ${formatDuration(result.scanDuration)}`);
|
|
70
|
+
for (const f of result.findings) {
|
|
71
|
+
console.log(` ${c.dim('-')} [${f.severity.toUpperCase()}] ${f.title}`);
|
|
72
|
+
}
|
|
73
|
+
console.log('');
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// JSON mode for local scan
|
|
78
|
+
if (options.json) {
|
|
79
|
+
setLogLevel('silent');
|
|
80
|
+
const { runScan } = await import('../scanners/index.js');
|
|
81
|
+
const result = await runScan({
|
|
82
|
+
depth: options.quick ? 'quick' : 'full',
|
|
83
|
+
lang,
|
|
84
|
+
verbose: false,
|
|
85
|
+
});
|
|
86
|
+
const safetyScore = Math.max(0, 100 - result.riskScore);
|
|
87
|
+
const grade = safetyScore >= 90
|
|
88
|
+
? 'A'
|
|
89
|
+
: safetyScore >= 75
|
|
90
|
+
? 'B'
|
|
91
|
+
: safetyScore >= 60
|
|
92
|
+
? 'C'
|
|
93
|
+
: safetyScore >= 40
|
|
94
|
+
? 'D'
|
|
95
|
+
: 'F';
|
|
96
|
+
console.log(JSON.stringify({
|
|
97
|
+
version: PANGUARD_SCAN_VERSION,
|
|
98
|
+
timestamp: result.scannedAt,
|
|
99
|
+
target: 'localhost',
|
|
100
|
+
risk_score: result.riskScore,
|
|
101
|
+
risk_level: result.riskLevel,
|
|
102
|
+
grade,
|
|
103
|
+
scan_duration_ms: result.scanDuration,
|
|
104
|
+
findings_count: result.findings.length,
|
|
105
|
+
findings: result.findings.map((f, i) => ({
|
|
106
|
+
id: i + 1,
|
|
107
|
+
severity: f.severity,
|
|
108
|
+
title: f.title,
|
|
109
|
+
category: f.category,
|
|
110
|
+
description: f.description,
|
|
111
|
+
remediation: f.remediation,
|
|
112
|
+
})),
|
|
113
|
+
system: {
|
|
114
|
+
os: `${result.discovery.os.distro} ${result.discovery.os.version}`,
|
|
115
|
+
arch: result.discovery.os.arch,
|
|
116
|
+
open_ports: result.discovery.openPorts.length,
|
|
117
|
+
running_services: result.discovery.services.length,
|
|
118
|
+
firewall_enabled: result.discovery.security.firewall.enabled,
|
|
119
|
+
security_tools_detected: result.discovery.security.existingTools.length,
|
|
120
|
+
},
|
|
121
|
+
powered_by: 'Panguard AI',
|
|
122
|
+
agent_friendly: true,
|
|
123
|
+
}, null, 2));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// Normal human-friendly scan
|
|
127
|
+
await executeScan({
|
|
128
|
+
depth: options.quick ? 'quick' : 'full',
|
|
129
|
+
lang,
|
|
130
|
+
output: options.output,
|
|
131
|
+
verbose: options.verbose,
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
program.parseAsync().catch((err) => {
|
|
135
|
+
console.error('Fatal error:', err instanceof Error ? err.message : err);
|
|
136
|
+
process.exit(1);
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PanguardScan - Security Scanning CLI Tool
|
|
3
|
+
* PanguardScan - 資安健檢命令列工具
|
|
4
|
+
*
|
|
5
|
+
* Performs comprehensive security scans and generates PDF reports.
|
|
6
|
+
* 執行全面的安全掃描並產生 PDF 報告。
|
|
7
|
+
*
|
|
8
|
+
* @module @panguard-ai/panguard-scan
|
|
9
|
+
*/
|
|
10
|
+
/** PanguardScan version / PanguardScan 版本 */
|
|
11
|
+
export declare const PANGUARD_SCAN_VERSION = "0.1.0";
|
|
12
|
+
/** PanguardScan product name / PanguardScan 產品名稱 */
|
|
13
|
+
export declare const CLAWSCAN_NAME = "PanguardScan";
|
|
14
|
+
export { runScan } from './scanners/index.js';
|
|
15
|
+
export type { ScanConfig, ScanResult, Finding } from './scanners/types.js';
|
|
16
|
+
export { sortBySeverity, SEVERITY_ORDER } from './scanners/types.js';
|
|
17
|
+
export { runRemoteScan } from './scanners/remote/index.js';
|
|
18
|
+
export type { RemoteScanConfig } from './scanners/remote/index.js';
|
|
19
|
+
export { generatePdfReport } from './report/index.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,6CAA6C;AAC7C,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAE7C,oDAAoD;AACpD,eAAO,MAAM,aAAa,iBAAiB,CAAC;AAG5C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PanguardScan - Security Scanning CLI Tool
|
|
3
|
+
* PanguardScan - 資安健檢命令列工具
|
|
4
|
+
*
|
|
5
|
+
* Performs comprehensive security scans and generates PDF reports.
|
|
6
|
+
* 執行全面的安全掃描並產生 PDF 報告。
|
|
7
|
+
*
|
|
8
|
+
* @module @panguard-ai/panguard-scan
|
|
9
|
+
*/
|
|
10
|
+
/** PanguardScan version / PanguardScan 版本 */
|
|
11
|
+
export const PANGUARD_SCAN_VERSION = '0.1.0';
|
|
12
|
+
/** PanguardScan product name / PanguardScan 產品名稱 */
|
|
13
|
+
export const CLAWSCAN_NAME = 'PanguardScan';
|
|
14
|
+
// Scanner exports / 掃描器匯出
|
|
15
|
+
export { runScan } from './scanners/index.js';
|
|
16
|
+
export { sortBySeverity, SEVERITY_ORDER } from './scanners/types.js';
|
|
17
|
+
// Remote scanner exports / 遠端掃描器匯出
|
|
18
|
+
export { runRemoteScan } from './scanners/remote/index.js';
|
|
19
|
+
// Report exports / 報告匯出
|
|
20
|
+
export { generatePdfReport } from './report/index.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,6CAA6C;AAC7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAE7C,oDAAoD;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,cAAc,CAAC;AAE5C,0BAA0B;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErE,mCAAmC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,wBAAwB;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taiwan Information Security Management Act compliance mapping
|
|
3
|
+
* 台灣資通安全管理法合規對照
|
|
4
|
+
*
|
|
5
|
+
* Maps security findings to relevant articles of the Taiwan ISMS
|
|
6
|
+
* (Information Security Management System) framework.
|
|
7
|
+
* 將安全發現對應到台灣資通安全管理法(ISMS)框架的相關條文。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/panguard-scan/report/compliance-map
|
|
10
|
+
*/
|
|
11
|
+
import type { Finding } from '../scanners/types.js';
|
|
12
|
+
/**
|
|
13
|
+
* A single compliance framework entry
|
|
14
|
+
* 單一合規框架條目
|
|
15
|
+
*/
|
|
16
|
+
export interface ComplianceEntry {
|
|
17
|
+
/**
|
|
18
|
+
* Article reference number (e.g. "4.1")
|
|
19
|
+
* 條文參照編號(例如 "4.1")
|
|
20
|
+
*/
|
|
21
|
+
ref: string;
|
|
22
|
+
/**
|
|
23
|
+
* Article title in English
|
|
24
|
+
* 條文標題(英文)
|
|
25
|
+
*/
|
|
26
|
+
titleEn: string;
|
|
27
|
+
/**
|
|
28
|
+
* Article title in Traditional Chinese
|
|
29
|
+
* 條文標題(繁體中文)
|
|
30
|
+
*/
|
|
31
|
+
titleZh: string;
|
|
32
|
+
/**
|
|
33
|
+
* Article description in English
|
|
34
|
+
* 條文描述(英文)
|
|
35
|
+
*/
|
|
36
|
+
descriptionEn: string;
|
|
37
|
+
/**
|
|
38
|
+
* Article description in Traditional Chinese
|
|
39
|
+
* 條文描述(繁體中文)
|
|
40
|
+
*/
|
|
41
|
+
descriptionZh: string;
|
|
42
|
+
/**
|
|
43
|
+
* Finding categories that map to this article
|
|
44
|
+
* 對應到此條文的發現分類
|
|
45
|
+
*/
|
|
46
|
+
categories: string[];
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Compliance status for a single article with related findings
|
|
50
|
+
* 單一條文的合規狀態及相關發現
|
|
51
|
+
*/
|
|
52
|
+
export interface ComplianceStatus extends ComplianceEntry {
|
|
53
|
+
/**
|
|
54
|
+
* Compliance status assessment
|
|
55
|
+
* 合規狀態評估
|
|
56
|
+
*/
|
|
57
|
+
status: 'compliant' | 'non_compliant' | 'partial' | 'not_applicable';
|
|
58
|
+
/**
|
|
59
|
+
* Security findings related to this article
|
|
60
|
+
* 與此條文相關的安全發現
|
|
61
|
+
*/
|
|
62
|
+
relatedFindings: Finding[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Retrieve all compliance framework entries
|
|
66
|
+
* 取得所有合規框架條目
|
|
67
|
+
*
|
|
68
|
+
* @returns Array of compliance entries / 合規條目陣列
|
|
69
|
+
*/
|
|
70
|
+
export declare function getComplianceEntries(): ComplianceEntry[];
|
|
71
|
+
/**
|
|
72
|
+
* Map security findings to compliance framework articles
|
|
73
|
+
* 將安全發現對應到合規框架條文
|
|
74
|
+
*
|
|
75
|
+
* Evaluates each compliance article against the provided findings to
|
|
76
|
+
* determine compliance status. Articles with critical or high severity
|
|
77
|
+
* findings are marked non-compliant; those with medium or low findings
|
|
78
|
+
* are marked partial; articles with no related findings are marked
|
|
79
|
+
* compliant; articles whose categories have no matching findings are
|
|
80
|
+
* marked not-applicable when there are no findings at all in any
|
|
81
|
+
* related category.
|
|
82
|
+
*
|
|
83
|
+
* 根據提供的發現評估每個合規條文以判定合規狀態。具有嚴重或高嚴重度發現的
|
|
84
|
+
* 條文標記為不合規;具有中等或低嚴重度發現的標記為部分合規;沒有相關發現
|
|
85
|
+
* 的條文標記為合規;當完全沒有任何相關分類的發現時標記為不適用。
|
|
86
|
+
*
|
|
87
|
+
* @param findings - Array of security findings / 安全發現陣列
|
|
88
|
+
* @returns Array of compliance statuses / 合規狀態陣列
|
|
89
|
+
*/
|
|
90
|
+
export declare function mapFindingsToCompliance(findings: Finding[]): ComplianceStatus[];
|
|
91
|
+
//# sourceMappingURL=compliance-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance-map.d.ts","sourceRoot":"","sources":["../../src/report/compliance-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD;;;OAGG;IACH,MAAM,EAAE,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,gBAAgB,CAAC;IAErE;;;OAGG;IACH,eAAe,EAAE,OAAO,EAAE,CAAC;CAC5B;AAkGD;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,eAAe,EAAE,CAExD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,gBAAgB,EAAE,CAmC/E"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taiwan Information Security Management Act compliance mapping
|
|
3
|
+
* 台灣資通安全管理法合規對照
|
|
4
|
+
*
|
|
5
|
+
* Maps security findings to relevant articles of the Taiwan ISMS
|
|
6
|
+
* (Information Security Management System) framework.
|
|
7
|
+
* 將安全發現對應到台灣資通安全管理法(ISMS)框架的相關條文。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/panguard-scan/report/compliance-map
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Taiwan ISMS compliance entries
|
|
13
|
+
* 台灣資通安全管理法合規條目
|
|
14
|
+
*/
|
|
15
|
+
const COMPLIANCE_ENTRIES = [
|
|
16
|
+
{
|
|
17
|
+
ref: '4.1',
|
|
18
|
+
titleEn: 'Access Control',
|
|
19
|
+
titleZh: '存取控制',
|
|
20
|
+
descriptionEn: 'Establish and enforce access control policies to restrict unauthorized access to information systems and data.',
|
|
21
|
+
descriptionZh: '建立並執行存取控制政策,限制對資訊系統和資料的未經授權存取。',
|
|
22
|
+
categories: ['password', 'access'],
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
ref: '4.2',
|
|
26
|
+
titleEn: 'System Protection',
|
|
27
|
+
titleZh: '系統保護',
|
|
28
|
+
descriptionEn: 'Implement system-level protections including firewalls, intrusion detection, and endpoint security measures.',
|
|
29
|
+
descriptionZh: '實施系統層級保護措施,包括防火牆、入侵偵測和端點安全措施。',
|
|
30
|
+
categories: ['system', 'firewall'],
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
ref: '4.3',
|
|
34
|
+
titleEn: 'Network Security',
|
|
35
|
+
titleZh: '網路安全',
|
|
36
|
+
descriptionEn: 'Secure network infrastructure through segmentation, monitoring, and traffic analysis.',
|
|
37
|
+
descriptionZh: '透過網路分段、監控和流量分析來保護網路基礎設施。',
|
|
38
|
+
categories: ['network'],
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
ref: '4.4',
|
|
42
|
+
titleEn: 'Encryption Management',
|
|
43
|
+
titleZh: '加密管理',
|
|
44
|
+
descriptionEn: 'Apply appropriate encryption standards for data in transit and at rest, and manage certificates properly.',
|
|
45
|
+
descriptionZh: '對傳輸中和靜態資料套用適當的加密標準,並妥善管理憑證。',
|
|
46
|
+
categories: ['certificate'],
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
ref: '4.5',
|
|
50
|
+
titleEn: 'Authentication',
|
|
51
|
+
titleZh: '身分驗證',
|
|
52
|
+
descriptionEn: 'Enforce strong authentication mechanisms including password policies and multi-factor authentication.',
|
|
53
|
+
descriptionZh: '強制執行強健的身分驗證機制,包括密碼政策和多因素身分驗證。',
|
|
54
|
+
categories: ['password', 'authentication'],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
ref: '4.6',
|
|
58
|
+
titleEn: 'Monitoring',
|
|
59
|
+
titleZh: '監控管理',
|
|
60
|
+
descriptionEn: 'Continuously monitor systems for security events, anomalies, and policy violations.',
|
|
61
|
+
descriptionZh: '持續監控系統的安全事件、異常行為和政策違規。',
|
|
62
|
+
categories: ['system', 'monitoring'],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
ref: '4.7',
|
|
66
|
+
titleEn: 'Incident Response',
|
|
67
|
+
titleZh: '事件應變',
|
|
68
|
+
descriptionEn: 'Establish procedures for detecting, reporting, and responding to security incidents.',
|
|
69
|
+
descriptionZh: '建立偵測、報告和回應安全事件的程序。',
|
|
70
|
+
categories: ['incident'],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
ref: '4.8',
|
|
74
|
+
titleEn: 'Asset Management',
|
|
75
|
+
titleZh: '資產管理',
|
|
76
|
+
descriptionEn: 'Identify, classify, and manage information assets throughout their lifecycle.',
|
|
77
|
+
descriptionZh: '在資訊資產的整個生命週期中進行識別、分類和管理。',
|
|
78
|
+
categories: ['system', 'access'],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
ref: '4.9',
|
|
82
|
+
titleEn: 'Update Management',
|
|
83
|
+
titleZh: '更新管理',
|
|
84
|
+
descriptionEn: 'Maintain systems with timely security patches and software updates to address known vulnerabilities.',
|
|
85
|
+
descriptionZh: '透過及時的安全修補和軟體更新來維護系統,以解決已知弱點。',
|
|
86
|
+
categories: ['updates', 'system'],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
ref: '4.10',
|
|
90
|
+
titleEn: 'Audit',
|
|
91
|
+
titleZh: '稽核管理',
|
|
92
|
+
descriptionEn: 'Conduct regular security audits and maintain comprehensive audit logs for accountability.',
|
|
93
|
+
descriptionZh: '定期進行安全稽核並維護完整的稽核日誌以確保可追溯性。',
|
|
94
|
+
categories: ['audit', 'logging'],
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
/**
|
|
98
|
+
* Retrieve all compliance framework entries
|
|
99
|
+
* 取得所有合規框架條目
|
|
100
|
+
*
|
|
101
|
+
* @returns Array of compliance entries / 合規條目陣列
|
|
102
|
+
*/
|
|
103
|
+
export function getComplianceEntries() {
|
|
104
|
+
return [...COMPLIANCE_ENTRIES];
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Map security findings to compliance framework articles
|
|
108
|
+
* 將安全發現對應到合規框架條文
|
|
109
|
+
*
|
|
110
|
+
* Evaluates each compliance article against the provided findings to
|
|
111
|
+
* determine compliance status. Articles with critical or high severity
|
|
112
|
+
* findings are marked non-compliant; those with medium or low findings
|
|
113
|
+
* are marked partial; articles with no related findings are marked
|
|
114
|
+
* compliant; articles whose categories have no matching findings are
|
|
115
|
+
* marked not-applicable when there are no findings at all in any
|
|
116
|
+
* related category.
|
|
117
|
+
*
|
|
118
|
+
* 根據提供的發現評估每個合規條文以判定合規狀態。具有嚴重或高嚴重度發現的
|
|
119
|
+
* 條文標記為不合規;具有中等或低嚴重度發現的標記為部分合規;沒有相關發現
|
|
120
|
+
* 的條文標記為合規;當完全沒有任何相關分類的發現時標記為不適用。
|
|
121
|
+
*
|
|
122
|
+
* @param findings - Array of security findings / 安全發現陣列
|
|
123
|
+
* @returns Array of compliance statuses / 合規狀態陣列
|
|
124
|
+
*/
|
|
125
|
+
export function mapFindingsToCompliance(findings) {
|
|
126
|
+
return COMPLIANCE_ENTRIES.map((entry) => {
|
|
127
|
+
const relatedFindings = findings.filter((f) => entry.categories.includes(f.category));
|
|
128
|
+
let status;
|
|
129
|
+
if (relatedFindings.length === 0) {
|
|
130
|
+
// If no findings exist at all for these categories, mark as not applicable
|
|
131
|
+
// when the scan did not cover them; otherwise compliant
|
|
132
|
+
const hasAnyFindingInCategory = findings.some((f) => entry.categories.includes(f.category));
|
|
133
|
+
status = hasAnyFindingInCategory ? 'compliant' : 'not_applicable';
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
const hasCriticalOrHigh = relatedFindings.some((f) => f.severity === 'critical' || f.severity === 'high');
|
|
137
|
+
const hasMediumOrLow = relatedFindings.some((f) => f.severity === 'medium' || f.severity === 'low');
|
|
138
|
+
if (hasCriticalOrHigh) {
|
|
139
|
+
status = 'non_compliant';
|
|
140
|
+
}
|
|
141
|
+
else if (hasMediumOrLow) {
|
|
142
|
+
status = 'partial';
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Only info-level findings
|
|
146
|
+
status = 'compliant';
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return {
|
|
150
|
+
...entry,
|
|
151
|
+
status,
|
|
152
|
+
relatedFindings,
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=compliance-map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compliance-map.js","sourceRoot":"","sources":["../../src/report/compliance-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAgEH;;;GAGG;AACH,MAAM,kBAAkB,GAAsB;IAC5C;QACE,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,MAAM;QACf,aAAa,EACX,gHAAgH;QAClH,aAAa,EAAE,gCAAgC;QAC/C,UAAU,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;KACnC;IACD;QACE,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE,MAAM;QACf,aAAa,EACX,8GAA8G;QAChH,aAAa,EAAE,+BAA+B;QAC9C,UAAU,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;KACnC;IACD;QACE,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE,MAAM;QACf,aAAa,EACX,uFAAuF;QACzF,aAAa,EAAE,0BAA0B;QACzC,UAAU,EAAE,CAAC,SAAS,CAAC;KACxB;IACD;QACE,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,uBAAuB;QAChC,OAAO,EAAE,MAAM;QACf,aAAa,EACX,2GAA2G;QAC7G,aAAa,EAAE,6BAA6B;QAC5C,UAAU,EAAE,CAAC,aAAa,CAAC;KAC5B;IACD;QACE,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,gBAAgB;QACzB,OAAO,EAAE,MAAM;QACf,aAAa,EACX,uGAAuG;QACzG,aAAa,EAAE,+BAA+B;QAC9C,UAAU,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC;KAC3C;IACD;QACE,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,MAAM;QACf,aAAa,EACX,qFAAqF;QACvF,aAAa,EAAE,wBAAwB;QACvC,UAAU,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;KACrC;IACD;QACE,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE,MAAM;QACf,aAAa,EACX,sFAAsF;QACxF,aAAa,EAAE,oBAAoB;QACnC,UAAU,EAAE,CAAC,UAAU,CAAC;KACzB;IACD;QACE,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,+EAA+E;QAC9F,aAAa,EAAE,0BAA0B;QACzC,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;KACjC;IACD;QACE,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,mBAAmB;QAC5B,OAAO,EAAE,MAAM;QACf,aAAa,EACX,sGAAsG;QACxG,aAAa,EAAE,8BAA8B;QAC7C,UAAU,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC;KAClC;IACD;QACE,GAAG,EAAE,MAAM;QACX,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,MAAM;QACf,aAAa,EACX,2FAA2F;QAC7F,aAAa,EAAE,4BAA4B;QAC3C,UAAU,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC;KACjC;CACF,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,CAAC,GAAG,kBAAkB,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAmB;IACzD,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACtC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEtF,IAAI,MAAkC,CAAC;QAEvC,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,2EAA2E;YAC3E,wDAAwD;YACxD,MAAM,uBAAuB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5F,MAAM,GAAG,uBAAuB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,iBAAiB,GAAG,eAAe,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAC1D,CAAC;YACF,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CACzC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CACvD,CAAC;YAEF,IAAI,iBAAiB,EAAE,CAAC;gBACtB,MAAM,GAAG,eAAe,CAAC;YAC3B,CAAC;iBAAM,IAAI,cAAc,EAAE,CAAC;gBAC1B,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,2BAA2B;gBAC3B,MAAM,GAAG,WAAW,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO;YACL,GAAG,KAAK;YACR,MAAM;YACN,eAAe;SAChB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PDF Report Generator for PanguardScan
|
|
3
|
+
* PanguardScan PDF 報告產生器
|
|
4
|
+
*
|
|
5
|
+
* Provides PDF report generation from scan results, including
|
|
6
|
+
* compliance mapping against the Taiwan ISMS framework.
|
|
7
|
+
* 提供從掃描結果產生 PDF 報告的功能,包括台灣資通安全管理法框架的合規對照。
|
|
8
|
+
*
|
|
9
|
+
* @module @panguard-ai/panguard-scan/report
|
|
10
|
+
*/
|
|
11
|
+
export { generatePdfReport } from './pdf-generator.js';
|
|
12
|
+
export { getComplianceEntries, mapFindingsToCompliance } from './compliance-map.js';
|
|
13
|
+
export type { ComplianceEntry, ComplianceStatus } from './compliance-map.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/report/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACpF,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|