mcp-code-context 2.1.3 → 2.3.1
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/.io/RULES.md +12 -0
- package/CHANGELOG.md +118 -58
- package/CONTRIBUTING.md +243 -0
- package/README.md +58 -7
- package/RELEASE_NOTES_v2.2.0.md +286 -0
- package/RELEASE_NOTES_v2.3.0.md +228 -0
- package/RELEASE_NOTES_v2.3.1.md +110 -0
- package/dist/src/ast/writers/safeRename.d.ts +14 -0
- package/dist/src/ast/writers/safeRename.js +258 -0
- package/dist/src/ast/writers/safeRename.js.map +1 -0
- package/dist/src/ast/writers/symbolWriter.d.ts +2 -0
- package/dist/src/ast/writers/symbolWriter.js +9 -14
- package/dist/src/ast/writers/symbolWriter.js.map +1 -1
- package/dist/src/cache/astCache.d.ts +33 -0
- package/dist/src/cache/astCache.js +113 -0
- package/dist/src/cache/astCache.js.map +1 -0
- package/dist/src/handlers/readHandlers.d.ts +70 -0
- package/dist/src/handlers/readHandlers.js +431 -0
- package/dist/src/handlers/readHandlers.js.map +1 -0
- package/dist/src/handlers/utilHandlers.d.ts +31 -0
- package/dist/src/handlers/utilHandlers.js +69 -0
- package/dist/src/handlers/utilHandlers.js.map +1 -0
- package/dist/src/handlers/writeHandlers.d.ts +57 -0
- package/dist/src/handlers/writeHandlers.js +475 -0
- package/dist/src/handlers/writeHandlers.js.map +1 -0
- package/dist/src/index.d.ts +6 -107
- package/dist/src/index.js +147 -965
- package/dist/src/index.js.map +1 -1
- package/dist/src/tools/readFileLines.d.ts +26 -0
- package/dist/src/tools/readFileLines.js +77 -0
- package/dist/src/tools/readFileLines.js.map +1 -0
- package/dist/src/tools/searchCodePattern.d.ts +32 -0
- package/dist/src/tools/searchCodePattern.js +80 -0
- package/dist/src/tools/searchCodePattern.js.map +1 -0
- package/dist/src/utils/arrayUtils.d.ts +12 -0
- package/dist/src/utils/arrayUtils.js +27 -0
- package/dist/src/utils/arrayUtils.js.map +1 -0
- package/dist/src/utils/backupManager.d.ts +13 -6
- package/dist/src/utils/backupManager.js +73 -8
- package/dist/src/utils/backupManager.js.map +1 -1
- package/dist/src/utils/constants.d.ts +46 -0
- package/dist/src/utils/constants.js +112 -0
- package/dist/src/utils/constants.js.map +1 -0
- package/dist/src/utils/ignoreManager.d.ts +8 -0
- package/dist/src/utils/ignoreManager.js +49 -0
- package/dist/src/utils/ignoreManager.js.map +1 -1
- package/dist/src/utils/normalization.d.ts +49 -0
- package/dist/src/utils/normalization.js +173 -0
- package/dist/src/utils/normalization.js.map +1 -0
- package/dist/src/utils/projectRoot.d.ts +17 -0
- package/dist/src/utils/projectRoot.js +42 -0
- package/dist/src/utils/projectRoot.js.map +1 -0
- package/dist/src/utils/secureValidation.d.ts +15 -0
- package/dist/src/utils/secureValidation.js +41 -0
- package/dist/src/utils/secureValidation.js.map +1 -0
- package/dist/src/utils/transactionManager.d.ts +45 -0
- package/dist/src/utils/transactionManager.js +102 -0
- package/dist/src/utils/transactionManager.js.map +1 -0
- package/dist/src/utils/validation.d.ts +87 -0
- package/dist/src/utils/validation.js +231 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/docs/ARCHITECTURE.md +300 -0
- package/docs/architecture/ADR-001-modular-handlers.md +119 -0
- package/llms.txt +62 -7
- package/package.json +5 -5
- package/AGENT_INSTRUCTIONS.md +0 -135
- package/DEPLOYMENT_INSTRUCTIONS.md +0 -110
- package/dist/src/tests/test-confirmation-flow.d.ts +0 -1
- package/dist/src/tests/test-confirmation-flow.js +0 -43
- package/dist/src/tests/test-confirmation-flow.js.map +0 -1
- package/dist/tests/debug-replace.d.ts +0 -1
- package/dist/tests/debug-replace.js +0 -17
- package/dist/tests/debug-replace.js.map +0 -1
- package/dist/tests/test-confirmation-flow.d.ts +0 -1
- package/dist/tests/test-confirmation-flow.js +0 -43
- package/dist/tests/test-confirmation-flow.js.map +0 -1
- package/dist/tests/test-dart.d.ts +0 -1
- package/dist/tests/test-dart.js +0 -242
- package/dist/tests/test-dart.js.map +0 -1
- package/dist/tests/test-php-ast.d.ts +0 -1
- package/dist/tests/test-php-ast.js +0 -152
- package/dist/tests/test-php-ast.js.map +0 -1
- package/dist/tests/test-php.d.ts +0 -1
- package/dist/tests/test-php.js +0 -234
- package/dist/tests/test-php.js.map +0 -1
- package/dist/tests/test-smoke.d.ts +0 -5
- package/dist/tests/test-smoke.js +0 -83
- package/dist/tests/test-smoke.js.map +0 -1
- package/dist/tests/writers/test-crlf-handling.d.ts +0 -4
- package/dist/tests/writers/test-crlf-handling.js +0 -73
- package/dist/tests/writers/test-crlf-handling.js.map +0 -1
- package/dist/tests/writers/test-write-smoke.d.ts +0 -9
- package/dist/tests/writers/test-write-smoke.js +0 -346
- package/dist/tests/writers/test-write-smoke.js.map +0 -1
- package/src/ast/dartCompressor.ts +0 -1013
- package/src/ast/phpCompressor.ts +0 -814
- package/src/ast/semanticCompressor.ts +0 -808
- package/src/ast/writers/dartWriter.ts +0 -648
- package/src/ast/writers/phpWriter.ts +0 -508
- package/src/ast/writers/pyWriter.ts +0 -446
- package/src/ast/writers/symbolWriter.ts +0 -277
- package/src/ast/writers/tsWriter.ts +0 -418
- package/src/index.ts +0 -1553
- package/src/utils/backupManager.ts +0 -66
- package/src/utils/confirmationCache.ts +0 -61
- package/src/utils/diffEngine.ts +0 -223
- package/src/utils/fuzzyMatch.ts +0 -86
- package/src/utils/ignoreManager.ts +0 -144
- package/tests/test-confirmation-flow.ts +0 -49
- package/tests/test-dart.d.ts +0 -1
- package/tests/test-dart.js +0 -209
- package/tests/test-dart.js.map +0 -1
- package/tests/test-dart.ts +0 -265
- package/tests/test-php-ast.d.ts +0 -1
- package/tests/test-php-ast.js +0 -152
- package/tests/test-php-ast.js.map +0 -1
- package/tests/test-php-ast.ts +0 -155
- package/tests/test-php.d.ts +0 -1
- package/tests/test-php.js +0 -234
- package/tests/test-php.js.map +0 -1
- package/tests/test-php.ts +0 -261
- package/tests/test-smoke.d.ts +0 -5
- package/tests/test-smoke.js +0 -83
- package/tests/test-smoke.js.map +0 -1
- package/tests/test-smoke.ts +0 -93
- package/tests/writers/test-crlf-handling.ts +0 -100
- package/tests/writers/test-write-smoke.ts +0 -568
- package/tsconfig.json +0 -19
package/AGENT_INSTRUCTIONS.md
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
# Smart Code Analysis & Editing Tools
|
|
2
|
-
**Available tools for efficient code analysis, context management, and surgical code modification.**
|
|
3
|
-
|
|
4
|
-
## Read Tools
|
|
5
|
-
|
|
6
|
-
### 1. `get_semantic_repo_map` — Architectural Map
|
|
7
|
-
**When to use**: At the start of a session, before a major refactor, or when you need to understand a new codebase or directory structure.
|
|
8
|
-
**NEVER use**: For reading specific implementations — this tool extracts ONLY structural signatures (classes, functions), not the code bodies.
|
|
9
|
-
```ts
|
|
10
|
-
get_semantic_repo_map(directoryPath: "/path/to/project/src", format: "markdown")
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
### 2. `read_file_surgical` — Surgical Reading
|
|
14
|
-
**When to use**: When you need a specific method, class, or symbol. ALWAYS prefer this over reading the entire file (like `fsRead`) if the symbol name is known.
|
|
15
|
-
**NEVER use**: For reading complete files if you only need a single function or symbol.
|
|
16
|
-
```ts
|
|
17
|
-
read_file_surgical(filePath: "/path/to/file.ts", symbolName: "ClassName")
|
|
18
|
-
read_file_surgical(filePath: "/path/to/file.dart", symbolName: "WidgetName")
|
|
19
|
-
// Omitting symbolName will read the entire file
|
|
20
|
-
read_file_surgical(filePath: "/path/to/file.php")
|
|
21
|
-
```
|
|
22
|
-
- If the symbol is not found, the tool returns a **structured JSON error** with `available_symbols` and `suggestions` (e.g., if a `className` scope is missing but the symbol exists in a class).
|
|
23
|
-
- **Pro-tip**: Use the suggestions to fix your next tool call (e.g., adding the correct `className`).
|
|
24
|
-
|
|
25
|
-
### 3. `analyze_impact` — Blast Radius Detection
|
|
26
|
-
**When to use**: ALWAYS before modifying a file that might be imported or depended upon by other parts of the system.
|
|
27
|
-
**NEVER use**: Ignore or skip this step when refactoring shared services, utilities, or core components.
|
|
28
|
-
**Features**: Detects imports across ecosystems (e.g., `use Namespace\Class` in PHP, `import` in JS/TS/Dart/Python).
|
|
29
|
-
```ts
|
|
30
|
-
analyze_impact(filePath: "/path/to/project/src/services/MyService.ts")
|
|
31
|
-
analyze_impact(filePath: "/path/to/project/src/Services/GeoIPService.php")
|
|
32
|
-
analyze_impact(filePath: "/path/to/detodo24_mobile/lib/services/tracking_service.dart")
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## Write Tools
|
|
38
|
-
|
|
39
|
-
### Mandatory Two-Phase Write Workflow (v2.1.1+)
|
|
40
|
-
|
|
41
|
-
All write tools (`write_file_surgical`, `insert_symbol`, `rename_symbol`, `remove_symbol`) now enforce a safety-first confirmation flow.
|
|
42
|
-
|
|
43
|
-
**Phase 1: Dry-Run / Preview**
|
|
44
|
-
Call the tool with your proposed changes. You will receive:
|
|
45
|
-
1. A unified `diff` of the proposed changes.
|
|
46
|
-
2. A `confirmationToken`.
|
|
47
|
-
|
|
48
|
-
**Phase 2: Confirmation**
|
|
49
|
-
To apply the changes, call the SAME tool again with:
|
|
50
|
-
1. `confirmationToken`: The token from Phase 1.
|
|
51
|
-
2. `confirm: true`.
|
|
52
|
-
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
### 4. `write_file_surgical` — Surgical Symbol Replacement
|
|
56
|
-
**When to use**: Replace a specific function, method, class, or interface.
|
|
57
|
-
**Phase 1 (Preview)**:
|
|
58
|
-
```ts
|
|
59
|
-
write_file_surgical(filePath: "/path/to/file.ts", symbolName: "processOrder", newContent: "...")
|
|
60
|
-
```
|
|
61
|
-
**Phase 2 (Apply)**:
|
|
62
|
-
```ts
|
|
63
|
-
write_file_surgical(filePath: "/path/to/file.ts", symbolName: "processOrder", confirmationToken: "TOKEN_FROM_P1", confirm: true)
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### 5. `insert_symbol` — Precise Code Insertion
|
|
67
|
-
**When to use**: Adding new members relative to an existing anchor symbol.
|
|
68
|
-
**Phase 1 (Preview)**:
|
|
69
|
-
```ts
|
|
70
|
-
insert_symbol(filePath: "/path/to/file.dart", code: "void clear() { ... }", anchorSymbol: "getUser", position: "after")
|
|
71
|
-
```
|
|
72
|
-
**Phase 2 (Apply)**:
|
|
73
|
-
```ts
|
|
74
|
-
insert_symbol(filePath: "/path/to/file.dart", code: "void clear() { ... }", confirmationToken: "TOKEN_FROM_P1", confirm: true)
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### 6. `rename_symbol` — Repository-Wide Rename
|
|
78
|
-
**When to use**: Atomic identifier renaming across the entire project.
|
|
79
|
-
**Phase 1 (Preview)**:
|
|
80
|
-
```ts
|
|
81
|
-
rename_symbol(filePath: "/path/to/UserService.ts", oldName: "UserService", newName: "AccountService")
|
|
82
|
-
```
|
|
83
|
-
**Phase 2 (Apply)**:
|
|
84
|
-
```ts
|
|
85
|
-
rename_symbol(filePath: "/path/to/UserService.ts", oldName: "UserService", newName: "AccountService", confirmationToken: "TOKEN_FROM_P1", confirm: true)
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
### 7. `remove_symbol` — Safe Symbol Deletion
|
|
89
|
-
**When to use**: Removing code with dependency checking.
|
|
90
|
-
**Phase 1 (Preview)**:
|
|
91
|
-
```ts
|
|
92
|
-
remove_symbol(filePath: "/path/to/file.ts", symbolName: "deprecatedHelper")
|
|
93
|
-
```
|
|
94
|
-
**Phase 2 (Apply)**:
|
|
95
|
-
```ts
|
|
96
|
-
remove_symbol(filePath: "/path/to/file.ts", symbolName: "deprecatedHelper", confirmationToken: "TOKEN_FROM_P1", confirm: true)
|
|
97
|
-
```
|
|
98
|
-
- **Safety**: Safe removal check happens in Phase 1. If dependents exist, use `force: true` in your next Phase 1 call to override.
|
|
99
|
-
|
|
100
|
-
### 8. `rollback_file` — Surgical Restoration
|
|
101
|
-
**When to use**: If an applied change introduces an unexpected error or side effect.
|
|
102
|
-
**Safety**: The server automatically keeps the last 5 versions in `.mcp-backups/`.
|
|
103
|
-
```ts
|
|
104
|
-
rollback_file(filePath: "/path/to/file.ts", steps: 1)
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### 7. `remove_symbol` — Safe Symbol Deletion
|
|
108
|
-
**When to use**: When removing a function, method, or class from a file.
|
|
109
|
-
**Safety**: By default, checks for dependents and **refuses** to remove if other files reference it.
|
|
110
|
-
```ts
|
|
111
|
-
// Safe removal (checks dependents first)
|
|
112
|
-
remove_symbol(filePath: "/path/to/file.ts", symbolName: "deprecatedHelper")
|
|
113
|
-
// Force removal (skip dependency check)
|
|
114
|
-
remove_symbol(filePath: "/path/to/file.php", symbolName: "oldMethod", force: true)
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
## Mandatory Workflow
|
|
120
|
-
1. **New Session / Unknown Context** → Use `get_semantic_repo_map` on the relevant directory to understand the structure.
|
|
121
|
-
2. **Read Code** → Use `read_file_surgical` with a `symbolName` whenever possible.
|
|
122
|
-
3. **Handle Missing Symbols** → If you get a JSON error, use the `suggestions` to refine your `symbolName` or `className`.
|
|
123
|
-
4. **Before Modifying** → Use `analyze_impact` if the file is a shared module or component.
|
|
124
|
-
5. **Modify Code (Phase 1)** → Use write tools to generate a `diff` and `confirmationToken`.
|
|
125
|
-
6. **Verify Diff** → Read the diff carefully. If incorrect, correct your prompt and start Phase 1 again.
|
|
126
|
-
7. **Apply (Phase 2)** → Call the same write tool with the token and `confirm: true`.
|
|
127
|
-
8. **Verify Result** → Ensure nothing broke. Use `rollback_file` if needed.
|
|
128
|
-
|
|
129
|
-
## Supported Languages (Read + Write)
|
|
130
|
-
| Language | Read | Write | Engine |
|
|
131
|
-
|----------|------|-------|--------|
|
|
132
|
-
| TypeScript / JavaScript | ✅ | ✅ | AST (ts-morph) |
|
|
133
|
-
| PHP | ✅ | ✅ | AST (php-parser) |
|
|
134
|
-
| Dart | ✅ | ✅ | Brace-counting + regex |
|
|
135
|
-
| Python | ✅ | ✅ | Indentation-based |
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
# Deployment Instructions for v2.1.3
|
|
2
|
-
|
|
3
|
-
## ✅ Completed Steps
|
|
4
|
-
1. ✅ Code fixes implemented and tested
|
|
5
|
-
2. ✅ Version bumped to 2.1.3 in package.json
|
|
6
|
-
3. ✅ CHANGELOG.md updated
|
|
7
|
-
4. ✅ TROUBLESHOOTING.md updated
|
|
8
|
-
5. ✅ llms.txt updated
|
|
9
|
-
6. ✅ Test suite created and passing (11/11 tests)
|
|
10
|
-
7. ✅ Git commit created with semantic message
|
|
11
|
-
8. ✅ Git tag v2.1.3 created with release notes
|
|
12
|
-
9. ✅ Pushed to GitHub (main branch + tag)
|
|
13
|
-
|
|
14
|
-
## 🚀 Next Steps (Manual)
|
|
15
|
-
|
|
16
|
-
### 1. Publish to npm
|
|
17
|
-
You need to be logged in to npm. Run:
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
cd C:\code\antigravity-mcp-context
|
|
21
|
-
|
|
22
|
-
# Login to npm (if not already)
|
|
23
|
-
npm login
|
|
24
|
-
|
|
25
|
-
# Publish the package
|
|
26
|
-
npm publish
|
|
27
|
-
|
|
28
|
-
# Verify publication
|
|
29
|
-
npm view mcp-code-context@2.1.3
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### 2. Create GitHub Release
|
|
33
|
-
Go to: https://github.com/achatainga/mcp-code-context/releases/new
|
|
34
|
-
|
|
35
|
-
- **Tag**: Select `v2.1.3` (already pushed)
|
|
36
|
-
- **Title**: `v2.1.3 - Windows CRLF & Parameter Brace Fixes`
|
|
37
|
-
- **Description**: Copy content from `RELEASE_NOTES_v2.1.3.md`
|
|
38
|
-
- **Attach files**: None needed (npm package is the artifact)
|
|
39
|
-
- Click **Publish release**
|
|
40
|
-
|
|
41
|
-
### 3. Verify Installation
|
|
42
|
-
Test that users can install the new version:
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
# Global install
|
|
46
|
-
npm install -g mcp-code-context@2.1.3
|
|
47
|
-
|
|
48
|
-
# Verify version
|
|
49
|
-
npx mcp-code-context --version # Should show 2.1.3
|
|
50
|
-
|
|
51
|
-
# Test with MCP client (Claude Desktop, Amazon Q, etc.)
|
|
52
|
-
# Update config to use @2.1.3 and restart client
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### 4. Announce (Optional)
|
|
56
|
-
Consider announcing on:
|
|
57
|
-
- GitHub Discussions
|
|
58
|
-
- Twitter/X
|
|
59
|
-
- Reddit (r/LocalLLaMA, r/ClaudeAI)
|
|
60
|
-
- Discord communities
|
|
61
|
-
|
|
62
|
-
## 📋 Verification Checklist
|
|
63
|
-
|
|
64
|
-
Before announcing:
|
|
65
|
-
- [ ] npm package published successfully
|
|
66
|
-
- [ ] GitHub release created
|
|
67
|
-
- [ ] Can install via `npm install -g mcp-code-context@2.1.3`
|
|
68
|
-
- [ ] Version shows correctly in `package.json`
|
|
69
|
-
- [ ] Tag visible on GitHub releases page
|
|
70
|
-
- [ ] CHANGELOG.md shows v2.1.3 entry
|
|
71
|
-
- [ ] Tests passing on CI (if configured)
|
|
72
|
-
|
|
73
|
-
## 🐛 Rollback Plan (If Needed)
|
|
74
|
-
|
|
75
|
-
If critical issues are discovered:
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# Unpublish from npm (within 72 hours)
|
|
79
|
-
npm unpublish mcp-code-context@2.1.3
|
|
80
|
-
|
|
81
|
-
# Delete GitHub release
|
|
82
|
-
# Go to releases page and delete v2.1.3
|
|
83
|
-
|
|
84
|
-
# Delete git tag
|
|
85
|
-
git tag -d v2.1.3
|
|
86
|
-
git push origin :refs/tags/v2.1.3
|
|
87
|
-
|
|
88
|
-
# Revert commit
|
|
89
|
-
git revert f0bfcfe
|
|
90
|
-
git push origin main
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
## 📊 Monitoring
|
|
94
|
-
|
|
95
|
-
After release, monitor:
|
|
96
|
-
- npm download stats: https://npm-stat.com/charts.html?package=mcp-code-context
|
|
97
|
-
- GitHub issues for bug reports
|
|
98
|
-
- GitHub stars/forks for adoption
|
|
99
|
-
|
|
100
|
-
## 🎉 Success Criteria
|
|
101
|
-
- No critical bugs reported within 48 hours
|
|
102
|
-
- Windows users confirm CRLF issues resolved
|
|
103
|
-
- Download count increases
|
|
104
|
-
- Positive feedback from users
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
**Current Status**: Ready for npm publish and GitHub release creation
|
|
109
|
-
**Blocked By**: npm authentication required
|
|
110
|
-
**Next Action**: Run `npm login` then `npm publish`
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
import { handleWriteFileSurgical, handleRollbackFile } from '../dist/index.js';
|
|
4
|
-
async function testWorkflow() {
|
|
5
|
-
const testFile = path.resolve('test-artifact.ts');
|
|
6
|
-
const initialContent = 'export class Old { build() { return 1; } }';
|
|
7
|
-
fs.writeFileSync(testFile, initialContent, 'utf-8');
|
|
8
|
-
console.log('--- Step 1: Preview (Dry-Run) ---');
|
|
9
|
-
const previewArgs = {
|
|
10
|
-
filePath: testFile,
|
|
11
|
-
symbolName: 'build',
|
|
12
|
-
newContent: ' build() { return "new value"; }',
|
|
13
|
-
className: 'Old'
|
|
14
|
-
};
|
|
15
|
-
const p1 = await handleWriteFileSurgical(previewArgs);
|
|
16
|
-
const p1Text = p1.content[0].text;
|
|
17
|
-
console.log('Preview Result:', p1Text.split('\n')[0]);
|
|
18
|
-
const tokenMatch = p1Text.match(/confirmationToken: "([^"]+)"/);
|
|
19
|
-
if (!tokenMatch)
|
|
20
|
-
throw new Error('No token found');
|
|
21
|
-
const token = tokenMatch[1];
|
|
22
|
-
console.log('Token found:', token);
|
|
23
|
-
console.log('\n--- Step 2: Confirm ---');
|
|
24
|
-
const confirmArgs = {
|
|
25
|
-
...previewArgs,
|
|
26
|
-
confirmationToken: token,
|
|
27
|
-
confirm: true
|
|
28
|
-
};
|
|
29
|
-
const p2 = await handleWriteFileSurgical(confirmArgs);
|
|
30
|
-
console.log('Confirm Result:', p2.content[0].text.split('\n')[0]);
|
|
31
|
-
console.log('File Content:', fs.readFileSync(testFile, 'utf-8'));
|
|
32
|
-
console.log('\n--- Step 3: Rollback ---');
|
|
33
|
-
await handleRollbackFile({ filePath: testFile, steps: 1 });
|
|
34
|
-
console.log('After Rollback:', fs.readFileSync(testFile, 'utf-8'));
|
|
35
|
-
// Clean up
|
|
36
|
-
fs.unlinkSync(testFile);
|
|
37
|
-
const backupDir = path.join(path.dirname(testFile), '.mcp-backups');
|
|
38
|
-
if (fs.existsSync(backupDir)) {
|
|
39
|
-
fs.rmSync(backupDir, { recursive: true, force: true });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
testWorkflow().catch(console.error);
|
|
43
|
-
//# sourceMappingURL=test-confirmation-flow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-confirmation-flow.js","sourceRoot":"","sources":["../../../src/tests/test-confirmation-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,KAAK,UAAU,YAAY;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,4CAA4C,CAAC;IACpE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,OAAO;QACnB,UAAU,EAAE,mCAAmC;QAC/C,SAAS,EAAE,KAAK;KACjB,CAAC;IAEF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG;QAClB,GAAG,WAAW;QACd,iBAAiB,EAAE,KAAK;QACxB,OAAO,EAAE,IAAI;KACd,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnE,WAAW;IACX,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,YAAY,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { replaceDartSymbol } from "../src/ast/writers/dartWriter.js";
|
|
2
|
-
const dartCRLF = "class BadgeService {\r\n static void update({int? cart}) {\r\n if (cart != null) {\r\n print(cart);\r\n }\r\n }\r\n}\r\n";
|
|
3
|
-
const newMethod = " static void update({int? cart}) {\r\n if (cart != null) {\r\n print('Updated: $cart');\r\n }\r\n }";
|
|
4
|
-
console.log("=== ORIGINAL ===");
|
|
5
|
-
console.log(dartCRLF);
|
|
6
|
-
console.log("\n=== NEW CONTENT ===");
|
|
7
|
-
console.log(newMethod);
|
|
8
|
-
const result = replaceDartSymbol(dartCRLF, "update", newMethod);
|
|
9
|
-
console.log("\n=== RESULT ===");
|
|
10
|
-
console.log(JSON.stringify(result, null, 2));
|
|
11
|
-
console.log("\n=== NEW FILE CONTENT ===");
|
|
12
|
-
console.log(result.newContent);
|
|
13
|
-
console.log("\n=== BRACE COUNT ===");
|
|
14
|
-
const openBraces = (result.newContent.match(/{/g) || []).length;
|
|
15
|
-
const closeBraces = (result.newContent.match(/}/g) || []).length;
|
|
16
|
-
console.log(`Open: ${openBraces}, Close: ${closeBraces}`);
|
|
17
|
-
//# sourceMappingURL=debug-replace.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"debug-replace.js","sourceRoot":"","sources":["../../tests/debug-replace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAErE,MAAM,QAAQ,GAAG,uIAAuI,CAAC;AAEzJ,MAAM,SAAS,GAAG,kHAAkH,CAAC;AAErI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACrC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEvB,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAEhE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAChC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAE7C,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAE/B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AACrC,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AAChE,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AACjE,OAAO,CAAC,GAAG,CAAC,SAAS,UAAU,YAAY,WAAW,EAAE,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
import { handleWriteFileSurgical, handleRollbackFile } from '../src/index.js';
|
|
4
|
-
async function testWorkflow() {
|
|
5
|
-
const testFile = path.resolve('test-artifact.ts');
|
|
6
|
-
const initialContent = 'export class Old { build() { return 1; } }';
|
|
7
|
-
fs.writeFileSync(testFile, initialContent, 'utf-8');
|
|
8
|
-
console.log('--- Step 1: Preview (Dry-Run) ---');
|
|
9
|
-
const previewArgs = {
|
|
10
|
-
filePath: testFile,
|
|
11
|
-
symbolName: 'build',
|
|
12
|
-
newContent: ' build() { return "new value"; }',
|
|
13
|
-
className: 'Old'
|
|
14
|
-
};
|
|
15
|
-
const p1 = await handleWriteFileSurgical(previewArgs);
|
|
16
|
-
const p1Text = p1.content[0].text;
|
|
17
|
-
console.log('Preview Result:', p1Text.split('\n')[0]);
|
|
18
|
-
const tokenMatch = p1Text.match(/confirmationToken: "([^"]+)"/);
|
|
19
|
-
if (!tokenMatch)
|
|
20
|
-
throw new Error('No token found');
|
|
21
|
-
const token = tokenMatch[1];
|
|
22
|
-
console.log('Token found:', token);
|
|
23
|
-
console.log('\n--- Step 2: Confirm ---');
|
|
24
|
-
const confirmArgs = {
|
|
25
|
-
...previewArgs,
|
|
26
|
-
confirmationToken: token,
|
|
27
|
-
confirm: true
|
|
28
|
-
};
|
|
29
|
-
const p2 = await handleWriteFileSurgical(confirmArgs);
|
|
30
|
-
console.log('Confirm Result:', p2.content[0].text.split('\n')[0]);
|
|
31
|
-
console.log('File Content:', fs.readFileSync(testFile, 'utf-8'));
|
|
32
|
-
console.log('\n--- Step 3: Rollback ---');
|
|
33
|
-
await handleRollbackFile({ filePath: testFile, steps: 1 });
|
|
34
|
-
console.log('After Rollback:', fs.readFileSync(testFile, 'utf-8'));
|
|
35
|
-
// Clean up
|
|
36
|
-
fs.unlinkSync(testFile);
|
|
37
|
-
const backupDir = path.join(path.dirname(testFile), '.mcp-backups');
|
|
38
|
-
if (fs.existsSync(backupDir)) {
|
|
39
|
-
fs.rmSync(backupDir, { recursive: true, force: true });
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
testWorkflow().catch(console.error);
|
|
43
|
-
//# sourceMappingURL=test-confirmation-flow.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-confirmation-flow.js","sourceRoot":"","sources":["../../tests/test-confirmation-flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,KAAK,UAAU,YAAY;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,4CAA4C,CAAC;IACpE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,OAAO;QACnB,UAAU,EAAE,mCAAmC;QAC/C,SAAS,EAAE,KAAK;KACjB,CAAC;IAEF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChE,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAEnC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG;QAClB,GAAG,WAAW;QACd,iBAAiB,EAAE,KAAK;QACxB,OAAO,EAAE,IAAI;KACd,CAAC;IACF,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEjE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,kBAAkB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnE,WAAW;IACX,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,YAAY,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/tests/test-dart.js
DELETED
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Test script for Dart compression.
|
|
3
|
-
*/
|
|
4
|
-
import { compressDart, extractDartSymbol } from "../src/ast/dartCompressor.js";
|
|
5
|
-
import * as fs from "node:fs";
|
|
6
|
-
function log(label, value) {
|
|
7
|
-
console.log(`\n${"─".repeat(60)}`);
|
|
8
|
-
console.log(`✅ ${label}`);
|
|
9
|
-
console.log(`${"─".repeat(60)}`);
|
|
10
|
-
console.log(typeof value === "number" ? String(value) : value);
|
|
11
|
-
}
|
|
12
|
-
function fail(label, reason) {
|
|
13
|
-
console.log(`\n${"─".repeat(60)}`);
|
|
14
|
-
console.log(`❌ FAIL: ${label}`);
|
|
15
|
-
console.log(`${"─".repeat(60)}`);
|
|
16
|
-
console.log(reason);
|
|
17
|
-
process.exitCode = 1;
|
|
18
|
-
}
|
|
19
|
-
async function main() {
|
|
20
|
-
let passed = 0;
|
|
21
|
-
let failed = 0;
|
|
22
|
-
// ─── Test 1: Real class (HomeRepository) ──────────────────────────
|
|
23
|
-
console.log("\n\n🧪 TEST 1: Compress HomeRepository.dart (Classes, getters, Future methods, docstrings)");
|
|
24
|
-
const repoPath = "c:/code/detodo24_mobile/lib/features/home/data/repositories/home_repository.dart";
|
|
25
|
-
if (fs.existsSync(repoPath)) {
|
|
26
|
-
const content = fs.readFileSync(repoPath, "utf-8");
|
|
27
|
-
const compressed = compressDart(content);
|
|
28
|
-
const originalLines = content.split("\n").length;
|
|
29
|
-
const compressedLines = compressed.split("\n").length;
|
|
30
|
-
const ratio = ((1 - compressedLines / originalLines) * 100).toFixed(1);
|
|
31
|
-
log(`HomeRepository: ${originalLines} → ${compressedLines} lines (${ratio}% reduction)`, compressed);
|
|
32
|
-
const checks = [
|
|
33
|
-
["import block", /import 'dart:convert';/],
|
|
34
|
-
["class declaration", /class HomeRepository/],
|
|
35
|
-
["final field", /final http\.Client _httpClient;/],
|
|
36
|
-
["static const field", /static const String _authHomeApiUrl/],
|
|
37
|
-
["constructor", /HomeRepository\(/],
|
|
38
|
-
["async method", /Future<List<Map<String, dynamic>>> fetchSections/],
|
|
39
|
-
["private async method", /Future<List<Map<String, dynamic>>> _fetchSectionsAuth/],
|
|
40
|
-
["doc comment", /Obtiene recomendaciones por misión Amazon-style/],
|
|
41
|
-
["body stripped", /\{ \/\* \.\.\. \*\/ \}/]
|
|
42
|
-
];
|
|
43
|
-
for (const [name, pattern] of checks) {
|
|
44
|
-
if (pattern.test(compressed)) {
|
|
45
|
-
console.log(` ✓ Found: ${name}`);
|
|
46
|
-
passed++;
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
49
|
-
fail(`Missing: ${name}`, `Pattern ${pattern} not found`);
|
|
50
|
-
failed++;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// ─── Test 2: Real Widget (DT24Loading) ────────────────────────────
|
|
55
|
-
console.log("\n\n🧪 TEST 2: Compress dt24_loading.dart (StatefulWidget, CustomPainter, @override)");
|
|
56
|
-
const widgetPath = "c:/code/detodo24_mobile/lib/widgets/dt24_loading.dart";
|
|
57
|
-
if (fs.existsSync(widgetPath)) {
|
|
58
|
-
const content = fs.readFileSync(widgetPath, "utf-8");
|
|
59
|
-
const compressed = compressDart(content);
|
|
60
|
-
log("DT24Loading compressed:", compressed);
|
|
61
|
-
const checks = [
|
|
62
|
-
["StatefulWidget", /class DT24Loading extends StatefulWidget/],
|
|
63
|
-
["doc comment", /Widget de carga personalizado/],
|
|
64
|
-
["const constructor", /const DT24Loading/],
|
|
65
|
-
["@override", /@override/],
|
|
66
|
-
["State class", /class _DT24LoadingState extends State<DT24Loading>/],
|
|
67
|
-
["mixin", /with SingleTickerProviderStateMixin/],
|
|
68
|
-
["CustomPainter", /class _DT24LoadingPainter extends CustomPainter/],
|
|
69
|
-
["method with complex generic", /State<DT24Loading> createState\(\) => \/\* \.\.\. \*\/;/]
|
|
70
|
-
];
|
|
71
|
-
for (const [name, pattern] of checks) {
|
|
72
|
-
if (pattern.test(compressed)) {
|
|
73
|
-
console.log(` ✓ Found: ${name}`);
|
|
74
|
-
passed++;
|
|
75
|
-
}
|
|
76
|
-
else {
|
|
77
|
-
fail(`Missing: ${name}`, `Pattern ${pattern} not found`);
|
|
78
|
-
failed++;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
// ─── Test 3: Symbol Extraction ────────────────────────────────────
|
|
83
|
-
console.log("\n\n🧪 TEST 3: Surgical Symbol Extraction (Dart)");
|
|
84
|
-
if (fs.existsSync(repoPath)) {
|
|
85
|
-
const content = fs.readFileSync(repoPath, "utf-8");
|
|
86
|
-
// Extract class
|
|
87
|
-
const repoClass = extractDartSymbol(content, "HomeRepository");
|
|
88
|
-
if (repoClass && repoClass.includes("class HomeRepository")) {
|
|
89
|
-
console.log(` ✓ Successfully extracted class HomeRepository (${repoClass.split("\n").length} lines)`);
|
|
90
|
-
passed++;
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
fail("Extract class", "Failed to extract HomeRepository");
|
|
94
|
-
failed++;
|
|
95
|
-
}
|
|
96
|
-
// Extract method
|
|
97
|
-
const fetchMethod = extractDartSymbol(content, "fetchSections");
|
|
98
|
-
if (fetchMethod && fetchMethod.includes("Future<List<Map<String, dynamic>>> fetchSections")) {
|
|
99
|
-
console.log(` ✓ Successfully extracted method fetchSections (${fetchMethod.split("\n").length} lines)`);
|
|
100
|
-
passed++;
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
fail("Extract method", "Failed to extract fetchSections");
|
|
104
|
-
failed++;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// ─── Test 4: Synthetic Dart with all patterns ─────────────────────
|
|
108
|
-
console.log("\n\n🧪 TEST 4: Synthetic Dart with mixins, enums, extensions, types");
|
|
109
|
-
const syntheticDart = `
|
|
110
|
-
import 'dart:async';
|
|
111
|
-
import 'package:flutter/material.dart';
|
|
112
|
-
|
|
113
|
-
part 'model.g.dart';
|
|
114
|
-
|
|
115
|
-
/// Top level typedef
|
|
116
|
-
typedef JsonMap = Map<String, dynamic>;
|
|
117
|
-
|
|
118
|
-
/// User State enum
|
|
119
|
-
enum UserState {
|
|
120
|
-
loggedOut,
|
|
121
|
-
loggedIn,
|
|
122
|
-
loading;
|
|
123
|
-
|
|
124
|
-
bool get isActive => this == UserState.loggedIn;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/// Logger mixin
|
|
128
|
-
mixin Logger on Object {
|
|
129
|
-
void log(String message) {
|
|
130
|
-
print('[\${runtimeType}] \$message');
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/// Extension on String
|
|
135
|
-
extension StringUtils on String {
|
|
136
|
-
bool get isBlank => trim().isEmpty;
|
|
137
|
-
|
|
138
|
-
String capitalize() {
|
|
139
|
-
if (isBlank) return this;
|
|
140
|
-
return '\${this[0].toUpperCase()}\${substring(1)}';
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/// Base user model
|
|
145
|
-
sealed class UserModel with Logger {
|
|
146
|
-
final String id;
|
|
147
|
-
|
|
148
|
-
const UserModel({required this.id});
|
|
149
|
-
|
|
150
|
-
factory UserModel.fromJson(JsonMap json) {
|
|
151
|
-
return NormalUser(id: json['id']);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
class NormalUser extends UserModel {
|
|
156
|
-
final String name;
|
|
157
|
-
late final String uppercaseName;
|
|
158
|
-
|
|
159
|
-
NormalUser({
|
|
160
|
-
required String id,
|
|
161
|
-
this.name = '',
|
|
162
|
-
}) : super(id: id) {
|
|
163
|
-
uppercaseName = name.toUpperCase();
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
@override
|
|
167
|
-
String toString() => 'User(\$id, \$name)';
|
|
168
|
-
|
|
169
|
-
Future<void> save() async {
|
|
170
|
-
await Future.delayed(const Duration(seconds: 1));
|
|
171
|
-
log('Saved \$name');
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
`;
|
|
175
|
-
const compressedSyntax = compressDart(syntheticDart);
|
|
176
|
-
log("Synthetic compressed", compressedSyntax);
|
|
177
|
-
const synthChecks = [
|
|
178
|
-
["part statement", /part 'model.g.dart';/],
|
|
179
|
-
["typedef", /typedef JsonMap = Map<String, dynamic>;/],
|
|
180
|
-
["enum", /enum UserState {/],
|
|
181
|
-
["enum cases", /loggedOut,\s+loggedIn,\s+loading;/],
|
|
182
|
-
["enum method", /bool get isActive => \/\* \.\.\. \*\/;/],
|
|
183
|
-
["mixin", /mixin Logger on Object {/],
|
|
184
|
-
["extension", /extension StringUtils on String {/],
|
|
185
|
-
["extension getter", /bool get isBlank => \/\* \.\.\. \*\/;/],
|
|
186
|
-
["sealed class", /sealed class UserModel with Logger {/],
|
|
187
|
-
["const constructor", /const UserModel\({required this.id}\);/],
|
|
188
|
-
["factory constructor", /factory UserModel.fromJson\(JsonMap json\) { \/\* \.\.\. \*\/ }/],
|
|
189
|
-
["late final field", /late final String uppercaseName;/],
|
|
190
|
-
["initializer list constructor", /NormalUser\([\s\S]*?\) : super\(id: id\) { \/\* \.\.\. \*\/ }/],
|
|
191
|
-
["arrow function override", /@override\s+String toString\(\) => \/\* \.\.\. \*\/;/]
|
|
192
|
-
];
|
|
193
|
-
for (const [name, pattern] of synthChecks) {
|
|
194
|
-
if (pattern.test(compressedSyntax)) {
|
|
195
|
-
console.log(` ✓ Found: ${name}`);
|
|
196
|
-
passed++;
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
fail(`Missing: ${name}`, `Pattern ${pattern} not found in compressed output`);
|
|
200
|
-
failed++;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// ─── Test 5: ClassName Extraction Disambiguation ─────────────
|
|
204
|
-
console.log("\n\n🧪 TEST 5: ClassName Extraction Disambiguation");
|
|
205
|
-
const multiClassDart = `
|
|
206
|
-
class ClassA {
|
|
207
|
-
void build() {
|
|
208
|
-
print('A');
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
class ClassB {
|
|
213
|
-
void build() {
|
|
214
|
-
print('B');
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
`;
|
|
218
|
-
const extractedBuildA = extractDartSymbol(multiClassDart, "build", "ClassA");
|
|
219
|
-
if (extractedBuildA && extractedBuildA.includes("print('A');")) {
|
|
220
|
-
console.log(` ✓ Successfully extracted build from ClassA`);
|
|
221
|
-
passed++;
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
fail("Extract ClassA build", "Failed to properly extract build from ClassA");
|
|
225
|
-
failed++;
|
|
226
|
-
}
|
|
227
|
-
const extractedBuildB = extractDartSymbol(multiClassDart, "build", "ClassB");
|
|
228
|
-
if (extractedBuildB && extractedBuildB.includes("print('B');")) {
|
|
229
|
-
console.log(` ✓ Successfully extracted build from ClassB`);
|
|
230
|
-
passed++;
|
|
231
|
-
}
|
|
232
|
-
else {
|
|
233
|
-
fail("Extract ClassB build", "Failed to properly extract build from ClassB");
|
|
234
|
-
failed++;
|
|
235
|
-
}
|
|
236
|
-
// ─── Summary ─────────────────────────────────────────────────
|
|
237
|
-
console.log(`\n\n${"═".repeat(60)}`);
|
|
238
|
-
console.log(`📊 RESULTS: ${passed} passed, ${failed} failed`);
|
|
239
|
-
console.log(`${"═".repeat(60)}\n`);
|
|
240
|
-
}
|
|
241
|
-
main().catch(console.error);
|
|
242
|
-
//# sourceMappingURL=test-dart.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-dart.js","sourceRoot":"","sources":["../../tests/test-dart.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|