@kevinbermudezc/context-guard 1.2.0 β†’ 1.3.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/README.md CHANGED
@@ -149,19 +149,28 @@ That's it! When Claude Code attempts to run `Read` (or raw bash reads like `cat
149
149
 
150
150
  ContextGuard ships a built-in **Model Context Protocol (MCP) server** compatible with any MCP host: **Cursor, Windsurf, Claude Desktop, Antigravity (AGY), Zed**, and more.
151
151
 
152
- The MCP server exposes three tools:
152
+ The MCP server exposes tools, passive resources, and optimized prompt templates:
153
+
154
+ ### πŸ› οΈ Tools
153
155
 
154
156
  | Tool | Description | Cost | Latency |
155
157
  |---|---|---|---|
156
158
  | `read_file_safe` | Protected file read β€” passthrough for small files, AST skeleton for large ones, block for binaries/lockfiles | **\$0.00** | **< 5ms** |
157
159
  | `inspect_outline` | Instant structural outline (classes, functions, types, signals) with line numbers | **\$0.00** | **< 5ms** |
158
- | `grep_distilled` | Pattern search returning only structural context around matches, never full file dumps | **\$0.00** | **< 50ms** |
160
+ | `grep_distilled` | Pattern search returning only structural context around matches (uses ripgrep with pure Node fallback) | **\$0.00** | **< 50ms** |
161
+
162
+ ### πŸ“¦ Resources & Prompts
163
+
164
+ | Type | URI / Name | Description |
165
+ |---|---|---|
166
+ | **Resource** | `contextguard://config` | Live inspection of active thresholds, bypass formats, and worker provider |
167
+ | **Prompt** | `investigate_codebase_safely` | System prompt template enforcing token preservation and outline-first navigation |
159
168
 
160
169
  ### Install & Run
161
170
 
162
171
  ```bash
163
172
  # One-shot (no install):
164
- npx -y @kevinbermudezc/context-guard context-guard-mcp
173
+ npx -y -p @kevinbermudezc/context-guard context-guard-mcp
165
174
 
166
175
  # Or as a local dependency:
167
176
  pnpm add -D @kevinbermudezc/context-guard
@@ -175,7 +184,7 @@ node ./node_modules/@kevinbermudezc/context-guard/dist/bin/mcp-server.js
175
184
  "mcpServers": {
176
185
  "context-guard": {
177
186
  "command": "npx",
178
- "args": ["-y", "@kevinbermudezc/context-guard@latest", "context-guard-mcp"]
187
+ "args": ["-y", "-p", "@kevinbermudezc/context-guard@latest", "context-guard-mcp"]
179
188
  }
180
189
  }
181
190
  }
@@ -188,7 +197,7 @@ node ./node_modules/@kevinbermudezc/context-guard/dist/bin/mcp-server.js
188
197
  "mcpServers": {
189
198
  "context-guard": {
190
199
  "command": "npx",
191
- "args": ["-y", "@kevinbermudezc/context-guard@latest", "context-guard-mcp"]
200
+ "args": ["-y", "-p", "@kevinbermudezc/context-guard@latest", "context-guard-mcp"]
192
201
  }
193
202
  }
194
203
  }
@@ -201,7 +210,7 @@ node ./node_modules/@kevinbermudezc/context-guard/dist/bin/mcp-server.js
201
210
  "mcpServers": {
202
211
  "context-guard": {
203
212
  "command": "npx",
204
- "args": ["-y", "@kevinbermudezc/context-guard@latest", "context-guard-mcp"]
213
+ "args": ["-y", "-p", "@kevinbermudezc/context-guard@latest", "context-guard-mcp"]
205
214
  }
206
215
  }
207
216
  }
@@ -211,22 +220,28 @@ node ./node_modules/@kevinbermudezc/context-guard/dist/bin/mcp-server.js
211
220
 
212
221
  ---
213
222
 
214
- ## πŸ› οΈ CLI Usage (Claude Code Hook)
223
+ ## πŸ› οΈ CLI & FinOps Telemetry (v1.3.0)
215
224
 
216
- You can also use ContextGuard directly as a command-line tool:
225
+ ContextGuard includes a beautiful developer CLI with built-in token savings and financial ROI telemetry:
217
226
 
218
227
  ```bash
219
- # View file through ContextGuard (auto-shunts if > 300 lines)
228
+ # View file through ContextGuard (shows FinOps savings card if shunted)
220
229
  npx @kevinbermudezc/context-guard src/large-service.ts
221
230
 
231
+ # Inspect token savings across your machine
232
+ npx @kevinbermudezc/context-guard stats
233
+
234
+ # Audit an entire codebase or folder (scans files > 300 lines)
235
+ npx @kevinbermudezc/context-guard stats src/
236
+
237
+ # Real-time interactive telemetry monitor (updates live during Claude/Cursor sessions)
238
+ npx @kevinbermudezc/context-guard stats --watch
239
+
222
240
  # Ask a semantic question to the worker model
223
- npx @kevinbermudezc/context-guard logs/server.log --query "Find all 500 status database connection timeouts"
241
+ npx @kevinbermudezc/context-guard logs/server.log --query "Find all 500 status timeouts"
224
242
 
225
243
  # Specific line range (bypasses guard / passthrough)
226
244
  npx @kevinbermudezc/context-guard src/large-service.ts --start 120 --end 160
227
-
228
- # Output structured JSON
229
- npx @kevinbermudezc/context-guard src/large-service.ts --json
230
245
  ```
231
246
 
232
247
  ---
@@ -11,6 +11,7 @@ import path from 'node:path';
11
11
  import { CONFIG } from '../src/config.js';
12
12
  import { extractCodeSkeleton } from '../src/skeletonizer.js';
13
13
  import { classifyFile } from '../src/file-classifier.js';
14
+ import { calculateFinOps, recordMetricEvent } from '../src/token-metrics.js';
14
15
  async function runHook() {
15
16
  const inputChunks = [];
16
17
  for await (const chunk of process.stdin) {
@@ -100,9 +101,20 @@ async function runHook() {
100
101
  // ========================================================================
101
102
  const skeleton = extractCodeSkeleton(rawContent, ext);
102
103
  const preview = skeleton || lines.slice(0, 40).join('\n') + `\n... [${totalLines - 40} lines truncated by ContextGuard]`;
104
+ const finOps = calculateFinOps(rawContent, preview);
105
+ recordMetricEvent({
106
+ source: 'hook',
107
+ filePath: path.relative(process.cwd(), resolvedPath),
108
+ action: 'SHUNTED_LOCAL_AST',
109
+ rawTokens: finOps.rawTokens,
110
+ guardedTokens: finOps.guardedTokens,
111
+ tokensSaved: finOps.tokensSaved,
112
+ dollarsSavedSonnet: finOps.dollarsSaved.claudeSonnet
113
+ });
103
114
  const feedbackMessage = [
104
115
  `πŸ›‘οΈ [CONTEXTGUARD: LECTURA REGULADA - PREVENCIΓ“N DE SATURACIΓ“N DE TOKENS]`,
105
116
  `El recurso "${path.basename(resolvedPath)}" contiene ${totalLines} lΓ­neas (~${(stat.size / 1024).toFixed(1)} KB).`,
117
+ `πŸ“‰ Tokens prevenidos: ~${finOps.tokensSaved.toLocaleString()} tokens (${finOps.percentageSaved}% ahorro | ~$${finOps.dollarsSaved.claudeSonnet} USD en Sonnet).`,
106
118
  `Para optimizar tu contexto y prevenir degradaciΓ³n de razonamiento, no se ha cargado el archivo completo en la ventana principal.`,
107
119
  ``,
108
120
  `πŸ“‹ ESQUELETO ESTRUCTURAL Y FIRMAS (Con Γ­ndices de lΓ­nea):`,
@@ -1 +1 @@
1
- {"version":3,"file":"claude-hook.js","sourceRoot":"","sources":["../../bin/claude-hook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude-hook.js","sourceRoot":"","sources":["../../bin/claude-hook.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,272 @@
1
1
  #!/usr/bin/env node
2
2
  import path from 'node:path';
3
+ import fs from 'node:fs';
3
4
  import { processWithContextGuard } from '../src/index.js';
4
- async function runCli() {
5
- const args = process.argv.slice(2);
6
- if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
5
+ import { extractCodeSkeleton } from '../src/skeletonizer.js';
6
+ import { getAggregatedStats, resetMetrics, calculateFinOps } from '../src/token-metrics.js';
7
+ // ─── ANSI Colors & Terminal Formatting (Zero-Dependencies) ────────────────────
8
+ const c = {
9
+ reset: '\x1b[0m',
10
+ bold: '\x1b[1m',
11
+ dim: '\x1b[2m',
12
+ italic: '\x1b[3m',
13
+ underline: '\x1b[4m',
14
+ // Colors
15
+ red: '\x1b[31m',
16
+ green: '\x1b[32m',
17
+ yellow: '\x1b[33m',
18
+ blue: '\x1b[34m',
19
+ magenta: '\x1b[35m',
20
+ cyan: '\x1b[36m',
21
+ white: '\x1b[37m',
22
+ gray: '\x1b[90m',
23
+ // Backgrounds
24
+ bgBlue: '\x1b[44m',
25
+ bgGreen: '\x1b[42m',
26
+ bgRed: '\x1b[41m'
27
+ };
28
+ const VERSION = '1.3.0';
29
+ // ─── Help Menu ────────────────────────────────────────────────────────────────
30
+ function printHelp() {
31
+ console.log(`
32
+ ${c.cyan}πŸ›‘οΈ ${c.bold}ContextGuard CLI${c.reset} ${c.gray}v${VERSION}${c.reset}
33
+ ${c.dim}Intelligent Context Admission Control & FinOps Optimization${c.reset}
34
+
35
+ ${c.bold}USAGE${c.reset}
36
+ ${c.green}$ context-guard${c.reset} <file-path> [options]
37
+ ${c.green}$ context-guard stats${c.reset} [path] [options]
38
+
39
+ ${c.bold}COMMANDS${c.reset}
40
+ ${c.cyan}stats${c.reset} [dir] ${c.white}Muestra la telemetrΓ­a acumulada o audita un directorio${c.reset}
41
+ ${c.cyan}stats --watch${c.reset} ${c.white}Monitor interactivo de consumo y ahorro en tiempo real${c.reset}
42
+ ${c.cyan}stats --reset${c.reset} ${c.white}Reinicia el historial de mΓ©tricas locales${c.reset}
43
+
44
+ ${c.bold}OPTIONS${c.reset}
45
+ ${c.yellow}-q, --query <text>${c.reset} Filtro semΓ‘ntico para el modelo worker (Gemini/Ollama)
46
+ ${c.yellow}--start <num>${c.reset} LΓ­nea inicial (1-indexed slice passthrough)
47
+ ${c.yellow}--end <num>${c.reset} LΓ­nea final (1-indexed slice passthrough)
48
+ ${c.yellow}--force-worker${c.reset} Fuerza el procesamiento mediante el modelo worker
49
+ ${c.yellow}--json${c.reset} Salida estructurada en JSON puro
50
+ ${c.yellow}-v, --version${c.reset} Muestra la versiΓ³n de ContextGuard
51
+ ${c.yellow}-h, --help${c.reset} Muestra este menΓΊ de ayuda
52
+
53
+ ${c.bold}EXAMPLES${c.reset}
54
+ ${c.dim}# Inspecciona un archivo con protecciΓ³n automΓ‘tica (>300 lΓ­neas)${c.reset}
55
+ ${c.cyan}context-guard${c.reset} src/large-service.ts
56
+
57
+ ${c.dim}# Lee un rango acotado sin aplicar el guard${c.reset}
58
+ ${c.cyan}context-guard${c.reset} src/large-service.ts --start 120 --end 160
59
+
60
+ ${c.dim}# Consulta el ahorro histΓ³rico de tokens y dinero${c.reset}
61
+ ${c.cyan}context-guard stats${c.reset}
62
+
63
+ ${c.dim}# Audita el potencial de ahorro de un directorio completo${c.reset}
64
+ ${c.cyan}context-guard stats${c.reset} src/
65
+
66
+ ${c.dim}# Monitor en tiempo real mientras usas Claude Code o Cursor${c.reset}
67
+ ${c.cyan}context-guard stats --watch${c.reset}
68
+ `);
69
+ }
70
+ // ─── Directory Auditor (Option B) ─────────────────────────────────────────────
71
+ function auditDirectory(targetDir) {
72
+ const resolved = path.resolve(process.cwd(), targetDir);
73
+ if (!fs.existsSync(resolved)) {
74
+ console.error(`${c.red}βœ– Error:${c.reset} El directorio no existe: ${targetDir}`);
75
+ process.exit(1);
76
+ }
77
+ const IGNORED = new Set(['node_modules', '.git', 'dist', 'build', '.next', '.turbo', 'coverage']);
78
+ const filesToAudit = [];
79
+ function walk(current) {
80
+ let entries = [];
81
+ try {
82
+ entries = fs.readdirSync(current, { withFileTypes: true });
83
+ }
84
+ catch {
85
+ return;
86
+ }
87
+ for (const ent of entries) {
88
+ if (ent.isDirectory()) {
89
+ if (!IGNORED.has(ent.name) && !ent.name.startsWith('.')) {
90
+ walk(path.join(current, ent.name));
91
+ }
92
+ }
93
+ else if (ent.isFile()) {
94
+ const ext = path.extname(ent.name).toLowerCase();
95
+ if (['.ts', '.tsx', '.js', '.jsx', '.py', '.go', '.rs', '.java', '.cs', '.svelte', '.vue', '.astro'].includes(ext)) {
96
+ filesToAudit.push(path.join(current, ent.name));
97
+ }
98
+ }
99
+ }
100
+ }
101
+ walk(resolved);
102
+ let totalRawTokens = 0;
103
+ let totalGuardedTokens = 0;
104
+ let largeFilesCount = 0;
105
+ for (const f of filesToAudit) {
106
+ try {
107
+ const content = fs.readFileSync(f, 'utf-8');
108
+ const lines = content.split('\n').length;
109
+ if (lines > 300) {
110
+ largeFilesCount++;
111
+ const ext = path.extname(f);
112
+ const skeleton = extractCodeSkeleton(content, ext) || '';
113
+ const fin = calculateFinOps(content, skeleton);
114
+ totalRawTokens += fin.rawTokens;
115
+ totalGuardedTokens += fin.guardedTokens;
116
+ }
117
+ }
118
+ catch { }
119
+ }
120
+ const tokensSaved = Math.max(0, totalRawTokens - totalGuardedTokens);
121
+ const pctSaved = totalRawTokens > 0 ? ((tokensSaved / totalRawTokens) * 100).toFixed(1) : '0';
122
+ const opusDollars = ((tokensSaved / 1_000_000) * 15.00).toFixed(2);
123
+ const sonnetDollars = ((tokensSaved / 1_000_000) * 3.00).toFixed(2);
124
+ console.log(`
125
+ ${c.cyan}πŸ” ${c.bold}AuditorΓ­a de CΓ³digo y FinOps: ${c.white}${path.relative(process.cwd(), resolved) || '.'}${c.reset}
126
+ ${c.gray}Analizados ${filesToAudit.length} archivos fuente (${largeFilesCount} archivos superan las 300 lΓ­neas)${c.reset}
127
+
128
+ ${c.bold}β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”${c.reset}
129
+ β”‚ ${c.yellow}Escenario de Lectura Cruda:${c.reset} ~${totalRawTokens.toLocaleString().padStart(8)} tokens β”‚
130
+ β”‚ ${c.green}Con ContextGuard (AST):${c.reset} ~${totalGuardedTokens.toLocaleString().padStart(8)} tokens β”‚
131
+ β”‚ β”‚
132
+ β”‚ ${c.bold}${c.green}πŸ“‰ Ahorro potencial:${c.reset} ${c.bold}~${tokensSaved.toLocaleString()}${c.reset} tokens (${c.bold}${pctSaved}%${c.reset} reducciΓ³n) β”‚
133
+ β”‚ β”‚
134
+ β”‚ ${c.bold}πŸ’° EstimaciΓ³n de Ahorro en DΓ³lares:${c.reset} β”‚
135
+ β”‚ β€’ Claude Opus 4/5: ${c.green}$${opusDollars} USD${c.reset} β”‚
136
+ β”‚ β€’ Claude Sonnet 4: ${c.green}$${sonnetDollars} USD${c.reset} β”‚
137
+ ${c.bold}β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜${c.reset}
138
+ `);
139
+ }
140
+ // ─── Real-Time Live Watcher (Real-time telemetry) ─────────────────────────────
141
+ function runRealtimeWatch() {
142
+ // Clear screen
143
+ process.stdout.write('\x1b[2J\x1b[0;0H');
144
+ const render = () => {
145
+ process.stdout.write('\x1b[0;0H'); // cursor to home
146
+ const stats = getAggregatedStats();
147
+ const time = new Date().toLocaleTimeString();
7
148
  console.log(`
8
- ContextGuard CLI v1.0.0
9
- Intelligent context admission control & token optimization
149
+ ${c.cyan}πŸ›‘οΈ ${c.bold}ContextGuard Live Telemetry Monitor${c.reset} ${c.gray}[${time}]${c.reset}
150
+ ${c.dim}Escuchando intercepciones activas de Claude Code, Cursor y MCP...${c.reset}
151
+
152
+ ${c.bold}β”Œβ”€β”€ πŸ“Š MΓ©tricas Globales Acumuladas ─────────────────────────────┐${c.reset}
153
+ β”‚ Archivos Regulados: ${c.bold}${c.cyan}${stats.totalInterceptions.toString().padEnd(10)}${c.reset} β”‚
154
+ β”‚ Tokens Crudos Evitados: ${c.bold}${c.yellow}${stats.totalRawTokens.toLocaleString().padEnd(12)}${c.reset} β”‚
155
+ β”‚ Tokens AST Inyectados: ${c.bold}${c.white}${stats.totalGuardedTokens.toLocaleString().padEnd(12)}${c.reset} β”‚
156
+ β”‚ ${c.green}${c.bold}Tokens Netos Ahorrados:${c.reset} ${c.bold}${c.green}${stats.totalTokensSaved.toLocaleString().padEnd(12)}${c.reset} β”‚
157
+ β”‚ β”‚
158
+ β”‚ ${c.bold}πŸ’° Retorno de InversiΓ³n (ROI Estimado):${c.reset} β”‚
159
+ β”‚ β€’ Claude Opus 4/5: ${c.bold}${c.green}$${stats.totalDollarsSavedOpus.toFixed(2)} USD${c.reset} β”‚
160
+ β”‚ β€’ Claude Sonnet 4: ${c.bold}${c.green}$${stats.totalDollarsSavedSonnet.toFixed(2)} USD${c.reset} β”‚
161
+ β”‚ β€’ GPT-4o / Astra: ${c.bold}${c.green}$${stats.totalDollarsSavedGpt4o.toFixed(2)} USD${c.reset} β”‚
162
+ ${c.bold}└── πŸ“‹ Últimos Eventos Registrados β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜${c.reset}
163
+ `);
164
+ const recent = stats.events.slice(-6).reverse();
165
+ if (recent.length === 0) {
166
+ console.log(` ${c.dim}AΓΊn no hay eventos registrados. Usa Claude Code o el CLI para ver trΓ‘fico.${c.reset}\n`);
167
+ }
168
+ else {
169
+ for (const ev of recent) {
170
+ const badge = ev.source === 'hook' ? `${c.magenta}[HOOK]${c.reset}` : `${c.blue}[CLI]${c.reset} `;
171
+ const fName = ev.filePath.length > 28 ? '...' + ev.filePath.slice(-25) : ev.filePath.padEnd(28);
172
+ console.log(` ${c.dim}${ev.timestamp.slice(11, 19)}${c.reset} ${badge} ${c.white}${fName}${c.reset} πŸ“‰ ${c.green}+${ev.tokensSaved.toLocaleString()} tokens${c.reset} ${c.gray}(~$${ev.dollarsSavedSonnet})${c.reset}`);
173
+ }
174
+ console.log('');
175
+ }
176
+ console.log(` ${c.gray}Presiona Ctrl+C para salir.${c.reset}`);
177
+ };
178
+ render();
179
+ const interval = setInterval(render, 1000);
180
+ process.on('SIGINT', () => {
181
+ clearInterval(interval);
182
+ console.log(`\n ${c.green}βœ” Monitor finalizado.${c.reset}\n`);
183
+ process.exit(0);
184
+ });
185
+ }
186
+ // ─── Stats Reporter ───────────────────────────────────────────────────────────
187
+ function printStats(args) {
188
+ if (args.includes('--reset')) {
189
+ resetMetrics();
190
+ console.log(`\n ${c.green}βœ” Historial de mΓ©tricas reiniciado con Γ©xito.${c.reset}\n`);
191
+ return;
192
+ }
193
+ if (args.includes('--watch') || args.includes('-w')) {
194
+ runRealtimeWatch();
195
+ return;
196
+ }
197
+ // Check if a directory path was provided
198
+ const targetPath = args.find(a => !a.startsWith('-') && a !== 'stats');
199
+ if (targetPath && fs.existsSync(targetPath) && fs.statSync(targetPath).isDirectory()) {
200
+ auditDirectory(targetPath);
201
+ return;
202
+ }
203
+ const stats = getAggregatedStats();
204
+ if (args.includes('--json')) {
205
+ console.log(JSON.stringify(stats, null, 2));
206
+ return;
207
+ }
208
+ console.log(`
209
+ ${c.cyan}πŸ›‘οΈ ${c.bold}ContextGuard β€” Resumen FinOps & TelemetrΓ­a${c.reset}
210
+ ${c.gray}MΓ©tricas calculadas en base a intercepciones en tu mΓ‘quina${c.reset}
10
211
 
11
- Usage:
12
- context-guard <file-path> [options]
212
+ ${c.bold}β”Œβ”€β”€ πŸ“ˆ Balance de Tokens ─────────────────────────────────────────┐${c.reset}
213
+ β”‚ Intercepciones totales: ${c.bold}${c.cyan}${stats.totalInterceptions.toString().padEnd(10)}${c.reset} β”‚
214
+ β”‚ Tokens crudos solicitados: ${c.bold}${c.yellow}${stats.totalRawTokens.toLocaleString().padEnd(12)}${c.reset} β”‚
215
+ β”‚ Tokens procesados (AST): ${c.bold}${c.white}${stats.totalGuardedTokens.toLocaleString().padEnd(12)}${c.reset} β”‚
216
+ β”‚ ${c.green}${c.bold}Tokens netos ahorrados:${c.reset} ${c.bold}${c.green}${stats.totalTokensSaved.toLocaleString().padEnd(12)}${c.reset} β”‚
217
+ β”‚ β”‚
218
+ β”‚ ${c.bold}πŸ’° Ahorro Estimado en DΓ³lares:${c.reset} β”‚
219
+ β”‚ β€’ Claude Opus 4/5: ${c.bold}${c.green}$${stats.totalDollarsSavedOpus.toFixed(2)} USD${c.reset} β”‚
220
+ β”‚ β€’ Claude Sonnet 4: ${c.bold}${c.green}$${stats.totalDollarsSavedSonnet.toFixed(2)} USD${c.reset} β”‚
221
+ β”‚ β€’ GPT-4o / Astra: ${c.bold}${c.green}$${stats.totalDollarsSavedGpt4o.toFixed(2)} USD${c.reset} β”‚
222
+ ${c.bold}β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜${c.reset}
13
223
 
14
- Options:
15
- --query, -q <text> Semantic search / intent filter for worker model
16
- --start <num> Start line number (1-indexed slice passthrough)
17
- --end <num> End line number (1-indexed slice passthrough)
18
- --force-worker Force routing through worker model
19
- --json Output result in JSON format
20
- --help, -h Show this help menu
21
- `);
224
+ ${c.dim}πŸ‘‰ Corre "context-guard stats --watch" para ver el flujo en tiempo real.${c.reset}
225
+ ${c.dim}πŸ‘‰ Corre "context-guard stats <directorio>" para auditar un proyecto.${c.reset}
226
+ `);
227
+ }
228
+ // ─── Single File Execution Card ───────────────────────────────────────────────
229
+ function printExecutionCard(filePath, result) {
230
+ const statusColor = {
231
+ PASSTHROUGH_FULL: `${c.green}βœ… PASSTHROUGH (Directo)${c.reset}`,
232
+ PASSTHROUGH_SLICE: `${c.green}βœ… SLICE (Rango acotado)${c.reset}`,
233
+ SHUNTED_LOCAL_AST: `${c.cyan}πŸ›‘οΈ SHUNTED (Esqueleto AST Tier 0)${c.reset}`,
234
+ SHUNTED_WORKER_MODEL: `${c.magenta}πŸ€– WORKER (Resumen ligero)${c.reset}`,
235
+ BLOCKED_BINARY: `${c.red}πŸ›‘ BLOCKED (Archivo Binario)${c.reset}`,
236
+ BLOCKED_LOCKFILE: `${c.red}πŸ›‘ BLOCKED (Lockfile masivo)${c.reset}`,
237
+ BLOCKED_MINIFIED: `${c.red}πŸ›‘ BLOCKED (CΓ³digo Minificado)${c.reset}`,
238
+ ERROR: `${c.red}βœ– ERROR${c.reset}`
239
+ };
240
+ const badge = statusColor[result.status] || result.status;
241
+ const fileName = path.basename(filePath);
242
+ const m = result.metrics;
243
+ console.log(`
244
+ ${c.bold}β”Œβ”€β”€ πŸ›‘οΈ ContextGuard ──────────────────────────────────────────────┐${c.reset}
245
+ β”‚ ${c.bold}Archivo:${c.reset} ${c.white}${fileName.padEnd(46)}${c.reset}β”‚
246
+ β”‚ ${c.bold}Estado:${c.reset} ${badge.padEnd(55)}β”‚
247
+ β”‚ ${c.bold}LΓ­neas:${c.reset} ${(result.totalLines ? `${result.totalLines} lΓ­neas (~${((result.sizeBytes || 0) / 1024).toFixed(1)} KB)` : 'N/A').padEnd(46)}β”‚`);
248
+ if (m && m.tokensSaved > 0) {
249
+ console.log(` β”‚ ${c.bold}Ahorro:${c.reset} ${c.green}${c.bold}-${m.tokensSaved.toLocaleString()} tokens (-${m.percentageSaved}%)${c.reset} ${c.gray}(~$${m.dollarsSaved.claudeSonnet} en Sonnet)${c.reset} β”‚`);
250
+ }
251
+ console.log(` ${c.bold}β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜${c.reset}
252
+ `);
253
+ }
254
+ // ─── CLI Entrypoint ───────────────────────────────────────────────────────────
255
+ async function runCli() {
256
+ const args = process.argv.slice(2);
257
+ if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
258
+ printHelp();
22
259
  process.exit(0);
23
260
  }
261
+ if (args.includes('-v') || args.includes('--version')) {
262
+ console.log(`ContextGuard v${VERSION}`);
263
+ process.exit(0);
264
+ }
265
+ // Subcommand: stats
266
+ if (args[0] === 'stats') {
267
+ printStats(args);
268
+ return;
269
+ }
24
270
  const filePath = path.resolve(args[0]);
25
271
  let query = '';
26
272
  let startLine;
@@ -51,9 +297,10 @@ Options:
51
297
  }
52
298
  else {
53
299
  if (result.error) {
54
- console.error(`[Error] ${result.error}`);
300
+ console.error(`${c.red}βœ– [ContextGuard Error]${c.reset} ${result.error}`);
55
301
  process.exit(1);
56
302
  }
303
+ printExecutionCard(filePath, result);
57
304
  console.log(result.content);
58
305
  }
59
306
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../bin/context-guard.ts"],"names":[],"mappings":";AAEA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,KAAK,UAAU,MAAM;IACnB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;KAcX,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,SAA6B,CAAC;IAClC,IAAI,OAA2B,CAAC;IAChC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO;YAAE,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB;YAAE,WAAW,GAAG,IAAI,CAAC;QACrD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;YAAE,UAAU,GAAG,IAAI,CAAC;IAC9C,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC;QAC3C,QAAQ;QACR,KAAK;QACL,SAAS;QACT,OAAO;QACP,WAAW;KACZ,CAAC,CAAC;IAEH,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../bin/context-guard.ts"],"names":[],"mappings":"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"}