@panguard-ai/panguard 1.5.5 → 1.6.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 (35) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/cli/commands/config.d.ts.map +1 -1
  3. package/dist/cli/commands/config.js +3 -1
  4. package/dist/cli/commands/config.js.map +1 -1
  5. package/dist/cli/commands/setup.d.ts.map +1 -1
  6. package/dist/cli/commands/setup.js +4 -1
  7. package/dist/cli/commands/setup.js.map +1 -1
  8. package/dist/cli/commands/trap.d.ts +6 -2
  9. package/dist/cli/commands/trap.d.ts.map +1 -1
  10. package/dist/cli/commands/trap.js +71 -46
  11. package/dist/cli/commands/trap.js.map +1 -1
  12. package/dist/cli/commands/up.d.ts.map +1 -1
  13. package/dist/cli/commands/up.js +46 -36
  14. package/dist/cli/commands/up.js.map +1 -1
  15. package/dist/cli/consent.d.ts +7 -5
  16. package/dist/cli/consent.d.ts.map +1 -1
  17. package/dist/cli/consent.js +33 -16
  18. package/dist/cli/consent.js.map +1 -1
  19. package/dist/cli/index.js +40 -6
  20. package/dist/cli/index.js.map +1 -1
  21. package/dist/cli/interactive/actions/misc.d.ts.map +1 -1
  22. package/dist/cli/interactive/actions/misc.js +25 -7
  23. package/dist/cli/interactive/actions/misc.js.map +1 -1
  24. package/dist/cli/interactive/menu-defs.d.ts.map +1 -1
  25. package/dist/cli/interactive/menu-defs.js +4 -15
  26. package/dist/cli/interactive/menu-defs.js.map +1 -1
  27. package/dist/cli/theme.d.ts +38 -0
  28. package/dist/cli/theme.d.ts.map +1 -1
  29. package/dist/cli/theme.js +74 -0
  30. package/dist/cli/theme.js.map +1 -1
  31. package/dist/init/rule-count.d.ts +23 -0
  32. package/dist/init/rule-count.d.ts.map +1 -0
  33. package/dist/init/rule-count.js +109 -0
  34. package/dist/init/rule-count.js.map +1 -0
  35. package/package.json +15 -13
package/dist/cli/theme.js CHANGED
@@ -14,6 +14,40 @@ export const BRAND_LOGO = [
14
14
  ' \u2588\u2588\u2580\u2580\u2580\u2580 \u2588\u2588\u2580\u2580\u2588\u2588 \u2588\u2588\u2580\u2584\u2588\u2588 \u2588\u2588 \u2580\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2580\u2580\u2588\u2588 \u2588\u2588\u2588\u2580\u2580 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2580\u2580\u2588\u2588 \u2588\u2588',
15
15
  ' \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588\u2584\u2584\u2588\u2588 \u2588\u2588\u2584\u2584\u2588\u2588 \u2588\u2588 \u2588\u2588 \u2588\u2588 \u2580\u2588\u2584 \u2588\u2588\u2584\u2584\u2588\u2580 \u2588\u2588 \u2588\u2588 \u2588\u2588',
16
16
  ];
17
+ // \u2500\u2500 Brand Tagline \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
18
+ // Collective-defense positioning: the logo is three overlapping shields.
19
+ // Each install makes everyone safer. Keep this short \u2014 it's a banner line.
20
+ /** One-line collective-defense tagline for banners (en / zh). */
21
+ export function brandTagline(lang = 'en') {
22
+ return lang === 'zh-TW'
23
+ ? 'AI \u4ee3\u7406\u5b89\u5168 \u00b7 \u958b\u653e\u6a19\u6e96 \u00b7 \u96c6\u9ad4\u9632\u79a6'
24
+ : 'AI agent security \u00b7 open \u00b7 collective defense';
25
+ }
26
+ // \u2500\u2500 Clear Status Marks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
27
+ // Human-readable marks instead of decoded jargon ([~] [#] [!]).
28
+ // \u2713 = good/safe (sage\u00b7green), \u26a0 = needs attention (caution), \u2192 = next step.
29
+ // These wrap a single glyph in brand color; callers add their own spacing.
30
+ /** \u2713 \u2014 safe / done / protected (sage-green). */
31
+ export const ok = (s = '\u2713') => c.safe(s);
32
+ /** \u26a0 \u2014 needs attention / suspicious (caution amber). */
33
+ export const warn = (s = '\u26a0') => c.caution(s);
34
+ /** \u2192 \u2014 next step / pointer (sage). */
35
+ export const arrow = (s = '\u2192') => c.sage(s);
36
+ /** \u2717 \u2014 critical / failed (critical red). */
37
+ export const fail = (s = '\u2717') => c.critical(s);
38
+ /** \u25a3 \u2014 the shield: PanGuard is watching (sage). Used for "protecting" lines. */
39
+ export const shield = (s = '\u25a3') => c.sage(s);
40
+ /**
41
+ * Brand status marks as a stable map, for callers that prefer lookup style.
42
+ * Mirrors the standalone helpers above \u2014 same glyphs, same colors.
43
+ */
44
+ export const marks = {
45
+ ok: ok(),
46
+ warn: warn(),
47
+ arrow: arrow(),
48
+ fail: fail(),
49
+ shield: shield(),
50
+ };
17
51
  // ── Theme Colors ──────────────────────────────────────────────────────
18
52
  export const theme = {
19
53
  // Brand
@@ -73,6 +107,46 @@ export function renderLogo() {
73
107
  console.log(c.sage(line));
74
108
  }
75
109
  }
110
+ /**
111
+ * Build the "✓ You're protected" hero block as ready-to-print lines.
112
+ * Pure: returns strings, caller does the console.log. Keeps copy + the two
113
+ * trust guarantees (detection-only, nothing-leaves-your-machine) in one place.
114
+ */
115
+ export function protectedHero(opts) {
116
+ const lang = opts.lang ?? 'en';
117
+ const zh = lang === 'zh-TW';
118
+ const rule = c.bold(c.sage(String(opts.ruleCount)));
119
+ const tool = c.bold(c.sage(String(opts.toolCount)));
120
+ const rule50 = c.dim('─'.repeat(50));
121
+ const lines = [];
122
+ lines.push(` ${rule50}`);
123
+ if (zh) {
124
+ lines.push(` ${ok()} ${c.bold('你已受到保護')}`);
125
+ lines.push(` PanGuard 正在守護 ${tool} 個工具,防範提示注入、工具濫用、`);
126
+ lines.push(` 資料外洩與惡意技能 — 使用 ${rule} 條開放規則。`);
127
+ lines.push(` ${c.dim('僅偵測,不阻擋 — 除非你親自開啟。')}`);
128
+ lines.push(` ${c.dim('任何資料都不會離開這台機器 — 除非你允許。')}`);
129
+ }
130
+ else {
131
+ lines.push(` ${ok()} ${c.bold("You're protected")}`);
132
+ lines.push(` PanGuard is watching ${tool} tools for prompt injection, tool abuse,`);
133
+ lines.push(` data exfiltration, and malicious skills — using ${rule} open rules.`);
134
+ lines.push(` ${c.dim('Detection only. Nothing is blocked unless you turn it on.')}`);
135
+ lines.push(` ${c.dim('Nothing leaves your machine unless you allow it.')}`);
136
+ }
137
+ lines.push('');
138
+ if (opts.dashboardUrl) {
139
+ const dash = zh ? '儀表板' : 'Dashboard';
140
+ const stat = zh ? '狀態' : 'Status';
141
+ lines.push(` ${dash} ${arrow()} ${c.sage(opts.dashboardUrl)} ${stat} ${arrow()} ${c.dim('pga status')}`);
142
+ }
143
+ else {
144
+ const stat = zh ? '狀態' : 'Status';
145
+ lines.push(` ${stat} ${arrow()} ${c.dim('pga status')}`);
146
+ }
147
+ lines.push(` ${rule50}`);
148
+ return lines;
149
+ }
76
150
  // Re-export for convenience
77
151
  export { c, stripAnsi, visLen };
78
152
  //# sourceMappingURL=theme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/cli/theme.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/cli/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Dynamic ATR rule count for onboarding copy.
3
+ * 動態 ATR 規則數(供 onboarding 文案使用)
4
+ *
5
+ * The community UX requires the rule count to reflect the live ruleset,
6
+ * never a hardcoded number (DESIGN-community-ux 情境 1: "規則數動態,別寫死").
7
+ *
8
+ * Resolution order (truthful, lightweight — no engine import):
9
+ * 1. Threat Cloud cache `uniqueRulesCount` — the live synced count, the same
10
+ * source `pga up` reads. Reflects rules actually loaded by Guard.
11
+ * 2. Bundled rule YAMLs in the `agent-threat-rules` package — the real shipped
12
+ * count, resolved by walking up from this module (mirrors report.ts).
13
+ * 3. `null` — neither available; callers omit the number rather than lie.
14
+ *
15
+ * @module @panguard-ai/panguard/init/rule-count
16
+ */
17
+ /**
18
+ * Resolve the current ATR rule count for onboarding copy.
19
+ * Returns `null` only when no truthful source is available — callers should
20
+ * phrase copy so the count can be gracefully omitted.
21
+ */
22
+ export declare function getRuleCount(): number | null;
23
+ //# sourceMappingURL=rule-count.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-count.d.ts","sourceRoot":"","sources":["../../src/init/rule-count.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAqFH;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Dynamic ATR rule count for onboarding copy.
3
+ * 動態 ATR 規則數(供 onboarding 文案使用)
4
+ *
5
+ * The community UX requires the rule count to reflect the live ruleset,
6
+ * never a hardcoded number (DESIGN-community-ux 情境 1: "規則數動態,別寫死").
7
+ *
8
+ * Resolution order (truthful, lightweight — no engine import):
9
+ * 1. Threat Cloud cache `uniqueRulesCount` — the live synced count, the same
10
+ * source `pga up` reads. Reflects rules actually loaded by Guard.
11
+ * 2. Bundled rule YAMLs in the `agent-threat-rules` package — the real shipped
12
+ * count, resolved by walking up from this module (mirrors report.ts).
13
+ * 3. `null` — neither available; callers omit the number rather than lie.
14
+ *
15
+ * @module @panguard-ai/panguard/init/rule-count
16
+ */
17
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
18
+ import { homedir } from 'node:os';
19
+ import { dirname, join, sep } from 'node:path';
20
+ import { fileURLToPath } from 'node:url';
21
+ /** Threat Cloud cache written by Guard once it syncs the live ruleset. */
22
+ function ruleCountFromTcCache() {
23
+ try {
24
+ const cachePath = join(homedir(), '.panguard-guard', 'threat-cloud-cache.json');
25
+ if (!existsSync(cachePath))
26
+ return null;
27
+ const cache = JSON.parse(readFileSync(cachePath, 'utf-8'));
28
+ if (typeof cache.uniqueRulesCount === 'number' && cache.uniqueRulesCount > 0) {
29
+ return cache.uniqueRulesCount;
30
+ }
31
+ }
32
+ catch {
33
+ /* fall through to bundled count */
34
+ }
35
+ return null;
36
+ }
37
+ /**
38
+ * Locate the bundled `agent-threat-rules/rules` directory.
39
+ * Walks up from this module's own directory, mirroring report.ts so it works
40
+ * regardless of the customer's cwd (incl. global installs and pnpm layouts).
41
+ */
42
+ function findBundledRulesDir() {
43
+ const envDir = process.env['PANGUARD_ATR_RULES_DIR'];
44
+ if (envDir && existsSync(envDir) && statSync(envDir).isDirectory()) {
45
+ return envDir;
46
+ }
47
+ try {
48
+ let dir = dirname(fileURLToPath(import.meta.url));
49
+ while (dir !== sep && dir.length > 0) {
50
+ const candidate = join(dir, 'node_modules', 'agent-threat-rules', 'rules');
51
+ if (existsSync(candidate) && statSync(candidate).isDirectory()) {
52
+ return candidate;
53
+ }
54
+ const parent = dirname(dir);
55
+ if (parent === dir)
56
+ break;
57
+ dir = parent;
58
+ }
59
+ }
60
+ catch {
61
+ /* fall through */
62
+ }
63
+ return null;
64
+ }
65
+ /** Count rule YAML files under a directory tree. */
66
+ function countYamlFiles(dir) {
67
+ let count = 0;
68
+ let entries;
69
+ try {
70
+ entries = readdirSync(dir);
71
+ }
72
+ catch {
73
+ return 0;
74
+ }
75
+ for (const entry of entries) {
76
+ const full = join(dir, entry);
77
+ let st;
78
+ try {
79
+ st = statSync(full);
80
+ }
81
+ catch {
82
+ continue;
83
+ }
84
+ if (st.isDirectory()) {
85
+ count += countYamlFiles(full);
86
+ }
87
+ else if (entry.endsWith('.yaml') || entry.endsWith('.yml')) {
88
+ count += 1;
89
+ }
90
+ }
91
+ return count;
92
+ }
93
+ /** Count of bundled rules shipped with the installed `agent-threat-rules`. */
94
+ function ruleCountFromBundle() {
95
+ const rulesDir = findBundledRulesDir();
96
+ if (!rulesDir)
97
+ return null;
98
+ const count = countYamlFiles(rulesDir);
99
+ return count > 0 ? count : null;
100
+ }
101
+ /**
102
+ * Resolve the current ATR rule count for onboarding copy.
103
+ * Returns `null` only when no truthful source is available — callers should
104
+ * phrase copy so the count can be gracefully omitted.
105
+ */
106
+ export function getRuleCount() {
107
+ return ruleCountFromTcCache() ?? ruleCountFromBundle();
108
+ }
109
+ //# sourceMappingURL=rule-count.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-count.js","sourceRoot":"","sources":["../../src/init/rule-count.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@panguard-ai/panguard",
3
- "version": "1.5.5",
3
+ "version": "1.6.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -36,24 +36,25 @@
36
36
  "README.md"
37
37
  ],
38
38
  "dependencies": {
39
+ "@sentry/node": "^8.0.0",
39
40
  "commander": "^12.0.0",
40
41
  "js-yaml": "^4.1.0",
41
42
  "pdfkit": "^0.15.0",
42
43
  "zod": "^3.24.0",
43
- "@panguard-ai/core": "1.5.5",
44
- "@panguard-ai/panguard-scan": "1.5.5",
45
- "@panguard-ai/atr": "1.5.5",
46
- "@panguard-ai/panguard-guard": "1.5.5",
47
- "@panguard-ai/security-hardening": "1.5.5",
48
- "@panguard-ai/panguard-skill-auditor": "1.5.5",
49
- "@panguard-ai/panguard-chat": "1.5.5",
50
- "@panguard-ai/scan-core": "1.5.5",
51
- "@panguard-ai/panguard-mcp": "1.5.5"
44
+ "@panguard-ai/core": "1.6.0",
45
+ "@panguard-ai/panguard-scan": "1.6.0",
46
+ "@panguard-ai/atr": "1.6.0",
47
+ "@panguard-ai/panguard-guard": "1.6.0",
48
+ "@panguard-ai/panguard-chat": "1.6.0",
49
+ "@panguard-ai/security-hardening": "1.5.6",
50
+ "@panguard-ai/scan-core": "1.6.0",
51
+ "@panguard-ai/panguard-mcp": "1.6.0",
52
+ "@panguard-ai/panguard-skill-auditor": "1.6.0"
52
53
  },
53
54
  "optionalDependencies": {
54
- "agent-threat-rules": "^2.1.1",
55
- "@panguard-ai/threat-cloud": "1.5.5",
56
- "@panguard-ai/panguard-trap": "1.5.5"
55
+ "agent-threat-rules": "^3.4.0",
56
+ "@panguard-ai/threat-cloud": "1.6.0",
57
+ "@panguard-ai/panguard-trap": "1.6.0"
57
58
  },
58
59
  "devDependencies": {
59
60
  "@types/js-yaml": "^4.0.9",
@@ -65,6 +66,7 @@
65
66
  "build": "tsc --build && cp ../../CHANGELOG.md ./CHANGELOG.md 2>/dev/null || true",
66
67
  "clean": "rm -rf dist tsconfig.tsbuildinfo",
67
68
  "typecheck": "tsc --noEmit",
69
+ "test": "vitest run",
68
70
  "dev": "tsc --build --watch",
69
71
  "postinstall": "node -e \"console.log('\\n Panguard AI v' + require('./package.json').version + ' installed.\\n\\n Quick start:\\n pga Open interactive menu\\n pga up Start protection + dashboard\\n pga scan Scan your skills\\n pga audit <dir> Audit a skill before installing\\n\\n First time? Just run: pga\\n')\""
70
72
  }