@guardion/guardion 0.2.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.
@@ -0,0 +1,137 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { BACKUP_SUFFIX, BACKUP_KEEP, HOOK_EVENTS, } from './constants.js';
5
+ // Production hook command — uses the published scoped package
6
+ const HOOK_COMMAND_NPX = 'npx --yes @guardion/guardion hook';
7
+ // Resolve the absolute path to the CJS hook for local dev usage.
8
+ // Works from both src/ (tsx) and dist/ (compiled) layouts.
9
+ function resolveLocalHookPath() {
10
+ const here = path.dirname(fileURLToPath(import.meta.url));
11
+ const candidates = [
12
+ path.resolve(here, '..', 'hooks', 'guardion-hook.cjs'),
13
+ path.resolve(here, '..', '..', 'hooks', 'guardion-hook.cjs'),
14
+ ];
15
+ for (const c of candidates) {
16
+ if (fs.existsSync(c))
17
+ return c;
18
+ }
19
+ return candidates[0];
20
+ }
21
+ function buildHooks(dev) {
22
+ // dev: use absolute path to local CJS hook (no npm registry lookup)
23
+ // prod: use npx (once published) or the resolved global binary path
24
+ const command = dev
25
+ ? `node ${resolveLocalHookPath()}`
26
+ : HOOK_COMMAND_NPX;
27
+ const hooks = {};
28
+ for (const event of HOOK_EVENTS) {
29
+ hooks[event] = [{
30
+ matcher: '',
31
+ hooks: [{ type: 'command', command }],
32
+ }];
33
+ }
34
+ return hooks;
35
+ }
36
+ // ── Env block (hooks tier — no ANTHROPIC_BASE_URL) ───────────────────────────
37
+ function buildEnv(cfg) {
38
+ return {
39
+ GUARDION_TIER: cfg.tier,
40
+ GUARDION_API_URL: cfg.api_url,
41
+ GUARDION_POLICY: cfg.policy,
42
+ GUARDION_APPLICATION: cfg.application,
43
+ };
44
+ }
45
+ export function patch(scan, opts) {
46
+ const base = scan.settings
47
+ ? JSON.parse(JSON.stringify(scan.settings)) // deep clone
48
+ : {};
49
+ base.env = { ...(base.env ?? {}), ...buildEnv(opts.config) };
50
+ base.hooks = { ...(base.hooks ?? {}), ...buildHooks(opts.dev ?? false) };
51
+ return base;
52
+ }
53
+ // ── Write ─────────────────────────────────────────────────────────────────────
54
+ export function writeSettings(filePath, settings) {
55
+ const dir = path.dirname(filePath);
56
+ fs.mkdirSync(dir, { recursive: true });
57
+ const tmp = filePath + '.tmp';
58
+ fs.writeFileSync(tmp, JSON.stringify(settings, null, 2) + '\n', 'utf-8');
59
+ fs.renameSync(tmp, filePath);
60
+ }
61
+ // ── Backup (timestamped, keep last N) ────────────────────────────────────────
62
+ export function backup(settingsPath) {
63
+ if (!fs.existsSync(settingsPath))
64
+ return null;
65
+ const ts = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
66
+ const backupPath = `${settingsPath}${BACKUP_SUFFIX}-${ts}.bak`;
67
+ fs.copyFileSync(settingsPath, backupPath);
68
+ pruneBackups(settingsPath);
69
+ return backupPath;
70
+ }
71
+ function pruneBackups(settingsPath) {
72
+ const dir = path.dirname(settingsPath);
73
+ const base = path.basename(settingsPath);
74
+ const prefix = `${base}${BACKUP_SUFFIX}-`;
75
+ try {
76
+ const backups = fs.readdirSync(dir)
77
+ .filter(f => f.startsWith(prefix) && f.endsWith('.bak'))
78
+ .map(f => ({ name: f, mtime: fs.statSync(path.join(dir, f)).mtimeMs }))
79
+ .sort((a, b) => b.mtime - a.mtime);
80
+ for (const old of backups.slice(BACKUP_KEEP)) {
81
+ fs.unlinkSync(path.join(dir, old.name));
82
+ }
83
+ }
84
+ catch { /* non-critical */ }
85
+ }
86
+ // ── Restore ───────────────────────────────────────────────────────────────────
87
+ export function restore(settingsPath) {
88
+ const dir = path.dirname(settingsPath);
89
+ const base = path.basename(settingsPath);
90
+ const prefix = `${base}${BACKUP_SUFFIX}-`;
91
+ try {
92
+ const backups = fs.readdirSync(dir)
93
+ .filter(f => f.startsWith(prefix) && f.endsWith('.bak'))
94
+ .sort()
95
+ .reverse();
96
+ if (backups.length === 0)
97
+ return null;
98
+ const latest = path.join(dir, backups[0]);
99
+ fs.copyFileSync(latest, settingsPath);
100
+ fs.unlinkSync(latest);
101
+ return latest;
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ }
107
+ // ── Remove Guardion entries (uninstall without backup) ────────────────────────
108
+ export function removeGuardionEntries(settings) {
109
+ const cleaned = JSON.parse(JSON.stringify(settings));
110
+ // Remove Guardion env keys
111
+ if (cleaned.env) {
112
+ for (const key of Object.keys(cleaned.env)) {
113
+ if (key.startsWith('GUARDION_'))
114
+ delete cleaned.env[key];
115
+ }
116
+ }
117
+ // Remove Guardion hooks — entries whose nested hooks array contains a guardion command
118
+ if (cleaned.hooks) {
119
+ for (const [event, hookList] of Object.entries(cleaned.hooks)) {
120
+ const filtered = hookList.filter(entry => {
121
+ // settings.json format: { matcher, hooks: [{ command }] }
122
+ if (entry.hooks)
123
+ return !entry.hooks.some(h => h.command?.includes('guardion'));
124
+ // legacy flat format: { type, command }
125
+ return !entry.command?.includes('guardion');
126
+ });
127
+ if (filtered.length === 0)
128
+ delete cleaned.hooks[event];
129
+ else
130
+ cleaned.hooks[event] = filtered;
131
+ }
132
+ if (Object.keys(cleaned.hooks).length === 0)
133
+ delete cleaned.hooks;
134
+ }
135
+ return cleaned;
136
+ }
137
+ //# sourceMappingURL=installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function getToken(): string;
2
+ export declare function setToken(token: string): void;
3
+ export declare function clearToken(): void;
4
+ //# sourceMappingURL=keychain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAQA,wBAAgB,QAAQ,IAAI,MAAM,CA6BjC;AAID,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAmB5C;AAED,wBAAgB,UAAU,IAAI,IAAI,CAUjC"}
@@ -0,0 +1,117 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import fs from 'node:fs';
3
+ import { KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT, TOKEN_FILE_PATH, SYSTEM_TOKEN_PATH } from './constants.js';
4
+ const KEYCHAIN_TIMEOUT = 2000;
5
+ // ── Get ───────────────────────────────────────────────────────────────────────
6
+ export function getToken() {
7
+ // 1. Env var (CI / testing)
8
+ if (process.env.GUARDION_TOKEN)
9
+ return process.env.GUARDION_TOKEN.trim();
10
+ // 2. macOS Keychain
11
+ if (process.platform === 'darwin') {
12
+ const t = keychainGet();
13
+ if (t)
14
+ return t;
15
+ }
16
+ // 3. Windows Credential Manager (cmdkey)
17
+ if (process.platform === 'win32') {
18
+ const t = windowsCredGet();
19
+ if (t)
20
+ return t;
21
+ }
22
+ // 4. System file (enterprise MDM — root-owned, mode 0640)
23
+ try {
24
+ const t = fs.readFileSync(SYSTEM_TOKEN_PATH, 'utf-8').trim();
25
+ if (t)
26
+ return t;
27
+ }
28
+ catch { /* absent */ }
29
+ // 5. User file fallback
30
+ try {
31
+ const t = fs.readFileSync(TOKEN_FILE_PATH, 'utf-8').trim();
32
+ if (t)
33
+ return t;
34
+ }
35
+ catch { /* absent */ }
36
+ return '';
37
+ }
38
+ // ── Set ───────────────────────────────────────────────────────────────────────
39
+ export function setToken(token) {
40
+ if (process.platform === 'darwin') {
41
+ keychainSet(token);
42
+ return;
43
+ }
44
+ if (process.platform === 'win32') {
45
+ windowsCredSet(token);
46
+ return;
47
+ }
48
+ // Linux / other: write to user file
49
+ import('node:fs').then(({ default: f }) => {
50
+ import('node:os').then(({ default: o }) => {
51
+ import('node:path').then(({ default: p }) => {
52
+ const dir = p.join(o.homedir(), '.guardion');
53
+ f.mkdirSync(dir, { recursive: true });
54
+ f.writeFileSync(TOKEN_FILE_PATH, token, { encoding: 'utf-8', mode: 0o600 });
55
+ });
56
+ });
57
+ });
58
+ }
59
+ export function clearToken() {
60
+ if (process.platform === 'darwin') {
61
+ try {
62
+ execFileSync('security', [
63
+ 'delete-generic-password', '-s', KEYCHAIN_SERVICE, '-a', KEYCHAIN_ACCOUNT,
64
+ ], { timeout: KEYCHAIN_TIMEOUT, stdio: 'pipe' });
65
+ }
66
+ catch { /* not found */ }
67
+ return;
68
+ }
69
+ try {
70
+ fs.unlinkSync(TOKEN_FILE_PATH);
71
+ }
72
+ catch { /* absent */ }
73
+ }
74
+ // ── macOS Keychain ────────────────────────────────────────────────────────────
75
+ function keychainGet() {
76
+ try {
77
+ return execFileSync('security', ['find-generic-password', '-s', KEYCHAIN_SERVICE, '-a', KEYCHAIN_ACCOUNT, '-w'], { timeout: KEYCHAIN_TIMEOUT, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
78
+ }
79
+ catch {
80
+ return '';
81
+ }
82
+ }
83
+ function keychainSet(token) {
84
+ // Delete existing entry first (add fails if it already exists)
85
+ try {
86
+ execFileSync('security', [
87
+ 'delete-generic-password', '-s', KEYCHAIN_SERVICE, '-a', KEYCHAIN_ACCOUNT,
88
+ ], { timeout: KEYCHAIN_TIMEOUT, stdio: 'pipe' });
89
+ }
90
+ catch { /* not found — ok */ }
91
+ execFileSync('security', [
92
+ 'add-generic-password',
93
+ '-s', KEYCHAIN_SERVICE,
94
+ '-a', KEYCHAIN_ACCOUNT,
95
+ '-w', token,
96
+ ], { timeout: KEYCHAIN_TIMEOUT, stdio: 'pipe' });
97
+ }
98
+ // ── Windows Credential Manager ────────────────────────────────────────────────
99
+ function windowsCredGet() {
100
+ try {
101
+ const out = execFileSync('cmdkey', ['/list:guardion'], {
102
+ timeout: KEYCHAIN_TIMEOUT, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'],
103
+ });
104
+ // Parse token from output (stored in generic credential)
105
+ const match = out.match(/Password:\s*(.+)/);
106
+ return match ? match[1].trim() : '';
107
+ }
108
+ catch {
109
+ return '';
110
+ }
111
+ }
112
+ function windowsCredSet(token) {
113
+ execFileSync('cmdkey', [`/add:guardion`, `/user:token`, `/pass:${token}`], {
114
+ timeout: KEYCHAIN_TIMEOUT, stdio: 'pipe',
115
+ });
116
+ }
117
+ //# sourceMappingURL=keychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function startMockServer(port?: number): void;
2
+ //# sourceMappingURL=mock-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.d.ts","sourceRoot":"","sources":["../src/mock-server.ts"],"names":[],"mappings":"AAqCA,wBAAgB,eAAe,CAAC,IAAI,SAAe,QA2FlD"}
@@ -0,0 +1,172 @@
1
+ import express from 'express';
2
+ import chalk from 'chalk';
3
+ const DEFAULT_PORT = 4100;
4
+ const EVENTS_PATH = '/v1/hooks/events'; // matches real Guard API — fixed from v1
5
+ const HEALTH_PATH = '/health';
6
+ let nextId = 1;
7
+ const logs = [];
8
+ function ts() { return new Date().toISOString().slice(11, 23); }
9
+ function addLog(method, p, status, duration_ms, body, meta = {}) {
10
+ const entry = { id: nextId++, timestamp: new Date().toISOString(), method, path: p, status, duration_ms, body, meta };
11
+ logs.push(entry);
12
+ if (logs.length > 2000)
13
+ logs.splice(0, logs.length - 2000);
14
+ return entry;
15
+ }
16
+ export function startMockServer(port = DEFAULT_PORT) {
17
+ const app = express();
18
+ app.use(express.json({ limit: '10mb' }));
19
+ // ── Health ─────────────────────────────────────────────────────────────────
20
+ app.get(HEALTH_PATH, (_req, res) => {
21
+ res.json({ ok: true, service: 'guardion-mock', version: '0.2.0' });
22
+ });
23
+ // ── Hook events ────────────────────────────────────────────────────────────
24
+ app.post(EVENTS_PATH, (req, res) => {
25
+ const start = Date.now();
26
+ const body = req.body;
27
+ const event = String(body.hook_event_name ?? body.event ?? 'unknown');
28
+ const tool = body.tool_name ? ` ${chalk.cyan(String(body.tool_name))}` : '';
29
+ const session = String(body.session_id ?? 'unknown').slice(0, 12);
30
+ console.log(`${chalk.dim(`[${ts()}]`)} ${chalk.bold(chalk.magenta(event))}${tool} ${chalk.dim(`session=${session}`)}`);
31
+ if (body.tool_input && typeof body.tool_input === 'object') {
32
+ const input = body.tool_input;
33
+ const summary = String(input.command ?? input.file_path ?? input.pattern ?? input.query ?? '').slice(0, 120);
34
+ if (summary)
35
+ console.log(chalk.dim(` → ${summary}`));
36
+ }
37
+ if (body.prompt)
38
+ console.log(chalk.dim(` prompt: ${String(body.prompt).slice(0, 100)}`));
39
+ if (body.tool_error)
40
+ console.log(chalk.red(` ✗ ${String(body.tool_error).slice(0, 120)}`));
41
+ if (body.error_message)
42
+ console.log(chalk.red(` ✗ ${body.error_type}: ${String(body.error_message).slice(0, 120)}`));
43
+ if (body.metadata && typeof body.metadata === 'object') {
44
+ const m = body.metadata;
45
+ const who = [m.os_user, m.hostname, m.git_user_email].filter(Boolean).join(' @ ');
46
+ if (who)
47
+ console.log(chalk.cyan(` user: ${who}`));
48
+ if (m.git_branch)
49
+ console.log(chalk.cyan(` git: ${m.git_branch}@${m.git_commit ?? '?'}`));
50
+ }
51
+ addLog('POST', EVENTS_PATH, 200, Date.now() - start, body, {
52
+ hook_event_name: event,
53
+ tool_name: body.tool_name,
54
+ session_id: body.session_id,
55
+ trace_id: body.trace_id,
56
+ });
57
+ res.json({ action: 'allow' });
58
+ });
59
+ // ── Log queries ────────────────────────────────────────────────────────────
60
+ app.get('/api/logs/stream', (req, res) => {
61
+ res.setHeader('Content-Type', 'text/event-stream');
62
+ res.setHeader('Cache-Control', 'no-cache');
63
+ res.setHeader('Connection', 'keep-alive');
64
+ res.flushHeaders();
65
+ let last = logs.length;
66
+ const iv = setInterval(() => {
67
+ for (const entry of logs.slice(last)) {
68
+ res.write(`data: ${JSON.stringify(entry)}\n\n`);
69
+ }
70
+ last = logs.length;
71
+ }, 300);
72
+ req.on('close', () => clearInterval(iv));
73
+ });
74
+ app.get('/api/logs', (req, res) => {
75
+ const event = req.query.event;
76
+ const filtered = event ? logs.filter(l => l.meta.hook_event_name === event) : logs;
77
+ res.json({ count: filtered.length, logs: filtered.slice(-200) });
78
+ });
79
+ // ── Dashboard ──────────────────────────────────────────────────────────────
80
+ app.get('/', (_req, res) => {
81
+ res.setHeader('Content-Type', 'text/html');
82
+ res.send(dashboardHtml());
83
+ });
84
+ app.all('*', (req, res) => {
85
+ console.log(chalk.dim(`[${ts()}] 404 ${req.method} ${req.path}`));
86
+ res.status(404).json({ error: 'not_found', path: req.path });
87
+ });
88
+ app.listen(port, () => {
89
+ console.log('');
90
+ console.log(chalk.bold(' Guardion Mock Server'));
91
+ console.log(` Dashboard: ${chalk.cyan(`http://localhost:${port}/`)}`);
92
+ console.log(` Hook events: ${chalk.cyan(`http://localhost:${port}${EVENTS_PATH}`)}`);
93
+ console.log(` Health: ${chalk.cyan(`http://localhost:${port}${HEALTH_PATH}`)}`);
94
+ console.log('');
95
+ console.log(chalk.dim(' Waiting for hook events...\n'));
96
+ });
97
+ }
98
+ function dashboardHtml() {
99
+ return `<!DOCTYPE html>
100
+ <html lang="en">
101
+ <head>
102
+ <meta charset="UTF-8">
103
+ <title>Guardion Mock</title>
104
+ <style>
105
+ *{margin:0;padding:0;box-sizing:border-box}
106
+ body{font-family:'SF Mono',monospace;background:#0d1117;color:#c9d1d9;font-size:13px}
107
+ .hdr{background:#161b22;border-bottom:1px solid #30363d;padding:12px 20px;display:flex;align-items:center;gap:12px}
108
+ .hdr h1{font-size:15px;color:#58a6ff;font-weight:600}
109
+ .hdr .ct{margin-left:auto;color:#8b949e;font-size:12px}
110
+ .hdr .ct span{margin-left:16px}.hdr .n{color:#58a6ff;font-weight:600}
111
+ .list{height:calc(100vh - 50px);overflow-y:auto}
112
+ .row{border-bottom:1px solid #21262d;padding:8px 20px;cursor:pointer}
113
+ .row:hover{background:#161b22}
114
+ .rf{display:flex;align-items:center;gap:10px}
115
+ .ts{color:#484f58;width:90px;flex-shrink:0}
116
+ .ev{color:#c9d1d9;font-weight:600;width:180px;flex-shrink:0}
117
+ .tool{background:#1f2937;color:#79c0ff;padding:1px 6px;border-radius:3px;font-size:11px}
118
+ .meta{color:#8b949e;font-size:11px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
119
+ .det{display:none;padding:8px 20px 12px 110px;border-bottom:1px solid #21262d;background:#0d1117}
120
+ .det.open{display:block}
121
+ .det pre{background:#161b22;border:1px solid #30363d;border-radius:6px;padding:10px;overflow-x:auto;max-height:300px;overflow-y:auto;font-size:12px;color:#e6edf3;white-space:pre-wrap;word-break:break-all}
122
+ .det h4{color:#8b949e;margin:8px 0 4px;font-size:11px;text-transform:uppercase;letter-spacing:.5px}
123
+ .empty{color:#484f58;text-align:center;padding:60px 20px;font-size:14px}
124
+ </style>
125
+ </head>
126
+ <body>
127
+ <div class="hdr">
128
+ <h1>Guardion Dev</h1>
129
+ <div class="ct">Events: <span class="n" id="cnt">0</span></div>
130
+ </div>
131
+ <div class="list" id="list"><div class="empty">Waiting for hook events...</div></div>
132
+ <script>
133
+ var count = 0;
134
+ function toggleDet(id){var e=document.getElementById(id);if(e)e.classList.toggle('open');}
135
+ function esc(s){var d=document.createElement('div');d.appendChild(document.createTextNode(s));return d.textContent;}
136
+ function buildRow(log){
137
+ var b=log.body||{};
138
+ var ev=b.hook_event_name||b.event||'unknown';
139
+ var tool=b.tool_name?'<span class="tool">'+esc(b.tool_name)+'</span>':'';
140
+ var summary='';
141
+ if(b.prompt)summary='prompt: '+String(b.prompt).slice(0,80);
142
+ else if(b.tool_input&&b.tool_input.command)summary=String(b.tool_input.command).slice(0,80);
143
+ else if(b.tool_input&&b.tool_input.file_path)summary=String(b.tool_input.file_path).slice(0,80);
144
+ else if(b.error_message)summary=b.error_type+': '+String(b.error_message).slice(0,80);
145
+ var f=document.createDocumentFragment();
146
+ var row=document.createElement('div');row.className='row';
147
+ row.addEventListener('click',function(){toggleDet('det-'+log.id);});
148
+ row.innerHTML='<div class="rf"><span class="ts">'+log.timestamp.slice(11,23)+'</span>'
149
+ +'<span class="ev">'+esc(ev)+'</span>'+tool
150
+ +'<span class="meta">'+esc(summary)+'</span></div>';
151
+ var det=document.createElement('div');det.className='det';det.id='det-'+log.id;
152
+ det.innerHTML='<h4>Payload</h4><pre>'+esc(JSON.stringify(b,null,2).slice(0,4000))+'</pre>';
153
+ f.appendChild(row);f.appendChild(det);
154
+ return f;
155
+ }
156
+ function appendLog(log){
157
+ count++;
158
+ document.getElementById('cnt').textContent=count;
159
+ var list=document.getElementById('list');
160
+ var empty=list.querySelector('.empty');
161
+ if(empty)list.removeChild(empty);
162
+ list.insertBefore(buildLog(log),list.firstChild);
163
+ }
164
+ function buildLog(log){var f=buildRow(log);return f;}
165
+ var es=new EventSource('/api/logs/stream');
166
+ es.onmessage=function(e){try{appendLog(JSON.parse(e.data));}catch(err){}};
167
+ fetch('/api/logs').then(function(r){return r.json();}).then(function(d){d.logs.forEach(appendLog);});
168
+ </script>
169
+ </body>
170
+ </html>`;
171
+ }
172
+ //# sourceMappingURL=mock-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../src/mock-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface ClaudeSettings {
2
+ env?: Record<string, string>;
3
+ hooks?: Record<string, unknown[]>;
4
+ mcpServers?: Record<string, McpServerConfig>;
5
+ [key: string]: unknown;
6
+ }
7
+ export interface McpServerConfig {
8
+ type?: string;
9
+ command?: string;
10
+ args?: string[];
11
+ env?: Record<string, string>;
12
+ url?: string;
13
+ headers?: Record<string, string>;
14
+ [key: string]: unknown;
15
+ }
16
+ export interface ScanResult {
17
+ settingsPath: string;
18
+ settings: ClaudeSettings | null;
19
+ hasExistingGuardion: boolean;
20
+ mcpServers: Record<string, McpServerConfig>;
21
+ }
22
+ export declare function readSettings(filePath: string): ClaudeSettings | null;
23
+ export declare function scan(): ScanResult;
24
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,cAAc;IAC7B,GAAG,CAAC,EAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,KAAK,CAAC,EAAO,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAK,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAK,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,GAAG,CAAC,EAAM,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAU,MAAM,CAAC;IAC7B,QAAQ,EAAc,cAAc,GAAG,IAAI,CAAC;IAC5C,mBAAmB,EAAG,OAAO,CAAC;IAC9B,UAAU,EAAY,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACvD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAMpE;AAED,wBAAgB,IAAI,IAAI,UAAU,CAejC"}
@@ -0,0 +1,23 @@
1
+ import fs from 'node:fs';
2
+ import { CLAUDE_SETTINGS_PATH } from './constants.js';
3
+ export function readSettings(filePath) {
4
+ try {
5
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
6
+ }
7
+ catch {
8
+ return null;
9
+ }
10
+ }
11
+ export function scan() {
12
+ const settingsPath = CLAUDE_SETTINGS_PATH;
13
+ const settings = readSettings(settingsPath);
14
+ const mcpServers = {
15
+ ...(settings?.mcpServers ?? {}),
16
+ };
17
+ // Detect existing Guardion by looking for our env keys or hook command
18
+ const hasExistingGuardion = Boolean(settings?.env?.GUARDION_TIER ||
19
+ settings?.env?.GUARDION_API_URL ||
20
+ JSON.stringify(settings?.hooks ?? {}).includes('guardion'));
21
+ return { settingsPath, settings, hasExistingGuardion, mcpServers };
22
+ }
23
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAQ,SAAS,CAAC;AAG3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AA0BtD,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAmB,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,MAAM,YAAY,GAAG,oBAAoB,CAAC;IAC1C,MAAM,QAAQ,GAAO,YAAY,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,UAAU,GAAK;QACnB,GAAG,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;KAChC,CAAC;IAEF,uEAAuE;IACvE,MAAM,mBAAmB,GAAG,OAAO,CACjC,QAAQ,EAAE,GAAG,EAAE,aAAa;QAC5B,QAAQ,EAAE,GAAG,EAAE,gBAAgB;QAC/B,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC3D,CAAC;IAEF,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC;AACrE,CAAC"}