{"_id":"@angular-modernizer/adapter-mcp","_rev":"8-ef37f1bf5e909dc2eca28461ecd2e482","name":"@angular-modernizer/adapter-mcp","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.1":{"name":"@angular-modernizer/adapter-mcp","version":"0.1.1","keywords":["angular","modernization","typescript","ast","ts-morph","mcp","model-context-protocol","claude","ai"],"license":"MIT","_id":"@angular-modernizer/adapter-mcp@0.1.1","maintainers":[{"name":"eiweiss666","email":"christian.weiss1@pm.me"}],"homepage":"https://github.com/eiweiss/tsanalyzer#readme","bugs":{"url":"https://github.com/eiweiss/tsanalyzer/issues"},"bin":{"angular-modernizer-mcp":"dist/cli.js"},"dist":{"shasum":"09a1f29935c5bbace5550be725dee1f0149cc9bc","tarball":"https://registry.npmjs.org/@angular-modernizer/adapter-mcp/-/adapter-mcp-0.1.1.tgz","fileCount":199,"integrity":"sha512-wAqpAEGCkSIm057BC/G4Ua1J7gthI+zvgdFHlO59cGO5hROepvqW1wptJicukeKvPpt59sEu6oZwKMjOaE1/nQ==","signatures":[{"sig":"MEUCIFH9Lt6KpngXCGQb/FE6KMfARwqQK+7gWwx7yQufdVakAiEA4zVkDbBhxHSWNkqwHcN/mf7Qsi9Yl2ZTlfymySZQe00=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1295731},"main":"dist/index.js","type":"module","_from":"file:angular-modernizer-adapter-mcp-0.1.1.tgz","types":"./dist/index.d.ts","scripts":{"dev":"tsc --build --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc --build","clean":"rm -rf dist tsconfig.tsbuildinfo","start":"node dist/cli.js","lint:fix":"eslint src/**/*.ts --fix","test:unit":"jest --testPathIgnorePatterns=integration","test:setup":"bash scripts/setup-fixtures.sh","test:watch":"jest --watch","test:coverage":"jest --coverage","test:real-build":"jest __tests__/integration/real-build-validation.test.ts","test:with-setup":"npm run test:setup && jest __tests__/integration/","test:integration":"jest __tests__/run-schematic.integration.test.ts"},"_npmUser":{"name":"eiweiss666","email":"christian.weiss1@pm.me"},"_resolved":"/private/var/folders/f8/d3fr56lx46v05zd_3pz3twcw0000gn/T/b75a1c665d65c9111302eb4984dacd8a/angular-modernizer-adapter-mcp-0.1.1.tgz","_integrity":"sha512-wAqpAEGCkSIm057BC/G4Ua1J7gthI+zvgdFHlO59cGO5hROepvqW1wptJicukeKvPpt59sEu6oZwKMjOaE1/nQ==","deprecated":"Broken standalone install (missing runtime dependencies). Use 0.1.3 or later.","repository":{"url":"git+https://github.com/eiweiss/tsanalyzer.git","type":"git","directory":"packages/adapter-mcp"},"_npmVersion":"10.9.8","description":"MCP Server to expose Angular Modernizer tools to an AI assistant.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"express":"^4.17.1","@angular-modernizer/api":"0.1.1","@angular-modernizer/core":"0.1.1","@angular-modernizer/worker":"0.1.1","@angular-modernizer/plugin-solid":"0.1.1","@angular-modernizer/orchestration":"0.1.1","@angular-modernizer/plugin-system":"0.1.1","@angular-modernizer/plugin-angular":"0.1.1","@angular-modernizer/plugin-analyzer":"0.1.1","@angular-modernizer/plugin-standalone":"0.1.1","@angular-modernizer/plugin-architecture":"0.1.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","@types/jest":"^30.0.0","@types/express":"^4.17.13"},"_npmOperationalInternal":{"tmp":"tmp/adapter-mcp_0.1.1_1786621660298_0.14465621558734099","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@angular-modernizer/adapter-mcp","version":"0.1.2","keywords":["angular","modernization","typescript","ast","ts-morph","mcp","model-context-protocol","claude","ai"],"license":"MIT","_id":"@angular-modernizer/adapter-mcp@0.1.2","maintainers":[{"name":"eiweiss666","email":"christian.weiss1@pm.me"}],"homepage":"https://github.com/eiweiss/tsanalyzer#readme","bugs":{"url":"https://github.com/eiweiss/tsanalyzer/issues"},"bin":{"angular-modernizer-mcp":"dist/cli.js"},"dist":{"shasum":"c7d5356af92bf46be03409a96d503c2636cc4b4c","tarball":"https://registry.npmjs.org/@angular-modernizer/adapter-mcp/-/adapter-mcp-0.1.2.tgz","fileCount":199,"integrity":"sha512-q8usyI233XkcM8xLJPA302cQXxO4L2KWHjdl/7WJFPv9rV0YcT4rMuvSWJJx4V9sYNkNJ2MD5Ig8oFhWG5d2cQ==","signatures":[{"sig":"MEUCIQD1R7JEEY1xTJb0y+3DXDmiCR1CaoR9tG0H2fGntHNcEwIgXQkdb2QO0qxAa1YUWDvRO638YP/t4NSiJm7aA8PH2OI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1295781},"main":"dist/index.js","type":"module","_from":"file:angular-modernizer-adapter-mcp-0.1.2.tgz","types":"./dist/index.d.ts","scripts":{"dev":"tsc --build --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc --build","clean":"rm -rf dist tsconfig.tsbuildinfo","start":"node dist/cli.js","lint:fix":"eslint src/**/*.ts --fix","test:unit":"jest --testPathIgnorePatterns=integration","test:setup":"bash scripts/setup-fixtures.sh","test:watch":"jest --watch","test:coverage":"jest --coverage","test:real-build":"jest __tests__/integration/real-build-validation.test.ts","test:with-setup":"npm run test:setup && jest __tests__/integration/","test:integration":"jest __tests__/run-schematic.integration.test.ts"},"_npmUser":{"name":"eiweiss666","email":"christian.weiss1@pm.me"},"_resolved":"/private/var/folders/f8/d3fr56lx46v05zd_3pz3twcw0000gn/T/0eac486b6a3a7e3f2dbc0f644b23667a/angular-modernizer-adapter-mcp-0.1.2.tgz","_integrity":"sha512-q8usyI233XkcM8xLJPA302cQXxO4L2KWHjdl/7WJFPv9rV0YcT4rMuvSWJJx4V9sYNkNJ2MD5Ig8oFhWG5d2cQ==","deprecated":"Broken standalone install (missing runtime dependencies). Use 0.1.3 or later.","repository":{"url":"git+https://github.com/eiweiss/tsanalyzer.git","type":"git","directory":"packages/adapter-mcp"},"_npmVersion":"10.9.8","description":"MCP Server to expose Angular Modernizer tools to an AI assistant.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"glob":"^11.0.3","express":"^4.17.1","ts-morph":"^27.0.2","@angular-modernizer/api":"0.1.2","@angular-modernizer/core":"0.1.2","@angular-modernizer/worker":"0.1.2","@angular-modernizer/plugin-solid":"0.1.2","@angular-modernizer/orchestration":"0.1.2","@angular-modernizer/plugin-system":"0.1.2","@angular-modernizer/plugin-angular":"0.1.2","@angular-modernizer/plugin-analyzer":"0.1.2","@angular-modernizer/plugin-standalone":"0.1.2","@angular-modernizer/plugin-architecture":"0.1.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","@types/jest":"^30.0.0","@types/express":"^4.17.13"},"_npmOperationalInternal":{"tmp":"tmp/adapter-mcp_0.1.2_1786622007662_0.9581337393334584","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@angular-modernizer/adapter-mcp","version":"0.1.3","keywords":["angular","modernization","typescript","ast","ts-morph","mcp","model-context-protocol","claude","ai"],"license":"MIT","_id":"@angular-modernizer/adapter-mcp@0.1.3","maintainers":[{"name":"eiweiss666","email":"christian.weiss1@pm.me"}],"homepage":"https://github.com/eiweiss/tsanalyzer#readme","bugs":{"url":"https://github.com/eiweiss/tsanalyzer/issues"},"bin":{"angular-modernizer-mcp":"dist/cli.js"},"dist":{"shasum":"62ff2696e1a081069343eb3c939593d6267c3484","tarball":"https://registry.npmjs.org/@angular-modernizer/adapter-mcp/-/adapter-mcp-0.1.3.tgz","fileCount":199,"integrity":"sha512-VS7D8DFhAwZNA4etG29IQ8fjWpAiWWhUONj96raM+SUlpR2hLERkLf2EETXn3NtPe/JTZQf8rdPx1WCcjhkJjg==","signatures":[{"sig":"MEYCIQD2jl2F2zg7sjmQUTHWIqli5u0wA1gY8L32FdbX1TCU4gIhANGWxW4KKoYDAvFP32nolxLDfLaJQymKhNn3NVb97b67","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1295781},"main":"dist/index.js","type":"module","_from":"file:angular-modernizer-adapter-mcp-0.1.3.tgz","types":"./dist/index.d.ts","scripts":{"dev":"tsc --build --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc --build","clean":"rm -rf dist tsconfig.tsbuildinfo","start":"node dist/cli.js","lint:fix":"eslint src/**/*.ts --fix","test:unit":"jest --testPathIgnorePatterns=integration","test:setup":"bash scripts/setup-fixtures.sh","test:watch":"jest --watch","test:coverage":"jest --coverage","test:real-build":"jest __tests__/integration/real-build-validation.test.ts","test:with-setup":"npm run test:setup && jest __tests__/integration/","test:integration":"jest __tests__/run-schematic.integration.test.ts"},"_npmUser":{"name":"eiweiss666","email":"christian.weiss1@pm.me"},"_resolved":"/private/var/folders/f8/d3fr56lx46v05zd_3pz3twcw0000gn/T/3dcf3db768e4457bdc5befd2c757adc4/angular-modernizer-adapter-mcp-0.1.3.tgz","_integrity":"sha512-VS7D8DFhAwZNA4etG29IQ8fjWpAiWWhUONj96raM+SUlpR2hLERkLf2EETXn3NtPe/JTZQf8rdPx1WCcjhkJjg==","deprecated":"Broken when started via npx/bin shim (server never starts). Use 0.1.4 or later.","repository":{"url":"git+https://github.com/eiweiss/tsanalyzer.git","type":"git","directory":"packages/adapter-mcp"},"_npmVersion":"10.9.8","description":"MCP Server to expose Angular Modernizer tools to an AI assistant.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"glob":"^11.0.3","express":"^4.17.1","ts-morph":"^27.0.2","@angular-modernizer/api":"0.1.3","@angular-modernizer/core":"0.1.3","@angular-modernizer/worker":"0.1.3","@angular-modernizer/plugin-solid":"0.1.3","@angular-modernizer/orchestration":"0.1.3","@angular-modernizer/plugin-system":"0.1.3","@angular-modernizer/plugin-angular":"0.1.3","@angular-modernizer/plugin-analyzer":"0.1.3","@angular-modernizer/plugin-standalone":"0.1.3","@angular-modernizer/plugin-architecture":"0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","@types/jest":"^30.0.0","@types/express":"^4.17.13"},"_npmOperationalInternal":{"tmp":"tmp/adapter-mcp_0.1.3_1786622591690_0.8621338689534819","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@angular-modernizer/adapter-mcp","version":"0.1.4","keywords":["angular","modernization","typescript","ast","ts-morph","mcp","model-context-protocol","claude","ai"],"license":"MIT","_id":"@angular-modernizer/adapter-mcp@0.1.4","maintainers":[{"name":"eiweiss666","email":"christian.weiss1@pm.me"}],"homepage":"https://github.com/eiweiss/tsanalyzer#readme","bugs":{"url":"https://github.com/eiweiss/tsanalyzer/issues"},"bin":{"angular-modernizer-mcp":"dist/cli.js"},"dist":{"shasum":"52cc6f677e9e521d89264b61c755b9e6f65a8d79","tarball":"https://registry.npmjs.org/@angular-modernizer/adapter-mcp/-/adapter-mcp-0.1.4.tgz","fileCount":199,"integrity":"sha512-QQ7HZ4UZ2j1/oeijiysm4TDQH+xMTAfTX64I9MKBwlLPbkLZDOoguSowEvIKp5UzCyNXfQgJVHCzPYBWTIWbng==","signatures":[{"sig":"MEQCIDxY6b3pTCME3v5HYSx8esWDRfZ8QRMnNfP++gOv99s7AiBK2LWFK2BuQoy6liclyAPw0nhQqV6Ba2HRrOPMAsU7Kw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1296567},"main":"dist/index.js","type":"module","_from":"file:angular-modernizer-adapter-mcp-0.1.4.tgz","types":"./dist/index.d.ts","scripts":{"dev":"tsc --build --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc --build","clean":"rm -rf dist tsconfig.tsbuildinfo","start":"node dist/cli.js","lint:fix":"eslint src/**/*.ts --fix","test:unit":"jest --testPathIgnorePatterns=integration","test:setup":"bash scripts/setup-fixtures.sh","test:watch":"jest --watch","test:coverage":"jest --coverage","test:real-build":"jest __tests__/integration/real-build-validation.test.ts","test:with-setup":"npm run test:setup && jest __tests__/integration/","test:integration":"jest __tests__/run-schematic.integration.test.ts"},"_npmUser":{"name":"eiweiss666","email":"christian.weiss1@pm.me"},"_resolved":"/private/var/folders/f8/d3fr56lx46v05zd_3pz3twcw0000gn/T/04368a421e4186c8c6ba0b00dc39c4be/angular-modernizer-adapter-mcp-0.1.4.tgz","_integrity":"sha512-QQ7HZ4UZ2j1/oeijiysm4TDQH+xMTAfTX64I9MKBwlLPbkLZDOoguSowEvIKp5UzCyNXfQgJVHCzPYBWTIWbng==","repository":{"url":"git+https://github.com/eiweiss/tsanalyzer.git","type":"git","directory":"packages/adapter-mcp"},"_npmVersion":"10.9.8","description":"MCP Server to expose Angular Modernizer tools to an AI assistant.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"glob":"^11.0.3","express":"^4.17.1","ts-morph":"^27.0.2","@angular-modernizer/api":"0.1.3","@angular-modernizer/core":"0.1.3","@angular-modernizer/worker":"0.1.3","@angular-modernizer/plugin-solid":"0.1.3","@angular-modernizer/orchestration":"0.1.3","@angular-modernizer/plugin-system":"0.1.3","@angular-modernizer/plugin-angular":"0.1.3","@angular-modernizer/plugin-analyzer":"0.1.3","@angular-modernizer/plugin-standalone":"0.1.3","@angular-modernizer/plugin-architecture":"0.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","@types/jest":"^30.0.0","@types/express":"^4.17.13"},"_npmOperationalInternal":{"tmp":"tmp/adapter-mcp_0.1.4_1786630889235_0.8132618150223798","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@angular-modernizer/adapter-mcp","version":"0.2.0","keywords":["angular","modernization","typescript","ast","ts-morph","mcp","model-context-protocol","claude","ai"],"license":"MIT","_id":"@angular-modernizer/adapter-mcp@0.2.0","maintainers":[{"name":"eiweiss666","email":"christian.weiss1@pm.me"}],"homepage":"https://github.com/eiweiss/tsanalyzer#readme","bugs":{"url":"https://github.com/eiweiss/tsanalyzer/issues"},"bin":{"angular-modernizer-mcp":"dist/cli.js"},"dist":{"shasum":"f2d654a52c60b43fb888cb0ad529330f8ec51ec1","tarball":"https://registry.npmjs.org/@angular-modernizer/adapter-mcp/-/adapter-mcp-0.2.0.tgz","fileCount":203,"integrity":"sha512-NQ0Y2vi85D58iumgCEoLWRI+cRdaopt3OdVWv8ACqaWi/k7AQXh1pKx3tvpVX808pTW0KZnklWUDFMZ73rU7Cg==","signatures":[{"sig":"MEUCIQCRFffClb7rQYMDe55SULQq1RS/o1mXAHuDLEbDtMu8aAIgNOBDSMSO2a7XGI1rRR2EXaR5/BDJT7e952+kaJYFgoM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDNVGUKjE2Z9OaU6MQtAHzX19cyxcj2OZkC2uHRsdwXsQIhAIPsJBjRpv1brK4c7VhNTcAPYOeJvfR502O2GOB8LEYQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1377211},"main":"dist/index.js","type":"module","_from":"file:angular-modernizer-adapter-mcp-0.2.0.tgz","types":"./dist/index.d.ts","scripts":{"dev":"tsc --build --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc --build","clean":"rm -rf dist tsconfig.tsbuildinfo","start":"node dist/cli.js","lint:fix":"eslint src/**/*.ts --fix","test:unit":"jest --testPathIgnorePatterns=integration","test:setup":"bash scripts/setup-fixtures.sh","test:watch":"jest --watch","test:coverage":"jest --coverage","test:real-build":"jest __tests__/integration/real-build-validation.test.ts","test:with-setup":"npm run test:setup && jest __tests__/integration/","test:integration":"jest __tests__/run-schematic.integration.test.ts"},"_npmUser":{"name":"eiweiss666","email":"christian.weiss1@pm.me"},"_resolved":"/private/var/folders/f8/d3fr56lx46v05zd_3pz3twcw0000gn/T/b52864942430b87c6bdad21c66fa3e79/angular-modernizer-adapter-mcp-0.2.0.tgz","_integrity":"sha512-NQ0Y2vi85D58iumgCEoLWRI+cRdaopt3OdVWv8ACqaWi/k7AQXh1pKx3tvpVX808pTW0KZnklWUDFMZ73rU7Cg==","repository":{"url":"git+https://github.com/eiweiss/tsanalyzer.git","type":"git","directory":"packages/adapter-mcp"},"_npmVersion":"10.9.8","description":"MCP Server to expose Angular Modernizer tools to an AI assistant.","directories":{},"_nodeVersion":"22.23.1","dependencies":{"glob":"^11.0.3","express":"^4.17.1","ts-morph":"^27.0.2","@angular-modernizer/api":"0.2.0","@angular-modernizer/core":"0.2.0","@angular-modernizer/worker":"0.2.0","@angular-modernizer/plugin-solid":"0.2.0","@angular-modernizer/orchestration":"0.2.0","@angular-modernizer/plugin-system":"0.2.0","@angular-modernizer/plugin-angular":"0.2.0","@angular-modernizer/plugin-analyzer":"0.2.0","@angular-modernizer/plugin-standalone":"0.2.0","@angular-modernizer/plugin-architecture":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","@types/jest":"^30.0.0","@types/express":"^4.17.13","ts-jest-mock-import-meta":"1.3.2"},"_npmOperationalInternal":{"tmp":"tmp/adapter-mcp_0.2.0_1790162870977_0.13016563319095464","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"_id":"@angular-modernizer/adapter-mcp@0.3.0","bin":{"angular-modernizer-mcp":"dist/cli.js"},"bugs":{"url":"https://github.com/eiweiss/tsanalyzer/issues"},"dist":{"shasum":"ae32b5295a1eac2839846b387f190200f709b1c2","tarball":"https://registry.npmjs.org/@angular-modernizer/adapter-mcp/-/adapter-mcp-0.3.0.tgz","fileCount":255,"integrity":"sha512-n5j9sdBt2CwiPsTFH1Nuki3bC7rEfsfwToqdsEoADhFs4wbjbB38BOSKHWxH3qo3/ACCxv+2n7bBZzoq0eVrXA==","signatures":[{"sig":"MEQCIAEaXsXMHT7pO9+1eMc+SxdKRQAWOWw5wY/9I9t0SDeeAiAs7eVQbQRt9WPj2fvYImOPU78kg9XhOxPfQz6jPlNfqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIA+GlOQ39aVY/6qRLZ2kj1HKk0/JFd5pjlKac7zIXpFvAiBNnp8pLZ53iKF9CBcLWI1ORQIEy6OsX9WFgWRMq6yduQ=="}],"unpackedSize":1708477},"main":"dist/index.js","name":"@angular-modernizer/adapter-mcp","type":"module","_from":"file:angular-modernizer-adapter-mcp-0.3.0.tgz","types":"./dist/index.d.ts","license":"MIT","scripts":{"dev":"tsc --build --watch","lint":"eslint src/**/*.ts","test":"jest","build":"tsc --build","clean":"rm -rf dist tsconfig.tsbuildinfo","start":"node dist/cli.js","lint:fix":"eslint src/**/*.ts --fix","test:unit":"jest --testPathIgnorePatterns=integration","test:setup":"bash scripts/setup-fixtures.sh","test:watch":"jest --watch","test:coverage":"jest --coverage","test:real-build":"jest __tests__/integration/real-build-validation.test.ts","test:with-setup":"npm run test:setup && jest __tests__/integration/","test:integration":"jest __tests__/run-schematic.integration.test.ts"},"version":"0.3.0","_npmUser":{"name":"eiweiss666","email":"christian.weiss1@pm.me"},"homepage":"https://github.com/eiweiss/tsanalyzer#readme","keywords":["angular","modernization","typescript","ast","ts-morph","mcp","model-context-protocol","claude","ai"],"_resolved":"/private/var/folders/f8/d3fr56lx46v05zd_3pz3twcw0000gn/T/1ba01c9c0df9c1af78a1917e3ebf0766/angular-modernizer-adapter-mcp-0.3.0.tgz","_integrity":"sha512-n5j9sdBt2CwiPsTFH1Nuki3bC7rEfsfwToqdsEoADhFs4wbjbB38BOSKHWxH3qo3/ACCxv+2n7bBZzoq0eVrXA==","repository":{"url":"git+https://github.com/eiweiss/tsanalyzer.git","type":"git","directory":"packages/adapter-mcp"},"_npmVersion":"10.9.8","description":"MCP Server to expose Angular Modernizer tools to an AI assistant.","directories":{},"maintainers":[{"name":"eiweiss666","email":"christian.weiss1@pm.me"}],"_nodeVersion":"22.23.1","dependencies":{"glob":"^11.0.3","express":"^4.17.1","ts-morph":"^27.0.2","@angular-modernizer/api":"0.3.0","@angular-modernizer/core":"0.3.0","@angular-modernizer/worker":"0.3.0","@angular-modernizer/plugin-solid":"0.3.0","@angular-modernizer/orchestration":"0.3.0","@angular-modernizer/plugin-system":"0.3.0","@angular-modernizer/plugin-angular":"0.3.0","@angular-modernizer/plugin-analyzer":"0.3.0","@angular-modernizer/plugin-standalone":"0.3.0","@angular-modernizer/plugin-architecture":"0.3.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","ts-jest":"^29.4.5","@types/jest":"^30.0.0","@types/express":"^4.17.13","ts-jest-mock-import-meta":"1.3.2"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/adapter-mcp_0.3.0_1790754818321_0.542270515545408"}}},"time":{"created":"2026-08-13T11:47:40.141Z","modified":"2026-09-30T07:53:38.654Z","0.1.1":"2026-08-13T11:47:40.487Z","0.1.2":"2026-08-13T11:53:27.824Z","0.1.3":"2026-08-13T12:03:11.863Z","0.1.4":"2026-08-13T14:21:29.385Z","0.2.0":"2026-09-23T11:27:51.080Z","0.3.0":"2026-09-30T07:53:38.429Z"},"bugs":{"url":"https://github.com/eiweiss/tsanalyzer/issues"},"license":"MIT","homepage":"https://github.com/eiweiss/tsanalyzer#readme","keywords":["angular","modernization","typescript","ast","ts-morph","mcp","model-context-protocol","claude","ai"],"repository":{"url":"git+https://github.com/eiweiss/tsanalyzer.git","type":"git","directory":"packages/adapter-mcp"},"description":"MCP Server to expose Angular Modernizer tools to an AI assistant.","maintainers":[{"name":"eiweiss666","email":"christian.weiss1@pm.me"}],"readme":"# @angular-modernizer/adapter-mcp\n\nMCP server that exposes Angular Modernizer capabilities as 39 structured tools for AI assistants.\n\n---\n\n## Overview\n\nThe `@angular-modernizer/adapter-mcp` package provides a Model Context Protocol (MCP) server for Angular codebase modernization. Built on the core Angular Modernization Platform, this adapter enables AI assistants to perform analysis, generate migration strategies, and execute safe transformations.\n\nTools are designed for LLM consumption with structured I/O, pre-validation, automatic backup, build validation, and rollback on failure.\n\n---\n\n## Architecture\n\n```\nAI Assistant (Claude/Copilot)\n      |\n      | JSON-RPC 2.0 (stdio)\n      v\nMCP Server (adapter-mcp)\n  - 39 Tools (analysis, planning, transformation,\n    build and validation, feedback, bug investigation)\n  - Shared ts-morph ProjectCache\n  - Real-time Progress Monitoring\n  - Parameter Validation\n  - Result Serialization\n      |\n      | TypeScript API\n      v\nCore Platform (Kernel + Plugins)\n  - Analysis Rules (52 rules total)\n      - Architecture: 17 rules\n      - Angular: 28 rules\n      - SOLID: 7 rules\n  - Transformations (19 types via transform-code)\n  - Caching\n  - Orchestration\n      |\n      | ts-morph AST\n      v\nTypeScript Project\n  - Source Files\n  - Type Checking\n  - Semantic Analysis\n```\n\n---\n\n## Quick Start\n\n### Installation\n\n```bash\ncd packages/adapter-mcp\npnpm install\npnpm build\npnpm start\n```\n\n### Configuration\n\nCreate `.angular-modernizer.json` in your project root. Only `build` is required; per-tool defaults go under\n`tools` (full reference: `docs/CONFIGURATION.md`, schema: `packages/core/schemas/angular-modernizer.schema.json`):\n\n```json\n{\n  \"build\": {\n    \"command\": \"ng build\",\n    \"mode\": \"incremental\"\n  },\n  \"tools\": {\n    \"analyze-project\": {\n      \"excludePatterns\": [\"**/node_modules/**\", \"**/dist/**\"],\n      \"orchestration\": { \"parallel\": true, \"autoSelectMode\": true }\n    },\n    \"scan-architecture\": {\n      \"maxFiles\": 500,\n      \"orchestration\": { \"parallel\": true, \"enableProgress\": true }\n    }\n  }\n}\n```\n\nThe schema allows no unknown top-level keys: tool options outside `tools` make the file fail validation\n(`ConfigValidationError`), and none of its settings apply.\n\n### Client Setup\n\nThe server entry point is `dist/cli.js` (`dist/index.js` only exports the tool classes). Claude Code:\n\n```bash\nclaude mcp add angular-modernizer npx @angular-modernizer/adapter-mcp\n```\n\nOr point a client at a local build, e.g. `.mcp.json` / `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"angular-modernizer\": {\n      \"command\": \"node\",\n      \"args\": [\"--expose-gc\", \"/path/to/tsanalyzer/packages/adapter-mcp/dist/cli.js\"],\n      \"cwd\": \"/path/to/your/angular/project\"\n    }\n  }\n}\n```\n\n`--expose-gc` lets the ProjectCache collect garbage after evicting a project. `cli.js` also takes\n`--max-projects N` and `--max-heap-mb N` (defaults 3 and 2048). A running client keeps the old code in memory\nafter a rebuild; reconnect, or check `server-status` (`build.rebuiltSinceStart`).\n\n---\n\n## Available Tools\n\n### Analysis Tools\n\n| Tool | Purpose | Rules | Cache | Time |\n|-|-|-|-|-|\n| analyze-project | Framework/architecture detection | - | yes | 2-5s |\n| scan-architecture | Architecture violations incl. import cycles and layer boundaries | 17 | yes | 5-30s |\n| scan-solid | SOLID principle violations | 7 | yes | 3-15s |\n| scan-angular | Angular best practices | 28 | yes | 5-20s |\n| scan-all | Combined analysis (all plugins) | 52 | yes | 10-45s |\n| analyze-core-to-shared | Dependency violation analysis | - | yes | 3-10s |\n| analyze-parser-performance | Parser metrics from feedback sessions | - | no | varies |\n| extract-libraries | Library extraction candidates (shared folders, secondary entry points) | - | no | varies |\n| learn-patterns | ML-based pattern discovery | - | yes | 10-60s |\n\n#### analyze-project\n\nDetects framework (Angular CLI, Nx), analyzes architecture patterns, identifies layers, and discovers project structure including PWA/offline capabilities.\n\nKey features:\n- Auto-detects tsconfig.json location\n- Identifies applications and libraries\n- Detects service worker configuration\n- Maps architectural layers from path aliases\n\n#### scan-architecture\n\nRuns 17 architecture rules detecting import cycles (`solid:circular-dependency`, project-wide value-import graph with NG0919 risk flag), god objects, layer boundary violations, and architectural anti-patterns.\n\nKey features:\n- Batch processing (handles unlimited files)\n- Scope filtering (apps, libs, features, folders)\n- Up to 39x speedup with caching (202.8s to 5.2s measured)\n- Parallel execution with auto-selection\n- Time budget `maxDurationMs` (default 300000, `0` = off): checked between files; on overrun the scan returns what it has with `execution.incomplete`, `skippedFiles` and a note. `execution.ruleTimings` lists time per rule, slowest first. Note that `maxFiles` defaults to 100.\n- Pagination: `maxResults` (default 1000) and `resultOffset` page the violations; `summary` counts all of them, `pagination.hasMore` says whether to fetch the next page. Pass `rules` (exact rule ids such as `solid:circular-dependency`) for a focused scan.\n- `streaming` defaults to `true`: the call returns an `operationId`; poll `get-operation-progress` for the result, or pass `streaming: false`.\n\n#### scan-solid\n\nRuns 7 SOLID principle rules detecting dependency inversion, single responsibility, Liskov substitution, open/closed, and interface segregation violations.\n\nKey features:\n- Pure SOLID principle analysis (DIP, SRP, LSP, OCP, ISP)\n- Identifies tightly-coupled dependencies\n- Detects god objects and bloated classes\n- Independent cache for optimal performance\n\n#### scan-angular\n\nRuns 28 Angular-specific rules detecting OnPush violations, RxJS anti-patterns, performance issues, and framework best practice violations.\n\nKey features:\n- Angular-specific best practices\n- RxJS optimization opportunities\n- Change detection strategy violations\n- Bundle size optimization recommendations\n- Independent cache for Angular analysis\n\n#### scan-all\n\nRuns all 52 analysis rules (17 architecture + 7 SOLID + 28 Angular) with cross-cache reading for maximum efficiency.\n\nKey features:\n- Combines all plugin rules in single scan\n- Reads from fallback caches (architecture/solid/angular)\n- Up to 57% faster when individual scans run first\n- Comprehensive analysis in one execution\n\n#### analyze-core-to-shared\n\nDetects when the core layer imports from the shared layer (architectural anti-pattern) with reverse dependency impact assessment.\n\nKey features:\n- Identifies dependency inversion violations\n- Calculates breaking change risk (LOW/MEDIUM/HIGH)\n- Traces reverse dependencies\n- Provides refactoring recommendations\n\n#### learn-patterns\n\nDiscovers recurring patterns with self-learning capabilities.\n\nKey features:\n- 5 pattern categories (RxJS, Component, Service, Transformation, Architectural)\n- Auto-detects codebase style (RxJS preference, DI style, state management)\n- Generates custom analysis rules from patterns\n- Tracks pattern evolution across scans\n\n#### collect-feedback\n\nManually collect transformation feedback for AI learning with privacy-first design.\n\nKey features:\n- Privacy-first: hashed file paths, no code snippets, bucketed metrics\n- Dual-location storage (project + platform root)\n- Automated validation (6 checks) and quality scoring\n- Outlier detection (4 types) for anomaly handling\n- Learning extraction from transformation outcomes\n\nUsage:\n\n```typescript\n{\n  \"transformation\": {\n    \"ruleId\": \"standalone-migration-v1\",\n    \"targetFile\": \"/src/app/user.component.ts\",\n    \"approach\": \"Migrate to standalone component\",\n    \"reasoning\": \"Isolated component, no complex dependencies\",\n    \"confidence\": 0.95\n  },\n  \"execution\": {\n    \"succeeded\": true,\n    \"duration\": 1200\n  },\n  \"validation\": {\n    \"buildSuccess\": true,\n    \"testsPass\": true\n  },\n  \"storageLocation\": \"both\"  // 'project', 'platform', or 'both' (default)\n}\n```\n\nReturns:\n- `feedbackId`: unique identifier for this feedback\n- `sessionId`: session this feedback belongs to\n- `stored`: boolean indicating successful storage\n- `storageLocations`: array of paths where feedback was saved\n- `validationResult`: quality validation results\n- `learnings`: extracted patterns and insights\n\nOptional on failure: `execution.errorType` (`build`, `type`, `lint`, `test`, `runtime`, `syntax`, `semantic`, `timeout`, `unknown`; inferred from `execution.error` when omitted) and `validation.buildErrors` (string array, used as learning evidence).\n\nAnalysis records (`kind: \"analysis\"`) report a read-only tool result that had to be corrected by grep, build output, a script or manual reading. No execution or build data is needed; `analysis` takes one record or an array:\n\n```typescript\n{\n  \"kind\": \"analysis\",\n  \"analysis\": {\n    \"tool\": \"find-usages\",\n    \"query\": { \"symbolName\": \"OrderListComponent\" },\n    \"claimed\": \"0 usages outside the declaring module\",\n    \"actual\": \"3 template usages in 2 .html files\",\n    \"fallbackUsed\": \"grep\",          // grep | build | script | manual | none | other\n    \"evidence\": [\"git grep -n '<app-order-list' -- '*.html'\"],\n    \"impact\": \"high\",                // optional: low | medium | high\n    \"category\": \"blind-spot\"         // optional: blind-spot | false-positive | false-negative | bug | missing-capability | config-drift\n  }\n}\n```\n\nReturns `kind`, `sessionId`, `stored`, `storageLocations` and per-record `records[]` (`feedbackId`, `stored`, `completenessScore`, `issues`). `review-feedback` reports these records under `analysisInsights`.\n\n#### review-feedback\n\nReview collected feedback and extract actionable insights for AI learning.\n\nKey features:\n- Reads from both project and platform locations (dual-source)\n- Pattern detection: success patterns (>=3 occurrences, >=80% success rate)\n- Failure patterns (>=2 occurrences) for early warning\n- Quality trend analysis (improved/degraded/unchanged)\n- Outlier filtering (<3% outlier rate target)\n- Confidence scoring (0.0-1.0) for each insight\n\nUsage:\n\n```typescript\n{\n  \"source\": \"both\",\n  \"analysisType\": \"all\",\n  \"minConfidence\": 0.7,\n  \"minCompleteness\": 70,\n  \"category\": \"standalone-migration\",\n  \"since\": \"2025-12-01\"\n}\n```\n\nReturns:\n- `sessions`: number of sessions reviewed\n- `transformations`: number of transformations analyzed\n- `successRate`: overall success rate (0.0-1.0)\n- `insights`: array of detected patterns with confidence scores\n- `qualityWarnings`: warnings about low-quality feedback\n- `sourcesRead`: locations where feedback was read from\n\n#### suggest-improvements\n\nGenerate suggestions for transformation rules based on feedback patterns.\n\nKey features:\n- 3 suggestion types: parameter-adjustment, prerequisite-check, approach-change\n- Confidence scoring (0.0-1.0) for each suggestion\n- All suggestions require human approval (`requiresApproval: true`)\n- Expected improvement estimates\n- Sorted by confidence (highest first)\n\nSuggestion types:\n1. Parameter adjustment: lower confidence thresholds to reduce false positives (>=3 high-confidence failures)\n2. Prerequisite check: add prerequisite checks for common failure patterns (>=40% failures match pattern)\n3. Approach change: switch to alternative approach with >90% success rate (>=3 successes with new approach)\n\nUsage:\n\n```typescript\n{\n  \"ruleId\": \"standalone-migration-v1\",\n  \"source\": \"both\",\n  \"minConfidence\": 0.7\n}\n```\n\nReturns:\n- `ruleId`: rule these suggestions apply to\n- `suggestions`: array of suggestions sorted by confidence (descending)\n- `totalFeedback`: number of feedback records analyzed\n- `successRate`: current rule success rate\n\nExample suggestion:\n\n```json\n{\n  \"type\": \"parameter-adjustment\",\n  \"confidence\": 0.85,\n  \"suggestion\": \"Lower confidence threshold from 0.95 to 0.85\",\n  \"reasoning\": \"3 high-confidence failures detected, threshold too aggressive\",\n  \"expectedImprovement\": \"Reduce false positives by 40%\",\n  \"requiresApproval\": true\n}\n```\n\n### Planning Tools\n\n| Tool | Purpose | Cache | Time |\n|-|-|-|-|\n| plan-migration | Style-aware strategy generation; scan-based roadmap from file-level violations | ProjectCache | 1-3s |\n| orchestrate-migration | Multi-step workflows with dependency management and checkpoint/resume | no | varies |\n\n#### plan-migration\n\nGenerates comprehensive migration strategies based on violations, architecture, and codebase style.\n\nKey features:\n- Scan-based roadmap: with `projectRoot` and violations that carry `filePath` (inline or via `scanResultFile`, a\n  saved scan-architecture result) the phases list concrete files, grouped per file and layer, ordered dependencies\n  first along the import graph plus template edges (a host after the components, directives and pipes its\n  template uses), import cycles kept together (`planSource: \"scan\"`, details in `scanPlan`;\n  `maxPhases`, `summaryOnly`, `maxResults` caps files per phase and violations per file, default 25)\n- Style-aware risk assessment\n- Team context integration (velocity, experience, availability)\n- Multi-phase roadmap generation (strategy templates when no file paths are given, `planSource: \"template\"`)\n- Identifies style-conflicting steps\n\n### Transformation Tools\n\n| Tool | Purpose | Cache | Time |\n|-|-|-|-|\n| transform-code | 19 transformation types | no | varies |\n| run-schematic | Angular schematic execution | no | varies |\n| run-angular-cli | CLI command execution | no | varies |\n| run-build | Multi-build system support | no | varies |\n\n#### transform-code\n\nApplies surgical code transformations with pre-validation, backup, build validation, and automatic rollback.\n\n19 transformation types:\n1. constructor-to-inject\n2. interface-extraction\n3. standalone-migration\n4. dependency-injection-migration\n5. facade-pattern\n6. form-modernization\n7. constructor-injection-transform\n8. component-inputs-interface-extraction\n9. service-injection-cleanup\n10. container-presentational\n11. core-shared-modules\n12. inheritance-to-composition\n13. promise-service-to-observable\n14. promise-component-to-reactive\n15. promise-cleanup\n16. sequential-await-to-forkjoin\n17. subscription-transform\n18. missing-output-transform\n19. library-extraction\n\nSafety features:\n- Pre-transformation validation (syntax, types, schema)\n- Automatic file backup before changes\n- Build validation (ensures code compiles)\n- Auto-rollback on build failure (prevents broken code)\n- Post-transformation validation (lint, tests)\n- Batch mode with all-or-nothing strategy\n\nBuild validation parameters:\n- `validateBuild: boolean` - run build after transformation (default: true)\n- `rollbackOnBuildFailure: boolean` - auto-rollback on build errors (default: true)\n- `buildTimeout: number` - build timeout in ms (default: 300000 = 5 min)\n- `projectRoot: string` - project root for build execution\n\nDiff format parameters:\n- `diffFormat: 'unified' | 'structured' | 'both'` - diff output format in streaming mode (default: 'structured')\n  - `unified`: traditional git-style diff (human-readable, backward compatible)\n  - `structured`: machine-first JSON diff with semantic annotations (AI-optimized)\n  - `both`: include both formats (useful for debugging, higher overhead)\n\nStructured diff features:\n- 13 Angular-specific file type classifications (component, service, module, etc.)\n- 14 TypeScript syntax type annotations (decorator, import, class, method, etc.)\n- Semantic intent inference with confidence scores (0.0-1.0)\n- Angular context extraction (decorators, lifecycle hooks, DI patterns)\n- Related change tracking (imports linked to usage)\n\nSupported build systems: Angular CLI, Nx, Vite, Webpack, npm\n\n### Validation and Safety Tools\n\n| Tool | Purpose | Cache | Time |\n|-|-|-|-|\n| validate-before-transform | Pre-transformation checks | no | 1-2s |\n| validate-transformation | Post-transformation checks | no | 30-300s |\n| rollback-changes | Revert transformations | no | <1s |\n| check-incremental-compatibility | Whether a project supports incremental build validation | no | varies |\n| validate-project-compatibility | Parser compatibility before transformations | no | varies |\n| analyze-build-impact | Changed files -> value, type-only and template dependents, affected modules, strategy | ProjectCache | ~1s warm |\n| get-operation-progress | Progress and result of a streaming operation | no | <1s |\n\n#### analyze-build-impact\n\n`filesToChange` is the changed set. Dependents are split into value dependents (JS rebuild), type-only dependents\n(type-check only) and template dependents: host components that use a changed component, directive or pipe only in\ntheir template (NgModule declarations), listed with the used classes in `templateHosts`. Barrels only forward the\nnames they re-export; past the first importer only exports whose type surface (annotations, inferred types, heritage,\n`@NgModule` exports) names a changed binding propagate, so using a class inside a method body or a decorator stops\nthere. `symbols` narrows the impact to consumers of given exports (`symbolImpacts`). `.html` files map\nto their component (`mappedFiles`), which counts as changed without its dependents. `summaryOnly` / `maxResults`\nshorten the lists; `counts` always describe the full result.\n\n### Bug Investigation Tools\n\nRead-only tools over the shared ProjectCache: a workspace is parsed once per server and re-read per changed file.\nAll list-heavy tools take `summaryOnly` and `maxResults`.\n\n| Tool | Answers |\n|-|-|\n| parse-stack-trace | Structured frames from Node.js / Angular / Zone.js / browser stacks, browser URLs and bare file names mapped onto project files |\n| find-usages | Every reference to a symbol, classified (declaration, read, write, call, template, unresolved) |\n| get-call-graph | Callers and callees of a method or function, incl. template callers; `maxNodes` caps the tree |\n| resolve-type | TypeScript type at file:line:col (nullable, async, generics, declaration) |\n| find-angular-symbol | Components, directives, pipes, services, ... by selector, pipe name or class, incl. library classes from `.d.ts` |\n| search-codebase | Text, regex or declaration search, incl. `.html` and files outside the program |\n| list-imports | Imports and re-exports of a file with resolved targets (aliases, barrels) |\n| inspect-template | Template structure: elements, bindings, matched components/directives/pipes, control flow, i18n keys |\n| find-component-hosts | Every template host of a component or directive with bound, unbound and missing required inputs/outputs; components created in code (dialogs, `createComponent`, routes) |\n| trace-output-flow | Payload of an `@Output` across the template boundary, and dialog data in / results out |\n| get-bootstrap-execution | What runs at startup (initializers, bootstrap, interceptors, provider factories) and where a watched expression is touched |\n| inspect-form-group | Reactive Forms structure and every enable/disable/validator change per control |\n| inspect-i18n | Translation keys: definitions per language and overlay, usages in templates and code, missing and undefined keys |\n\n### Server\n\n| Tool | Purpose |\n|-|-|\n| server-status | pid, uptime, memory, cached projects, response sizes, and whether the dist was rebuilt since start |\n\n---\n\n## Advanced Features\n\n### Cross-Cache Reading System\n\n`scan-all` reads from individual plugin caches written by `scan-architecture`, `scan-solid`, and `scan-angular`. When those tools have run first, `scan-all` avoids re-analyzing files it already has results for.\n\nPerformance impact:\n\n```\nWorkflow: scan-architecture -> scan-solid -> scan-angular -> scan-all\n\nWithout cross-cache: scan-all analyzes all 450 files\nWith cross-cache:    scan-all reads cached results (up to 57% reduction)\n```\n\nCache statistics example:\n\n```json\n{\n  \"hitRate\": 0.0,\n  \"hitsBySource\": {\n    \"architecture\": 150,\n    \"solid\": 150,\n    \"angular\": 150\n  }\n}\n```\n\nA `hitRate` of 0% with non-zero `hitsBySource` is correct: it means the primary cache (scan-all's own) is empty on the first run, but fallback caches from the other tools are being read successfully. The second `scan-all` run will have `hitRate > 0%`.\n\nBest practice: run individual scans first, then `scan-all` for maximum cache benefit.\n\n### Intelligent Mode Selection\n\nThe orchestration system automatically selects between Promise-based and worker thread parallelism based on project complexity score:\n\n```\nScore 0-35:   Promise mode (small projects)\nScore 35-50:  Promise mode with monitoring\nScore 50-75:  Worker mode preferred\nScore 75-100: Worker mode required\n```\n\nPerformance results (1,500 files, 13 rules):\n- Auto-selection: 251.81s\n- Forced worker mode: 279.83s\n- Auto-selection was 1.14x faster\n\nMemory management:\n- RAM-aware worker count (2-8 workers, not CPU-based)\n- Worker recycling at 80% heap threshold\n- Real-time monitoring with automatic fallback\n- Isolated worker heaps prevent cascade failures\n\nConfiguration (enabled by default):\n\n```typescript\norchestration: {\n  autoSelectMode: true,  // Default, no configuration needed\n}\n```\n\n### Self-Learning Pattern Knowledge Base\n\nThe `learn-patterns` tool persists discovered patterns across scans in `.angular-modernizer-cache/pattern-knowledge.json`. This enables pattern evolution tracking, confidence improvement over time, style shift detection, and pattern velocity measurement.\n\nExample evolution output:\n\n```json\n{\n  \"scan1\": { \"patterns\": 15, \"avgConfidence\": 0.65 },\n  \"scan2\": { \"patterns\": 18, \"avgConfidence\": 0.72 },\n  \"scan3\": { \"patterns\": 16, \"avgConfidence\": 0.78 },\n  \"evolution\": {\n    \"newPatterns\": 3,\n    \"deprecatedPatterns\": 2,\n    \"confidenceImprovement\": 0.13,\n    \"patternStability\": 0.85\n  }\n}\n```\n\n---\n\n## Configuration\n\n### Tool-Specific Configuration\n\nCreate `.angular-modernizer.json`:\n\n```json\n{\n  \"analyze-project\": {\n    \"rootPath\": \".\",\n    \"excludePatterns\": [\"**/node_modules/**\", \"**/dist/**\"],\n    \"maxResults\": 1000,\n    \"orchestration\": {\n      \"parallel\": true,\n      \"autoSelectMode\": true,\n      \"enableProgress\": true\n    }\n  },\n  \"scan-architecture\": {\n    \"rootPath\": \".\",\n    \"maxFiles\": 500,\n    \"includeAutoFixes\": true,\n    \"orchestration\": {\n      \"parallel\": true,\n      \"incremental\": false,\n      \"autoSelectMode\": true,\n      \"enableProgress\": true,\n      \"timeout\": 120000\n    }\n  },\n  \"learn-patterns\": {\n    \"targetPath\": \".\",\n    \"categories\": [\"all\"],\n    \"minOccurrences\": 3,\n    \"enableLearning\": true,\n    \"generateStyleProfile\": true,\n    \"respectCodebaseStyle\": true\n  }\n}\n```\n\n### Cache Configuration\n\nCaching is enabled by default for analysis tools:\n\n```typescript\ncacheConfig: {\n  enabled: true,\n  cacheDir: '.angular-modernizer-cache',\n  maxSize: 100 * 1024 * 1024,  // 100MB\n  maxAge: 24 * 60 * 60 * 1000, // 24 hours\n  compression: true\n}\n```\n\nCache locations:\n- `architecture`: `.angular-modernizer-cache/architecture/`\n- `solid`: `.angular-modernizer-cache/solid/`\n- `angular`: `.angular-modernizer-cache/angular/`\n- `patterns`: `.angular-modernizer-cache/pattern-knowledge.json`\n\nWhen to clear cache:\n- After major codebase changes (framework upgrade, large refactoring)\n- When rules are updated\n- If cache corruption is suspected\n\n```bash\nrm -rf .angular-modernizer-cache\n```\n\n### Orchestration Tuning\n\nFor large projects (500+ files):\n\n```json\n{\n  \"orchestration\": {\n    \"parallel\": true,\n    \"autoSelectMode\": true,\n    \"maxWorkers\": 6,\n    \"enableProgress\": true,\n    \"enableMonitoring\": true,\n    \"resourceLimits\": {\n      \"maxMemory\": 4294967296,\n      \"maxWorkers\": 8\n    }\n  }\n}\n```\n\nFor small projects (<100 files):\n\n```json\n{\n  \"orchestration\": {\n    \"parallel\": false,\n    \"autoSelectMode\": true\n  }\n}\n```\n\n---\n\n## Best Practices\n\n### Recommended Workflows\n\n#### Initial Assessment\n\n```\n1. analyze-project\n   (framework, architecture, layers)\n2. scan-architecture\n   (violations by category)\n3. learn-patterns\n   (codebase style profile)\n4. plan-migration\n   (style-aware strategy)\n```\n\n#### Safe Transformation\n\n```\n1. validate-before-transform\n   (check syntax, types, dependencies)\n2. transform-code (with safety flags)\n   (backup -> transform -> validate)\n3. validate-transformation\n   (build, lint, tests)\n4. rollback-changes (if needed)\n```\n\n#### Incremental Monitoring\n\n```\nDay 1:  Full scan + cache write\nDay 2+: Incremental scan (changed files only)\nWeekly: Full scan + pattern evolution check\n```\n\n### Cache Optimization\n\nRun individual scans before `scan-all`:\n\n```bash\n# Step 1: Individual scans (write plugin-specific caches)\nscan-architecture   # Writes: .cache/architecture/\nscan-solid          # Writes: .cache/solid/\nscan-angular        # Writes: .cache/angular/\n\n# Step 2: Combined scan (reads from fallback caches)\nscan-all            # Reads from all above caches (up to 57% faster)\n```\n\nSecond run performance:\n- architecture: 202.8s to 5.2s (39x speedup)\n- solid: 85.3s to 5.7s (14.9x speedup)\n- angular: 65.2s to 43.5s (1.5x speedup)\n\n### Safety Guidelines\n\nAlways use safety features:\n\n```typescript\ntransform-code: {\n  validateBeforeTransform: true,\n  createBackup: true,\n  validateTransformation: true,\n  autoRollback: true\n}\n```\n\nBatch transformations:\n\n```typescript\n{\n  files: [...],\n  rollbackStrategy: \"all-or-nothing\"\n}\n```\n\n---\n\n## Streaming Progress\n\nThe streaming progress feature provides real-time feedback during long-running transformations through a polling-based architecture. AI assistants can monitor progress, display diffs, and detect errors as they occur.\n\nKey capabilities:\n- Real-time progress (percentage, phase, and ETA updates)\n- Unified diffs (git-style diffs for every file transformation)\n- Syntax validation (lightweight error detection without compilation)\n- Memory tracking (continuous heap usage monitoring)\n- Incremental polling (fetch only new events since last poll)\n- Zero overhead (only active when explicitly used)\n\n### Architecture\n\n```\nAI Assistant -> Start Operation -> Background Execution\n     |              |                    |\nPoll Progress -> ProgressStore <- Stream Events\n     |                                   |\nDisplay Updates                   Transform Files\n```\n\nPolling pattern:\n1. Start transformation, receive `operationId`\n2. Poll `get-operation-progress` with `operationId`\n3. Display progress, diffs, errors to user\n4. Continue polling until `status: 'completed'`\n\n### Quick Start\n\nStart a streaming operation:\n\n```typescript\n{\n  \"tool\": \"transform-code\",\n  \"arguments\": {\n    \"transformation\": \"standalone-migration\",\n    \"files\": [\"src/app/home/home.component.ts\", \"src/app/user/user.component.ts\"],\n    \"streaming\": true\n  }\n}\n\n// Response\n{\n  \"operationId\": \"transform-20251209-123456-abc\",\n  \"status\": \"running\",\n  \"message\": \"Transformation started in background\"\n}\n```\n\nPoll for progress:\n\n```typescript\n{\n  \"tool\": \"get-operation-progress\",\n  \"arguments\": {\n    \"operationId\": \"transform-20251209-123456-abc\"\n  }\n}\n\n// Response\n{\n  \"operationId\": \"transform-20251209-123456-abc\",\n  \"status\": \"running\",\n  \"events\": [\n    {\n      \"phase\": \"transforming\",\n      \"percentage\": 50,\n      \"message\": \"Transforming home.component.ts\",\n      \"timestamp\": 1733750401000,\n      \"diff\": {\n        \"filePath\": \"src/app/home/home.component.ts\",\n        \"diff\": \"--- src/app/home/home.component.ts\\n+++ ...\",\n        \"linesAdded\": 4,\n        \"linesRemoved\": 1\n      }\n    }\n  ],\n  \"totalEvents\": 5,\n  \"elapsedTime\": 2500,\n  \"eta\": 2500\n}\n```\n\nIncremental polling (recommended):\n\n```typescript\n// First poll: get all events\nconst poll1 = await getProgress({ operationId });\n\n// Subsequent polls: get only new events\nconst poll2 = await getProgress({\n  operationId,\n  sinceTimestamp: poll1.events[poll1.events.length - 1].timestamp,\n});\n```\n\n### Event Structure\n\n```typescript\ninterface StreamingProgressEvent {\n  phase: 'analyzing' | 'transforming' | 'validating' | 'building' | 'complete';\n  percentage: number; // 0-100\n  message: string;\n  timestamp: number; // Unix timestamp (ms)\n\n  currentFile?: string;\n\n  diff?: {\n    filePath: string;\n    diff: string; // Unified diff\n    linesAdded: number;\n    linesRemoved: number;\n  };\n\n  syntaxErrors?: Array<{\n    filePath: string;\n    line: number;\n    message: string;\n  }>;\n\n  memoryUsage?: {\n    heapUsed: number;\n    heapTotal: number;\n    percentage: number; // 0-100\n  };\n}\n```\n\n### Progress Phases\n\n```\nanalyzing    (0-10%)   : Project setup, file discovery\ntransforming (10-90%)  : Per-file AST transformation\nvalidating   (90-95%)  : Syntax validation\nbuilding     (95-98%)  : Optional compilation check\ncomplete     (100%)    : Final summary\n```\n\n### Performance Impact\n\n| Configuration | Overhead | Use Case |\n|-|-|-|\n| No streaming | 0% | Automation, CI/CD |\n| Minimal streaming | ~2-3% | Progress tracking only |\n| Full streaming | ~8-16% | AI assistants (diffs + validation) |\n\nOverhead breakdown:\n- Event generation: ~2-3%\n- Diff generation: ~5-10% (only modified files)\n- Syntax detection: ~1-2%\n- Memory tracking: <1%\n\nWhen to use streaming:\n- Long-running operations (>10 seconds)\n- Large projects (>100 files)\n- AI assistants requiring feedback\n- User needs diff visibility\n\nWhen to use batch (non-streaming):\n- Short operations (<10 seconds)\n- Automation/CI/CD\n- Performance-critical scenarios\n\n---\n\n## Troubleshooting\n\n### \"Insufficient resources to proceed\"\n\nCause: memory or worker limit exceeded.\n\nSolutions:\n1. Reduce batch size: `maxFiles: 50`\n2. Enable auto-selection: `autoSelectMode: true`\n3. Set memory limit: `resourceLimits.maxMemory: 4GB`\n4. Reduce workers: `maxWorkers: 2`\n\n### \"Cache hit rate 0% - is cache working?\"\n\nYes, this is normal for the first run or for `scan-all` using the cross-cache system.\n\n- `hitRate: 0%` means the primary cache (scan-all's own plugin cache) is empty\n- `hitsBySource: {...}` with non-zero values means fallback caches are working correctly\n- The second run will have `hitRate > 0%`\n\n### \"Worker threads not available (offline mode)\"\n\nCause: worker script not compiled or unavailable.\n\nSolutions:\n1. Build project: `pnpm build`\n2. Set manual mode: `useWorkerThreads: false`\n3. Trust auto-selection: `autoSelectMode: true` (auto-detects and uses Promises)\n\n### \"Transformation failed - syntax errors\"\n\nCause: code has existing syntax/type errors.\n\nSolutions:\n1. Check `preValidation.issues` array\n2. Fix reported errors before transforming\n3. Use `validateBeforeTransform: true` (default)\n\n### \"Memory exceeded during analysis\"\n\nCause: large project analyzed without batching.\n\nSolutions:\n1. Use default `maxFiles: 100` (batching enabled)\n2. Enable monitoring: `enableMonitoring: true`\n3. Set memory limit: `resourceLimits.maxMemory`\n4. Clear cache: `rm -rf .angular-modernizer-cache`\n\n---\n\n## Performance Guide\n\n### Expected Timings by Project Size\n\n| Project Size | Files | analyze-project | scan-architecture | learn-patterns |\n|-|-|-|-|-|\n| Small | <100 | 2-3s | 5-10s (cache: 1s) | 10-20s |\n| Medium | 100-500 | 5-10s | 15-30s (cache: 3s) | 20-40s |\n| Large | 500-1500 | 10-20s | 60-120s (cache: 5s) | 40-90s |\n| Enterprise | 1500+ | 20-40s | 180-300s (cache: 10s) | 90-180s |\n\nCache timings apply to the second run with full cache hit.\n\n### Memory Requirements\n\n| Configuration | Peak Memory | Recommended RAM |\n|-|-|-|\n| Sequential | ~800MB | 2GB |\n| Promise (4 workers) | ~1.2GB | 4GB |\n| Worker (4 workers) | ~3.2GB | 8GB |\n| Auto-selection | ~1.5GB | 4GB |\n\nMemory calculation:\n- Base: ~400MB (Node.js + ts-morph)\n- Per file: ~1-2MB (AST + analysis)\n- Per worker: ~300-500MB (isolated heap)\n\n---\n\n## Links\n\n- Tools Reference: `src/tools/README.md`\n- MCP Protocol: https://modelcontextprotocol.io/\n\n---\n\n## License\n\nMIT License - See LICENSE file for details\n","readmeFilename":"README.md"}