@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.
- package/config.yaml.example +26 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +289 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +63 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +26 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +44 -0
- package/dist/constants.js.map +1 -0
- package/dist/installer.d.ts +13 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +137 -0
- package/dist/installer.js.map +1 -0
- package/dist/keychain.d.ts +4 -0
- package/dist/keychain.d.ts.map +1 -0
- package/dist/keychain.js +117 -0
- package/dist/keychain.js.map +1 -0
- package/dist/mock-server.d.ts +2 -0
- package/dist/mock-server.d.ts.map +1 -0
- package/dist/mock-server.js +172 -0
- package/dist/mock-server.js.map +1 -0
- package/dist/scanner.d.ts +24 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +23 -0
- package/dist/scanner.js.map +1 -0
- package/hooks/guardion-hook.cjs +202 -0
- package/hooks/metadata.cjs +86 -0
- package/package.json +67 -0
|
@@ -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 @@
|
|
|
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"}
|
package/dist/keychain.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|
package/dist/scanner.js
ADDED
|
@@ -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"}
|