@panguard-ai/panguard 0.3.7 → 0.4.1

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 (69) hide show
  1. package/dist/cli/commands/audit.d.ts.map +1 -1
  2. package/dist/cli/commands/audit.js +28 -1
  3. package/dist/cli/commands/audit.js.map +1 -1
  4. package/dist/cli/commands/serve-admin.d.ts +11 -0
  5. package/dist/cli/commands/serve-admin.d.ts.map +1 -0
  6. package/dist/cli/commands/serve-admin.js +302 -0
  7. package/dist/cli/commands/serve-admin.js.map +1 -0
  8. package/dist/cli/commands/serve-auth.d.ts +11 -0
  9. package/dist/cli/commands/serve-auth.d.ts.map +1 -0
  10. package/dist/cli/commands/serve-auth.js +119 -0
  11. package/dist/cli/commands/serve-auth.js.map +1 -0
  12. package/dist/cli/commands/serve-core.d.ts +25 -0
  13. package/dist/cli/commands/serve-core.d.ts.map +1 -0
  14. package/dist/cli/commands/serve-core.js +258 -0
  15. package/dist/cli/commands/serve-core.js.map +1 -0
  16. package/dist/cli/commands/serve-tc.d.ts +12 -0
  17. package/dist/cli/commands/serve-tc.d.ts.map +1 -0
  18. package/dist/cli/commands/serve-tc.js +296 -0
  19. package/dist/cli/commands/serve-tc.js.map +1 -0
  20. package/dist/cli/commands/serve-types.d.ts +38 -0
  21. package/dist/cli/commands/serve-types.d.ts.map +1 -0
  22. package/dist/cli/commands/serve-types.js +108 -0
  23. package/dist/cli/commands/serve-types.js.map +1 -0
  24. package/dist/cli/commands/serve.d.ts +6 -0
  25. package/dist/cli/commands/serve.d.ts.map +1 -1
  26. package/dist/cli/commands/serve.js +41 -1144
  27. package/dist/cli/commands/serve.js.map +1 -1
  28. package/dist/cli/commands/setup.js +2 -2
  29. package/dist/cli/commands/setup.js.map +1 -1
  30. package/dist/cli/interactive/actions/audit.d.ts +7 -0
  31. package/dist/cli/interactive/actions/audit.d.ts.map +1 -0
  32. package/dist/cli/interactive/actions/audit.js +198 -0
  33. package/dist/cli/interactive/actions/audit.js.map +1 -0
  34. package/dist/cli/interactive/actions/demo.d.ts +7 -0
  35. package/dist/cli/interactive/actions/demo.d.ts.map +1 -0
  36. package/dist/cli/interactive/actions/demo.js +113 -0
  37. package/dist/cli/interactive/actions/demo.js.map +1 -0
  38. package/dist/cli/interactive/actions/guard.d.ts +7 -0
  39. package/dist/cli/interactive/actions/guard.d.ts.map +1 -0
  40. package/dist/cli/interactive/actions/guard.js +164 -0
  41. package/dist/cli/interactive/actions/guard.js.map +1 -0
  42. package/dist/cli/interactive/actions/misc.d.ts +13 -0
  43. package/dist/cli/interactive/actions/misc.d.ts.map +1 -0
  44. package/dist/cli/interactive/actions/misc.js +209 -0
  45. package/dist/cli/interactive/actions/misc.js.map +1 -0
  46. package/dist/cli/interactive/actions/scan.d.ts +7 -0
  47. package/dist/cli/interactive/actions/scan.d.ts.map +1 -0
  48. package/dist/cli/interactive/actions/scan.js +143 -0
  49. package/dist/cli/interactive/actions/scan.js.map +1 -0
  50. package/dist/cli/interactive/actions/setup.d.ts +8 -0
  51. package/dist/cli/interactive/actions/setup.d.ts.map +1 -0
  52. package/dist/cli/interactive/actions/setup.js +130 -0
  53. package/dist/cli/interactive/actions/setup.js.map +1 -0
  54. package/dist/cli/interactive/lang.d.ts +11 -0
  55. package/dist/cli/interactive/lang.d.ts.map +1 -0
  56. package/dist/cli/interactive/lang.js +51 -0
  57. package/dist/cli/interactive/lang.js.map +1 -0
  58. package/dist/cli/interactive/menu-defs.d.ts +17 -0
  59. package/dist/cli/interactive/menu-defs.d.ts.map +1 -0
  60. package/dist/cli/interactive/menu-defs.js +106 -0
  61. package/dist/cli/interactive/menu-defs.js.map +1 -0
  62. package/dist/cli/interactive/render.d.ts +16 -0
  63. package/dist/cli/interactive/render.d.ts.map +1 -0
  64. package/dist/cli/interactive/render.js +145 -0
  65. package/dist/cli/interactive/render.js.map +1 -0
  66. package/dist/cli/interactive.d.ts.map +1 -1
  67. package/dist/cli/interactive.js +64 -1322
  68. package/dist/cli/interactive.js.map +1 -1
  69. package/package.json +8 -7
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Setup & MCP connection actions
3
+ * @module @panguard-ai/panguard/cli/interactive/actions/setup
4
+ */
5
+ import { c, spinner } from '@panguard-ai/core';
6
+ import { theme } from '../../theme.js';
7
+ import { breadcrumb, formatError } from '../../ux-helpers.js';
8
+ export async function actionInit(lang) {
9
+ breadcrumb(['Panguard', lang === 'zh-TW' ? '\u521D\u59CB\u8A2D\u5B9A' : 'Setup']);
10
+ const { runInitWizard } = await import('../../../init/index.js');
11
+ await runInitWizard(lang);
12
+ }
13
+ export async function actionMCPSetup(lang) {
14
+ breadcrumb(['Panguard', lang === 'zh-TW' ? 'MCP \u8A2D\u5B9A' : 'MCP Setup']);
15
+ const title = lang === 'zh-TW' ? 'AI \u4EE3\u7406\u9023\u63A5 (MCP)' : 'AI Agent Connection (MCP)';
16
+ console.log(` ${theme.brandBold(title)}`);
17
+ console.log('');
18
+ const detectSp = spinner(lang === 'zh-TW'
19
+ ? '\u6B63\u5728\u5075\u6E2C AI \u4EE3\u7406\u5E73\u53F0...'
20
+ : 'Detecting AI agent platforms...');
21
+ try {
22
+ const mcpConfig = await import('@panguard-ai/panguard-mcp/config');
23
+ const platforms = await mcpConfig.detectPlatforms();
24
+ const detected = platforms.filter((p) => p.detected);
25
+ const unconfigured = detected.filter((p) => !p.alreadyConfigured);
26
+ if (detected.length === 0) {
27
+ detectSp.warn(lang === 'zh-TW'
28
+ ? '\u672A\u5075\u6E2C\u5230\u4EFB\u4F55 AI \u4EE3\u7406\u5E73\u53F0'
29
+ : 'No AI agent platforms detected');
30
+ console.log('');
31
+ console.log(c.dim(lang === 'zh-TW'
32
+ ? ' \u652F\u63F4\u5E73\u53F0: Claude Code, Cursor, OpenClaw, Codex, WorkBuddy, NemoClaw, Claude Desktop'
33
+ : ' Supported: Claude Code, Cursor, OpenClaw, Codex, WorkBuddy, NemoClaw, Claude Desktop'));
34
+ return;
35
+ }
36
+ detectSp.succeed(lang === 'zh-TW'
37
+ ? `\u5075\u6E2C\u5230 ${detected.length} \u500B\u5E73\u53F0`
38
+ : `Found ${detected.length} platform(s)`);
39
+ console.log('');
40
+ for (const p of platforms) {
41
+ const status = p.detected
42
+ ? p.alreadyConfigured
43
+ ? c.safe('\u2713 configured')
44
+ : c.caution('~ not configured')
45
+ : c.dim('- not found');
46
+ console.log(` ${p.detected ? c.bold(p.name) : c.dim(p.name)} ${status}`);
47
+ }
48
+ console.log('');
49
+ if (unconfigured.length === 0) {
50
+ console.log(c.safe(lang === 'zh-TW'
51
+ ? ` \u2713 \u6240\u6709\u5E73\u53F0\u5DF2\u8A2D\u5B9A\u5B8C\u6210\uFF01`
52
+ : ' \u2713 All platforms already configured!'));
53
+ console.log('');
54
+ console.log(c.dim(lang === 'zh-TW'
55
+ ? ' \u91CD\u555F AI \u4EE3\u7406\u5F8C\uFF0C\u8ACB\u6C42\u300Cpanguard_status\u300D\u5373\u53EF\u9A57\u8B49\u3002'
56
+ : ' Restart your AI agent, then ask "panguard_status" to verify.'));
57
+ return;
58
+ }
59
+ const configSp = spinner(lang === 'zh-TW'
60
+ ? `\u6B63\u5728\u8A2D\u5B9A ${unconfigured.length} \u500B\u5E73\u53F0...`
61
+ : `Configuring ${unconfigured.length} platform(s)...`);
62
+ let successCount = 0;
63
+ for (const p of unconfigured) {
64
+ const result = mcpConfig.injectMCPConfig(p.id);
65
+ if (result.success)
66
+ successCount++;
67
+ }
68
+ if (successCount === unconfigured.length) {
69
+ configSp.succeed(lang === 'zh-TW'
70
+ ? `${successCount} \u500B\u5E73\u53F0\u8A2D\u5B9A\u5B8C\u6210`
71
+ : `${successCount} platform(s) configured`);
72
+ }
73
+ else {
74
+ configSp.warn(lang === 'zh-TW'
75
+ ? `${successCount}/${unconfigured.length} \u5E73\u53F0\u8A2D\u5B9A\u6210\u529F`
76
+ : `${successCount}/${unconfigured.length} platform(s) configured`);
77
+ }
78
+ console.log('');
79
+ console.log(c.dim(lang === 'zh-TW'
80
+ ? ' \u91CD\u555F AI \u4EE3\u7406\u5F8C\u5373\u53EF\u4F7F\u7528 11 \u500B panguard_* MCP \u5DE5\u5177\uFF1A'
81
+ : ' Restart your AI agent to use 11 panguard_* MCP tools:'));
82
+ const restartHints = {
83
+ 'claude-code': {
84
+ en: 'Close and reopen your terminal',
85
+ zh: '\u95DC\u9589\u4E26\u91CD\u65B0\u958B\u555F\u7D42\u7AEF\u6A5F',
86
+ },
87
+ 'claude-desktop': {
88
+ en: 'Quit and reopen Claude Desktop',
89
+ zh: '\u9000\u51FA\u4E26\u91CD\u65B0\u958B\u555F Claude Desktop',
90
+ },
91
+ cursor: {
92
+ en: 'Cmd+Shift+P (or Ctrl+Shift+P) > "Reload Window"',
93
+ zh: 'Cmd+Shift+P > "Reload Window"',
94
+ },
95
+ openclaw: {
96
+ en: 'Close and reopen OpenClaw',
97
+ zh: '\u95DC\u9589\u4E26\u91CD\u65B0\u958B\u555F OpenClaw',
98
+ },
99
+ codex: { en: 'Restart the Codex CLI session', zh: '\u91CD\u65B0\u555F\u52D5 Codex CLI' },
100
+ workbuddy: {
101
+ en: 'Close and reopen WorkBuddy',
102
+ zh: '\u95DC\u9589\u4E26\u91CD\u65B0\u958B\u555F WorkBuddy',
103
+ },
104
+ nemoclaw: {
105
+ en: 'Close and reopen NemoClaw',
106
+ zh: '\u95DC\u9589\u4E26\u91CD\u65B0\u958B\u555F NemoClaw',
107
+ },
108
+ };
109
+ for (const p of unconfigured) {
110
+ const hint = restartHints[p.id];
111
+ const text = hint
112
+ ? lang === 'zh-TW'
113
+ ? hint.zh
114
+ : hint.en
115
+ : lang === 'zh-TW'
116
+ ? '\u91CD\u65B0\u555F\u52D5\u61C9\u7528\u7A0B\u5F0F'
117
+ : 'Restart the application';
118
+ console.log(c.dim(` ${p.name}: ${text}`));
119
+ }
120
+ console.log('');
121
+ console.log(c.dim(lang === 'zh-TW'
122
+ ? ' \u8A66\u8A66\u554F AI: \u300C\u5BE9\u8A08\u9019\u500B\u5C08\u6848\u7684\u6280\u80FD\u300D\u6216\u300C\u6383\u63CF\u6211\u7684\u7CFB\u7D71\u300D'
123
+ : ' Try asking your AI: "audit the skills in this project" or "scan my system"'));
124
+ }
125
+ catch (err) {
126
+ detectSp.fail(lang === 'zh-TW' ? 'MCP \u8A2D\u5B9A\u5931\u6557' : 'MCP setup failed');
127
+ console.log(formatError(err instanceof Error ? err.message : String(err), 'MCP Setup', lang === 'zh-TW' ? '\u8ACB\u91CD\u8A66' : 'Please retry'));
128
+ }
129
+ }
130
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/cli/interactive/actions/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Language management for interactive CLI
3
+ * @module @panguard-ai/panguard/cli/interactive/lang
4
+ */
5
+ import type { Lang } from '../menu.js';
6
+ export declare function getLang(): Lang;
7
+ export declare function setLang(lang: Lang): void;
8
+ export declare function getConfigPath(): string;
9
+ export declare function detectLang(): Lang;
10
+ export declare function saveLang(lang: Lang): void;
11
+ //# sourceMappingURL=lang.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/lang.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,wBAAgB,OAAO,IAAI,IAAI,CAE9B;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAExC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,IAAI,CAYjC;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAYzC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Language management for interactive CLI
3
+ * @module @panguard-ai/panguard/cli/interactive/lang
4
+ */
5
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { homedir } from 'node:os';
8
+ const CONFIG_DIR = join(homedir(), '.panguard');
9
+ const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
10
+ let currentLang = 'en';
11
+ export function getLang() {
12
+ return currentLang;
13
+ }
14
+ export function setLang(lang) {
15
+ currentLang = lang;
16
+ }
17
+ export function getConfigPath() {
18
+ return CONFIG_PATH;
19
+ }
20
+ export function detectLang() {
21
+ if (existsSync(CONFIG_PATH)) {
22
+ try {
23
+ const data = JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));
24
+ if (data.lang === 'zh-TW' || data.lang === 'en')
25
+ return data.lang;
26
+ }
27
+ catch {
28
+ /* ignore */
29
+ }
30
+ }
31
+ const sysLang = process.env['LANG'] ?? process.env['LC_ALL'] ?? '';
32
+ if (sysLang.includes('zh'))
33
+ return 'zh-TW';
34
+ return 'en';
35
+ }
36
+ export function saveLang(lang) {
37
+ try {
38
+ let config = {};
39
+ if (existsSync(CONFIG_PATH)) {
40
+ config = JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));
41
+ }
42
+ config['lang'] = lang;
43
+ if (!existsSync(CONFIG_DIR))
44
+ mkdirSync(CONFIG_DIR, { recursive: true });
45
+ writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
46
+ }
47
+ catch {
48
+ /* best effort */
49
+ }
50
+ }
51
+ //# sourceMappingURL=lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang.js","sourceRoot":"","sources":["../../../src/cli/interactive/lang.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAChD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,IAAI,WAAW,GAAS,IAAI,CAAC;AAE7B,MAAM,UAAU,OAAO;IACrB,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAU;IAChC,WAAW,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;YAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,YAAY;QACd,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IACnE,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAU;IACjC,IAAI,CAAC;QACH,IAAI,MAAM,GAA4B,EAAE,CAAC;QACzC,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Menu definitions for interactive CLI
3
+ * @module @panguard-ai/panguard/cli/interactive/menu-defs
4
+ */
5
+ export interface MenuDef {
6
+ key: string;
7
+ icon: string;
8
+ number: number;
9
+ en: string;
10
+ zh: string;
11
+ enDesc: string;
12
+ zhDesc: string;
13
+ tierBadge: string;
14
+ featureKey: string;
15
+ }
16
+ export declare const MENU_DEFS: MenuDef[];
17
+ //# sourceMappingURL=menu-defs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-defs.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/menu-defs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,EAAE,OAAO,EAqG9B,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Menu definitions for interactive CLI
3
+ * @module @panguard-ai/panguard/cli/interactive/menu-defs
4
+ */
5
+ export const MENU_DEFS = [
6
+ {
7
+ key: 'setup',
8
+ icon: '>',
9
+ number: 0,
10
+ en: 'Setup Wizard',
11
+ zh: '\u521D\u59CB\u8A2D\u5B9A',
12
+ enDesc: 'Configure all modules with guided setup',
13
+ zhDesc: '\u958B\u555F\u6B64\u5F15\u64CE\uFF0C\u81EA\u52D5\u914D\u7F6E\u6240\u6709\u6A21\u7D44',
14
+ tierBadge: '',
15
+ featureKey: 'setup',
16
+ },
17
+ {
18
+ key: 'scan',
19
+ icon: '\u26A1',
20
+ number: 1,
21
+ en: 'Security Scan',
22
+ zh: '\u5B89\u5168\u6383\u63CF',
23
+ enDesc: 'Scan system security and analyze risks',
24
+ zhDesc: '\u6383\u63CF\u7CFB\u7D71\u5B89\u5168\u72C0\u614B\uFF0C\u5206\u6790\u6240\u6709\u98A8\u96AA',
25
+ tierBadge: '',
26
+ featureKey: 'scan',
27
+ },
28
+ {
29
+ key: 'report',
30
+ icon: '\u25A0',
31
+ number: 2,
32
+ en: 'Compliance Report [Coming Soon]',
33
+ zh: '\u5408\u898F\u5831\u544A [\u5373\u5C07\u63A8\u51FA]',
34
+ enDesc: 'ISO 27001, SOC 2, TW Cyber Security Act — under development',
35
+ zhDesc: 'ISO 27001\u3001SOC 2\u3001\u8CC7\u5B89\u7BA1\u7406\u6CD5 \u2014 \u958B\u767C\u4E2D',
36
+ tierBadge: '',
37
+ featureKey: 'report',
38
+ },
39
+ {
40
+ key: 'guard',
41
+ icon: '\u2713',
42
+ number: 3,
43
+ en: 'Guard Engine',
44
+ zh: '\u5B88\u8B77\u5F15\u64CE',
45
+ enDesc: 'Real-time monitoring and continuous protection',
46
+ zhDesc: '\u5373\u6642\u76E3\u63A7\u9023\u7E8C\u9632\u8B77\u7CFB\u7D71',
47
+ tierBadge: '',
48
+ featureKey: 'guard',
49
+ },
50
+ {
51
+ key: 'trap',
52
+ icon: '\u00B7',
53
+ number: 4,
54
+ en: 'Honeypot System [Coming Soon]',
55
+ zh: '\u871C\u7F50\u7CFB\u7D71 [\u5373\u5C07\u63A8\u51FA]',
56
+ enDesc: 'Decoy services to detect attackers — under development',
57
+ zhDesc: '\u8A98\u990C\u670D\u52D9\u5075\u6E2C\u653B\u64CA\u8005 \u2014 \u958B\u767C\u4E2D',
58
+ tierBadge: '',
59
+ featureKey: 'trap',
60
+ },
61
+ {
62
+ key: 'notify',
63
+ icon: '\u00B7',
64
+ number: 5,
65
+ en: 'Notifications',
66
+ zh: '\u901A\u77E5\u7CFB\u7D71',
67
+ enDesc: 'LINE, Telegram, Slack, Email, Webhook channels',
68
+ zhDesc: 'LINE\u3001Telegram\u3001Slack\u3001Email\u3001Webhook \u901A\u77E5\u7BA1\u9053',
69
+ tierBadge: '',
70
+ featureKey: 'notify',
71
+ },
72
+ {
73
+ key: 'threat-cloud',
74
+ icon: '\u00B7',
75
+ number: 6,
76
+ en: 'Threat Cloud',
77
+ zh: '\u5A01\u8105\u60C5\u5831',
78
+ enDesc: 'Threat intelligence REST API server',
79
+ zhDesc: '\u5A01\u8105\u60C5\u5831 REST API \u4F3A\u670D\u5668',
80
+ tierBadge: '',
81
+ featureKey: 'threat-cloud',
82
+ },
83
+ {
84
+ key: 'demo',
85
+ icon: '\u00B7',
86
+ number: 7,
87
+ en: 'Auto Demo',
88
+ zh: '\u81EA\u52D5\u5C55\u793A',
89
+ enDesc: 'Run through all security modules',
90
+ zhDesc: '\u81EA\u52D5\u57F7\u884C\u7D9C\u5408\u529F\u80FD\u5C55\u793A',
91
+ tierBadge: '',
92
+ featureKey: 'demo',
93
+ },
94
+ {
95
+ key: 'audit',
96
+ icon: '\u25A0',
97
+ number: 8,
98
+ en: 'Skill Auditor',
99
+ zh: '\u6280\u80FD\u5BE9\u8A08',
100
+ enDesc: 'Audit AI agent skills for security issues',
101
+ zhDesc: '\u5BE9\u8A08 AI \u4EE3\u7406\u6280\u80FD\u7684\u5B89\u5168\u554F\u984C',
102
+ tierBadge: '',
103
+ featureKey: 'audit',
104
+ },
105
+ ];
106
+ //# sourceMappingURL=menu-defs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu-defs.js","sourceRoot":"","sources":["../../../src/cli/interactive/menu-defs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC;QACE,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,cAAc;QAClB,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,yCAAyC;QACjD,MAAM,EAAE,sFAAsF;QAC9F,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,OAAO;KACpB;IACD;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,eAAe;QACnB,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,wCAAwC;QAChD,MAAM,EACJ,4FAA4F;QAC9F,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,MAAM;KACnB;IACD;QACE,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,iCAAiC;QACrC,EAAE,EAAE,qDAAqD;QACzD,MAAM,EAAE,6DAA6D;QACrE,MAAM,EAAE,oFAAoF;QAC5F,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,QAAQ;KACrB;IACD;QACE,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,cAAc;QAClB,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,gDAAgD;QACxD,MAAM,EAAE,8DAA8D;QACtE,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,OAAO;KACpB;IACD;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,+BAA+B;QACnC,EAAE,EAAE,qDAAqD;QACzD,MAAM,EAAE,wDAAwD;QAChE,MAAM,EAAE,kFAAkF;QAC1F,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,MAAM;KACnB;IACD;QACE,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,eAAe;QACnB,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,gDAAgD;QACxD,MAAM,EAAE,gFAAgF;QACxF,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,QAAQ;KACrB;IACD;QACE,GAAG,EAAE,cAAc;QACnB,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,cAAc;QAClB,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,qCAAqC;QAC7C,MAAM,EAAE,sDAAsD;QAC9D,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,cAAc;KAC3B;IACD;QACE,GAAG,EAAE,MAAM;QACX,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,WAAW;QACf,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,kCAAkC;QAC1C,MAAM,EAAE,8DAA8D;QACtE,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,MAAM;KACnB;IACD;QACE,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC;QACT,EAAE,EAAE,eAAe;QACnB,EAAE,EAAE,0BAA0B;QAC9B,MAAM,EAAE,2CAA2C;QACnD,MAAM,EAAE,wEAAwE;QAChF,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,OAAO;KACpB;CACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Rendering functions for interactive CLI UI
3
+ * @module @panguard-ai/panguard/cli/interactive/render
4
+ */
5
+ import type { Lang } from '../menu.js';
6
+ export declare function isGuardRunning(): {
7
+ running: boolean;
8
+ pid?: number;
9
+ };
10
+ export declare function isMCPConfigured(): Promise<boolean>;
11
+ export declare function renderStatusPanel(lang: Lang): void;
12
+ export declare function renderMenu(lang: Lang): void;
13
+ export declare function renderFooter(lang: Lang): void;
14
+ export declare function showHelp(lang: Lang): void;
15
+ export declare function renderStartup(lang: Lang): void;
16
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/cli/interactive/render.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAUnE;AAMD,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAUxD;AAMD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAuBlD;AAMD,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAe3C;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAO7C;AAMD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAgDzC;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAU9C"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Rendering functions for interactive CLI UI
3
+ * @module @panguard-ai/panguard/cli/interactive/render
4
+ */
5
+ import { existsSync, readFileSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { homedir } from 'node:os';
8
+ import { c, box } from '@panguard-ai/core';
9
+ import { PANGUARD_VERSION } from '../../index.js';
10
+ import { renderLogo, theme } from '../theme.js';
11
+ import { moduleCountDisplay } from '../ux-helpers.js';
12
+ import { MENU_DEFS } from './menu-defs.js';
13
+ // ---------------------------------------------------------------------------
14
+ // Guard process helpers
15
+ // ---------------------------------------------------------------------------
16
+ export function isGuardRunning() {
17
+ const pidPath = join(homedir(), '.panguard-guard', 'panguard-guard.pid');
18
+ if (!existsSync(pidPath))
19
+ return { running: false };
20
+ try {
21
+ const pid = parseInt(readFileSync(pidPath, 'utf-8').trim(), 10);
22
+ process.kill(pid, 0);
23
+ return { running: true, pid };
24
+ }
25
+ catch {
26
+ return { running: false };
27
+ }
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // MCP detection helper
31
+ // ---------------------------------------------------------------------------
32
+ export async function isMCPConfigured() {
33
+ try {
34
+ const mcpConfig = await import('@panguard-ai/panguard-mcp/config');
35
+ const platforms = await mcpConfig.detectPlatforms();
36
+ return platforms.some((p) => p.detected && p.alreadyConfigured);
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ // ---------------------------------------------------------------------------
43
+ // Status panel with box border
44
+ // ---------------------------------------------------------------------------
45
+ export function renderStatusPanel(lang) {
46
+ const guardStatus = isGuardRunning();
47
+ const modulesValue = moduleCountDisplay(lang);
48
+ const guardLine = guardStatus.running
49
+ ? `${c.safe('PROTECTED')} ${c.dim(`(PID: ${guardStatus.pid})`)}`
50
+ : c.dim('Inactive');
51
+ const lines = lang === 'zh-TW'
52
+ ? [
53
+ `\u9632\u8B77\u72C0\u614B\uFF1A${guardLine}`,
54
+ `\u53EF\u7528\u6A21\u7D44\uFF1A${modulesValue}`,
55
+ `\u7248\u672C\uFF1A v${PANGUARD_VERSION}`,
56
+ ]
57
+ : [
58
+ `Protection: ${guardLine}`,
59
+ `Modules: ${modulesValue}`,
60
+ `Version: v${PANGUARD_VERSION}`,
61
+ ];
62
+ const title = lang === 'zh-TW' ? '\u7CFB\u7D71\u72C0\u614B / System Status' : 'System Status';
63
+ console.log(box(lines.join('\n'), { borderColor: c.sage, title }));
64
+ }
65
+ // ---------------------------------------------------------------------------
66
+ // Menu rendering
67
+ // ---------------------------------------------------------------------------
68
+ export function renderMenu(lang) {
69
+ const titleText = lang === 'zh-TW' ? '\u4E3B\u9078\u55AE / Main Menu' : 'Main Menu';
70
+ console.log(` ${theme.title(titleText)}`);
71
+ console.log('');
72
+ for (const def of MENU_DEFS) {
73
+ const name = lang === 'zh-TW' ? def.zh : def.en;
74
+ const desc = lang === 'zh-TW' ? def.zhDesc : def.enDesc;
75
+ const badge = def.tierBadge ? ` ${c.dim(def.tierBadge)}` : '';
76
+ const iconStr = def.icon === '\u2713' ? c.safe(def.icon) : c.dim(def.icon);
77
+ console.log(` ${iconStr} ${c.sage(`[${def.number}]`)} ${name}${badge}`);
78
+ console.log(` ${c.dim(desc)}`);
79
+ console.log('');
80
+ }
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Footer shortcuts
84
+ // ---------------------------------------------------------------------------
85
+ export function renderFooter(lang) {
86
+ const quit = lang === 'zh-TW' ? '\u9000\u51FA' : 'Quit';
87
+ const help = lang === 'zh-TW' ? '\u8AAA\u660E' : 'Help';
88
+ const langToggle = '\u4E2D/EN';
89
+ console.log(`${c.dim(`[q] ${quit} [h] ${help} [b] ${langToggle}`)}`);
90
+ console.log('');
91
+ }
92
+ // ---------------------------------------------------------------------------
93
+ // Help display
94
+ // ---------------------------------------------------------------------------
95
+ export function showHelp(lang) {
96
+ console.log('');
97
+ const title = lang === 'zh-TW' ? '\u6307\u4EE4\u8AAA\u660E' : 'Available Commands';
98
+ console.log(` ${theme.brandBold(title)}`);
99
+ console.log('');
100
+ const menuTitle = lang === 'zh-TW' ? '\u4E3B\u9078\u55AE' : 'Main Menu';
101
+ console.log(` ${c.sage(menuTitle)}`);
102
+ console.log(c.dim(lang === 'zh-TW'
103
+ ? ' [0]-[8] \u6309\u6578\u5B57\u9375\u5373\u523B\u9078\u64C7\uFF08\u4E0D\u9700\u6309 Enter\uFF09'
104
+ : ' [0]-[8] Press number key to select instantly (no Enter needed)'));
105
+ console.log('');
106
+ const promptTitle = lang === 'zh-TW' ? '\u6587\u5B57\u6307\u4EE4' : 'Text Commands';
107
+ console.log(` ${c.sage(promptTitle)}`);
108
+ const cmds = [
109
+ {
110
+ cmd: 'setup',
111
+ en: 'Connect AI agents via MCP',
112
+ zh: '\u900F\u904E MCP \u9023\u63A5 AI \u4EE3\u7406',
113
+ },
114
+ { cmd: 'audit', en: 'Audit AI agent skills', zh: '\u5BE9\u8A08 AI \u4EE3\u7406\u6280\u80FD' },
115
+ { cmd: 'status', en: 'System status overview', zh: '\u7CFB\u7D71\u72C0\u614B\u7E3D\u89BD' },
116
+ { cmd: 'config', en: 'Settings management', zh: '\u8A2D\u5B9A\u7BA1\u7406' },
117
+ { cmd: 'hardening', en: 'Security hardening', zh: '\u5B89\u5168\u52A0\u56FA' },
118
+ { cmd: 'doctor', en: 'Health diagnostics', zh: '\u5065\u5EB7\u8A3A\u65B7' },
119
+ { cmd: 'help', en: 'Show this help', zh: '\u986F\u793A\u6B64\u8AAA\u660E' },
120
+ ];
121
+ for (const { cmd, en, zh } of cmds) {
122
+ const desc = lang === 'zh-TW' ? zh : en;
123
+ console.log(` ${c.sage(cmd.padEnd(14))} ${c.dim(desc)}`);
124
+ }
125
+ const shortcutTitle = lang === 'zh-TW' ? '\u5FEB\u6377\u9375' : 'Shortcuts';
126
+ console.log('');
127
+ console.log(` ${c.sage(shortcutTitle)}`);
128
+ console.log(c.dim(` [q] ${lang === 'zh-TW' ? '\u9000\u51FA' : 'Quit'} [h] ${lang === 'zh-TW' ? '\u8AAA\u660E' : 'Help'} [b] ${lang === 'zh-TW' ? '\u5207\u63DB\u8A9E\u8A00' : 'Toggle language'}`));
129
+ console.log('');
130
+ }
131
+ // ---------------------------------------------------------------------------
132
+ // Startup screen
133
+ // ---------------------------------------------------------------------------
134
+ export function renderStartup(lang) {
135
+ console.clear();
136
+ renderLogo();
137
+ console.log('');
138
+ console.log(c.dim(' AI-Powered Security Platform'));
139
+ console.log('');
140
+ renderStatusPanel(lang);
141
+ console.log('');
142
+ renderMenu(lang);
143
+ renderFooter(lang);
144
+ }
145
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/cli/interactive/render.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA2WH,wBAAsB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsHnE"}
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA+BH,wBAAsB,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmHnE"}