@kevinbermudezc/context-guard 1.4.0 → 1.5.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 +39 -1
- package/dist/bin/claude-hook.js +35 -14
- package/dist/bin/claude-hook.js.map +1 -1
- package/dist/bin/context-guard.js +153 -0
- package/dist/bin/context-guard.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/update-notifier.d.ts +30 -0
- package/dist/src/update-notifier.d.ts.map +1 -0
- package/dist/src/update-notifier.js +150 -0
- package/dist/src/update-notifier.js.map +1 -0
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/tests/antigravity-hook.test.d.ts +2 -0
- package/dist/tests/antigravity-hook.test.d.ts.map +1 -0
- package/dist/tests/antigravity-hook.test.js +88 -0
- package/dist/tests/antigravity-hook.test.js.map +1 -0
- package/dist/tests/init.test.d.ts +2 -0
- package/dist/tests/init.test.d.ts.map +1 -0
- package/dist/tests/init.test.js +63 -0
- package/dist/tests/init.test.js.map +1 -0
- package/dist/tests/mcp-server.test.js +1 -1
- package/dist/tests/update-notifier.test.d.ts +2 -0
- package/dist/tests/update-notifier.test.d.ts.map +1 -0
- package/dist/tests/update-notifier.test.js +60 -0
- package/dist/tests/update-notifier.test.js.map +1 -0
- package/examples/hooks/antigravity-hooks.json +17 -0
- package/examples/rules/antigravity/context-guard.md +15 -0
- package/examples/rules/cursor/context-guard.mdc +25 -0
- package/examples/skills/context-guard/SKILL.md +48 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -260,11 +260,49 @@ Add to your respective MCP configuration file:
|
|
|
260
260
|
|
|
261
261
|
---
|
|
262
262
|
|
|
263
|
-
##
|
|
263
|
+
## 🤖 Native Agent Adapters & Automatic Setup (Phase 3)
|
|
264
|
+
|
|
265
|
+
ContextGuard is natively compatible with **Google Antigravity (AGY)**, **Cursor**, and **Claude Code**. Instead of manually configuring JSON files, you can initialize your workspace with a single command:
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
# Auto-detects and provisions rules, skills, and MCP for ALL agents
|
|
269
|
+
npx @kevinbermudezc/context-guard init
|
|
270
|
+
|
|
271
|
+
# Or target a specific coding environment:
|
|
272
|
+
npx @kevinbermudezc/context-guard init cursor
|
|
273
|
+
npx @kevinbermudezc/context-guard init antigravity
|
|
274
|
+
npx @kevinbermudezc/context-guard init claude
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### 1. 🪁 Google Antigravity (AGY) Integration
|
|
278
|
+
When running `context-guard init antigravity` (or configuring manually):
|
|
279
|
+
- **Project Rule (`.agents/rules/context-guard.md`)**: Instructs Antigravity agents to never dump large files (>300 lines) and prioritize `inspect_outline` and `read_file_safe`.
|
|
280
|
+
- **Custom Skill (`.agents/skills/context-guard/SKILL.md`)**: Activates progressive disclosure runbooks whenever the agent explores large components or unmapped codebases.
|
|
281
|
+
- **Lifecycle Interception Hook (`.agents/hooks.json`)**: Intercepts `view_file` calls using the native JSON protocol (`{ decision: "deny", reason: "..." }`) to block raw lockfiles or un-scoped reads.
|
|
282
|
+
|
|
283
|
+
### 2. 🖱️ Cursor IDE Integration
|
|
284
|
+
When running `context-guard init cursor`:
|
|
285
|
+
- **Cursor Rule (`.cursor/rules/context-guard.mdc`)**: Configured with `alwaysApply: true` to prevent Composer from flooding its reasoning window with raw >300-line file dumps.
|
|
286
|
+
- **MCP Config (`.cursor/mcp.json`)**: Seamlessly connects Cursor Composer to `read_file_safe`, `inspect_outline`, and `grep_distilled`.
|
|
287
|
+
|
|
288
|
+
### 3. 🤖 Claude Code Integration
|
|
289
|
+
When running `context-guard init claude`:
|
|
290
|
+
- **PreToolUse Hook (`.claude/settings.json`)**: Intercepts `Read`, `View`, and un-piped `Bash` commands (`cat file.ts`), returning `Exit Code 2` with an AST skeleton and line-tagged signatures in `stderr`.
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## 🛠️ CLI & FinOps Telemetry (v1.5.0)
|
|
264
295
|
|
|
265
296
|
ContextGuard includes a beautiful developer CLI with built-in token savings, financial ROI telemetry, and privacy controls:
|
|
266
297
|
|
|
267
298
|
```bash
|
|
299
|
+
# Automatically configure rules and MCP for all agents in your repository
|
|
300
|
+
npx @kevinbermudezc/context-guard init
|
|
301
|
+
|
|
302
|
+
# Target specific agent (antigravity, cursor, or claude)
|
|
303
|
+
npx @kevinbermudezc/context-guard init cursor
|
|
304
|
+
npx @kevinbermudezc/context-guard init antigravity
|
|
305
|
+
|
|
268
306
|
# View file through ContextGuard (shows FinOps savings card if shunted)
|
|
269
307
|
npx @kevinbermudezc/context-guard src/large-service.ts
|
|
270
308
|
|
package/dist/bin/claude-hook.js
CHANGED
|
@@ -27,11 +27,33 @@ async function runHook() {
|
|
|
27
27
|
catch {
|
|
28
28
|
process.exit(0); // If stdin is not valid JSON, allow
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
const
|
|
30
|
+
// Support both Claude Code (tool_name / name) and Antigravity (toolCall.name)
|
|
31
|
+
const isAntigravity = Boolean(payload.toolCall);
|
|
32
|
+
const toolName = payload.toolCall ? payload.toolCall.name : (payload.tool_name || payload.name);
|
|
33
|
+
const toolInput = payload.toolCall ? (payload.toolCall.args || {}) : (payload.tool_input || payload.input || {});
|
|
34
|
+
// Helper function to respond correctly to either Claude Code or Antigravity
|
|
35
|
+
const respondAllow = () => {
|
|
36
|
+
if (isAntigravity) {
|
|
37
|
+
process.stdout.write(JSON.stringify({ decision: 'allow' }) + '\n');
|
|
38
|
+
}
|
|
39
|
+
process.exit(0);
|
|
40
|
+
};
|
|
41
|
+
const respondDeny = (message) => {
|
|
42
|
+
if (isAntigravity) {
|
|
43
|
+
process.stdout.write(JSON.stringify({
|
|
44
|
+
decision: 'deny',
|
|
45
|
+
reason: message
|
|
46
|
+
}) + '\n');
|
|
47
|
+
process.exit(0);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
process.stderr.write(message + '\n');
|
|
51
|
+
process.exit(2);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
32
54
|
let targetFilePath = null;
|
|
33
55
|
let isScoped = false;
|
|
34
|
-
// 1. Intercept "Read", "View" or other file reading tools in Claude Code
|
|
56
|
+
// 1. Intercept "Read", "View" or other file reading tools in Claude Code / Antigravity
|
|
35
57
|
const isReadTool = ['Read', 'View', 'view_file', 'readFile', 'read_file'].includes(toolName || '');
|
|
36
58
|
if (isReadTool) {
|
|
37
59
|
const rawPath = toolInput.file_path || toolInput.path || toolInput.filePath || toolInput.AbsolutePath;
|
|
@@ -50,7 +72,7 @@ async function runHook() {
|
|
|
50
72
|
const cmd = (toolInput.command || '').trim();
|
|
51
73
|
// Allow piped/filtered commands (e.g. cat file | grep foo, or head -n 20)
|
|
52
74
|
if (cmd.includes('|') || cmd.includes('>') || cmd.startsWith('head -n') || cmd.startsWith('tail -n')) {
|
|
53
|
-
|
|
75
|
+
respondAllow();
|
|
54
76
|
}
|
|
55
77
|
const catMatch = cmd.match(/^(?:cat|less|more)\s+(["']?)([^"'\s]+)\1$/);
|
|
56
78
|
if (catMatch) {
|
|
@@ -59,11 +81,12 @@ async function runHook() {
|
|
|
59
81
|
}
|
|
60
82
|
// If not a reading tool or already scoped, allow execution immediately
|
|
61
83
|
if (!targetFilePath || isScoped) {
|
|
62
|
-
|
|
84
|
+
respondAllow();
|
|
63
85
|
}
|
|
64
|
-
const
|
|
86
|
+
const filePath = targetFilePath;
|
|
87
|
+
const resolvedPath = path.resolve(process.cwd(), filePath);
|
|
65
88
|
if (!fs.existsSync(resolvedPath) || fs.statSync(resolvedPath).isDirectory()) {
|
|
66
|
-
|
|
89
|
+
respondAllow();
|
|
67
90
|
}
|
|
68
91
|
const ext = path.extname(resolvedPath).toLowerCase();
|
|
69
92
|
// 3. Allow Claude Code native multimodal formats & notebooks (.png, .jpg, .pdf, .ipynb)
|
|
@@ -74,7 +97,7 @@ async function runHook() {
|
|
|
74
97
|
'.ipynb'
|
|
75
98
|
]);
|
|
76
99
|
if (CLAUDE_NATIVE_MEDIA_EXTENSIONS.has(ext)) {
|
|
77
|
-
|
|
100
|
+
respondAllow();
|
|
78
101
|
}
|
|
79
102
|
// 4. Check for Non-Multimodal Binaries, Lockfiles, and Minified files
|
|
80
103
|
const classification = classifyFile(resolvedPath);
|
|
@@ -85,8 +108,7 @@ async function runHook() {
|
|
|
85
108
|
``,
|
|
86
109
|
`👉 ${classification.recommendedAction}`
|
|
87
110
|
].join('\n');
|
|
88
|
-
|
|
89
|
-
process.exit(2);
|
|
111
|
+
respondDeny(feedback);
|
|
90
112
|
}
|
|
91
113
|
const stat = fs.statSync(resolvedPath);
|
|
92
114
|
const rawContent = fs.readFileSync(resolvedPath, 'utf-8');
|
|
@@ -94,7 +116,7 @@ async function runHook() {
|
|
|
94
116
|
const totalLines = lines.length;
|
|
95
117
|
// If within safety thresholds, allow direct read
|
|
96
118
|
if (totalLines <= CONFIG.maxLines && stat.size <= CONFIG.maxBytes) {
|
|
97
|
-
|
|
119
|
+
respondAllow();
|
|
98
120
|
}
|
|
99
121
|
// ========================================================================
|
|
100
122
|
// APPLY CONTEXTGUARD SHUNT (BLOCK AND EMIT SKELETON)
|
|
@@ -125,9 +147,8 @@ async function runHook() {
|
|
|
125
147
|
`🎯 ACCIÓN RECOMENDADA:`,
|
|
126
148
|
`Revisa las firmas anteriores y ejecuta la herramienta "Read" (o "View") especificando los parámetros "offset" y "limit" para inspeccionar únicamente la sección necesaria.`
|
|
127
149
|
].join('\n');
|
|
128
|
-
// Emit
|
|
129
|
-
|
|
130
|
-
process.exit(2);
|
|
150
|
+
// Emit controlled block with system feedback in Claude Code or Antigravity
|
|
151
|
+
respondDeny(feedbackMessage);
|
|
131
152
|
}
|
|
132
153
|
runHook().catch(() => process.exit(0));
|
|
133
154
|
//# sourceMappingURL=claude-hook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-hook.js","sourceRoot":"","sources":["../../bin/claude-hook.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAG7E,KAAK,UAAU,OAAO;IACpB,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,
|
|
1
|
+
{"version":3,"file":"claude-hook.js","sourceRoot":"","sources":["../../bin/claude-hook.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { processWithContextGuard } from '../src/index.js';
|
|
|
5
5
|
import { extractCodeSkeleton } from '../src/skeletonizer.js';
|
|
6
6
|
import { getAggregatedStats, resetMetrics, calculateFinOps } from '../src/token-metrics.js';
|
|
7
7
|
import { isTelemetryEnabled, enableTelemetry, disableTelemetry, getAnonymousId } from '../src/telemetry.js';
|
|
8
|
+
import { getUpdateNotice } from '../src/update-notifier.js';
|
|
8
9
|
import { VERSION } from '../src/version.js';
|
|
9
10
|
// ─── Minimal ANSI Formatting (Clean, Terminal-Agnostic) ───────────────────────
|
|
10
11
|
const c = {
|
|
@@ -33,6 +34,7 @@ function printHelp() {
|
|
|
33
34
|
${c.green}context-guard telemetry${c.reset} <status|enable|disable>
|
|
34
35
|
|
|
35
36
|
${c.bold}COMMANDS${c.reset}
|
|
37
|
+
${c.cyan}init${c.reset} [agent] Configura ContextGuard automáticamente (antigravity, cursor, claude, all)
|
|
36
38
|
${c.cyan}stats${c.reset} [dir] Muestra la telemetría acumulada o audita un directorio
|
|
37
39
|
${c.cyan}stats --watch${c.reset} Monitor interactivo de consumo y ahorro en tiempo real
|
|
38
40
|
${c.cyan}stats --reset${c.reset} Reinicia el historial de métricas locales
|
|
@@ -226,6 +228,143 @@ function printStats(args) {
|
|
|
226
228
|
${c.dim}💡 Corre "context-guard stats <directorio>" para auditar una carpeta.${c.reset}
|
|
227
229
|
`);
|
|
228
230
|
}
|
|
231
|
+
// ─── Workspace Initializer (Phase 3 Native Adapters) ──────────────────────────
|
|
232
|
+
function initWorkspace(agentArg) {
|
|
233
|
+
const rootDir = process.cwd();
|
|
234
|
+
const agent = (agentArg || 'all').toLowerCase();
|
|
235
|
+
console.log(`
|
|
236
|
+
${c.cyan}🛡️ ${c.bold}ContextGuard Workspace Initializer${c.reset}
|
|
237
|
+
${c.dim}Configurando adaptadores y reglas nativas de ContextGuard...${c.reset}
|
|
238
|
+
`);
|
|
239
|
+
const configured = [];
|
|
240
|
+
// 1. Antigravity Adapter (.agents/rules/context-guard.md & .agents/skills/context-guard/SKILL.md)
|
|
241
|
+
if (['all', 'antigravity', 'agy'].includes(agent)) {
|
|
242
|
+
const agentsDir = path.join(rootDir, '.agents');
|
|
243
|
+
const rulesDir = path.join(agentsDir, 'rules');
|
|
244
|
+
const skillDir = path.join(agentsDir, 'skills', 'context-guard');
|
|
245
|
+
fs.mkdirSync(rulesDir, { recursive: true });
|
|
246
|
+
fs.mkdirSync(skillDir, { recursive: true });
|
|
247
|
+
const ruleContent = `# 🛡️ ContextGuard Project Rule for Google Antigravity (AGY)
|
|
248
|
+
|
|
249
|
+
You MUST follow these context admission control and token optimization rules:
|
|
250
|
+
|
|
251
|
+
## 1. Context Admission Control
|
|
252
|
+
- **Do NOT read large files (>300 lines) into context unrestricted.**
|
|
253
|
+
- When \`read_file_safe\` is available via MCP:
|
|
254
|
+
- Use \`inspect_outline(file_path)\` to get a structural map of the file with line numbers \`[L#]\`.
|
|
255
|
+
- Use \`read_file_safe(file_path)\` which automatically returns an AST skeleton for files >300 lines.
|
|
256
|
+
- When inspecting implementations, read targeted line ranges:
|
|
257
|
+
\`read_file_safe(file_path, start_line=..., end_line=...)\` or \`view_file(AbsolutePath=..., StartLine=..., EndLine=...)\`.
|
|
258
|
+
|
|
259
|
+
## 2. Lockfiles and Binaries
|
|
260
|
+
- **Never open lockfiles** (\`package-lock.json\`, \`pnpm-lock.yaml\`, \`yarn.lock\`, \`bun.lockb\`) or compiled/minified bundles (\`.min.js\`, \`.wasm\`, \`.pyc\`).
|
|
261
|
+
- Use command-line tools (\`pnpm why <pkg>\`, \`npm ls <pkg>\`, or read \`package.json\` directly) to check package dependencies.
|
|
262
|
+
`;
|
|
263
|
+
const skillContent = `---
|
|
264
|
+
name: context-guard
|
|
265
|
+
description: >-
|
|
266
|
+
Uses ContextGuard to inspect large files, outlines, and structural AST skeletons safely without blowing up the context window. Use whenever exploring unfamiliar files, large components (>300 lines), or auditing token consumption.
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
# 🛡️ ContextGuard Skill for Antigravity
|
|
270
|
+
|
|
271
|
+
ContextGuard provides intelligent context admission control, reducing token usage by up to 90% when reading large source files.
|
|
272
|
+
|
|
273
|
+
## Workflow:
|
|
274
|
+
1. Inspect file outline first: \`inspect_outline(file_path)\`
|
|
275
|
+
2. Read safe content: \`read_file_safe(file_path)\`
|
|
276
|
+
3. Read targeted ranges: \`read_file_safe(file_path, start_line=N, end_line=M)\`
|
|
277
|
+
4. Search symbols structurally: \`grep_distilled(pattern=...)\`
|
|
278
|
+
`;
|
|
279
|
+
fs.writeFileSync(path.join(rulesDir, 'context-guard.md'), ruleContent, 'utf-8');
|
|
280
|
+
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), skillContent, 'utf-8');
|
|
281
|
+
// Add or merge .agents/mcp.json
|
|
282
|
+
const mcpFile = path.join(agentsDir, 'mcp.json');
|
|
283
|
+
let mcpConfig = { mcpServers: {} };
|
|
284
|
+
if (fs.existsSync(mcpFile)) {
|
|
285
|
+
try {
|
|
286
|
+
mcpConfig = JSON.parse(fs.readFileSync(mcpFile, 'utf-8'));
|
|
287
|
+
}
|
|
288
|
+
catch { }
|
|
289
|
+
}
|
|
290
|
+
mcpConfig.mcpServers = mcpConfig.mcpServers || {};
|
|
291
|
+
mcpConfig.mcpServers['context-guard'] = {
|
|
292
|
+
command: 'npx',
|
|
293
|
+
args: ['-y', '-p', '@kevinbermudezc/context-guard@latest', 'context-guard-mcp']
|
|
294
|
+
};
|
|
295
|
+
fs.writeFileSync(mcpFile, JSON.stringify(mcpConfig, null, 2), 'utf-8');
|
|
296
|
+
configured.push(`Google Antigravity (.agents/rules, .agents/skills, .agents/mcp.json)`);
|
|
297
|
+
}
|
|
298
|
+
// 2. Cursor Adapter (.cursor/rules/context-guard.mdc & .cursor/mcp.json)
|
|
299
|
+
if (['all', 'cursor'].includes(agent)) {
|
|
300
|
+
const cursorDir = path.join(rootDir, '.cursor');
|
|
301
|
+
const rulesDir = path.join(cursorDir, 'rules');
|
|
302
|
+
fs.mkdirSync(rulesDir, { recursive: true });
|
|
303
|
+
const cursorRuleContent = `---
|
|
304
|
+
description: ContextGuard FinOps and Context Window Admission Control
|
|
305
|
+
globs: *
|
|
306
|
+
alwaysApply: true
|
|
307
|
+
---
|
|
308
|
+
|
|
309
|
+
# 🛡️ ContextGuard Rule for Cursor (Composer & Chat)
|
|
310
|
+
|
|
311
|
+
You MUST follow these context admission control and token optimization rules:
|
|
312
|
+
1. Zero direct reads for files >300 lines without slice bounds.
|
|
313
|
+
2. Prioritize ContextGuard MCP tools:
|
|
314
|
+
- \`read_file_safe(file_path)\`: Returns AST skeleton automatically for files >300 lines.
|
|
315
|
+
- \`inspect_outline(file_path)\`: Instant zero-cost structural outline (<5ms).
|
|
316
|
+
- Read targeted slices: \`read_file_safe(file_path, start_line, end_line)\`.
|
|
317
|
+
3. Never read lockfiles (\`package-lock.json\`, \`pnpm-lock.yaml\`) or minified bundles.
|
|
318
|
+
`;
|
|
319
|
+
fs.writeFileSync(path.join(rulesDir, 'context-guard.mdc'), cursorRuleContent, 'utf-8');
|
|
320
|
+
const cursorMcpFile = path.join(cursorDir, 'mcp.json');
|
|
321
|
+
let cursorMcpConfig = { mcpServers: {} };
|
|
322
|
+
if (fs.existsSync(cursorMcpFile)) {
|
|
323
|
+
try {
|
|
324
|
+
cursorMcpConfig = JSON.parse(fs.readFileSync(cursorMcpFile, 'utf-8'));
|
|
325
|
+
}
|
|
326
|
+
catch { }
|
|
327
|
+
}
|
|
328
|
+
cursorMcpConfig.mcpServers = cursorMcpConfig.mcpServers || {};
|
|
329
|
+
cursorMcpConfig.mcpServers['context-guard'] = {
|
|
330
|
+
command: 'npx',
|
|
331
|
+
args: ['-y', '-p', '@kevinbermudezc/context-guard@latest', 'context-guard-mcp']
|
|
332
|
+
};
|
|
333
|
+
fs.writeFileSync(cursorMcpFile, JSON.stringify(cursorMcpConfig, null, 2), 'utf-8');
|
|
334
|
+
configured.push(`Cursor (.cursor/rules/context-guard.mdc, .cursor/mcp.json)`);
|
|
335
|
+
}
|
|
336
|
+
// 3. Claude Code Adapter (.claude/settings.json PreToolUse hook)
|
|
337
|
+
if (['all', 'claude'].includes(agent)) {
|
|
338
|
+
const claudeDir = path.join(rootDir, '.claude');
|
|
339
|
+
fs.mkdirSync(claudeDir, { recursive: true });
|
|
340
|
+
const settingsFile = path.join(claudeDir, 'settings.json');
|
|
341
|
+
let settings = {};
|
|
342
|
+
if (fs.existsSync(settingsFile)) {
|
|
343
|
+
try {
|
|
344
|
+
settings = JSON.parse(fs.readFileSync(settingsFile, 'utf-8'));
|
|
345
|
+
}
|
|
346
|
+
catch { }
|
|
347
|
+
}
|
|
348
|
+
settings.hooks = settings.hooks || {};
|
|
349
|
+
settings.hooks.PreToolUse = settings.hooks.PreToolUse || [];
|
|
350
|
+
const hookCmd = 'npx -y -p @kevinbermudezc/context-guard context-guard-hook';
|
|
351
|
+
const exists = settings.hooks.PreToolUse.some((h) => h.command && h.command.includes('context-guard-hook'));
|
|
352
|
+
if (!exists) {
|
|
353
|
+
settings.hooks.PreToolUse.push({
|
|
354
|
+
matcher: 'Read|View|view_file|readFile|read_file|Bash|bash',
|
|
355
|
+
command: hookCmd
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
fs.writeFileSync(settingsFile, JSON.stringify(settings, null, 2), 'utf-8');
|
|
359
|
+
configured.push(`Claude Code (.claude/settings.json PreToolUse hook)`);
|
|
360
|
+
}
|
|
361
|
+
for (const item of configured) {
|
|
362
|
+
console.log(` ${c.green}✔ Adaptador configurado:${c.reset} ${item}`);
|
|
363
|
+
}
|
|
364
|
+
console.log(`
|
|
365
|
+
${c.bold}🚀 ¡Todo listo!${c.reset} Tus agentes ahora respetarán los límites de contexto y optimizarán tokens automáticamente.
|
|
366
|
+
`);
|
|
367
|
+
}
|
|
229
368
|
// ─── Single File Execution Card ───────────────────────────────────────────────
|
|
230
369
|
function printExecutionCard(filePath, result) {
|
|
231
370
|
const statusLabels = {
|
|
@@ -251,6 +390,15 @@ function printExecutionCard(filePath, result) {
|
|
|
251
390
|
// ─── CLI Entrypoint ───────────────────────────────────────────────────────────
|
|
252
391
|
async function runCli() {
|
|
253
392
|
const args = process.argv.slice(2);
|
|
393
|
+
// Non-blocking update notification check (silent and clean)
|
|
394
|
+
const isJson = args.includes('--json');
|
|
395
|
+
const isWatch = args.includes('--watch') || args.includes('-w');
|
|
396
|
+
if (!isJson && !isWatch) {
|
|
397
|
+
const notice = getUpdateNotice(VERSION);
|
|
398
|
+
if (notice) {
|
|
399
|
+
console.log(`\n${notice.message}\n`);
|
|
400
|
+
}
|
|
401
|
+
}
|
|
254
402
|
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
255
403
|
printHelp();
|
|
256
404
|
process.exit(0);
|
|
@@ -259,6 +407,11 @@ async function runCli() {
|
|
|
259
407
|
console.log(`ContextGuard v${VERSION}`);
|
|
260
408
|
process.exit(0);
|
|
261
409
|
}
|
|
410
|
+
// Subcommand: init
|
|
411
|
+
if (args[0] === 'init') {
|
|
412
|
+
initWorkspace(args[1]);
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
262
415
|
// Subcommand: stats
|
|
263
416
|
if (args[0] === 'stats') {
|
|
264
417
|
printStats(args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../bin/context-guard.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"context-guard.js","sourceRoot":"","sources":["../../bin/context-guard.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export * from './import-collapser.js';
|
|
|
8
8
|
export * from './token-metrics.js';
|
|
9
9
|
export * from './telemetry.js';
|
|
10
10
|
export * from './version.js';
|
|
11
|
+
export * from './update-notifier.js';
|
|
11
12
|
/**
|
|
12
13
|
* Main engine of ContextGuard
|
|
13
14
|
* Evaluates file size and either passes it through or shunts it to an AST/Worker summary.
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMxE,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAMxE,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AAErC;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkJrG"}
|
package/dist/src/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export * from './import-collapser.js';
|
|
|
16
16
|
export * from './token-metrics.js';
|
|
17
17
|
export * from './telemetry.js';
|
|
18
18
|
export * from './version.js';
|
|
19
|
+
export * from './update-notifier.js';
|
|
19
20
|
/**
|
|
20
21
|
* Main engine of ContextGuard
|
|
21
22
|
* Evaluates file size and either passes it through or shunts it to an AST/Worker summary.
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compares semantic versions (e.g., '1.4.1' > '1.4.0').
|
|
3
|
+
*/
|
|
4
|
+
export declare function isNewerVersion(latest: string, current: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Reads local cached update check result.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getCachedLatestVersion(): string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Saves update check result to local cache.
|
|
11
|
+
*/
|
|
12
|
+
export declare function saveUpdateCache(latestVersion: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Checks if the 24-hour cache has expired.
|
|
15
|
+
*/
|
|
16
|
+
export declare function shouldCheckRegistry(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Triggers an asynchronous, non-blocking check to the npm registry.
|
|
19
|
+
* Completely fire-and-forget; never delays command termination or errors.
|
|
20
|
+
*/
|
|
21
|
+
export declare function refreshLatestVersionInBackground(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Checks if a newer version is known and formats a clean notification.
|
|
24
|
+
* Returns null if current is up-to-date or if no check is available.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getUpdateNotice(currentVersion: string): {
|
|
27
|
+
latestVersion: string;
|
|
28
|
+
message: string;
|
|
29
|
+
} | null;
|
|
30
|
+
//# sourceMappingURL=update-notifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notifier.d.ts","sourceRoot":"","sources":["../../src/update-notifier.ts"],"names":[],"mappings":"AAmCA;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAUvE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAUtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAS3D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAU7C;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,IAAI,IAAI,CAwBvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA+BzG"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fast, non-blocking update notifier for ContextGuard CLI.
|
|
3
|
+
*
|
|
4
|
+
* Design Principles:
|
|
5
|
+
* - Zero latency impact: checks local cache file first (< 1ms).
|
|
6
|
+
* - Background refresh: only polls npm registry once every 24 hours.
|
|
7
|
+
* - Clean terminal design: subtle, single-line or clean two-line layout without broken box-drawing ASCII/ANSI frames.
|
|
8
|
+
* - Silent failure: never throws, never logs errors, never hangs if offline.
|
|
9
|
+
*/
|
|
10
|
+
import fs from 'node:fs';
|
|
11
|
+
import path from 'node:path';
|
|
12
|
+
import os from 'node:os';
|
|
13
|
+
const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
14
|
+
const NPM_REGISTRY_URL = 'https://registry.npmjs.org/@kevinbermudezc/context-guard/latest';
|
|
15
|
+
function getContextGuardDir() {
|
|
16
|
+
const dir = process.env.CONTEXT_GUARD_DIR || path.join(os.homedir(), '.contextguard');
|
|
17
|
+
if (!fs.existsSync(dir)) {
|
|
18
|
+
try {
|
|
19
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
catch { }
|
|
22
|
+
}
|
|
23
|
+
return dir;
|
|
24
|
+
}
|
|
25
|
+
function getCacheFilePath() {
|
|
26
|
+
return path.join(getContextGuardDir(), 'update-check.json');
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Compares semantic versions (e.g., '1.4.1' > '1.4.0').
|
|
30
|
+
*/
|
|
31
|
+
export function isNewerVersion(latest, current) {
|
|
32
|
+
const parse = (v) => v.replace(/^v/, '').split('.').map((p) => parseInt(p, 10) || 0);
|
|
33
|
+
const [lMaj, lMin, lPat] = parse(latest);
|
|
34
|
+
const [cMaj, cMin, cPat] = parse(current);
|
|
35
|
+
if (lMaj > cMaj)
|
|
36
|
+
return true;
|
|
37
|
+
if (lMaj < cMaj)
|
|
38
|
+
return false;
|
|
39
|
+
if (lMin > cMin)
|
|
40
|
+
return true;
|
|
41
|
+
if (lMin < cMin)
|
|
42
|
+
return false;
|
|
43
|
+
return lPat > cPat;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Reads local cached update check result.
|
|
47
|
+
*/
|
|
48
|
+
export function getCachedLatestVersion() {
|
|
49
|
+
try {
|
|
50
|
+
const file = getCacheFilePath();
|
|
51
|
+
if (!fs.existsSync(file))
|
|
52
|
+
return null;
|
|
53
|
+
const raw = fs.readFileSync(file, 'utf-8');
|
|
54
|
+
const data = JSON.parse(raw);
|
|
55
|
+
return data.latestVersion || null;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Saves update check result to local cache.
|
|
63
|
+
*/
|
|
64
|
+
export function saveUpdateCache(latestVersion) {
|
|
65
|
+
try {
|
|
66
|
+
const file = getCacheFilePath();
|
|
67
|
+
const data = {
|
|
68
|
+
lastChecked: Date.now(),
|
|
69
|
+
latestVersion
|
|
70
|
+
};
|
|
71
|
+
fs.writeFileSync(file, JSON.stringify(data), 'utf-8');
|
|
72
|
+
}
|
|
73
|
+
catch { }
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Checks if the 24-hour cache has expired.
|
|
77
|
+
*/
|
|
78
|
+
export function shouldCheckRegistry() {
|
|
79
|
+
try {
|
|
80
|
+
const file = getCacheFilePath();
|
|
81
|
+
if (!fs.existsSync(file))
|
|
82
|
+
return true;
|
|
83
|
+
const raw = fs.readFileSync(file, 'utf-8');
|
|
84
|
+
const data = JSON.parse(raw);
|
|
85
|
+
return Date.now() - (data.lastChecked || 0) > CHECK_INTERVAL_MS;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Triggers an asynchronous, non-blocking check to the npm registry.
|
|
93
|
+
* Completely fire-and-forget; never delays command termination or errors.
|
|
94
|
+
*/
|
|
95
|
+
export function refreshLatestVersionInBackground() {
|
|
96
|
+
if (!shouldCheckRegistry()) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const controller = new AbortController();
|
|
100
|
+
const timeout = setTimeout(() => controller.abort(), 1200);
|
|
101
|
+
fetch(NPM_REGISTRY_URL, {
|
|
102
|
+
method: 'GET',
|
|
103
|
+
headers: { 'Accept': 'application/json' },
|
|
104
|
+
signal: controller.signal
|
|
105
|
+
})
|
|
106
|
+
.then((res) => {
|
|
107
|
+
if (!res.ok)
|
|
108
|
+
return null;
|
|
109
|
+
return res.json();
|
|
110
|
+
})
|
|
111
|
+
.then((data) => {
|
|
112
|
+
if (data && typeof data.version === 'string') {
|
|
113
|
+
saveUpdateCache(data.version);
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
.catch(() => { })
|
|
117
|
+
.finally(() => clearTimeout(timeout));
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Checks if a newer version is known and formats a clean notification.
|
|
121
|
+
* Returns null if current is up-to-date or if no check is available.
|
|
122
|
+
*/
|
|
123
|
+
export function getUpdateNotice(currentVersion) {
|
|
124
|
+
// Always trigger background refresh if cache is expired
|
|
125
|
+
refreshLatestVersionInBackground();
|
|
126
|
+
const cachedLatest = getCachedLatestVersion();
|
|
127
|
+
if (!cachedLatest) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
if (isNewerVersion(cachedLatest, currentVersion)) {
|
|
131
|
+
const c = {
|
|
132
|
+
yellow: '\x1b[33m',
|
|
133
|
+
green: '\x1b[32m',
|
|
134
|
+
cyan: '\x1b[36m',
|
|
135
|
+
dim: '\x1b[2m',
|
|
136
|
+
bold: '\x1b[1m',
|
|
137
|
+
reset: '\x1b[0m'
|
|
138
|
+
};
|
|
139
|
+
const message = [
|
|
140
|
+
` ${c.yellow}▲${c.reset} ${c.bold}ContextGuard update available:${c.reset} ${c.dim}v${currentVersion}${c.reset} → ${c.green}${c.bold}v${cachedLatest}${c.reset}`,
|
|
141
|
+
` ${c.dim}Run:${c.reset} ${c.cyan}npm i -g @kevinbermudezc/context-guard@latest${c.reset}`
|
|
142
|
+
].join('\n');
|
|
143
|
+
return {
|
|
144
|
+
latestVersion: cachedLatest,
|
|
145
|
+
message
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=update-notifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notifier.js","sourceRoot":"","sources":["../../src/update-notifier.ts"],"names":[],"mappings":"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"}
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "1.
|
|
1
|
+
export declare const VERSION = "1.5.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/src/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = '1.
|
|
1
|
+
export const VERSION = '1.5.0';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity-hook.test.d.ts","sourceRoot":"","sources":["../../tests/antigravity-hook.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Antigravity Lifecycle Hook Compatibility Tests
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it } from 'node:test';
|
|
5
|
+
import assert from 'node:assert';
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
const HOOK_BIN = path.resolve(process.cwd(), 'dist/bin/claude-hook.js');
|
|
9
|
+
function runHookWithPayload(payload) {
|
|
10
|
+
return new Promise((resolve) => {
|
|
11
|
+
const proc = spawn('node', [HOOK_BIN], {
|
|
12
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
13
|
+
});
|
|
14
|
+
let stdout = '';
|
|
15
|
+
let stderr = '';
|
|
16
|
+
proc.stdout.on('data', (d) => { stdout += d.toString(); });
|
|
17
|
+
proc.stderr.on('data', (d) => { stderr += d.toString(); });
|
|
18
|
+
proc.on('close', (code) => {
|
|
19
|
+
resolve({ code, stdout, stderr });
|
|
20
|
+
});
|
|
21
|
+
proc.stdin.write(JSON.stringify(payload));
|
|
22
|
+
proc.stdin.end();
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
describe('Antigravity Lifecycle Hook Adapter', () => {
|
|
26
|
+
it('should return decision="allow" for small files via toolCall payload', async () => {
|
|
27
|
+
const payload = {
|
|
28
|
+
toolCall: {
|
|
29
|
+
name: 'view_file',
|
|
30
|
+
args: {
|
|
31
|
+
AbsolutePath: path.resolve(process.cwd(), 'package.json')
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const res = await runHookWithPayload(payload);
|
|
36
|
+
assert.strictEqual(res.code, 0);
|
|
37
|
+
const parsed = JSON.parse(res.stdout.trim());
|
|
38
|
+
assert.strictEqual(parsed.decision, 'allow');
|
|
39
|
+
});
|
|
40
|
+
it('should return decision="allow" when scoped lines (StartLine, EndLine) are requested', async () => {
|
|
41
|
+
const payload = {
|
|
42
|
+
toolCall: {
|
|
43
|
+
name: 'view_file',
|
|
44
|
+
args: {
|
|
45
|
+
AbsolutePath: path.resolve(process.cwd(), 'bin/mcp-server.ts'),
|
|
46
|
+
StartLine: 1,
|
|
47
|
+
EndLine: 50
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
const res = await runHookWithPayload(payload);
|
|
52
|
+
assert.strictEqual(res.code, 0);
|
|
53
|
+
const parsed = JSON.parse(res.stdout.trim());
|
|
54
|
+
assert.strictEqual(parsed.decision, 'allow');
|
|
55
|
+
});
|
|
56
|
+
it('should return decision="deny" with structural outline feedback when reading large files (>300 lines) un-scoped', async () => {
|
|
57
|
+
const payload = {
|
|
58
|
+
toolCall: {
|
|
59
|
+
name: 'view_file',
|
|
60
|
+
args: {
|
|
61
|
+
AbsolutePath: path.resolve(process.cwd(), 'bin/mcp-server.ts')
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const res = await runHookWithPayload(payload);
|
|
66
|
+
assert.strictEqual(res.code, 0); // Antigravity expects exit 0 with JSON { decision: "deny", reason: "..." }
|
|
67
|
+
const parsed = JSON.parse(res.stdout.trim());
|
|
68
|
+
assert.strictEqual(parsed.decision, 'deny');
|
|
69
|
+
assert.ok(parsed.reason.includes('LECTURA REGULADA'));
|
|
70
|
+
assert.ok(parsed.reason.includes('ESQUELETO ESTRUCTURAL Y FIRMAS'));
|
|
71
|
+
});
|
|
72
|
+
it('should return decision="deny" when attempting to view lockfiles', async () => {
|
|
73
|
+
const payload = {
|
|
74
|
+
toolCall: {
|
|
75
|
+
name: 'view_file',
|
|
76
|
+
args: {
|
|
77
|
+
AbsolutePath: path.resolve(process.cwd(), 'pnpm-lock.yaml')
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
const res = await runHookWithPayload(payload);
|
|
82
|
+
assert.strictEqual(res.code, 0);
|
|
83
|
+
const parsed = JSON.parse(res.stdout.trim());
|
|
84
|
+
assert.strictEqual(parsed.decision, 'deny');
|
|
85
|
+
assert.ok(parsed.reason.includes('ACCESO DENEGADO'));
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
//# sourceMappingURL=antigravity-hook.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity-hook.test.js","sourceRoot":"","sources":["../../tests/antigravity-hook.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.test.d.ts","sourceRoot":"","sources":["../../tests/init.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for context-guard init workspace command
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
5
|
+
import assert from 'node:assert';
|
|
6
|
+
import { spawnSync } from 'node:child_process';
|
|
7
|
+
import fs from 'node:fs';
|
|
8
|
+
import os from 'node:os';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
const CLI_BIN = path.resolve(process.cwd(), 'dist/bin/context-guard.js');
|
|
11
|
+
describe('context-guard init (Phase 3)', () => {
|
|
12
|
+
let tmpWorkspace;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
tmpWorkspace = fs.mkdtempSync(path.join(os.tmpdir(), 'cg-init-test-'));
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
if (fs.existsSync(tmpWorkspace)) {
|
|
18
|
+
try {
|
|
19
|
+
fs.rmSync(tmpWorkspace, { recursive: true, force: true });
|
|
20
|
+
}
|
|
21
|
+
catch { }
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
it('should initialize Antigravity rules, skill and mcp config when targeting antigravity', () => {
|
|
25
|
+
const res = spawnSync('node', [CLI_BIN, 'init', 'antigravity'], {
|
|
26
|
+
cwd: tmpWorkspace,
|
|
27
|
+
encoding: 'utf-8'
|
|
28
|
+
});
|
|
29
|
+
assert.strictEqual(res.status, 0);
|
|
30
|
+
assert.ok(res.stdout.includes('Google Antigravity'));
|
|
31
|
+
const rulePath = path.join(tmpWorkspace, '.agents/rules/context-guard.md');
|
|
32
|
+
const skillPath = path.join(tmpWorkspace, '.agents/skills/context-guard/SKILL.md');
|
|
33
|
+
const mcpPath = path.join(tmpWorkspace, '.agents/mcp.json');
|
|
34
|
+
assert.ok(fs.existsSync(rulePath), 'Antigravity rule must exist');
|
|
35
|
+
assert.ok(fs.existsSync(skillPath), 'Antigravity skill must exist');
|
|
36
|
+
assert.ok(fs.existsSync(mcpPath), 'Antigravity MCP config must exist');
|
|
37
|
+
const mcpJson = JSON.parse(fs.readFileSync(mcpPath, 'utf-8'));
|
|
38
|
+
assert.ok(mcpJson.mcpServers['context-guard']);
|
|
39
|
+
});
|
|
40
|
+
it('should initialize Cursor rules and mcp config when targeting cursor', () => {
|
|
41
|
+
const res = spawnSync('node', [CLI_BIN, 'init', 'cursor'], {
|
|
42
|
+
cwd: tmpWorkspace,
|
|
43
|
+
encoding: 'utf-8'
|
|
44
|
+
});
|
|
45
|
+
assert.strictEqual(res.status, 0);
|
|
46
|
+
assert.ok(res.stdout.includes('Cursor'));
|
|
47
|
+
const rulePath = path.join(tmpWorkspace, '.cursor/rules/context-guard.mdc');
|
|
48
|
+
const mcpPath = path.join(tmpWorkspace, '.cursor/mcp.json');
|
|
49
|
+
assert.ok(fs.existsSync(rulePath), 'Cursor rule must exist');
|
|
50
|
+
assert.ok(fs.existsSync(mcpPath), 'Cursor MCP config must exist');
|
|
51
|
+
});
|
|
52
|
+
it('should configure all adapters when run with no arguments or "all"', () => {
|
|
53
|
+
const res = spawnSync('node', [CLI_BIN, 'init'], {
|
|
54
|
+
cwd: tmpWorkspace,
|
|
55
|
+
encoding: 'utf-8'
|
|
56
|
+
});
|
|
57
|
+
assert.strictEqual(res.status, 0);
|
|
58
|
+
assert.ok(fs.existsSync(path.join(tmpWorkspace, '.agents/rules/context-guard.md')));
|
|
59
|
+
assert.ok(fs.existsSync(path.join(tmpWorkspace, '.cursor/rules/context-guard.mdc')));
|
|
60
|
+
assert.ok(fs.existsSync(path.join(tmpWorkspace, '.claude/settings.json')));
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=init.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.test.js","sourceRoot":"","sources":["../../tests/init.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -90,7 +90,7 @@ describe('ContextGuard MCP Server (Phase 2)', () => {
|
|
|
90
90
|
assert.ok(result.serverInfo, 'Must include serverInfo');
|
|
91
91
|
const info = result.serverInfo;
|
|
92
92
|
assert.strictEqual(info.name, 'context-guard');
|
|
93
|
-
assert.strictEqual(info.version, '1.
|
|
93
|
+
assert.strictEqual(info.version, '1.5.0');
|
|
94
94
|
});
|
|
95
95
|
it('should list exactly 3 registered tools', async () => {
|
|
96
96
|
const res = await sendRequest(proc, req('tools/list'));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notifier.test.d.ts","sourceRoot":"","sources":["../../tests/update-notifier.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the update notifier system
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
5
|
+
import assert from 'node:assert';
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { isNewerVersion, getCachedLatestVersion, saveUpdateCache, shouldCheckRegistry, getUpdateNotice } from '../src/update-notifier.js';
|
|
10
|
+
describe('Update Notifier System', () => {
|
|
11
|
+
let tempDir;
|
|
12
|
+
const originalEnv = { ...process.env };
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cg-update-test-'));
|
|
15
|
+
process.env.CONTEXT_GUARD_DIR = tempDir;
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
process.env = { ...originalEnv };
|
|
19
|
+
if (fs.existsSync(tempDir)) {
|
|
20
|
+
try {
|
|
21
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
22
|
+
}
|
|
23
|
+
catch { }
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
it('should accurately compare semver versions', () => {
|
|
27
|
+
assert.strictEqual(isNewerVersion('1.4.1', '1.4.0'), true);
|
|
28
|
+
assert.strictEqual(isNewerVersion('1.5.0', '1.4.9'), true);
|
|
29
|
+
assert.strictEqual(isNewerVersion('2.0.0', '1.9.9'), true);
|
|
30
|
+
assert.strictEqual(isNewerVersion('1.4.0', '1.4.0'), false);
|
|
31
|
+
assert.strictEqual(isNewerVersion('1.3.2', '1.4.0'), false);
|
|
32
|
+
});
|
|
33
|
+
it('should read and write cache properly', () => {
|
|
34
|
+
assert.strictEqual(getCachedLatestVersion(), null);
|
|
35
|
+
assert.strictEqual(shouldCheckRegistry(), true);
|
|
36
|
+
saveUpdateCache('1.4.5');
|
|
37
|
+
assert.strictEqual(getCachedLatestVersion(), '1.4.5');
|
|
38
|
+
assert.strictEqual(shouldCheckRegistry(), false);
|
|
39
|
+
});
|
|
40
|
+
it('should return a clean, unboxed notification message when a newer version is available', () => {
|
|
41
|
+
saveUpdateCache('1.5.0');
|
|
42
|
+
const notice = getUpdateNotice('1.4.0');
|
|
43
|
+
assert.ok(notice);
|
|
44
|
+
assert.strictEqual(notice.latestVersion, '1.5.0');
|
|
45
|
+
assert.ok(notice.message.includes('ContextGuard update available'));
|
|
46
|
+
assert.ok(notice.message.includes('v1.4.0'));
|
|
47
|
+
assert.ok(notice.message.includes('v1.5.0'));
|
|
48
|
+
assert.ok(notice.message.includes('npm i -g @kevinbermudezc/context-guard@latest'));
|
|
49
|
+
// Ensure no broken ASCII box-drawing characters
|
|
50
|
+
assert.strictEqual(notice.message.includes('╭'), false);
|
|
51
|
+
assert.strictEqual(notice.message.includes('╰'), false);
|
|
52
|
+
assert.strictEqual(notice.message.includes('│'), false);
|
|
53
|
+
});
|
|
54
|
+
it('should return null when the current version is equal or newer', () => {
|
|
55
|
+
saveUpdateCache('1.4.0');
|
|
56
|
+
const notice = getUpdateNotice('1.4.0');
|
|
57
|
+
assert.strictEqual(notice, null);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=update-notifier.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-notifier.test.js","sourceRoot":"","sources":["../../tests/update-notifier.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"context-guard-admission": {
|
|
3
|
+
"enabled": true,
|
|
4
|
+
"PreToolUse": [
|
|
5
|
+
{
|
|
6
|
+
"matcher": "view_file",
|
|
7
|
+
"hooks": [
|
|
8
|
+
{
|
|
9
|
+
"type": "command",
|
|
10
|
+
"command": "npx -y -p @kevinbermudezc/context-guard context-guard-hook",
|
|
11
|
+
"timeout": 5
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# 🛡️ ContextGuard Project Rule for Google Antigravity (AGY)
|
|
2
|
+
|
|
3
|
+
You MUST follow these context admission control and token optimization rules:
|
|
4
|
+
|
|
5
|
+
## 1. Context Admission Control
|
|
6
|
+
- **Do NOT read large files (>300 lines) into context unrestricted.** Dumping large files floods the context window and accelerates model degradation.
|
|
7
|
+
- When `read_file_safe` is available via MCP:
|
|
8
|
+
- Use `inspect_outline(file_path)` to get a structural map of the file with line numbers `[L#]`.
|
|
9
|
+
- Use `read_file_safe(file_path)` which automatically returns an AST skeleton for files >300 lines.
|
|
10
|
+
- When inspecting implementations, read targeted line ranges:
|
|
11
|
+
`read_file_safe(file_path, start_line=..., end_line=...)` or `view_file(AbsolutePath=..., StartLine=..., EndLine=...)`.
|
|
12
|
+
|
|
13
|
+
## 2. Lockfiles and Binaries
|
|
14
|
+
- **Never open lockfiles** (`package-lock.json`, `pnpm-lock.yaml`, `yarn.lock`, `bun.lockb`) or compiled/minified bundles (`.min.js`, `.wasm`, `.pyc`).
|
|
15
|
+
- Use command-line tools (`pnpm why <pkg>`, `npm ls <pkg>`, or read `package.json` directly) to check package dependencies.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: ContextGuard FinOps and Context Window Admission Control
|
|
3
|
+
globs: *
|
|
4
|
+
alwaysApply: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 🛡️ ContextGuard Rule for Cursor (Composer & Chat)
|
|
8
|
+
|
|
9
|
+
You MUST follow these context admission control and token optimization rules to protect the model context window and prevent latency degradation from massive files:
|
|
10
|
+
|
|
11
|
+
## 1. Zero Direct Reads for Large Files (>300 lines)
|
|
12
|
+
- **NEVER** read files larger than 300 lines without line constraints (`start_line`, `end_line`).
|
|
13
|
+
- Instead of using default read tools, prioritize calling ContextGuard MCP tools:
|
|
14
|
+
- Call `read_file_safe(file_path: "path/to/file")` to automatically receive an AST structural skeleton if the file is large (>300 lines).
|
|
15
|
+
- Call `inspect_outline(file_path: "path/to/file")` (< 5ms, 0 tokens) to inspect classes, methods, and types with their exact line tags `[L#]`.
|
|
16
|
+
- Once the relevant code block is located, read only the target slice:
|
|
17
|
+
`read_file_safe(file_path: "path/to/file", start_line: 120, end_line: 180)`
|
|
18
|
+
|
|
19
|
+
## 2. Pattern Searching
|
|
20
|
+
- When searching for symbols or references across files, use `grep_distilled(pattern: "myFunction")`.
|
|
21
|
+
- It isolates only matching signatures and structural surroundings rather than returning huge dumps of implementation code.
|
|
22
|
+
|
|
23
|
+
## 3. Binaries and Lockfiles
|
|
24
|
+
- Do NOT read `package-lock.json`, `pnpm-lock.yaml`, `bun.lockb`, or minified bundles (`.min.js`).
|
|
25
|
+
- Use CLI commands (`npm ls`, `pnpm why`, `cat package.json`) to inspect dependencies.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: context-guard
|
|
3
|
+
description: >-
|
|
4
|
+
Uses ContextGuard to inspect large files, outlines, and structural AST skeletons safely without blowing up the context window. Use whenever exploring unfamiliar files, large components (>300 lines), or auditing token consumption.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 🛡️ ContextGuard Skill for Antigravity
|
|
8
|
+
|
|
9
|
+
ContextGuard provides intelligent context admission control, reducing token usage by up to 90% when reading large source files.
|
|
10
|
+
|
|
11
|
+
## When to Use
|
|
12
|
+
- Whenever you need to read or understand a source file larger than 300 lines.
|
|
13
|
+
- When locating functions, classes, interfaces, or types in a large codebase.
|
|
14
|
+
- When searching patterns across unfamiliar repositories.
|
|
15
|
+
|
|
16
|
+
## Workflow
|
|
17
|
+
|
|
18
|
+
### 1. Inspect File Structure First (<5ms, 0 tokens)
|
|
19
|
+
Instead of dumping full files into context, call `inspect_outline`:
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"file_path": "path/to/large-service.ts"
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
This returns all class declarations, function signatures, and exported types with exact line numbers `[L120]`.
|
|
26
|
+
|
|
27
|
+
### 2. Read Safe Protected Content
|
|
28
|
+
When reading files through MCP, call `read_file_safe`:
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"file_path": "path/to/large-service.ts"
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
- If the file is small (≤300 lines), full content is returned.
|
|
35
|
+
- If the file is large (>300 lines), an AST skeleton is returned with instructions.
|
|
36
|
+
|
|
37
|
+
### 3. Read Only Targeted Slices
|
|
38
|
+
Once you identify the line numbers from the outline, read only the relevant function:
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"file_path": "path/to/large-service.ts",
|
|
42
|
+
"start_line": 120,
|
|
43
|
+
"end_line": 160
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 4. Search Symbols with Structural Distillation
|
|
48
|
+
Use `grep_distilled` instead of raw regex searches to see structural context around matches without dumping hundreds of lines of implementation.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kevinbermudezc/context-guard",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.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"
|