mcp-code-context 3.5.2 โ 3.5.3
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/CHANGELOG.md +3 -3
- package/HIRE_ME.md +234 -0
- package/README.md +433 -304
- package/SECURITY.md +14 -14
- package/SPONSORS.md +104 -0
- package/dist/src/core/engine.d.ts +1 -1
- package/dist/src/core/engine.js +1 -1
- package/dist/src/core/validator.d.ts +1 -1
- package/dist/src/core/validator.js +3 -3
- package/dist/src/core/validator.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/operations/compress.d.ts +1 -1
- package/dist/src/operations/compress.js +1 -1
- package/dist/src/operations/confirmationStore.d.ts +1 -1
- package/dist/src/operations/confirmationStore.js +1 -1
- package/dist/src/operations/read.d.ts +1 -1
- package/dist/src/operations/read.js +9 -1
- package/dist/src/operations/read.js.map +1 -1
- package/dist/src/operations/write.d.ts +2 -2
- package/dist/src/operations/write.js +2 -2
- package/dist/src/parsers/base.d.ts +1 -1
- package/dist/src/parsers/base.js +1 -1
- package/dist/src/parsers/dartTreeSitter.d.ts +1 -1
- package/dist/src/parsers/dartTreeSitter.js +1 -1
- package/dist/src/parsers/php.d.ts +1 -1
- package/dist/src/parsers/php.js +1 -1
- package/dist/src/parsers/python.d.ts +1 -1
- package/dist/src/parsers/python.js +1 -1
- package/dist/src/parsers/registry.d.ts +1 -1
- package/dist/src/parsers/registry.js +1 -1
- package/dist/src/parsers/typescript.d.ts +1 -1
- package/dist/src/parsers/typescript.js +1 -1
- package/dist/src/utils/auditLogger.d.ts +1 -1
- package/dist/src/utils/auditLogger.js +1 -1
- package/dist/src/utils/backupManager.d.ts +1 -1
- package/dist/src/utils/backupManager.js +1 -1
- package/dist/src/utils/constants.d.ts +1 -1
- package/dist/src/utils/constants.js +1 -1
- package/dist/src/utils/diff.d.ts +1 -1
- package/dist/src/utils/diff.js +1 -1
- package/dist/src/utils/fileLock.d.ts +1 -1
- package/dist/src/utils/fileLock.js +1 -1
- package/dist/src/utils/rateLimiter.d.ts +1 -1
- package/dist/src/utils/rateLimiter.js +1 -1
- package/dist/src/utils/safeRegex.d.ts +1 -1
- package/dist/src/utils/safeRegex.js +1 -1
- package/dist/src/utils/streaming.d.ts +1 -1
- package/dist/src/utils/streaming.js +1 -1
- package/dist/src/utils/telemetry.d.ts +1 -1
- package/dist/src/utils/telemetry.js +1 -1
- package/llms.txt +5 -5
- package/package.json +17 -2
- package/CHANGELOG_v3.2.0.md +0 -196
- package/CHANGELOG_v3.3.0.md +0 -266
package/llms.txt
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# mcp-code-context v3.5.
|
|
1
|
+
# mcp-code-context v3.5.3
|
|
2
2
|
|
|
3
3
|
> A Model Context Protocol (MCP) server with **Tree-sitter WASM parsers** for 100% AST accuracy. Zero native dependencies. Production-ready with middleware pipeline.
|
|
4
4
|
|
|
5
|
-
## What's New in v3.5.
|
|
5
|
+
## What's New in v3.5.3
|
|
6
6
|
|
|
7
7
|
๐ **Production Hardening**:
|
|
8
8
|
- โ
Two-phase write workflow (dry-run + confirmation token)
|
|
@@ -142,13 +142,13 @@ This MCP server solves two problems:
|
|
|
142
142
|
- `steps` (optional): Number of versions to go back (1-5, default: 1).
|
|
143
143
|
**What it does:** Reverts the file to the state it was in before the last 1-5 modifications.
|
|
144
144
|
|
|
145
|
-
### Write Tools (v3.5.
|
|
145
|
+
### Write Tools (v3.5.3 Two-Phase Workflow)
|
|
146
146
|
|
|
147
147
|
All write tools follow a **Two-Phase Workflow**:
|
|
148
148
|
1. **Phase 1 (Preview)**: Call without a token to get a unified `diff` and a `confirmationToken`.
|
|
149
149
|
2. **Phase 2 (Apply)**: Call with `confirmationToken` and `confirm: true` to apply the changes.
|
|
150
150
|
|
|
151
|
-
**Important Notes (v3.5.
|
|
151
|
+
**Important Notes (v3.5.3):**
|
|
152
152
|
- โ
**Windows CRLF Support**: Fully resolved. All operations work correctly on Windows files with CRLF line endings.
|
|
153
153
|
- โ
**Parameter Brace Handling**: Methods with braces in parameters (e.g., `{int? cart}`) are now handled correctly.
|
|
154
154
|
|
|
@@ -236,7 +236,7 @@ All write tools follow a **Two-Phase Workflow**:
|
|
|
236
236
|
5. **Phase 2: Apply Edit** โ Verify the diff, then call with the token and `confirm: true`.
|
|
237
237
|
6. **Recovery** โ Use `rollback_file` if needed.
|
|
238
238
|
|
|
239
|
-
### Additional Tools (v3.5.
|
|
239
|
+
### Additional Tools (v3.5.3)
|
|
240
240
|
|
|
241
241
|
#### 11. `parse_file`
|
|
242
242
|
**Purpose:** Parse a file using Tree-sitter and extract all symbols.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mcp-code-context",
|
|
3
|
-
"version": "3.5.
|
|
3
|
+
"version": "3.5.3",
|
|
4
4
|
"description": "Powerful MCP server with Tree-sitter WASM parsers for 100% AST accuracy. Zero native dependencies. Production-ready with streaming, telemetry, audit logging, rate limiting, file locking, and ReDoS protection. Supports TypeScript, JavaScript, PHP, Dart, and Python.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -36,12 +36,27 @@
|
|
|
36
36
|
"dart",
|
|
37
37
|
"python"
|
|
38
38
|
],
|
|
39
|
-
"author": "",
|
|
39
|
+
"author": "Alejandro Chataing <a.chataing.a@gmail.com>",
|
|
40
40
|
"license": "MIT",
|
|
41
41
|
"repository": {
|
|
42
42
|
"type": "git",
|
|
43
43
|
"url": "git+https://github.com/achatainga/mcp-code-context.git"
|
|
44
44
|
},
|
|
45
|
+
"funding": [
|
|
46
|
+
{
|
|
47
|
+
"type": "ko-fi",
|
|
48
|
+
"url": "https://ko-fi.com/achatainga"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"type": "paypal",
|
|
52
|
+
"url": "https://paypal.me/achatainga"
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
"homepage": "https://github.com/achatainga/mcp-code-context#readme",
|
|
56
|
+
"bugs": {
|
|
57
|
+
"url": "https://github.com/achatainga/mcp-code-context/issues",
|
|
58
|
+
"email": "a.chataing.a@gmail.com"
|
|
59
|
+
},
|
|
45
60
|
"dependencies": {
|
|
46
61
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
47
62
|
"ignore": "^6.0.2",
|
package/CHANGELOG_v3.2.0.md
DELETED
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
# Changelog v3.2.0 - Security & Validation Hardening
|
|
2
|
-
|
|
3
|
-
## ๐ CRITICAL Security Fixes
|
|
4
|
-
|
|
5
|
-
### Path Traversal Protection (CVE-LEVEL)
|
|
6
|
-
**Impact**: HIGH - Could allow access to files outside project boundary
|
|
7
|
-
**Fix**: Moved path traversal check AFTER `path.resolve()` normalization
|
|
8
|
-
```typescript
|
|
9
|
-
// BEFORE (vulnerable):
|
|
10
|
-
if (filePath.includes("..")) return { valid: false };
|
|
11
|
-
const resolved = path.resolve(filePath);
|
|
12
|
-
|
|
13
|
-
// AFTER (secure):
|
|
14
|
-
const resolved = path.resolve(filePath);
|
|
15
|
-
if (!resolved.startsWith(this.projectRoot)) return { valid: false };
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
### Regex Injection in renameSymbol (CVE-LEVEL)
|
|
19
|
-
**Impact**: HIGH - Could corrupt entire codebase with malicious symbol names
|
|
20
|
-
**Fix**: Sanitize all regex inputs before use
|
|
21
|
-
```typescript
|
|
22
|
-
// BEFORE (vulnerable):
|
|
23
|
-
const regex = new RegExp(`\\b${oldName}\\b`, "g");
|
|
24
|
-
|
|
25
|
-
// AFTER (secure):
|
|
26
|
-
const sanitized = oldName.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
27
|
-
const regex = new RegExp(`\\b${sanitized}\\b`, "g");
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### Syntax Validation Post-Write
|
|
31
|
-
**Impact**: CRITICAL - Prevented silent code corruption
|
|
32
|
-
**Fix**: All write operations now validate syntax before returning
|
|
33
|
-
```typescript
|
|
34
|
-
const syntaxCheck = validateSyntax(result, parser);
|
|
35
|
-
if (!syntaxCheck.valid) {
|
|
36
|
-
return { success: false, error: syntaxCheck.error };
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## โจ Major Improvements
|
|
43
|
-
|
|
44
|
-
### 1. AST-Aware insertCode
|
|
45
|
-
**Before**: Used `indexOf()` to find anchor (could match strings/comments)
|
|
46
|
-
**After**: Uses AST `node.startIndex/endIndex` for precise positioning
|
|
47
|
-
```typescript
|
|
48
|
-
// Find anchor using AST
|
|
49
|
-
const symbols = parser.findSymbols(tree);
|
|
50
|
-
const anchorNode = symbols.find(s => s.name === anchorSymbol);
|
|
51
|
-
insertIndex = anchorNode.startIndex; // Exact AST position
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### 2. Improved renameSymbol
|
|
55
|
-
- AST-based symbol location (not blind regex)
|
|
56
|
-
- Only renames in import statements (not strings/comments)
|
|
57
|
-
- Sanitized regex patterns
|
|
58
|
-
- Better error messages
|
|
59
|
-
|
|
60
|
-
### 3. Async I/O Migration
|
|
61
|
-
**Before**: `fs.readFileSync()` blocked event loop
|
|
62
|
-
**After**: `await fs.readFile()` non-blocking
|
|
63
|
-
```typescript
|
|
64
|
-
// engine.ts:60
|
|
65
|
-
const wasmBuffer = await fs.readFile(wasmPath); // Was: fs.readFileSync
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### 4. Centralized Constants
|
|
69
|
-
**Before**: Hardcoded in 5+ files
|
|
70
|
-
```typescript
|
|
71
|
-
const excludeDirs = ["node_modules", "dist", "build", ".git"];
|
|
72
|
-
```
|
|
73
|
-
**After**: Single source of truth
|
|
74
|
-
```typescript
|
|
75
|
-
import { EXCLUDE_DIRS, SUPPORTED_EXTENSIONS } from "../utils/constants.js";
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### 5. LCS-Based Diff Generation
|
|
79
|
-
**Before**: Simple line-by-line (O(n))
|
|
80
|
-
**After**: Longest Common Subsequence algorithm (O(n*m))
|
|
81
|
-
- Cleaner diffs with proper context
|
|
82
|
-
- Better readability
|
|
83
|
-
- Configurable context lines
|
|
84
|
-
|
|
85
|
-
### 6. Size Limits in compress
|
|
86
|
-
**Before**: Only file count limit (500)
|
|
87
|
-
**After**: Total size limit (50MB) + per-file check
|
|
88
|
-
```typescript
|
|
89
|
-
if (totalSize + stat.size > MAX_TOTAL_SIZE_BYTES) break;
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
## ๐งช Testing
|
|
95
|
-
|
|
96
|
-
### New Security Test Suite
|
|
97
|
-
- โ
Path traversal protection (4 tests)
|
|
98
|
-
- โ
ReDoS detection (4 patterns)
|
|
99
|
-
- โ
Regex injection protection (4 tests)
|
|
100
|
-
- โ
File size validation (2 tests)
|
|
101
|
-
|
|
102
|
-
**Coverage**: 100% on security-critical paths
|
|
103
|
-
|
|
104
|
-
### Existing Tests
|
|
105
|
-
- โ
47/47 parser tests passing
|
|
106
|
-
- โ
TypeScript, Python, PHP, Dart parsers validated
|
|
107
|
-
- โ
Symbol extraction, replacement, insertion tested
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## ๐ Metrics Improvement
|
|
112
|
-
|
|
113
|
-
| Metric | v3.1.0 | v3.2.0 | Change |
|
|
114
|
-
|--------|--------|--------|--------|
|
|
115
|
-
| Security | 5.0/10 | 9.5/10 | +4.5 โ
|
|
|
116
|
-
| Code Quality | 6.5/10 | 8.5/10 | +2.0 โ
|
|
|
117
|
-
| Maintainability | 7.0/10 | 8.5/10 | +1.5 โ
|
|
|
118
|
-
| **Overall** | **6.2/10** | **8.8/10** | **+2.6** |
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## ๐จ Breaking Changes
|
|
123
|
-
|
|
124
|
-
### Syntax Validation
|
|
125
|
-
All write operations now validate syntax before returning. Invalid code will be rejected:
|
|
126
|
-
```typescript
|
|
127
|
-
// This will now fail if newContent has syntax errors:
|
|
128
|
-
const result = await replaceSymbol({ symbolName, newContent, ... });
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
**Migration**: Ensure all generated code is syntactically valid before calling write operations.
|
|
132
|
-
|
|
133
|
-
---
|
|
134
|
-
|
|
135
|
-
## ๐ Files Changed
|
|
136
|
-
|
|
137
|
-
### Core
|
|
138
|
-
- `src/core/validator.ts` - Path traversal fix
|
|
139
|
-
- `src/core/engine.ts` - Async I/O migration
|
|
140
|
-
|
|
141
|
-
### Operations
|
|
142
|
-
- `src/operations/write.ts` - Syntax validation, AST positioning, sanitization
|
|
143
|
-
- `src/operations/compress.ts` - Size limits
|
|
144
|
-
- `src/operations/read.ts` - Centralized constants
|
|
145
|
-
|
|
146
|
-
### Utils
|
|
147
|
-
- `src/utils/constants.ts` - NEW: Centralized configuration
|
|
148
|
-
- `src/utils/diff.ts` - NEW: LCS-based diff
|
|
149
|
-
|
|
150
|
-
### Tests
|
|
151
|
-
- `tests/test-security.ts` - NEW: Security test suite
|
|
152
|
-
|
|
153
|
-
---
|
|
154
|
-
|
|
155
|
-
## ๐ Upgrade Guide
|
|
156
|
-
|
|
157
|
-
### From v3.1.0 to v3.2.0
|
|
158
|
-
|
|
159
|
-
1. **No API changes** - Fully backward compatible
|
|
160
|
-
2. **Stricter validation** - Some previously accepted (but invalid) code will now be rejected
|
|
161
|
-
3. **Better error messages** - Syntax errors now caught before file write
|
|
162
|
-
|
|
163
|
-
### Recommended Actions
|
|
164
|
-
1. Run existing tests to ensure compatibility
|
|
165
|
-
2. Review any custom write operations for syntax validity
|
|
166
|
-
3. Update error handling to catch new validation errors
|
|
167
|
-
|
|
168
|
-
---
|
|
169
|
-
|
|
170
|
-
## ๐ฏ Next Steps (v3.3.0)
|
|
171
|
-
|
|
172
|
-
- [ ] Rate limiting for DoS protection
|
|
173
|
-
- [ ] File locking for concurrent writes
|
|
174
|
-
- [ ] Streaming for files >10MB
|
|
175
|
-
- [ ] LSP integration for advanced refactoring
|
|
176
|
-
- [ ] Telemetry and observability
|
|
177
|
-
|
|
178
|
-
---
|
|
179
|
-
|
|
180
|
-
## ๐ฅ Contributors
|
|
181
|
-
|
|
182
|
-
- Security audit and fixes
|
|
183
|
-
- Performance optimizations
|
|
184
|
-
- Test coverage improvements
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
## ๐ License
|
|
189
|
-
|
|
190
|
-
MIT
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
**Full Diff**: v3.1.0...v3.2.0
|
|
195
|
-
**Release Date**: 2026-04-24
|
|
196
|
-
**Stability**: Production-ready
|
package/CHANGELOG_v3.3.0.md
DELETED
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
# Changelog v3.3.0 - Production Hardening
|
|
2
|
-
|
|
3
|
-
## ๐ Major Features
|
|
4
|
-
|
|
5
|
-
### 1. Rate Limiting (DoS Protection)
|
|
6
|
-
**Token Bucket Algorithm** - Prevents abuse and resource exhaustion
|
|
7
|
-
|
|
8
|
-
```typescript
|
|
9
|
-
import { RateLimiter, OPERATION_COSTS } from "./utils/rateLimiter.js";
|
|
10
|
-
|
|
11
|
-
const limiter = new RateLimiter({
|
|
12
|
-
maxTokens: 100,
|
|
13
|
-
refillRate: 10, // tokens per second
|
|
14
|
-
refillInterval: 1000 // ms
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
// Check if request allowed
|
|
18
|
-
const result = await limiter.checkLimit("client-id", OPERATION_COSTS.get_semantic_repo_map);
|
|
19
|
-
if (!result.allowed) {
|
|
20
|
-
console.log(`Rate limited. Retry after ${result.retryAfter}ms`);
|
|
21
|
-
}
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
**Operation Costs**:
|
|
25
|
-
- `get_semantic_repo_map`: 50 tokens (expensive)
|
|
26
|
-
- `rename_symbol`: 40 tokens (cross-file)
|
|
27
|
-
- `search_code_pattern`: 30 tokens
|
|
28
|
-
- `analyze_impact`: 20 tokens
|
|
29
|
-
- `replace_symbol`: 10 tokens
|
|
30
|
-
- `read_file_surgical`: 5 tokens
|
|
31
|
-
- `read_file_lines`: 2 tokens (cheap)
|
|
32
|
-
|
|
33
|
-
**Features**:
|
|
34
|
-
- โ
Per-client token buckets
|
|
35
|
-
- โ
Automatic token refill
|
|
36
|
-
- โ
Configurable rates
|
|
37
|
-
- โ
Retry-after calculation
|
|
38
|
-
- โ
Inactive client cleanup (5min)
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
### 2. File Locking (Concurrent Write Protection)
|
|
43
|
-
**Prevents race conditions** when multiple clients edit same file
|
|
44
|
-
|
|
45
|
-
```typescript
|
|
46
|
-
import { FileLockManager } from "./utils/fileLock.js";
|
|
47
|
-
|
|
48
|
-
const lockManager = new FileLockManager(30000); // 30s timeout
|
|
49
|
-
|
|
50
|
-
// Acquire lock
|
|
51
|
-
const result = await lockManager.acquireLock(
|
|
52
|
-
"/path/to/file.ts",
|
|
53
|
-
"client-id",
|
|
54
|
-
"write_operation"
|
|
55
|
-
);
|
|
56
|
-
|
|
57
|
-
if (result.acquired) {
|
|
58
|
-
// Perform write
|
|
59
|
-
await writeFile(...);
|
|
60
|
-
|
|
61
|
-
// Release lock
|
|
62
|
-
lockManager.releaseLock("/path/to/file.ts", "client-id");
|
|
63
|
-
} else {
|
|
64
|
-
console.log(`File locked by ${result.lockedBy}`);
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
**Features**:
|
|
69
|
-
- โ
Per-file locks
|
|
70
|
-
- โ
Auto-release after timeout
|
|
71
|
-
- โ
Path normalization (Windows/Unix)
|
|
72
|
-
- โ
Force release (admin)
|
|
73
|
-
- โ
Multi-client support
|
|
74
|
-
- โ
Lock info tracking
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
### 3. ReDoS Protection (Regex Timeout)
|
|
79
|
-
**Prevents catastrophic backtracking** in user-provided regex
|
|
80
|
-
|
|
81
|
-
```typescript
|
|
82
|
-
import { safeRegexTest, validateRegexPattern } from "./utils/safeRegex.js";
|
|
83
|
-
|
|
84
|
-
// Validate pattern
|
|
85
|
-
const validation = validateRegexPattern("(a+)+");
|
|
86
|
-
if (!validation.safe) {
|
|
87
|
-
console.log("Unsafe pattern:", validation.issues);
|
|
88
|
-
// ["Nested quantifiers (a+)+ detected"]
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Execute with timeout
|
|
92
|
-
const result = await safeRegexTest(/(a+)+/, "aaaaaX", 1000);
|
|
93
|
-
if (result.timedOut) {
|
|
94
|
-
console.log("Regex timeout - potential ReDoS");
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**Detected Patterns**:
|
|
99
|
-
- `(a+)+` - Nested quantifiers
|
|
100
|
-
- `(a*)*` - Nested quantifiers
|
|
101
|
-
- `(a|b)*` - Alternation with star
|
|
102
|
-
- `{1000,}` - Excessive repetition
|
|
103
|
-
- Patterns >500 chars
|
|
104
|
-
|
|
105
|
-
**Integration**:
|
|
106
|
-
- โ
`searchPattern` validates regex before execution
|
|
107
|
-
- โ
Async regex testing with timeout
|
|
108
|
-
- โ
Automatic rejection of unsafe patterns
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## ๐ง Improvements
|
|
113
|
-
|
|
114
|
-
### searchPattern Enhanced
|
|
115
|
-
**Before**:
|
|
116
|
-
```typescript
|
|
117
|
-
// Could hang on ReDoS patterns
|
|
118
|
-
const regex = new RegExp(userPattern, "g");
|
|
119
|
-
regex.test(line); // No timeout
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
**After**:
|
|
123
|
-
```typescript
|
|
124
|
-
// Validates pattern first
|
|
125
|
-
const validation = validateRegexPattern(params.pattern);
|
|
126
|
-
if (!validation.safe) {
|
|
127
|
-
return { success: false, error: "Unsafe regex" };
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Executes with timeout
|
|
131
|
-
const result = await safeRegexTest(regex, line, 1000);
|
|
132
|
-
if (result.timedOut) {
|
|
133
|
-
console.warn("Regex timeout");
|
|
134
|
-
}
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
## ๐งช Testing
|
|
140
|
-
|
|
141
|
-
### New Test Suites
|
|
142
|
-
|
|
143
|
-
**Rate Limiter** (15 tests):
|
|
144
|
-
- โ
Basic rate limiting
|
|
145
|
-
- โ
Token refill
|
|
146
|
-
- โ
Multiple clients
|
|
147
|
-
- โ
Operation costs
|
|
148
|
-
- โ
Reset functionality
|
|
149
|
-
|
|
150
|
-
**File Locking** (13 tests):
|
|
151
|
-
- โ
Basic locking
|
|
152
|
-
- โ
Lock timeout
|
|
153
|
-
- โ
Multiple files
|
|
154
|
-
- โ
Path normalization
|
|
155
|
-
- โ
Force release
|
|
156
|
-
|
|
157
|
-
**Total**: 75 tests passing (47 parsers + 14 security + 14 v3.3.0)
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
## ๐ Performance Impact
|
|
162
|
-
|
|
163
|
-
| Feature | Overhead | Benefit |
|
|
164
|
-
|---------|----------|---------|
|
|
165
|
-
| Rate Limiter | ~0.1ms per request | Prevents DoS |
|
|
166
|
-
| File Locking | ~0.2ms per write | Prevents corruption |
|
|
167
|
-
| Regex Validation | ~1ms per pattern | Prevents ReDoS |
|
|
168
|
-
|
|
169
|
-
**Overall**: <1ms overhead for 99% of operations
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
## ๐จ Breaking Changes
|
|
174
|
-
|
|
175
|
-
### searchPattern Validation
|
|
176
|
-
**Before**: Accepted any regex pattern
|
|
177
|
-
**After**: Rejects unsafe patterns
|
|
178
|
-
|
|
179
|
-
```typescript
|
|
180
|
-
// This will now fail:
|
|
181
|
-
await searchPattern({ pattern: "(a+)+" });
|
|
182
|
-
// Error: "Unsafe regex pattern: Nested quantifiers (a+)+ detected"
|
|
183
|
-
|
|
184
|
-
// Workaround: Use simpler pattern
|
|
185
|
-
await searchPattern({ pattern: "a+" }); // OK
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## ๐ Migration Guide
|
|
191
|
-
|
|
192
|
-
### From v3.2.0 to v3.3.0
|
|
193
|
-
|
|
194
|
-
**No API changes** - Fully backward compatible
|
|
195
|
-
|
|
196
|
-
**Optional Integrations**:
|
|
197
|
-
|
|
198
|
-
1. **Add Rate Limiting** (recommended):
|
|
199
|
-
```typescript
|
|
200
|
-
import { RateLimiter, OPERATION_COSTS } from "./utils/rateLimiter.js";
|
|
201
|
-
|
|
202
|
-
const limiter = new RateLimiter();
|
|
203
|
-
const result = await limiter.checkLimit(clientId, OPERATION_COSTS[toolName]);
|
|
204
|
-
if (!result.allowed) {
|
|
205
|
-
return { error: `Rate limited. Retry after ${result.retryAfter}ms` };
|
|
206
|
-
}
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
2. **Add File Locking** (recommended for writes):
|
|
210
|
-
```typescript
|
|
211
|
-
import { globalLockManager } from "./utils/fileLock.js";
|
|
212
|
-
|
|
213
|
-
const lock = await globalLockManager.acquireLock(filePath, clientId, "write");
|
|
214
|
-
if (!lock.acquired) {
|
|
215
|
-
return { error: `File locked by ${lock.lockedBy}` };
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
try {
|
|
219
|
-
await writeOperation();
|
|
220
|
-
} finally {
|
|
221
|
-
globalLockManager.releaseLock(filePath, clientId);
|
|
222
|
-
}
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
## ๐ Metrics Improvement
|
|
228
|
-
|
|
229
|
-
| Metric | v3.2.0 | v3.3.0 | Change |
|
|
230
|
-
|--------|--------|--------|--------|
|
|
231
|
-
| Security | 9.5/10 | 10.0/10 | +0.5 โ
|
|
|
232
|
-
| Scalability | 6.5/10 | 9.0/10 | +2.5 โ
|
|
|
233
|
-
| Reliability | 8.0/10 | 9.5/10 | +1.5 โ
|
|
|
234
|
-
| **Overall** | **8.3/10** | **9.5/10** | **+1.2** |
|
|
235
|
-
|
|
236
|
-
---
|
|
237
|
-
|
|
238
|
-
## ๐ฏ Production Readiness
|
|
239
|
-
|
|
240
|
-
### Checklist
|
|
241
|
-
- โ
DoS protection (rate limiting)
|
|
242
|
-
- โ
Race condition prevention (file locking)
|
|
243
|
-
- โ
ReDoS protection (regex timeout)
|
|
244
|
-
- โ
Path traversal protection
|
|
245
|
-
- โ
Syntax validation
|
|
246
|
-
- โ
Comprehensive testing (75 tests)
|
|
247
|
-
- โ
Security documentation
|
|
248
|
-
- โ
Performance optimized
|
|
249
|
-
|
|
250
|
-
**Status**: PRODUCTION-READY โ
|
|
251
|
-
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
## ๐ Next Steps (v3.5.2)
|
|
255
|
-
|
|
256
|
-
- [ ] Streaming for files >10MB
|
|
257
|
-
- [ ] Telemetry and observability
|
|
258
|
-
- [ ] Audit logging
|
|
259
|
-
- [ ] Permission system
|
|
260
|
-
- [ ] LSP integration
|
|
261
|
-
|
|
262
|
-
---
|
|
263
|
-
|
|
264
|
-
**Full Diff**: v3.2.0...v3.3.0
|
|
265
|
-
**Release Date**: 2026-04-24
|
|
266
|
-
**Stability**: Production-ready
|