@guardion/guardion 0.3.0 → 0.4.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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +202 -0
  3. package/dist/bin/cli.d.ts.map +1 -0
  4. package/dist/bin/cli.js +590 -0
  5. package/dist/bin/cli.js.map +1 -0
  6. package/dist/connectors/claude-code/hooks/enforce.cjs +58 -0
  7. package/{hooks → dist/connectors/claude-code/hooks}/guardion-hook.cjs +123 -1
  8. package/dist/connectors/claude-code/hooks/tool-scanner.cjs +272 -0
  9. package/dist/connectors/claude-code/src/collect.d.ts +5 -0
  10. package/dist/connectors/claude-code/src/collect.d.ts.map +1 -0
  11. package/dist/connectors/claude-code/src/collect.js +17 -0
  12. package/dist/connectors/claude-code/src/collect.js.map +1 -0
  13. package/dist/{installer.d.ts → connectors/claude-code/src/installer.d.ts} +1 -1
  14. package/dist/connectors/claude-code/src/installer.d.ts.map +1 -0
  15. package/dist/{installer.js → connectors/claude-code/src/installer.js} +2 -2
  16. package/dist/connectors/claude-code/src/installer.js.map +1 -0
  17. package/dist/connectors/claude-code/src/scanner.d.ts.map +1 -0
  18. package/dist/{scanner.js → connectors/claude-code/src/scanner.js} +1 -1
  19. package/dist/connectors/claude-code/src/scanner.js.map +1 -0
  20. package/dist/{config.d.ts → core/config.d.ts} +96 -0
  21. package/dist/core/config.d.ts.map +1 -0
  22. package/dist/{config.js → core/config.js} +44 -0
  23. package/dist/core/config.js.map +1 -0
  24. package/dist/{constants.d.ts → core/constants.d.ts} +1 -1
  25. package/dist/core/constants.d.ts.map +1 -0
  26. package/dist/{constants.js → core/constants.js} +1 -1
  27. package/dist/core/constants.js.map +1 -0
  28. package/dist/core/discover.d.ts +36 -0
  29. package/dist/core/discover.d.ts.map +1 -0
  30. package/dist/core/discover.js +154 -0
  31. package/dist/core/discover.js.map +1 -0
  32. package/dist/core/fingerprint.cjs +84 -0
  33. package/dist/core/inventory.d.ts +35 -0
  34. package/dist/core/inventory.d.ts.map +1 -0
  35. package/dist/core/inventory.js +69 -0
  36. package/dist/core/inventory.js.map +1 -0
  37. package/dist/core/keychain.d.ts.map +1 -0
  38. package/dist/core/keychain.js.map +1 -0
  39. package/dist/core/mcp/guard-client.cjs +86 -0
  40. package/dist/core/mcp/interceptor.cjs +238 -0
  41. package/dist/core/mcp/jsonrpc.cjs +194 -0
  42. package/dist/core/mcp/transport/http-server-side.cjs +89 -0
  43. package/dist/core/mcp/transport/http-upstream.cjs +111 -0
  44. package/dist/core/mcp/transport/http_forward.cjs +40 -0
  45. package/dist/core/mcp/transport/http_input.cjs +46 -0
  46. package/dist/core/mcp/transport/http_reverse.cjs +33 -0
  47. package/dist/core/mcp/transport/index.cjs +32 -0
  48. package/dist/core/mcp/transport/sse_bridge.cjs +101 -0
  49. package/dist/core/mcp/transport/stdio.cjs +60 -0
  50. package/dist/core/mcp-interpose.cjs +141 -0
  51. package/dist/core/mcp-protect.d.ts +69 -0
  52. package/dist/core/mcp-protect.d.ts.map +1 -0
  53. package/dist/core/mcp-protect.js +205 -0
  54. package/dist/core/mcp-protect.js.map +1 -0
  55. package/dist/core/mcp-scan.d.ts +40 -0
  56. package/dist/core/mcp-scan.d.ts.map +1 -0
  57. package/dist/core/mcp-scan.js +201 -0
  58. package/dist/core/mcp-scan.js.map +1 -0
  59. package/dist/core/mock-server.d.ts.map +1 -0
  60. package/dist/{mock-server.js → core/mock-server.js} +41 -0
  61. package/dist/core/mock-server.js.map +1 -0
  62. package/package.json +9 -10
  63. package/config.yaml.example +0 -84
  64. package/dist/cli.d.ts.map +0 -1
  65. package/dist/cli.js +0 -298
  66. package/dist/cli.js.map +0 -1
  67. package/dist/config.d.ts.map +0 -1
  68. package/dist/config.js.map +0 -1
  69. package/dist/constants.d.ts.map +0 -1
  70. package/dist/constants.js.map +0 -1
  71. package/dist/installer.d.ts.map +0 -1
  72. package/dist/installer.js.map +0 -1
  73. package/dist/keychain.d.ts.map +0 -1
  74. package/dist/keychain.js.map +0 -1
  75. package/dist/mock-server.d.ts.map +0 -1
  76. package/dist/mock-server.js.map +0 -1
  77. package/dist/scanner.d.ts.map +0 -1
  78. package/dist/scanner.js.map +0 -1
  79. /package/dist/{cli.d.ts → bin/cli.d.ts} +0 -0
  80. /package/dist/{scanner.d.ts → connectors/claude-code/src/scanner.d.ts} +0 -0
  81. /package/dist/{keychain.d.ts → core/keychain.d.ts} +0 -0
  82. /package/dist/{keychain.js → core/keychain.js} +0 -0
  83. /package/{hooks → dist/core}/metadata.cjs +0 -0
  84. /package/dist/{mock-server.d.ts → core/mock-server.d.ts} +0 -0
@@ -0,0 +1,590 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import readline from 'node:readline';
5
+ import fs from 'node:fs';
6
+ import https from 'node:https';
7
+ import http from 'node:http';
8
+ import path from 'node:path';
9
+ import { spawnSync } from 'node:child_process';
10
+ import { fileURLToPath } from 'node:url';
11
+ import { GUARDION_VERSION, TOKEN_PREFIX, DEFAULT_API_URL, DEV_API_URL, DEV_GATEWAY_URL, DEFAULT_GATEWAY_URL, ALL_HOOK_EVENTS, } from '../core/constants.js';
12
+ import { writeConfig, readConfig, DEFAULT_GATEWAY, DEFAULT_INVENTORY_CONFIG, } from '../core/config.js';
13
+ import { getToken, setToken, clearToken } from '../core/keychain.js';
14
+ import { submitInventory } from '../core/inventory.js';
15
+ // Claude Code connector
16
+ import { scan as scanSettings } from '../connectors/claude-code/src/scanner.js';
17
+ import { collectInventory } from '../connectors/claude-code/src/collect.js';
18
+ import { patch, backup, restore, writeSettings, removeGuardionEntries, } from '../connectors/claude-code/src/installer.js';
19
+ const ok = (m) => console.log(chalk.green('✓ ') + m);
20
+ const warn = (m) => console.log(chalk.yellow('⚠ ') + m);
21
+ const err = (m) => console.error(chalk.red('✗ ') + m);
22
+ const log = (m) => console.log(m);
23
+ // ── `guardion mcp …` — runtime DLP wrapper ──────────────────────────────────────
24
+ // Passthrough to the interposer BEFORE commander parses argv, so `--`, child flags,
25
+ // and the long-running stdio bridge all behave. This is the command injected into
26
+ // MCP configs by `guardion scan --mode mcp --replace`.
27
+ if (process.argv[2] === 'mcp') {
28
+ const interposer = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'core', 'mcp-interpose.cjs');
29
+ const r = spawnSync(process.execPath, [interposer, ...process.argv.slice(3)], { stdio: 'inherit' });
30
+ process.exit(r.status ?? 0);
31
+ }
32
+ const program = new Command();
33
+ async function promptInput(question) {
34
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
35
+ return new Promise(resolve => {
36
+ rl.question(chalk.cyan(question), answer => { rl.close(); resolve(answer.trim()); });
37
+ });
38
+ }
39
+ async function promptSelect(question, options) {
40
+ log('\n' + chalk.bold(question));
41
+ options.forEach((o, i) => log(` ${chalk.cyan(String(i + 1))}) ${o.label}`));
42
+ const ans = await promptInput(`Choose [1-${options.length}] (default 1): `);
43
+ const idx = Math.max(1, Math.min(options.length, parseInt(ans || '1', 10) || 1)) - 1;
44
+ return options[idx].value;
45
+ }
46
+ // ── claude-code: hooks / gateway install ────────────────────────────────────────
47
+ async function runClaudeCodeStatus() {
48
+ log(chalk.bold('\n Guardion · Claude Code status\n'));
49
+ const cfg = readConfig();
50
+ const token = getToken();
51
+ const result = scanSettings();
52
+ if (result.hasExistingGuardion)
53
+ ok('Guardion is ' + chalk.green('ACTIVE'));
54
+ else
55
+ log(' Guardion is ' + chalk.dim('NOT CONFIGURED'));
56
+ log(` Mode ${cfg?.tier ? chalk.cyan(cfg.tier) : chalk.dim('(not set)')}`);
57
+ log(` Guard API ${cfg?.api_url ? chalk.cyan(cfg.api_url) : chalk.dim('(not set)')}`);
58
+ log(` Policy ${cfg?.policy ? chalk.cyan(cfg.policy) : chalk.dim('(not set)')}`);
59
+ log(` Token ${token ? chalk.green('found') : chalk.red('NOT FOUND')}`);
60
+ const hookCount = Object.keys(result.settings?.hooks ?? {}).length;
61
+ log(` Hooks ${hookCount > 0 ? chalk.cyan(hookCount + ' events') : chalk.dim('none')}\n`);
62
+ }
63
+ function runClaudeCodeUninstall(opts) {
64
+ log(chalk.bold('\n Guardion · Claude Code uninstall\n'));
65
+ const result = scanSettings();
66
+ const restored = restore(result.settingsPath);
67
+ if (restored)
68
+ ok(`Restored settings from ${restored}`);
69
+ else if (result.settings) {
70
+ writeSettings(result.settingsPath, removeGuardionEntries(result.settings));
71
+ ok('Removed Guardion entries from settings');
72
+ }
73
+ else
74
+ warn('No settings file found');
75
+ try {
76
+ fs.unlinkSync(path.join(process.env.HOME || '~', '.guardion', 'config.yaml'));
77
+ }
78
+ catch { }
79
+ try {
80
+ fs.unlinkSync(path.join(process.env.HOME || '~', '.guardion', 'config.json'));
81
+ }
82
+ catch { }
83
+ ok('Removed ~/.guardion/config.yaml');
84
+ if (opts.clearToken) {
85
+ clearToken();
86
+ ok('Cleared token');
87
+ }
88
+ log('');
89
+ ok('Uninstall complete.\n');
90
+ }
91
+ async function runClaudeCodeInstall(opts) {
92
+ log(chalk.bold('\n Guardion · Claude Code\n'));
93
+ // mode → tier: hooks = events only; gateway/full = also route LLM via gateway.
94
+ const mode = (opts.mode || 'hooks');
95
+ if (!['hooks', 'gateway', 'full'].includes(mode)) {
96
+ err(`Unknown --mode "${mode}". Valid: hooks, gateway, full`);
97
+ process.exit(1);
98
+ }
99
+ const tier = mode === 'hooks' ? 'hooks' : 'full';
100
+ let token = opts.token || process.env.GUARDION_TOKEN || getToken();
101
+ if (!token)
102
+ token = await promptInput('Enter your Guardion token: ');
103
+ if (!token) {
104
+ err('Token is required.');
105
+ process.exit(1);
106
+ }
107
+ if (!opts.dev && !token.startsWith(TOKEN_PREFIX)) {
108
+ warn(`Token doesn't start with "${TOKEN_PREFIX}" — double-check it's correct.`);
109
+ }
110
+ const apiUrl = opts.dev ? DEV_API_URL : (opts.apiUrl || readConfig()?.api_url || DEFAULT_API_URL);
111
+ const gatewayUrl = opts.dev ? DEV_GATEWAY_URL : (opts.gatewayUrl || readConfig()?.gateway?.url || DEFAULT_GATEWAY_URL);
112
+ const mcpUrl = opts.dev ? 'http://localhost:8082/mcp' : DEFAULT_GATEWAY.mcp_url;
113
+ const hookEvents = opts.hooks
114
+ ? opts.hooks.split(',').map((e) => e.trim()).filter((e) => ALL_HOOK_EVENTS.includes(e))
115
+ : [...ALL_HOOK_EVENTS];
116
+ const cfg = {
117
+ version: 1,
118
+ tier,
119
+ api_url: apiUrl,
120
+ policy: opts.policy || 'prompt-defense',
121
+ application: opts.application || 'claude-code',
122
+ enforce: opts.enforce === true,
123
+ fail_closed: opts.failClosed === true,
124
+ hooks: { events: hookEvents, timeout_ms: 3000 },
125
+ ...(tier === 'full' ? {
126
+ gateway: {
127
+ url: gatewayUrl, mcp_url: mcpUrl,
128
+ provider: (opts.provider || 'anthropic'),
129
+ vertex_project_id: opts.vertexProject || '',
130
+ vertex_region: opts.vertexRegion || '',
131
+ },
132
+ } : {}),
133
+ };
134
+ const scanResult = scanSettings();
135
+ if (scanResult.hasExistingGuardion)
136
+ warn('Guardion already configured — overwriting.');
137
+ const patched = patch(scanResult, { config: cfg, token, dev: opts.dev, dryRun: opts.dryRun });
138
+ if (opts.dryRun) {
139
+ log(chalk.bold('\n Would write ~/.claude/settings.json:'));
140
+ log(JSON.stringify(patched, null, 2));
141
+ log(chalk.bold('\n Would write ~/.guardion/config.yaml:'));
142
+ log(JSON.stringify(cfg, null, 2));
143
+ log(chalk.dim('\n (dry-run — no changes made)'));
144
+ return;
145
+ }
146
+ try {
147
+ setToken(token);
148
+ ok('Token stored in OS keychain');
149
+ }
150
+ catch {
151
+ const tokenFile = path.join(process.env.HOME || '~', '.guardion', 'token');
152
+ fs.mkdirSync(path.dirname(tokenFile), { recursive: true });
153
+ fs.writeFileSync(tokenFile, token, { encoding: 'utf-8', mode: 0o600 });
154
+ ok('Token written to ~/.guardion/token');
155
+ }
156
+ const backupPath = backup(scanResult.settingsPath);
157
+ if (backupPath)
158
+ ok(`Backed up settings → ${backupPath}`);
159
+ writeSettings(scanResult.settingsPath, patched);
160
+ ok(`Patched ${scanResult.settingsPath}`);
161
+ writeConfig(cfg);
162
+ ok('Wrote ~/.guardion/config.yaml');
163
+ log('');
164
+ log(` Mode ${chalk.cyan(mode)}`);
165
+ log(` Guard API ${chalk.cyan(apiUrl)}`);
166
+ log(` Policy ${chalk.cyan(cfg.policy)}`);
167
+ log(` Hooks ${chalk.cyan(hookEvents.length + ' events')}`);
168
+ if (opts.dev)
169
+ log(`\n ${chalk.yellow('Dev mode')} — pointing at local Docker stack`);
170
+ log('');
171
+ ok('Guardion is ready.\n');
172
+ }
173
+ program
174
+ .command('claude-code')
175
+ .description('Install Guardion in Claude Code (hooks / gateway)')
176
+ .option('--mode <mode>', 'hooks | gateway | full', 'hooks')
177
+ .option('--token <token>', 'Guardion API token (stored in OS keychain)')
178
+ .option('--policy <policy>', 'Policy slug', 'prompt-defense')
179
+ .option('--application <name>', 'Application label', 'claude-code')
180
+ .option('--api-url <url>', `Guard API URL (default: ${DEFAULT_API_URL})`)
181
+ .option('--gateway-url <url>', `Gateway URL (gateway/full)`)
182
+ .option('--provider <provider>', 'LLM provider (gateway/full): anthropic | vertex-ai | bedrock', 'anthropic')
183
+ .option('--vertex-project <id>', 'GCP project ID (vertex-ai only)')
184
+ .option('--vertex-region <region>', 'GCP region (vertex-ai only)')
185
+ .option('--hooks <events>', 'Comma-separated hook events (default: all)')
186
+ .option('--enforce', 'Block/warn on tool input+output via synchronous Guard eval', false)
187
+ .option('--fail-closed', 'Deny when Guard is unreachable (default: fail-open)', false)
188
+ .option('--dev', 'Use local Docker stack', false)
189
+ .option('--dry-run', 'Print what would be written, no changes', false)
190
+ .option('--status', 'Show installation status', false)
191
+ .option('--uninstall', 'Remove Guardion and restore settings', false)
192
+ .option('--clear-token', 'With --uninstall, also remove the token', false)
193
+ .action(async (opts) => {
194
+ if (opts.status)
195
+ return runClaudeCodeStatus();
196
+ if (opts.uninstall)
197
+ return runClaudeCodeUninstall(opts);
198
+ return runClaudeCodeInstall(opts);
199
+ });
200
+ // ── scan: unified discovery (--mode full|mcp|tools|agents|skills) ────────────────
201
+ async function scanTools(opts, skillsOnly = false) {
202
+ const cfg = readConfig();
203
+ const inv = { ...DEFAULT_INVENTORY_CONFIG, ...(cfg?.inventory ?? {}) };
204
+ if (skillsOnly) {
205
+ inv.scan_mcp = false;
206
+ inv.scan_plugins = false;
207
+ inv.scan_builtins = false;
208
+ }
209
+ let tools = collectInventory(process.cwd(), inv);
210
+ if (skillsOnly)
211
+ tools = tools.filter((t) => t.source === 'skill');
212
+ if (opts.json) {
213
+ log(JSON.stringify(tools, null, 2));
214
+ }
215
+ else {
216
+ log(chalk.bold(`\n ${skillsOnly ? 'Skills' : 'Local tool inventory'} (${tools.length})\n`));
217
+ for (const t of tools)
218
+ log(` ${chalk.cyan(t.source.padEnd(10))} ${chalk.bold(t.name)}`);
219
+ log('');
220
+ }
221
+ if (!(opts.inventory || opts.send)) {
222
+ log(chalk.dim(' (use --inventory to push to Guard)\n'));
223
+ return;
224
+ }
225
+ const token = getToken();
226
+ if (!token) {
227
+ err('No token found. Run: guardion token set <token>');
228
+ process.exit(1);
229
+ }
230
+ const apiUrl = opts.dev ? DEV_API_URL : (cfg?.api_url ?? DEFAULT_API_URL);
231
+ log(`Sending ${tools.length} tools to ${chalk.cyan(apiUrl + '/v1/guard')} ...`);
232
+ const res = await submitInventory({ apiUrl, token, tools, policy: cfg?.policy, application: cfg?.application });
233
+ if (res.status >= 200 && res.status < 300)
234
+ ok(`Guard API responded ${res.status}`);
235
+ else {
236
+ err(`Guard API rejected the inventory (HTTP ${res.status})`);
237
+ process.exit(1);
238
+ }
239
+ }
240
+ async function scanAgents(opts) {
241
+ const { discover, submitDiscovery } = await import('../core/discover.js');
242
+ const scanners = String(opts.scanner || 'process,config,repo').split(',').map((s) => s.trim());
243
+ const agents = discover({ scanners });
244
+ if (opts.json) {
245
+ log(JSON.stringify(agents, null, 2));
246
+ }
247
+ else {
248
+ log(chalk.bold(`\n Shadow-AI discovery (${agents.length} agents)\n`));
249
+ if (agents.length === 0)
250
+ log(chalk.dim(' (none found)'));
251
+ for (const a of agents) {
252
+ const c = a.risk_level === 'high' || a.risk_level === 'critical' ? chalk.red
253
+ : a.risk_level === 'medium' ? chalk.yellow : chalk.dim;
254
+ log(` ${chalk.cyan(a.scanner.padEnd(8))} ${chalk.bold((a.agent_type || '').padEnd(16))} ${c(a.risk_level.padEnd(7))} ${chalk.dim(a.evidence)}`);
255
+ }
256
+ log('');
257
+ }
258
+ if (!(opts.inventory || opts.send)) {
259
+ log(chalk.dim(' (use --inventory to report to Guard)\n'));
260
+ return;
261
+ }
262
+ if (agents.length === 0) {
263
+ warn('Nothing to send.');
264
+ return;
265
+ }
266
+ const cfg = readConfig();
267
+ const token = getToken();
268
+ if (!token) {
269
+ err('No token found. Run: guardion token set <token>');
270
+ process.exit(1);
271
+ }
272
+ const apiUrl = opts.dev ? DEV_API_URL : (cfg?.api_url ?? DEFAULT_API_URL);
273
+ log(`Sending ${agents.length} agents to ${chalk.cyan(apiUrl + '/v1/discovery')} ...`);
274
+ const res = await submitDiscovery(apiUrl, token, agents, cfg?.application);
275
+ if (res.status >= 200 && res.status < 300)
276
+ ok(`Guard API responded ${res.status}`);
277
+ else {
278
+ err(`Guard API rejected discovery (HTTP ${res.status})`);
279
+ process.exit(1);
280
+ }
281
+ }
282
+ async function scanMcp(opts) {
283
+ const mp = await import('../core/mcp-protect.js');
284
+ const wrapOpts = { mode: opts.guardMode || 'dlp', policy: opts.policy, local: opts.local === true };
285
+ // Discover + protect/revert config files
286
+ if (opts.replace || opts.revert || opts.dryRun) {
287
+ const results = mp.protectAll({ revert: opts.revert === true, dryRun: opts.dryRun === true, ...wrapOpts });
288
+ const verb = opts.revert ? 'Reverted' : (opts.dryRun ? 'Would protect' : 'Protected');
289
+ log(chalk.bold(`\n Guardion MCP ${opts.revert ? 'revert' : 'protect'} (mode=${wrapOpts.mode})\n`));
290
+ if (results.length === 0) {
291
+ warn('No agent-app MCP configs found.');
292
+ return;
293
+ }
294
+ for (const r of results) {
295
+ if (r.error && r.error !== 'not found') {
296
+ err(`${r.app}: ${r.error}`);
297
+ continue;
298
+ }
299
+ if (r.wrapped.length)
300
+ ok(`${r.app} — ${verb}: ${chalk.cyan(r.wrapped.join(', '))}`);
301
+ else
302
+ log(chalk.dim(` ${r.app} — nothing to ${opts.revert ? 'revert' : 'protect'}`));
303
+ }
304
+ // dry-run: show how the first wrapped server is rewritten
305
+ if (opts.dryRun) {
306
+ for (const c of mp.knownAppConfigs()) {
307
+ if (!fs.existsSync(c.path))
308
+ continue;
309
+ try {
310
+ const obj = JSON.parse(fs.readFileSync(c.path, 'utf8'));
311
+ const { obj: next, wrapped } = mp.rewriteServers(obj, wrapOpts);
312
+ const key = mp.serversKey(next);
313
+ if (wrapped.length && key) {
314
+ log(chalk.dim(`\n ${c.app} → ${wrapped[0]} becomes:`));
315
+ log(JSON.stringify(next[key][wrapped[0]], null, 2));
316
+ }
317
+ }
318
+ catch { /* ignore */ }
319
+ }
320
+ }
321
+ if (!opts.revert && !opts.dryRun)
322
+ log(chalk.dim('\n Restart the affected apps. Undo: guardion scan --mode mcp --revert\n'));
323
+ return;
324
+ }
325
+ // Default: list discovered MCP servers (optionally connect for live poisoning scan)
326
+ const { mcpScan, submitMcpScan } = await import('../core/mcp-scan.js');
327
+ const cfg = readConfig();
328
+ const results = await mcpScan(process.cwd(), parseInt(opts.timeout, 10) || 8000);
329
+ const total = results.reduce((n, r) => n + r.tools.length, 0);
330
+ if (opts.json) {
331
+ log(JSON.stringify(results, null, 2));
332
+ }
333
+ else {
334
+ log(chalk.bold(`\n MCP servers (${results.length}, ${total} live tools)\n`));
335
+ for (const r of results) {
336
+ log(` ${chalk.cyan(r.server)}${r.error ? chalk.dim(' — ' + r.error) : ''}`);
337
+ for (const t of r.tools)
338
+ log(` ${chalk.bold(t.name)}${t.description ? chalk.dim(' — ' + t.description.slice(0, 60)) : ''}`);
339
+ }
340
+ log(chalk.dim('\n Protect these: guardion scan --mode mcp --dry-run | --replace\n'));
341
+ }
342
+ if (!(opts.inventory || opts.send) || total === 0)
343
+ return;
344
+ const token = getToken();
345
+ if (!token) {
346
+ err('No token found. Run: guardion token set <token>');
347
+ process.exit(1);
348
+ }
349
+ const apiUrl = opts.dev ? DEV_API_URL : (cfg?.api_url ?? DEFAULT_API_URL);
350
+ log(`Sending ${total} live MCP tools to ${chalk.cyan(apiUrl + '/v1/guard')} ...`);
351
+ const res = await submitMcpScan(apiUrl, token, results, cfg?.policy, cfg?.application);
352
+ if (res.status >= 200 && res.status < 300)
353
+ ok(`Guard API responded ${res.status}`);
354
+ else {
355
+ err(`Guard API rejected the scan (HTTP ${res.status})`);
356
+ process.exit(1);
357
+ }
358
+ }
359
+ async function runScan(opts) {
360
+ const mode = (opts.mode || 'full').toLowerCase();
361
+ switch (mode) {
362
+ case 'mcp': return scanMcp(opts);
363
+ case 'tools': return scanTools(opts);
364
+ case 'skills': return scanTools(opts, true);
365
+ case 'agents': return scanAgents(opts);
366
+ case 'full':
367
+ await scanTools(opts);
368
+ await scanAgents(opts);
369
+ await scanMcp({ ...opts, replace: false, revert: false, dryRun: false });
370
+ return;
371
+ default:
372
+ err(`Unknown --mode "${mode}". Valid: full, mcp, tools, agents, skills`);
373
+ process.exit(1);
374
+ }
375
+ }
376
+ program
377
+ .command('scan')
378
+ .description('Discover & protect: MCP servers, tools, skills, shadow-AI agents')
379
+ .option('--mode <mode>', 'full | mcp | tools | agents | skills', 'full')
380
+ .option('--inventory', 'Send discovered data to Guard', false)
381
+ .option('--send', 'Alias for --inventory', false)
382
+ .option('--dry-run', '(mcp) Preview how configs would be rewritten', false)
383
+ .option('--replace', '(mcp) Rewrite configs to route through guardion mcp', false)
384
+ .option('--revert', '(mcp) Restore original MCP configs', false)
385
+ .option('--guard-mode <m>', '(mcp) DLP mode baked into the prefix: dlp | enforce | monitor', 'dlp')
386
+ .option('--policy <slug>', '(mcp) Policy slug baked into the prefix')
387
+ .option('--local', '(mcp) Inject the local interposer instead of npx (dev)', false)
388
+ .option('--scanner <list>', '(agents) process,config,repo', 'process,config,repo')
389
+ .option('--timeout <ms>', '(mcp) per-server connect timeout', '8000')
390
+ .option('--dev', 'Use local Docker stack', false)
391
+ .option('--json', 'Print raw JSON', false)
392
+ .action(runScan);
393
+ // ── token ─────────────────────────────────────────────────────────────────────
394
+ const tokenCmd = program.command('token').description('Manage Guardion API token');
395
+ tokenCmd.command('set <token>').description('Store in OS keychain').action((t) => {
396
+ try {
397
+ setToken(t);
398
+ ok('Token stored in OS keychain');
399
+ }
400
+ catch (e) {
401
+ err(`Failed: ${e.message}`);
402
+ process.exit(1);
403
+ }
404
+ });
405
+ tokenCmd.command('get').description('Print masked token').action(() => {
406
+ const t = getToken();
407
+ if (!t) {
408
+ warn('No token found.');
409
+ return;
410
+ }
411
+ log(`Token: ${chalk.dim(t.slice(0, 6) + '...' + t.slice(-4))}`);
412
+ });
413
+ tokenCmd.command('clear').description('Remove from keychain').action(() => { clearToken(); ok('Token cleared'); });
414
+ tokenCmd.command('test').description('Verify token against Guard API /health').option('--dev', 'Local stack').action(async (opts) => {
415
+ const cfg = readConfig();
416
+ const token = getToken();
417
+ const url = opts.dev ? DEV_API_URL : (cfg?.api_url ?? DEFAULT_API_URL);
418
+ if (!token) {
419
+ err('No token found.');
420
+ process.exit(1);
421
+ }
422
+ log(`Testing ${chalk.cyan(url + '/health')} ...`);
423
+ const start = Date.now();
424
+ try {
425
+ const res = await httpGet(`${url}/health`, token);
426
+ ok(`${res.status} OK (${Date.now() - start}ms)`);
427
+ }
428
+ catch (e) {
429
+ err(`Unreachable: ${e.message}`);
430
+ process.exit(1);
431
+ }
432
+ });
433
+ // ── mock (dev) ──────────────────────────────────────────────────────────────────
434
+ program.command('mock').description('Start local dev mock Guard server').option('--port <port>', 'Port', '4100')
435
+ .action(async (opts) => { const { startMockServer } = await import('../core/mock-server.js'); startMockServer(Number(opts.port)); });
436
+ // ── hook (internal stdin dispatcher) ────────────────────────────────────────────
437
+ program.command('hook').description('Internal: read stdin hook event and post to Guard API').action(async () => {
438
+ const { execFileSync } = await import('node:child_process');
439
+ const hookPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'connectors', 'claude-code', 'hooks', 'guardion-hook.cjs');
440
+ let input = '';
441
+ process.stdin.setEncoding('utf8');
442
+ process.stdin.on('data', (c) => { input += c; });
443
+ process.stdin.on('end', () => {
444
+ try {
445
+ execFileSync(process.execPath, [hookPath], { input, stdio: ['pipe', 'inherit', 'inherit'], env: process.env, timeout: 5000 });
446
+ }
447
+ catch { /* always silent */ }
448
+ process.exit(0);
449
+ });
450
+ });
451
+ // ── hidden back-compat aliases (old command names) ──────────────────────────────
452
+ program.command('status', { hidden: true }).action(() => runClaudeCodeStatus());
453
+ program.command('uninstall', { hidden: true }).option('--clear-token', '', false).action((o) => runClaudeCodeUninstall(o));
454
+ program.command('mcp-protect', { hidden: true }).option('--revert', '', false).option('--dry-run', '', false).option('--local', '', false)
455
+ .action((o) => scanMcp({ ...o, replace: !o.revert && !o.dryRun }));
456
+ program.command('mcp-scan', { hidden: true }).option('--send', '', false).option('--json', '', false).option('--dev', '', false).option('--timeout <ms>', '', '8000')
457
+ .action((o) => scanMcp({ ...o, inventory: o.send }));
458
+ program.command('discover', { hidden: true }).option('--send', '', false).option('--json', '', false).option('--scanner <list>', '', 'process,config,repo').option('--dev', '', false)
459
+ .action((o) => scanAgents({ ...o, inventory: o.send }));
460
+ // ── init: guided onboarding ─────────────────────────────────────────────────────
461
+ async function runInit(opts) {
462
+ log(chalk.bold('\n Guardion — Agent runtime governance\n'));
463
+ const target = await promptSelect('What do you want to protect?', [
464
+ { value: 'mcp', label: 'MCP servers — DLP (stop tools leaking PII / secrets)' },
465
+ { value: 'claude', label: 'Claude Code — runtime governance (block risky actions)' },
466
+ ]);
467
+ const token = (await promptInput('\nPaste your Guardion API key (grd_…): ')).trim();
468
+ if (!token) {
469
+ err('API key is required.');
470
+ process.exit(1);
471
+ }
472
+ if (!opts.dev && !token.startsWith(TOKEN_PREFIX))
473
+ warn(`Key doesn't start with "${TOKEN_PREFIX}" — double-check it.`);
474
+ const apiUrl = opts.dev ? DEV_API_URL : DEFAULT_API_URL;
475
+ function storeToken() {
476
+ try {
477
+ setToken(token);
478
+ ok('Token stored in OS keychain');
479
+ }
480
+ catch {
481
+ const tf = path.join(process.env.HOME || '~', '.guardion', 'token');
482
+ fs.mkdirSync(path.dirname(tf), { recursive: true });
483
+ fs.writeFileSync(tf, token, { encoding: 'utf-8', mode: 0o600 });
484
+ ok('Token written to ~/.guardion/token');
485
+ }
486
+ }
487
+ if (target === 'mcp') {
488
+ const policy = (await promptInput('\nPolicy slug with your PII / Data-Protection detector [data-protection]: ')) || 'data-protection';
489
+ const mode = await promptSelect('DLP mode', [
490
+ { value: 'dlp', label: 'Redact — anonymize PII, never block (recommended)' },
491
+ { value: 'enforce', label: 'Enforce — block on a deny verdict + anonymize' },
492
+ { value: 'monitor', label: 'Monitor — observe only, never modify' },
493
+ ]);
494
+ storeToken();
495
+ writeConfig({
496
+ version: 1, tier: 'hooks', api_url: apiUrl, policy, application: 'mcp',
497
+ mode: mode, enforce: mode === 'enforce', fail_closed: false,
498
+ hooks: { events: [...ALL_HOOK_EVENTS], timeout_ms: 3000 },
499
+ });
500
+ ok('Wrote ~/.guardion/config.yaml');
501
+ let found = 0;
502
+ try {
503
+ const mp = await import('../core/mcp-protect.js');
504
+ found = mp.protectAll({ dryRun: true }).reduce((n, r) => n + r.wrapped.length, 0);
505
+ }
506
+ catch { /* best-effort */ }
507
+ log(chalk.bold('\n You\'re set up for MCP DLP.\n'));
508
+ if (found > 0)
509
+ log(` Found ${chalk.cyan(String(found))} MCP server(s) across your apps.\n`);
510
+ log(` ${chalk.bold('Protect them all (adds DLP):')} ${chalk.cyan('guardion install mcp')}`);
511
+ log(` ${chalk.bold('Preview the change first:')} ${chalk.cyan('guardion scan --mode mcp --dry-run')}`);
512
+ log(` ${chalk.bold('Wrap one server manually:')} ${chalk.cyan('guardion mcp --mode ' + mode + ' -- <your mcp command>')}`);
513
+ log(` ${chalk.bold('Find shadow-AI agents:')} ${chalk.cyan('guardion scan --mode agents --inventory')}`);
514
+ log(` ${chalk.bold('Undo protection:')} ${chalk.cyan('guardion scan --mode mcp --revert')}\n`);
515
+ return;
516
+ }
517
+ // Claude Code
518
+ const policy = (await promptInput('\nPolicy slug [prompt-defense]: ')) || 'prompt-defense';
519
+ const mode = await promptSelect('Claude Code mode', [
520
+ { value: 'hooks', label: 'Hooks — observe every session/prompt/tool event (recommended)' },
521
+ { value: 'gateway', label: 'Gateway — also route LLM traffic (token/cost capture)' },
522
+ { value: 'full', label: 'Full — hooks + gateway' },
523
+ ]);
524
+ const enforce = (await promptSelect('Enforcement', [
525
+ { value: 'observe', label: 'Observe — monitor only (recommended to start)' },
526
+ { value: 'enforce', label: 'Enforce — block risky tool calls synchronously' },
527
+ ])) === 'enforce';
528
+ await runClaudeCodeInstall({ mode, token, policy, enforce, application: 'claude-code', dev: opts.dev });
529
+ log(chalk.bold('\n You\'re set up for Claude Code.\n'));
530
+ log(` ${chalk.bold('Check status:')} ${chalk.cyan('guardion claude-code --status')}`);
531
+ log(` ${chalk.bold('Also protect MCP servers:')} ${chalk.cyan('guardion install mcp')}`);
532
+ log(` ${chalk.bold('Find shadow-AI agents:')} ${chalk.cyan('guardion scan --mode agents --inventory')}`);
533
+ log(` ${chalk.bold('Uninstall:')} ${chalk.cyan('guardion claude-code --uninstall')}\n`);
534
+ }
535
+ program
536
+ .command('init')
537
+ .description('Guided setup: pick what to protect, paste your key, choose a policy & mode')
538
+ .option('--dev', 'Use local Docker stack', false)
539
+ .action(runInit);
540
+ // ── install: one-shot protect ───────────────────────────────────────────────────
541
+ program
542
+ .command('install')
543
+ .argument('[target]', 'what to install (mcp)')
544
+ .description('install mcp — scan & route every MCP config through guardion mcp (DLP)')
545
+ .option('--guard-mode <m>', 'dlp | enforce | monitor')
546
+ .option('--policy <slug>', 'policy slug to bake into the prefix')
547
+ .option('--local', 'inject the local interposer instead of npx (dev)', false)
548
+ .action((target, o) => {
549
+ if (target !== 'mcp') {
550
+ err('Usage: guardion install mcp');
551
+ process.exit(1);
552
+ }
553
+ const cfg = readConfig();
554
+ return scanMcp({
555
+ replace: true,
556
+ guardMode: o.guardMode || cfg?.mode || 'dlp',
557
+ policy: o.policy || cfg?.policy,
558
+ local: o.local === true,
559
+ });
560
+ });
561
+ // ── root ──────────────────────────────────────────────────────────────────────
562
+ program
563
+ .name('guardion')
564
+ .version(GUARDION_VERSION)
565
+ .description('Guardion — Agent runtime governance: DLP for MCPs and agents')
566
+ .addHelpText('after', `
567
+ Get started:
568
+ guardion init guided setup (recommended)
569
+ guardion install mcp scan & DLP-protect every MCP config
570
+
571
+ Commands:
572
+ guardion mcp [--mode dlp|enforce|monitor] [--policy <slug>] -- <cmd…> wrap one MCP server (DLP)
573
+ guardion mcp [--mode …] --url https://host/mcp wrap a remote MCP server
574
+ guardion scan [--mode full|mcp|tools|agents|skills] discover; --inventory to send
575
+ guardion scan --mode mcp --dry-run | --replace | --revert protect MCP configs
576
+ guardion claude-code [--mode hooks|gateway|full] install Claude Code hooks
577
+ guardion token set|get|test|clear manage API token
578
+ `)
579
+ .parse();
580
+ function httpGet(url, token) {
581
+ return new Promise((resolve, reject) => {
582
+ const parsed = new URL(url);
583
+ const transport = parsed.protocol === 'https:' ? https : http;
584
+ const req = transport.get({ hostname: parsed.hostname, port: parsed.port, path: parsed.pathname,
585
+ timeout: 5000, headers: { Authorization: `Bearer ${token}` } }, res => { res.resume(); res.on('end', () => resolve({ status: res.statusCode ?? 0 })); });
586
+ req.on('error', reject);
587
+ req.on('timeout', () => { req.destroy(); reject(new Error('timeout')); });
588
+ });
589
+ }
590
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}