@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.
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Token Counter and FinOps Metrics Calculator
3
+ * Accurate token estimation and price models for Frontier and Worker AI models.
4
+ */
5
+ import fs from 'node:fs';
6
+ import path from 'node:path';
7
+ import os from 'node:os';
8
+ // ─── Token Estimator ─────────────────────────────────────────────────────────
9
+ /**
10
+ * Estimates token count for code and natural text.
11
+ * Based on character length, whitespace distribution, and punctuation density.
12
+ * Calibration: 1 token ~= 3.75 characters for source code, ~= 4.0 for English prose.
13
+ */
14
+ export function estimateTokens(text) {
15
+ if (!text || text.length === 0)
16
+ return 0;
17
+ // Code contains high density of symbols/operators which tokenize as separate tokens
18
+ const symbolCount = (text.match(/[{}()[\];,.:=<>!&|+\-*/]/g) || []).length;
19
+ const wordCount = (text.match(/\b\w+\b/g) || []).length;
20
+ // Blended heuristic calibrated against tiktoken cl100k / anthropic tokenizers
21
+ const estimated = Math.round((text.length / 4.0) + (symbolCount * 0.15));
22
+ return Math.max(1, Math.max(estimated, Math.round(wordCount * 1.3)));
23
+ }
24
+ /**
25
+ * Calculates token savings and FinOps dollar amounts between raw text and guarded text.
26
+ */
27
+ export function calculateFinOps(rawText, guardedText) {
28
+ const rawBytes = Buffer.byteLength(rawText, 'utf-8');
29
+ const guardedBytes = Buffer.byteLength(guardedText, 'utf-8');
30
+ const rawTokens = estimateTokens(rawText);
31
+ const guardedTokens = estimateTokens(guardedText);
32
+ const tokensSaved = Math.max(0, rawTokens - guardedTokens);
33
+ const percentageSaved = rawTokens > 0 ? (tokensSaved / rawTokens) * 100 : 0;
34
+ // Pricing per 1M input tokens
35
+ const OPUS_PRICE_PER_M = 15.00;
36
+ const SONNET_PRICE_PER_M = 3.00;
37
+ const GPT4O_PRICE_PER_M = 2.50;
38
+ return {
39
+ rawBytes,
40
+ rawTokens,
41
+ guardedBytes,
42
+ guardedTokens,
43
+ tokensSaved,
44
+ percentageSaved: parseFloat(percentageSaved.toFixed(1)),
45
+ dollarsSaved: {
46
+ claudeOpus: parseFloat(((tokensSaved / 1_000_000) * OPUS_PRICE_PER_M).toFixed(4)),
47
+ claudeSonnet: parseFloat(((tokensSaved / 1_000_000) * SONNET_PRICE_PER_M).toFixed(4)),
48
+ gpt4o: parseFloat(((tokensSaved / 1_000_000) * GPT4O_PRICE_PER_M).toFixed(4))
49
+ }
50
+ };
51
+ }
52
+ // ─── Persistent Metrics Store (~/.contextguard/metrics.json) ──────────────────
53
+ function getMetricsFilePath() {
54
+ const dir = path.join(os.homedir(), '.contextguard');
55
+ if (!fs.existsSync(dir)) {
56
+ try {
57
+ fs.mkdirSync(dir, { recursive: true });
58
+ }
59
+ catch { }
60
+ }
61
+ return path.join(dir, 'metrics.json');
62
+ }
63
+ /**
64
+ * Records a real-time token saving event to the local ledger.
65
+ */
66
+ export function recordMetricEvent(event) {
67
+ try {
68
+ const file = getMetricsFilePath();
69
+ let events = [];
70
+ if (fs.existsSync(file)) {
71
+ try {
72
+ const raw = fs.readFileSync(file, 'utf-8');
73
+ events = JSON.parse(raw);
74
+ }
75
+ catch { }
76
+ }
77
+ events.push({
78
+ ...event,
79
+ timestamp: new Date().toISOString()
80
+ });
81
+ // Keep the last 1,000 events to avoid unbounded file growth
82
+ if (events.length > 1000) {
83
+ events = events.slice(-1000);
84
+ }
85
+ fs.writeFileSync(file, JSON.stringify(events, null, 2), 'utf-8');
86
+ }
87
+ catch {
88
+ // Non-fatal if disk write fails
89
+ }
90
+ }
91
+ /**
92
+ * Reads and aggregates all persistent metrics.
93
+ */
94
+ export function getAggregatedStats() {
95
+ const file = getMetricsFilePath();
96
+ let events = [];
97
+ if (fs.existsSync(file)) {
98
+ try {
99
+ const raw = fs.readFileSync(file, 'utf-8');
100
+ events = JSON.parse(raw);
101
+ }
102
+ catch { }
103
+ }
104
+ let totalRawTokens = 0;
105
+ let totalGuardedTokens = 0;
106
+ let totalTokensSaved = 0;
107
+ for (const e of events) {
108
+ totalRawTokens += e.rawTokens || 0;
109
+ totalGuardedTokens += e.guardedTokens || 0;
110
+ totalTokensSaved += e.tokensSaved || 0;
111
+ }
112
+ return {
113
+ totalInterceptions: events.length,
114
+ totalRawTokens,
115
+ totalGuardedTokens,
116
+ totalTokensSaved,
117
+ totalDollarsSavedOpus: parseFloat(((totalTokensSaved / 1_000_000) * 15.00).toFixed(2)),
118
+ totalDollarsSavedSonnet: parseFloat(((totalTokensSaved / 1_000_000) * 3.00).toFixed(2)),
119
+ totalDollarsSavedGpt4o: parseFloat(((totalTokensSaved / 1_000_000) * 2.50).toFixed(2)),
120
+ events
121
+ };
122
+ }
123
+ /**
124
+ * Clears the persistent metrics log.
125
+ */
126
+ export function resetMetrics() {
127
+ const file = getMetricsFilePath();
128
+ if (fs.existsSync(file)) {
129
+ try {
130
+ fs.unlinkSync(file);
131
+ }
132
+ catch { }
133
+ }
134
+ }
135
+ //# sourceMappingURL=token-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metrics.js","sourceRoot":"","sources":["../../src/token-metrics.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,7 @@ export interface ProcessFileResult {
28
28
  provider?: string;
29
29
  warning?: string;
30
30
  error?: string;
31
+ metrics?: import('./token-metrics.js').TokenComparison;
31
32
  }
32
33
  export interface ClaudeToolInput {
33
34
  file_path?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,iBAAiB,GACzB,kBAAkB,GAClB,mBAAmB,GACnB,mBAAmB,GACnB,sBAAsB,GACtB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,GAClB,OAAO,CAAC;AAEZ,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,iBAAiB,GACzB,kBAAkB,GAClB,mBAAmB,GACnB,mBAAmB,GACnB,sBAAsB,GACtB,gBAAgB,GAChB,gBAAgB,GAChB,kBAAkB,GAClB,kBAAkB,GAClB,OAAO,CAAC;AAEZ,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,oBAAoB,EAAE,eAAe,CAAC;CACxD;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB"}
@@ -15,6 +15,10 @@ const MCP_SERVER_BIN = path.resolve(__dirname, '../../dist/bin/mcp-server.js');
15
15
  function sendRequest(proc, request) {
16
16
  return new Promise((resolve, reject) => {
17
17
  let buffer = '';
18
+ const onError = (err) => {
19
+ cleanup();
20
+ reject(err);
21
+ };
18
22
  const onData = (chunk) => {
19
23
  buffer += chunk.toString();
20
24
  const lines = buffer.split('\n');
@@ -24,7 +28,7 @@ function sendRequest(proc, request) {
24
28
  try {
25
29
  const parsed = JSON.parse(line);
26
30
  if (parsed.id === request.id) {
27
- proc.stdout.removeListener('data', onData);
31
+ cleanup();
28
32
  resolve(parsed);
29
33
  return;
30
34
  }
@@ -35,11 +39,15 @@ function sendRequest(proc, request) {
35
39
  }
36
40
  buffer = lines[lines.length - 1] ?? '';
37
41
  };
42
+ const cleanup = () => {
43
+ proc.stdout.removeListener('data', onData);
44
+ proc.removeListener('error', onError);
45
+ };
38
46
  proc.stdout.on('data', onData);
39
- proc.on('error', reject);
47
+ proc.on('error', onError);
40
48
  proc.stdin.write(JSON.stringify(request) + '\n');
41
49
  setTimeout(() => {
42
- proc.stdout.removeListener('data', onData);
50
+ cleanup();
43
51
  reject(new Error(`Timeout waiting for response to request id=${request.id}`));
44
52
  }, 5000);
45
53
  });
@@ -197,19 +205,44 @@ describe('ContextGuard MCP Server (Phase 2)', () => {
197
205
  assert.ok(text.includes('OUTLINE'), 'Must include OUTLINE badge');
198
206
  fs.rmSync(tmpDir, { recursive: true });
199
207
  });
200
- // ── grep_distilled ──────────────────────────────────────────────────────────
201
- it('grep_distilled: should return no-match message when pattern is not found', async () => {
208
+ it('grep_distilled: should find matches and extract structural outline via ripgrep or node fallback', async () => {
202
209
  const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cg-mcp-'));
203
- fs.writeFileSync(path.join(tmpDir, 'a.ts'), 'export const x = 1;');
210
+ const testFile = path.join(tmpDir, 'controller.ts');
211
+ fs.writeFileSync(testFile, [
212
+ 'export class UserController {',
213
+ ' async findUserById(id: string) {',
214
+ ' const targetId = id;',
215
+ ' return targetId;',
216
+ ' }',
217
+ '}'
218
+ ].join('\n'));
204
219
  const res = await sendRequest(proc, req('tools/call', {
205
220
  name: 'grep_distilled',
206
- arguments: { pattern: 'PATTERN_THAT_DOES_NOT_EXIST_XYZ123', directory: tmpDir }
221
+ arguments: { pattern: 'targetId', directory: tmpDir }
207
222
  }));
208
223
  assert.ok(!res.error, `Unexpected error: ${JSON.stringify(res.error)}`);
209
224
  const result = res.result;
210
225
  const text = result.content[0].text;
211
- assert.ok(text.includes('No matches') || text.includes('not available'), 'Must indicate no matches');
226
+ assert.ok(text.includes('controller.ts'), 'Must find controller.ts file');
227
+ assert.ok(text.includes('targetId'), 'Must contain match line');
212
228
  fs.rmSync(tmpDir, { recursive: true });
213
229
  });
230
+ // ── Resources & Prompts (MCP Best Practices) ────────────────────────────────
231
+ it('resources: should list contextguard://config and read active configuration', async () => {
232
+ const listRes = await sendRequest(proc, req('resources/list'));
233
+ assert.ok(!listRes.error, `Unexpected error: ${JSON.stringify(listRes.error)}`);
234
+ const listResult = listRes.result;
235
+ assert.ok(listResult.resources.some((r) => r.uri === 'contextguard://config'), 'Must list config resource');
236
+ const readRes = await sendRequest(proc, req('resources/read', { uri: 'contextguard://config' }));
237
+ assert.ok(!readRes.error, `Unexpected error: ${JSON.stringify(readRes.error)}`);
238
+ const readResult = readRes.result;
239
+ assert.ok(readResult.contents[0].text.includes('maxLinesThreshold'), 'Must return valid config JSON');
240
+ });
241
+ it('prompts: should list investigate_codebase_safely prompt', async () => {
242
+ const res = await sendRequest(proc, req('prompts/list'));
243
+ assert.ok(!res.error, `Unexpected error: ${JSON.stringify(res.error)}`);
244
+ const result = res.result;
245
+ assert.ok(result.prompts.some((p) => p.name === 'investigate_codebase_safely'), 'Must expose prompt template');
246
+ });
214
247
  });
215
248
  //# sourceMappingURL=mcp-server.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server.test.js","sourceRoot":"","sources":["../../tests/mcp-server.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-server.test.js","sourceRoot":"","sources":["../../tests/mcp-server.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=token-metrics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metrics.test.d.ts","sourceRoot":"","sources":["../../tests/token-metrics.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Token Metrics and FinOps Unit Tests
3
+ */
4
+ import { describe, it } from 'node:test';
5
+ import assert from 'node:assert';
6
+ import { estimateTokens, calculateFinOps, getAggregatedStats, resetMetrics, recordMetricEvent } from '../src/token-metrics.js';
7
+ describe('Token Metrics & FinOps (Fase 5 Preview)', () => {
8
+ it('should estimate tokens accurately for code and text', () => {
9
+ const empty = estimateTokens('');
10
+ assert.strictEqual(empty, 0);
11
+ const smallCode = 'export const add = (a: number, b: number): number => a + b;';
12
+ const tokens = estimateTokens(smallCode);
13
+ assert.ok(tokens > 10 && tokens < 25, `Expected reasonable token count, got ${tokens}`);
14
+ });
15
+ it('should calculate savings percentage and dollar amounts', () => {
16
+ const rawContent = 'line\n'.repeat(400); // 400 lines
17
+ const skeletonContent = 'line\n'.repeat(20); // 20 lines
18
+ const fin = calculateFinOps(rawContent, skeletonContent);
19
+ assert.ok(fin.tokensSaved > 0, 'Must have saved tokens');
20
+ assert.ok(fin.percentageSaved > 80, `Expected >80% savings, got ${fin.percentageSaved}%`);
21
+ assert.ok(fin.dollarsSaved.claudeSonnet >= 0);
22
+ assert.ok(fin.dollarsSaved.claudeOpus >= 0);
23
+ });
24
+ it('should record metric events and aggregate stats', () => {
25
+ resetMetrics();
26
+ recordMetricEvent({
27
+ source: 'cli',
28
+ filePath: 'test.ts',
29
+ action: 'SHUNTED_LOCAL_AST',
30
+ rawTokens: 1000,
31
+ guardedTokens: 100,
32
+ tokensSaved: 900,
33
+ dollarsSavedSonnet: 0.0027
34
+ });
35
+ const stats = getAggregatedStats();
36
+ assert.strictEqual(stats.totalInterceptions, 1);
37
+ assert.strictEqual(stats.totalTokensSaved, 900);
38
+ assert.ok(stats.events.length === 1);
39
+ });
40
+ });
41
+ //# sourceMappingURL=token-metrics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-metrics.test.js","sourceRoot":"","sources":["../../tests/token-metrics.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE/H,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAE7B,MAAM,SAAS,GAAG,6DAA6D,CAAC;QAChF,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACzC,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE,EAAE,wCAAwC,MAAM,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY;QACrD,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;QAExD,MAAM,GAAG,GAAG,eAAe,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,wBAAwB,CAAC,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,GAAG,EAAE,EAAE,8BAA8B,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC;QAC1F,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,YAAY,EAAE,CAAC;QAEf,iBAAiB,CAAC;YAChB,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,SAAS;YACnB,MAAM,EAAE,mBAAmB;YAC3B,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,GAAG;YAClB,WAAW,EAAE,GAAG;YAChB,kBAAkB,EAAE,MAAM;SAC3B,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;QACnC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -4,6 +4,7 @@
4
4
  "command": "npx",
5
5
  "args": [
6
6
  "-y",
7
+ "-p",
7
8
  "@kevinbermudezc/context-guard@latest",
8
9
  "context-guard-mcp"
9
10
  ]
@@ -4,6 +4,7 @@
4
4
  "command": "npx",
5
5
  "args": [
6
6
  "-y",
7
+ "-p",
7
8
  "@kevinbermudezc/context-guard@latest",
8
9
  "context-guard-mcp"
9
10
  ]
@@ -4,6 +4,7 @@
4
4
  "command": "npx",
5
5
  "args": [
6
6
  "-y",
7
+ "-p",
7
8
  "@kevinbermudezc/context-guard@latest",
8
9
  "context-guard-mcp"
9
10
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kevinbermudezc/context-guard",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Intelligent context admission control and token optimization for Claude Code, Cursor, Windsurf, Antigravity, and Agentic AI workflows.",
5
5
  "publishConfig": {
6
6
  "access": "public"