@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.
Files changed (105) hide show
  1. package/dist/cli/commands.d.ts +13 -0
  2. package/dist/cli/commands.d.ts.map +1 -0
  3. package/dist/cli/commands.js +132 -0
  4. package/dist/cli/commands.js.map +1 -0
  5. package/dist/cli/index.d.ts +9 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +138 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/index.d.ts +20 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +21 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/report/compliance-map.d.ts +91 -0
  14. package/dist/report/compliance-map.d.ts.map +1 -0
  15. package/dist/report/compliance-map.js +156 -0
  16. package/dist/report/compliance-map.js.map +1 -0
  17. package/dist/report/index.d.ts +14 -0
  18. package/dist/report/index.d.ts.map +1 -0
  19. package/dist/report/index.js +13 -0
  20. package/dist/report/index.js.map +1 -0
  21. package/dist/report/pdf-generator.d.ts +41 -0
  22. package/dist/report/pdf-generator.d.ts.map +1 -0
  23. package/dist/report/pdf-generator.js +238 -0
  24. package/dist/report/pdf-generator.js.map +1 -0
  25. package/dist/report/sections/compliance.d.ts +28 -0
  26. package/dist/report/sections/compliance.d.ts.map +1 -0
  27. package/dist/report/sections/compliance.js +227 -0
  28. package/dist/report/sections/compliance.js.map +1 -0
  29. package/dist/report/sections/cover.d.ts +22 -0
  30. package/dist/report/sections/cover.d.ts.map +1 -0
  31. package/dist/report/sections/cover.js +190 -0
  32. package/dist/report/sections/cover.js.map +1 -0
  33. package/dist/report/sections/executive-summary.d.ts +22 -0
  34. package/dist/report/sections/executive-summary.d.ts.map +1 -0
  35. package/dist/report/sections/executive-summary.js +206 -0
  36. package/dist/report/sections/executive-summary.js.map +1 -0
  37. package/dist/report/sections/findings-table.d.ts +28 -0
  38. package/dist/report/sections/findings-table.d.ts.map +1 -0
  39. package/dist/report/sections/findings-table.js +189 -0
  40. package/dist/report/sections/findings-table.js.map +1 -0
  41. package/dist/report/sections/remediation.d.ts +28 -0
  42. package/dist/report/sections/remediation.d.ts.map +1 -0
  43. package/dist/report/sections/remediation.js +157 -0
  44. package/dist/report/sections/remediation.js.map +1 -0
  45. package/dist/report/styles.d.ts +65 -0
  46. package/dist/report/styles.d.ts.map +1 -0
  47. package/dist/report/styles.js +80 -0
  48. package/dist/report/styles.js.map +1 -0
  49. package/dist/scanners/cve-checker.d.ts +21 -0
  50. package/dist/scanners/cve-checker.d.ts.map +1 -0
  51. package/dist/scanners/cve-checker.js +198 -0
  52. package/dist/scanners/cve-checker.js.map +1 -0
  53. package/dist/scanners/discovery-scanner.d.ts +24 -0
  54. package/dist/scanners/discovery-scanner.d.ts.map +1 -0
  55. package/dist/scanners/discovery-scanner.js +208 -0
  56. package/dist/scanners/discovery-scanner.js.map +1 -0
  57. package/dist/scanners/index.d.ts +54 -0
  58. package/dist/scanners/index.d.ts.map +1 -0
  59. package/dist/scanners/index.js +328 -0
  60. package/dist/scanners/index.js.map +1 -0
  61. package/dist/scanners/open-ports.d.ts +25 -0
  62. package/dist/scanners/open-ports.d.ts.map +1 -0
  63. package/dist/scanners/open-ports.js +198 -0
  64. package/dist/scanners/open-ports.js.map +1 -0
  65. package/dist/scanners/password-policy.d.ts +23 -0
  66. package/dist/scanners/password-policy.d.ts.map +1 -0
  67. package/dist/scanners/password-policy.js +324 -0
  68. package/dist/scanners/password-policy.js.map +1 -0
  69. package/dist/scanners/remote/dns-checker.d.ts +21 -0
  70. package/dist/scanners/remote/dns-checker.d.ts.map +1 -0
  71. package/dist/scanners/remote/dns-checker.js +103 -0
  72. package/dist/scanners/remote/dns-checker.js.map +1 -0
  73. package/dist/scanners/remote/http-headers.d.ts +19 -0
  74. package/dist/scanners/remote/http-headers.d.ts.map +1 -0
  75. package/dist/scanners/remote/http-headers.js +65 -0
  76. package/dist/scanners/remote/http-headers.js.map +1 -0
  77. package/dist/scanners/remote/index.d.ts +22 -0
  78. package/dist/scanners/remote/index.d.ts.map +1 -0
  79. package/dist/scanners/remote/index.js +120 -0
  80. package/dist/scanners/remote/index.js.map +1 -0
  81. package/dist/scanners/remote/port-scanner.d.ts +20 -0
  82. package/dist/scanners/remote/port-scanner.d.ts.map +1 -0
  83. package/dist/scanners/remote/port-scanner.js +65 -0
  84. package/dist/scanners/remote/port-scanner.js.map +1 -0
  85. package/dist/scanners/remote/ssl-checker.d.ts +24 -0
  86. package/dist/scanners/remote/ssl-checker.d.ts.map +1 -0
  87. package/dist/scanners/remote/ssl-checker.js +109 -0
  88. package/dist/scanners/remote/ssl-checker.js.map +1 -0
  89. package/dist/scanners/scheduled-tasks.d.ts +26 -0
  90. package/dist/scanners/scheduled-tasks.d.ts.map +1 -0
  91. package/dist/scanners/scheduled-tasks.js +299 -0
  92. package/dist/scanners/scheduled-tasks.js.map +1 -0
  93. package/dist/scanners/shared-folders.d.ts +25 -0
  94. package/dist/scanners/shared-folders.d.ts.map +1 -0
  95. package/dist/scanners/shared-folders.js +310 -0
  96. package/dist/scanners/shared-folders.js.map +1 -0
  97. package/dist/scanners/ssl-checker.d.ts +27 -0
  98. package/dist/scanners/ssl-checker.d.ts.map +1 -0
  99. package/dist/scanners/ssl-checker.js +197 -0
  100. package/dist/scanners/ssl-checker.js.map +1 -0
  101. package/dist/scanners/types.d.ts +140 -0
  102. package/dist/scanners/types.d.ts.map +1 -0
  103. package/dist/scanners/types.js +31 -0
  104. package/dist/scanners/types.js.map +1 -0
  105. 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,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * PanguardScan CLI Entry Point
4
+ * PanguardScan 命令列介面進入點
5
+ *
6
+ * @module @panguard-ai/panguard-scan/cli
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -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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"}
@@ -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":"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"}
@@ -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"}