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.
Files changed (128) hide show
  1. package/.io/RULES.md +12 -0
  2. package/CHANGELOG.md +118 -58
  3. package/CONTRIBUTING.md +243 -0
  4. package/README.md +58 -7
  5. package/RELEASE_NOTES_v2.2.0.md +286 -0
  6. package/RELEASE_NOTES_v2.3.0.md +228 -0
  7. package/RELEASE_NOTES_v2.3.1.md +110 -0
  8. package/dist/src/ast/writers/safeRename.d.ts +14 -0
  9. package/dist/src/ast/writers/safeRename.js +258 -0
  10. package/dist/src/ast/writers/safeRename.js.map +1 -0
  11. package/dist/src/ast/writers/symbolWriter.d.ts +2 -0
  12. package/dist/src/ast/writers/symbolWriter.js +9 -14
  13. package/dist/src/ast/writers/symbolWriter.js.map +1 -1
  14. package/dist/src/cache/astCache.d.ts +33 -0
  15. package/dist/src/cache/astCache.js +113 -0
  16. package/dist/src/cache/astCache.js.map +1 -0
  17. package/dist/src/handlers/readHandlers.d.ts +70 -0
  18. package/dist/src/handlers/readHandlers.js +431 -0
  19. package/dist/src/handlers/readHandlers.js.map +1 -0
  20. package/dist/src/handlers/utilHandlers.d.ts +31 -0
  21. package/dist/src/handlers/utilHandlers.js +69 -0
  22. package/dist/src/handlers/utilHandlers.js.map +1 -0
  23. package/dist/src/handlers/writeHandlers.d.ts +57 -0
  24. package/dist/src/handlers/writeHandlers.js +475 -0
  25. package/dist/src/handlers/writeHandlers.js.map +1 -0
  26. package/dist/src/index.d.ts +6 -107
  27. package/dist/src/index.js +147 -965
  28. package/dist/src/index.js.map +1 -1
  29. package/dist/src/tools/readFileLines.d.ts +26 -0
  30. package/dist/src/tools/readFileLines.js +77 -0
  31. package/dist/src/tools/readFileLines.js.map +1 -0
  32. package/dist/src/tools/searchCodePattern.d.ts +32 -0
  33. package/dist/src/tools/searchCodePattern.js +80 -0
  34. package/dist/src/tools/searchCodePattern.js.map +1 -0
  35. package/dist/src/utils/arrayUtils.d.ts +12 -0
  36. package/dist/src/utils/arrayUtils.js +27 -0
  37. package/dist/src/utils/arrayUtils.js.map +1 -0
  38. package/dist/src/utils/backupManager.d.ts +13 -6
  39. package/dist/src/utils/backupManager.js +73 -8
  40. package/dist/src/utils/backupManager.js.map +1 -1
  41. package/dist/src/utils/constants.d.ts +46 -0
  42. package/dist/src/utils/constants.js +112 -0
  43. package/dist/src/utils/constants.js.map +1 -0
  44. package/dist/src/utils/ignoreManager.d.ts +8 -0
  45. package/dist/src/utils/ignoreManager.js +49 -0
  46. package/dist/src/utils/ignoreManager.js.map +1 -1
  47. package/dist/src/utils/normalization.d.ts +49 -0
  48. package/dist/src/utils/normalization.js +173 -0
  49. package/dist/src/utils/normalization.js.map +1 -0
  50. package/dist/src/utils/projectRoot.d.ts +17 -0
  51. package/dist/src/utils/projectRoot.js +42 -0
  52. package/dist/src/utils/projectRoot.js.map +1 -0
  53. package/dist/src/utils/secureValidation.d.ts +15 -0
  54. package/dist/src/utils/secureValidation.js +41 -0
  55. package/dist/src/utils/secureValidation.js.map +1 -0
  56. package/dist/src/utils/transactionManager.d.ts +45 -0
  57. package/dist/src/utils/transactionManager.js +102 -0
  58. package/dist/src/utils/transactionManager.js.map +1 -0
  59. package/dist/src/utils/validation.d.ts +87 -0
  60. package/dist/src/utils/validation.js +231 -0
  61. package/dist/src/utils/validation.js.map +1 -0
  62. package/docs/ARCHITECTURE.md +300 -0
  63. package/docs/architecture/ADR-001-modular-handlers.md +119 -0
  64. package/llms.txt +62 -7
  65. package/package.json +5 -5
  66. package/AGENT_INSTRUCTIONS.md +0 -135
  67. package/DEPLOYMENT_INSTRUCTIONS.md +0 -110
  68. package/dist/src/tests/test-confirmation-flow.d.ts +0 -1
  69. package/dist/src/tests/test-confirmation-flow.js +0 -43
  70. package/dist/src/tests/test-confirmation-flow.js.map +0 -1
  71. package/dist/tests/debug-replace.d.ts +0 -1
  72. package/dist/tests/debug-replace.js +0 -17
  73. package/dist/tests/debug-replace.js.map +0 -1
  74. package/dist/tests/test-confirmation-flow.d.ts +0 -1
  75. package/dist/tests/test-confirmation-flow.js +0 -43
  76. package/dist/tests/test-confirmation-flow.js.map +0 -1
  77. package/dist/tests/test-dart.d.ts +0 -1
  78. package/dist/tests/test-dart.js +0 -242
  79. package/dist/tests/test-dart.js.map +0 -1
  80. package/dist/tests/test-php-ast.d.ts +0 -1
  81. package/dist/tests/test-php-ast.js +0 -152
  82. package/dist/tests/test-php-ast.js.map +0 -1
  83. package/dist/tests/test-php.d.ts +0 -1
  84. package/dist/tests/test-php.js +0 -234
  85. package/dist/tests/test-php.js.map +0 -1
  86. package/dist/tests/test-smoke.d.ts +0 -5
  87. package/dist/tests/test-smoke.js +0 -83
  88. package/dist/tests/test-smoke.js.map +0 -1
  89. package/dist/tests/writers/test-crlf-handling.d.ts +0 -4
  90. package/dist/tests/writers/test-crlf-handling.js +0 -73
  91. package/dist/tests/writers/test-crlf-handling.js.map +0 -1
  92. package/dist/tests/writers/test-write-smoke.d.ts +0 -9
  93. package/dist/tests/writers/test-write-smoke.js +0 -346
  94. package/dist/tests/writers/test-write-smoke.js.map +0 -1
  95. package/src/ast/dartCompressor.ts +0 -1013
  96. package/src/ast/phpCompressor.ts +0 -814
  97. package/src/ast/semanticCompressor.ts +0 -808
  98. package/src/ast/writers/dartWriter.ts +0 -648
  99. package/src/ast/writers/phpWriter.ts +0 -508
  100. package/src/ast/writers/pyWriter.ts +0 -446
  101. package/src/ast/writers/symbolWriter.ts +0 -277
  102. package/src/ast/writers/tsWriter.ts +0 -418
  103. package/src/index.ts +0 -1553
  104. package/src/utils/backupManager.ts +0 -66
  105. package/src/utils/confirmationCache.ts +0 -61
  106. package/src/utils/diffEngine.ts +0 -223
  107. package/src/utils/fuzzyMatch.ts +0 -86
  108. package/src/utils/ignoreManager.ts +0 -144
  109. package/tests/test-confirmation-flow.ts +0 -49
  110. package/tests/test-dart.d.ts +0 -1
  111. package/tests/test-dart.js +0 -209
  112. package/tests/test-dart.js.map +0 -1
  113. package/tests/test-dart.ts +0 -265
  114. package/tests/test-php-ast.d.ts +0 -1
  115. package/tests/test-php-ast.js +0 -152
  116. package/tests/test-php-ast.js.map +0 -1
  117. package/tests/test-php-ast.ts +0 -155
  118. package/tests/test-php.d.ts +0 -1
  119. package/tests/test-php.js +0 -234
  120. package/tests/test-php.js.map +0 -1
  121. package/tests/test-php.ts +0 -261
  122. package/tests/test-smoke.d.ts +0 -5
  123. package/tests/test-smoke.js +0 -83
  124. package/tests/test-smoke.js.map +0 -1
  125. package/tests/test-smoke.ts +0 -93
  126. package/tests/writers/test-crlf-handling.ts +0 -100
  127. package/tests/writers/test-write-smoke.ts +0 -568
  128. package/tsconfig.json +0 -19
@@ -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 {};
@@ -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 {};