This is page 357 of 358. Use http://codebase.md/tosin2013/mcp-adr-analysis-server?lines=true&page={x} to view the full context. # Directory Structure ``` ├── .commitlintrc.json ├── .editorconfig ├── .eslintrc.json ├── .github │ ├── AUTO-RELEASE-GUIDE.md │ ├── auto-release.config.json │ ├── dependabot.yml │ ├── release-drafter.yml │ └── workflows │ ├── ai-release-notes.yml │ ├── auto-release-on-merge.yml │ ├── build.yml │ ├── codeql-analysis.yml │ ├── dependabot-auto-release.yml │ ├── dependencies.yml │ ├── deploy-docusaurus.yml │ ├── lint.yml │ ├── publish.yml │ ├── release-drafter.yml │ ├── security-scanning.yml │ ├── test.yml │ └── update-dashboard.yml ├── .gitignore ├── .gitleaks.toml ├── .husky │ ├── pre-commit │ └── pre-push ├── .npm-cache │ ├── _cacache │ │ ├── content-v2 │ │ │ └── sha512 │ │ │ ├── 03 │ │ │ │ └── aa │ │ │ │ └── 7fa6effa7f205c0354d1cff1aa5983d58a996b7ed716da0642f6aefd9e0342280791fd7de070475740797828d5d5fb7c20209d423e4250dc81ccea572cc8 │ │ │ ├── 04 │ │ │ │ └── 72 │ │ │ │ └── 7f10aaee348a897ff41a86fc704195caca0390db9ea6c9e37f130f931dc01ae6af8f8f24d330c78d402e03670e40c1fbde96c52b03a07aecd28ca970dbcd │ │ │ ├── 05 │ │ │ │ └── 1e │ │ │ │ └── 43b4d472f80b30589102c80d7baa1503bebac267acd73827e4418e734a66fde815546e9540bf4dd6a5c8dcc2d0b088b6c800dc7781e6c739c5d89f5107a3 │ │ │ ├── 06 │ │ │ │ ├── 36 │ │ │ │ │ └── ac5238b13c5752f8d2a4ca9732c8de4f9a0f373a5b2dd3e73abc6a2fd1d8b04c4a3a9a076a551ea1c5c12016e87842b02ced173ef4ab8627d4d50a3d19ce │ │ │ │ └── ce │ │ │ │ └── 31fb3fed118c646f6e00945cceb9a34fecdd5adcad388f7f5669a78f520f94152c7b9705050d2b75271ad435ef9a02ef0076d755fb4a971560ee12af01aa │ │ │ ├── 07 │ │ │ │ └── 9c │ │ │ │ └── 64367edfde90cc006ec5f3bb7de4729249d8a6109e6623a81d91a3352eae9898510906396501c4ade6c1218f61a2a89bbd181585d158fc7f4821631e91b3 │ │ │ ├── 0a │ │ │ │ └── e5 │ │ │ │ └── 1eac2045db1c8aebb0151acc0ca1816a3be8edf3c55498ca5db667c882c91dcdb2d06b3275d5f2f7b2d3a899ac30a2eda148d0b6de8a8b7bab545b939c25 │ │ │ ├── 0c │ │ │ │ ├── 4b │ │ │ │ │ └── d5d99176af6ffadd5fad2bc850beb4766469f5d2cac76d7be24e572fecaa73c3c8d688d4ea6d58233b7218f11c6bace505f153cc410172b18618bf4619c7 │ │ │ │ └── f7 │ │ │ │ └── b9a5515a02c8a749a57a42343a81d89e7560dc4426d4ba241f41adb099657bfb10bd6c6ba5188f3e4dd466a059003da05793c0ab01b9e56362129e2278ed │ │ │ ├── 0d │ │ │ │ ├── 45 │ │ │ │ │ └── 89af7f942e9e335e6a25fd266415fdc91ac4bdfd222ff98dd1b7ddff5233e90e99250797f57abe0edcf3886d4b9427715782ab5ed90ed2ad4eb302ac24f3 │ │ │ │ ├── 6b │ │ │ │ │ └── 4980e8d959c39aa171daa68623bfec5c3d968e5d78a0d9d2773930f4d67dd7e0916e81dbf5740ca364b6e316d1866355a0a728d2f4ab857acfe89a0fbc3d │ │ │ │ ├── a8 │ │ │ │ │ └── 60c4a2eb1b2e30279d36798085e5e115a314910a1d1d21efb968601a78bfac7b2cca627390009fa368b3d36ef75f0f53bb7ab05a745704f5440c96bb70e2 │ │ │ │ └── c4 │ │ │ │ └── 630c2ba32bf90293f7147bc5f3f194a99bc992de634da6d6be8c6080e944840df92d94dbe6d7e22e67d7937036cd938d411f0a471de5be37594a0b3e333b │ │ │ ├── 0e │ │ │ │ └── 84 │ │ │ │ └── ba988a9e094e474eedc514f9cc47bab77688bad0caf4ecd3b9661705bc3adc6f0a83799741b7753ef2ac98f307f4b80126e8caa67cdd487afd1facf842d5 │ │ │ ├── 11 │ │ │ │ └── 3c │ │ │ │ └── d5f5465209faebee25f63e9010bca5a554329ecb0d2da692e3f85001c26a19be9576bd25986d6d89965521d8cf21826a95862f6846645a97866ddaebc8f7 │ │ │ ├── 13 │ │ │ │ └── fe │ │ │ │ └── 41ffc9210c7229cb80999a03c1c4ea99e9c57b3bad67b57950b352fd0d5e2c8599a3dac95f26e215279550e4c24123b4bf4164476ce6d5eea9277a2ce45e │ │ │ ├── 14 │ │ │ │ └── 98 │ │ │ │ └── 584680da89ab5f12450af072a589c9aeff7486143e75ab78ad2831a8493cac4090677ce7315391b19e113513ab2807be8c6d3d0c06d9ca26e5f2031fbde9 │ │ │ ├── 15 │ │ │ │ ├── d5 │ │ │ │ │ └── 9bc5ffd5b08ba922af15c5bede73eff1e4e91ea1fe37ecfd69c1b77566679c911d4211fb42c58b3967095cd58dcbc24f20436f4130241e1de1468365610d │ │ │ │ ├── e7 │ │ │ │ │ └── 70d1a66f921ca7a0f625039597acc080326fa7496759b7a973250ece93c4ba43e56c1e61e94569dd55127c05ed196e47cf7392d1607fb95ebcd770478b45 │ │ │ │ └── f2 │ │ │ │ └── a8e7b707e5e9518303c730748c6ee0a0140aac2c0c1c360e3a7e09c3973c78a2d38f23929df83daee2fe7aea3568f9a19705d2f5ce53d3a701c0498f3264 │ │ │ ├── 16 │ │ │ │ ├── 1f │ │ │ │ │ └── 6b18dd0ca08e191543727c554d538cbd2d4cfddeef7fd0afb22e00366f04688f133c254d43cafbcc05a6e764f060316444009bd4da38d5ceaf8bac552097 │ │ │ │ ├── 40 │ │ │ │ │ └── 4cc03faa6c641e32ed5c3879ee181eb1e32ccf8e1a3c6a9e56b5b109dbaba6860a955db85e90a5103be85910bd6f53dd9adf01f0769d0701ca80505e620e │ │ │ │ ├── 76 │ │ │ │ │ └── 62b03e9b3ac2ad016d1c2e26de5d25f280e9f820e5333eb411c7320ad87d8fd403b83797bb1f53c0ae988397e083c5a2c30338d5f551502047d079ad6620 │ │ │ │ └── 90 │ │ │ │ └── c3f63e1e16b74a41b3552260bcd4e17f30731bcbc70d5170b5b885b1514c6949190b345113994f940dd20289e16008cca66d9f36df967a08025e6ddc15d7 │ │ │ ├── 17 │ │ │ │ ├── a7 │ │ │ │ │ └── a82deef4e79206e8790cdfaf87f07ccfde91a8387651bafd6d2097ee237b48abea1f9d4c29dbfbf95578912441b579fa6312bc2cf178543fe8a663fecb7e │ │ │ │ └── e3 │ │ │ │ └── 35b4b84efa695068e5aca44f16b2d83ecfa3f0c7045df2843c21771e5b3f7691f0266a54d17f4123ae8b907a8ed0b2c10f7c29f4e41e0886cd4af5643fef │ │ │ ├── 18 │ │ │ │ ├── 17 │ │ │ │ │ └── 2c6f66933d8224db098964aaebb84a14c275ad10bda78ae0d6066b062e3f676c3acc3457d01605912d328043e2b8af2affafa904fb4205724e71d0189edd │ │ │ │ └── cc │ │ │ │ └── 46c566c580d2b56df24eb14f496c62d30cc42ea9879071b0028c9404d1cca53c7f27e7b05b92922605872b322b7e9109391143c39757ff9cee0c5ee96bd4 │ │ │ ├── 1c │ │ │ │ └── fc │ │ │ │ └── 29188ce4976f265b266a1b9da38aa0c9d76c1a3f5d4f6b5946a22c9490812e30b04fd2878afc2f3d7ac6d7af1b24cb9c1eedd7ddf14e7c9e6d128005a957 │ │ │ ├── 1d │ │ │ │ └── 38 │ │ │ │ └── 605604f39c56109b865b34b66e0bfeb2f6b04d676074fbc378d1983d84cf2c58603121897c729da17ba39321fc7831535a0670947ab1bc2b11455a98dbc8 │ │ │ ├── 1e │ │ │ │ └── 93 │ │ │ │ └── 21f3ea1a86621d3ae4b968528a63a3f2a20f8535a655fd7c893aaedbe18170b051dee7261f75b21a948e24def5369d20ea97b62c92652c787b11ac9a883c │ │ │ ├── 1f │ │ │ │ └── 1b │ │ │ │ └── e177266c2b98bff3d459b4e608fa2437800ac9b4dd6e69f1b8cde4c8435319f627ca5417a0c62131c11ab8ddab308c01bbcdded77501b31478037d52a2c4 │ │ │ ├── 20 │ │ │ │ └── de │ │ │ │ └── b0e0f4f8d27d6a4f04764ae0520cf3dd978c855f06065f84e0e7591f6e4fb14688f083a26c0ab279d66799273bce2f96abdf74c0a9d6db9b290a7443aaa6 │ │ │ ├── 21 │ │ │ │ └── c8 │ │ │ │ └── 4d7fa74de2d1e8305227ffb384f0b599d7d63aabfebb0667fabe719112ff1149b0556fd2cf27111c9f0adcc17ea2c52bda886a2898052fbb8612c57ad583 │ │ │ ├── 22 │ │ │ │ ├── 5d │ │ │ │ │ └── 3e6e813bc3f5de6d41f2063ae813e0db072391191f4a2a6213cdb47b3324386a4a4e4583ff6666e102bd031bb466981aa83a765dcb6425bda8c9d90039f6 │ │ │ │ └── df │ │ │ │ └── bd43e119bfcdc65fadc88ec5d0e51220fc5160d3683f632fbe344309e1ee65344c0125a61caa86902199070998d5fa2046a296ce310a76bda954f2ab7ecc │ │ │ ├── 23 │ │ │ │ └── 7d │ │ │ │ └── 11c9d3be6e79f63d0cedbe8db9b6cc0f1fec050637a1546b666a0914efcc8c7704f055fd76c2700e17e01e3fc4b637cc43fb950f6c686451f3f2bd3fa6c1 │ │ │ ├── 24 │ │ │ │ ├── 6e │ │ │ │ │ └── 701d2dbef953d94fc775ac26e8374d60c74e5e221e452dab052146a41e5b65eaa638e4bba6b2be1ff23951e04fd0d7e3481dc3290517fc4f227d48d0063f │ │ │ │ └── 91 │ │ │ │ └── 3565ad4d45f0f351efc14f7d18e388db111fd7528201d413f939472e5a090b71720982f2cd78636067b5fdb154787e13b0198bd5a97b086d7db432edb8c0 │ │ │ ├── 25 │ │ │ │ └── 31 │ │ │ │ └── 7df54ffa5c88c2068d30aa4539b0ad7482561edbb31146c7f0a22ab9cf338464b1d4dc0dca08c6b95ff6b37a4611089d0797023472b0174bfe5d1074f30e │ │ │ ├── 27 │ │ │ │ ├── ba │ │ │ │ │ └── 7ade1462023c35343130c355bb8b7efe07222b3963b95d0400cd9dd539c2f43cdc9bc297e657f374e73140cf043d512c84717eaddd43be2b96aa0503881f │ │ │ │ └── cc │ │ │ │ └── 7ff9f02546d7f9b76029a3c43c960234a1c7afcecf2b1219560c52a7796787359a0657587250b34bf3167b668259f47ba5b7bc63a8c09f7e808103fc5901 │ │ │ ├── 28 │ │ │ │ ├── 5a │ │ │ │ │ └── 94f127c3ab2e4cf2543dcf54148bba1a2436a0fdb2befabecbbdd43c121d33494a8b14a0f401b1362d03d6063c01f93a0b7c5039ddfe45671cbbd31e006c │ │ │ │ └── 86 │ │ │ │ └── 0b08226085f1d9c6a8d8044eeb132d0e06e4dde710874bbb47560bc22e4c7b4ad2286b1c0d5b784200b80452315f79193e306fd0c66a7fbed113105ded44 │ │ │ ├── 29 │ │ │ │ ├── af │ │ │ │ │ └── bd4ebbadbfb1bc33a593e927a2456cfbf762b9a84a881841b35ca84013ac4e58063aa4f1fc53ef48637a0232fea4a9398bb2fed787fdb0d918a091e3ccb2 │ │ │ │ └── b9 │ │ │ │ └── b63de994402dfb4aa2bebf8c8c4e7f85ef10a2d1432f36a3fcc355a9b86f1d6c7a1d23df0f9cf31de30cf4450d8a753e0592af3c5c5d2740953da44fad5d │ │ │ ├── 2b │ │ │ │ └── c4 │ │ │ │ └── 318a283459760f3737be2a0420bf3bd97864683ea1b7d5e3552be33ccd92d13186a76151c06c0426cd1a9b440c2310ccbe2812d7bdd5a1189a3054915f04 │ │ │ ├── 2f │ │ │ │ └── 43 │ │ │ │ └── aba62f2a1a9446fff35df87f74bc507ede21e7b9ed734921a634e38287518b27bad4295c15d87be28e9846412d949a15197b04bd560bf1608760afe7c6d4 │ │ │ ├── 32 │ │ │ │ ├── 42 │ │ │ │ │ └── 82c319574e0cfa085a09c77a42c27d3b18aa77ebe699caefeed8b9f656b0390dc7720999004840c14ddf31e708534102f90a261fe29ad728b72041dbf6f6 │ │ │ │ ├── 50 │ │ │ │ │ └── a0bf72bb8f50802b1bc27dcdcbb2b57cdcfc7bbb7a08fd31f5b0c86082afbed10fa778ad4970f5dd0917df0c0680c1f9ddcf6af8948357afa9178ccbe6c4 │ │ │ │ ├── 95 │ │ │ │ │ └── 043763a876d533c6f29097bd9c505ed14391221ec1af4ac546d226bd73945b5862f6088e02ec4a4f4bc513048a659e5cd988db95e7ac3e16e371cb7b72d9 │ │ │ │ └── fe │ │ │ │ └── d03dc4f0f2db74f9cdcce912a7b1e396ece6a35e14ecbb79361548bf368e5efa879c26b1794557b4796dc917d1ce9eead2d58df006ed72fa7db186976806 │ │ │ ├── 35 │ │ │ │ └── 64 │ │ │ │ └── 36ff779dce8c7028d4aa782f582b6ea57d5f3314ae9c284778255b682c3024b33a7516328f5df85e55ab35fa0239880111b0ea824e974922956f42a65f18 │ │ │ ├── 36 │ │ │ │ └── a7 │ │ │ │ └── 29fade5c4c1f018a71646605e23099e2407d0fb14b76939d455216dd7de2af738002706dae427898ffcfa1d58bfa2b36b843b943ecf415d33d2889c13432 │ │ │ ├── 37 │ │ │ │ └── e3 │ │ │ │ └── 1e5d8a2aaf7a4e827f317f244f44437b8076a42d88e1b07856193ddf58088be08900b74883c35e108a2126d9b137d1ce575f9ab416d000dc22b97fdfc152 │ │ │ ├── 38 │ │ │ │ └── e7 │ │ │ │ └── 210e087817609c84e5fde1c455aa1bf2edbdc015bfbfad05f2b309b39866a445f90c8285958df9cb5a4462adf2c47ee0f8cac556d7a797cf0b778c723328 │ │ │ ├── 39 │ │ │ │ └── b9 │ │ │ │ └── a7205e215cd83506a8671e681b0c44c5f1d2cf0a08195818e441f859a5bb3366762eaf90d49634dc0878a2e4b0b7279134c9e3bfd4b20cc87f94bc7420cb │ │ │ ├── 3a │ │ │ │ └── a9 │ │ │ │ └── 4b2189b9033e8e0452f291bf1628d8a260a95c48549720363efa716f86c7a0b0ce583f321496abdf76a10a5ae3c37b4b158a6ae3b60487d43a3f2dc91979 │ │ │ ├── 3c │ │ │ │ └── 42 │ │ │ │ └── 06098e6d4a552de7472ac8c5df0b35fea0e3ea374bee1aa5b36dc276c6f9e4ce4ab8ea83a9cfb7506930c175f2026f8375e3e1804540f0d97576378b6fce │ │ │ ├── 3d │ │ │ │ ├── 70 │ │ │ │ │ └── 9e407e6f3f59d8bf9189580edf77bce75b0d73d1eaae1ea7f0c20e364f8f0fa94d555a9a24e394123b4417de5981f73d033b4512e2756c93bb197a62d026 │ │ │ │ └── f1 │ │ │ │ └── 792d00bfabe4a782198843daef29cf196e00d6be6021d201339cc4dff8375656be6fd60ee482860da519ccbdda237852e681b925604272bb81d8d6f4257c │ │ │ ├── 3f │ │ │ │ └── e5 │ │ │ │ └── 6ed6a5dfcde7628ab987382df1286018799b4f715f60efa5fec60d850f8b58811ef57b0300df9637b02cf7ce188dfddc1e7d1a495f4c81720c22d5f5cd40 │ │ │ ├── 40 │ │ │ │ └── 6c │ │ │ │ └── 5d5813cf17bfca0a5e9bc1958f2a9dcb625db6c63d171adcb4846a4f33b0a08a831263cdf57fbfa19f97a06866a6aedab04b56eee9f213f453da1fe24f3c │ │ │ ├── 41 │ │ │ │ └── 36 │ │ │ │ └── 2e0deb12d15b6e1cd36f321f828e5289e0b26272408c500aa3944dfe8fcc3e465469c325f76a91102861736d919da3b5cd1b5b576be6d0a8813b1c85d3db │ │ │ ├── 42 │ │ │ │ └── 9f │ │ │ │ └── 166d93817be6e5829b944fe970db185e2cff2ad286ad73d5299a27a61080b11af14b6261e6f50a30559187b499466d2e80eb227789589a77fd9c5639ce88 │ │ │ ├── 43 │ │ │ │ └── 46 │ │ │ │ └── b3719a32898bc593e5539cc01a560fbb1f2e869f334b88933568e90365a6817382299f68b60d5533d4631c22fb0bb778f3473fea6ca5e4a0fa752e1a66ba │ │ │ ├── 45 │ │ │ │ └── b2 │ │ │ │ └── 514b85164059331d34f057298c4d4bfc12a6213a9f1d38ebe22e3dae82d4e25d1691412ec62c6c594cb2f58d684c7a84827f9ce671992a4e5f488987d771 │ │ │ ├── 47 │ │ │ │ └── 96 │ │ │ │ └── 71f6670946a78202c3ff887c52b9e731adf421cb47d1a5282140115de89f3a26448a89769a3059920fa60903de08c132f78ce0990db0b1eb376340ad1d6d │ │ │ ├── 4b │ │ │ │ └── b3 │ │ │ │ └── 88f6f6507f3628937e2977e64b60c8827c40969944b9fc4872e672a4c1f1af2c8c5088ebc1c912b8d3b98ae381869d5b789210d4c5ce3976fc52e02c6f36 │ │ │ ├── 4c │ │ │ │ └── 28 │ │ │ │ └── 25551b7395f7d137144c132477e831812c9a5ebac15c80c543f4f644cc02a752cd65282817e6ef41982d9883e2cbf4c8190ee80516cd5597e269e2dfcf1b │ │ │ ├── 50 │ │ │ │ └── e4 │ │ │ │ └── a1b0fc33ecdacc52a851eadd215a315dbaf3b36edbfbb680c7d7f848adf44d2030679c159dd02c094c6bd3a67815966c0609d3fdfd997fb55ac3a9cb98cd │ │ │ ├── 51 │ │ │ │ └── c5 │ │ │ │ └── 5f55f68ae127389bb5f77544a81e8a3340604415e0c2fb3568d3ab7df317bc0b31d265905e90d5c7fadbb435a947a25709fd0006a92e3a1de7fb41704833 │ │ │ ├── 52 │ │ │ │ └── a9 │ │ │ │ └── 3e82c7f2c883d4ae09b0914cd26570a6eb14a5630f94eaff12e10cd6a445b42447a99e88451a3ec2585462a33a0df5de21124cecadbcace20fc819ef6f24 │ │ │ ├── 53 │ │ │ │ ├── 1e │ │ │ │ │ └── 328065acbb673b8ac1567bc62ed5896e266a95871a8ad9c2d735003901c0b741f6c636933b7eed18f1bff3d7aa572e7171658bd685dddf84163d0cb982e9 │ │ │ │ └── 67 │ │ │ │ └── 3524cf804eb4a5a184fd2a5cb1c74ff43800a3b0b150bff1e03d9b5c17b20da7ccc388c7b4370b9f56d1a4fb68322457012d332d0f98728b420a950195db │ │ │ ├── 54 │ │ │ │ └── 76 │ │ │ │ └── f38d9361ee93db65ec9e436476815c59fa45ad7ba18f8d2784b84e42a140d509f482d9bd8985073bcb5e2dd7695ae91e0d118e2b5d51c1f9a50dfa4209c5 │ │ │ ├── 56 │ │ │ │ └── cb │ │ │ │ └── fb9056979bea6d1c3319ee2cda46c3fbd0682b5bd341346b30b7d39969504b944d123690eaf1ebbf5465f217dafb3346b32b75b2ece9585ecbb260b1731e │ │ │ ├── 58 │ │ │ │ └── 42 │ │ │ │ └── e747c96d01e41476955b36960cdedd5179094ccd826e3c32a65468132a18f093f6db9655401ad49693f38cdbc20d31d5f978e8a69476ddea6b767c28d38e │ │ │ ├── 59 │ │ │ │ ├── 01 │ │ │ │ │ └── 3c1d8e5428225103af34c913eae58ea0145d6932ee45bbf5014bef3d76912a96fcfe1006fa88d749cc57d159304cb378a7d177c01699fdac050cb048ff74 │ │ │ │ └── 8f │ │ │ │ └── f74d4304d31dca3d875147110926f5d11d5e0fc8fa14b31b596bbf25c08b7045044785dd94f713ac71a4ff6137fcb825c8023789385055121ffb16d0fc5e │ │ │ ├── 5f │ │ │ │ └── 11 │ │ │ │ └── 407da4bcd54592ed39c7394f97f3b2fb205152456ead1fd34f89b2645e365d41703af669ef2540da0d08c99e450563440dac5d917f71eae214069883e9b1 │ │ │ ├── 61 │ │ │ │ └── 3d │ │ │ │ └── 46a8f48bf24267db47637a5317eff713469fd8f70e48647bdfc504d51eb3aa6b6c8c97b8bf51f32a29153957b984c8a4eb5158095e13503d5086f0f04ba1 │ │ │ ├── 62 │ │ │ │ ├── 00 │ │ │ │ │ └── 697491cfc90d94139c7e8654977277a3cc0bc3d1bdb65363ae00ffbc3a79494fe3e358fc6d8261aa28a73e4604cceb753d80dd18ceb61cef5476593fe14c │ │ │ │ └── 5c │ │ │ │ └── 559b200fce09df6b6d7d026e684db52cfed15974235f7ee9b98206b82334f452e29f9e014f64e554b3aa61020003ec3bc31df28911e4b58c3e60efce4577 │ │ │ ├── 64 │ │ │ │ └── 19 │ │ │ │ └── a11350bd2dc3e81fd5d949dc223ed6cf1d944ec009cccbe90815056b9cc0b16380ae765cf78013a9ce29607348ce8116a24f7b0859fa4ca265b66abda8ad │ │ │ ├── 68 │ │ │ │ ├── 64 │ │ │ │ │ └── f16e96e0f3f6f925f5351d74ab6c7df05d9b8b3c970d11c65014cc4bb37a12ce0b55bba9c53e46db18652f05c523295d98c81f56c7169ba3e1c41fdb5c45 │ │ │ │ └── c5 │ │ │ │ └── 933533de497fc54cbd70cd6feb0b322bac19a5400a287def6dcf6da202936e4d5adebd8d659df4e6ff66c732eb11074d53cd8357ae000135570a67d2f1b7 │ │ │ ├── 69 │ │ │ │ └── e3 │ │ │ │ └── 661e70716e2d92b746aee950550bb25716584b94e9ef20895e3cd9e2c943400a5ce6b4050463cfe90622b78878ee7ce97003e736d3ff239e0a3bc5cae0f0 │ │ │ ├── 6a │ │ │ │ ├── 61 │ │ │ │ │ └── 84cabafdddcaf7f155acaf643b8e274cf2b3b0f6d4e3f2b3966012d50d977b74abcf00e70cd30d7e604cffd62539a3825d5075b7190dda35e960c0c092ff │ │ │ │ └── 6a │ │ │ │ └── 5357458344d33ab7d8a6c73b040d35996b0669cdf7100c5a0f6f2b6eb79633dccea6546372802233aecff1d2f8fb786751c173855c3e057ddcc36f9471da │ │ │ ├── 6c │ │ │ │ └── 1c │ │ │ │ └── b3af5f9ea75ce4e15b9b784555895e7ddafbb69471360596393a7cde859a8e3a0a2037cd3e98db42a8f9219f6824949a8ea715a03e86134a78410aaa4e5d │ │ │ ├── 6e │ │ │ │ ├── 92 │ │ │ │ │ └── 31bead3789fe943705d9f874caef524b87800fbe75e7b4373a5ce5fc515ab85d039597b970a24d00bc897e6fcce00b0ddf49a55364ca403cf6a05db2a61d │ │ │ │ └── e7 │ │ │ │ └── b01f332f60bdbd8dd7904d520b79c49a64a9edfd12568e8642179396eb467aeff1a648b06438533baa1d4f237cc536d25b6992f9790bb5bcb7daccec23e2 │ │ │ ├── 6f │ │ │ │ └── a8 │ │ │ │ └── d2bf1bd59f2a6d0222e36e458b13f94e9d1e257d3b43025f9e502ed1672f9041673ac11cc8576084eb106e3260f1736a888a1b430990f934f38597b7d105 │ │ │ ├── 70 │ │ │ │ └── f1 │ │ │ │ └── 8d93b90989f0ea548b6fee279cc7109402a57c6d1c0466f79c2f19c2e8f4579e1a83507bf35f7ef365bc35cbc4d80a80ec4f9c3b0613e85884fcee89f2fe │ │ │ ├── 72 │ │ │ │ └── a7 │ │ │ │ └── 9fb91b21d76a56c86b08a0128903d96e16ede6471080f8e459bc0e24b4b4b322e094b56571188b978a01303b9ff2c1614c67640418a5af9191b5cc33136a │ │ │ ├── 74 │ │ │ │ └── d0 │ │ │ │ └── 2fb0045ff1cb4285d2d1716050b44ab3155593ae35372fabc4d5ad65d2240e88fa417fbf25e754d5f01cce0b1b10b94de1db3ae6db536dec534b31fe7771 │ │ │ ├── 75 │ │ │ │ ├── 10 │ │ │ │ │ └── 7bf2cacdfe5ea0a96ba56a1f52af17989f179d7481b7d3e18ea8affd3a52d5c8b8371cf9ebe92a8e59358e5ca4700b6786602919e7d34db9282f4aba6038 │ │ │ │ ├── a3 │ │ │ │ │ └── a3f7440c563aba907ae0516c81759a218da2b906da1989ec63393ec9b20606733d03c27756cf1662a0525a68327d5efde0804d2937381f608cfcc872f800 │ │ │ │ └── c2 │ │ │ │ └── 855f78e7d0ca486978e2b2846f7b12095442b36aaef3dab64ac5ff8c4abf5391d9879ac5389b695c2e88eb8ff14797c9a4e55c4c99803e7ed4643ffde829 │ │ │ ├── 76 │ │ │ │ └── 12 │ │ │ │ └── 9ff74dd4fcf41963a6e834db4019d59b1bce5601b8d3ff5c58a19202ec5018d3259aa4e05056c56b0e5e7c5bcebffded55a4c341b5157831a5df74cc9214 │ │ │ ├── 77 │ │ │ │ ├── 62 │ │ │ │ │ └── 562c28af999613488a207bd32c805099aede7bd418a47161989230b59219656d3783946a99d83f2f0fc13f9496bc58659b6fb3e59bcfd725857b2091d967 │ │ │ │ └── 97 │ │ │ │ └── 4b4ed1a5c47e3b8cfe73cd5529ab55029854420395ff865b9735647a32741aa3ff3502cd830ba2df80b1bdee0aa454c8bb96de2db8f016f005b47b479357 │ │ │ ├── 78 │ │ │ │ └── c0 │ │ │ │ └── 6b11b047b69af1116cdc8c7416a1601f7402d3acda0d1bbbde0aa3dec9b8a3e7e9e626c78a8e7787d83316de4dc12ccd9b73053f7beb7a485de0d521975b │ │ │ ├── 79 │ │ │ │ ├── 7d │ │ │ │ │ └── b6e1fca9606766d0dde9da715c03323e25af187d1cfbcf8495257703bdb476d278f0aae4bbc55483ad6db2767f1381b31619e334c12071e1d137366b7b2e │ │ │ │ └── 89 │ │ │ │ └── b441606d52b0566561b4777f3a386030d7a67df793e2395a3607b6e35926c779d1a5e5ed1959aabae6438681448d7ac1080e407d2126d383f24af5d84264 │ │ │ ├── 7a │ │ │ │ └── 58 │ │ │ │ └── dc8040e5127b3fec05c5a2c0792bfda708ce0fec540f90673f0d62f2e6b985116bd96b21ab8a4d5df7f4086399c9e1ff58b15bc1900ea42691e7f6b21275 │ │ │ ├── 7b │ │ │ │ ├── 0a │ │ │ │ │ └── d74434c0a805e5925eadfdf91758d021157f48f8290a970eb38c4c24f3a4523cac19af7c69051b28eb9e5aa9869fc2d9dba472e3eada05ce677ac5d569b5 │ │ │ │ └── 82 │ │ │ │ └── 092aa37cb3662a311779faa568fb5378b34db475209553248505bbac1d4bffff9f78e6a241a159fde805f205a1d1a978290d0783e32a55f8cf71a357e93f │ │ │ ├── 7c │ │ │ │ └── 95 │ │ │ │ └── e3148786596741652419f62b7050f594580fe637e4bd092b38980d4dd6846c59e026e8229584e8b17770b35ad310916bed3729e9d0fc0db589153a3e0b29 │ │ │ ├── 7d │ │ │ │ ├── 3a │ │ │ │ │ └── fed3ed3b4eb6ed9e6214fac0edb28d53c3f3a08072b0fbb5f07feb16409c5e200137afaff9f0ab664666d2288c52c18936c0f3f1be80ece3d7bab2b1ae1e │ │ │ │ └── ea │ │ │ │ └── bdbede422630fa52908016aa17d4f671f25457aa01d2536ea80bfb35a8e4181420bdef7176655b118af4cf701de6cabce22e2129e1876139552b6a053339 │ │ │ ├── 7e │ │ │ │ └── c7 │ │ │ │ └── eb3b433157ae199e8cbcfe5d6f5488e31dadbd499cb2a8f8100708620dc696f3025cd96dd7595386c78337a09067bffcdd519208a75803792f7c1b33fc36 │ │ │ ├── 7f │ │ │ │ ├── 24 │ │ │ │ │ └── 088460e1cdf73da4ada41fa3e5f5ce010c919f3243ea932220603b61c8d628360df0561a0930c875f564b8529ff528c3c556936c4f6ab75a65e7d8dd66ea │ │ │ │ ├── 41 │ │ │ │ │ └── 45a4875c1e09fccdc3d26dfd5d45ebf0b74e3b60c9da889337bb6c3645ec2b07e7e86ffcde3d972b3b24282cc30eeda04875d2dc40810ae5d62390b9c6ad │ │ │ │ └── 72 │ │ │ │ └── 9d5113edc958d59fe45617ba62bafb6c0cfc8e074e5fd0fd94df0768ab589726b5d3dcbf315addd14f7e6f4fd37eb139796bf15d7b27a9d3fb25c6f152bb │ │ │ ├── 80 │ │ │ │ ├── 13 │ │ │ │ │ └── b20a2571ad76a461bb0810cfc3ee5ab35d5d27837b68b7ebba141ab227d0aebc3009ab0f979b11f9f2919bfa1980466cecf60f5319d18e8c6672ee5ce16e │ │ │ │ └── e2 │ │ │ │ └── 879241f4307f0e5a82afac4d57ac9a294e7152edd7234c37cce8e9991e85f545996c735b8d146092668b171ca3639638f4b661454f0a895195085cf04fde │ │ │ ├── 81 │ │ │ │ └── 34 │ │ │ │ └── 2159872524c81acd6fe2bfecfa09ae0309057356f3cd16746072e23309de6079f18391e5b666a924ddbd1848ec65924e38b515318909593644389af6a8f2 │ │ │ ├── 82 │ │ │ │ └── 06 │ │ │ │ └── 35fc6a4769192719292c0abf2b072d271c2aff9c6977daed1b00ca945ca4350ec4f88cd6d5c213ac83647a105b42f59605fcd1826144b5ee690a06d17cc6 │ │ │ ├── 84 │ │ │ │ ├── 79 │ │ │ │ │ └── 4d3a41a02d827d4087dcd49a2f9328190acc7549f0033f7d81c2886e36003dbaa4254da63c5adca84d9b69b4fdcc27aaa8ed08d91be06ec61f2855ed6a8b │ │ │ │ └── b1 │ │ │ │ └── c971ecc90c5fac945891d7d8677fa7178bf6fccc23b853378d0d5209bb8150d0c7e968a5095df5ad6049e82a07d6bdc52cd310f81f211930b9c3e66c742a │ │ │ ├── 87 │ │ │ │ ├── 51 │ │ │ │ │ └── c8274b42245cfba0f50963b50f4e0c1822647ef67eac0b1f19aef5f2be17651e402f82b24cde8aeddfb34c58b02a07ba6605fbc37f987cd1a4c706c553ed │ │ │ │ └── 71 │ │ │ │ └── 5b8ac6b69ca18fc42a66f3d1e4df79412ec9da181bdcb50a2968148e5bfb88b3a1537b5013c809ca149af356cf6fa4676c4deef7585dd5e2522c93819a73 │ │ │ ├── 89 │ │ │ │ └── 83 │ │ │ │ └── 4ecc75316bff72be6a6ff571991467ee0999b790cdc344e13b9b699401301382e6f36f484e96b62191c8600c9ef62a15d3f2f7c2800e1b6ffef0db64cf8e │ │ │ ├── 8a │ │ │ │ ├── 4d │ │ │ │ │ └── d9802f5d63f95855533ef8e212b1a6037a0d6d6f456d3f9b8bde8ba1d64a0639a50c0cfa5b1487a2e099058a659414f9fdd2c6cc34c5d000854e96760a24 │ │ │ │ └── 97 │ │ │ │ └── 1f9c6fe9e382d2b35525df2f2f42927626596f77609512fff85ab306c45b554a1645809137769b0f9d225c5dd00ecbfb1208bb9417a6fe6eed3f8ee575d8 │ │ │ ├── 8b │ │ │ │ └── 24 │ │ │ │ └── 57649cc4cc2d8bfaf6bf56dd7d3ee5000820cbdc9b7a9a8699063ff5b0cc59d283f106057e573a80b237c49f1f7316aad99a7fa500c3467d74720661b904 │ │ │ ├── 8c │ │ │ │ └── 28 │ │ │ │ └── bf40a50cdabd49bb96b727ae131f60394a9280821d0ba649f2a9d4389ba0c2574c49d871b5c40451c0d18f41f8b548b74b599d4e273e85e0e30104d88624 │ │ │ ├── 8d │ │ │ │ └── 02 │ │ │ │ └── f79519e871a16dbb7574d094e8633ff8424356b30c628c368254d6518914cedc74032ec76ed59b66214bd5e323e9fabbd69b98f4cb44c6fd2eb572e8a34e │ │ │ ├── 8f │ │ │ │ ├── 45 │ │ │ │ │ └── bda0c24c37e625fa1587c9283016b66e926b7cd38cd4f86790f318b07d951687a9f63eb43e5f07d589e09df82b387ee6d19016db83ecd7126329377eef45 │ │ │ │ └── 77 │ │ │ │ └── d52e0bd3a39dbb6a7c98c893864d825b1bebe79d062f1349b99a691cd532be9f1029a6408b3082f4699e1d6e55423681928619be933138654ca4068320e2 │ │ │ ├── 90 │ │ │ │ ├── 0e │ │ │ │ │ └── 56428355a38b7d94dc769103450b129e065e486db48d065d4cfed2e4c3d5829fe871341016e5087c81d86ceb70899e18c9db3416168a8f24fdac2b5015e4 │ │ │ │ └── 69 │ │ │ │ └── 067a0608750b0e6f85e3b1f33deeb5ec887681c1ca3e84523aea83b8b3d2d4f8f2c00b9a09ee485d395171921b2695ba54a8302f5f0d750a5b973fe8e41e │ │ │ ├── 91 │ │ │ │ └── 11 │ │ │ │ └── 91670ddb2e5148483060c13480d5330114de89e865837ae6e60c4dc017edfec972fc8535aff2be6b90b6ea6176384633e4fc4cc79c2948df341fd5c1661c │ │ │ ├── 92 │ │ │ │ └── bd │ │ │ │ └── 17dbee98cbfbc9ccb60950f09911cf127d071ffb508e16802a6ae266ef8ba6421b5af4cee53491cfed0412def92f7062d051b5a9333c2b5d8c2b633b4728 │ │ │ ├── 94 │ │ │ │ └── 6e │ │ │ │ └── ccd41785b69a3cbe6733bab9c3cb8311092f5d44d32d9d86157b712c156f3dc877209bed0d1511c6d366687506a1b17ccd1f1fb86fac924ce266825906fe │ │ │ ├── 95 │ │ │ │ ├── 88 │ │ │ │ │ └── 86f66880d649a434abc280f67605abbb47711d06bfdea32cea11a9429704d0564033bbe4f9d5c883412b9525389f7f29fc9865f553762c9f263680b74248 │ │ │ │ └── cf │ │ │ │ └── da6a19feb78fd2595fea726ba6623ca62ec59f37710b869995b9416382c391aeeb993d54b0010af2abe1c71af3bf488d8a557dba6f1f849fece133c83c85 │ │ │ ├── 97 │ │ │ │ ├── 2b │ │ │ │ │ └── b13c6aff59f86b95e9b608bfd472751cd7372a280226043cee918ed8e45ff242235d928ebe7d12debe5c351e03324b0edfeb5d54218e34f04b71452a0add │ │ │ │ └── 9b │ │ │ │ └── 930ca6e7be7018e79ca9e2f88256e0094e45700f6042e4f4b7be887dc897ddb413ed3d5f1c7cab977e75d565d9d5a36a2335aab01309f3246a780e66ba06 │ │ │ ├── 98 │ │ │ │ ├── 9a │ │ │ │ │ └── 68e84545cf186953b6927c75871a5e5f661d07ef805b585fa7c3a0c5be109626fd58145345d8bb858e94e1b66b59937dc1c3d4eb628c1c660dea5c352de7 │ │ │ │ └── ac │ │ │ │ └── 864ad4b45e218c1f4de4d9f3b6c472c17387abd03684f2342e86b2ad5e72f68852c8c6e8ecce321554dbbecfb4675963f590d69a590ed55a1a6caef56aed │ │ │ ├── 99 │ │ │ │ └── 98 │ │ │ │ └── 448f12378f9292ce130fc418d98bbf63a156f6d27e8eed850861153c0edcb5e811bad603432cc61b4f94549f2d43e8c48367de701b7ae30eca763af6018a │ │ │ ├── 9b │ │ │ │ ├── 3e │ │ │ │ │ └── f67c86d00bc662f0c2cbed99d6642875488172be12158566b611303af794512f2efbf85a10234e59382d58b563f336d50407396c650a1f409d4af467e88e │ │ │ │ ├── d6 │ │ │ │ │ └── 15ca4945a64c3bf495423b7131b87e3a97bee25d335e002733b2994ad038333639a7227df838fbdbb1c2c77dc3c1de199a53731445c081b4fd0c6973eade │ │ │ │ └── d8 │ │ │ │ └── 13c11921cb696f08f7ba409a787771b54d81141e7fc5cc952dabd3231f8e9a9f5c0953e19da060b954ba1ff115fc16dfc3969b21029921b300cb6731c871 │ │ │ ├── a0 │ │ │ │ └── a9 │ │ │ │ └── db845c91217a54b9ecfc881326c846b89db8f820e432ba173fc32f6463bfd654f73020ef5503aebc3eef1190eefed06efa48b44e7b2c3d0a9434eb58b898 │ │ │ ├── a1 │ │ │ │ └── 16 │ │ │ │ └── 42c6790ed2f6bb0d8a2fa3d42ec39ae52b1f8c51fd99266c3eb50ad3f93da11c955666ddd334a871eb7e5d32df2d95fe4b411dc952edc2ec440075d2e4c7 │ │ │ ├── a2 │ │ │ │ └── 81 │ │ │ │ └── e7e49fbe8656a387fddebf50395ed76f90be5bde0d8da3e071dbaffa84d3fe80032b33ce9dc72a6feccd310b2b6c0ff2cb4e3b96afa5f64be198029a2977 │ │ │ ├── a3 │ │ │ │ └── 07 │ │ │ │ └── a03949db85191d4909f468f63cea33e3f1165e5851039ea92a6fdfe71c1a212684a0e979a2c59001a5d077f9627e64ac9808c3c23101d3e903dd678b2360 │ │ │ ├── a4 │ │ │ │ ├── c8 │ │ │ │ │ └── 4e7c50cf8aff6de638c85e41e8b169a44b241bbec80454d933d044476ee2e1d93ffb8f832aaa9cf9db715ef0c558f3d282e9287f41f4b6b0cf928e014373 │ │ │ │ └── d8 │ │ │ │ └── d31dae18a09757cdcfbf9ddfbba4eb2ced665dbc390b2319d6d3458cfe3931794c1bd7d09c8fd0990c0a836ac2b52e4c7a32da40824f2c2e9ad2828e9633 │ │ │ ├── a5 │ │ │ │ └── d9 │ │ │ │ └── d16d0e1c40b653ae71d75bbe980854d13737e87032bb5a41cab0335e2c19e80fdd1b630c2916090388deafd50c7901422926898f1dc9ee2272e2f790c246 │ │ │ ├── a6 │ │ │ │ ├── 45 │ │ │ │ │ └── 2e8a52ed9bc6f424126dd4d7da19cb119632aed03ca6dd744311f5edcc3b07a99242b1ac823c861dbc4ccb33ef1cc3f1b4a158438644851d2e6cc467b931 │ │ │ │ └── 5b │ │ │ │ └── f44a23e04004f4fcb8c2d0c986b28a3fb1da52e95e13a4e500c4ee09dc39ef9cb2da2279cd87d8625354a51a00a3b11bf49cdf53bd7f69591a959d91fd93 │ │ │ ├── a7 │ │ │ │ ├── 32 │ │ │ │ │ └── 6ad76b4469a221aa36f3a42baffceca9258fc13dabcea1f9be75b69bf8c1cb6a3cb6efbfb594b9ba245706805e5eb2427a9aab868ab857636183ffcbbc52 │ │ │ │ ├── 7f │ │ │ │ │ └── 3b7e7150102a863fe3f0c7edf01b5ebed441e1c485f1b97a3ac58ab37da80e535b9cde6231a3b7f09c4b2f1b566035d0610bfe0557ac9ae62216f1c01a50 │ │ │ │ └── d8 │ │ │ │ └── ff298663e8ee2d918a19a0a00435a7537ce757a337e6dd8597e213c9e56d4ce61b5be30c4b719c5054fed981c51f78a88f5389a1922dab4dcf5248e83c4c │ │ │ ├── aa │ │ │ │ └── 90 │ │ │ │ └── 80bd197db2db8e1ef78ab27ec79dc251befe74d6a21a70acd094effe2f0c5cf7ed2adb02f2bf80dfbedf34fc33e7da9a8e06c25d0e2a205c647df8ebf047 │ │ │ ├── ab │ │ │ │ ├── 20 │ │ │ │ │ └── 87e36d5840f4b65850f10e37ed7dcd5947958a433573aaca789fd3369108553a8fc1c9a845a143497e5e7c90e70419f43fffbc1e1530e19beb2cf0473183 │ │ │ │ └── 90 │ │ │ │ └── a0dc68efd52e822d9d3b85754d0fdfcbf354308c8deba163bd0d9a25aa2ff3ffa91a4f516c78729887b3f82207b16c569db31b0fcfda64172e02808adf01 │ │ │ ├── ac │ │ │ │ ├── 1c │ │ │ │ │ └── 7865a5ac22a0bb027fcfbce2f71d4397d8847e951d782302ffd6e7dc65b329403a8408bddfe2410655ebc3a9e60ba4322b2930e6d32a039078654b548e94 │ │ │ │ ├── 51 │ │ │ │ │ └── e187fe9d41cda368bfed295f36e4ae7ad00117f4fd4cabc1ae41877ea3efc3cb5e620033fcab4d2b81c9906697165c165c9eb06d09c3f255e6bb627c3839 │ │ │ │ └── d5 │ │ │ │ └── 1ada8215399d75d02c07b0f09d6312f36af582cf44d1c5602926e26a7c8ec08371d2d44f9d457f4118c891f13f54ee29cc1f09f193c8a7148fddf9901d61 │ │ │ ├── ad │ │ │ │ └── 48 │ │ │ │ └── d0a32ede8194fd5d855704ad637bd724067369eeacd164e84b431e51704a767421a55e8fa6bfabdfec09b82e29847050492086734867e04ea73d402acf4b │ │ │ ├── af │ │ │ │ └── 39 │ │ │ │ └── 5d2143741ba08238f96ddff36759c58c63b72cb2ace9b9d61da859fad9b26bb3996e4ff4755f8d512979dae21b107a1b67fbf120fa53187890dd08590d35 │ │ │ ├── b0 │ │ │ │ ├── 69 │ │ │ │ │ └── ef6f9766ac968a119f8b0c8a60baf757ddb0e5125966bf8fc2950f5ac1c98266b971e63432c8c58533990123e13234e0830e22a4f22974cdeb97dd9960ff │ │ │ │ ├── c0 │ │ │ │ │ └── 6287fba94763d8f3bc9319dc82b1dcedef258efaf60c010e7ed197574d26380855104a640b6e1789895d846c1f52d4eb20267e7c0f1fc6687bdb0502bf99 │ │ │ │ ├── c4 │ │ │ │ │ └── 86eae8813cc26b7dfb5c095299e8d9b392c4d3b26e95a0736a0e93e14e5a532b33da47ecb9f8c6756f22a21ea62399d17e15f3c3819ecaa7043faa2e8914 │ │ │ │ └── da │ │ │ │ └── 8dedbdab711791e11403743c443259923b3cfd3c763ac2b6dac038489319c7af46f4e0247e6e42be79aea56dc8e06bb9181ea26bdf8bfe4ff5e3ceb61c32 │ │ │ ├── b3 │ │ │ │ ├── 1a │ │ │ │ │ └── 7f56449634bc6e62aad466db2af6562e57fda7258e005182788e3cd7642e657eb8cc865a4aaa3e607779c9076547a315a3328ee124b9c3d889af9f2a814b │ │ │ │ ├── dc │ │ │ │ │ └── 2c7145ba3c560a768d1533825be8d86c4f0afbf5ab6f4e664f0cd18f995a035188194d8495b01f2313f3cfdabbe528a40ef97c4127901e9e647b28e19f5a │ │ │ │ └── eb │ │ │ │ └── 39f998983a92db61bac89488a0adce33ed82cc1956815b337a97ee86515ad142f4d3d45ad1e332c7c5713591623b4b4017b0fd21eaaabe2843c2c69fbeb9 │ │ │ ├── b4 │ │ │ │ └── fb │ │ │ │ └── 863930d065d0bb76f5651b3768e84387f4152d72303c3bd9761825cfa8c81d4e2c9c938025b8679f319c4b8d611f9626ba4d029f8475dc6ff586fe5979fd │ │ │ ├── b5 │ │ │ │ ├── 37 │ │ │ │ │ └── cf317838766ab773d9617270de8511dd367bf7467f2b2288457a4bda388fdd00f3b1dc6a77e57848299423f08c9195f61ce16ae9d89f77798b9bc8cc57dd │ │ │ │ └── 8e │ │ │ │ └── ec56dd722fda33231be66ed379aad987da4ad770109f8c488280a18baae9c91ef82f646d8f725da843791b7190116f50461077642f371818ef329d59627a │ │ │ ├── b6 │ │ │ │ ├── 3c │ │ │ │ │ └── 0ce5ec4c83a046448fa43664e7b4db2f7594b55fc045612ead9c9da1747d2457133afde559db1cbe16a4ad496bd89ad7c53032c8c6eae8ac7c0329f0f3e5 │ │ │ │ └── 47 │ │ │ │ └── c51185189afee296af509cd342d0b1db64f8e4429ebd9b6a73eb6e59d67b5aa459b73c785beab5152061562876c7b4f09cfd2d913c0d1fa4e78814d23d63 │ │ │ ├── b7 │ │ │ │ ├── 63 │ │ │ │ │ └── 839645c14329fb8e497a4cd6b0fccb55115bc819e9490c21b8d4e92afcac14b090704385d566c1c055490ae2606fddec22012dcf1ae516b98d81a0ae1953 │ │ │ │ └── 85 │ │ │ │ └── 3df3088c6764797e7a179e32a80030fa7cbf022fef63c8c7f3ec5a65aa06d7ca593d705bde0d7b806cf0f7f944fdb66541229b42fe8d10525f7d39c896ce │ │ │ ├── b8 │ │ │ │ └── 24 │ │ │ │ └── 3c28a65d120aeac2fb2d4de11c5f6593118bb868cbc14a7c4c3c8c10a707a0d9b55ff09e592f29a2f3f2075cf6d3db5a2a9d1edbf4e9dce27ae4e5b903a1 │ │ │ ├── b9 │ │ │ │ └── e1 │ │ │ │ └── 1ea67ba3a6a79eda8e5a2189ef1d4e82d00e3630d76c2037aacb907276b92e0b947566e5059e6dbb11e1491a8107250827dee95e46f9935da2607d76ede2 │ │ │ ├── bb │ │ │ │ └── cc │ │ │ │ └── 7c0db6fc0e8b37e0cecdf29e1ee0017ef818b50fe96af9d9110af2e2e50b9bfdd23be59ed84c85c17b30382db2084a5cbe11c9f4e5f7687f3670ab23afa6 │ │ │ ├── bc │ │ │ │ └── 5b │ │ │ │ └── f1455b099cabb9d8a6727135517bc28c43a223700d02c2cea588290de796c471d64d7cc6c97b7b6483d75b3fc88fedce342dbef7bafbcd492b7596a3134a │ │ │ ├── be │ │ │ │ └── 60 │ │ │ │ └── c3d7e8b035532cd971773988d125be5d9f3a7a698705b0a413fd08f7a91ae9efbbfab450561406f519cbe50fd85e2505f8be0a06dad1cc9e82b0c5a61a1e │ │ │ ├── bf │ │ │ │ └── 18 │ │ │ │ └── 54cb827c9727b28a71fb033975a5d778dc6261647fed3f6c1e37c4e7b506e5398f80d176d3f03264d7fa023ee38eca0fc96bbe7bac6d028077160bc39f30 │ │ │ ├── c0 │ │ │ │ ├── 0c │ │ │ │ │ └── 6be3097ad962bee4229c4963415041ba3e48c57906c8c41a44937e26387be6882937d0d4ecc066ddbb4d152f7b2470c4b1448494dbb0a965e9876f6159f1 │ │ │ │ ├── 16 │ │ │ │ │ └── e9bfe3507ed1c3746f3a41cd292325e4e48477b4cf157749d62ca0dc5fc9cd9f89d714e170b0abaac36a2403fd43fe6a5a0249aeca776b3c94d80cd66d17 │ │ │ │ └── 1f │ │ │ │ └── 0e75de3b862a4efcce4709d870b00fe43a864938289e23df5d43fe767ff3b8e2581e0eaa4feccf7d226fea861e9fa9f59a0e0470e42d2929412aaca5ae8a │ │ │ ├── c1 │ │ │ │ ├── 2f │ │ │ │ │ └── a1020252851d0a844bcf240adfb8f54dd7e1f3d6dd18ea7e632eb1906e46f8bab80f13fd11bdefb590c075bffa16807826e1621c57e8bb176a53563fb689 │ │ │ │ └── ae │ │ │ │ └── d88f25067cd667808fefb4ad141c037e9600c2c413c2ca55571a9d33bb9f45cf96a21ad3576aadc3848a2fd3adcca2b07e55fb9f2e1dc9945d8a7532b7c6 │ │ │ ├── c5 │ │ │ │ ├── 23 │ │ │ │ │ └── 32519743bdedde63440ebffface305fc949686914dfcc2075cb850df6d2d7e4880f9d2c802eb2a8dc6d157eb74cb4442d5b2280cc8b486369e7e83e7d1bc │ │ │ │ └── b6 │ │ │ │ └── c21f9742614e53f0b704861ba1ec727cf075ee5b7aac237634cce64529f6441dca5688753f271ce4eb6f41aec69bfe63221d0b62f7030ffbce3944f7b756 │ │ │ ├── c6 │ │ │ │ └── 4a │ │ │ │ └── 67867eda208dceb36587eb399998dfd962207f9a25345a6c58e4d905c66c7330b2808b28d74afa4d79e91cf4d17769eb04d23d57f905b347b51db9143e02 │ │ │ ├── c7 │ │ │ │ ├── 94 │ │ │ │ │ └── 4bf58da9e7e4a1dc3dfc161f62fe243964af9ee31b9745dfe919b3380f5ded828fcc1b06edb5493c7a6cad72bd58633058b3e6a99d49e00431587e98cfb9 │ │ │ │ └── 9c │ │ │ │ └── 4fab30e96ea730f3dd6b17884ae570f6a995a64029b6f853539b45c9fb64aa09540c15d496b4035a767b9b922f6c61c05ad88cba5a2e82f1cfa0a26c605a │ │ │ ├── c9 │ │ │ │ ├── 0f │ │ │ │ │ └── 42a371464ab760d591f588236bbdb498921141ee5849b2f5dfe4ce0e73fcdf4490c75edbfc83d0ca321b2b502c8ec705d8e66dc9414c5792531d550ebe2d │ │ │ │ └── b0 │ │ │ │ └── 7244d7a1418095d97556fee24a89d1a3715b1b33d5845c4d53389f9dbcc6f9de8e2f983971f95732a5a2b90f1bd0d170d34359cf7dd294eb7a72f30a3002 │ │ │ ├── ca │ │ │ │ ├── 87 │ │ │ │ │ └── 4a20524d4b42f751277b655d217ceeb1056a3c4319403050c7c8ff0667257b3a951e95ddd1ce7934cf7d1593e4af44057aa38fdfc44c54b3b33453189c66 │ │ │ │ ├── 97 │ │ │ │ │ └── 66254fd36c16f2d83c626eebfb64b5b706cd5012633b9c78c400d7e88492ef1345d5ba38ac9f5a8f25c67183ea83b9cb2bf9b3fa7cb0f5acf4b702127b11 │ │ │ │ ├── c4 │ │ │ │ │ └── fc9a1762c562ba1f0de2d55d80791a99e567d78351b8de6aa86253369dceb7f3c16ae63717cabe6646ca9588bc7f18961da0bd1b7d70fc9e617e667fc8a3 │ │ │ │ ├── d4 │ │ │ │ │ └── 080544005e733d3410ee04a580ae76e113c7c96cf6c46ef911e81db70436e4c5e31aeee0c4390aa643707d5df971f8f640d2b3cbbe2d6ba72d998a391b9d │ │ │ │ └── ee │ │ │ │ └── 294450a70a4b84bf3b89e152404c8f083f74a4ba786211b0155a743137bbf8eae432a8c53c73d6901f31714e573a3eade2972c4440e3a31bf1c8e3cbd1eb │ │ │ ├── cb │ │ │ │ └── 86 │ │ │ │ └── 2d309376a857f6fcfc38277e510b28f343876db7c89627103f93c9e61d4b32837103654fad9dfc59b28e3c41256aa36b70d43f5ca9e1d686c000cb8d04f3 │ │ │ ├── cd │ │ │ │ └── b0 │ │ │ │ └── 7dac22404f5adb8e25436f686a2851cd60bc60b64f0d511c59dc86700f717a36dc5b5d94029e74a2d4b931f880e885d3e5169db6db05402c885e64941212 │ │ │ ├── cf │ │ │ │ └── 87 │ │ │ │ └── aa26f7e236714c1c822f5cfdc2639ef2d9626ce60dafdd7d339bd984264ae436fe2b0f1bbeb20f4987c1245f27aa06407b48e71ba28f5d315aa1cab00222 │ │ │ ├── d0 │ │ │ │ └── d2 │ │ │ │ └── 50e0b14552e5a413b3b17f486d04a4baccb9248c11fe84cd6e93b360ef4e51791f26fee7a576ecb50c1a343f20573ca567040e9806553de0c0465eb4810b │ │ │ ├── d1 │ │ │ │ └── 1f │ │ │ │ └── 629116faebc1c1ed00f14f5be4a6e501b6a739dd8c80c0cc0679414a4688d8fcd58abdd67ef5462d45f1a686a35b4644d256931b9b28578a9145bf671bfc │ │ │ ├── d2 │ │ │ │ └── b1 │ │ │ │ └── 60fd18f643ad8d0a6eb68d9c34417edadeccfa402414d0ba5974dac95fc6f2446686553a9bad6f630282001f2310aac369799f356204a2cceb79597ab43f │ │ │ ├── d3 │ │ │ │ └── 40 │ │ │ │ └── 2ad23a9449077c89d8b4bbd6bf341d1ea1cf3711c191c9e4bb1f529d607c1f16c85709b8afcbcf0beb01181c36cd694b424413bfb590016508a7b4c3b0d2 │ │ │ ├── d5 │ │ │ │ └── 41 │ │ │ │ └── 16457ea39ce036cb81f959ccd9e3880e3a34c49a5aafd6e356e0600910ee7e6dab82061bfcb2763ae48c39fd5392fe084a37d82bd8a8e72cac6bb2fa0c57 │ │ │ ├── d9 │ │ │ │ └── d1 │ │ │ │ └── df4e80a3fe9cdc6b60a4ef6e0e6792f4115aebdde1d136c1bf6f7c5024b036859a55092f7d6cb017fa19b52075c3127cd4e9bcb9cffe4c218efde3f6bc35 │ │ │ ├── dc │ │ │ │ ├── 17 │ │ │ │ │ └── a5b7ab5d73c6cf800b5b72676d349962ad5a139846f97b6802f783e7930116f6323a0801d47a81bce6d8d63f95aabaa7dabe832d330886e0ff76e9928ab9 │ │ │ │ ├── d6 │ │ │ │ │ └── 84b678e2efff1539dd12f7425ef76630d3778113ad0ec39e45589e122824507d3a7094f30c0542a0834a23f485fdd982d6bb91213f5ace9f249af4b49c6c │ │ │ │ └── e4 │ │ │ │ └── b3dd369c516cb85ad397577f03820c31a2a24ae3e78390d325e59fcc2596a850f68fe3ff657fcd715cc7b523645e4c0a6dbdead95296cf638c16c16c8be6 │ │ │ ├── df │ │ │ │ └── b6 │ │ │ │ └── 709849a279c02c19b1b4bdb6a81743d23ca14c40b8bdadcd835424e4c0b6afdfccc3f9421aa8be1837a5e111d4d5533ded5d7cf3f22830beb9a31bd60bfd │ │ │ ├── e0 │ │ │ │ ├── 95 │ │ │ │ │ └── faac46ad404be59a053cd30672abd453f7a1d925af3cabc869d2905df8badccde0c8e28eae03633ebafc678151e8e0886bf2e89b5f11fafbbd3384016b57 │ │ │ │ └── a5 │ │ │ │ └── adbacd54192a2fe66c7b8f4ab78998b920ad0f70a69c47dd0de48302d7e4d32f017f420d92a8080765b0e0ed11759d04da6c85f6e30d6f992c8e0ff3a427 │ │ │ ├── e1 │ │ │ │ └── 71 │ │ │ │ └── f77479e68534ec1a2b93d8fc47c7a1399a534f50e98fda4e5c47d2d7210a51a869c271f2732f74df3aba4c3cbc0a5e2d47cc03390b056afb8d95767b0a3c │ │ │ ├── e2 │ │ │ │ └── c4 │ │ │ │ └── e4fe3527435943bfd91bc759cde394aca00a43c56f218ca2ca7079c787d9df45510df525beca552336f5420cfef8c523690fcbf9a7a349c955ad6587cf58 │ │ │ ├── e6 │ │ │ │ ├── 31 │ │ │ │ │ └── c208522e3a132e9adde8101848478efcfdbd9d9dedef1a3498f8528e2e3bd63e9b03c11b1b689f80ef79cc3007e9d8113692b75d99b6cc8fd4fc524f3f15 │ │ │ │ └── 6e │ │ │ │ └── 2740aa7ead945bd3d2cd1f9f463380714e1f76e75ff295b2886e97bb4e91b17c9fbd92fe812e42c15c88e3b296e06e720136a948db7b519d3593d2c9d423 │ │ │ ├── e7 │ │ │ │ ├── c4 │ │ │ │ │ └── bd403a86d17c76ed8c0f4adf5f2718af8d8978df6602c1f0cc7d9fbbd5102a52b65e7fb2eb2906772c72cec024b814b341a653f9df7671f3de5278e087bc │ │ │ │ └── c9 │ │ │ │ └── 66c4a480e013722f3f871cc53394e129834f4557e7afe9931edef262860771ce073067c5681043e600b0991bd2e6a9f56834c30aa6db48613546eae0d8ec │ │ │ ├── ea │ │ │ │ └── 6a │ │ │ │ └── e08b4fd9ee6e6504f13f3cdc682341d990770d134d9cb9eea062db05dbdeedec59beac621234d04aec080e7ecc761a0cb5ba6fb176d12a4c594e1affe34d │ │ │ ├── eb │ │ │ │ └── fb │ │ │ │ └── f002c3c2e7371e2c96b7c632a51ed57545731aaaf1d2a2f7e4e81436dbbe703688886d65cad4a0e67a70677a5dd18e30f11710b5405773110be17ec09295 │ │ │ ├── ec │ │ │ │ └── 0e │ │ │ │ └── 92f634a09bf4beecc76d34349bf8853ce7dbd0a89fd002d71841c7c50ba5bc452e08c4864395d2d1d31a82159e830b2ad02e32cfb31b5335c8798d503894 │ │ │ ├── ee │ │ │ │ └── 49 │ │ │ │ └── 3ab8e198f724a0085b11b91a655b3be3884c2e946f3bea97e78d0c6a681240714969dcdd72aceb7b61030166cc6fa29f911b0e7421e8623ee1acfbba21fb │ │ │ ├── ef │ │ │ │ ├── 17 │ │ │ │ │ └── 5c6ad83bfd4fbbf94772a23db3a1db48f47fc8228a6aa3e60e21c64eab59c9c1758167da7cc62bb99655e57a40db66471aefd6bf7e8cc46105c8038b16e8 │ │ │ │ └── 20 │ │ │ │ └── 10a43d94309ccb8b50eabfba856273db68fc7b65f14ae8f888c50e0f7e418fc8dca5d94831f9afee994a2798aaa384ce039df6ccbdd5faa2d5eaf37b2841 │ │ │ ├── f0 │ │ │ │ └── e4 │ │ │ │ └── a5493e3c7cf613ac0c16fb8ab8e0f240eec72decd3f67282dbb7528a041e4f509299294bd218553aa13f8255c4410e359acc0da417ab748ddb7f9e84870c │ │ │ ├── f3 │ │ │ │ └── 3f │ │ │ │ └── 5f545883735913820f7b9388c4bb8f5506d3a5342991621e9eb2d29c70ead7e24ed11fd239488463723f922bd375fd8cb1aeaf5d0118c7475cb516a11090 │ │ │ ├── f5 │ │ │ │ └── 3f │ │ │ │ └── 548d6debd145b973543b193c25969b57c21bd8984cc587331f67d1fb1505adfae65e3e364f8c13ff5b5644c99d6dc065a89b9ff9e9317894f72a8e70c772 │ │ │ ├── f6 │ │ │ │ └── bf │ │ │ │ └── b28bdfa6814df700a723e886d3f684423bbf16ae24a3eadfdc17c0d605927d68e18f393103bdd503cf51702a29bb4175b0987aad7479d125f840c441b8e9 │ │ │ ├── f8 │ │ │ │ └── 6d │ │ │ │ └── ad94b9e6993772c5d9a05196731ca28aab1cec43bc63c70e16720eeb8905183896317bf54f03b08ead598d1c8574e8fd07f97f2344e801d4d99bb9997ac1 │ │ │ ├── fb │ │ │ │ └── 07 │ │ │ │ └── 5b4f51db21cf13bb2531a41b5bb56490f2bdef064219525582fbc6edb0ace29922fb8613e7bf811cccabea9bf8bf817f3504b3cad598254fc5d28abfb7e4 │ │ │ ├── fc │ │ │ │ └── cc │ │ │ │ └── 2b4a058cdaf75b3dad8ffb7f2072d0d69160ad6b6cdddabfd348d4defb96799baa61adc2ad9c254944e9c3286516534e61c34ffd2bc242537aa40b056d5a │ │ │ ├── fe │ │ │ │ ├── 32 │ │ │ │ │ └── 99a0ca70d05f06470978fde2d138f03771f717b4b0293f44332e6513fc7b8f0995b207b218f59acc78ac363bf9c522a3d00773d533d6989b4177d760170d │ │ │ │ ├── 37 │ │ │ │ │ └── c4c0d0dd41504236f8e41a2b7887aa4c3b3abc6c7928a6ae39f1d3edda5323c7e781414a2164d1bd03b0ed3bf3b9ba449bc6e68d1973231e2720c32eab41 │ │ │ │ └── b1 │ │ │ │ └── 5e0a934941b852663195c0ef51155df13ea6e71114bc326210cc2b43ff397a82926e57f6cc2ee37dda81b717b77ca031071d1aee8d25cd52bf1fa639ed2b │ │ │ └── ff │ │ │ └── 2e │ │ │ └── ed24a00b559d653f3799641f636279adacbeddd0ddb3928ae28b96bbafb7611e4588b8b4f36696733092cad5d9984605ff34273889aad33b717b052d9cfc │ │ └── index-v5 │ │ ├── 00 │ │ │ ├── b0 │ │ │ │ └── a5285b1dd41927c25a437d6e06e180ad401616f52c278cd64474969fb3e1 │ │ │ └── df │ │ │ └── 216782e75230fb7e8d7057093e134da919f2d56aa9db5f6f7258b3b537d3 │ │ ├── 01 │ │ │ ├── 3c │ │ │ │ └── 9305c09d5789a41fefc7aa0cd3a8a3813243d247f506487c2f66e9ff5971 │ │ │ ├── 85 │ │ │ │ └── ac002ce9e68821cd39a876c92f3e1be8caeddcf6419d6bc324f70d32b4e9 │ │ │ └── a9 │ │ │ └── b0d0d67beda769e84926f207549943c0bc17abbf66bc20099aaa1bb51736 │ │ ├── 02 │ │ │ └── 3d │ │ │ └── 7ff49953c213d0e9070efaadaaf3c5ec6740893a6f3704b4f14e805bcfa2 │ │ ├── 03 │ │ │ └── 48 │ │ │ └── 75977735688016c583178c5e6055c5d811bf783ee09da9fe4b1137891c98 │ │ ├── 04 │ │ │ └── bb │ │ │ └── e70e70e0cbc9b00841927b0c23c58d97f21063208f3e872c3e04db58c13b │ │ ├── 06 │ │ │ ├── 5a │ │ │ │ └── 98f8c4232b39b6ac68023a0bc186c128dffdec812a144648c26dac71f91a │ │ │ └── 5e │ │ │ └── 2009163f0b101c063269056e566eec4bbc4ec9c8e69f769867337a8ed57b │ │ ├── 07 │ │ │ └── 2f │ │ │ └── c26409f0f3f5f0a9723c9865acfaf682ce8a5f593e491d912d58f53f9ae7 │ │ ├── 08 │ │ │ └── b9 │ │ │ └── 8c0c17709bc08fb63e5f0c39c65b93c80c9663f548e949eb55cb434a357a │ │ ├── 09 │ │ │ └── 8b │ │ │ └── 0ac0d0ead7b0eee61d826bc69cca1c7d40e187e8282c876253d740b9e9f0 │ │ ├── 0a │ │ │ ├── 08 │ │ │ │ └── 7555feef8088d2832129af7ce022f6637283712a9ecd731e4a9ef4932c14 │ │ │ ├── 2c │ │ │ │ └── 10ae97cc0ddca9e23bc5e1c1a10c38f60b99fa734eb5749276bb78987586 │ │ │ └── a2 │ │ │ └── 6a45098c63203072b3c3abfd9346c85ac9bc463e9506bc2bdf17478905a3 │ │ ├── 0d │ │ │ └── b3 │ │ │ └── 097d1aa2272aa0a4559d84bc3e8aa1b5438104f60d0a303dd8cf4a4919e2 │ │ ├── 0f │ │ │ └── f7 │ │ │ └── ef3ad5111001a610f814d854d1ce9853e9d6d710a41430d086d07a0986cb │ │ ├── 10 │ │ │ └── 17 │ │ │ └── fba3d249f38fffb6e9b99fc904d81622ca3edbd864d546795aece3329bb4 │ │ ├── 11 │ │ │ ├── 42 │ │ │ │ └── 63f22fbcf0c21b1e268e7098ba936a48f7ddd6c06761a6c5b4a5fe434ebf │ │ │ └── d4 │ │ │ └── 2f9f9df8a204a306e5baed8f658a43e437792315d561c5eb0315c7a97d50 │ │ ├── 16 │ │ │ └── cb │ │ │ └── 5a69d7ce799d5fc7d26a2056473c94a7bb373b72395bb56a9b740dffd152 │ │ ├── 1c │ │ │ └── 65 │ │ │ └── 74c26755259935f238329c24af2f3305f57b1107f720cc0082e513d83ebb │ │ ├── 1d │ │ │ └── 59 │ │ │ └── c56cdb49f40694dc6b984bd43ff53d96f6ea1dbb06ee467a00e4a697e664 │ │ ├── 1f │ │ │ └── 85 │ │ │ └── 3e0b21cc5deb10a0dc51ed6dace9f5ae0f08f66b5c064b262517165cfa2f │ │ ├── 27 │ │ │ └── ef │ │ │ └── 452a94b385f28d524a6fd9178863fe32cc70bc3d94033a3dda9c91b2e128 │ │ ├── 2b │ │ │ ├── 0f │ │ │ │ └── b8787add1f0675f7298f5d4e498f1c0091c7438fd73df02d649bbcc9c1ce │ │ │ └── 2e │ │ │ └── aa61c0bc2734278e23d60eeeab1fd752744ea5536b3ba08b35b3a667d229 │ │ ├── 2d │ │ │ ├── 80 │ │ │ │ └── b5e9ca2e40744e7fa089861626d2a29c62363c01729964f4cf0c3e8ee632 │ │ │ └── f4 │ │ │ └── 9196d70f82f15d107105ed433fd462721c91b1594984d87b54d57730cb20 │ │ ├── 2e │ │ │ └── 5e │ │ │ └── 52bb770674006416c55571d38721a1575036bc260e9debd40db850bc0b20 │ │ ├── 2f │ │ │ └── 2c │ │ │ └── 2a12420aab34889ed2c64b80f9b722e2e90e139a130f13e34a1c7a0e1e29 │ │ ├── 31 │ │ │ ├── 7a │ │ │ │ └── 9c96d52885c2170f2365ba2c1bb1035008b9daa92b20f4c5e52f16b85113 │ │ │ └── ca │ │ │ └── a8c3ab0670811a3887ede187dcd3856d14272349a18f6844f7c8007cc05e │ │ ├── 33 │ │ │ ├── 19 │ │ │ │ └── a311e591a2b51610ed276fe9968065a74c2f19efd7f917616967040ce127 │ │ │ └── f9 │ │ │ └── 071d7d949ade71febc395082397753f9a225031462df3ac9c8ff4104bbad │ │ ├── 34 │ │ │ ├── 05 │ │ │ │ └── 127f37b0ff3cd9c76b1497b5838d265a8a2b7ef495b7f9841f5d4665ba67 │ │ │ └── 9e │ │ │ └── 35f5913aa7a542b3357025e12a2a126c13ab15a9bfbb40721b56f89ecb48 │ │ ├── 35 │ │ │ ├── 45 │ │ │ │ └── acc6960018d880bf033f23b050a6c442be8b02eb6cd96e01c7ef7b61b640 │ │ │ └── fd │ │ │ └── 45154839db33174def1653b1ca377b1d2a65a4c4e56564fe11d85b67a96e │ │ ├── 38 │ │ │ ├── 04 │ │ │ │ └── a49ce7d19c6d98ec2d5f259e71f17a5727961200c4cf22a88e33ff7bbe5c │ │ │ └── 36 │ │ │ └── 08fcd3ee98bd9b00bb28cc7d417209f374feb4bb23f9093fdab5ff57857b │ │ ├── 3a │ │ │ ├── 10 │ │ │ │ └── 33ebb16ca229c4cbdad65ac0947fbeb3765befe98674faa960578851637f │ │ │ ├── 21 │ │ │ │ └── 946df9356ae372c19a7700e322d8d0276a406143c7375ce22124fad7dfcd │ │ │ └── 46 │ │ │ └── 4a802da9ee2134f8f76df15df8ddd2d0f2b05e7de9b1d7e01669c4278824 │ │ ├── 3c │ │ │ └── f6 │ │ │ └── 26a7f7dccb969c764b8bdecb3667023c64bc1159e674fbeeca633c54964c │ │ ├── 3d │ │ │ └── 2f │ │ │ └── f8441bbef005e18fb70c8e8654894abf17ac44b2140cfd60f172246d894f │ │ ├── 3e │ │ │ └── 49 │ │ │ └── fc9a5a5b33508297834c9a4acf4d4de5b46348df8093fa7d0a6f82aba3d5 │ │ ├── 3f │ │ │ ├── 3a │ │ │ │ └── 2f0714110028b8f228c7c95100ea873c5a00ea03a97ed1d1f555cd404e1f │ │ │ └── 55 │ │ │ └── a551d4620944369d858a04648adf3994a33934840d738144392e51784ac1 │ │ ├── 40 │ │ │ ├── 17 │ │ │ │ └── 8828f1bc3c004a75e5f93ab594b7418ca18ac8660a28916cc6e51643994d │ │ │ └── 1e │ │ │ └── 89f0b89d2ca92cd54ff481086fdd599c67170ea69eb9b22d37e34638d25e │ │ ├── 42 │ │ │ └── 8b │ │ │ └── c02d827ace565a38508b184eec46432a592ba2550cdb1930cd90b866d766 │ │ ├── 43 │ │ │ ├── 5f │ │ │ │ └── 110819c5903563df1824b2214749ef7781289e80d4a600347e3901aac1c4 │ │ │ └── b0 │ │ │ └── 1da35d6e384e0146648258aa5ea61333fd10d6d00300adf4aac974f6d1e2 │ │ ├── 44 │ │ │ └── 10 │ │ │ └── 7cf4f1b3974687000c3e81a7b9d017adb6b8416e32f27309b764b12b8be5 │ │ ├── 45 │ │ │ └── 2e │ │ │ └── 93eac58d3d5aa3f5721ac09fa7c3b814ccb98bc5000550243f4497f78a67 │ │ ├── 46 │ │ │ └── 98 │ │ │ └── 3144eac06844196da14c933cccc766b529c8917a7efc1c6c79bba5651a6e │ │ ├── 47 │ │ │ └── 12 │ │ │ └── 2b0123c780f4536fbd0b803d54bb573a256230046b95fd342da9df92dc8d │ │ ├── 48 │ │ │ ├── 7f │ │ │ │ └── 4f4a841cc66ee33998620da1f4f341e422d9ebb37bb00178f3707927db1b │ │ │ ├── ae │ │ │ │ ├── 1499701156e55c38f37c319e42d8ee632f62ee16e676fb96bf268dc03e39 │ │ │ │ └── f6dae96ac72c3518cd54e6a1cf5ac3bc59c80cfdc62d65a101a0cb67304a │ │ │ └── dd │ │ │ └── 8c8b3dd9e0048fc9974197e48fdfa5ceb084560780473574323b9bfdebd4 │ │ ├── 4e │ │ │ ├── 45 │ │ │ │ └── 17bdb2bc7c0f1b72ba954a40424fb4a9ef5929f88e922704c80b3d264ccc │ │ │ └── be │ │ │ └── da18b216664b1e58df4ffd6782d77f3c28a3f61355544535ff7704cc1b2d │ │ ├── 50 │ │ │ ├── 85 │ │ │ │ └── a29f2ec233233dedaf6d110ada83bf22af3e52848fda04a91b64f889f53a │ │ │ └── bb │ │ │ └── 1a5b513e51544ef3ffcb8dade26b2fd155f2f50104e8ac073030a9d119ee │ │ ├── 51 │ │ │ └── 89 │ │ │ └── 3d02d342de41905761accac02260bce79c49652be9e6066da254d77ba04d │ │ ├── 52 │ │ │ ├── 20 │ │ │ │ └── 702ec5d12a1e111e2534ce89eb0f33f79fe3ffee0e80a428299cdaa0d007 │ │ │ ├── a2 │ │ │ │ └── ba77c6a126c66982a48c1fb49ac1ca7f841619a89a1f0fc5de3512a4b7f0 │ │ │ └── bd │ │ │ └── 1b45d5168ed8296f6d5d5167fe2f8076e2cd5e5d67d2766935784d3e798d │ │ ├── 53 │ │ │ └── e1 │ │ │ └── 0dc9829fd62522b01d70c6eff1025e862877619ba63ab3f1445df0451b8c │ │ ├── 56 │ │ │ ├── 4b │ │ │ │ └── 859813b09e1e5020654bf65fb2f19970c51f08f788d3c4f2ea5137051e1e │ │ │ ├── 71 │ │ │ │ └── fa4fe23b6bc134c60d26da3033c87003fb50204af907f8ec32c9a7c9e48c │ │ │ └── 9b │ │ │ └── 5bc545281ee1f49775ff8b0f2921a08251d503d559ff3f999be9886f1712 │ │ ├── 57 │ │ │ └── b7 │ │ │ └── 2772f8c4daa4b31074e03545f8e473b547e88ef3141501fe2a54e1abdfc4 │ │ ├── 58 │ │ │ ├── 92 │ │ │ │ └── 5799a11997482f78a71307f2134a84b508b74d7faa3535d40d26c6261638 │ │ │ └── f0 │ │ │ └── 4fe556f104b09be642895a82afa463fe560d9a0dc8f507efeef825a6905e │ │ ├── 5b │ │ │ └── 42 │ │ │ └── b4487d788874a06f49235360174f1ba8832e8f6a83cb8533883b8fa09f4b │ │ ├── 5d │ │ │ ├── 58 │ │ │ │ └── 39fdc57612a04067ef7ec1c141646752e6563b84430cd56ba1df2434de91 │ │ │ └── ad │ │ │ └── 1cb61ae613816d5f049cd87dd24009e364126f73726b1f8eab2350fec505 │ │ ├── 60 │ │ │ └── df │ │ │ └── 89f1345cb5849d888a2cce2e6d6ddc0014eb3d6722956a06241f6e7f3d58 │ │ ├── 63 │ │ │ └── d3 │ │ │ └── bb861348e4b5fc53b62454cd498b01af8a51c93c0ebb3f9ca712ca253566 │ │ ├── 69 │ │ │ ├── 33 │ │ │ │ └── b968e19e42cda755b43c4bd1e354056b2be0e8ff44896e82e4bc9fdb6322 │ │ │ ├── 7f │ │ │ │ └── ee4d73554ca4b3320cb01b422b9a9d45f388513d8fd2ccf4df9187578ce1 │ │ │ └── 97 │ │ │ └── dc07bc0d29ed2880b0e39905e8bc8a24a0344155c90a7ca65c8093d51295 │ │ ├── 6a │ │ │ ├── 86 │ │ │ │ └── 14653864a77b7c8644710834018401ea9fd5653744bbbea2201a6af48a9f │ │ │ └── a7 │ │ │ └── 23f89bea37ae703ce622e7188ccb889113f1d355f754c11544a1caec4cc6 │ │ ├── 6d │ │ │ ├── 40 │ │ │ │ └── 0b02ee474cc305b6d0da00248cfa61780731440b4f237c6251314258b9bd │ │ │ ├── 61 │ │ │ │ └── c9e7e8446341cea439547eb023fbf47c954ba932e6944a3fd50413c1e861 │ │ │ └── 65 │ │ │ └── 05c74d488e52e860b9de3668e482a62f5796264d2bf9f2700cf9423add5e │ │ ├── 6e │ │ │ └── 9e │ │ │ └── 2004cc0984629401a6a3d3fa16900d49ac70112df7a8c515ec028b34c59d │ │ ├── 6f │ │ │ └── 9f │ │ │ └── 4244544732d3e784c8fd360e0ea256a943488c53a834da3d0ddf3e83af9b │ │ ├── 73 │ │ │ ├── c1 │ │ │ │ └── d8bbb109a8fa2903d912518bf54776b7794c8f6f0a759234283c3c2eefab │ │ │ └── e2 │ │ │ └── 434e6cce71a37629e1945f6d35d5e52c1e34aa88ef24d1915846c72775f1 │ │ ├── 77 │ │ │ ├── 59 │ │ │ │ └── 986079464467eb2c4f1c178bf1c9fa9179b3c8384bd1eff68534419250ea │ │ │ └── d8 │ │ │ └── 4c73393b4c86b064a434ecae7c4c202784cc49493fdc99469a7dc797494b │ │ ├── 79 │ │ │ └── 0e │ │ │ └── e6e294a39cc9407b6358b7284df63feda5d4f96e51519630d06219175167 │ │ ├── 7a │ │ │ ├── 05 │ │ │ │ └── 8c39e8b9b5af7db5ea9983334f3ee2532aae9b7973de1dbb581781947ed3 │ │ │ ├── 1d │ │ │ │ └── aa5b15d3f974ebd32c44778518e0984265598aa1e2dddc4ded4feb2a11b1 │ │ │ └── 23 │ │ │ └── df8deeb6de869825106ce68786ba9e16686f20a8b4f1c626c9635a5bc8da │ │ ├── 7b │ │ │ └── 1d │ │ │ └── 314b6515b77b62a66c8a2ac140ac4a6926135c5866837fddded37acb1acf │ │ ├── 7c │ │ │ ├── 20 │ │ │ │ └── cba9852dc5e0811d9e6e24e74108bf7727a0c2730516ec8f41a08f13116b │ │ │ └── 9a │ │ │ └── 13a1f5cfe2738ebf2558b3fc8173e47bffd478a46c35ee5e0fc6e72e511d │ │ ├── 7d │ │ │ └── e8 │ │ │ └── 5446c5cdae0493e4ad3b10347b77c8df4b17b5fbe14834f5c6b06faa9f95 │ │ ├── 7f │ │ │ ├── d5 │ │ │ │ └── 36068d8df17b31ccdbeedbb62ae94e354f6d768324e0dd6578917b8ecc16 │ │ │ └── f6 │ │ │ └── 5e3925b158405271b2f44be4d1ecbb5c60b3b7da87819ce03956b759b051 │ │ ├── 83 │ │ │ └── ef │ │ │ └── aff47278d7ef72e864717a2bb5e09eca947c1b761d2a3f590af1b5f1b379 │ │ ├── 85 │ │ │ ├── 20 │ │ │ │ └── 71a0d0584d5ae3631b6b48b18785908616327f10115d683585b05072ca1b │ │ │ ├── d3 │ │ │ │ └── 1b45f9b1e17b38c211d236888c737ca95cd5b9ca0e42c51cff12aece643f │ │ │ └── d8 │ │ │ └── 7da2d1eaa517a5e80f7a1a8d7dee184babfd49523097c7b2ea907d755944 │ │ ├── 86 │ │ │ └── df │ │ │ └── f30ac40daf6afa3c806cd525ffbf33eaad06c5f38e08f7ce9428a303241e │ │ ├── 87 │ │ │ └── eb │ │ │ └── ab402da37b8ea447b0cac7c54cf3452aae056ac8c63514cb6730629409a8 │ │ ├── 89 │ │ │ ├── 0b │ │ │ │ └── e2ba88ed525834b932f3ddb5624a540e279742a3c6851ec4ee466890a5ed │ │ │ ├── 0c │ │ │ │ └── 98d70e9e25b9a23c255f11b8acd5d9ebed836d0004871577846f3bc3f03f │ │ │ ├── 39 │ │ │ │ └── d7518a088b510f892a8355a21e2971328f68a8ef26d1962bbcfc70c84725 │ │ │ └── 58 │ │ │ └── 62a9a2b49fd26f8d788adbe5cc377e776463c3a01839945896d96fa48d4f │ │ ├── 8a │ │ │ ├── e9 │ │ │ │ └── f78a927b119d27ece8b731dfde1470b48159f26c89ce35d5fe0fc80122ed │ │ │ └── ea │ │ │ └── a9d2d6ff75cba71d63171f51aa258a77d99513740280af3884c1dea1f7cd │ │ ├── 8b │ │ │ ├── 4c │ │ │ │ └── 6c0c483d470762dc61c704d8d07e1edd6421400f274c32ea22f543bfdb16 │ │ │ ├── d9 │ │ │ │ └── 617f84454e0342f885f6cbdd2661990c9060f183e29553e39e0506dbd847 │ │ │ └── ee │ │ │ └── c2ea22c4bf9c5ddcd0333850e543442de3364478847c7ebc382b1ff3a70d │ │ ├── 8c │ │ │ └── 9a │ │ │ └── e014072a08e7ba0b90a6897c5737bc438be37650b0470bfd7c0b83e18e23 │ │ ├── 8e │ │ │ ├── 58 │ │ │ │ └── 1ce1355f39c75fa063f8dc1c958c11d57446438253b206afc18efb9f28c9 │ │ │ └── ff │ │ │ └── fc9a834a298aa364d38f286bfc395217fe0559c9b322231ff5f6265ba504 │ │ ├── 91 │ │ │ └── 08 │ │ │ └── 56fc6b8aa67287e6e60a90a5e8bd6500ef9e97a317a38b324cca616a7d25 │ │ ├── 93 │ │ │ └── 31 │ │ │ └── 9f96e29572a9b3bd880f19dde2e443b99ec81a4258f3e56ce1c4fff64852 │ │ ├── 94 │ │ │ ├── 07 │ │ │ │ └── a7c22ba183764c0c27f706d74812444c27c14a97fc43669b7dd7c32a717f │ │ │ └── 49 │ │ │ └── 0c8e6bfaa289aa93424dc1f6f28b3decc9f59cb08be977c3040f7d244ac3 │ │ ├── 96 │ │ │ ├── 7c │ │ │ │ └── 454eb1ff3ec3546d35165170f771ff1c65f055203c5ab9f907e6af7067a8 │ │ │ └── c5 │ │ │ └── cfd4f290453cd7201716a3217433fe76e994d06ad3a598a6ab5772d5280f │ │ ├── 98 │ │ │ └── fe │ │ │ └── c68a85433f7c743aa9b9427fb21be6fd8c25f9e7893bd5cf65537496008d │ │ ├── 9a │ │ │ ├── 76 │ │ │ │ └── 06192603daebdeebec6ad6e070357bb297b864354a3998c359fa50ad570b │ │ │ └── bc │ │ │ └── 143ae50ba22ddec235347ed6a62762b673eddb52cb1939aea401679de36b │ │ ├── 9d │ │ │ └── 0d │ │ │ └── cb301e666cb1b3f23405c9a023a97e35e0b646458b0dc07d4e4c45f072d2 │ │ ├── 9e │ │ │ └── 24 │ │ │ └── 74490f75d8dec7ba5051c2fb1e3119fa15abb79366ea7664e5fbb2977153 │ │ ├── 9f │ │ │ └── 43 │ │ │ └── 3636172cbc03abf2262c921f9f71572e6b049aa3db8c65d166bcfe5aca5f │ │ ├── a1 │ │ │ └── 78 │ │ │ └── ee48142ac207e21a1a2eac9ca7111587ce699eebdc565abb3dfe976abf96 │ │ ├── a2 │ │ │ ├── 60 │ │ │ │ └── ea4e9555df962e8a55d27858ec6e935db7b0356b46d10718029046780c27 │ │ │ ├── 68 │ │ │ │ └── b7b4c1f69b4b4ff6c19e7de1b75dfa3eefbab3d36b6ce4ef15d6f64afb9c │ │ │ └── b5 │ │ │ └── f2c35332a5ab256ee9271034e3b3b301ece6931e6e92531ca0bd8c08fe9a │ │ ├── a3 │ │ │ └── 50 │ │ │ └── b739b1f6f936987c26973cec93f36482ed240ab90158c0d04899bab0de13 │ │ ├── a4 │ │ │ └── b7 │ │ │ └── a7cebac941d6c47ac2f6fde93c17edf93f4ae4aa6b051499d8f2ffeab614 │ │ ├── a5 │ │ │ ├── 87 │ │ │ │ └── bc838260e09216f01f45e48f0f96cb7691d978001a792540928b1153baa5 │ │ │ └── b8 │ │ │ └── 454c882933ab15d532e2493b0bd7ce7019f1caca2abb46f076ca0855330b │ │ ├── a6 │ │ │ └── 54 │ │ │ └── c1733144b73a0422b1daf6390b4562d52ec887d209b643d8b0b789a2e4b1 │ │ ├── a7 │ │ │ └── 04 │ │ │ └── d0646f5e87aed79d9f0ad28e40eff59b4872fd92336c436b29f7280a9d3a │ │ ├── a9 │ │ │ ├── 92 │ │ │ │ └── c230215c94371d341f1b38927e5f481994a870132101fd50efb0449f27c2 │ │ │ └── f7 │ │ │ └── 4c2a9fe6575921726a5579be73ddb2a3e8a7abbbb66a28c50ca8deaeccc5 │ │ ├── aa │ │ │ └── cb │ │ │ └── eb7e78deaaf4e5eba36039b514bbe6541a5e440f56bda5447a6a0c81f2aa │ │ ├── ab │ │ │ └── f0 │ │ │ └── 041961d523d853b40e4e55be33fe676651a97b630d01af1b06b28abc5697 │ │ ├── ac │ │ │ ├── 5d │ │ │ │ └── bac3965880e0e18bc7d1e21519c9073430f53c69821d54a4aeb5c313357f │ │ │ └── 86 │ │ │ └── c0732592365d753d382502d91754a3c88f8b20e22cc25a0327beb9429687 │ │ ├── ad │ │ │ ├── 5c │ │ │ │ └── 217f4a9502eed2896935b005b187e4713d93ba3dc76eff284b00a1a8b92a │ │ │ └── 7c │ │ │ └── cc598261aa7c1f089fdcd0478664f8f5c80f8f02f241f08e3be264a9e616 │ │ ├── ae │ │ │ └── 78 │ │ │ └── cedd14d309b153583ec33b511626642a5b2cecfae082a664e1e6a368bc97 │ │ ├── af │ │ │ └── 8a │ │ │ └── d90cfcd33a9895fbbb880406407aee65cd5b37556b94baafb95ba5cb93dd │ │ ├── b0 │ │ │ └── 4a │ │ │ └── c18a99a2710b49b5a3a1121226be4940f623f8ba056f8108a634ed347da9 │ │ ├── b1 │ │ │ ├── 4a │ │ │ │ └── 6796e751962cdc0f1d356f7c34ae7e66a41858d769156329b5bd4379d591 │ │ │ └── 8f │ │ │ └── 5767f914aa664f32503df614481bac973784e2bcd2b8af02e84faabe168d │ │ ├── b2 │ │ │ └── 53 │ │ │ └── a51760f3239bd143eb2f11ec8f083702e47b0ca67ac04a9a45e7336f6cde │ │ ├── b3 │ │ │ └── 63 │ │ │ └── f693e1cbbd8c651339dc83ea677e236d61935b81de6396cb4847fd5b08e4 │ │ ├── b4 │ │ │ └── d4 │ │ │ └── aa802aaebfa5cce97b6f2e688062d965ef9940c20866c45eb34a72b47d05 │ │ ├── b7 │ │ │ ├── 38 │ │ │ │ └── 992d3e6c01fc9098d137f7dbccfcaa5f5124ba9c487e582e6e0d83f99d30 │ │ │ └── fe │ │ │ └── e66fb9a38a1ef7da481d041bc0dd117c0c2bddfa61bcf516da1e1486c290 │ │ ├── bd │ │ │ └── e8 │ │ │ └── 7741857e809594830141a639d3d54110945a88bb85691de2f9dc97402c84 │ │ ├── be │ │ │ ├── a3 │ │ │ │ └── c0779c8e0be92c748c91a7dad4e6f0fe57ba0158b6bb1bcfddd8fc56c934 │ │ │ └── f0 │ │ │ └── 1030b67d1c2d501a0e14ff9aea82addbf8b2e760ef58a5be510d7b4bad3c │ │ ├── bf │ │ │ ├── 03 │ │ │ │ └── d5dd5fa44593b3e2d24e270c89a4ebe5809a69837946acbe11b5f9ab29d0 │ │ │ └── 7c │ │ │ └── 375aec77f76404d91225e72006a0105b2a6ec04bb02cfa365ebcd4a0232b │ │ ├── c0 │ │ │ └── 83 │ │ │ └── 1295af917239a2fbe94404f49d472949b2a2519701a35e8dc9841f02ae34 │ │ ├── c1 │ │ │ ├── 3e │ │ │ │ └── 4c4d082623156529b4fa73601a4ac92e33a6b20f963f1096cee31b6d9010 │ │ │ └── 8c │ │ │ └── e4e9afe177a9d6771d71fe96d51887f262a8fede9d9d3e06ca7ddcf20990 │ │ ├── c2 │ │ │ └── d9 │ │ │ └── 7fb959fc2a833b8e68b8306a1b7d4cd5f15c8b4e0c9d6b46a6765796482e │ │ ├── c3 │ │ │ └── c6 │ │ │ └── be9e8d92e3e1f8898fedbe33cae4e67f0352de1b0d48fee9cb29ecc1d6ab │ │ ├── c4 │ │ │ ├── 11 │ │ │ │ └── bf2dd5bf2d9b9006f82aeedaffc7f69ad64358a9a08afe81cbcdca1766f2 │ │ │ ├── 68 │ │ │ │ └── b71baf5025326649162df1bd325b5637dd1e72f59a32177b49318d5efeac │ │ │ ├── ac │ │ │ │ └── 4511be3eecea50ee9cadc09a612f9be8598d7b29d5c8b1253c75fa283cc5 │ │ │ └── ca │ │ │ └── df46b5b6c6148487b1afb20084da52f2838a08143f9b0ebd217d2a229e9a │ │ ├── ca │ │ │ ├── 98 │ │ │ │ └── 29ae16b7b413d7a609c6beba2ab22ac51a8f88aa3c3a36759292907ce3ac │ │ │ └── f8 │ │ │ └── 5fdf8973f1896e77c07a4919f6166c6a04ef8354c5efb0156670a06d24e3 │ │ ├── cb │ │ │ └── c7 │ │ │ └── 8dc870ee1a760dfda5ed1c13aec5056dae100cec5c9af892474d802a65b0 │ │ ├── cc │ │ │ ├── 25 │ │ │ │ └── 0a0ad2d0308b6807a70e488194992de068d68b749910eee4847c38629984 │ │ │ ├── 60 │ │ │ │ └── ca5eb4c028e64ab99a3a71e5e6cff685d49a0052a23f473310db7d984f23 │ │ │ └── fb │ │ │ └── 96cd6e2c34dfd1fc2a68d5b85c353ec81fec75a8e0856070c12777141d13 │ │ ├── d0 │ │ │ ├── 12 │ │ │ │ └── 0e893a332c0e07c4e6ad382322604cf61f86ba7822a3e02b24d4105846cb │ │ │ ├── 39 │ │ │ │ └── f3ea46b7a48d1b108681523c9e802f48f2779894068bc9b984863ca18939 │ │ │ ├── 57 │ │ │ │ └── 3aa5d94761ad382e1a1acc61203736494009e20422bce1dd1433666dd012 │ │ │ └── f3 │ │ │ └── 570007f66e0a594c21201eb3e8f15d7a4d92bcb97b59246e5b7194b3b290 │ │ ├── d1 │ │ │ ├── 34 │ │ │ │ └── dd11aca2ddd3aeb854849cd81cab78174fc5ea935c0fd552de94684f90a8 │ │ │ ├── 3b │ │ │ │ └── 5d145862c809774efedb998cae0b11c4062b94265112f8db93a55edb929e │ │ │ └── 91 │ │ │ └── 1ea8e1c5735aa7333775abaea09cba50e98296556053fba7d4dd227c6732 │ │ ├── d2 │ │ │ ├── 3c │ │ │ │ └── 9b2e81a9ef349bd31c3c94f1c2d4040643ee96b8128c972db597415d555c │ │ │ └── 53 │ │ │ └── 0423c306fc66318eb336eeb4033781a7b495f0aa3ba92eec00f34069f13e │ │ ├── d4 │ │ │ ├── 42 │ │ │ │ └── dcecd9ea33544599eb1e71ac0fd23e843f4caf0dd35ae634e5a1e2bca450 │ │ │ ├── 8f │ │ │ │ └── 715a86aa779da41ab634b8f3191069d4b2966a3c5b47cb739ab6a9b93aec │ │ │ └── a2 │ │ │ └── 61ef4c73c2a4a1a021b2b9d9d54cd0acbea9f5e44cebff230278f27bd92a │ │ ├── d5 │ │ │ └── f4 │ │ │ └── 0913a74f5e223a4fe6108493dd3b03c2d47259df459926160659513c9ad3 │ │ ├── d6 │ │ │ ├── 3c │ │ │ │ └── 3fd6a899c59ae533d9a5bb44570ada1eddb5802483d3e7812df2c207a7e1 │ │ │ ├── 47 │ │ │ │ └── 2d4e4b363564f0b3d6e59012bb07573fb947a866841f5259a96439aa3964 │ │ │ └── 4d │ │ │ └── 95351bd7b1c4630fa6590049d83b56ced950f5f2fd281f27e28527249cee │ │ ├── d7 │ │ │ └── 98 │ │ │ └── 895bffa858148e74eb0bae5ede536d11e4eb6ba643223069874bea4f6498 │ │ ├── d8 │ │ │ ├── 62 │ │ │ │ └── fa9d7982c1af34cc1664c1504cdcf5728bee5cbfba341507a5c033098737 │ │ │ └── f2 │ │ │ └── dfd78c09b8752f2fd7100ea4a9f64cec29a053d57d72983420eb853b3e6a │ │ ├── dc │ │ │ ├── 47 │ │ │ │ └── 9e3985de44e70129e4e28c25bdc69a204acabcbdd5962cf5109db4ca7aa5 │ │ │ └── 8a │ │ │ └── 4dc2a1bdf5b195e99648a945ce742de5f6d0b1aac410a6fe3e7155933cc7 │ │ ├── e1 │ │ │ └── 53 │ │ │ └── 4da55a553f57b5ef4eb84d567d8d4fbd67732c8c090da290c199e0ac2ed4 │ │ ├── e3 │ │ │ └── c5 │ │ │ └── ad2fd86fe0c1b9f233d92c25e56b1a582b8425b52db4767f8d72410c021f │ │ ├── e4 │ │ │ └── f2 │ │ │ └── 0b57f65571788559ed93ba6d26cacaac21da8e4adfe374787669e431e875 │ │ ├── e6 │ │ │ ├── 37 │ │ │ │ └── c9e69f5074e9a22c766ffcc622280d4e580d2ee0238f670f28199487dd44 │ │ │ └── f1 │ │ │ └── aa87087a727f6fb26b60b78c06c2b830f509c809c7b1752ab1bcab0a15af │ │ ├── e7 │ │ │ ├── 40 │ │ │ │ └── 70186a6ceaad19b6b11ac1bccf00fa5e038b8151d455127f9868f0051d57 │ │ │ ├── 6f │ │ │ │ └── 6df2d13a4e315af18cce3e1c8a09c911262fc54f57e6fc47d361ddcf408d │ │ │ ├── 9e │ │ │ │ └── 9df988403d9266b9610bf520678520e200090b726c2ea164a0fe727500ba │ │ │ ├── a3 │ │ │ │ └── 60cfc8947cb925b4deffc13cf15258a667e1653daa12cf0001b2e0083bfb │ │ │ └── e9 │ │ │ └── d2369beb18730dc4f30e1c9dcdf5bf16ac9bd28dec641b81ff8e8616e7fc │ │ ├── e9 │ │ │ ├── 6e │ │ │ │ └── ba29811d787f0fd92ce7f4bc3a6827dc6d66c47153d50683c80d6e7a9a6f │ │ │ ├── 9a │ │ │ │ └── b309e8b758264ef32fd578a2928ad1ac4a3241e8c570a5c275e121dd7ee1 │ │ │ ├── bf │ │ │ │ └── 0bfc4abc982e4aecac42d77dbded146ef0ce46649865b55d62144af5a96d │ │ │ ├── cb │ │ │ │ └── b6d58aac267a95803951157a42d29db6c17ef57c66eb59c48684c280e4e8 │ │ │ └── df │ │ │ └── 500f6d65c0cf35c0f7c0635f953b37393168aa27cb55c7b0ce3399c0d7f2 │ │ ├── ec │ │ │ ├── 87 │ │ │ │ └── d81e1e7b2d776e609dbfaa2175a5825c0a63a9bcc70fdb5694b81e7f4fc3 │ │ │ └── 8e │ │ │ └── 97eeecddd26637708519813d42ee2a5ec256bd4831ffa02269e8993e19b7 │ │ ├── ed │ │ │ └── 40 │ │ │ └── e67da4ad085eef0344d8e253e4455423e0efc042d3898be0a399d1a76b79 │ │ ├── ee │ │ │ ├── 3d │ │ │ │ └── 1ab77d088759d13cd44eab2a2f7764233b7908340d97282d9765e014f29c │ │ │ ├── 60 │ │ │ │ └── 850558038dbacbcba5202b181a0a0c4f947405cf3682df3e1c20dec79137 │ │ │ └── 7a │ │ │ └── ee0e1b8bea3f05c1b42f1fe4a17fdc2aa37be14405f4e293de10bd30eb80 │ │ ├── f1 │ │ │ ├── 53 │ │ │ │ └── 8aee994a2b5c701755cdc5660748a90199cf48437f5f93fdd0572344f2f1 │ │ │ └── a1 │ │ │ └── 1de8ff1c9230508fdf1c71b3faa1a9d2aade80a7e0b0d4daa6f4040d8ba2 │ │ ├── f3 │ │ │ ├── 2c │ │ │ │ └── 80267cf9b394a43404ccabe3e574f5fd89b769b43be625b75ff9b1b4a2ee │ │ │ ├── 8b │ │ │ │ └── 4a6b7b0714b6f1c94fff48ad31ee18cb6aa93ed63612067b4de30efd43f8 │ │ │ └── f5 │ │ │ └── d11839881d6df2061b642074ebfaf84ce0d4b1d8e227ad335d364cf6a913 │ │ ├── f4 │ │ │ └── 47 │ │ │ └── 8cb011f7e5de40eae9588617e8f3bce662a0ba2d60796b559a420b44783a │ │ ├── f6 │ │ │ └── c7 │ │ │ └── c2aee6453a94a772577d770a438f34805af27cbf0c7a776b19d6850307b5 │ │ ├── f9 │ │ │ └── 82 │ │ │ └── 228120d240455dd412cb68cbe2007319fbf91d96bb998e7f24c45faadc0b │ │ ├── fa │ │ │ ├── 88 │ │ │ │ └── 31cbd6ca584e75edf3642c6f8b079c1f2b5eca1d7b2780ce2e86c24f1e84 │ │ │ └── a1 │ │ │ └── dd9e9a25a0a13875f496dfc7b415ddc641f6b30648050accc001be4635ee │ │ ├── fb │ │ │ └── fc │ │ │ └── 6282476d454ca3b17e0ba6cf70a4b6a87142bd8f3139517d572b2f9911a4 │ │ ├── fc │ │ │ └── ee │ │ │ └── fc3e1dd6706bd557d2840d92ff10cdd6928b92fb8c46d2195dfbd8d4b2be │ │ ├── fd │ │ │ └── 60 │ │ │ └── 528c5445a438483b66270e6a4dddfa6e9bdcceb2b998cb6f7580d23ceb1b │ │ └── ff │ │ ├── 9f │ │ │ └── 48b5354df0d5feb3420245101c38efe5fb13f171ce2093c16eeb4ba41c7e │ │ └── d6 │ │ └── 9ea5f7eac400baceca422723dd933d7c505c100130f066f787943d1ac679 │ └── _update-notifier-last-checked ├── .pre-commit-config.yaml ├── .pre-commit-setup.md ├── .prettierrc.json ├── .tmp │ └── temp-1758247471070.ts ├── archive │ └── ebook │ └── enterprise_architecture_mcp_ebook.pdf ├── async-fix-verification-summary.md ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── custom │ ├── dir │ │ └── adr-0001-complete-decision.md │ └── research │ ├── dir │ │ └── perform_research_test_research_001.md │ └── README.md ├── debug_test.js ├── docker-compose.docs.yml ├── docs │ ├── .dockerignore │ ├── .gitignore │ ├── .vitepress │ │ └── config.js │ ├── adrs │ │ ├── adr-0001-integration-test-decision.md │ │ ├── adr-0001-test-decision.md │ │ ├── adr-001-mcp-protocol-implementation-strategy.md │ │ ├── adr-002-ai-integration-and-advanced-prompting-strategy.md │ │ ├── adr-003-memory-centric-architecture.md │ │ ├── adr-004-security-and-content-masking-strategy.md │ │ ├── adr-005-testing-and-quality-assurance-strategy.md │ │ ├── adr-006-tree-sitter-integration-strategy.md │ │ ├── adr-007-cicd-pipeline-strategy.md │ │ ├── adr-008-development-workflow-strategy.md │ │ ├── adr-009-package-distribution-strategy.md │ │ └── README.md │ ├── api-styles.css │ ├── CODE_OF_CONDUCT.md │ ├── community │ │ ├── .github │ │ │ ├── ISSUE_TEMPLATE │ │ │ │ ├── bug_report.yml │ │ │ │ └── feature_request.yml │ │ │ └── PULL_REQUEST_TEMPLATE.md │ │ ├── CODE_OF_CONDUCT.md │ │ ├── CONTRIBUTING.md │ │ ├── README-library.md │ │ └── SECURITY.md │ ├── configuration.md │ ├── CONTRIBUTING.md │ ├── CONVERSION_CHECKLIST.md │ ├── DEPENDABOT.md │ ├── DEPLOYMENT_GUIDE.md │ ├── development.md │ ├── diataxis-index.md │ ├── DOCKER_SETUP.md │ ├── DOCKER_TEST_SUCCESS.txt │ ├── docker-compose.yml │ ├── Dockerfile │ ├── DOCUMENTATION_IMPROVEMENT_PLAN.md │ ├── DOCUMENTATION-UPDATE-PLAN.md │ ├── DOCUSAURUS_MIGRATION.md │ ├── DOCUSAURUS_QUICKSTART.md │ ├── docusaurus.config.js │ ├── explanation │ │ ├── adr-philosophy.md │ │ ├── ai-architecture-concepts.md │ │ ├── ai-workflow-concepts.md │ │ ├── ape-framework-design.md │ │ ├── architecture-overview.md │ │ ├── context-file-tool-coverage.md │ │ ├── index.md │ │ ├── knowledge-generation-framework-design.md │ │ ├── knowledge-graph.md │ │ ├── mcp-architecture-flow.md │ │ ├── mcp-concepts.md │ │ ├── performance-design.md │ │ ├── prompt-engineering.md │ │ ├── reflexion-framework-design.md │ │ ├── security-philosophy.md │ │ ├── self-learning-architecture.md │ │ ├── server-architecture.md │ │ └── tool-design.md │ ├── how-to │ │ ├── deploy-to-production.md │ │ └── index.md │ ├── how-to-guides │ │ ├── ape-implementation-strategy.md │ │ ├── ape-usage-guide.md │ │ ├── bootstrap-architecture-docs.md │ │ ├── cicd-integration.md │ │ ├── contribute.md │ │ ├── custom-rules.md │ │ ├── deploy-your-own-server.md │ │ ├── deployment-readiness.md │ │ ├── firecrawl-setup.md │ │ ├── generate-adrs-from-prd.md │ │ ├── getting-started-workflow-guidance.md │ │ ├── installation-guide.md │ │ ├── interactive-adr-planning.md │ │ ├── knowledge-generation-usage-guide.md │ │ ├── large-team-scaling.md │ │ ├── llm-context-file-configuration.md │ │ ├── mcp-client-compatibility.md │ │ ├── migrate-existing-adrs.md │ │ ├── performance-testing.md │ │ ├── prd-to-adrs.md │ │ ├── progress-tracking.md │ │ ├── prompting-guide.md │ │ ├── reflexion-implementation-strategy.md │ │ ├── reflexion-usage-guide.md │ │ ├── research-integration.md │ │ ├── security-analysis.md │ │ ├── server-context-file.md │ │ ├── testing-guide.md │ │ ├── tool-development.md │ │ ├── troubleshooting.md │ │ └── work-with-existing-adrs.md │ ├── ide-rules │ │ ├── additional-workflows.md │ │ ├── command-structure.md │ │ ├── environment-validation-workflow.md │ │ ├── ide-specific │ │ │ ├── cursor │ │ │ │ └── cursor-rules-template.md │ │ │ ├── jetbrains │ │ │ │ └── jetbrains-rules-template.md │ │ │ ├── vscode │ │ │ │ └── vscode-rules-template.md │ │ │ └── windsurf │ │ │ └── windsurf-rules-template.md │ │ ├── quickstart-guide.md │ │ ├── README.md │ │ ├── standalone-usage.md │ │ └── universal-workflows.md │ ├── index.md │ ├── LOGO_DESIGN_PROMPT.md │ ├── Makefile │ ├── mcp-planning-tool-usage.md │ ├── MIGRATION_GUIDE.md │ ├── nginx.conf │ ├── notes │ │ ├── DEVELOPER_GUIDANCE.md │ │ ├── knowledge-graph.md │ │ ├── media │ │ │ ├── 01-first-steps.md │ │ │ ├── diataxis-index.md │ │ │ ├── install-rhel.sh │ │ │ ├── LICENSE │ │ │ ├── mcp-client-config.md │ │ │ ├── mcp-concepts.md │ │ │ ├── performance-design.md │ │ │ ├── security-philosophy.md │ │ │ └── troubleshooting.md │ │ ├── performance-design.md │ │ ├── prompt-engineering.md │ │ ├── README.md │ │ ├── RESEARCH-DRIVEN-ARCHITECTURE.md │ │ ├── RESEARCH-DRIVEN-INTEGRATION-ANALYSIS.md │ │ ├── research-driven-workflow.md │ │ ├── research-integration.md │ │ ├── technical-debt │ │ │ └── LINT_CLEANUP_PLAN.md │ │ ├── tool-design.md │ │ └── USER_GUIDANCE.md │ ├── package-lock.json │ ├── package.json │ ├── public │ │ └── logo.png │ ├── QUICK_START.md │ ├── README_SCRIPTS.md │ ├── README-library.md │ ├── README.md │ ├── reference │ │ ├── analysis-tools.md │ │ ├── api-documentation.md │ │ ├── api-reference-updated.md │ │ ├── api-reference.md │ │ ├── comprehensive-api-reference.md │ │ ├── environment-config.md │ │ ├── generation-tools.md │ │ ├── index.md │ │ ├── mcp-client-config.md │ │ ├── security-tools.md │ │ ├── usage-examples.md │ │ └── validation-tools.md │ ├── release-dashboard.md │ ├── research │ │ ├── perform_research_research_000.md │ │ ├── perform_research_research_001.md │ │ ├── perform_research_research_002.md │ │ ├── perform_research_research_003.md │ │ ├── perform_research_research_004.md │ │ ├── perform_research_research_005.md │ │ ├── perform_research_research_006.md │ │ ├── perform_research_research_007.md │ │ ├── perform_research_research_008.md │ │ ├── perform_research_research_009.md │ │ ├── perform_research_research_010.md │ │ ├── perform_research_research_011.md │ │ ├── perform_research_research_012.md │ │ ├── perform_research_research_013.md │ │ ├── perform_research_research_014.md │ │ ├── perform_research_research_015.md │ │ ├── perform_research_research_016.md │ │ ├── perform_research_research_017.md │ │ ├── perform_research_research_018.md │ │ ├── perform_research_research_019.md │ │ ├── perform_research_research_020.md │ │ ├── perform_research_research_021.md │ │ ├── perform_research_research_022.md │ │ ├── perform_research_research_023.md │ │ ├── perform_research_research_024.md │ │ ├── perform_research_research_025.md │ │ ├── perform_research_research_026.md │ │ ├── perform_research_research_027.md │ │ ├── perform_research_research_028.md │ │ ├── perform_research_research_029.md │ │ ├── perform_research_research_030.md │ │ ├── perform_research_research_031.md │ │ ├── perform_research_research_032.md │ │ ├── perform_research_research_033.md │ │ ├── perform_research_research_034.md │ │ ├── perform_research_research_035.md │ │ ├── perform_research_research_036.md │ │ ├── perform_research_research_037.md │ │ ├── perform_research_research_038.md │ │ ├── perform_research_research_039.md │ │ ├── perform_research_research_040.md │ │ ├── perform_research_research_041.md │ │ ├── perform_research_research_042.md │ │ ├── perform_research_research_043.md │ │ ├── perform_research_research_044.md │ │ ├── perform_research_research_045.md │ │ ├── perform_research_research_046.md │ │ ├── perform_research_research_047.md │ │ ├── perform_research_research_048.md │ │ ├── perform_research_research_049.md │ │ ├── perform_research_test_research__________001.md │ │ ├── perform_research_test_research_001.md │ │ ├── perform_research_test_research_002.md │ │ ├── perform_research_test_unicode.md │ │ └── README.md │ ├── SECURITY.md │ ├── setup-docusaurus.sh │ ├── setup-website.sh │ ├── sidebars.js │ ├── sitemap.xml │ ├── src │ │ └── css │ │ └── custom.css │ ├── static │ │ └── img │ │ ├── logo.png │ │ └── og-image.png │ ├── technical.md │ ├── TESTING_GUIDE.md │ ├── TODO_MANAGEMENT_FIX.md │ ├── tsconfig.json │ ├── tutorials │ │ ├── 01-first-steps.md │ │ ├── 02-existing-projects.md │ │ ├── 03-advanced-analysis.md │ │ ├── index.md │ │ ├── security-focused-workflow.md │ │ └── team-collaboration.md │ ├── VERSION_MANAGEMENT.md │ └── WEBSITE_SETUP.md ├── eslint.config.js ├── jest.config.js ├── LICENSE ├── LLM_CONTEXT.md ├── Makefile ├── mcp-inspector-config.json ├── mcp-test-results.json ├── package-lock.json ├── package.json ├── README.md ├── RELEASE_NOTES_v2.0.22.md ├── reports │ ├── comprehensive-validation_20251003_185155.json │ ├── link-summary_20251003_185121.json │ ├── link-validation_20250922_151241.txt │ ├── link-validation_20250922_151242.txt │ ├── link-validation_20251003_184136.txt │ ├── link-validation_20251003_184141.txt │ ├── link-validation_20251003_184945.txt │ ├── link-validation_20251003_185000.txt │ ├── link-validation_20251003_185121.txt │ └── markdown-validation_20251003_185155.txt ├── sample-project │ ├── docs │ │ └── adrs │ │ ├── 001-database-architecture.md │ │ ├── 002-api-authentication.md │ │ └── 003-legacy-data-migration.md │ └── README.md ├── scripts │ ├── ai-release-notes.ts │ ├── check-docs-links.sh │ ├── check-duplicate-links.ts │ ├── cleanup-template-docs.sh │ ├── docs-workflow.sh │ ├── fix-broken-links.py │ ├── fix-docs-accuracy.sh │ ├── fix-docs-content-accuracy.sh │ ├── install-rhel.sh │ ├── pre-commit-check.sh │ ├── pre-commit-checklist.sh │ ├── remove-duplicate-docs.sh │ ├── sync-tags-to-npm.sh │ ├── test-advanced-prompting.sh │ ├── test-infrastructure.sh │ ├── test-mcp-functionality.sh │ ├── test-mcp-logging.ts │ ├── test-mcp-server.sh │ ├── test-node-compatibility.js │ ├── test-npm-package.sh │ ├── test-release-integration.sh │ ├── validate-build.js │ ├── validate-docs.sh │ └── validate-links-with-sitemap.ts ├── SECURITY.md ├── src │ ├── config │ │ └── ai-config.ts │ ├── index.ts │ ├── prompts │ │ ├── adr-suggestion-prompts.ts │ │ ├── analysis-prompts.ts │ │ ├── deployment-analysis-prompts.ts │ │ ├── environment-analysis-prompts.ts │ │ ├── index.ts │ │ ├── research-integration-prompts.ts │ │ ├── research-question-prompts.ts │ │ ├── rule-generation-prompts.ts │ │ └── security-prompts.ts │ ├── resources │ │ ├── adr-by-id-resource.ts │ │ ├── code-quality-resource.ts │ │ ├── deployment-history-resource.ts │ │ ├── deployment-status-resource.ts │ │ ├── environment-analysis-resource.ts │ │ ├── index.ts │ │ ├── memory-snapshots-resource.ts │ │ ├── pattern-by-name-resource.ts │ │ ├── project-metrics-resource.ts │ │ ├── project-status-resource.ts │ │ ├── research-by-topic-resource.ts │ │ ├── research-index-resource.ts │ │ ├── resource-cache.ts │ │ ├── resource-router.ts │ │ ├── rule-by-id-resource.ts │ │ ├── rule-catalog-resource.ts │ │ ├── rule-generation-resource.ts │ │ ├── technology-by-name-resource.ts │ │ ├── todo-by-id-resource.ts │ │ └── todo-list-resource.ts │ ├── templates │ │ └── domain-knowledge-templates.ts │ ├── tools │ │ ├── adr-bootstrap-validation-tool.ts │ │ ├── adr-suggestion-tool.ts │ │ ├── adr-validation-tool.ts │ │ ├── bootstrap-validation-loop-tool.ts │ │ ├── content-masking-tool.ts │ │ ├── conversation-memory-tool.ts │ │ ├── deployment-analysis-tool.ts │ │ ├── deployment-guidance-tool.ts │ │ ├── deployment-readiness-tool.ts │ │ ├── environment-analysis-tool.ts │ │ ├── expand-analysis-tool.ts │ │ ├── get-server-context-tool.ts │ │ ├── interactive-adr-planning-tool.ts │ │ ├── llm-cloud-management-tool.ts │ │ ├── llm-database-management-tool.ts │ │ ├── llm-web-search-tool.ts │ │ ├── mcp-planning-tool.ts │ │ ├── memory-loading-tool.ts │ │ ├── perform-research-tool.ts │ │ ├── research-integration-tool.ts │ │ ├── research-question-tool.ts │ │ ├── review-existing-adrs-tool.ts │ │ ├── rule-generation-tool.ts │ │ ├── smart-git-push-tool-v2.ts │ │ ├── smart-git-push-tool.ts │ │ ├── tool-chain-orchestrator.ts │ │ └── troubleshoot-guided-workflow-tool.ts │ ├── types │ │ ├── ape-framework.ts │ │ ├── conversation-context.ts │ │ ├── conversation-memory.ts │ │ ├── enhanced-errors.ts │ │ ├── index.ts │ │ ├── knowledge-generation.ts │ │ ├── knowledge-graph-schemas.ts │ │ ├── memory-entities.ts │ │ ├── reflexion-framework.ts │ │ ├── state-reinforcement.ts │ │ ├── tiered-response.ts │ │ ├── tool-arguments.ts │ │ └── tool-context.ts │ └── utils │ ├── actual-file-operations.ts │ ├── adr-discovery.ts │ ├── adr-knowledge-initializer.ts │ ├── adr-suggestions.ts │ ├── ai-executor.ts │ ├── apply-cot-enhancement.ts │ ├── automatic-prompt-engineering.ts │ ├── cache.ts │ ├── chain-of-thought-template.ts │ ├── conditional-request.ts │ ├── config.ts │ ├── content-masking.ts │ ├── conversation-memory-manager.ts │ ├── deployment-analysis.ts │ ├── deployment-type-registry.ts │ ├── directory-compat.ts │ ├── dynamic-deployment-intelligence.ts │ ├── enhanced-logging.ts │ ├── environment-analysis.ts │ ├── environment-capability-registry.ts │ ├── file-system.ts │ ├── file-system.ts.backup │ ├── gitleaks-detector.ts │ ├── index.ts │ ├── interactive-approval.ts │ ├── json-safe.ts │ ├── knowledge-generation.ts │ ├── knowledge-graph-manager.ts │ ├── llm-artifact-detector.ts │ ├── location-filter.ts │ ├── mcp-response-validator.ts │ ├── memory-entity-manager.ts │ ├── memory-health-scoring.ts │ ├── memory-migration-manager.ts │ ├── memory-relationship-mapper.ts │ ├── memory-rollback-manager.ts │ ├── memory-transformation.ts │ ├── monitoring.ts │ ├── output-masking.ts │ ├── prompt-composition.ts │ ├── prompt-execution.ts │ ├── reflexion.ts │ ├── release-readiness-detector.ts │ ├── research-documentation.ts │ ├── research-integration.ts │ ├── research-orchestrator.ts │ ├── research-questions.ts │ ├── resource-versioning.ts │ ├── ripgrep-wrapper.ts │ ├── root-manager.ts │ ├── rule-format.ts │ ├── rule-generation.ts │ ├── server-context-generator.ts │ ├── state-reinforcement-manager.ts │ ├── tiered-response-manager.ts │ └── tree-sitter-analyzer.ts ├── test-results │ └── junit.xml ├── tests │ ├── __mocks__ │ │ ├── @tree-sitter-grammars │ │ │ └── tree-sitter-hcl.ts │ │ ├── tree-sitter-bash.ts │ │ ├── tree-sitter-dockerfile.ts │ │ ├── tree-sitter-javascript.ts │ │ ├── tree-sitter-json.ts │ │ ├── tree-sitter-python.ts │ │ ├── tree-sitter-typescript.ts │ │ ├── tree-sitter-yaml.ts │ │ └── tree-sitter.ts │ ├── ape.test.ts │ ├── cache-architecture-analysis.md │ ├── cache.test.ts │ ├── config │ │ └── ai-config.test.ts │ ├── config.test.ts │ ├── index.test.ts │ ├── integration │ │ ├── memory-migration-integration.test.ts │ │ ├── memory-migration-simple.test.ts │ │ ├── memory-system-integration.test.ts │ │ └── smart-code-linking.test.ts │ ├── knowledge-generation.test.ts │ ├── mcp-server.test.ts │ ├── performance │ │ └── memory-performance.test.ts │ ├── performance-effectiveness.test.ts │ ├── prompts │ │ ├── deployment-analysis-prompts.test.ts │ │ ├── environment-analysis-prompts.test.ts │ │ ├── research-integration-prompts.test.ts │ │ ├── research-question-prompts.test.ts │ │ ├── rule-generation-prompts.test.ts │ │ └── security-prompts.test.ts │ ├── README.md │ ├── reflexion.test.ts │ ├── research-integration-tool.test.ts │ ├── research-question-tool.test.ts │ ├── resources │ │ ├── code-quality-resource.test.ts │ │ └── deployment-history-resource.test.ts │ ├── setup.ts │ ├── smart-git-push-release-readiness.test.ts │ ├── smart-git-push-v2.test.ts │ ├── smart-git-push.test.ts │ ├── smoke.test.ts │ ├── templates │ │ └── domain-knowledge-templates.test.ts │ ├── tools │ │ ├── adr-bootstrap-validation-tool.test.ts │ │ ├── adr-suggestion-tool.test.ts │ │ ├── adr-validation-tool.test.ts │ │ ├── content-masking-tool.test.ts │ │ ├── deployment-analysis-tool.test.ts │ │ ├── deployment-guidance-tool.test.ts │ │ ├── deployment-readiness-tool.test.ts │ │ ├── environment-analysis-tool.test.ts │ │ ├── interactive-adr-planning-tool.test.ts │ │ ├── mcp-planning-tool.test.ts │ │ ├── memory-loading-tool.test.ts │ │ ├── perform-research-tool.test.ts │ │ ├── perform-research-tool.test.ts.backup │ │ ├── research-integration-tool.test.ts │ │ ├── review-existing-adrs-tool.test.ts │ │ ├── rule-generation-tool.test.ts │ │ ├── smart-git-push-tool-v2.test.ts │ │ ├── smart-git-push-tool.test.ts │ │ ├── tool-chain-orchestrator.test.ts │ │ └── troubleshoot-guided-workflow-tool.test.ts │ ├── types │ │ └── conversation-context.test.ts │ ├── types.test.ts │ ├── utils │ │ ├── adr-knowledge-initializer.test.ts │ │ ├── advanced-prompting-test-utils.ts │ │ ├── ai-executor.test.ts │ │ ├── conditional-request.test.ts │ │ ├── deployment-analysis.test.ts │ │ ├── environment-capability-registry.test.ts │ │ ├── file-system.test.ts │ │ ├── find-related-code.test.ts │ │ ├── gitleaks-detector.test.ts │ │ ├── interactive-approval.test.ts │ │ ├── llm-artifact-detector.test.ts │ │ ├── location-filter.test.ts │ │ ├── mcp-response-validator.test.ts │ │ ├── memory-entity-manager.test.ts │ │ ├── memory-relationship-mapper.test.ts │ │ ├── memory-rollback-manager.test.ts │ │ ├── memory-transformation.test.ts │ │ ├── monitoring-smoke.test.ts │ │ ├── monitoring.test.ts │ │ ├── output-masking.test.ts │ │ ├── prompt-composition.test.ts │ │ ├── prompt-execution.test.ts │ │ ├── release-readiness-detector.test.ts │ │ ├── research-documentation.test.ts │ │ ├── research-integration.test.ts │ │ ├── research-orchestrator.test.ts │ │ ├── research-questions.test.ts │ │ ├── resource-versioning.test.ts │ │ ├── rule-format.test.ts │ │ ├── rule-generation.test.ts │ │ ├── test-config.ts │ │ ├── test-helpers.test.ts │ │ ├── test-helpers.ts │ │ ├── test-infrastructure.test.ts │ │ ├── test-infrastructure.ts │ │ ├── tree-sitter-analyzer.test.ts │ │ └── tree-sitter-jest-integration.test.ts │ └── version.test.ts ├── tsconfig.json └── typedoc.json ``` # Files -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- ```typescript 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * MCP ADR Analysis Server 5 | * Main entry point for the Model Context Protocol server 6 | * 7 | * This server provides Tools, Resources, and Prompts for analyzing 8 | * Architectural Decision Records and project architecture. 9 | */ 10 | 11 | import { Server } from '@modelcontextprotocol/sdk/server/index.js'; 12 | import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; 13 | import { 14 | CallToolRequestSchema, 15 | ListToolsRequestSchema, 16 | ListResourcesRequestSchema, 17 | ReadResourceRequestSchema, 18 | ListPromptsRequestSchema, 19 | GetPromptRequestSchema, 20 | type CallToolResult, 21 | } from '@modelcontextprotocol/sdk/types.js'; 22 | 23 | import { readFileSync } from 'fs'; 24 | import { join } from 'path'; 25 | import { getCurrentDirCompat } from './utils/directory-compat.js'; 26 | import { McpAdrError } from './types/index.js'; 27 | import { CONVERSATION_CONTEXT_SCHEMA } from './types/conversation-context.js'; 28 | import { 29 | maskMcpResponse, 30 | createMaskingConfig, 31 | type MaskingConfig, 32 | } from './utils/output-masking.js'; 33 | import { 34 | loadConfig, 35 | validateProjectPath, 36 | createLogger, 37 | printConfigSummary, 38 | type ServerConfig, 39 | } from './utils/config.js'; 40 | import { KnowledgeGraphManager } from './utils/knowledge-graph-manager.js'; 41 | import { StateReinforcementManager } from './utils/state-reinforcement-manager.js'; 42 | import { ConversationMemoryManager } from './utils/conversation-memory-manager.js'; 43 | import { MemoryEntityManager } from './utils/memory-entity-manager.js'; 44 | import { RootManager } from './utils/root-manager.js'; 45 | import { ServerContextGenerator } from './utils/server-context-generator.js'; 46 | import { type ToolContext, createNoOpContext } from './types/tool-context.js'; 47 | import { 48 | type GetWorkflowGuidanceArgs, 49 | type GetArchitecturalContextArgs, 50 | type GetDevelopmentGuidanceArgs, 51 | type GenerateAdrFromDecisionArgs, 52 | type ValidateRulesArgs, 53 | type CreateRuleSetArgs, 54 | type ToolChainOrchestratorArgs, 55 | type ReadFileArgs, 56 | type WriteFileArgs, 57 | type AnalyzeProjectEcosystemArgs, 58 | type ArchitecturalDomain, 59 | type AnalyzeContentSecurityArgs, 60 | type GenerateContentMaskingArgs, 61 | type ConfigureCustomPatternsArgs, 62 | type ApplyBasicContentMaskingArgs, 63 | type ValidateContentMaskingArgs, 64 | type ActionArgs, 65 | type TodoManagementV2Args, 66 | type GenerateArchitecturalKnowledgeFunction, 67 | type ExecuteWithReflexionFunction, 68 | type RetrieveRelevantMemoriesFunction, 69 | type CreateToolReflexionConfigFunction, 70 | } from './types/tool-arguments.js'; 71 | 72 | /** 73 | * Get version from package.json 74 | */ 75 | function getPackageVersion(): string { 76 | try { 77 | // Handle both Jest environment and normal execution 78 | const currentDir = getCurrentDirCompat(); 79 | 80 | // Strategy 1: Try multiple possible locations for package.json 81 | const possiblePaths = [ 82 | join(currentDir, 'package.json'), 83 | join(currentDir, '..', 'package.json'), 84 | join(currentDir, '..', '..', 'package.json'), 85 | join(process.cwd(), 'package.json'), 86 | ]; 87 | 88 | for (const packageJsonPath of possiblePaths) { 89 | try { 90 | const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')); 91 | if (packageJson.name === 'mcp-adr-analysis-server') { 92 | return packageJson.version; 93 | } 94 | } catch { 95 | // Try next path 96 | } 97 | } 98 | 99 | // Strategy 2: Use process.env.npm_package_version if available (during npm scripts) 100 | if (process.env['npm_package_version']) { 101 | return process.env['npm_package_version']; 102 | } 103 | 104 | // Final fallback: Use generic version instead of hardcoded specific version 105 | // This prevents the need to update this code when version changes 106 | return 'unknown'; // Generic fallback - no longer tied to specific version 107 | } catch (error) { 108 | console.error('Error reading package.json:', error); 109 | return 'unknown'; // Generic fallback - no longer tied to specific version 110 | } 111 | } 112 | 113 | /** 114 | * Server configuration 115 | */ 116 | const SERVER_INFO = { 117 | name: 'mcp-adr-analysis-server', 118 | version: getPackageVersion(), 119 | description: 'MCP server for analyzing Architectural Decision Records and project architecture', 120 | }; 121 | 122 | /** 123 | * Main server class 124 | */ 125 | export class McpAdrAnalysisServer { 126 | private server: Server; 127 | private maskingConfig: MaskingConfig; 128 | private config: ServerConfig; 129 | private logger: ReturnType<typeof createLogger>; 130 | private kgManager: KnowledgeGraphManager; 131 | private stateReinforcementManager: StateReinforcementManager; 132 | private conversationMemoryManager: ConversationMemoryManager; 133 | private memoryEntityManager: MemoryEntityManager; 134 | private rootManager: RootManager; 135 | private contextGenerator: ServerContextGenerator; 136 | 137 | constructor() { 138 | // Load and validate configuration 139 | this.config = loadConfig(); 140 | this.logger = createLogger(this.config); 141 | this.kgManager = new KnowledgeGraphManager(); 142 | this.stateReinforcementManager = new StateReinforcementManager(this.kgManager); 143 | this.conversationMemoryManager = new ConversationMemoryManager(this.kgManager); 144 | this.memoryEntityManager = new MemoryEntityManager(); 145 | 146 | // Initialize root manager for file access control 147 | this.rootManager = new RootManager(this.config.projectPath, this.config.adrDirectory); 148 | 149 | // Initialize server context generator 150 | this.contextGenerator = new ServerContextGenerator(); 151 | 152 | // Print configuration summary 153 | printConfigSummary(this.config); 154 | 155 | // Note: Validation will be done during startup 156 | 157 | this.server = new Server(SERVER_INFO, { 158 | capabilities: { 159 | tools: {}, 160 | resources: {}, 161 | prompts: {}, 162 | }, 163 | }); 164 | 165 | this.maskingConfig = createMaskingConfig(); 166 | this.setupHandlers(); 167 | } 168 | 169 | /** 170 | * Validate configuration and project setup 171 | */ 172 | private async validateConfiguration(): Promise<void> { 173 | try { 174 | await validateProjectPath(this.config.projectPath); 175 | this.logger.info(`Project path validated: ${this.config.projectPath}`); 176 | } catch (error: unknown) { 177 | const errorMessage = error instanceof Error ? error.message : String(error); 178 | this.logger.error(`Configuration validation failed: ${errorMessage}`); 179 | throw error; 180 | } 181 | } 182 | 183 | /** 184 | * Public health check method for testing 185 | */ 186 | async healthCheck(): Promise<void> { 187 | await this.validateConfiguration(); 188 | this.logger.info('Health check completed successfully'); 189 | } 190 | 191 | /** 192 | * Setup MCP protocol handlers 193 | * 194 | * @description Configures all Model Context Protocol request handlers for the ADR Analysis Server. 195 | * Implements the complete MCP specification including tools, resources, and prompts. 196 | * 197 | * @private 198 | * @since 2.0.0 199 | * @category MCP Protocol 200 | */ 201 | private setupHandlers(): void { 202 | /** 203 | * List Tools Handler - MCP Protocol Endpoint 204 | * 205 | * @description Returns the complete catalog of available tools for ADR analysis, 206 | * research, validation, and deployment operations. Each tool includes comprehensive 207 | * input schemas and descriptions for client integration. 208 | * 209 | * @returns {Promise<{tools: Array}>} Complete tool catalog with schemas 210 | * 211 | * @example 212 | * ```typescript 213 | * // MCP Client usage 214 | * const tools = await mcpClient.listTools(); 215 | * console.log(tools.tools.length); // 20+ available tools 216 | * 217 | * // Find specific tool 218 | * const researchTool = tools.tools.find(t => t.name === 'perform_research'); 219 | * console.log(researchTool.description); // Tool description 220 | * ``` 221 | * 222 | * @mcp-endpoint 223 | * @category Tools 224 | */ 225 | this.server.setRequestHandler(ListToolsRequestSchema, async () => { 226 | return { 227 | tools: [ 228 | { 229 | name: 'analyze_project_ecosystem', 230 | description: 231 | 'Comprehensive recursive project ecosystem analysis with advanced prompting techniques (Knowledge Generation + Reflexion)', 232 | inputSchema: { 233 | type: 'object', 234 | properties: { 235 | projectPath: { 236 | type: 'string', 237 | description: 238 | 'Path to the project directory to analyze (optional, uses configured PROJECT_PATH if not provided)', 239 | }, 240 | includePatterns: { 241 | type: 'array', 242 | items: { type: 'string' }, 243 | description: 'File patterns to include in analysis', 244 | }, 245 | enhancedMode: { 246 | type: 'boolean', 247 | description: 248 | 'Enable advanced prompting features (Knowledge Generation + Reflexion)', 249 | default: true, 250 | }, 251 | knowledgeEnhancement: { 252 | type: 'boolean', 253 | description: 'Enable Knowledge Generation for technology-specific insights', 254 | default: true, 255 | }, 256 | learningEnabled: { 257 | type: 'boolean', 258 | description: 'Enable Reflexion learning from past analysis outcomes', 259 | default: true, 260 | }, 261 | technologyFocus: { 262 | type: 'array', 263 | items: { type: 'string' }, 264 | description: 265 | 'Specific technologies to focus analysis on (auto-detected if not provided)', 266 | }, 267 | analysisDepth: { 268 | type: 'string', 269 | enum: ['basic', 'detailed', 'comprehensive'], 270 | description: 'Depth of ecosystem analysis', 271 | default: 'comprehensive', 272 | }, 273 | includeEnvironment: { 274 | type: 'boolean', 275 | description: 276 | 'Automatically include comprehensive environment analysis (default: true)', 277 | default: true, 278 | }, 279 | recursiveDepth: { 280 | type: 'string', 281 | description: 'Depth of recursive project analysis', 282 | enum: ['shallow', 'moderate', 'deep', 'comprehensive'], 283 | default: 'comprehensive', 284 | }, 285 | analysisScope: { 286 | type: 'array', 287 | items: { type: 'string' }, 288 | description: 289 | 'Specific analysis areas to focus on (e.g., ["security", "performance", "architecture", "dependencies"])', 290 | }, 291 | conversationContext: CONVERSATION_CONTEXT_SCHEMA, 292 | }, 293 | required: [], 294 | }, 295 | }, 296 | { 297 | name: 'get_architectural_context', 298 | description: 299 | 'Get detailed architectural context for specific files or the entire project, automatically sets up ADR infrastructure if missing, and provides outcome-focused workflow for project success', 300 | inputSchema: { 301 | type: 'object', 302 | properties: { 303 | filePath: { 304 | type: 'string', 305 | description: 306 | 'Specific file path to analyze (optional, analyzes entire project if not provided)', 307 | }, 308 | includeCompliance: { 309 | type: 'boolean', 310 | description: 'Include compliance checks in the analysis', 311 | default: true, 312 | }, 313 | conversationContext: CONVERSATION_CONTEXT_SCHEMA, 314 | }, 315 | }, 316 | }, 317 | { 318 | name: 'generate_adrs_from_prd', 319 | description: 320 | 'Generate Architectural Decision Records from a Product Requirements Document with advanced prompting techniques (APE + Knowledge Generation)', 321 | inputSchema: { 322 | type: 'object', 323 | properties: { 324 | prdPath: { 325 | type: 'string', 326 | description: 'Path to the PRD.md file', 327 | }, 328 | outputDirectory: { 329 | type: 'string', 330 | description: 331 | 'Directory to output generated ADRs (optional, uses configured ADR_DIRECTORY if not provided)', 332 | }, 333 | enhancedMode: { 334 | type: 'boolean', 335 | description: 'Enable advanced prompting features (APE + Knowledge Generation)', 336 | default: true, 337 | }, 338 | promptOptimization: { 339 | type: 'boolean', 340 | description: 'Enable Automatic Prompt Engineering for optimized ADR generation', 341 | default: true, 342 | }, 343 | knowledgeEnhancement: { 344 | type: 'boolean', 345 | description: 'Enable Knowledge Generation for domain-specific insights', 346 | default: true, 347 | }, 348 | prdType: { 349 | type: 'string', 350 | enum: [ 351 | 'web-application', 352 | 'mobile-app', 353 | 'microservices', 354 | 'data-platform', 355 | 'api-service', 356 | 'general', 357 | ], 358 | description: 'Type of PRD for optimized knowledge generation', 359 | default: 'general', 360 | }, 361 | conversationContext: CONVERSATION_CONTEXT_SCHEMA, 362 | }, 363 | required: ['prdPath'], 364 | }, 365 | }, 366 | { 367 | name: 'compare_adr_progress', 368 | description: 369 | 'Compare TODO.md progress against ADRs and current environment to validate implementation status', 370 | inputSchema: { 371 | type: 'object', 372 | properties: { 373 | todoPath: { 374 | type: 'string', 375 | description: 'Path to TODO.md file to analyze', 376 | default: 'TODO.md', 377 | }, 378 | adrDirectory: { 379 | type: 'string', 380 | description: 'Directory containing ADR files', 381 | default: 'docs/adrs', 382 | }, 383 | projectPath: { 384 | type: 'string', 385 | description: 'Path to project root for environment analysis', 386 | default: '.', 387 | }, 388 | environment: { 389 | type: 'string', 390 | enum: ['development', 'staging', 'production', 'testing', 'auto-detect'], 391 | description: 392 | 'Target environment context for validation (auto-detect will infer from project structure)', 393 | default: 'auto-detect', 394 | }, 395 | environmentConfig: { 396 | type: 'object', 397 | description: 'Environment-specific configuration and requirements', 398 | properties: { 399 | requiredFiles: { 400 | type: 'array', 401 | items: { type: 'string' }, 402 | description: 'Files required for this environment', 403 | }, 404 | requiredServices: { 405 | type: 'array', 406 | items: { type: 'string' }, 407 | description: 'Services that must be implemented for this environment', 408 | }, 409 | securityLevel: { 410 | type: 'string', 411 | enum: ['low', 'medium', 'high', 'critical'], 412 | description: 'Required security level for this environment', 413 | }, 414 | performanceRequirements: { 415 | type: 'object', 416 | description: 'Performance requirements for this environment', 417 | }, 418 | }, 419 | }, 420 | validationType: { 421 | type: 'string', 422 | enum: ['full', 'todo-only', 'adr-only', 'environment-only'], 423 | description: 'Type of validation to perform', 424 | default: 'full', 425 | }, 426 | includeFileChecks: { 427 | type: 'boolean', 428 | description: 'Include file existence and implementation checks', 429 | default: true, 430 | }, 431 | includeRuleValidation: { 432 | type: 'boolean', 433 | description: 'Include architectural rule compliance validation', 434 | default: true, 435 | }, 436 | deepCodeAnalysis: { 437 | type: 'boolean', 438 | description: 439 | 'Perform deep code analysis to distinguish mock from production implementations', 440 | default: true, 441 | }, 442 | functionalValidation: { 443 | type: 'boolean', 444 | description: 445 | 'Validate that code actually functions according to ADR goals, not just exists', 446 | default: true, 447 | }, 448 | strictMode: { 449 | type: 'boolean', 450 | description: 451 | 'Enable strict validation mode with reality-check mechanisms against overconfident assessments', 452 | default: true, 453 | }, 454 | environmentValidation: { 455 | type: 'boolean', 456 | description: 'Enable environment-specific validation rules and checks', 457 | default: true, 458 | }, 459 | }, 460 | }, 461 | }, 462 | { 463 | name: 'analyze_content_security', 464 | description: 465 | 'Analyze content for sensitive information using AI-powered detection with optional memory integration for security pattern learning', 466 | inputSchema: { 467 | type: 'object', 468 | properties: { 469 | content: { 470 | type: 'string', 471 | description: 'Content to analyze for sensitive information', 472 | }, 473 | contentType: { 474 | type: 'string', 475 | enum: ['code', 'documentation', 'configuration', 'logs', 'general'], 476 | description: 'Type of content being analyzed', 477 | default: 'general', 478 | }, 479 | userDefinedPatterns: { 480 | type: 'array', 481 | items: { type: 'string' }, 482 | description: 'User-defined sensitive patterns to detect', 483 | }, 484 | enableMemoryIntegration: { 485 | type: 'boolean', 486 | description: 487 | 'Enable memory entity storage for security pattern learning and institutional knowledge building', 488 | default: true, 489 | }, 490 | knowledgeEnhancement: { 491 | type: 'boolean', 492 | description: 493 | 'Enable Generated Knowledge Prompting for security and privacy expertise', 494 | default: true, 495 | }, 496 | enhancedMode: { 497 | type: 'boolean', 498 | description: 'Enable advanced prompting features', 499 | default: true, 500 | }, 501 | }, 502 | required: ['content'], 503 | }, 504 | }, 505 | { 506 | name: 'generate_content_masking', 507 | description: 'Generate masking instructions for detected sensitive content', 508 | inputSchema: { 509 | type: 'object', 510 | properties: { 511 | content: { 512 | type: 'string', 513 | description: 'Content to mask', 514 | }, 515 | detectedItems: { 516 | type: 'array', 517 | items: { 518 | type: 'object', 519 | properties: { 520 | type: { type: 'string' }, 521 | content: { type: 'string' }, 522 | startPosition: { type: 'number' }, 523 | endPosition: { type: 'number' }, 524 | severity: { type: 'string' }, 525 | }, 526 | }, 527 | description: 'Detected sensitive items to mask', 528 | }, 529 | maskingStrategy: { 530 | type: 'string', 531 | enum: ['full', 'partial', 'placeholder', 'environment'], 532 | description: 'Strategy for masking content', 533 | default: 'full', 534 | }, 535 | }, 536 | required: ['content', 'detectedItems'], 537 | }, 538 | }, 539 | { 540 | name: 'configure_custom_patterns', 541 | description: 'Configure custom sensitive patterns for a project', 542 | inputSchema: { 543 | type: 'object', 544 | properties: { 545 | projectPath: { 546 | type: 'string', 547 | description: 'Path to the project directory', 548 | }, 549 | existingPatterns: { 550 | type: 'array', 551 | items: { type: 'string' }, 552 | description: 'Existing patterns to consider', 553 | }, 554 | }, 555 | required: ['projectPath'], 556 | }, 557 | }, 558 | { 559 | name: 'apply_basic_content_masking', 560 | description: 'Apply basic content masking (fallback when AI is not available)', 561 | inputSchema: { 562 | type: 'object', 563 | properties: { 564 | content: { 565 | type: 'string', 566 | description: 'Content to mask', 567 | }, 568 | maskingStrategy: { 569 | type: 'string', 570 | enum: ['full', 'partial', 'placeholder'], 571 | description: 'Strategy for masking content', 572 | default: 'full', 573 | }, 574 | }, 575 | required: ['content'], 576 | }, 577 | }, 578 | { 579 | name: 'validate_content_masking', 580 | description: 'Validate that content masking was applied correctly', 581 | inputSchema: { 582 | type: 'object', 583 | properties: { 584 | originalContent: { 585 | type: 'string', 586 | description: 'Original content before masking', 587 | }, 588 | maskedContent: { 589 | type: 'string', 590 | description: 'Content after masking', 591 | }, 592 | }, 593 | required: ['originalContent', 'maskedContent'], 594 | }, 595 | }, 596 | { 597 | name: 'manage_cache', 598 | description: 'Manage MCP resource cache (clear, stats, cleanup)', 599 | inputSchema: { 600 | type: 'object', 601 | properties: { 602 | action: { 603 | type: 'string', 604 | enum: ['clear', 'stats', 'cleanup', 'invalidate'], 605 | description: 'Cache management action to perform', 606 | }, 607 | key: { 608 | type: 'string', 609 | description: 'Specific cache key to invalidate (for invalidate action)', 610 | }, 611 | }, 612 | required: ['action'], 613 | }, 614 | }, 615 | { 616 | name: 'configure_output_masking', 617 | description: 'Configure content masking for all MCP outputs', 618 | inputSchema: { 619 | type: 'object', 620 | properties: { 621 | enabled: { 622 | type: 'boolean', 623 | description: 'Enable or disable output masking', 624 | }, 625 | strategy: { 626 | type: 'string', 627 | enum: ['full', 'partial', 'placeholder', 'environment'], 628 | description: 'Masking strategy to use', 629 | }, 630 | customPatterns: { 631 | type: 'array', 632 | items: { type: 'string' }, 633 | description: 'Custom patterns to mask', 634 | }, 635 | action: { 636 | type: 'string', 637 | enum: ['get', 'set', 'reset'], 638 | description: 'Configuration action', 639 | default: 'get', 640 | }, 641 | }, 642 | }, 643 | }, 644 | { 645 | name: 'suggest_adrs', 646 | description: 647 | 'Suggest architectural decisions with advanced prompting techniques (Knowledge Generation + Reflexion). TIP: Read @.mcp-server-context.md first for project history, patterns, and previous ADRs to ensure consistency.', 648 | inputSchema: { 649 | type: 'object', 650 | properties: { 651 | projectPath: { 652 | type: 'string', 653 | description: 'Path to the project directory', 654 | default: '.', 655 | }, 656 | analysisType: { 657 | type: 'string', 658 | enum: ['implicit_decisions', 'code_changes', 'comprehensive'], 659 | description: 'Type of analysis to perform', 660 | default: 'comprehensive', 661 | }, 662 | beforeCode: { 663 | type: 'string', 664 | description: 'Code before changes (for code_changes analysis)', 665 | }, 666 | afterCode: { 667 | type: 'string', 668 | description: 'Code after changes (for code_changes analysis)', 669 | }, 670 | changeDescription: { 671 | type: 'string', 672 | description: 'Description of the changes (for code_changes analysis)', 673 | }, 674 | commitMessages: { 675 | type: 'array', 676 | items: { type: 'string' }, 677 | description: 'Related commit messages (for code_changes analysis)', 678 | }, 679 | existingAdrs: { 680 | type: 'array', 681 | items: { type: 'string' }, 682 | description: 'List of existing ADR titles to avoid duplication', 683 | }, 684 | enhancedMode: { 685 | type: 'boolean', 686 | description: 687 | 'Enable advanced prompting features (Knowledge Generation + Reflexion)', 688 | default: true, 689 | }, 690 | learningEnabled: { 691 | type: 'boolean', 692 | description: 'Enable Reflexion learning from past experiences', 693 | default: true, 694 | }, 695 | knowledgeEnhancement: { 696 | type: 'boolean', 697 | description: 'Enable Knowledge Generation for domain-specific insights', 698 | default: true, 699 | }, 700 | conversationContext: CONVERSATION_CONTEXT_SCHEMA, 701 | }, 702 | }, 703 | }, 704 | { 705 | name: 'generate_adr_from_decision', 706 | description: 707 | 'Generate a complete ADR from decision data. TIP: Reference @.mcp-server-context.md to align with existing architectural patterns and decisions.', 708 | inputSchema: { 709 | type: 'object', 710 | properties: { 711 | decisionData: { 712 | type: 'object', 713 | properties: { 714 | title: { type: 'string', description: 'Decision title' }, 715 | context: { type: 'string', description: 'Decision context and problem' }, 716 | decision: { type: 'string', description: 'The architectural decision' }, 717 | consequences: { type: 'string', description: 'Decision consequences' }, 718 | alternatives: { 719 | type: 'array', 720 | items: { type: 'string' }, 721 | description: 'Alternative approaches considered', 722 | }, 723 | evidence: { 724 | type: 'array', 725 | items: { type: 'string' }, 726 | description: 'Supporting evidence for the decision', 727 | }, 728 | }, 729 | required: ['title', 'context', 'decision', 'consequences'], 730 | }, 731 | templateFormat: { 732 | type: 'string', 733 | enum: ['nygard', 'madr', 'custom'], 734 | description: 'ADR template format to use', 735 | default: 'nygard', 736 | }, 737 | existingAdrs: { 738 | type: 'array', 739 | items: { type: 'string' }, 740 | description: 'List of existing ADRs for numbering and references', 741 | }, 742 | adrDirectory: { 743 | type: 'string', 744 | description: 'Directory where ADRs are stored', 745 | default: 'docs/adrs', 746 | }, 747 | }, 748 | required: ['decisionData'], 749 | }, 750 | }, 751 | { 752 | name: 'generate_adr_bootstrap', 753 | description: 754 | 'Generate bootstrap.sh and validate_bootstrap.sh scripts to ensure deployed code follows ADR requirements', 755 | inputSchema: { 756 | type: 'object', 757 | properties: { 758 | projectPath: { 759 | type: 'string', 760 | description: 'Path to the project directory', 761 | default: '.', 762 | }, 763 | adrDirectory: { 764 | type: 'string', 765 | description: 'Directory where ADRs are stored', 766 | default: 'docs/adrs', 767 | }, 768 | outputPath: { 769 | type: 'string', 770 | description: 'Directory where to generate scripts', 771 | default: '.', 772 | }, 773 | scriptType: { 774 | type: 'string', 775 | enum: ['bootstrap', 'validate', 'both'], 776 | description: 'Which scripts to generate', 777 | default: 'both', 778 | }, 779 | includeTests: { 780 | type: 'boolean', 781 | description: 'Include test execution in bootstrap', 782 | default: true, 783 | }, 784 | includeDeployment: { 785 | type: 'boolean', 786 | description: 'Include deployment steps in bootstrap', 787 | default: true, 788 | }, 789 | customValidations: { 790 | type: 'array', 791 | items: { type: 'string' }, 792 | description: 'Custom validation commands to include', 793 | }, 794 | conversationContext: CONVERSATION_CONTEXT_SCHEMA, 795 | }, 796 | }, 797 | }, 798 | { 799 | name: 'bootstrap_validation_loop', 800 | description: 801 | 'Execute complete bootstrap validation loop with environment monitoring, auto-fixing, and ADR learning. Iteratively validates deployments against ADRs and updates ADRs with real-world deployment experience.', 802 | inputSchema: { 803 | type: 'object', 804 | properties: { 805 | projectPath: { 806 | type: 'string', 807 | description: 'Path to the project directory', 808 | default: '.', 809 | }, 810 | adrDirectory: { 811 | type: 'string', 812 | description: 'Directory where ADRs are stored', 813 | default: 'docs/adrs', 814 | }, 815 | targetEnvironment: { 816 | type: 'string', 817 | enum: ['development', 'staging', 'production', 'testing'], 818 | description: 'Target deployment environment', 819 | default: 'development', 820 | }, 821 | maxIterations: { 822 | type: 'number', 823 | description: 'Maximum validation/fix iterations', 824 | default: 5, 825 | }, 826 | autoFix: { 827 | type: 'boolean', 828 | description: 'Automatically fix bootstrap scripts based on failures', 829 | default: true, 830 | }, 831 | validateAfterFix: { 832 | type: 'boolean', 833 | description: 'Re-validate after applying auto-fixes', 834 | default: true, 835 | }, 836 | captureEnvironmentSnapshot: { 837 | type: 'boolean', 838 | description: 'Capture environment state during execution', 839 | default: true, 840 | }, 841 | updateAdrsWithLearnings: { 842 | type: 'boolean', 843 | description: 'Update ADRs with deployment learnings (non-sensitive)', 844 | default: true, 845 | }, 846 | conversationContext: CONVERSATION_CONTEXT_SCHEMA, 847 | }, 848 | }, 849 | }, 850 | { 851 | name: 'discover_existing_adrs', 852 | description: 'Discover and catalog existing ADRs in the project', 853 | inputSchema: { 854 | type: 'object', 855 | properties: { 856 | adrDirectory: { 857 | type: 'string', 858 | description: 'Directory to search for ADRs', 859 | default: 'docs/adrs', 860 | }, 861 | includeContent: { 862 | type: 'boolean', 863 | description: 'Whether to include ADR content in analysis', 864 | default: false, 865 | }, 866 | }, 867 | }, 868 | }, 869 | { 870 | name: 'review_existing_adrs', 871 | description: 872 | 'Review existing ADRs against actual code implementation with cloud/DevOps expertise. TIP: After review, call get_server_context to update @.mcp-server-context.md with findings.', 873 | inputSchema: { 874 | type: 'object', 875 | properties: { 876 | adrDirectory: { 877 | type: 'string', 878 | description: 'Directory containing ADR files', 879 | default: 'docs/adrs', 880 | }, 881 | projectPath: { 882 | type: 'string', 883 | description: 'Path to the project directory', 884 | default: '.', 885 | }, 886 | specificAdr: { 887 | type: 'string', 888 | description: 'Specific ADR filename or title to review (optional)', 889 | }, 890 | analysisDepth: { 891 | type: 'string', 892 | enum: ['basic', 'detailed', 'comprehensive'], 893 | description: 'Depth of analysis to perform', 894 | default: 'detailed', 895 | }, 896 | includeTreeSitter: { 897 | type: 'boolean', 898 | description: 'Use tree-sitter for enhanced code analysis', 899 | default: true, 900 | }, 901 | generateUpdatePlan: { 902 | type: 'boolean', 903 | description: 'Generate action plan for updating non-compliant ADRs', 904 | default: true, 905 | }, 906 | conversationContext: CONVERSATION_CONTEXT_SCHEMA, 907 | }, 908 | }, 909 | }, 910 | { 911 | name: 'validate_adr', 912 | description: 913 | 'Validate an existing ADR against actual infrastructure reality using research-driven analysis. TIP: Compare findings against patterns in @.mcp-server-context.md for consistency checks.', 914 | inputSchema: { 915 | type: 'object', 916 | properties: { 917 | adrPath: { 918 | type: 'string', 919 | description: 'Path to the ADR file to validate (relative or absolute)', 920 | }, 921 | projectPath: { 922 | type: 'string', 923 | description: 'Path to the project directory', 924 | default: '.', 925 | }, 926 | adrDirectory: { 927 | type: 'string', 928 | description: 'Directory containing ADR files', 929 | default: 'docs/adrs', 930 | }, 931 | includeEnvironmentCheck: { 932 | type: 'boolean', 933 | description: 'Include live environment verification in validation', 934 | default: true, 935 | }, 936 | confidenceThreshold: { 937 | type: 'number', 938 | description: 'Minimum research confidence threshold (0-1)', 939 | default: 0.6, 940 | }, 941 | }, 942 | required: ['adrPath'], 943 | }, 944 | }, 945 | { 946 | name: 'validate_all_adrs', 947 | description: 'Validate all ADRs in a directory against actual infrastructure reality', 948 | inputSchema: { 949 | type: 'object', 950 | properties: { 951 | projectPath: { 952 | type: 'string', 953 | description: 'Path to the project directory', 954 | default: '.', 955 | }, 956 | adrDirectory: { 957 | type: 'string', 958 | description: 'Directory containing ADR files', 959 | default: 'docs/adrs', 960 | }, 961 | includeEnvironmentCheck: { 962 | type: 'boolean', 963 | description: 'Include live environment verification in validation', 964 | default: true, 965 | }, 966 | minConfidence: { 967 | type: 'number', 968 | description: 'Minimum research confidence for validation (0-1)', 969 | default: 0.6, 970 | }, 971 | }, 972 | }, 973 | }, 974 | { 975 | name: 'incorporate_research', 976 | description: 'Incorporate research findings into architectural decisions', 977 | inputSchema: { 978 | type: 'object', 979 | properties: { 980 | researchPath: { 981 | type: 'string', 982 | description: 'Path to research directory', 983 | default: 'docs/research', 984 | }, 985 | adrDirectory: { 986 | type: 'string', 987 | description: 'Path to ADR directory', 988 | default: 'docs/adrs', 989 | }, 990 | analysisType: { 991 | type: 'string', 992 | enum: [ 993 | 'monitor', 994 | 'extract_topics', 995 | 'evaluate_impact', 996 | 'generate_updates', 997 | 'comprehensive', 998 | ], 999 | description: 'Type of research analysis to perform', 1000 | default: 'comprehensive', 1001 | }, 1002 | existingTopics: { 1003 | type: 'array', 1004 | items: { type: 'string' }, 1005 | description: 'Previously identified research topics', 1006 | }, 1007 | researchTopics: { 1008 | type: 'array', 1009 | items: { 1010 | type: 'object', 1011 | properties: { 1012 | id: { type: 'string' }, 1013 | title: { type: 'string' }, 1014 | category: { type: 'string' }, 1015 | keyFindings: { type: 'array', items: { type: 'string' } }, 1016 | relevanceScore: { type: 'number' }, 1017 | }, 1018 | }, 1019 | description: 'Research topics for impact evaluation', 1020 | }, 1021 | adrId: { 1022 | type: 'string', 1023 | description: 'ADR ID for update generation', 1024 | }, 1025 | updateType: { 1026 | type: 'string', 1027 | enum: ['content', 'status', 'consequences', 'alternatives', 'deprecation'], 1028 | description: 'Type of ADR update to generate', 1029 | }, 1030 | researchFindings: { 1031 | type: 'array', 1032 | items: { 1033 | type: 'object', 1034 | properties: { 1035 | finding: { type: 'string' }, 1036 | evidence: { type: 'array', items: { type: 'string' } }, 1037 | impact: { type: 'string' }, 1038 | }, 1039 | }, 1040 | description: 'Research findings for update generation', 1041 | }, 1042 | }, 1043 | }, 1044 | }, 1045 | { 1046 | name: 'create_research_template', 1047 | description: 'Create a research template file for documenting findings', 1048 | inputSchema: { 1049 | type: 'object', 1050 | properties: { 1051 | title: { 1052 | type: 'string', 1053 | description: 'Title of the research', 1054 | }, 1055 | category: { 1056 | type: 'string', 1057 | description: 'Research category', 1058 | default: 'general', 1059 | }, 1060 | researchPath: { 1061 | type: 'string', 1062 | description: 'Path to research directory', 1063 | default: 'docs/research', 1064 | }, 1065 | }, 1066 | required: ['title'], 1067 | }, 1068 | }, 1069 | { 1070 | name: 'request_action_confirmation', 1071 | description: 'Request confirmation before applying research-based changes', 1072 | inputSchema: { 1073 | type: 'object', 1074 | properties: { 1075 | action: { 1076 | type: 'string', 1077 | description: 'Description of the action to be performed', 1078 | }, 1079 | details: { 1080 | type: 'string', 1081 | description: 'Detailed information about the action', 1082 | }, 1083 | impact: { 1084 | type: 'string', 1085 | enum: ['low', 'medium', 'high', 'critical'], 1086 | description: 'Impact level of the action', 1087 | default: 'medium', 1088 | }, 1089 | }, 1090 | required: ['action', 'details'], 1091 | }, 1092 | }, 1093 | { 1094 | name: 'generate_rules', 1095 | description: 'Generate architectural rules from ADRs and code patterns', 1096 | inputSchema: { 1097 | type: 'object', 1098 | properties: { 1099 | source: { 1100 | type: 'string', 1101 | enum: ['adrs', 'patterns', 'both'], 1102 | description: 'Source for rule generation', 1103 | default: 'both', 1104 | }, 1105 | adrDirectory: { 1106 | type: 'string', 1107 | description: 'Directory containing ADR files', 1108 | default: 'docs/adrs', 1109 | }, 1110 | projectPath: { 1111 | type: 'string', 1112 | description: 'Path to project for pattern analysis', 1113 | default: '.', 1114 | }, 1115 | existingRules: { 1116 | type: 'array', 1117 | items: { 1118 | type: 'object', 1119 | properties: { 1120 | id: { type: 'string' }, 1121 | name: { type: 'string' }, 1122 | description: { type: 'string' }, 1123 | }, 1124 | }, 1125 | description: 'Existing rules to avoid duplication', 1126 | }, 1127 | outputFormat: { 1128 | type: 'string', 1129 | enum: ['json', 'yaml', 'both'], 1130 | description: 'Output format for rules', 1131 | default: 'json', 1132 | }, 1133 | }, 1134 | }, 1135 | }, 1136 | { 1137 | name: 'validate_rules', 1138 | description: 'Validate code against architectural rules', 1139 | inputSchema: { 1140 | type: 'object', 1141 | properties: { 1142 | filePath: { 1143 | type: 'string', 1144 | description: 'Path to file to validate', 1145 | }, 1146 | fileContent: { 1147 | type: 'string', 1148 | description: 'Content to validate (alternative to filePath)', 1149 | }, 1150 | fileName: { 1151 | type: 'string', 1152 | description: 'Name of file being validated (when using fileContent)', 1153 | }, 1154 | rules: { 1155 | type: 'array', 1156 | items: { 1157 | type: 'object', 1158 | properties: { 1159 | id: { type: 'string' }, 1160 | name: { type: 'string' }, 1161 | description: { type: 'string' }, 1162 | pattern: { type: 'string' }, 1163 | severity: { type: 'string' }, 1164 | message: { type: 'string' }, 1165 | }, 1166 | required: ['id', 'name', 'pattern', 'severity', 'message'], 1167 | }, 1168 | description: 'Rules to validate against', 1169 | }, 1170 | validationType: { 1171 | type: 'string', 1172 | enum: ['file', 'function', 'component', 'module'], 1173 | description: 'Type of validation to perform', 1174 | default: 'file', 1175 | }, 1176 | reportFormat: { 1177 | type: 'string', 1178 | enum: ['summary', 'detailed', 'json'], 1179 | description: 'Format for validation report', 1180 | default: 'detailed', 1181 | }, 1182 | }, 1183 | required: ['rules'], 1184 | }, 1185 | }, 1186 | { 1187 | name: 'create_rule_set', 1188 | description: 'Create machine-readable rule set in JSON/YAML format', 1189 | inputSchema: { 1190 | type: 'object', 1191 | properties: { 1192 | name: { 1193 | type: 'string', 1194 | description: 'Name of the rule set', 1195 | }, 1196 | description: { 1197 | type: 'string', 1198 | description: 'Description of the rule set', 1199 | default: 'Generated architectural rule set', 1200 | }, 1201 | adrRules: { 1202 | type: 'array', 1203 | items: { type: 'object' }, 1204 | description: 'Rules extracted from ADRs', 1205 | }, 1206 | patternRules: { 1207 | type: 'array', 1208 | items: { type: 'object' }, 1209 | description: 'Rules generated from code patterns', 1210 | }, 1211 | rules: { 1212 | type: 'array', 1213 | items: { type: 'object' }, 1214 | description: 'Additional rules to include', 1215 | }, 1216 | outputFormat: { 1217 | type: 'string', 1218 | enum: ['json', 'yaml', 'both'], 1219 | description: 'Output format for rule set', 1220 | default: 'json', 1221 | }, 1222 | author: { 1223 | type: 'string', 1224 | description: 'Author of the rule set', 1225 | default: 'MCP ADR Analysis Server', 1226 | }, 1227 | }, 1228 | required: ['name'], 1229 | }, 1230 | }, 1231 | { 1232 | name: 'analyze_environment', 1233 | description: 1234 | 'Analyze environment context and provide optimization recommendations with optional memory integration for environment snapshot tracking', 1235 | inputSchema: { 1236 | type: 'object', 1237 | properties: { 1238 | projectPath: { 1239 | type: 'string', 1240 | description: 'Path to project directory', 1241 | default: '.', 1242 | }, 1243 | adrDirectory: { 1244 | type: 'string', 1245 | description: 'Directory containing ADR files', 1246 | default: 'docs/adrs', 1247 | }, 1248 | analysisType: { 1249 | type: 'string', 1250 | enum: [ 1251 | 'specs', 1252 | 'containerization', 1253 | 'requirements', 1254 | 'compliance', 1255 | 'comprehensive', 1256 | ], 1257 | description: 'Type of environment analysis to perform', 1258 | default: 'comprehensive', 1259 | }, 1260 | currentEnvironment: { 1261 | type: 'object', 1262 | description: 'Current environment specifications (for compliance analysis)', 1263 | }, 1264 | requirements: { 1265 | type: 'object', 1266 | description: 'Environment requirements (for compliance analysis)', 1267 | }, 1268 | industryStandards: { 1269 | type: 'array', 1270 | items: { type: 'string' }, 1271 | description: 'Industry standards to assess compliance against', 1272 | }, 1273 | enableMemoryIntegration: { 1274 | type: 'boolean', 1275 | description: 1276 | 'Enable memory entity storage for environment snapshot tracking and historical analysis', 1277 | default: true, 1278 | }, 1279 | enableTrendAnalysis: { 1280 | type: 'boolean', 1281 | description: 1282 | 'Enable analysis of environment changes over time using stored snapshots', 1283 | default: true, 1284 | }, 1285 | }, 1286 | }, 1287 | }, 1288 | { 1289 | name: 'generate_research_questions', 1290 | description: 1291 | 'Generate context-aware research questions and create research tracking system', 1292 | inputSchema: { 1293 | type: 'object', 1294 | properties: { 1295 | analysisType: { 1296 | type: 'string', 1297 | enum: ['correlation', 'relevance', 'questions', 'tracking', 'comprehensive'], 1298 | description: 'Type of research analysis to perform', 1299 | default: 'comprehensive', 1300 | }, 1301 | researchContext: { 1302 | type: 'object', 1303 | properties: { 1304 | topic: { type: 'string' }, 1305 | category: { type: 'string' }, 1306 | scope: { type: 'string' }, 1307 | objectives: { type: 'array', items: { type: 'string' } }, 1308 | constraints: { type: 'array', items: { type: 'string' } }, 1309 | timeline: { type: 'string' }, 1310 | }, 1311 | description: 'Research context and objectives', 1312 | }, 1313 | problems: { 1314 | type: 'array', 1315 | items: { 1316 | type: 'object', 1317 | properties: { 1318 | id: { type: 'string' }, 1319 | description: { type: 'string' }, 1320 | category: { type: 'string' }, 1321 | severity: { type: 'string' }, 1322 | context: { type: 'string' }, 1323 | }, 1324 | }, 1325 | description: 'Problems to correlate with knowledge graph', 1326 | }, 1327 | knowledgeGraph: { 1328 | type: 'object', 1329 | properties: { 1330 | technologies: { type: 'array', items: { type: 'object' } }, 1331 | patterns: { type: 'array', items: { type: 'object' } }, 1332 | adrs: { type: 'array', items: { type: 'object' } }, 1333 | relationships: { type: 'array', items: { type: 'object' } }, 1334 | }, 1335 | description: 'Architectural knowledge graph', 1336 | }, 1337 | relevantKnowledge: { 1338 | type: 'object', 1339 | properties: { 1340 | adrs: { type: 'array', items: { type: 'object' } }, 1341 | patterns: { type: 'array', items: { type: 'object' } }, 1342 | gaps: { type: 'array', items: { type: 'object' } }, 1343 | opportunities: { type: 'array', items: { type: 'object' } }, 1344 | }, 1345 | description: 'Relevant knowledge for question generation', 1346 | }, 1347 | researchQuestions: { 1348 | type: 'array', 1349 | items: { 1350 | type: 'object', 1351 | properties: { 1352 | id: { type: 'string' }, 1353 | question: { type: 'string' }, 1354 | type: { type: 'string' }, 1355 | priority: { type: 'string' }, 1356 | timeline: { type: 'string' }, 1357 | methodology: { type: 'string' }, 1358 | }, 1359 | }, 1360 | description: 'Research questions for task tracking', 1361 | }, 1362 | currentProgress: { 1363 | type: 'array', 1364 | items: { 1365 | type: 'object', 1366 | properties: { 1367 | questionId: { type: 'string' }, 1368 | status: { type: 'string' }, 1369 | progress: { type: 'number' }, 1370 | findings: { type: 'array', items: { type: 'string' } }, 1371 | blockers: { type: 'array', items: { type: 'string' } }, 1372 | }, 1373 | }, 1374 | description: 'Current research progress', 1375 | }, 1376 | projectPath: { 1377 | type: 'string', 1378 | description: 'Path to project directory', 1379 | default: '.', 1380 | }, 1381 | adrDirectory: { 1382 | type: 'string', 1383 | description: 'Directory containing ADR files', 1384 | default: 'docs/adrs', 1385 | }, 1386 | }, 1387 | }, 1388 | }, 1389 | { 1390 | name: 'perform_research', 1391 | description: 1392 | 'Perform research using cascading sources: project files → knowledge graph → environment resources → web search (fallback)', 1393 | inputSchema: { 1394 | type: 'object', 1395 | properties: { 1396 | question: { 1397 | type: 'string', 1398 | description: 'The research question to answer', 1399 | }, 1400 | projectPath: { 1401 | type: 'string', 1402 | description: 'Path to project directory', 1403 | default: '.', 1404 | }, 1405 | adrDirectory: { 1406 | type: 'string', 1407 | description: 'Directory containing ADR files', 1408 | default: 'docs/adrs', 1409 | }, 1410 | confidenceThreshold: { 1411 | type: 'number', 1412 | description: 'Minimum confidence threshold (0-1) before suggesting web search', 1413 | default: 0.6, 1414 | minimum: 0, 1415 | maximum: 1, 1416 | }, 1417 | performWebSearch: { 1418 | type: 'boolean', 1419 | description: 'Enable web search recommendations when confidence is low', 1420 | default: true, 1421 | }, 1422 | }, 1423 | required: ['question'], 1424 | }, 1425 | }, 1426 | { 1427 | name: 'llm_web_search', 1428 | description: 'LLM-managed web search using Firecrawl for cross-platform support', 1429 | inputSchema: { 1430 | type: 'object', 1431 | properties: { 1432 | query: { 1433 | type: 'string', 1434 | description: 'The search query to execute', 1435 | }, 1436 | maxResults: { 1437 | type: 'number', 1438 | description: 'Maximum results to return', 1439 | default: 5, 1440 | minimum: 1, 1441 | maximum: 20, 1442 | }, 1443 | includeContent: { 1444 | type: 'boolean', 1445 | description: 'Include full content in results', 1446 | default: true, 1447 | }, 1448 | llmInstructions: { 1449 | type: 'string', 1450 | description: 'LLM instructions for search optimization', 1451 | }, 1452 | projectPath: { 1453 | type: 'string', 1454 | description: 'Path to project directory', 1455 | default: '.', 1456 | }, 1457 | adrDirectory: { 1458 | type: 'string', 1459 | description: 'Directory containing ADR files', 1460 | default: 'docs/adrs', 1461 | }, 1462 | }, 1463 | required: ['query'], 1464 | }, 1465 | }, 1466 | { 1467 | name: 'llm_cloud_management', 1468 | description: 'LLM-managed cloud provider operations with research-driven approach', 1469 | inputSchema: { 1470 | type: 'object', 1471 | properties: { 1472 | provider: { 1473 | type: 'string', 1474 | enum: ['aws', 'azure', 'gcp', 'redhat', 'ubuntu', 'macos'], 1475 | description: 'Cloud provider to use', 1476 | }, 1477 | action: { 1478 | type: 'string', 1479 | description: 'Action to perform', 1480 | }, 1481 | parameters: { 1482 | type: 'object', 1483 | description: 'Action parameters', 1484 | }, 1485 | llmInstructions: { 1486 | type: 'string', 1487 | description: 'LLM instructions for command generation', 1488 | }, 1489 | researchFirst: { 1490 | type: 'boolean', 1491 | description: 'Research best approach first', 1492 | default: true, 1493 | }, 1494 | projectPath: { 1495 | type: 'string', 1496 | description: 'Path to project directory', 1497 | default: '.', 1498 | }, 1499 | adrDirectory: { 1500 | type: 'string', 1501 | description: 'Directory containing ADR files', 1502 | default: 'docs/adrs', 1503 | }, 1504 | }, 1505 | required: ['provider', 'action', 'llmInstructions'], 1506 | }, 1507 | }, 1508 | { 1509 | name: 'llm_database_management', 1510 | description: 'LLM-managed database operations with research-driven approach', 1511 | inputSchema: { 1512 | type: 'object', 1513 | properties: { 1514 | database: { 1515 | type: 'string', 1516 | enum: ['postgresql', 'mongodb', 'redis', 'mysql', 'mariadb'], 1517 | description: 'Database type to use', 1518 | }, 1519 | action: { 1520 | type: 'string', 1521 | description: 'Database action to perform', 1522 | }, 1523 | parameters: { 1524 | type: 'object', 1525 | description: 'Action parameters', 1526 | }, 1527 | llmInstructions: { 1528 | type: 'string', 1529 | description: 'LLM instructions for command generation', 1530 | }, 1531 | researchFirst: { 1532 | type: 'boolean', 1533 | description: 'Research best approach first', 1534 | default: true, 1535 | }, 1536 | projectPath: { 1537 | type: 'string', 1538 | description: 'Path to project directory', 1539 | default: '.', 1540 | }, 1541 | adrDirectory: { 1542 | type: 'string', 1543 | description: 'Directory containing ADR files', 1544 | default: 'docs/adrs', 1545 | }, 1546 | }, 1547 | required: ['database', 'action', 'llmInstructions'], 1548 | }, 1549 | }, 1550 | { 1551 | name: 'analyze_deployment_progress', 1552 | description: 'Analyze deployment progress and verify completion with outcome rules', 1553 | inputSchema: { 1554 | type: 'object', 1555 | properties: { 1556 | analysisType: { 1557 | type: 'string', 1558 | enum: ['tasks', 'cicd', 'progress', 'completion', 'comprehensive'], 1559 | description: 'Type of deployment analysis to perform', 1560 | default: 'comprehensive', 1561 | }, 1562 | adrDirectory: { 1563 | type: 'string', 1564 | description: 'Directory containing ADR files', 1565 | default: 'docs/adrs', 1566 | }, 1567 | todoPath: { 1568 | type: 'string', 1569 | description: 'Path to TODO.md file for task identification', 1570 | default: 'TODO.md', 1571 | }, 1572 | cicdLogs: { 1573 | type: 'string', 1574 | description: 'CI/CD pipeline logs for analysis', 1575 | }, 1576 | pipelineConfig: { 1577 | type: 'string', 1578 | description: 'CI/CD pipeline configuration', 1579 | }, 1580 | deploymentTasks: { 1581 | type: 'array', 1582 | items: { 1583 | type: 'object', 1584 | properties: { 1585 | taskId: { type: 'string' }, 1586 | taskName: { type: 'string' }, 1587 | status: { type: 'string' }, 1588 | progress: { type: 'number' }, 1589 | category: { type: 'string' }, 1590 | priority: { type: 'string' }, 1591 | verificationCriteria: { type: 'array', items: { type: 'string' } }, 1592 | expectedOutcome: { type: 'string' }, 1593 | }, 1594 | }, 1595 | description: 'Deployment tasks for progress calculation', 1596 | }, 1597 | outcomeRules: { 1598 | type: 'array', 1599 | items: { 1600 | type: 'object', 1601 | properties: { 1602 | ruleId: { type: 'string' }, 1603 | description: { type: 'string' }, 1604 | criteria: { type: 'array', items: { type: 'string' } }, 1605 | verificationMethod: { type: 'string' }, 1606 | }, 1607 | }, 1608 | description: 'Outcome rules for completion verification', 1609 | }, 1610 | actualOutcomes: { 1611 | type: 'array', 1612 | items: { 1613 | type: 'object', 1614 | properties: { 1615 | taskId: { type: 'string' }, 1616 | outcome: { type: 'string' }, 1617 | evidence: { type: 'array', items: { type: 'string' } }, 1618 | timestamp: { type: 'string' }, 1619 | }, 1620 | }, 1621 | description: 'Actual deployment outcomes', 1622 | }, 1623 | cicdStatus: { 1624 | type: 'object', 1625 | description: 'CI/CD pipeline status data', 1626 | }, 1627 | environmentStatus: { 1628 | type: 'object', 1629 | description: 'Environment status data', 1630 | }, 1631 | }, 1632 | }, 1633 | }, 1634 | { 1635 | name: 'check_ai_execution_status', 1636 | description: 1637 | 'Check AI execution configuration and status for debugging prompt-only mode issues', 1638 | inputSchema: { 1639 | type: 'object', 1640 | properties: {}, 1641 | required: [], 1642 | }, 1643 | }, 1644 | { 1645 | name: 'get_workflow_guidance', 1646 | description: 1647 | 'Get intelligent workflow guidance and tool recommendations based on your goals and project context to achieve expected outcomes efficiently', 1648 | inputSchema: { 1649 | type: 'object', 1650 | properties: { 1651 | goal: { 1652 | type: 'string', 1653 | description: 1654 | 'What you want to accomplish (e.g., "analyze new project", "document existing decisions", "security audit", "modernize legacy system")', 1655 | }, 1656 | projectContext: { 1657 | type: 'string', 1658 | description: 1659 | 'Current state of your project (e.g., "new project", "existing project with ADRs", "legacy codebase", "greenfield development")', 1660 | enum: [ 1661 | 'new_project', 1662 | 'existing_with_adrs', 1663 | 'existing_without_adrs', 1664 | 'legacy_codebase', 1665 | 'greenfield', 1666 | 'maintenance_mode', 1667 | 'unknown', 1668 | ], 1669 | }, 1670 | availableAssets: { 1671 | type: 'array', 1672 | items: { type: 'string' }, 1673 | description: 1674 | 'What assets you already have (e.g., ["PRD.md", "existing ADRs", "codebase", "documentation", "test suite"])', 1675 | }, 1676 | timeframe: { 1677 | type: 'string', 1678 | description: 'Available time/effort level', 1679 | enum: [ 1680 | 'quick_analysis', 1681 | 'thorough_review', 1682 | 'comprehensive_audit', 1683 | 'ongoing_process', 1684 | ], 1685 | }, 1686 | primaryConcerns: { 1687 | type: 'array', 1688 | items: { type: 'string' }, 1689 | description: 1690 | 'Main areas of concern (e.g., ["security", "performance", "maintainability", "scalability", "compliance"])', 1691 | }, 1692 | }, 1693 | required: ['goal', 'projectContext'], 1694 | }, 1695 | }, 1696 | { 1697 | name: 'get_development_guidance', 1698 | description: 1699 | 'Get comprehensive development guidance that translates architectural decisions and workflow recommendations into specific coding tasks, implementation patterns, and development roadmap', 1700 | inputSchema: { 1701 | type: 'object', 1702 | properties: { 1703 | developmentPhase: { 1704 | type: 'string', 1705 | description: 'Current development phase', 1706 | enum: [ 1707 | 'planning', 1708 | 'setup', 1709 | 'implementation', 1710 | 'testing', 1711 | 'deployment', 1712 | 'maintenance', 1713 | 'refactoring', 1714 | ], 1715 | }, 1716 | adrsToImplement: { 1717 | type: 'array', 1718 | items: { type: 'string' }, 1719 | description: 1720 | 'List of ADR titles or file paths that need to be implemented in code', 1721 | }, 1722 | technologyStack: { 1723 | type: 'array', 1724 | items: { type: 'string' }, 1725 | description: 1726 | 'Current technology stack (e.g., ["TypeScript", "React", "Node.js", "PostgreSQL", "Docker"])', 1727 | }, 1728 | currentProgress: { 1729 | type: 'string', 1730 | description: 'What has already been implemented or current state of development', 1731 | }, 1732 | teamContext: { 1733 | type: 'object', 1734 | properties: { 1735 | size: { 1736 | type: 'string', 1737 | enum: ['solo', 'small_team', 'medium_team', 'large_team'], 1738 | }, 1739 | experienceLevel: { 1740 | type: 'string', 1741 | enum: ['junior', 'mixed', 'senior', 'expert'], 1742 | }, 1743 | }, 1744 | }, 1745 | timeline: { 1746 | type: 'string', 1747 | description: 'Development timeline or deadline constraints', 1748 | }, 1749 | focusAreas: { 1750 | type: 'array', 1751 | items: { type: 'string' }, 1752 | description: 1753 | 'Specific areas to focus on (e.g., ["API design", "database schema", "testing strategy", "deployment pipeline"])', 1754 | }, 1755 | }, 1756 | required: ['developmentPhase'], 1757 | }, 1758 | }, 1759 | { 1760 | name: 'list_roots', 1761 | description: 1762 | 'List available file system roots that can be accessed. Use this to discover what directories are available before reading files.', 1763 | inputSchema: { 1764 | type: 'object', 1765 | properties: {}, 1766 | }, 1767 | }, 1768 | { 1769 | name: 'read_directory', 1770 | description: 1771 | 'List files and folders in a directory. Use this to explore the file structure within accessible roots.', 1772 | inputSchema: { 1773 | type: 'object', 1774 | properties: { 1775 | path: { 1776 | type: 'string', 1777 | description: 1778 | 'Directory path to list (relative to project root or absolute within roots)', 1779 | }, 1780 | }, 1781 | required: ['path'], 1782 | }, 1783 | }, 1784 | { 1785 | name: 'read_file', 1786 | description: 'Read contents of a file', 1787 | inputSchema: { 1788 | type: 'object', 1789 | properties: { 1790 | path: { 1791 | type: 'string', 1792 | description: 'Path to the file to read', 1793 | }, 1794 | }, 1795 | required: ['path'], 1796 | }, 1797 | }, 1798 | { 1799 | name: 'write_file', 1800 | description: 'Write content to a file', 1801 | inputSchema: { 1802 | type: 'object', 1803 | properties: { 1804 | path: { 1805 | type: 'string', 1806 | description: 'Path to the file to write', 1807 | }, 1808 | content: { 1809 | type: 'string', 1810 | description: 'Content to write to the file', 1811 | }, 1812 | }, 1813 | required: ['path', 'content'], 1814 | }, 1815 | }, 1816 | { 1817 | name: 'list_directory', 1818 | description: 'List contents of a directory', 1819 | inputSchema: { 1820 | type: 'object', 1821 | properties: { 1822 | path: { 1823 | type: 'string', 1824 | description: 'Path to the directory to list', 1825 | }, 1826 | }, 1827 | required: ['path'], 1828 | }, 1829 | }, 1830 | { 1831 | name: 'generate_deployment_guidance', 1832 | description: 1833 | 'Generate deployment guidance and instructions from ADRs with environment-specific configurations', 1834 | inputSchema: { 1835 | type: 'object', 1836 | properties: { 1837 | adrDirectory: { 1838 | type: 'string', 1839 | default: 'docs/adrs', 1840 | description: 'Directory containing ADR files', 1841 | }, 1842 | environment: { 1843 | type: 'string', 1844 | enum: ['development', 'staging', 'production', 'all'], 1845 | default: 'production', 1846 | description: 'Target deployment environment', 1847 | }, 1848 | format: { 1849 | type: 'string', 1850 | enum: ['markdown', 'scripts', 'structured', 'all'], 1851 | default: 'markdown', 1852 | description: 'Output format for guidance', 1853 | }, 1854 | projectPath: { 1855 | type: 'string', 1856 | description: 1857 | 'Project root path (optional, uses configured PROJECT_PATH if not provided)', 1858 | }, 1859 | includeScripts: { 1860 | type: 'boolean', 1861 | default: true, 1862 | description: 'Generate deployment scripts', 1863 | }, 1864 | includeConfigs: { 1865 | type: 'boolean', 1866 | default: true, 1867 | description: 'Generate configuration files', 1868 | }, 1869 | includeValidation: { 1870 | type: 'boolean', 1871 | default: true, 1872 | description: 'Include validation and health checks', 1873 | }, 1874 | technologyFilter: { 1875 | type: 'array', 1876 | items: { 1877 | type: 'string', 1878 | enum: [ 1879 | 'containerization', 1880 | 'database', 1881 | 'web-server', 1882 | 'cache', 1883 | 'message-queue', 1884 | 'monitoring', 1885 | 'security', 1886 | 'ci-cd', 1887 | 'infrastructure', 1888 | ], 1889 | }, 1890 | description: 'Filter by specific technology categories', 1891 | }, 1892 | customRequirements: { 1893 | type: 'array', 1894 | items: { type: 'string' }, 1895 | description: 'Additional custom requirements', 1896 | }, 1897 | includeRollback: { 1898 | type: 'boolean', 1899 | default: true, 1900 | description: 'Include rollback procedures', 1901 | }, 1902 | generateFiles: { 1903 | type: 'boolean', 1904 | default: false, 1905 | description: 'Actually generate files (vs just guidance)', 1906 | }, 1907 | }, 1908 | required: [], 1909 | }, 1910 | }, 1911 | { 1912 | name: 'smart_git_push', 1913 | description: 1914 | 'AI-driven security-focused git push with credential detection, file filtering, and deployment metrics tracking. Tests should be run by calling AI and results provided.', 1915 | inputSchema: { 1916 | type: 'object', 1917 | properties: { 1918 | branch: { 1919 | type: 'string', 1920 | description: 1921 | 'Target branch for push (optional, uses current branch if not specified)', 1922 | }, 1923 | message: { 1924 | type: 'string', 1925 | description: 'Commit message (optional, commits staged files if provided)', 1926 | }, 1927 | testResults: { 1928 | type: 'object', 1929 | description: 1930 | 'Test results from AI-executed tests (required for proper deployment tracking)', 1931 | properties: { 1932 | success: { 1933 | type: 'boolean', 1934 | description: 'Whether all tests passed', 1935 | }, 1936 | testsRun: { 1937 | type: 'number', 1938 | description: 'Total number of tests executed', 1939 | }, 1940 | testsPassed: { 1941 | type: 'number', 1942 | description: 'Number of tests that passed', 1943 | }, 1944 | testsFailed: { 1945 | type: 'number', 1946 | description: 'Number of tests that failed', 1947 | }, 1948 | duration: { 1949 | type: 'number', 1950 | description: 'Test execution duration in seconds', 1951 | }, 1952 | command: { 1953 | type: 'string', 1954 | description: 'Test command that was executed by AI', 1955 | }, 1956 | output: { 1957 | type: 'string', 1958 | description: 'Test execution output', 1959 | }, 1960 | failureDetails: { 1961 | type: 'array', 1962 | items: { type: 'string' }, 1963 | description: 'Details of test failures', 1964 | }, 1965 | testTypes: { 1966 | type: 'object', 1967 | description: 'Results broken down by test type (unit, integration, etc.)', 1968 | additionalProperties: { 1969 | type: 'object', 1970 | properties: { 1971 | passed: { type: 'number' }, 1972 | failed: { type: 'number' }, 1973 | }, 1974 | }, 1975 | }, 1976 | }, 1977 | required: ['success', 'testsRun', 'testsPassed', 'testsFailed'], 1978 | }, 1979 | skipSecurity: { 1980 | type: 'boolean', 1981 | default: false, 1982 | description: 'Skip security scanning (NOT RECOMMENDED)', 1983 | }, 1984 | dryRun: { 1985 | type: 'boolean', 1986 | default: false, 1987 | description: 'Show what would be pushed without actually pushing', 1988 | }, 1989 | projectPath: { 1990 | type: 'string', 1991 | description: 'Path to project directory (defaults to current working directory)', 1992 | }, 1993 | forceUnsafe: { 1994 | type: 'boolean', 1995 | default: false, 1996 | description: 'Override security blocks and test failures (DANGEROUS)', 1997 | }, 1998 | }, 1999 | }, 2000 | }, 2001 | { 2002 | name: 'deployment_readiness', 2003 | description: 2004 | 'Comprehensive deployment readiness validation with test failure tracking, deployment history analysis, and hard blocking for unsafe deployments. Integrates with smart_git_push for deployment gating.', 2005 | inputSchema: { 2006 | type: 'object', 2007 | properties: { 2008 | operation: { 2009 | type: 'string', 2010 | enum: [ 2011 | 'check_readiness', 2012 | 'validate_production', 2013 | 'test_validation', 2014 | 'deployment_history', 2015 | 'full_audit', 2016 | 'emergency_override', 2017 | ], 2018 | description: 'Type of deployment readiness check to perform', 2019 | }, 2020 | projectPath: { 2021 | type: 'string', 2022 | description: 'Path to project directory (defaults to current working directory)', 2023 | }, 2024 | targetEnvironment: { 2025 | type: 'string', 2026 | enum: ['staging', 'production', 'integration'], 2027 | default: 'production', 2028 | description: 'Target deployment environment', 2029 | }, 2030 | strictMode: { 2031 | type: 'boolean', 2032 | default: true, 2033 | description: 'Enable strict validation (recommended for production)', 2034 | }, 2035 | allowMockCode: { 2036 | type: 'boolean', 2037 | default: false, 2038 | description: 'Allow mock code in deployment (NOT RECOMMENDED)', 2039 | }, 2040 | productionCodeThreshold: { 2041 | type: 'number', 2042 | default: 85, 2043 | description: 'Minimum production code quality score (0-100)', 2044 | }, 2045 | mockCodeMaxAllowed: { 2046 | type: 'number', 2047 | default: 0, 2048 | description: 'Maximum mock code indicators allowed', 2049 | }, 2050 | maxTestFailures: { 2051 | type: 'number', 2052 | default: 0, 2053 | description: 'Maximum test failures allowed (0 = zero tolerance)', 2054 | }, 2055 | requireTestCoverage: { 2056 | type: 'number', 2057 | default: 80, 2058 | description: 'Minimum test coverage percentage required', 2059 | }, 2060 | blockOnFailingTests: { 2061 | type: 'boolean', 2062 | default: true, 2063 | description: 'Block deployment if tests are failing', 2064 | }, 2065 | testSuiteRequired: { 2066 | type: 'array', 2067 | items: { type: 'string' }, 2068 | default: [], 2069 | description: 'Required test suites that must pass', 2070 | }, 2071 | maxRecentFailures: { 2072 | type: 'number', 2073 | default: 2, 2074 | description: 'Maximum recent deployment failures allowed', 2075 | }, 2076 | deploymentSuccessThreshold: { 2077 | type: 'number', 2078 | default: 80, 2079 | description: 'Minimum deployment success rate required (%)', 2080 | }, 2081 | blockOnRecentFailures: { 2082 | type: 'boolean', 2083 | default: true, 2084 | description: 'Block if recent deployments failed', 2085 | }, 2086 | rollbackFrequencyThreshold: { 2087 | type: 'number', 2088 | default: 20, 2089 | description: 'Maximum rollback frequency allowed (%)', 2090 | }, 2091 | requireAdrCompliance: { 2092 | type: 'boolean', 2093 | default: true, 2094 | description: 'Require ADR compliance validation', 2095 | }, 2096 | integrateTodoTasks: { 2097 | type: 'boolean', 2098 | default: true, 2099 | description: 'Auto-create blocking tasks for issues', 2100 | }, 2101 | updateHealthScoring: { 2102 | type: 'boolean', 2103 | default: true, 2104 | description: 'Update project health scores', 2105 | }, 2106 | triggerSmartGitPush: { 2107 | type: 'boolean', 2108 | default: false, 2109 | description: 'Trigger smart git push validation', 2110 | }, 2111 | emergencyBypass: { 2112 | type: 'boolean', 2113 | default: false, 2114 | description: 'Emergency bypass for critical fixes', 2115 | }, 2116 | businessJustification: { 2117 | type: 'string', 2118 | description: 2119 | 'Business justification for overrides (required for emergency_override)', 2120 | }, 2121 | approvalRequired: { 2122 | type: 'boolean', 2123 | default: true, 2124 | description: 'Require approval for overrides', 2125 | }, 2126 | enableMemoryIntegration: { 2127 | type: 'boolean', 2128 | description: 2129 | 'Enable memory entity storage for deployment assessment tracking and historical analysis', 2130 | default: true, 2131 | }, 2132 | migrateExistingHistory: { 2133 | type: 'boolean', 2134 | description: 'Migrate existing JSON-based deployment history to memory entities', 2135 | default: true, 2136 | }, 2137 | }, 2138 | required: ['operation'], 2139 | }, 2140 | }, 2141 | { 2142 | name: 'troubleshoot_guided_workflow', 2143 | description: 2144 | 'Structured failure analysis and test plan generation with memory integration for troubleshooting session tracking and intelligent ADR/research suggestion capabilities - provide JSON failure info to get specific test commands', 2145 | inputSchema: { 2146 | type: 'object', 2147 | properties: { 2148 | operation: { 2149 | type: 'string', 2150 | enum: ['analyze_failure', 'generate_test_plan', 'full_workflow'], 2151 | description: 'Type of troubleshooting operation', 2152 | }, 2153 | failure: { 2154 | type: 'object', 2155 | properties: { 2156 | failureType: { 2157 | type: 'string', 2158 | enum: [ 2159 | 'test_failure', 2160 | 'deployment_failure', 2161 | 'build_failure', 2162 | 'runtime_error', 2163 | 'performance_issue', 2164 | 'security_issue', 2165 | 'other', 2166 | ], 2167 | description: 'Type of failure', 2168 | }, 2169 | failureDetails: { 2170 | type: 'object', 2171 | properties: { 2172 | command: { 2173 | type: 'string', 2174 | description: 'Command that failed (optional)', 2175 | }, 2176 | exitCode: { 2177 | type: 'number', 2178 | description: 'Exit code of failed process (optional)', 2179 | }, 2180 | errorMessage: { 2181 | type: 'string', 2182 | description: 'Primary error message', 2183 | }, 2184 | stackTrace: { 2185 | type: 'string', 2186 | description: 'Stack trace if available (optional)', 2187 | }, 2188 | logOutput: { 2189 | type: 'string', 2190 | description: 'Relevant log output (optional)', 2191 | }, 2192 | environment: { 2193 | type: 'string', 2194 | description: 'Environment where failure occurred (optional)', 2195 | }, 2196 | timestamp: { 2197 | type: 'string', 2198 | description: 'When the failure occurred (optional)', 2199 | }, 2200 | affectedFiles: { 2201 | type: 'array', 2202 | items: { type: 'string' }, 2203 | description: 'Files involved in the failure (optional)', 2204 | }, 2205 | }, 2206 | required: ['errorMessage'], 2207 | description: 'Detailed failure information', 2208 | }, 2209 | context: { 2210 | type: 'object', 2211 | properties: { 2212 | recentChanges: { 2213 | type: 'string', 2214 | description: 'Recent changes that might be related (optional)', 2215 | }, 2216 | reproducible: { 2217 | type: 'boolean', 2218 | description: 'Whether the failure is reproducible (optional)', 2219 | }, 2220 | frequency: { 2221 | type: 'string', 2222 | description: 'How often this failure occurs (optional)', 2223 | }, 2224 | impact: { 2225 | type: 'string', 2226 | enum: ['low', 'medium', 'high', 'critical'], 2227 | description: 'Impact level of the failure (optional)', 2228 | }, 2229 | }, 2230 | description: 'Additional context about the failure (optional)', 2231 | }, 2232 | }, 2233 | required: ['failureType', 'failureDetails'], 2234 | description: 2235 | 'Structured failure information (required for analyze_failure and generate_test_plan)', 2236 | }, 2237 | projectPath: { 2238 | type: 'string', 2239 | description: 'Path to project directory (optional)', 2240 | }, 2241 | adrDirectory: { 2242 | type: 'string', 2243 | description: 'ADR directory path', 2244 | default: 'docs/adrs', 2245 | }, 2246 | todoPath: { 2247 | type: 'string', 2248 | description: 'Path to TODO.md file', 2249 | default: 'TODO.md', 2250 | }, 2251 | enableMemoryIntegration: { 2252 | type: 'boolean', 2253 | description: 2254 | 'Enable memory entity storage for troubleshooting session tracking and pattern recognition', 2255 | default: true, 2256 | }, 2257 | enablePatternRecognition: { 2258 | type: 'boolean', 2259 | description: 'Enable automatic pattern recognition and failure classification', 2260 | default: true, 2261 | }, 2262 | enableAdrSuggestion: { 2263 | type: 'boolean', 2264 | description: 'Enable automatic ADR suggestion based on recurring failures', 2265 | default: true, 2266 | }, 2267 | enableResearchGeneration: { 2268 | type: 'boolean', 2269 | description: 2270 | 'Enable automatic research question generation for persistent problems', 2271 | default: true, 2272 | }, 2273 | conversationContext: CONVERSATION_CONTEXT_SCHEMA, 2274 | }, 2275 | required: ['operation'], 2276 | }, 2277 | }, 2278 | { 2279 | name: 'smart_score', 2280 | description: 2281 | 'Central coordination for project health scoring system - recalculate, sync, diagnose, optimize, and reset scores across all MCP tools', 2282 | inputSchema: { 2283 | type: 'object', 2284 | properties: { 2285 | operation: { 2286 | type: 'string', 2287 | enum: [ 2288 | 'recalculate_scores', 2289 | 'sync_scores', 2290 | 'diagnose_scores', 2291 | 'optimize_weights', 2292 | 'reset_scores', 2293 | 'get_score_trends', 2294 | 'get_intent_scores', 2295 | ], 2296 | description: 'Smart scoring operation to perform', 2297 | }, 2298 | projectPath: { 2299 | type: 'string', 2300 | description: 'Path to project directory', 2301 | }, 2302 | components: { 2303 | type: 'array', 2304 | items: { 2305 | type: 'string', 2306 | enum: [ 2307 | 'task_completion', 2308 | 'deployment_readiness', 2309 | 'architecture_compliance', 2310 | 'security_posture', 2311 | 'code_quality', 2312 | 'all', 2313 | ], 2314 | }, 2315 | default: ['all'], 2316 | description: 'Score components to recalculate (for recalculate_scores operation)', 2317 | }, 2318 | forceUpdate: { 2319 | type: 'boolean', 2320 | default: false, 2321 | description: 'Force update even if data is fresh', 2322 | }, 2323 | updateSources: { 2324 | type: 'boolean', 2325 | default: true, 2326 | description: 'Trigger source tool updates before recalculating', 2327 | }, 2328 | todoPath: { 2329 | type: 'string', 2330 | default: 'TODO.md', 2331 | description: 'Path to TODO.md file (for sync_scores operation)', 2332 | }, 2333 | triggerTools: { 2334 | type: 'array', 2335 | items: { 2336 | type: 'string', 2337 | enum: [ 2338 | 'smart_git_push', 2339 | 'compare_adr_progress', 2340 | 'analyze_content_security', 2341 | 'validate_rules', 2342 | ], 2343 | }, 2344 | description: 'Tools to trigger for fresh data (for sync_scores operation)', 2345 | }, 2346 | rebalanceWeights: { 2347 | type: 'boolean', 2348 | default: false, 2349 | description: 'Recalculate optimal scoring weights (for sync_scores operation)', 2350 | }, 2351 | includeHistory: { 2352 | type: 'boolean', 2353 | default: true, 2354 | description: 'Include score history analysis (for diagnose_scores operation)', 2355 | }, 2356 | checkDataFreshness: { 2357 | type: 'boolean', 2358 | default: true, 2359 | description: 2360 | 'Validate data freshness across tools (for diagnose_scores operation)', 2361 | }, 2362 | suggestImprovements: { 2363 | type: 'boolean', 2364 | default: true, 2365 | description: 2366 | 'Provide score improvement suggestions (for diagnose_scores operation)', 2367 | }, 2368 | analysisMode: { 2369 | type: 'string', 2370 | enum: ['current_state', 'historical_data', 'project_type'], 2371 | default: 'current_state', 2372 | description: 'Method for weight optimization (for optimize_weights operation)', 2373 | }, 2374 | customWeights: { 2375 | type: 'object', 2376 | properties: { 2377 | taskCompletion: { type: 'number', minimum: 0, maximum: 1 }, 2378 | deploymentReadiness: { type: 'number', minimum: 0, maximum: 1 }, 2379 | architectureCompliance: { type: 'number', minimum: 0, maximum: 1 }, 2380 | securityPosture: { type: 'number', minimum: 0, maximum: 1 }, 2381 | codeQuality: { type: 'number', minimum: 0, maximum: 1 }, 2382 | }, 2383 | description: 'Custom weight overrides (for optimize_weights operation)', 2384 | }, 2385 | previewOnly: { 2386 | type: 'boolean', 2387 | default: false, 2388 | description: 'Preview changes without applying (for optimize_weights operation)', 2389 | }, 2390 | component: { 2391 | type: 'string', 2392 | enum: [ 2393 | 'task_completion', 2394 | 'deployment_readiness', 2395 | 'architecture_compliance', 2396 | 'security_posture', 2397 | 'code_quality', 2398 | 'all', 2399 | ], 2400 | default: 'all', 2401 | description: 'Score component to reset (for reset_scores operation)', 2402 | }, 2403 | preserveHistory: { 2404 | type: 'boolean', 2405 | default: true, 2406 | description: 'Preserve score history in backup (for reset_scores operation)', 2407 | }, 2408 | recalculateAfterReset: { 2409 | type: 'boolean', 2410 | default: true, 2411 | description: 'Immediately recalculate after reset (for reset_scores operation)', 2412 | }, 2413 | intentId: { 2414 | type: 'string', 2415 | description: 2416 | 'Intent ID to get score trends for (for get_intent_scores operation)', 2417 | }, 2418 | }, 2419 | required: ['operation', 'projectPath'], 2420 | }, 2421 | }, 2422 | { 2423 | name: 'mcp_planning', 2424 | description: 2425 | 'Enhanced project planning and workflow management tool - phase-based project management, team resource allocation, progress tracking, risk analysis, and executive reporting', 2426 | inputSchema: { 2427 | type: 'object', 2428 | properties: { 2429 | operation: { 2430 | type: 'string', 2431 | enum: [ 2432 | 'create_project', 2433 | 'manage_phases', 2434 | 'track_progress', 2435 | 'manage_resources', 2436 | 'risk_analysis', 2437 | 'generate_reports', 2438 | ], 2439 | description: 'Project planning operation to perform', 2440 | }, 2441 | projectPath: { 2442 | type: 'string', 2443 | description: 'Project root path', 2444 | }, 2445 | projectName: { 2446 | type: 'string', 2447 | description: 'Project name (for create_project operation)', 2448 | }, 2449 | description: { 2450 | type: 'string', 2451 | description: 'Project description (for create_project operation)', 2452 | }, 2453 | phases: { 2454 | type: 'array', 2455 | items: { 2456 | type: 'object', 2457 | properties: { 2458 | name: { type: 'string' }, 2459 | duration: { type: 'string' }, 2460 | dependencies: { 2461 | type: 'array', 2462 | items: { type: 'string' }, 2463 | default: [], 2464 | }, 2465 | milestones: { 2466 | type: 'array', 2467 | items: { type: 'string' }, 2468 | default: [], 2469 | }, 2470 | }, 2471 | required: ['name', 'duration'], 2472 | }, 2473 | description: 'Initial project phases (for create_project operation)', 2474 | }, 2475 | team: { 2476 | type: 'array', 2477 | items: { 2478 | type: 'object', 2479 | properties: { 2480 | name: { type: 'string' }, 2481 | role: { type: 'string' }, 2482 | skills: { 2483 | type: 'array', 2484 | items: { type: 'string' }, 2485 | default: [], 2486 | }, 2487 | capacity: { type: 'string' }, 2488 | }, 2489 | required: ['name', 'role', 'capacity'], 2490 | }, 2491 | default: [], 2492 | description: 'Team structure (for create_project operation)', 2493 | }, 2494 | importFromAdrs: { 2495 | type: 'boolean', 2496 | default: true, 2497 | description: 'Import phases from existing ADRs (for create_project operation)', 2498 | }, 2499 | importFromTodos: { 2500 | type: 'boolean', 2501 | default: true, 2502 | description: 'Import tasks from TODO system (for create_project operation)', 2503 | }, 2504 | action: { 2505 | type: 'string', 2506 | enum: [ 2507 | 'list', 2508 | 'create', 2509 | 'update', 2510 | 'delete', 2511 | 'transition', 2512 | 'add', 2513 | 'remove', 2514 | 'allocate', 2515 | 'optimize', 2516 | ], 2517 | description: 'Management action (for manage_phases/manage_resources operations)', 2518 | }, 2519 | phaseId: { 2520 | type: 'string', 2521 | description: 'Phase ID for phase operations', 2522 | }, 2523 | phaseData: { 2524 | type: 'object', 2525 | properties: { 2526 | name: { type: 'string' }, 2527 | description: { type: 'string' }, 2528 | estimatedDuration: { type: 'string' }, 2529 | dependencies: { 2530 | type: 'array', 2531 | items: { type: 'string' }, 2532 | }, 2533 | milestones: { 2534 | type: 'array', 2535 | items: { type: 'string' }, 2536 | }, 2537 | linkedAdrs: { 2538 | type: 'array', 2539 | items: { type: 'string' }, 2540 | }, 2541 | }, 2542 | description: 'Phase data for create/update operations', 2543 | }, 2544 | targetStatus: { 2545 | type: 'string', 2546 | enum: ['planning', 'active', 'completed', 'blocked', 'cancelled'], 2547 | description: 'Target status for phase transition', 2548 | }, 2549 | reportType: { 2550 | type: 'string', 2551 | enum: [ 2552 | 'summary', 2553 | 'detailed', 2554 | 'gantt', 2555 | 'milestones', 2556 | 'risks', 2557 | 'executive', 2558 | 'status', 2559 | 'health', 2560 | 'team_performance', 2561 | 'milestone_tracking', 2562 | ], 2563 | default: 'summary', 2564 | description: 'Type of progress report or generated report', 2565 | }, 2566 | timeframe: { 2567 | type: 'string', 2568 | enum: [ 2569 | 'current', 2570 | 'weekly', 2571 | 'monthly', 2572 | 'quarterly', 2573 | 'week', 2574 | 'month', 2575 | 'quarter', 2576 | 'project', 2577 | ], 2578 | default: 'current', 2579 | description: 'Time frame for reports and tracking', 2580 | }, 2581 | includeVisuals: { 2582 | type: 'boolean', 2583 | default: true, 2584 | description: 'Include visual progress indicators', 2585 | }, 2586 | updateTaskProgress: { 2587 | type: 'boolean', 2588 | default: true, 2589 | description: 'Sync progress from TODO system', 2590 | }, 2591 | memberId: { 2592 | type: 'string', 2593 | description: 'Team member ID for resource operations', 2594 | }, 2595 | memberData: { 2596 | type: 'object', 2597 | properties: { 2598 | name: { type: 'string' }, 2599 | role: { type: 'string' }, 2600 | skills: { 2601 | type: 'array', 2602 | items: { type: 'string' }, 2603 | }, 2604 | capacity: { type: 'string' }, 2605 | }, 2606 | description: 'Team member data for resource operations', 2607 | }, 2608 | allocationData: { 2609 | type: 'object', 2610 | properties: { 2611 | phaseId: { type: 'string' }, 2612 | allocation: { 2613 | type: 'number', 2614 | minimum: 0, 2615 | maximum: 100, 2616 | }, 2617 | }, 2618 | required: ['phaseId', 'allocation'], 2619 | description: 'Resource allocation data', 2620 | }, 2621 | analysisType: { 2622 | type: 'string', 2623 | enum: ['automated', 'manual', 'comprehensive'], 2624 | default: 'comprehensive', 2625 | description: 'Type of risk analysis', 2626 | }, 2627 | includeAdrRisks: { 2628 | type: 'boolean', 2629 | default: true, 2630 | description: 'Analyze risks from ADR complexity', 2631 | }, 2632 | includeDependencyRisks: { 2633 | type: 'boolean', 2634 | default: true, 2635 | description: 'Analyze dependency chain risks', 2636 | }, 2637 | includeResourceRisks: { 2638 | type: 'boolean', 2639 | default: true, 2640 | description: 'Analyze resource allocation risks', 2641 | }, 2642 | generateMitigation: { 2643 | type: 'boolean', 2644 | default: true, 2645 | description: 'Generate mitigation strategies', 2646 | }, 2647 | format: { 2648 | type: 'string', 2649 | enum: ['markdown', 'json', 'html'], 2650 | default: 'markdown', 2651 | description: 'Report output format', 2652 | }, 2653 | includeCharts: { 2654 | type: 'boolean', 2655 | default: true, 2656 | description: 'Include progress charts and graphs', 2657 | }, 2658 | }, 2659 | required: ['operation', 'projectPath'], 2660 | }, 2661 | }, 2662 | { 2663 | name: 'interactive_adr_planning', 2664 | description: 2665 | 'Interactive guided ADR planning and creation tool - walks users through structured decision-making process with research integration, option evaluation, and automatic ADR generation. TIP: Start by reading @.mcp-server-context.md to understand project context and previous decisions.', 2666 | inputSchema: { 2667 | type: 'object', 2668 | properties: { 2669 | operation: { 2670 | type: 'string', 2671 | enum: [ 2672 | 'start_session', 2673 | 'continue_session', 2674 | 'provide_input', 2675 | 'request_research', 2676 | 'evaluate_options', 2677 | 'make_decision', 2678 | 'assess_impact', 2679 | 'plan_implementation', 2680 | 'generate_adr', 2681 | 'update_todos', 2682 | 'get_guidance', 2683 | 'save_session', 2684 | 'complete_session', 2685 | ], 2686 | description: 'Interactive planning operation to perform', 2687 | }, 2688 | sessionId: { 2689 | type: 'string', 2690 | description: 2691 | 'Planning session ID (required for all operations except start_session)', 2692 | }, 2693 | input: { 2694 | type: 'string', 2695 | description: 'User input for the current phase (varies by phase)', 2696 | }, 2697 | projectPath: { 2698 | type: 'string', 2699 | description: 'Project root path', 2700 | }, 2701 | autoResearch: { 2702 | type: 'boolean', 2703 | default: true, 2704 | description: 'Automatically trigger research when needed', 2705 | }, 2706 | generateTodos: { 2707 | type: 'boolean', 2708 | default: true, 2709 | description: 'Automatically generate TODO items from decisions', 2710 | }, 2711 | }, 2712 | required: ['operation', 'projectPath'], 2713 | }, 2714 | }, 2715 | { 2716 | name: 'memory_loading', 2717 | description: 2718 | 'Advanced memory loading tool for the memory-centric architecture. Query, explore, and manage memory entities and relationships. Load ADRs into memory system and perform intelligent queries.', 2719 | inputSchema: { 2720 | type: 'object', 2721 | properties: { 2722 | action: { 2723 | type: 'string', 2724 | enum: [ 2725 | 'load_adrs', 2726 | 'query_entities', 2727 | 'get_entity', 2728 | 'find_related', 2729 | 'get_intelligence', 2730 | 'create_snapshot', 2731 | ], 2732 | description: 'Memory operation to perform', 2733 | default: 'query_entities', 2734 | }, 2735 | query: { 2736 | type: 'object', 2737 | properties: { 2738 | entityTypes: { 2739 | type: 'array', 2740 | items: { 2741 | type: 'string', 2742 | enum: [ 2743 | 'architectural_decision', 2744 | 'code_component', 2745 | 'business_requirement', 2746 | 'technical_constraint', 2747 | 'quality_concern', 2748 | 'implementation_pattern', 2749 | 'environmental_factor', 2750 | 'stakeholder_input', 2751 | 'knowledge_artifact', 2752 | 'decision_context', 2753 | ], 2754 | }, 2755 | description: 'Filter by entity types', 2756 | }, 2757 | tags: { 2758 | type: 'array', 2759 | items: { type: 'string' }, 2760 | description: 'Filter by tags', 2761 | }, 2762 | textQuery: { 2763 | type: 'string', 2764 | description: 'Full-text search query', 2765 | }, 2766 | relationshipTypes: { 2767 | type: 'array', 2768 | items: { 2769 | type: 'string', 2770 | enum: [ 2771 | 'depends_on', 2772 | 'influences', 2773 | 'conflicts_with', 2774 | 'implements', 2775 | 'supersedes', 2776 | 'relates_to', 2777 | 'originated_from', 2778 | 'impacts', 2779 | 'constrains', 2780 | ], 2781 | }, 2782 | description: 'Filter by relationship types', 2783 | }, 2784 | confidenceThreshold: { 2785 | type: 'number', 2786 | minimum: 0, 2787 | maximum: 1, 2788 | description: 'Minimum confidence threshold', 2789 | }, 2790 | relevanceThreshold: { 2791 | type: 'number', 2792 | minimum: 0, 2793 | maximum: 1, 2794 | description: 'Minimum relevance threshold', 2795 | }, 2796 | timeRange: { 2797 | type: 'object', 2798 | properties: { 2799 | from: { type: 'string', description: 'Start date (ISO 8601)' }, 2800 | to: { type: 'string', description: 'End date (ISO 8601)' }, 2801 | }, 2802 | description: 'Filter by time range', 2803 | }, 2804 | contextFilters: { 2805 | type: 'object', 2806 | properties: { 2807 | projectPhase: { type: 'string', description: 'Project phase filter' }, 2808 | businessDomain: { type: 'string', description: 'Business domain filter' }, 2809 | technicalStack: { 2810 | type: 'array', 2811 | items: { type: 'string' }, 2812 | description: 'Technical stack filter', 2813 | }, 2814 | environmentalFactors: { 2815 | type: 'array', 2816 | items: { type: 'string' }, 2817 | description: 'Environmental factors filter', 2818 | }, 2819 | }, 2820 | description: 'Context-based filters', 2821 | }, 2822 | limit: { 2823 | type: 'number', 2824 | minimum: 1, 2825 | description: 'Maximum number of results', 2826 | }, 2827 | sortBy: { 2828 | type: 'string', 2829 | enum: ['relevance', 'confidence', 'lastModified', 'created', 'accessCount'], 2830 | description: 'Sort field', 2831 | default: 'relevance', 2832 | }, 2833 | includeRelated: { 2834 | type: 'boolean', 2835 | description: 'Include related entities and relationships', 2836 | default: false, 2837 | }, 2838 | relationshipDepth: { 2839 | type: 'number', 2840 | minimum: 1, 2841 | maximum: 5, 2842 | description: 'Maximum relationship traversal depth', 2843 | default: 2, 2844 | }, 2845 | }, 2846 | description: 'Query parameters for entity search', 2847 | }, 2848 | entityId: { 2849 | type: 'string', 2850 | description: 'Entity ID for get_entity and find_related actions', 2851 | }, 2852 | maxDepth: { 2853 | type: 'number', 2854 | minimum: 1, 2855 | maximum: 5, 2856 | description: 'Maximum depth for relationship traversal (find_related action)', 2857 | default: 2, 2858 | }, 2859 | forceReload: { 2860 | type: 'boolean', 2861 | description: 'Force reload of ADRs (load_adrs action)', 2862 | default: false, 2863 | }, 2864 | }, 2865 | }, 2866 | }, 2867 | { 2868 | name: 'expand_analysis_section', 2869 | description: 2870 | 'Retrieve full analysis content from tiered responses. Expand entire analysis or specific sections stored in memory. Use this when a tool returns a summary with an expandable ID.', 2871 | inputSchema: { 2872 | type: 'object', 2873 | properties: { 2874 | expandableId: { 2875 | type: 'string', 2876 | description: 'ID of the expandable analysis (provided in tiered response)', 2877 | }, 2878 | section: { 2879 | type: 'string', 2880 | description: 2881 | 'Optional: Specific section to expand (omit to get full analysis). Available sections are listed in the tiered response.', 2882 | }, 2883 | format: { 2884 | type: 'string', 2885 | enum: ['markdown', 'json'], 2886 | description: 'Output format (default: markdown)', 2887 | default: 'markdown', 2888 | }, 2889 | }, 2890 | required: ['expandableId'], 2891 | }, 2892 | }, 2893 | { 2894 | name: 'tool_chain_orchestrator', 2895 | description: 2896 | 'AI-powered dynamic tool sequencing - intelligently analyze user requests and generate structured tool execution plans', 2897 | inputSchema: { 2898 | type: 'object', 2899 | properties: { 2900 | userRequest: { 2901 | type: 'string', 2902 | description: 'User request to analyze and create tool execution plan for', 2903 | }, 2904 | availableTools: { 2905 | type: 'array', 2906 | items: { type: 'string' }, 2907 | description: 'List of available MCP tools to orchestrate', 2908 | }, 2909 | executionMode: { 2910 | type: 'string', 2911 | enum: ['plan_only', 'plan_and_execute', 'validate_plan'], 2912 | description: 'Orchestration mode', 2913 | default: 'plan_only', 2914 | }, 2915 | maxSteps: { 2916 | type: 'number', 2917 | description: 'Maximum number of steps in the execution plan', 2918 | default: 10, 2919 | }, 2920 | allowParallel: { 2921 | type: 'boolean', 2922 | description: 'Allow parallel execution of independent steps', 2923 | default: true, 2924 | }, 2925 | contextHints: { 2926 | type: 'array', 2927 | items: { type: 'string' }, 2928 | description: 'Additional context hints for better plan generation', 2929 | }, 2930 | }, 2931 | required: ['userRequest'], 2932 | }, 2933 | }, 2934 | { 2935 | name: 'expand_memory', 2936 | description: 2937 | 'Phase 3: Retrieve and expand stored content from a tiered response using its expandable ID', 2938 | inputSchema: { 2939 | type: 'object', 2940 | properties: { 2941 | expandableId: { 2942 | type: 'string', 2943 | description: 'Expandable ID from a tiered response', 2944 | }, 2945 | section: { 2946 | type: 'string', 2947 | description: 'Optional: specific section to expand', 2948 | }, 2949 | includeContext: { 2950 | type: 'boolean', 2951 | description: 'Include related conversation context and knowledge graph state', 2952 | default: true, 2953 | }, 2954 | }, 2955 | required: ['expandableId'], 2956 | }, 2957 | }, 2958 | { 2959 | name: 'query_conversation_history', 2960 | description: 'Phase 3: Search and retrieve conversation sessions based on filters', 2961 | inputSchema: { 2962 | type: 'object', 2963 | properties: { 2964 | projectPath: { 2965 | type: 'string', 2966 | description: 'Filter by project path', 2967 | }, 2968 | dateRange: { 2969 | type: 'object', 2970 | properties: { 2971 | start: { type: 'string', description: 'Start date (ISO 8601)' }, 2972 | end: { type: 'string', description: 'End date (ISO 8601)' }, 2973 | }, 2974 | description: 'Filter by date range', 2975 | }, 2976 | toolsUsed: { 2977 | type: 'array', 2978 | items: { type: 'string' }, 2979 | description: 'Filter by tools used in the session', 2980 | }, 2981 | keyword: { 2982 | type: 'string', 2983 | description: 'Search keyword in conversation turns', 2984 | }, 2985 | limit: { 2986 | type: 'number', 2987 | description: 'Maximum number of sessions to return', 2988 | default: 10, 2989 | }, 2990 | }, 2991 | }, 2992 | }, 2993 | { 2994 | name: 'get_conversation_snapshot', 2995 | description: 2996 | 'Phase 3: Get current conversation context snapshot for resumption or analysis', 2997 | inputSchema: { 2998 | type: 'object', 2999 | properties: { 3000 | recentTurnCount: { 3001 | type: 'number', 3002 | description: 'Number of recent turns to include', 3003 | default: 5, 3004 | }, 3005 | }, 3006 | }, 3007 | }, 3008 | { 3009 | name: 'get_memory_stats', 3010 | description: 'Phase 3: Get statistics about stored conversation memory', 3011 | inputSchema: { 3012 | type: 'object', 3013 | properties: {}, 3014 | }, 3015 | }, 3016 | { 3017 | name: 'get_server_context', 3018 | description: 3019 | "Generate a comprehensive context file showing the server's current state, memory, and capabilities. Creates .mcp-server-context.md that can be @ referenced in conversations for instant LLM awareness", 3020 | inputSchema: { 3021 | type: 'object', 3022 | properties: { 3023 | writeToFile: { 3024 | type: 'boolean', 3025 | description: 'Whether to write the context to .mcp-server-context.md file', 3026 | default: true, 3027 | }, 3028 | outputPath: { 3029 | type: 'string', 3030 | description: 'Custom output path for the context file', 3031 | }, 3032 | includeDetailed: { 3033 | type: 'boolean', 3034 | description: 'Include detailed information', 3035 | default: true, 3036 | }, 3037 | maxRecentItems: { 3038 | type: 'number', 3039 | description: 'Maximum number of recent items to show', 3040 | default: 5, 3041 | }, 3042 | }, 3043 | }, 3044 | }, 3045 | ], 3046 | }; 3047 | }); 3048 | 3049 | /** 3050 | * Call Tool Handler - MCP Protocol Endpoint 3051 | * 3052 | * @description Executes specific tools with provided arguments. This is the core 3053 | * execution endpoint that routes tool calls to their respective implementations. 3054 | * Includes comprehensive error handling, argument validation, and response masking. 3055 | * 3056 | * @param {CallToolRequest} request - MCP tool execution request 3057 | * @param {string} request.params.name - Tool name to execute 3058 | * @param {Object} request.params.arguments - Tool-specific arguments 3059 | * 3060 | * @returns {Promise<CallToolResult>} Tool execution result with content and metadata 3061 | * 3062 | * @throws {McpAdrError} When tool execution fails or arguments are invalid 3063 | * 3064 | * @example 3065 | * ```typescript 3066 | * // Execute research tool 3067 | * const result = await mcpClient.callTool('perform_research', { 3068 | * question: 'What authentication methods are used?', 3069 | * projectPath: '/path/to/project' 3070 | * }); 3071 | * 3072 | * console.log(result.content); // Research findings 3073 | * ``` 3074 | * 3075 | * @example 3076 | * ```typescript 3077 | * // Execute ADR validation 3078 | * const validation = await mcpClient.callTool('validate_adr', { 3079 | * adrPath: 'docs/adrs/0001-auth-choice.md', 3080 | * includeEnvironmentCheck: true 3081 | * }); 3082 | * 3083 | * console.log(validation.isValid); // true/false 3084 | * console.log(validation.findings); // Validation issues 3085 | * ``` 3086 | * 3087 | * @mcp-endpoint 3088 | * @category Tools 3089 | * @category Execution 3090 | */ 3091 | this.server.setRequestHandler(CallToolRequestSchema, async request => { 3092 | const { name, arguments: args } = request.params; 3093 | 3094 | // Create context for progress notifications and logging 3095 | const context: ToolContext = { 3096 | info: (message: string) => { 3097 | this.logger.info(message); 3098 | // Note: MCP progress notifications will be available in future SDK versions 3099 | // For now, we log to server console for visibility 3100 | }, 3101 | report_progress: (progress: number, total?: number) => { 3102 | const percentage = total ? Math.round((progress / total) * 100) : progress; 3103 | this.logger.info(`Progress: ${percentage}%${total ? ` (${progress}/${total})` : ''}`); 3104 | }, 3105 | warn: (message: string) => { 3106 | this.logger.warn(message); 3107 | }, 3108 | error: (message: string) => { 3109 | this.logger.error(message); 3110 | }, 3111 | }; 3112 | 3113 | try { 3114 | let response: CallToolResult; 3115 | const safeArgs = args || {}; 3116 | 3117 | switch (name) { 3118 | case 'analyze_project_ecosystem': 3119 | response = await this.analyzeProjectEcosystem( 3120 | safeArgs as unknown as AnalyzeProjectEcosystemArgs, 3121 | context 3122 | ); 3123 | break; 3124 | case 'get_architectural_context': 3125 | response = await this.getArchitecturalContext( 3126 | safeArgs as unknown as GetArchitecturalContextArgs 3127 | ); 3128 | break; 3129 | case 'generate_adrs_from_prd': 3130 | response = await this.generateAdrsFromPrd(safeArgs, context); 3131 | break; 3132 | case 'compare_adr_progress': 3133 | response = await this.compareAdrProgress(safeArgs); 3134 | break; 3135 | case 'analyze_content_security': 3136 | response = await this.analyzeContentSecurity( 3137 | safeArgs as unknown as AnalyzeContentSecurityArgs 3138 | ); 3139 | break; 3140 | case 'generate_content_masking': 3141 | response = await this.generateContentMasking( 3142 | safeArgs as unknown as GenerateContentMaskingArgs 3143 | ); 3144 | break; 3145 | case 'configure_custom_patterns': 3146 | response = await this.configureCustomPatterns( 3147 | safeArgs as unknown as ConfigureCustomPatternsArgs 3148 | ); 3149 | break; 3150 | case 'apply_basic_content_masking': 3151 | response = await this.applyBasicContentMasking( 3152 | safeArgs as unknown as ApplyBasicContentMaskingArgs 3153 | ); 3154 | break; 3155 | case 'validate_content_masking': 3156 | response = await this.validateContentMasking( 3157 | safeArgs as unknown as ValidateContentMaskingArgs 3158 | ); 3159 | break; 3160 | case 'manage_cache': 3161 | response = await this.manageCache(safeArgs); 3162 | break; 3163 | case 'configure_output_masking': 3164 | response = await this.configureOutputMasking(safeArgs); 3165 | break; 3166 | case 'suggest_adrs': 3167 | response = await this.suggestAdrs(safeArgs); 3168 | break; 3169 | case 'generate_adr_from_decision': 3170 | response = await this.generateAdrFromDecision( 3171 | safeArgs as unknown as GenerateAdrFromDecisionArgs 3172 | ); 3173 | break; 3174 | case 'generate_adr_bootstrap': 3175 | response = await this.generateAdrBootstrap(safeArgs); 3176 | break; 3177 | case 'bootstrap_validation_loop': 3178 | response = await this.bootstrapValidationLoop(safeArgs); 3179 | break; 3180 | case 'discover_existing_adrs': 3181 | response = await this.discoverExistingAdrs(safeArgs, context); 3182 | break; 3183 | case 'review_existing_adrs': 3184 | response = await this.reviewExistingAdrs(safeArgs); 3185 | break; 3186 | case 'validate_adr': 3187 | response = await this.validateAdr(safeArgs); 3188 | break; 3189 | case 'validate_all_adrs': 3190 | response = await this.validateAllAdrs(safeArgs); 3191 | break; 3192 | case 'incorporate_research': 3193 | response = await this.incorporateResearch(safeArgs); 3194 | break; 3195 | case 'create_research_template': 3196 | response = await this.createResearchTemplate(safeArgs); 3197 | break; 3198 | case 'request_action_confirmation': 3199 | response = await this.requestActionConfirmation(safeArgs); 3200 | break; 3201 | case 'generate_rules': 3202 | response = await this.generateRules(safeArgs); 3203 | break; 3204 | case 'validate_rules': 3205 | response = await this.validateRules(safeArgs as unknown as ValidateRulesArgs); 3206 | break; 3207 | case 'create_rule_set': 3208 | response = await this.createRuleSet(safeArgs as unknown as CreateRuleSetArgs); 3209 | break; 3210 | case 'analyze_environment': 3211 | response = await this.analyzeEnvironment(safeArgs); 3212 | break; 3213 | case 'generate_research_questions': 3214 | response = await this.generateResearchQuestions(safeArgs); 3215 | break; 3216 | case 'perform_research': 3217 | response = await this.performResearch(safeArgs, context); 3218 | break; 3219 | case 'llm_web_search': 3220 | response = await this.llmWebSearch(safeArgs); 3221 | break; 3222 | case 'llm_cloud_management': 3223 | response = await this.llmCloudManagement(safeArgs); 3224 | break; 3225 | case 'llm_database_management': 3226 | response = await this.llmDatabaseManagement(safeArgs); 3227 | break; 3228 | case 'analyze_deployment_progress': 3229 | response = await this.analyzeDeploymentProgress(safeArgs); 3230 | break; 3231 | case 'check_ai_execution_status': 3232 | response = await this.checkAIExecutionStatus(safeArgs); 3233 | break; 3234 | case 'get_workflow_guidance': 3235 | response = await this.getWorkflowGuidance( 3236 | safeArgs as unknown as GetWorkflowGuidanceArgs 3237 | ); 3238 | break; 3239 | case 'get_development_guidance': 3240 | response = await this.getDevelopmentGuidance( 3241 | safeArgs as unknown as GetDevelopmentGuidanceArgs 3242 | ); 3243 | break; 3244 | case 'list_roots': 3245 | response = await this.listRoots(); 3246 | break; 3247 | case 'read_directory': 3248 | response = await this.readDirectory(safeArgs); 3249 | break; 3250 | case 'read_file': 3251 | response = await this.readFile(safeArgs as unknown as ReadFileArgs); 3252 | break; 3253 | case 'write_file': 3254 | response = await this.writeFile(safeArgs as unknown as WriteFileArgs); 3255 | break; 3256 | case 'list_directory': 3257 | response = await this.listDirectory(safeArgs); 3258 | break; 3259 | case 'generate_deployment_guidance': 3260 | response = await this.generateDeploymentGuidance(safeArgs); 3261 | break; 3262 | case 'smart_git_push': 3263 | response = await this.smartGitPush(safeArgs); 3264 | break; 3265 | case 'deployment_readiness': 3266 | response = await this.deploymentReadiness(safeArgs); 3267 | break; 3268 | case 'troubleshoot_guided_workflow': 3269 | response = await this.troubleshootGuidedWorkflow(safeArgs); 3270 | break; 3271 | case 'smart_score': 3272 | response = await this.smartScore(safeArgs); 3273 | break; 3274 | case 'mcp_planning': 3275 | response = await this.mcpPlanning(safeArgs); 3276 | break; 3277 | case 'memory_loading': 3278 | response = await this.memoryLoading(safeArgs); 3279 | break; 3280 | case 'expand_analysis_section': 3281 | response = await this.expandAnalysisSection(safeArgs); 3282 | break; 3283 | case 'interactive_adr_planning': 3284 | response = await this.interactiveAdrPlanning(safeArgs); 3285 | break; 3286 | case 'tool_chain_orchestrator': 3287 | response = await this.toolChainOrchestrator( 3288 | safeArgs as unknown as ToolChainOrchestratorArgs 3289 | ); 3290 | break; 3291 | case 'expand_memory': 3292 | response = await this.expandMemory(safeArgs); 3293 | break; 3294 | case 'query_conversation_history': 3295 | response = await this.queryConversationHistory(safeArgs); 3296 | break; 3297 | case 'get_conversation_snapshot': 3298 | response = await this.getConversationSnapshot(safeArgs); 3299 | break; 3300 | case 'get_memory_stats': 3301 | response = await this.getMemoryStats(); 3302 | break; 3303 | case 'get_server_context': 3304 | response = await this.getServerContext(safeArgs); 3305 | break; 3306 | default: 3307 | throw new McpAdrError(`Unknown tool: ${name}`, 'UNKNOWN_TOOL'); 3308 | } 3309 | 3310 | // Track tool execution in knowledge graph 3311 | await this.trackToolExecution(name, args, response, true); 3312 | 3313 | // Apply state reinforcement (Phase 2: Context Decay Mitigation) and content masking 3314 | // Also record conversation turn (Phase 3: Structured External Memory) 3315 | return await this.enrichResponseWithStateReinforcement(response, name, args); 3316 | } catch (error) { 3317 | // Track failed execution 3318 | await this.trackToolExecution( 3319 | name, 3320 | args, 3321 | {}, 3322 | false, 3323 | error instanceof Error ? error.message : String(error) 3324 | ); 3325 | 3326 | if (error instanceof McpAdrError) { 3327 | throw error; 3328 | } 3329 | throw new McpAdrError( 3330 | `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`, 3331 | 'TOOL_EXECUTION_ERROR' 3332 | ); 3333 | } 3334 | }); 3335 | 3336 | /** 3337 | * List Resources Handler - MCP Protocol Endpoint 3338 | * 3339 | * @description Returns available resources for client access including the 3340 | * architectural knowledge graph and project analysis data. Resources provide 3341 | * read-only access to server-managed data structures. 3342 | * 3343 | * @returns {Promise<{resources: Array}>} Available resources with URIs and descriptions 3344 | * 3345 | * @example 3346 | * ```typescript 3347 | * // List available resources 3348 | * const resources = await mcpClient.listResources(); 3349 | * console.log(resources.resources.length); // Available resources 3350 | * 3351 | * // Find knowledge graph resource 3352 | * const kgResource = resources.resources.find(r => 3353 | * r.uri === 'adr://architectural_knowledge_graph' 3354 | * ); 3355 | * console.log(kgResource.name); // "Architectural Knowledge Graph" 3356 | * ``` 3357 | * 3358 | * @mcp-endpoint 3359 | * @category Resources 3360 | */ 3361 | this.server.setRequestHandler(ListResourcesRequestSchema, async () => { 3362 | return { 3363 | resources: [ 3364 | // Existing resources (refactored to return data) 3365 | { 3366 | uri: 'adr://architectural_knowledge_graph', 3367 | name: 'Architectural Knowledge Graph', 3368 | description: 3369 | 'Complete architectural knowledge graph with technologies, patterns, and relationships', 3370 | mimeType: 'application/json', 3371 | }, 3372 | { 3373 | uri: 'adr://analysis_report', 3374 | name: 'Analysis Report', 3375 | description: 'Comprehensive project analysis report with metrics and recommendations', 3376 | mimeType: 'application/json', 3377 | }, 3378 | { 3379 | uri: 'adr://adr_list', 3380 | name: 'ADR List', 3381 | description: 'List of all Architectural Decision Records with status and metadata', 3382 | mimeType: 'application/json', 3383 | }, 3384 | // NEW Phase 1 Resources 3385 | { 3386 | uri: 'adr://todo_list', 3387 | name: 'Todo List', 3388 | description: 'Current project task list with status, priorities, and dependencies', 3389 | mimeType: 'application/json', 3390 | }, 3391 | { 3392 | uri: 'adr://research_index', 3393 | name: 'Research Index', 3394 | description: 'Index of all research documents and findings with metadata', 3395 | mimeType: 'application/json', 3396 | }, 3397 | { 3398 | uri: 'adr://rule_catalog', 3399 | name: 'Rule Catalog', 3400 | description: 'Catalog of all architectural and validation rules from ADRs and code', 3401 | mimeType: 'application/json', 3402 | }, 3403 | { 3404 | uri: 'adr://rule_generation', 3405 | name: 'Rule Generation', 3406 | description: 3407 | 'AI-powered rule generation from ADRs and code patterns. Supports query parameters: ?operation=generate|validate|create_set, ?source=adrs|patterns|both, ?knowledge=true|false, ?enhanced=true|false, ?format=json|yaml|both, ?comprehensive=true|false', 3408 | mimeType: 'application/json', 3409 | }, 3410 | { 3411 | uri: 'adr://project_status', 3412 | name: 'Project Status', 3413 | description: 'Current project status and health metrics aggregated from all sources', 3414 | mimeType: 'application/json', 3415 | }, 3416 | // NEW Phase 2 Templated Resources 3417 | { 3418 | uri: 'adr://adr/{id}', 3419 | name: 'ADR by ID', 3420 | description: 'Individual Architectural Decision Record by ID or title match', 3421 | mimeType: 'application/json', 3422 | }, 3423 | { 3424 | uri: 'adr://research/{topic}', 3425 | name: 'Research by Topic', 3426 | description: 'Research documents filtered by topic with full content', 3427 | mimeType: 'application/json', 3428 | }, 3429 | { 3430 | uri: 'adr://todo/{task_id}', 3431 | name: 'Todo by Task ID', 3432 | description: 3433 | 'Individual task details by ID or title match with dependencies and history', 3434 | mimeType: 'application/json', 3435 | }, 3436 | { 3437 | uri: 'adr://rule/{rule_id}', 3438 | name: 'Rule by ID', 3439 | description: 3440 | 'Individual architectural rule by ID or name match with violations and usage stats', 3441 | mimeType: 'application/json', 3442 | }, 3443 | // NEW Phase 3 Advanced Resources 3444 | { 3445 | uri: 'adr://deployment_status', 3446 | name: 'Deployment Status', 3447 | description: 3448 | 'Current deployment state with health checks, build status, and readiness score', 3449 | mimeType: 'application/json', 3450 | }, 3451 | { 3452 | uri: 'adr://environment_analysis', 3453 | name: 'Environment Analysis', 3454 | description: 3455 | 'System environment details including platform, dependencies, and capabilities', 3456 | mimeType: 'application/json', 3457 | }, 3458 | { 3459 | uri: 'adr://memory_snapshots', 3460 | name: 'Memory Snapshots', 3461 | description: 3462 | 'Knowledge graph snapshots with statistics, insights, and relationship data', 3463 | mimeType: 'application/json', 3464 | }, 3465 | { 3466 | uri: 'adr://project_metrics', 3467 | name: 'Project Metrics', 3468 | description: 3469 | 'Code metrics and quality scores including codebase stats, quality assessment, and git metrics', 3470 | mimeType: 'application/json', 3471 | }, 3472 | { 3473 | uri: 'adr://technology/{name}', 3474 | name: 'Technology by Name', 3475 | description: 3476 | 'Individual technology analysis by name with usage, relationships, and adoption status', 3477 | mimeType: 'application/json', 3478 | }, 3479 | { 3480 | uri: 'adr://pattern/{name}', 3481 | name: 'Pattern by Name', 3482 | description: 3483 | 'Individual pattern analysis by name with quality metrics, relationships, and examples', 3484 | mimeType: 'application/json', 3485 | }, 3486 | // NEW Phase 4 Final Resources 3487 | { 3488 | uri: 'adr://deployment_history', 3489 | name: 'Deployment History', 3490 | description: 3491 | 'Historical deployment data with trends, failure analysis, and patterns. Supports query parameters: ?period=7d|30d|90d|1y|all, ?environment=production|staging|development|all, ?includeFailures=true|false, ?includeMetrics=true|false, ?format=summary|detailed', 3492 | mimeType: 'application/json', 3493 | }, 3494 | { 3495 | uri: 'adr://code_quality', 3496 | name: 'Code Quality', 3497 | description: 3498 | 'Comprehensive code quality assessment with metrics, issues, and recommendations. Supports query parameters: ?scope=full|changes|critical, ?includeMetrics=true|false, ?includeRecommendations=true|false, ?threshold=0-100, ?format=summary|detailed', 3499 | mimeType: 'application/json', 3500 | }, 3501 | ], 3502 | }; 3503 | }); 3504 | 3505 | /** 3506 | * Read Resource Handler - MCP Protocol Endpoint 3507 | * 3508 | * @description Reads specific resource content by URI. Provides access to 3509 | * architectural knowledge graphs, project analysis data, and other server-managed 3510 | * resources with appropriate content masking applied. 3511 | * 3512 | * @param {ReadResourceRequest} request - MCP resource read request 3513 | * @param {string} request.params.uri - Resource URI to read 3514 | * 3515 | * @returns {Promise<ReadResourceResult>} Resource content with metadata 3516 | * 3517 | * @throws {McpAdrError} When resource URI is invalid or access fails 3518 | * 3519 | * @example 3520 | * ```typescript 3521 | * // Read knowledge graph resource 3522 | * const kgData = await mcpClient.readResource( 3523 | * 'adr://architectural_knowledge_graph' 3524 | * ); 3525 | * console.log(kgData.contents); // Knowledge graph JSON 3526 | * ``` 3527 | * 3528 | * @mcp-endpoint 3529 | * @category Resources 3530 | */ 3531 | this.server.setRequestHandler(ReadResourceRequestSchema, async request => { 3532 | const { uri } = request.params; 3533 | 3534 | try { 3535 | const response = await this.readResource(uri); 3536 | return await this.applyOutputMasking(response); 3537 | } catch (error) { 3538 | if (error instanceof McpAdrError) { 3539 | throw error; 3540 | } 3541 | throw new McpAdrError( 3542 | `Resource reading failed: ${error instanceof Error ? error.message : String(error)}`, 3543 | 'RESOURCE_ERROR' 3544 | ); 3545 | } 3546 | }); 3547 | 3548 | /** 3549 | * List Prompts Handler - MCP Protocol Endpoint 3550 | * 3551 | * @description Returns available prompt templates for ADR analysis, research, 3552 | * and architectural decision support. Prompts can be executed directly or 3553 | * used as templates for custom implementations. 3554 | * 3555 | * @returns {Promise<{prompts: Array}>} Available prompt templates with metadata 3556 | * 3557 | * @example 3558 | * ```typescript 3559 | * // List available prompts 3560 | * const prompts = await mcpClient.listPrompts(); 3561 | * console.log(prompts.prompts.length); // Available prompt templates 3562 | * 3563 | * // Find ADR analysis prompt 3564 | * const adrPrompt = prompts.prompts.find(p => 3565 | * p.name === 'adr_analysis_prompt' 3566 | * ); 3567 | * console.log(adrPrompt.description); // Prompt description 3568 | * ``` 3569 | * 3570 | * @mcp-endpoint 3571 | * @category Prompts 3572 | */ 3573 | this.server.setRequestHandler(ListPromptsRequestSchema, async () => { 3574 | const { allPrompts } = await import('./prompts/index.js'); 3575 | 3576 | return { 3577 | prompts: allPrompts.map(prompt => ({ 3578 | name: prompt.name, 3579 | description: prompt.description, 3580 | arguments: prompt.arguments, 3581 | })), 3582 | }; 3583 | }); 3584 | 3585 | /** 3586 | * Get Prompt Handler - MCP Protocol Endpoint 3587 | * 3588 | * @description Executes specific prompt templates with provided arguments. 3589 | * Returns formatted prompts ready for AI execution or further processing. 3590 | * Supports dynamic argument injection and template customization. 3591 | * 3592 | * @param {GetPromptRequest} request - MCP prompt execution request 3593 | * @param {string} request.params.name - Prompt template name 3594 | * @param {Object} request.params.arguments - Template-specific arguments 3595 | * 3596 | * @returns {Promise<GetPromptResult>} Formatted prompt with metadata 3597 | * 3598 | * @throws {McpAdrError} When prompt template is not found or arguments are invalid 3599 | * 3600 | * @example 3601 | * ```typescript 3602 | * // Execute ADR analysis prompt 3603 | * const prompt = await mcpClient.getPrompt('adr_analysis_prompt', { 3604 | * adrPath: 'docs/adrs/0001-auth.md', 3605 | * projectContext: 'microservices architecture' 3606 | * }); 3607 | * 3608 | * console.log(prompt.messages); // Formatted prompt messages 3609 | * ``` 3610 | * 3611 | * @example 3612 | * ```typescript 3613 | * // Execute research prompt 3614 | * const researchPrompt = await mcpClient.getPrompt('research_question_prompt', { 3615 | * domain: 'authentication', 3616 | * complexity: 'advanced' 3617 | * }); 3618 | * 3619 | * console.log(researchPrompt.messages[0].content); // Research prompt 3620 | * ``` 3621 | * 3622 | * @mcp-endpoint 3623 | * @category Prompts 3624 | * @category Execution 3625 | */ 3626 | this.server.setRequestHandler(GetPromptRequestSchema, async request => { 3627 | const { name, arguments: args } = request.params; 3628 | 3629 | try { 3630 | const { allPrompts } = await import('./prompts/index.js'); 3631 | const prompt = allPrompts.find(p => p.name === name); 3632 | 3633 | if (!prompt) { 3634 | throw new McpAdrError(`Unknown prompt: ${name}`, 'UNKNOWN_PROMPT'); 3635 | } 3636 | 3637 | // Simple template rendering (replace {{variable}} with values) 3638 | let renderedTemplate = prompt.template; 3639 | if (args) { 3640 | for (const [key, value] of Object.entries(args)) { 3641 | const regex = new RegExp(`{{${key}}}`, 'g'); 3642 | renderedTemplate = renderedTemplate.replace(regex, String(value)); 3643 | } 3644 | } 3645 | 3646 | const response = { 3647 | description: prompt.description, 3648 | messages: [ 3649 | { 3650 | role: 'user', 3651 | content: { 3652 | type: 'text', 3653 | text: renderedTemplate, 3654 | }, 3655 | }, 3656 | ], 3657 | }; 3658 | 3659 | return await this.applyOutputMasking(response); 3660 | } catch (error) { 3661 | if (error instanceof McpAdrError) { 3662 | throw error; 3663 | } 3664 | throw new McpAdrError( 3665 | `Prompt execution failed: ${error instanceof Error ? error.message : String(error)}`, 3666 | 'PROMPT_EXECUTION_ERROR' 3667 | ); 3668 | } 3669 | }); 3670 | } 3671 | 3672 | /** 3673 | * Tool implementations 3674 | */ 3675 | private async checkAIExecutionStatus(_args: Record<string, unknown>): Promise<CallToolResult> { 3676 | try { 3677 | const { getAIExecutionStatus } = await import('./utils/prompt-execution.js'); 3678 | const status = getAIExecutionStatus(); 3679 | 3680 | return { 3681 | content: [ 3682 | { 3683 | type: 'text', 3684 | text: `# AI Execution Status Diagnostic 3685 | 3686 | ## Current Configuration 3687 | - **AI Execution Enabled**: ${status.isEnabled ? '✅ YES' : '❌ NO'} 3688 | - **Has API Key**: ${status.hasApiKey ? '✅ YES' : '❌ NO'} 3689 | - **Execution Mode**: ${status.executionMode} 3690 | - **AI Model**: ${status.model} 3691 | 3692 | ${ 3693 | status.reason 3694 | ? `## ⚠️ Issue Detected 3695 | **Problem**: ${status.reason} 3696 | 3697 | ## Solution 3698 | ${ 3699 | !status.hasApiKey 3700 | ? ` 3701 | 1. Get an OpenRouter API key from https://openrouter.ai/keys 3702 | 2. Add it to your MCP configuration: 3703 | \`\`\`json 3704 | { 3705 | "mcpServers": { 3706 | "adr-analysis": { 3707 | "command": "mcp-adr-analysis-server", 3708 | "env": { 3709 | "OPENROUTER_API_KEY": "your_api_key_here", 3710 | "EXECUTION_MODE": "full", 3711 | "AI_MODEL": "anthropic/claude-3-sonnet" 3712 | } 3713 | } 3714 | } 3715 | } 3716 | \`\`\` 3717 | 3. Restart your MCP client (Claude Desktop, etc.) 3718 | ` 3719 | : status.executionMode !== 'full' 3720 | ? ` 3721 | 1. Update your MCP configuration to set EXECUTION_MODE to "full": 3722 | \`\`\`json 3723 | { 3724 | "mcpServers": { 3725 | "adr-analysis": { 3726 | "env": { 3727 | "EXECUTION_MODE": "full" 3728 | } 3729 | } 3730 | } 3731 | } 3732 | \`\`\` 3733 | 2. Restart your MCP client 3734 | ` 3735 | : '' 3736 | }` 3737 | : `## ✅ Configuration Looks Good! 3738 | 3739 | AI execution is properly configured. Tools should return actual results instead of prompts. 3740 | 3741 | If you're still seeing prompts instead of results, try: 3742 | 1. Restart your MCP client 3743 | 2. Check your OpenRouter API key has sufficient credits 3744 | 3. Verify network connectivity to OpenRouter.ai` 3745 | } 3746 | 3747 | ## Environment Variables Expected 3748 | - **OPENROUTER_API_KEY**: Your OpenRouter API key 3749 | - **EXECUTION_MODE**: Set to "full" for AI execution 3750 | - **AI_MODEL**: AI model to use (optional, defaults to claude-3-sonnet) 3751 | 3752 | ## Testing 3753 | After fixing the configuration, try calling \`suggest_adrs\` - it should return actual ADR suggestions instead of prompts. 3754 | `, 3755 | }, 3756 | ], 3757 | }; 3758 | } catch (error) { 3759 | return { 3760 | content: [ 3761 | { 3762 | type: 'text', 3763 | text: `# AI Execution Status Check Failed 3764 | 3765 | **Error**: ${error instanceof Error ? error.message : String(error)} 3766 | 3767 | This diagnostic tool helps identify why tools return prompts instead of actual results. 3768 | 3769 | ## Manual Check 3770 | Verify these environment variables are set in your MCP configuration: 3771 | - OPENROUTER_API_KEY 3772 | - EXECUTION_MODE=full 3773 | - AI_MODEL (optional) 3774 | `, 3775 | }, 3776 | ], 3777 | }; 3778 | } 3779 | } 3780 | 3781 | private async getWorkflowGuidance(args: GetWorkflowGuidanceArgs): Promise<CallToolResult> { 3782 | const { 3783 | goal, 3784 | projectContext, 3785 | availableAssets = [], 3786 | timeframe = 'thorough_review', 3787 | primaryConcerns = [], 3788 | } = args; 3789 | 3790 | try { 3791 | const workflowPrompt = ` 3792 | # Workflow Guidance & Tool Recommendation System 3793 | 3794 | ## User Context Analysis 3795 | - **Goal**: ${goal} 3796 | - **Project Context**: ${projectContext} 3797 | - **Available Assets**: ${availableAssets.length > 0 ? availableAssets.join(', ') : 'None specified'} 3798 | - **Timeframe**: ${timeframe} 3799 | - **Primary Concerns**: ${primaryConcerns.length > 0 ? primaryConcerns.join(', ') : 'General analysis'} 3800 | 3801 | ## Available MCP Tools (24 Total) 3802 | 3803 | ### 🎯 **Core Analysis Tools** (AI-Powered ✅) 3804 | 1. **analyze_project_ecosystem** - Comprehensive technology and pattern detection 3805 | 2. **get_architectural_context** - Generate intelligent architectural insights + ADR setup 3806 | 3. **generate_adrs_from_prd** - Convert requirements to structured ADRs 3807 | 4. **analyze_content_security** - Detect sensitive information patterns 3808 | 3809 | ### 📋 **ADR Management Tools** (AI-Powered ✅) 3810 | 5. **suggest_adrs** - Auto-suggest ADRs from implicit decisions 3811 | 6. **generate_adr_from_decision** - Create ADRs from specific decisions 3812 | 7. **discover_existing_adrs** - Intelligent ADR discovery and analysis 3813 | 3814 | ### 🔍 **Research & Documentation Tools** (AI-Powered ✅) 3815 | 8. **generate_research_questions** - Create context-aware research questions 3816 | 9. **incorporate_research** - Integrate research findings into decisions 3817 | 10. **create_research_template** - Generate research documentation templates 3818 | 3819 | ### 🛡️ **Security & Compliance Tools** (AI-Powered ✅) 3820 | 11. **generate_content_masking** - Intelligent content masking and protection 3821 | 12. **configure_custom_patterns** - Customize security and masking settings 3822 | 13. **apply_basic_content_masking** - Basic content masking (fallback) 3823 | 14. **validate_content_masking** - Validate masking effectiveness 3824 | 3825 | ### 🏗️ **Rule & Governance Tools** (AI-Powered ✅) 3826 | 16. **generate_rules** - Extract architectural rules from ADRs 3827 | 17. **validate_rules** - Validate code against architectural rules 3828 | 18. **create_rule_set** - Create comprehensive rule management systems 3829 | 3830 | ### 🚀 **Deployment & Environment Tools** (AI-Powered ✅) 3831 | 19. **analyze_environment** - Environment analysis and optimization 3832 | 20. **analyze_deployment_progress** - Deployment tracking and verification 3833 | 3834 | ### ⚙️ **Utility & Management Tools** 3835 | 21. **manage_cache** - Cache management and optimization 3836 | 22. **configure_output_masking** - Configure global output masking 3837 | 23. **request_action_confirmation** - Interactive user confirmation workflows 3838 | 24. **get_workflow_guidance** - This tool - intelligent workflow advisor 3839 | 3840 | ## Workflow Recommendation Instructions 3841 | 3842 | Based on the user's goal, project context, available assets, timeframe, and concerns, provide: 3843 | 3844 | ### 1. **Recommended Tool Sequence** 3845 | Provide a step-by-step workflow with: 3846 | - **Tool Name**: Exact tool to call 3847 | - **Purpose**: Why this tool is needed 3848 | - **Expected Outcome**: What it will deliver 3849 | - **Parameters**: Suggested parameters for the tool call 3850 | - **Success Criteria**: How to know it worked 3851 | 3852 | ### 2. **Alternative Workflows** 3853 | Provide 2-3 alternative approaches based on: 3854 | - Different time constraints 3855 | - Different priorities 3856 | - Different starting points 3857 | 3858 | ### 3. **Expected Timeline & Effort** 3859 | For each recommended workflow: 3860 | - **Estimated Time**: How long each step takes 3861 | - **Effort Level**: Low/Medium/High effort required 3862 | - **Dependencies**: Which steps must be completed first 3863 | 3864 | ### 4. **Success Metrics** 3865 | Define how to measure success: 3866 | - **Immediate Indicators**: Quick wins and early signals 3867 | - **Progress Milestones**: Key checkpoints 3868 | - **Final Outcomes**: Ultimate success criteria 3869 | 3870 | ### 5. **Common Pitfalls & Tips** 3871 | - **What to Avoid**: Common mistakes in this workflow 3872 | - **Pro Tips**: Best practices for maximum effectiveness 3873 | - **Troubleshooting**: What to do if steps fail 3874 | 3875 | ## Common Workflow Patterns 3876 | 3877 | ### **New Project Setup** 3878 | 1. analyze_project_ecosystem → 2. get_architectural_context → 3. suggest_adrs → 4. generate_adr_from_decision 3879 | 3880 | ### **Existing Project Analysis** 3881 | 1. discover_existing_adrs → 2. get_architectural_context → 3. validate_rules 3882 | 3883 | ### **Security Audit** 3884 | 1. analyze_content_security → 2. generate_content_masking → 3. configure_custom_patterns → 4. validate_content_masking 3885 | 3886 | ### **PRD to Implementation** 3887 | 1. generate_adrs_from_prd → 2. analyze_deployment_progress 3888 | 3889 | ### **Legacy Modernization** 3890 | 1. analyze_project_ecosystem → 2. get_architectural_context → 3. suggest_adrs → 4. generate_rules → 5. validate_rules 3891 | 3892 | ## Output Format 3893 | 3894 | Provide a comprehensive workflow guide that includes: 3895 | 3896 | 1. **🎯 Recommended Primary Workflow** (step-by-step with tool calls) 3897 | 2. **🔄 Alternative Approaches** (2-3 different paths) 3898 | 3. **⏱️ Timeline & Effort Estimates** (realistic expectations) 3899 | 4. **📊 Success Metrics** (how to measure progress) 3900 | 5. **💡 Pro Tips & Best Practices** (maximize effectiveness) 3901 | 6. **⚠️ Common Pitfalls** (what to avoid) 3902 | 3903 | Make the guidance **actionable, specific, and outcome-focused** so the user can immediately start executing the recommended workflow. 3904 | `; 3905 | 3906 | // Execute the workflow guidance with AI if enabled 3907 | const { executePromptWithFallback, formatMCPResponse } = await import( 3908 | './utils/prompt-execution.js' 3909 | ); 3910 | const executionResult = await executePromptWithFallback( 3911 | workflowPrompt, 3912 | 'Analyze the user context and provide intelligent workflow guidance with specific tool recommendations.', 3913 | { 3914 | temperature: 0.1, 3915 | maxTokens: 6000, 3916 | systemPrompt: `You are an expert workflow advisor for the MCP ADR Analysis Server. 3917 | Your role is to analyze user goals and project context, then recommend the optimal sequence of tools to achieve their objectives efficiently. 3918 | Provide specific, actionable guidance with clear tool sequences, expected outcomes, and success criteria. 3919 | Focus on practical workflows that deliver measurable results.`, 3920 | } 3921 | ); 3922 | 3923 | if (executionResult.isAIGenerated) { 3924 | // AI execution successful - return actual workflow guidance 3925 | return formatMCPResponse({ 3926 | ...executionResult, 3927 | content: `# Workflow Guidance & Tool Recommendations 3928 | 3929 | ## Your Context 3930 | - **Goal**: ${goal} 3931 | - **Project Context**: ${projectContext} 3932 | - **Available Assets**: ${availableAssets.length > 0 ? availableAssets.join(', ') : 'None specified'} 3933 | - **Timeframe**: ${timeframe} 3934 | - **Primary Concerns**: ${primaryConcerns.length > 0 ? primaryConcerns.join(', ') : 'General analysis'} 3935 | 3936 | ## AI-Generated Workflow Guidance 3937 | 3938 | ${executionResult.content} 3939 | 3940 | ## Quick Reference: Available Tools 3941 | 3942 | **Core Analysis**: analyze_project_ecosystem, get_architectural_context, generate_adrs_from_prd, analyze_content_security 3943 | **ADR Management**: suggest_adrs, generate_adr_from_decision, discover_existing_adrs 3944 | **Security**: generate_content_masking, configure_custom_patterns, validate_content_masking 3945 | **Governance**: generate_rules, validate_rules, create_rule_set 3946 | **Environment**: analyze_environment, analyze_deployment_progress 3947 | **Utilities**: manage_cache, configure_output_masking, check_ai_execution_status 3948 | 3949 | ## Next Steps 3950 | 3951 | 1. **Start with the recommended primary workflow** above 3952 | 2. **Call the first tool** with the suggested parameters 3953 | 3. **Review the results** and proceed to the next step 3954 | 4. **Track progress** using the success metrics provided 3955 | 5. **Adjust as needed** based on your specific findings 3956 | 3957 | This guidance is tailored to your specific context and goals for maximum effectiveness! 3958 | `, 3959 | }); 3960 | } else { 3961 | // Fallback to prompt-only mode 3962 | return { 3963 | content: [ 3964 | { 3965 | type: 'text', 3966 | text: workflowPrompt, 3967 | }, 3968 | ], 3969 | }; 3970 | } 3971 | } catch (error) { 3972 | throw new McpAdrError( 3973 | `Failed to generate workflow guidance: ${error instanceof Error ? error.message : String(error)}`, 3974 | 'WORKFLOW_ERROR' 3975 | ); 3976 | } 3977 | } 3978 | 3979 | private async getDevelopmentGuidance(args: GetDevelopmentGuidanceArgs): Promise<CallToolResult> { 3980 | const { 3981 | developmentPhase, 3982 | adrsToImplement = [], 3983 | technologyStack = [], 3984 | currentProgress = '', 3985 | teamContext = { size: 'small_team', experienceLevel: 'mixed' }, 3986 | timeline = '', 3987 | focusAreas = [], 3988 | } = args; 3989 | 3990 | try { 3991 | // Use actual ADR discovery if ADRs are specified 3992 | let adrAnalysisPrompt = ''; 3993 | 3994 | if (adrsToImplement.length > 0) { 3995 | const { getAdrDirectoryPath } = await import('./utils/config.js'); 3996 | const { discoverAdrsInDirectory } = await import('./utils/adr-discovery.js'); 3997 | const absoluteAdrPath = getAdrDirectoryPath(this.config); 3998 | 3999 | const discoveryResult = await discoverAdrsInDirectory( 4000 | absoluteAdrPath, 4001 | true, 4002 | this.config.projectPath 4003 | ); 4004 | 4005 | // Filter ADRs to only those specified for implementation 4006 | const targetAdrs = discoveryResult.adrs.filter(adr => 4007 | adrsToImplement.some( 4008 | (target: string) => 4009 | adr.title.toLowerCase().includes(target.toLowerCase()) || 4010 | adr.filename.toLowerCase().includes(target.toLowerCase()) 4011 | ) 4012 | ); 4013 | 4014 | adrAnalysisPrompt = ` 4015 | ## ADR Analysis for Implementation 4016 | 4017 | **ADRs to Implement**: ${adrsToImplement.join(', ')} 4018 | **ADR Directory**: ${absoluteAdrPath} 4019 | **Found ${targetAdrs.length} matching ADRs** 4020 | 4021 | ${targetAdrs 4022 | .map( 4023 | adr => ` 4024 | ### ${adr.title} 4025 | - **File**: ${adr.filename} 4026 | - **Status**: ${adr.status} 4027 | - **Context**: ${adr.context} 4028 | - **Decision**: ${adr.decision} 4029 | - **Consequences**: ${adr.consequences} 4030 | ` 4031 | ) 4032 | .join('\n')} 4033 | `; 4034 | } 4035 | 4036 | const developmentPrompt = ` 4037 | # Development Guidance & Implementation Roadmap 4038 | 4039 | ## Development Context 4040 | - **Development Phase**: ${developmentPhase} 4041 | - **Technology Stack**: ${technologyStack.length > 0 ? technologyStack.join(', ') : 'Not specified'} 4042 | - **Current Progress**: ${currentProgress || 'Starting fresh'} 4043 | - **Team Size**: ${teamContext.size} 4044 | - **Team Experience**: ${teamContext.experienceLevel} 4045 | - **Timeline**: ${timeline || 'Not specified'} 4046 | - **Focus Areas**: ${focusAreas.length > 0 ? focusAreas.join(', ') : 'General development'} 4047 | 4048 | ${adrAnalysisPrompt} 4049 | 4050 | ## Development Guidance Instructions 4051 | 4052 | Based on the development context, ADRs to implement, and technology stack, provide comprehensive development guidance including: 4053 | 4054 | ### 1. **Implementation Roadmap** 4055 | Create a detailed development plan with: 4056 | - **Phase-by-Phase Breakdown**: Logical development phases 4057 | - **Task Prioritization**: Order tasks by dependencies and impact 4058 | - **Milestone Definition**: Clear checkpoints and deliverables 4059 | - **Risk Assessment**: Potential blockers and mitigation strategies 4060 | 4061 | ### 2. **Code Structure & Architecture** 4062 | Provide specific guidance on: 4063 | - **Project Structure**: How to organize code files and directories 4064 | - **Module Architecture**: How to structure components/modules 4065 | - **Design Patterns**: Which patterns to use and where 4066 | - **Code Organization**: Separation of concerns and layering 4067 | 4068 | ### 3. **Implementation Patterns & Best Practices** 4069 | For each technology in the stack, provide: 4070 | - **Framework-Specific Patterns**: Best practices for the chosen frameworks 4071 | - **API Design**: How to structure APIs and endpoints 4072 | - **Data Layer**: Database schema and data access patterns 4073 | - **State Management**: How to handle application state 4074 | - **Error Handling**: Consistent error handling strategies 4075 | 4076 | ### 4. **ADR-to-Code Translation** 4077 | For each ADR to implement: 4078 | - **Implementation Tasks**: Specific coding tasks derived from the ADR 4079 | - **Code Examples**: Pseudo-code or pattern examples 4080 | - **Integration Points**: How this ADR affects other parts of the system 4081 | - **Validation Criteria**: How to verify the ADR is properly implemented 4082 | 4083 | ### 5. **Testing Strategy** 4084 | Comprehensive testing approach: 4085 | - **Unit Testing**: What to test and how 4086 | - **Integration Testing**: API and component integration tests 4087 | - **End-to-End Testing**: User workflow testing 4088 | - **Performance Testing**: Load and performance validation 4089 | - **Security Testing**: Security validation approaches 4090 | 4091 | ### 6. **Development Workflow** 4092 | Team-specific guidance: 4093 | - **Git Workflow**: Branching strategy and code review process 4094 | - **CI/CD Pipeline**: Automated testing and deployment 4095 | - **Code Quality**: Linting, formatting, and quality gates 4096 | - **Documentation**: What to document and how 4097 | 4098 | ### 7. **Quality Gates & Checkpoints** 4099 | Define success criteria: 4100 | - **Code Quality Metrics**: Coverage, complexity, maintainability 4101 | - **Performance Benchmarks**: Response times, throughput targets 4102 | - **Security Checkpoints**: Security validation at each phase 4103 | - **Architectural Compliance**: Adherence to ADR decisions 4104 | 4105 | ### 8. **Technology-Specific Implementation** 4106 | For each technology in the stack, provide: 4107 | - **Setup Instructions**: Environment and tooling setup 4108 | - **Configuration**: Framework and tool configuration 4109 | - **Optimization**: Performance and build optimization 4110 | - **Deployment**: Technology-specific deployment considerations 4111 | 4112 | ## Expected Output Format 4113 | 4114 | Provide a comprehensive development guide that includes: 4115 | 4116 | ### 📋 **1. Development Roadmap** 4117 | - **Phase 1-N**: Logical development phases with tasks 4118 | - **Dependencies**: Task dependencies and critical path 4119 | - **Timeline**: Estimated effort and duration 4120 | - **Milestones**: Key deliverables and checkpoints 4121 | 4122 | ### 🏗️ **2. Implementation Guide** 4123 | - **Code Structure**: Detailed project organization 4124 | - **Design Patterns**: Specific patterns to implement 4125 | - **API Design**: Endpoint structure and conventions 4126 | - **Data Architecture**: Database and data flow design 4127 | 4128 | ### 🧪 **3. Testing & Quality Strategy** 4129 | - **Test Types**: Unit, integration, e2e testing approach 4130 | - **Quality Gates**: Code quality and performance criteria 4131 | - **Automation**: CI/CD and automated testing setup 4132 | 4133 | ### 🚀 **4. Deployment & Operations** 4134 | - **Environment Setup**: Development, staging, production 4135 | - **Deployment Pipeline**: Automated deployment process 4136 | - **Monitoring**: Logging, metrics, and alerting 4137 | - **Maintenance**: Ongoing maintenance and updates 4138 | 4139 | ### 📊 **5. Progress Tracking** 4140 | - **Success Metrics**: How to measure development progress 4141 | - **Quality Indicators**: Code quality and performance metrics 4142 | - **Milestone Validation**: How to verify milestone completion 4143 | - **Risk Monitoring**: Early warning signs and mitigation 4144 | 4145 | ### 💡 **6. Team-Specific Recommendations** 4146 | Based on team size (${teamContext.size}) and experience (${teamContext.experienceLevel}): 4147 | - **Workflow Adaptations**: Process adjustments for team context 4148 | - **Skill Development**: Areas for team skill building 4149 | - **Tool Recommendations**: Development tools and practices 4150 | - **Communication**: Coordination and documentation practices 4151 | 4152 | ## Integration with Architectural Decisions 4153 | 4154 | Ensure all development guidance: 4155 | - **Aligns with ADRs**: Every recommendation supports architectural decisions 4156 | - **Maintains Consistency**: Consistent patterns across the codebase 4157 | - **Enables Evolution**: Flexible design for future changes 4158 | - **Supports Quality**: Built-in quality and maintainability 4159 | 4160 | Make the guidance **actionable, specific, and immediately implementable** so developers can start coding with confidence and architectural alignment. 4161 | `; 4162 | 4163 | // Execute the development guidance with AI if enabled 4164 | const { executePromptWithFallback, formatMCPResponse } = await import( 4165 | './utils/prompt-execution.js' 4166 | ); 4167 | const executionResult = await executePromptWithFallback( 4168 | developmentPrompt, 4169 | 'Analyze the development context and provide comprehensive implementation guidance that translates architectural decisions into specific coding tasks and development roadmap.', 4170 | { 4171 | temperature: 0.1, 4172 | maxTokens: 8000, 4173 | systemPrompt: `You are an expert software development advisor specializing in translating architectural decisions into practical implementation guidance. 4174 | Your role is to bridge the gap between architectural planning and actual code development. 4175 | Provide specific, actionable development guidance with clear implementation steps, code patterns, and quality criteria. 4176 | Focus on practical guidance that ensures architectural decisions are properly implemented in code. 4177 | Consider team context, technology stack, and development phase to provide tailored recommendations.`, 4178 | } 4179 | ); 4180 | 4181 | if (executionResult.isAIGenerated) { 4182 | // AI execution successful - return actual development guidance 4183 | return formatMCPResponse({ 4184 | ...executionResult, 4185 | content: `# Development Guidance & Implementation Roadmap 4186 | 4187 | ## Your Development Context 4188 | - **Development Phase**: ${developmentPhase} 4189 | - **Technology Stack**: ${technologyStack.length > 0 ? technologyStack.join(', ') : 'Not specified'} 4190 | - **Current Progress**: ${currentProgress || 'Starting fresh'} 4191 | - **Team Context**: ${teamContext.size} team with ${teamContext.experienceLevel} experience 4192 | - **Timeline**: ${timeline || 'Not specified'} 4193 | - **Focus Areas**: ${focusAreas.length > 0 ? focusAreas.join(', ') : 'General development'} 4194 | - **ADRs to Implement**: ${adrsToImplement.length > 0 ? adrsToImplement.join(', ') : 'None specified'} 4195 | 4196 | ## AI-Generated Development Guidance 4197 | 4198 | ${executionResult.content} 4199 | 4200 | ## Integration with Workflow Tools 4201 | 4202 | This development guidance works seamlessly with other MCP tools: 4203 | 4204 | ### **Workflow Integration** 4205 | 1. **get_workflow_guidance** → Recommends architectural process 4206 | 2. **get_development_guidance** → Guides implementation (this tool) 4207 | 3. **validate_rules** → Ensures code follows architectural decisions 4208 | 4. **analyze_deployment_progress** → Tracks implementation progress 4209 | 4210 | ### **Quality Assurance Tools** 4211 | - **generate_rules** → Extract coding standards from ADRs 4212 | - **validate_rules** → Validate code against architectural rules 4213 | - **analyze_content_security** → Security validation during development 4214 | 4215 | ### **Documentation Tools** 4216 | - **discover_existing_adrs** → Reference existing architectural decisions 4217 | 4218 | ## Next Steps: From Architecture to Code 4219 | 4220 | 1. **📋 Review the Development Roadmap** above 4221 | 2. **🏗️ Set Up Project Structure** as recommended 4222 | 3. **🧪 Implement Testing Strategy** early in development 4223 | 4. **📊 Track Progress** using the success metrics provided 4224 | 5. **🔄 Iterate and Refine** based on implementation learnings 4225 | 4226 | This guidance ensures your development work is **architecturally aligned**, **quality-focused**, and **efficiently executed**! 4227 | `, 4228 | }); 4229 | } else { 4230 | // Fallback to prompt-only mode 4231 | return { 4232 | content: [ 4233 | { 4234 | type: 'text', 4235 | text: developmentPrompt, 4236 | }, 4237 | ], 4238 | }; 4239 | } 4240 | } catch (error) { 4241 | throw new McpAdrError( 4242 | `Failed to generate development guidance: ${error instanceof Error ? error.message : String(error)}`, 4243 | 'DEVELOPMENT_ERROR' 4244 | ); 4245 | } 4246 | } 4247 | 4248 | private async analyzeProjectEcosystem( 4249 | args: AnalyzeProjectEcosystemArgs, 4250 | context?: ToolContext 4251 | ): Promise<CallToolResult> { 4252 | const ctx = context || createNoOpContext(); 4253 | 4254 | // Use configured project path if not provided in args 4255 | const projectPath = args.projectPath || this.config.projectPath; 4256 | const { 4257 | includePatterns, 4258 | enhancedMode = true, 4259 | knowledgeEnhancement = true, 4260 | learningEnabled = true, 4261 | technologyFocus = [], 4262 | analysisDepth = 'comprehensive', 4263 | includeEnvironment = true, 4264 | recursiveDepth = 'comprehensive', 4265 | analysisScope = [], 4266 | // conversationContext - TODO: implement context integration for ecosystem analysis 4267 | } = args; 4268 | 4269 | this.logger.info(`Generating comprehensive ecosystem analysis for project at: ${projectPath}`); 4270 | this.logger.info( 4271 | `Analysis configuration - Depth: ${analysisDepth}, Recursive: ${recursiveDepth}, Environment: ${includeEnvironment}` 4272 | ); 4273 | this.logger.info( 4274 | `Enhancement features - Knowledge: ${knowledgeEnhancement}, Learning: ${learningEnabled}` 4275 | ); 4276 | this.logger.info( 4277 | `Analysis scope: ${analysisScope.length > 0 ? analysisScope.join(', ') : 'Full ecosystem analysis'}` 4278 | ); 4279 | 4280 | ctx.info(`🌐 Starting comprehensive ecosystem analysis: ${projectPath}`); 4281 | ctx.report_progress(0, 100); 4282 | 4283 | try { 4284 | ctx.info('📊 Phase 1: Analyzing project structure'); 4285 | ctx.report_progress(10, 100); 4286 | 4287 | // Import utilities dynamically to avoid circular dependencies 4288 | const { analyzeProjectStructureCompat: analyzeProjectStructure } = await import( 4289 | './utils/file-system.js' 4290 | ); 4291 | 4292 | // Initialize ADR knowledge base on first run 4293 | ctx.info('📚 Phase 1.5: Initializing ADR knowledge base'); 4294 | ctx.report_progress(15, 100); 4295 | 4296 | try { 4297 | const { initializeAdrKnowledgeBase, isAdrKnowledgeBaseInitialized } = await import( 4298 | './utils/adr-knowledge-initializer.js' 4299 | ); 4300 | 4301 | const isInitialized = await isAdrKnowledgeBaseInitialized(this.kgManager); 4302 | 4303 | if (!isInitialized) { 4304 | this.logger.info('First run detected - initializing ADR knowledge base'); 4305 | const initResult = await initializeAdrKnowledgeBase( 4306 | this.kgManager, 4307 | this.config.adrDirectory, 4308 | projectPath 4309 | ); 4310 | 4311 | if (initResult.success) { 4312 | this.logger.info( 4313 | `✅ ADR knowledge base initialized with ${initResult.adrsIndexed} ADRs` 4314 | ); 4315 | ctx.info(`📚 Indexed ${initResult.adrsIndexed} existing ADRs to knowledge base`); 4316 | } else { 4317 | this.logger.warn( 4318 | `ADR knowledge base initialization completed with errors: ${initResult.errors.join(', ')}` 4319 | ); 4320 | } 4321 | } else { 4322 | this.logger.info('ADR knowledge base already initialized - skipping'); 4323 | } 4324 | } catch (error) { 4325 | this.logger.warn('Failed to initialize ADR knowledge base:', error); 4326 | // Don't fail the entire analysis if ADR initialization fails 4327 | } 4328 | 4329 | // Import advanced prompting utilities if enhanced mode is enabled 4330 | let generateArchitecturalKnowledge: GenerateArchitecturalKnowledgeFunction | null = null; 4331 | let executeWithReflexion: ExecuteWithReflexionFunction | null = null; 4332 | let retrieveRelevantMemories: RetrieveRelevantMemoriesFunction | null = null; 4333 | let createToolReflexionConfig: CreateToolReflexionConfigFunction | null = null; 4334 | 4335 | if (enhancedMode) { 4336 | if (knowledgeEnhancement) { 4337 | const knowledgeModule = await import('./utils/knowledge-generation.js'); 4338 | generateArchitecturalKnowledge = knowledgeModule.generateArchitecturalKnowledge; 4339 | } 4340 | 4341 | if (learningEnabled) { 4342 | const reflexionModule = await import('./utils/reflexion.js'); 4343 | executeWithReflexion = reflexionModule.executeWithReflexion; 4344 | retrieveRelevantMemories = reflexionModule.retrieveRelevantMemories; 4345 | createToolReflexionConfig = reflexionModule.createToolReflexionConfig; 4346 | } 4347 | } 4348 | 4349 | // Step 1: Generate technology-specific knowledge if enabled 4350 | ctx.info('🧠 Phase 2: Generating architectural knowledge'); 4351 | ctx.report_progress(25, 100); 4352 | 4353 | let knowledgeContext = ''; 4354 | if (enhancedMode && knowledgeEnhancement && generateArchitecturalKnowledge) { 4355 | try { 4356 | const knowledgeResult = await generateArchitecturalKnowledge( 4357 | { 4358 | projectPath, 4359 | technologies: technologyFocus, 4360 | patterns: [], 4361 | projectType: 'ecosystem-analysis', 4362 | existingAdrs: [], 4363 | }, 4364 | { 4365 | domains: this.getEcosystemAnalysisDomains(technologyFocus) as ArchitecturalDomain[], 4366 | depth: analysisDepth === 'basic' ? 'basic' : 'intermediate', 4367 | cacheEnabled: true, 4368 | } 4369 | ); 4370 | 4371 | knowledgeContext = ` 4372 | ## Technology-Specific Knowledge Enhancement 4373 | 4374 | The following architectural knowledge has been generated to enhance ecosystem analysis: 4375 | 4376 | ${knowledgeResult.prompt} 4377 | 4378 | --- 4379 | `; 4380 | } catch (error) { 4381 | this.logger.warn('Knowledge generation failed:', error); 4382 | knowledgeContext = '<!-- Knowledge generation unavailable -->\n'; 4383 | } 4384 | } 4385 | 4386 | // Step 2: Retrieve relevant memories if learning is enabled 4387 | let reflexionContext = ''; 4388 | if (enhancedMode && learningEnabled && retrieveRelevantMemories) { 4389 | try { 4390 | const memoryResult = await retrieveRelevantMemories( 4391 | 'ecosystem-analysis', 4392 | { projectPath, analysisDepth, technologyFocus }, 4393 | { maxResults: 5, relevanceThreshold: 0.6 } 4394 | ); 4395 | 4396 | reflexionContext = ` 4397 | ## Learning from Past Analyses 4398 | 4399 | The following insights from past ecosystem analysis tasks will inform this analysis: 4400 | 4401 | ${memoryResult.prompt} 4402 | 4403 | --- 4404 | `; 4405 | } catch (error) { 4406 | this.logger.warn('Reflexion memory retrieval failed:', error); 4407 | reflexionContext = '<!-- Learning context unavailable -->\n'; 4408 | } 4409 | } 4410 | 4411 | // Step 3: Generate base project analysis prompt with recursive depth 4412 | ctx.info('📁 Phase 3: Scanning project files and structure'); 4413 | ctx.report_progress(40, 100); 4414 | 4415 | const baseProjectAnalysisPrompt = await analyzeProjectStructure(projectPath); 4416 | 4417 | // Step 4: Generate environment analysis if enabled 4418 | ctx.info('🔧 Phase 4: Analyzing environment and infrastructure'); 4419 | ctx.report_progress(55, 100); 4420 | let environmentAnalysisContext = ''; 4421 | if (includeEnvironment) { 4422 | try { 4423 | this.logger.info('Including comprehensive environment analysis in ecosystem analysis'); 4424 | const { analyzeEnvironment } = await import('./tools/environment-analysis-tool.js'); 4425 | 4426 | // Call environment analysis with comprehensive scope 4427 | const environmentResult = await analyzeEnvironment({ 4428 | projectPath, 4429 | adrDirectory: this.config.adrDirectory, 4430 | analysisType: 'comprehensive', 4431 | }); 4432 | 4433 | // Extract environment analysis content 4434 | if (environmentResult.content && environmentResult.content[0]) { 4435 | environmentAnalysisContext = ` 4436 | ## Integrated Environment Analysis 4437 | 4438 | ${environmentResult.content[0].text} 4439 | 4440 | --- 4441 | `; 4442 | } 4443 | } catch (error) { 4444 | this.logger.warn('Environment analysis integration failed:', error); 4445 | environmentAnalysisContext = ` 4446 | ## Environment Analysis 4447 | <!-- Environment analysis unavailable: ${error instanceof Error ? error.message : 'Unknown error'} --> 4448 | 4449 | --- 4450 | `; 4451 | } 4452 | } 4453 | 4454 | // Step 5: Apply Reflexion execution if learning is enabled 4455 | ctx.info('🧪 Phase 5: Applying learning and reflexion'); 4456 | ctx.report_progress(70, 100); 4457 | 4458 | let enhancedAnalysisPrompt = baseProjectAnalysisPrompt.prompt + environmentAnalysisContext; 4459 | if (enhancedMode && learningEnabled && executeWithReflexion && createToolReflexionConfig) { 4460 | try { 4461 | const reflexionConfig = createToolReflexionConfig('analyze_project_ecosystem', { 4462 | reflectionDepth: analysisDepth === 'basic' ? 'basic' : 'detailed', 4463 | evaluationCriteria: ['task-success', 'accuracy', 'completeness'], 4464 | learningRate: 0.7, 4465 | }); 4466 | 4467 | const reflexionResult = await executeWithReflexion( 4468 | { 4469 | prompt: 4470 | baseProjectAnalysisPrompt.prompt + knowledgeContext + environmentAnalysisContext, 4471 | instructions: baseProjectAnalysisPrompt.instructions, 4472 | context: { 4473 | projectPath, 4474 | analysisDepth, 4475 | recursiveDepth, 4476 | technologyFocus, 4477 | includePatterns, 4478 | includeEnvironment, 4479 | analysisScope, 4480 | knowledgeEnhanced: knowledgeEnhancement, 4481 | learningEnabled: true, 4482 | }, 4483 | }, 4484 | reflexionConfig 4485 | ); 4486 | 4487 | enhancedAnalysisPrompt = reflexionResult.prompt; 4488 | } catch (error) { 4489 | this.logger.warn('Reflexion execution failed:', error); 4490 | enhancedAnalysisPrompt = 4491 | baseProjectAnalysisPrompt.prompt + knowledgeContext + environmentAnalysisContext; 4492 | } 4493 | } else { 4494 | enhancedAnalysisPrompt = 4495 | baseProjectAnalysisPrompt.prompt + knowledgeContext + environmentAnalysisContext; 4496 | } 4497 | 4498 | // Execute the analysis with AI if enabled, otherwise return prompt 4499 | ctx.info('🤖 Phase 6: Executing AI-powered ecosystem analysis'); 4500 | ctx.report_progress(85, 100); 4501 | 4502 | const { executeEcosystemAnalysisPrompt, formatMCPResponse } = await import( 4503 | './utils/prompt-execution.js' 4504 | ); 4505 | const executionResult = await executeEcosystemAnalysisPrompt( 4506 | enhancedAnalysisPrompt, 4507 | baseProjectAnalysisPrompt.instructions, 4508 | { 4509 | temperature: 0.1, 4510 | maxTokens: 6000, 4511 | } 4512 | ); 4513 | 4514 | // Step 6: Record project structure to knowledge graph 4515 | try { 4516 | this.logger.info('Recording project structure to knowledge graph'); 4517 | 4518 | const projectStructureSnapshot = { 4519 | projectPath, 4520 | analysisDepth, 4521 | recursiveDepth, 4522 | technologyFocus, 4523 | analysisScope, 4524 | includeEnvironment, 4525 | timestamp: new Date().toISOString(), 4526 | structureData: baseProjectAnalysisPrompt.context || {}, 4527 | }; 4528 | 4529 | await this.kgManager.recordProjectStructure(projectStructureSnapshot); 4530 | this.logger.info('✅ Project structure recorded to knowledge graph'); 4531 | } catch (kgError) { 4532 | this.logger.warn('Failed to record project structure to knowledge graph:', kgError); 4533 | // Don't fail the entire analysis if KG recording fails 4534 | } 4535 | 4536 | ctx.info('✅ Ecosystem analysis completed successfully'); 4537 | ctx.report_progress(100, 100); 4538 | 4539 | // Return appropriate response based on execution result 4540 | if (executionResult.isAIGenerated) { 4541 | // AI execution successful - return actual analysis results 4542 | return formatMCPResponse({ 4543 | ...executionResult, 4544 | content: `# Comprehensive Project Ecosystem Analysis Results 4545 | 4546 | ## Analysis Configuration 4547 | - **Project Path**: ${projectPath} 4548 | - **Analysis Depth**: ${analysisDepth} 4549 | - **Recursive Depth**: ${recursiveDepth} 4550 | - **Environment Analysis**: ${includeEnvironment ? '✅ Included' : '❌ Excluded'} 4551 | - **Analysis Scope**: ${analysisScope.length > 0 ? analysisScope.join(', ') : 'Full ecosystem analysis'} 4552 | 4553 | ## Enhancement Features 4554 | - **Knowledge Generation**: ${enhancedMode && knowledgeEnhancement ? '✅ Enabled' : '❌ Disabled'} 4555 | - **Reflexion Learning**: ${enhancedMode && learningEnabled ? '✅ Enabled' : '❌ Disabled'} 4556 | - **Enhanced Mode**: ${enhancedMode ? '✅ Enabled' : '❌ Disabled'} 4557 | - **Technology Focus**: ${technologyFocus.length > 0 ? technologyFocus.join(', ') : 'Auto-detect'} 4558 | - **Knowledge Graph**: ✅ Project structure recorded 4559 | 4560 | ${knowledgeContext} 4561 | 4562 | ${reflexionContext} 4563 | 4564 | ## Comprehensive Ecosystem Analysis Results 4565 | 4566 | ${executionResult.content} 4567 | 4568 | ${ 4569 | includeEnvironment 4570 | ? ` 4571 | 4572 | ## Environment Integration Summary 4573 | 4574 | The analysis above includes comprehensive environment analysis covering: 4575 | - **Infrastructure Specifications**: Deployment and runtime environment details 4576 | - **Containerization**: Docker, Kubernetes, and container orchestration analysis 4577 | - **Environment Requirements**: Configuration and dependency requirements 4578 | - **Compliance Assessment**: Security and regulatory compliance evaluation 4579 | 4580 | This integrated approach provides complete understanding of both codebase patterns AND operational environment. 4581 | ` 4582 | : '' 4583 | } 4584 | 4585 | ## Next Steps: Complete Ecosystem Understanding 4586 | 4587 | Based on the comprehensive analysis above: 4588 | 4589 | ### **Immediate Actions** 4590 | 1. **Review Ecosystem Overview**: Examine the complete technology stack and environment context 4591 | 2. **Assess Integration Points**: Understand how code patterns relate to operational environment 4592 | 3. **Identify Critical Dependencies**: Focus on key dependencies between code and infrastructure 4593 | 4594 | ### **Strategic Planning** 4595 | 4. **Address Architectural Issues**: Prioritize improvements based on both code and environment analysis 4596 | 5. **Plan Environment Optimization**: Optimize deployment and operational configurations 4597 | 6. **Update Documentation**: Document both architectural decisions and environment specifications 4598 | 4599 | ### **Implementation Roadmap** 4600 | 7. **Implement Code Improvements**: Execute code-level architectural enhancements 4601 | 8. **Optimize Environment**: Improve infrastructure and deployment configurations 4602 | 9. **Monitor Integration**: Ensure code and environment changes work together effectively 4603 | 4604 | This comprehensive ecosystem analysis provides the foundation for informed architectural and operational decisions. 4605 | `, 4606 | }); 4607 | } else { 4608 | // Fallback to prompt-only mode 4609 | return { 4610 | content: [ 4611 | { 4612 | type: 'text', 4613 | text: `# Comprehensive Project Ecosystem Analysis 4614 | 4615 | This comprehensive analysis provides deep recursive project understanding with integrated environment analysis. 4616 | 4617 | ## Analysis Configuration 4618 | - **Project Path**: ${projectPath} 4619 | - **Analysis Depth**: ${analysisDepth} 4620 | - **Recursive Depth**: ${recursiveDepth} 4621 | - **Environment Analysis**: ${includeEnvironment ? '✅ Included' : '❌ Excluded'} 4622 | - **Analysis Scope**: ${analysisScope.length > 0 ? analysisScope.join(', ') : 'Full ecosystem analysis'} 4623 | 4624 | ## Enhancement Features 4625 | - **Knowledge Generation**: ${enhancedMode && knowledgeEnhancement ? '✅ Enabled' : '❌ Disabled'} 4626 | - **Reflexion Learning**: ${enhancedMode && learningEnabled ? '✅ Enabled' : '❌ Disabled'} 4627 | - **Enhanced Mode**: ${enhancedMode ? '✅ Enabled' : '❌ Disabled'} 4628 | - **Technology Focus**: ${technologyFocus.length > 0 ? technologyFocus.join(', ') : 'Auto-detect'} 4629 | - **Include Patterns**: ${includePatterns?.length ? includePatterns.join(', ') : 'Default patterns'} 4630 | - **Knowledge Graph**: ✅ Project structure recorded 4631 | 4632 | ${knowledgeContext} 4633 | 4634 | ${reflexionContext} 4635 | 4636 | ## Enhanced Analysis Prompt 4637 | 4638 | ${enhancedAnalysisPrompt} 4639 | 4640 | ## Enhanced Implementation Instructions 4641 | 4642 | ${baseProjectAnalysisPrompt.instructions} 4643 | 4644 | ### Enhancement-Specific Instructions 4645 | 4646 | ${ 4647 | enhancedMode && knowledgeEnhancement 4648 | ? ` 4649 | #### Knowledge Enhancement 4650 | - Apply technology-specific knowledge to ecosystem analysis 4651 | - Use domain expertise to identify patterns and anti-patterns 4652 | - Leverage architectural best practices for technology stack evaluation 4653 | ` 4654 | : '' 4655 | } 4656 | 4657 | ${ 4658 | enhancedMode && learningEnabled 4659 | ? ` 4660 | #### Learning Integration 4661 | - Apply lessons learned from past ecosystem analyses 4662 | - Use memory insights to improve pattern recognition accuracy 4663 | - Incorporate feedback from previous analysis outcomes 4664 | ` 4665 | : '' 4666 | } 4667 | 4668 | ## Expected Enhanced Output 4669 | 4670 | The enhanced analysis should provide: 4671 | 1. **Technology Stack Analysis** with domain knowledge context 4672 | 2. **Architectural Pattern Detection** informed by past experiences 4673 | 3. **Ecosystem Health Assessment** using learned evaluation criteria 4674 | 4. **Improvement Recommendations** based on domain best practices 4675 | 5. **Learning Insights** for future analysis improvement 4676 | 4677 | ## Quality Assurance 4678 | 4679 | - Ensure analysis leverages all available enhancement features 4680 | - Verify technology-specific knowledge is properly applied 4681 | - Confirm learning insights improve analysis accuracy 4682 | - Validate recommendations align with domain best practices`, 4683 | }, 4684 | ], 4685 | }; 4686 | } 4687 | } catch (error) { 4688 | throw new McpAdrError( 4689 | `Failed to analyze project ecosystem: ${error instanceof Error ? error.message : String(error)}`, 4690 | 'ANALYSIS_ERROR' 4691 | ); 4692 | } 4693 | } 4694 | 4695 | private async getArchitecturalContext( 4696 | args: GetArchitecturalContextArgs 4697 | ): Promise<CallToolResult> { 4698 | const { filePath, includeCompliance = true } = args; 4699 | 4700 | try { 4701 | const { 4702 | analyzeProjectStructureCompat: analyzeProjectStructure, 4703 | fileExistsCompat: fileExists, 4704 | ensureDirectoryCompat: ensureDirectory, 4705 | } = await import('./utils/file-system.js'); 4706 | const path = await import('path'); 4707 | 4708 | // Determine project path 4709 | const projectPath = filePath 4710 | ? filePath.split('/').slice(0, -1).join('/') 4711 | : this.config.projectPath; 4712 | const adrDirectory = path.join(projectPath, this.config.adrDirectory); 4713 | 4714 | // Generate prompts for ADR directory setup 4715 | const adrDirectoryCheckPrompt = await fileExists(adrDirectory); 4716 | const adrDirectorySetupPrompt = await ensureDirectory(adrDirectory); 4717 | 4718 | // Generate architectural analysis prompt 4719 | const projectAnalysisPrompt = await analyzeProjectStructure(projectPath); 4720 | 4721 | const architecturalPrompt = ` 4722 | # Architectural Context Analysis & Project Setup 4723 | 4724 | ## Project Overview 4725 | **Project Path**: ${projectPath} 4726 | **Analysis Scope**: ${filePath ? `Specific file: ${filePath}` : 'Entire project'} 4727 | **ADR Directory**: ${this.config.adrDirectory} 4728 | **Include Compliance**: ${includeCompliance ? 'Yes' : 'No'} 4729 | 4730 | ## 🚀 ADR Infrastructure Setup 4731 | 4732 | This analysis will include setting up ADR infrastructure if needed: 4733 | 4734 | ### ADR Directory Check 4735 | ${adrDirectoryCheckPrompt.prompt} 4736 | 4737 | ### ADR Directory Setup (if needed) 4738 | ${adrDirectorySetupPrompt.prompt} 4739 | 4740 | ## Comprehensive Project Analysis 4741 | 4742 | ${projectAnalysisPrompt.prompt} 4743 | 4744 | ## Enhanced Architectural Focus 4745 | 4746 | Please provide a **comprehensive, outcome-focused analysis** including: 4747 | 4748 | ### 1. Technology Stack & Infrastructure Analysis 4749 | - **Core Technologies**: Programming languages, frameworks, runtime environments 4750 | - **Dependencies**: Package managers, third-party libraries, version constraints 4751 | - **Build & Deployment**: CI/CD pipelines, build tools, deployment strategies 4752 | - **Data Layer**: Databases, caching, data storage and retrieval patterns 4753 | 4754 | ### 2. Architectural Pattern & Design Analysis 4755 | - **System Architecture**: Monolith, microservices, serverless, hybrid patterns 4756 | - **Code Organization**: Module structure, separation of concerns, layering 4757 | - **API Design**: REST, GraphQL, RPC patterns and conventions 4758 | - **Data Flow**: Request/response cycles, event handling, state management 4759 | ${filePath ? `- **File-specific Context**: How ${filePath} fits into the overall architecture` : ''} 4760 | 4761 | ### 3. Quality, Security & Performance Assessment 4762 | - **Code Quality**: Structure, naming, documentation, testing strategies 4763 | - **Security Implementation**: Authentication, authorization, data protection 4764 | - **Performance Patterns**: Caching, optimization, scalability considerations 4765 | - **Monitoring & Observability**: Logging, metrics, error tracking 4766 | 4767 | ### 4. Architectural Decision Discovery & Documentation 4768 | - **Explicit Decisions**: Find existing documentation and decision records 4769 | - **Implicit Decisions**: Identify significant undocumented architectural choices 4770 | - **Technology Rationale**: Understand selection criteria and trade-offs 4771 | - **Evolution Path**: How the architecture has changed over time 4772 | 4773 | ${ 4774 | includeCompliance 4775 | ? `### 5. Compliance & Standards Assessment 4776 | - **Industry Standards**: Adherence to relevant industry standards and best practices 4777 | - **Security Compliance**: Security standards compliance (OWASP, SOC2, etc.) 4778 | - **Code Standards**: Coding standards and style guide compliance 4779 | - **Architectural Compliance**: Adherence to established architectural principles 4780 | - **Regulatory Requirements**: Any regulatory compliance requirements (GDPR, HIPAA, etc.)` 4781 | : '' 4782 | } 4783 | 4784 | ## Expected Output: Outcome-Focused Architectural Context 4785 | 4786 | Provide a **comprehensive architectural context** with **clear project outcomes**: 4787 | 4788 | ### 📋 **1. Executive Summary & Project Outcomes** 4789 | - **Current State**: What the project is and what it does 4790 | - **Architectural Maturity**: Assessment of current architectural practices 4791 | - **Key Strengths**: What's working well architecturally 4792 | - **Critical Gaps**: What needs immediate attention 4793 | - **Success Metrics**: How to measure architectural improvements 4794 | 4795 | ### 🔧 **2. Technology & Infrastructure Inventory** 4796 | - **Technology Stack**: Complete inventory with versions and purposes 4797 | - **Infrastructure Components**: Deployment, monitoring, data storage 4798 | - **Dependencies**: Critical dependencies and potential risks 4799 | - **Tool Chain**: Development, testing, and deployment tools 4800 | 4801 | ### 🏗️ **3. Architectural Patterns & Design Decisions** 4802 | - **System Design**: Overall architectural approach and patterns 4803 | - **Component Architecture**: How major components interact 4804 | - **Data Architecture**: How data flows and is managed 4805 | - **Integration Patterns**: How external systems are integrated 4806 | 4807 | ### 📊 **4. Quality & Compliance Assessment** 4808 | - **Code Quality Score**: Assessment of current code quality 4809 | - **Security Posture**: Security implementation and gaps 4810 | - **Performance Profile**: Current performance characteristics 4811 | - **Maintainability Index**: How easy the system is to maintain and evolve 4812 | 4813 | ### 🎯 **5. Outcome-Focused Action Plan** 4814 | Based on the analysis, provide a **clear workflow** with **projected outcomes**: 4815 | 4816 | #### **Immediate Actions (Next 1-2 weeks)** 4817 | - **Priority 1**: Most critical architectural issues to address 4818 | - **Quick Wins**: Low-effort, high-impact improvements 4819 | - **Documentation**: Essential decisions that need immediate documentation 4820 | 4821 | #### **Short-term Goals (Next 1-3 months)** 4822 | - **Architectural Improvements**: Planned enhancements with expected outcomes 4823 | - **Technical Debt**: Priority technical debt to address 4824 | - **Process Improvements**: Development workflow enhancements 4825 | 4826 | #### **Long-term Vision (3-12 months)** 4827 | - **Strategic Architecture**: Long-term architectural evolution 4828 | - **Scalability Roadmap**: How to scale the system effectively 4829 | - **Innovation Opportunities**: Areas for architectural innovation 4830 | 4831 | ### 📈 **6. Success Metrics & Outcomes** 4832 | Define **measurable outcomes** for architectural improvements: 4833 | 4834 | - **Performance Metrics**: Response times, throughput, resource utilization 4835 | - **Quality Metrics**: Code coverage, bug rates, maintainability scores 4836 | - **Developer Experience**: Build times, deployment frequency, developer satisfaction 4837 | - **Business Impact**: Feature delivery speed, system reliability, cost efficiency 4838 | 4839 | ### 🏗️ **7. ADR Infrastructure & Documentation Plan** 4840 | 4841 | If ADR directory doesn't exist, also provide: 4842 | 4843 | 1. **Create Directory Structure**: 4844 | \`\`\` 4845 | ${this.config.adrDirectory}/ 4846 | ├── 0001-record-architecture-decisions.md (template) 4847 | ├── README.md (ADR process guide) 4848 | └── template.md (ADR template) 4849 | \`\`\` 4850 | 4851 | 2. **Generate Initial ADRs** for discovered architectural decisions 4852 | 3. **Create ADR Process Guide** for the team 4853 | 4. **Establish ADR Workflow** for future decisions 4854 | 4855 | ### 🔄 **8. Continuous Improvement Workflow** 4856 | Establish ongoing architectural governance: 4857 | 4858 | - **Regular Reviews**: Monthly architectural health checks 4859 | - **Decision Documentation**: Process for documenting new architectural decisions 4860 | - **Compliance Monitoring**: Ongoing adherence to architectural standards 4861 | - **Evolution Planning**: Quarterly architectural roadmap updates 4862 | 4863 | ## Next Steps: Grounded Project Workflow 4864 | 4865 | After this analysis, follow this **outcome-focused workflow**: 4866 | 4867 | 1. **📋 Review Analysis**: Examine the architectural context and recommendations 4868 | 2. **🎯 Set Priorities**: Choose 3-5 most impactful improvements based on outcomes 4869 | 3. **📝 Document Decisions**: Create ADRs for significant architectural choices 4870 | 4. **🔧 Implement Changes**: Execute improvements in priority order 4871 | 5. **📊 Measure Progress**: Track success metrics and outcomes 4872 | 6. **🔄 Iterate**: Regular reviews and continuous improvement 4873 | 4874 | This approach ensures that architectural work is **grounded in measurable outcomes** and **aligned with project success**. 4875 | `; 4876 | 4877 | // Execute the analysis with AI if enabled, otherwise return prompt 4878 | const { executeEcosystemAnalysisPrompt, formatMCPResponse } = await import( 4879 | './utils/prompt-execution.js' 4880 | ); 4881 | const executionResult = await executeEcosystemAnalysisPrompt( 4882 | architecturalPrompt, 4883 | projectAnalysisPrompt.instructions, 4884 | { 4885 | temperature: 0.1, 4886 | maxTokens: 5000, 4887 | systemPrompt: `You are a senior software architect specializing in architectural context analysis. 4888 | Analyze the provided project to understand its architectural patterns, design decisions, and structural organization. 4889 | Focus on providing actionable insights about the architecture that can guide development decisions.`, 4890 | } 4891 | ); 4892 | 4893 | if (executionResult.isAIGenerated) { 4894 | // AI execution successful - return actual analysis results 4895 | return formatMCPResponse({ 4896 | ...executionResult, 4897 | content: `# Architectural Context Analysis Results 4898 | 4899 | ${filePath ? `## Target File: ${filePath}` : '## Project-wide Analysis'} 4900 | 4901 | ## Project Information 4902 | - **Project Path**: ${projectPath} 4903 | - **Analysis Scope**: ${filePath ? 'File-specific' : 'Project-wide'} 4904 | - **ADR Directory**: ${this.config.adrDirectory} 4905 | 4906 | ## ADR Infrastructure Setup 4907 | 4908 | The analysis includes automatic ADR infrastructure setup: 4909 | 4910 | ${adrDirectoryCheckPrompt.instructions} 4911 | 4912 | ${adrDirectorySetupPrompt.instructions} 4913 | 4914 | ## AI Analysis Results 4915 | 4916 | ${executionResult.content} 4917 | 4918 | ## Outcome-Focused Next Steps 4919 | 4920 | Based on the architectural analysis, follow this **grounded workflow**: 4921 | 4922 | ### **Immediate Actions (This Week)** 4923 | 1. **Review Analysis**: Examine the architectural context and recommendations above 4924 | 2. **Set Up ADRs**: Ensure ADR directory structure is created and ready 4925 | 3. **Identify Quick Wins**: Focus on low-effort, high-impact improvements 4926 | 4927 | ### **Short-term Goals (Next Month)** 4928 | 4. **Document Key Decisions**: Create ADRs for the most significant architectural choices 4929 | 5. **Address Critical Issues**: Tackle the highest-priority architectural concerns 4930 | 6. **Establish Metrics**: Set up measurement for the success metrics identified 4931 | 4932 | ### **Long-term Vision (Next Quarter)** 4933 | 7. **Implement Roadmap**: Execute the architectural improvement plan 4934 | 8. **Monitor Progress**: Track success metrics and adjust approach as needed 4935 | 9. **Continuous Improvement**: Establish regular architectural reviews 4936 | 4937 | This **outcome-focused approach** ensures architectural work delivers **measurable value** and keeps the project **grounded in clear objectives**. 4938 | `, 4939 | }); 4940 | } else { 4941 | // Fallback to prompt-only mode 4942 | return { 4943 | content: [ 4944 | { 4945 | type: 'text', 4946 | text: architecturalPrompt, 4947 | }, 4948 | ], 4949 | }; 4950 | } 4951 | } catch (error) { 4952 | throw new McpAdrError( 4953 | `Failed to get architectural context: ${error instanceof Error ? error.message : String(error)}`, 4954 | 'ANALYSIS_ERROR' 4955 | ); 4956 | } 4957 | } 4958 | 4959 | private async generateAdrsFromPrd( 4960 | args: Record<string, unknown>, 4961 | context?: ToolContext 4962 | ): Promise<CallToolResult> { 4963 | const ctx = context || createNoOpContext(); 4964 | 4965 | const { 4966 | prdPath, 4967 | enhancedMode = true, 4968 | promptOptimization = true, 4969 | knowledgeEnhancement = true, 4970 | prdType = 'general', 4971 | } = args; 4972 | const outputDirectory = args['outputDirectory'] || this.config.adrDirectory; 4973 | 4974 | this.logger.info(`Generating enhanced ADRs from PRD: ${prdPath} to ${outputDirectory}`); 4975 | this.logger.info( 4976 | `Enhancement features - APE: ${promptOptimization}, Knowledge: ${knowledgeEnhancement}, Type: ${prdType}` 4977 | ); 4978 | 4979 | ctx.info(`📝 Starting ADR generation from PRD: ${prdPath}`); 4980 | ctx.report_progress(0, 100); 4981 | 4982 | try { 4983 | ctx.info('📂 Phase 1: Validating PRD file'); 4984 | ctx.report_progress(10, 100); 4985 | const { readFileContentCompat: readFileContent, fileExistsCompat: fileExists } = await import( 4986 | './utils/file-system.js' 4987 | ); 4988 | 4989 | // Import advanced prompting utilities if enhanced mode is enabled 4990 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 4991 | let generateArchitecturalKnowledge: any = null; 4992 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 4993 | let optimizePromptWithAPE: any = null; 4994 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 4995 | let createToolAPEConfig: any = null; 4996 | 4997 | if (enhancedMode) { 4998 | if (knowledgeEnhancement) { 4999 | const knowledgeModule = await import('./utils/knowledge-generation.js'); 5000 | generateArchitecturalKnowledge = knowledgeModule.generateArchitecturalKnowledge; 5001 | } 5002 | 5003 | if (promptOptimization) { 5004 | const apeModule = await import('./utils/automatic-prompt-engineering.js'); 5005 | optimizePromptWithAPE = apeModule.optimizePromptWithAPE; 5006 | createToolAPEConfig = apeModule.createToolAPEConfig; 5007 | } 5008 | } 5009 | 5010 | // Generate file existence check prompt 5011 | const fileExistsPrompt = await fileExists(prdPath as string); 5012 | 5013 | // Generate file content reading prompt 5014 | const fileContentPrompt = await readFileContent(prdPath as string); 5015 | 5016 | ctx.info('📚 Phase 2: Reading PRD content'); 5017 | ctx.report_progress(25, 100); 5018 | 5019 | // Step 1: Generate domain-specific knowledge if enabled 5020 | ctx.info('🧠 Phase 3: Generating domain knowledge'); 5021 | ctx.report_progress(40, 100); 5022 | 5023 | let knowledgeContext = ''; 5024 | if (enhancedMode && knowledgeEnhancement && generateArchitecturalKnowledge) { 5025 | try { 5026 | const knowledgeResult = await generateArchitecturalKnowledge( 5027 | { 5028 | projectPath: outputDirectory, 5029 | technologies: [], 5030 | patterns: [], 5031 | projectType: prdType, 5032 | existingAdrs: [], 5033 | }, 5034 | { 5035 | domains: this.getPrdTypeDomains(prdType as string), 5036 | depth: 'intermediate', 5037 | cacheEnabled: true, 5038 | } 5039 | ); 5040 | 5041 | knowledgeContext = ` 5042 | ## Domain-Specific Knowledge Enhancement 5043 | 5044 | The following architectural knowledge has been generated to enhance PRD analysis and ADR creation: 5045 | 5046 | ${knowledgeResult.prompt} 5047 | 5048 | --- 5049 | `; 5050 | } catch (error) { 5051 | this.logger.warn('Knowledge generation failed:', error); 5052 | knowledgeContext = '<!-- Knowledge generation unavailable -->\n'; 5053 | } 5054 | } 5055 | 5056 | // Step 2: Create base ADR generation prompt 5057 | ctx.info('📋 Phase 4: Creating base ADR prompts'); 5058 | ctx.report_progress(60, 100); 5059 | 5060 | const baseAdrPrompt = this.createBaseAdrPrompt( 5061 | prdPath as string, 5062 | outputDirectory as string, 5063 | knowledgeContext 5064 | ); 5065 | 5066 | // Step 3: Apply APE optimization if enabled 5067 | ctx.info('⚡ Phase 5: Optimizing prompts with APE'); 5068 | ctx.report_progress(75, 100); 5069 | 5070 | let finalAdrPrompt = baseAdrPrompt; 5071 | if (enhancedMode && promptOptimization && optimizePromptWithAPE && createToolAPEConfig) { 5072 | try { 5073 | const apeConfig = createToolAPEConfig('generate_adrs_from_prd', { 5074 | candidateCount: 5, 5075 | evaluationCriteria: ['task-completion', 'clarity', 'specificity'], 5076 | optimizationRounds: 2, 5077 | qualityThreshold: 0.75, 5078 | }); 5079 | 5080 | const apeResult = await optimizePromptWithAPE( 5081 | { 5082 | prompt: baseAdrPrompt, 5083 | instructions: 'Generate comprehensive ADRs from PRD analysis', 5084 | context: { 5085 | prdPath, 5086 | outputDirectory, 5087 | prdType, 5088 | knowledgeEnhanced: knowledgeEnhancement, 5089 | }, 5090 | }, 5091 | apeConfig 5092 | ); 5093 | 5094 | finalAdrPrompt = apeResult.prompt; 5095 | } catch (error) { 5096 | this.logger.warn('APE optimization failed:', error); 5097 | finalAdrPrompt = baseAdrPrompt; 5098 | } 5099 | } 5100 | 5101 | // Generate comprehensive ADR creation prompt that includes file operations 5102 | const adrPrompt = ` 5103 | # Enhanced ADR Generation from PRD Request 5104 | 5105 | This is a comprehensive prompt-driven ADR generation process enhanced with advanced prompting techniques. 5106 | 5107 | ## Enhancement Status 5108 | - **APE Optimization**: ${enhancedMode && promptOptimization ? '✅ Enabled' : '❌ Disabled'} 5109 | - **Knowledge Generation**: ${enhancedMode && knowledgeEnhancement ? '✅ Enabled' : '❌ Disabled'} 5110 | - **PRD Type**: ${prdType} 5111 | - **Enhanced Mode**: ${enhancedMode ? '✅ Enabled' : '❌ Disabled'} 5112 | 5113 | ## Step 1: File Validation 5114 | ${fileExistsPrompt.prompt} 5115 | 5116 | **Instructions**: First, execute the file existence check above. If the file does not exist, stop the process and report the error. Only proceed to Step 2 if the file exists. 5117 | 5118 | ## Step 2: PRD Content Reading 5119 | ${fileContentPrompt.prompt} 5120 | 5121 | **Instructions**: Execute the file reading operation above to obtain the PRD content. Use the content from this step for the enhanced ADR generation in Step 3. 5122 | 5123 | ## Step 3: Enhanced ADR Generation 5124 | 5125 | ${ 5126 | enhancedMode && promptOptimization 5127 | ? ` 5128 | ### APE-Optimized Analysis 5129 | This prompt has been optimized using Automatic Prompt Engineering for superior ADR generation quality. 5130 | The optimization focused on task completion, clarity, and specificity for PRD analysis. 5131 | 5132 | ` 5133 | : '' 5134 | } 5135 | 5136 | ${finalAdrPrompt} 5137 | 5138 | ### File Creation Instructions 5139 | 5140 | For each generated ADR, create a file creation prompt using the following pattern: 5141 | - **File Path**: ${outputDirectory}/[number]-[decision-title].md 5142 | - **Content**: The complete enhanced ADR markdown content 5143 | - **Action Confirmation**: Require user confirmation before creating files 5144 | - **Security Validation**: Ensure output directory is safe and authorized 5145 | 5146 | ### Enhanced Quality Assurance 5147 | 5148 | - Ensure each ADR leverages domain knowledge when available 5149 | - Verify decisions align with PRD type best practices 5150 | - Check that enhancement features are properly utilized 5151 | - Validate that ADR content exceeds baseline quality expectations 5152 | - Confirm all decisions are traceable back to PRD requirements with domain context 5153 | `; 5154 | 5155 | // Execute the ADR generation with AI if enabled, otherwise return prompt 5156 | ctx.info('🤖 Phase 6: Executing AI-powered ADR generation'); 5157 | ctx.report_progress(90, 100); 5158 | 5159 | const { executeADRGenerationPrompt, formatMCPResponse } = await import( 5160 | './utils/prompt-execution.js' 5161 | ); 5162 | const executionResult = await executeADRGenerationPrompt( 5163 | adrPrompt, 5164 | 'Generate comprehensive ADRs from PRD analysis with enhanced domain knowledge and optimization', 5165 | { 5166 | temperature: 0.1, 5167 | maxTokens: 8000, 5168 | systemPrompt: `You are an expert software architect who creates comprehensive Architectural Decision Records (ADRs) from Product Requirements Documents (PRDs). 5169 | Generate well-structured ADRs that follow best practices and include all necessary sections. 5170 | Focus on extracting architectural decisions from the PRD and creating actionable ADRs with clear reasoning.`, 5171 | } 5172 | ); 5173 | 5174 | ctx.info('✅ ADR generation completed successfully'); 5175 | ctx.report_progress(100, 100); 5176 | 5177 | if (executionResult.isAIGenerated) { 5178 | // AI execution successful - return actual ADR generation results 5179 | return formatMCPResponse({ 5180 | ...executionResult, 5181 | content: `# ADR Generation from PRD Results 5182 | 5183 | ## Enhancement Features 5184 | - **APE Optimization**: ${enhancedMode && promptOptimization ? '✅ Enabled' : '❌ Disabled'} 5185 | - **Knowledge Generation**: ${enhancedMode && knowledgeEnhancement ? '✅ Enabled' : '❌ Disabled'} 5186 | - **PRD Type Optimization**: ${prdType} 5187 | - **Enhanced Mode**: ${enhancedMode ? '✅ Enabled' : '❌ Disabled'} 5188 | 5189 | ## Source Information 5190 | - **PRD Path**: ${prdPath} 5191 | - **Output Directory**: ${outputDirectory} 5192 | 5193 | ## Generated ADRs 5194 | 5195 | ${executionResult.content} 5196 | 5197 | ## Next Steps 5198 | 5199 | 1. **Review Generated ADRs**: Examine each ADR for completeness and accuracy 5200 | 2. **Save ADR Files**: Create individual .md files for each ADR in ${outputDirectory} 5201 | 3. **Update ADR Index**: Add new ADRs to your project's ADR catalog 5202 | 4. **Stakeholder Review**: Share ADRs with team for feedback and approval 5203 | 5. **Implementation Planning**: Create tasks for implementing the architectural decisions 5204 | 5205 | ## File Creation Commands 5206 | 5207 | To save the generated ADRs, create individual files in ${outputDirectory}: 5208 | 5209 | \`\`\`bash 5210 | # Create ADR directory if it doesn't exist 5211 | mkdir -p ${outputDirectory} 5212 | 5213 | # Save each ADR as a separate file (example) 5214 | # Replace [NUMBER] and [TITLE] with actual values from generated ADRs 5215 | # cat > "${outputDirectory}/001-example-decision.md" << 'EOF' 5216 | # [ADR content here] 5217 | # EOF 5218 | \`\`\` 5219 | `, 5220 | }); 5221 | } else { 5222 | // Fallback to prompt-only mode 5223 | return { 5224 | content: [ 5225 | { 5226 | type: 'text', 5227 | text: `# Enhanced ADR Generation from PRD: ${prdPath} 5228 | 5229 | ## Advanced Prompt-Driven ADR Generation Process 5230 | 5231 | This tool uses a 100% prompt-driven architecture enhanced with advanced prompting techniques: 5232 | 5233 | ### Enhancement Features 5234 | - **APE Optimization**: ${enhancedMode && promptOptimization ? '✅ Enabled - Prompts optimized for superior quality' : '❌ Disabled'} 5235 | - **Knowledge Generation**: ${enhancedMode && knowledgeEnhancement ? '✅ Enabled - Domain knowledge enhanced analysis' : '❌ Disabled'} 5236 | - **PRD Type Optimization**: ${prdType} - Tailored for specific domain requirements 5237 | - **Enhanced Mode**: ${enhancedMode ? '✅ Enabled - All advanced features active' : '❌ Disabled - Basic mode'} 5238 | 5239 | ### Enhanced AI Agent Workflow 5240 | 5241 | 1. **Validate PRD file existence** using secure file system operations 5242 | 2. **Read PRD content** safely with proper security validation 5243 | 3. **Apply domain knowledge** to enhance understanding (if enabled) 5244 | 4. **Generate optimized ADRs** using APE-enhanced prompts (if enabled) 5245 | 5. **Create enhanced ADR files** in the specified output directory: ${outputDirectory} 5246 | 5247 | ## Execution Instructions 5248 | 5249 | Please execute the following enhanced comprehensive prompt: 5250 | 5251 | ${adrPrompt} 5252 | 5253 | ## Advanced Features 5254 | 5255 | ${ 5256 | enhancedMode && knowledgeEnhancement 5257 | ? ` 5258 | ### Knowledge Enhancement 5259 | - Domain-specific architectural knowledge has been generated 5260 | - PRD analysis is enhanced with ${prdType} domain expertise 5261 | - ADR decisions leverage domain best practices and patterns 5262 | ` 5263 | : '' 5264 | } 5265 | 5266 | ${ 5267 | enhancedMode && promptOptimization 5268 | ? ` 5269 | ### APE Optimization 5270 | - Prompts have been automatically optimized for quality 5271 | - Enhanced evaluation criteria ensure superior ADR generation 5272 | - Optimization focused on task completion, clarity, and specificity 5273 | ` 5274 | : '' 5275 | } 5276 | 5277 | ## Security and Validation 5278 | 5279 | - All file operations include security validation 5280 | - Path traversal protection is enabled 5281 | - System directory access is prevented 5282 | - User confirmation is required for file creation 5283 | - Content validation ensures safe enhanced ADR generation 5284 | 5285 | ## Expected Enhanced Workflow 5286 | 5287 | 1. Execute file existence check for: ${prdPath} 5288 | 2. If file exists, read PRD content securely 5289 | 3. Apply domain knowledge to enhance PRD understanding 5290 | 4. Analyze PRD content using optimized prompts 5291 | 5. Generate domain-enhanced individual ADRs for each decision 5292 | 6. Create file creation prompts for each enhanced ADR 5293 | 7. Confirm with user before writing files to: ${outputDirectory} 5294 | 5295 | The enhanced process maintains full traceability from PRD requirements to generated ADRs while providing superior quality through advanced prompting techniques and ensuring security and user control over file operations.`, 5296 | }, 5297 | ], 5298 | }; 5299 | } 5300 | } catch (error) { 5301 | throw new McpAdrError( 5302 | `Failed to generate ADR prompts from PRD: ${error instanceof Error ? error.message : String(error)}`, 5303 | 'PROMPT_GENERATION_ERROR' 5304 | ); 5305 | } 5306 | } 5307 | 5308 | private async compareAdrProgress(args: Record<string, unknown>): Promise<CallToolResult> { 5309 | const { 5310 | todoPath = 'TODO.md', 5311 | adrDirectory = this.config.adrDirectory, 5312 | projectPath = this.config.projectPath, 5313 | environment = 'auto-detect', 5314 | environmentConfig = {}, 5315 | validationType = 'full', 5316 | includeFileChecks = true, 5317 | includeRuleValidation = true, 5318 | deepCodeAnalysis = true, 5319 | functionalValidation = true, 5320 | strictMode = true, 5321 | environmentValidation = true, 5322 | } = args; 5323 | 5324 | const { getAdrDirectoryPath } = await import('./utils/config.js'); 5325 | const path = await import('path'); 5326 | 5327 | // Resolve paths 5328 | const absoluteTodoPath = path.resolve(projectPath as string, todoPath as string); 5329 | const absoluteAdrPath = adrDirectory 5330 | ? path.resolve(projectPath as string, adrDirectory as string) 5331 | : getAdrDirectoryPath(this.config); 5332 | 5333 | this.logger.info( 5334 | `Comparing ADR progress: TODO(${absoluteTodoPath}) vs ADRs(${absoluteAdrPath}) vs Environment(${projectPath}) [env: ${environment}]` 5335 | ); 5336 | 5337 | // Environment validation and auto-detection 5338 | let detectedEnvironment = environment; 5339 | let finalEnvironmentConfig = { ...(environmentConfig as Record<string, unknown>) }; 5340 | 5341 | if ( 5342 | environmentValidation && 5343 | (validationType === 'full' || validationType === 'environment-only') 5344 | ) { 5345 | try { 5346 | const envResult = await this.detectAndValidateEnvironment( 5347 | projectPath as string, 5348 | environment as string, 5349 | environmentConfig as Record<string, unknown> 5350 | ); 5351 | detectedEnvironment = envResult.detectedEnvironment; 5352 | finalEnvironmentConfig = { ...finalEnvironmentConfig, ...envResult.environmentConfig }; 5353 | this.logger.info(`Environment detection result: ${detectedEnvironment}`); 5354 | } catch (error) { 5355 | this.logger.warn( 5356 | `Environment detection failed: ${error instanceof Error ? error.message : String(error)}` 5357 | ); 5358 | } 5359 | } 5360 | 5361 | try { 5362 | // Step 1: Read TODO.md file directly 5363 | let todoContent = ''; 5364 | if (validationType === 'full' || validationType === 'todo-only') { 5365 | try { 5366 | const fs = await import('fs/promises'); 5367 | todoContent = await fs.readFile(absoluteTodoPath, 'utf-8'); 5368 | } catch (error) { 5369 | this.logger.warn( 5370 | `Could not read TODO.md file: ${error instanceof Error ? error.message : String(error)}` 5371 | ); 5372 | } 5373 | } 5374 | 5375 | // Step 2: Use actual project structure scanning 5376 | let projectStructure = null; 5377 | if (validationType === 'full' || validationType === 'environment-only') { 5378 | try { 5379 | const { scanProjectStructure } = await import('./utils/actual-file-operations.js'); 5380 | const includeContent = (deepCodeAnalysis as boolean) || (functionalValidation as boolean); 5381 | projectStructure = await scanProjectStructure(projectPath as string, { 5382 | readContent: includeContent, 5383 | maxFileSize: includeContent ? 10000 : 0, 5384 | }); 5385 | } catch (error) { 5386 | this.logger.warn( 5387 | `Could not scan project structure: ${error instanceof Error ? error.message : String(error)}` 5388 | ); 5389 | } 5390 | } 5391 | 5392 | // Perform actual analysis locally instead of relying on AI execution 5393 | let discoveryResult: unknown = null; 5394 | if (validationType === 'full' || validationType === 'adr-only') { 5395 | const { discoverAdrsInDirectory } = await import('./utils/adr-discovery.js'); 5396 | discoveryResult = await discoverAdrsInDirectory( 5397 | absoluteAdrPath as string, 5398 | true, 5399 | projectPath as string 5400 | ); 5401 | } 5402 | const analysis = await this.performLocalAdrProgressAnalysis({ 5403 | todoContent, 5404 | todoPath: absoluteTodoPath, 5405 | discoveredAdrs: (discoveryResult as { adrs?: unknown[] })?.adrs || [], 5406 | adrDirectory: absoluteAdrPath, 5407 | projectStructure: projectStructure || null, 5408 | projectPath: projectPath as string, 5409 | validationType: validationType as string, 5410 | includeFileChecks: includeFileChecks as boolean, 5411 | includeRuleValidation: includeRuleValidation as boolean, 5412 | deepCodeAnalysis: deepCodeAnalysis as boolean, 5413 | functionalValidation: functionalValidation as boolean, 5414 | strictMode: strictMode as boolean, 5415 | environment: detectedEnvironment as string, 5416 | environmentConfig: finalEnvironmentConfig, 5417 | environmentValidation: environmentValidation as boolean, 5418 | }); 5419 | 5420 | return { 5421 | content: [ 5422 | { 5423 | type: 'text', 5424 | text: analysis, 5425 | }, 5426 | ], 5427 | }; 5428 | } catch (error) { 5429 | throw new McpAdrError( 5430 | `Failed to compare ADR progress: ${error instanceof Error ? error.message : String(error)}`, 5431 | 'VALIDATION_ERROR' 5432 | ); 5433 | } 5434 | } 5435 | 5436 | /** 5437 | * Detect and validate environment context 5438 | */ 5439 | private async detectAndValidateEnvironment( 5440 | projectPath: string, 5441 | environment: string, 5442 | environmentConfig: Record<string, unknown> 5443 | ): Promise<{ detectedEnvironment: string; environmentConfig: Record<string, unknown> }> { 5444 | const path = await import('path'); 5445 | const fs = await import('fs/promises'); 5446 | 5447 | let detectedEnvironment = environment; 5448 | let finalConfig = { ...environmentConfig }; 5449 | 5450 | if (environment === 'auto-detect') { 5451 | // Auto-detect environment based on project structure 5452 | try { 5453 | // Check for environment indicator files 5454 | const envFiles = [ 5455 | '.env.development', 5456 | '.env.staging', 5457 | '.env.production', 5458 | '.env.test', 5459 | 'package.json', 5460 | 'docker-compose.yml', 5461 | 'Dockerfile', 5462 | ]; 5463 | 5464 | const existingFiles: string[] = []; 5465 | for (const file of envFiles) { 5466 | try { 5467 | await fs.access(path.join(projectPath, file)); 5468 | existingFiles.push(file); 5469 | } catch { 5470 | // File doesn't exist, continue 5471 | } 5472 | } 5473 | 5474 | // Environment detection logic 5475 | if (existingFiles.includes('.env.production') || existingFiles.includes('Dockerfile')) { 5476 | detectedEnvironment = 'production'; 5477 | } else if (existingFiles.includes('.env.staging')) { 5478 | detectedEnvironment = 'staging'; 5479 | } else if (existingFiles.includes('.env.test')) { 5480 | detectedEnvironment = 'testing'; 5481 | } else { 5482 | detectedEnvironment = 'development'; 5483 | } 5484 | 5485 | // Set environment-specific default configurations 5486 | switch (detectedEnvironment) { 5487 | case 'production': 5488 | finalConfig = { 5489 | securityLevel: 'critical', 5490 | requiredFiles: ['package.json', 'README.md'], 5491 | requiredServices: ['monitoring', 'logging'], 5492 | performanceRequirements: { minUptime: 99.9 }, 5493 | ...finalConfig, 5494 | }; 5495 | break; 5496 | case 'staging': 5497 | finalConfig = { 5498 | securityLevel: 'high', 5499 | requiredFiles: ['package.json'], 5500 | requiredServices: ['testing', 'monitoring'], 5501 | performanceRequirements: { minUptime: 95 }, 5502 | ...finalConfig, 5503 | }; 5504 | break; 5505 | case 'testing': 5506 | finalConfig = { 5507 | securityLevel: 'medium', 5508 | requiredFiles: ['package.json'], 5509 | requiredServices: ['testing'], 5510 | performanceRequirements: {}, 5511 | ...finalConfig, 5512 | }; 5513 | break; 5514 | default: // development 5515 | finalConfig = { 5516 | securityLevel: 'medium', 5517 | requiredFiles: ['package.json'], 5518 | requiredServices: [], 5519 | performanceRequirements: {}, 5520 | ...finalConfig, 5521 | }; 5522 | } 5523 | } catch (error) { 5524 | this.logger.warn( 5525 | `Environment auto-detection failed: ${error instanceof Error ? error.message : String(error)}` 5526 | ); 5527 | detectedEnvironment = 'development'; // fallback 5528 | } 5529 | } 5530 | 5531 | return { detectedEnvironment, environmentConfig: finalConfig }; 5532 | } 5533 | 5534 | /** 5535 | * Perform local ADR progress analysis without relying on AI execution 5536 | */ 5537 | private async performLocalAdrProgressAnalysis(params: { 5538 | todoContent: string; 5539 | todoPath: string; 5540 | discoveredAdrs: unknown[]; 5541 | adrDirectory: string; 5542 | projectStructure: unknown; 5543 | projectPath: string; 5544 | validationType: string; 5545 | includeFileChecks: boolean; 5546 | includeRuleValidation: boolean; 5547 | deepCodeAnalysis: boolean; 5548 | functionalValidation: boolean; 5549 | strictMode: boolean; 5550 | environment: string; 5551 | environmentConfig: unknown; 5552 | environmentValidation: boolean; 5553 | }): Promise<string> { 5554 | const { 5555 | todoContent, 5556 | todoPath, 5557 | discoveredAdrs, 5558 | adrDirectory, 5559 | projectStructure, 5560 | projectPath, 5561 | validationType, 5562 | includeFileChecks, 5563 | includeRuleValidation, 5564 | deepCodeAnalysis, 5565 | functionalValidation, 5566 | strictMode, 5567 | environment, 5568 | environmentConfig, 5569 | environmentValidation, 5570 | } = params; 5571 | 5572 | const currentDate = new Date().toISOString().split('T')[0]; 5573 | 5574 | // Parse TODO content to extract tasks 5575 | const todoTasks = this.parseTodoTasks(todoContent); 5576 | 5577 | // Basic analysis 5578 | const totalAdrs = discoveredAdrs.length; 5579 | const totalTasks = todoTasks.length; 5580 | const completedTasks = todoTasks.filter(task => task.completed).length; 5581 | 5582 | // Calculate alignment score (simplified, now environment-aware) 5583 | const adrTaskMapping = this.mapTasksToAdrs( 5584 | todoTasks, 5585 | discoveredAdrs, 5586 | environment, 5587 | environmentConfig 5588 | ); 5589 | const alignedTasks = adrTaskMapping.aligned.length; 5590 | let alignmentScore = totalTasks > 0 ? Math.round((alignedTasks / totalTasks) * 100) : 0; 5591 | 5592 | // Environment-aware scoring adjustments 5593 | if (environmentValidation && environmentConfig) { 5594 | const envScore = this.calculateEnvironmentScore( 5595 | projectStructure, 5596 | environment, 5597 | environmentConfig 5598 | ); 5599 | alignmentScore = Math.round((alignmentScore + envScore) / 2); // Blend scores 5600 | } 5601 | 5602 | // File existence checks 5603 | let fileCheckResults = ''; 5604 | if (includeFileChecks && projectStructure) { 5605 | fileCheckResults = this.performFileExistenceChecks(todoTasks, projectStructure); 5606 | } 5607 | 5608 | // Environment compliance checks 5609 | let environmentAnalysisResults = ''; 5610 | if (environmentValidation && environmentConfig) { 5611 | environmentAnalysisResults = this.performEnvironmentComplianceAnalysis( 5612 | projectStructure, 5613 | environment, 5614 | environmentConfig, 5615 | strictMode 5616 | ); 5617 | } 5618 | 5619 | // Mock vs Production analysis 5620 | let mockAnalysisResults = ''; 5621 | if (deepCodeAnalysis && projectStructure) { 5622 | mockAnalysisResults = this.performMockVsProductionAnalysis(projectStructure, strictMode); 5623 | } 5624 | 5625 | return `# ADR Progress Validation Report 5626 | 5627 | **Validation Date**: ${currentDate} 5628 | **Validation Type**: ${validationType} 5629 | **Project Path**: ${projectPath} 5630 | **TODO Path**: ${todoPath} 5631 | **ADR Directory**: ${adrDirectory} 5632 | **Environment**: ${environment}${environmentValidation ? ` (validation enabled)` : ''} 5633 | 5634 | ## Summary 5635 | - **Total ADRs**: ${totalAdrs} 5636 | - **Total TODO Tasks**: ${totalTasks} 5637 | - **Completed Tasks**: ${completedTasks} 5638 | - **Alignment Score**: ${alignmentScore}% 5639 | - **Compliance Score**: ${Math.max(alignmentScore - 10, 0)}% 5640 | - **Environment**: ${environment} 5641 | 5642 | ## Configuration 5643 | - **File Checks**: ${includeFileChecks ? 'Enabled' : 'Disabled'} 5644 | - **Rule Validation**: ${includeRuleValidation ? 'Enabled' : 'Disabled'} 5645 | - **Deep Code Analysis**: ${deepCodeAnalysis ? 'Enabled' : 'Disabled'} 5646 | - **Functional Validation**: ${functionalValidation ? 'Enabled' : 'Disabled'} 5647 | - **Strict Mode**: ${strictMode ? 'Enabled - High scrutiny for mock vs production' : 'Disabled'} 5648 | - **Environment Validation**: ${environmentValidation ? 'Enabled' : 'Disabled'} 5649 | 5650 | ## Environment Context 5651 | - **Target Environment**: ${environment} 5652 | - **Security Level**: ${(environmentConfig as Record<string, unknown>)?.['securityLevel'] || 'Not specified'} 5653 | - **Required Files**: ${((environmentConfig as Record<string, unknown>)?.['requiredFiles'] as unknown[] | undefined)?.length || 0} files 5654 | - **Required Services**: ${((environmentConfig as Record<string, unknown>)?.['requiredServices'] as unknown[] | undefined)?.length || 0} services 5655 | 5656 | ## ADR Discovery Results 5657 | ${ 5658 | totalAdrs > 0 5659 | ? `Found ${totalAdrs} ADRs:\n${discoveredAdrs 5660 | .map((adr, i) => { 5661 | const adrRecord = adr as Record<string, unknown>; 5662 | return `${i + 1}. **${adrRecord['title']}** (${adrRecord['status']}) - ${adrRecord['filename']}`; 5663 | }) 5664 | .join('\n')}` 5665 | : 'No ADRs found in the specified directory.' 5666 | } 5667 | 5668 | ## TODO Task Analysis 5669 | ${ 5670 | totalTasks > 0 5671 | ? `Found ${totalTasks} tasks:\n${todoTasks 5672 | .map((task, i) => `${i + 1}. ${task.completed ? '✅' : '⏳'} ${task.title}`) 5673 | .join('\n')}` 5674 | : 'No tasks found in TODO.md file.' 5675 | } 5676 | 5677 | ## Alignment Analysis 5678 | 5679 | ### ✅ Properly Aligned Tasks 5680 | ${ 5681 | adrTaskMapping.aligned.length > 0 5682 | ? adrTaskMapping.aligned 5683 | .map(task => `- ${task.title}: Corresponds to ADR requirements`) 5684 | .join('\n') 5685 | : '- No aligned tasks identified' 5686 | } 5687 | 5688 | ### ⚠️ Misaligned Tasks 5689 | ${ 5690 | adrTaskMapping.misaligned.length > 0 5691 | ? adrTaskMapping.misaligned 5692 | .map(task => `- ${task.title}: May not fully align with ADR specifications`) 5693 | .join('\n') 5694 | : '- No misaligned tasks identified' 5695 | } 5696 | 5697 | ### ❌ Missing Tasks 5698 | ${ 5699 | adrTaskMapping.missing.length > 0 5700 | ? adrTaskMapping.missing.map(gap => `- ${gap}: Required by ADRs but not in TODO`).join('\n') 5701 | : '- No obvious missing tasks identified' 5702 | } 5703 | 5704 | ## Implementation Status 5705 | 5706 | ${fileCheckResults || '### File Existence Validation\n- File checks disabled or no project structure available'} 5707 | 5708 | ${environmentAnalysisResults || ''} 5709 | 5710 | ${mockAnalysisResults || ''} 5711 | 5712 | ## Recommendations 5713 | 5714 | ### High Priority Actions 5715 | ${ 5716 | alignmentScore < 70 5717 | ? '1. **Improve ADR-TODO Alignment**: Review TODO tasks against ADR requirements\n2. **Add Missing Tasks**: Identify and add tasks required by ADRs' 5718 | : '1. **Maintain Current Alignment**: Continue following ADR specifications' 5719 | } 5720 | ${ 5721 | completedTasks < totalTasks * 0.5 5722 | ? '\n3. **Accelerate Implementation**: Focus on completing pending tasks' 5723 | : '' 5724 | } 5725 | ${ 5726 | environmentValidation && environment === 'production' && alignmentScore < 90 5727 | ? '\n4. **⚠️ Production Environment Warning**: Current alignment may not meet production requirements' 5728 | : '' 5729 | } 5730 | 5731 | ### Medium Priority Actions 5732 | 1. **Review Implementation Quality**: ${strictMode ? 'Strict mode analysis above shows' : 'Consider enabling strict mode for'} detailed quality assessment 5733 | 2. **Update Documentation**: Ensure TODO.md reflects current project state 5734 | ${ 5735 | environmentValidation 5736 | ? `3. **Environment Compliance**: Ensure ${environment} environment requirements are met` 5737 | : '' 5738 | } 5739 | 5740 | ### Low Priority Actions 5741 | 1. **Optimize Workflow**: Consider tools for automated ADR-TODO synchronization 5742 | 2. **Regular Validation**: Schedule periodic ADR progress reviews 5743 | 5744 | ## Next Steps 5745 | 1. Address high-priority alignment issues identified above 5746 | 2. ${totalTasks === 0 ? 'Create initial TODO.md from ADR requirements' : 'Update TODO.md with missing tasks'} 5747 | 3. ${includeFileChecks ? 'Verify implementation of completed tasks' : 'Enable file checks for detailed implementation verification'} 5748 | 4. ${includeRuleValidation ? 'Resolve architectural rule compliance violations' : 'Enable rule validation for compliance checking'} 5749 | \`\`\` 5750 | 5751 | To re-run this validation with strict mode: 5752 | \`\`\`json 5753 | { 5754 | "tool": "compare_adr_progress", 5755 | "args": { 5756 | "todoPath": "${todoPath}", 5757 | "adrDirectory": "${adrDirectory}", 5758 | "validationType": "full", 5759 | "deepCodeAnalysis": true, 5760 | "functionalValidation": true, 5761 | "strictMode": true 5762 | } 5763 | } 5764 | \`\`\` 5765 | `; 5766 | } 5767 | 5768 | /** 5769 | * Parse TODO.md content to extract tasks 5770 | */ 5771 | private parseTodoTasks( 5772 | todoContent: string 5773 | ): Array<{ title: string; completed: boolean; description?: string }> { 5774 | if (!todoContent) return []; 5775 | 5776 | const lines = todoContent.split('\n'); 5777 | const tasks: Array<{ title: string; completed: boolean; description?: string }> = []; 5778 | 5779 | for (const line of lines) { 5780 | // Look for markdown checkbox patterns 5781 | const taskMatch = line.match(/^\s*[-*]\s*\[([x\s])\]\s*(.+)$/i); 5782 | if (taskMatch && taskMatch[1] && taskMatch[2]) { 5783 | const checkbox = taskMatch[1]; 5784 | const title = taskMatch[2]; 5785 | tasks.push({ 5786 | title: title.trim(), 5787 | completed: checkbox.toLowerCase() === 'x', 5788 | }); 5789 | } 5790 | // Also look for simple list items that might be tasks 5791 | else if (line.match(/^\s*[-*]\s+\w+/)) { 5792 | const title = line.replace(/^\s*[-*]\s+/, '').trim(); 5793 | if (title.length > 3) { 5794 | // Avoid very short items 5795 | tasks.push({ 5796 | title, 5797 | completed: false, 5798 | }); 5799 | } 5800 | } 5801 | } 5802 | 5803 | return tasks; 5804 | } 5805 | 5806 | /** 5807 | * Map TODO tasks to ADRs to identify alignment (now environment-aware) 5808 | */ 5809 | private mapTasksToAdrs( 5810 | tasks: Array<{ title: string; completed: boolean }>, 5811 | adrs: unknown[], 5812 | environment?: string, 5813 | environmentConfig?: unknown 5814 | ): { 5815 | aligned: typeof tasks; 5816 | misaligned: typeof tasks; 5817 | missing: string[]; 5818 | } { 5819 | const aligned: typeof tasks = []; 5820 | const misaligned: typeof tasks = []; 5821 | const missing: string[] = []; 5822 | 5823 | // Simple keyword matching for alignment detection 5824 | const adrKeywords = adrs.flatMap(adr => { 5825 | const adrRecord = adr as Record<string, unknown>; 5826 | return [ 5827 | String(adrRecord['title'] || '').toLowerCase(), 5828 | ...String(adrRecord['decision'] || '') 5829 | .toLowerCase() 5830 | .split(/\s+/) 5831 | .filter((w: string) => w.length > 4), 5832 | ...String(adrRecord['context'] || '') 5833 | .toLowerCase() 5834 | .split(/\s+/) 5835 | .filter((w: string) => w.length > 4), 5836 | ]; 5837 | }); 5838 | 5839 | // Environment-specific keywords that should be prioritized 5840 | const envKeywords: string[] = []; 5841 | if (environment && environmentConfig) { 5842 | if (environment === 'production') { 5843 | envKeywords.push('deploy', 'production', 'monitoring', 'security', 'performance'); 5844 | } else if (environment === 'staging') { 5845 | envKeywords.push('test', 'staging', 'integration', 'validation'); 5846 | } else if (environment === 'development') { 5847 | envKeywords.push('setup', 'development', 'local', 'debug'); 5848 | } 5849 | } 5850 | 5851 | for (const task of tasks) { 5852 | const taskLower = task.title.toLowerCase(); 5853 | const firstWord = taskLower.split(' ')[0] || ''; 5854 | const hasKeywordMatch = adrKeywords.some( 5855 | keyword => taskLower.includes(keyword) || keyword.includes(firstWord) 5856 | ); 5857 | 5858 | // Environment-aware alignment scoring 5859 | const hasEnvKeywordMatch = envKeywords.some(keyword => taskLower.includes(keyword)); 5860 | 5861 | if (hasKeywordMatch || hasEnvKeywordMatch) { 5862 | aligned.push(task); 5863 | } else { 5864 | misaligned.push(task); 5865 | } 5866 | } 5867 | 5868 | // Identify potential missing tasks based on ADR content 5869 | for (const adr of adrs) { 5870 | const adrRecord = adr as Record<string, unknown>; 5871 | if (adrRecord['status'] === 'accepted' && adrRecord['decision']) { 5872 | const decisionWords = String(adrRecord['decision']).toLowerCase().split(/\s+/); 5873 | const implementationWords = [ 5874 | 'implement', 5875 | 'create', 5876 | 'build', 5877 | 'develop', 5878 | 'add', 5879 | 'setup', 5880 | 'configure', 5881 | ]; 5882 | 5883 | if (implementationWords.some(word => decisionWords.includes(word))) { 5884 | const adrTitle = String(adrRecord['title'] || ''); 5885 | const adrFirstWord = adrTitle.toLowerCase().split(' ')[0] || ''; 5886 | const hasCorrespondingTask = tasks.some(task => 5887 | task.title.toLowerCase().includes(adrFirstWord) 5888 | ); 5889 | 5890 | if (!hasCorrespondingTask) { 5891 | missing.push(`Implement ${adrTitle}`); 5892 | } 5893 | } 5894 | } 5895 | } 5896 | 5897 | // Environment-specific missing tasks 5898 | if (environment && environmentConfig) { 5899 | const envConfig = environmentConfig as Record<string, unknown>; 5900 | if (envConfig['requiredFiles']) { 5901 | for (const file of envConfig['requiredFiles'] as string[]) { 5902 | const hasFileTask = tasks.some(task => 5903 | task.title.toLowerCase().includes(file.toLowerCase()) 5904 | ); 5905 | if (!hasFileTask) { 5906 | missing.push(`Create ${file} for ${environment} environment`); 5907 | } 5908 | } 5909 | } 5910 | 5911 | if (envConfig['requiredServices']) { 5912 | for (const service of envConfig['requiredServices'] as string[]) { 5913 | const hasServiceTask = tasks.some(task => 5914 | task.title.toLowerCase().includes(service.toLowerCase()) 5915 | ); 5916 | if (!hasServiceTask) { 5917 | missing.push(`Setup ${service} service for ${environment}`); 5918 | } 5919 | } 5920 | } 5921 | } 5922 | 5923 | return { aligned, misaligned, missing }; 5924 | } 5925 | 5926 | /** 5927 | * Check file existence for completed tasks 5928 | */ 5929 | private performFileExistenceChecks( 5930 | tasks: Array<{ title: string; completed: boolean }>, 5931 | projectStructure: any 5932 | ): string { 5933 | if (!projectStructure) return '- Project structure not available'; 5934 | 5935 | const allFiles = [ 5936 | ...(projectStructure.packageFiles || []), 5937 | ...(projectStructure.configFiles || []), 5938 | ...(projectStructure.buildFiles || []), 5939 | ...(projectStructure.dockerFiles || []), 5940 | ...(projectStructure.ciFiles || []), 5941 | ...(projectStructure.scriptFiles || []), 5942 | ]; 5943 | 5944 | let results = '### File Existence Validation\n'; 5945 | let checkCount = 0; 5946 | 5947 | for (const task of tasks) { 5948 | if (task.completed) { 5949 | // Simple heuristic: look for files mentioned in task title 5950 | const taskLower = task.title.toLowerCase(); 5951 | const mentionedFiles = allFiles.filter( 5952 | file => 5953 | taskLower.includes(file.filename.toLowerCase()) || 5954 | taskLower.includes(file.filename.replace(/\.[^.]+$/, '').toLowerCase()) 5955 | ); 5956 | 5957 | if (mentionedFiles.length > 0) { 5958 | results += `- ✅ **${task.title}**: Found related files (${mentionedFiles.map(f => f.filename).join(', ')})\n`; 5959 | checkCount++; 5960 | } else if ( 5961 | taskLower.includes('file') || 5962 | taskLower.includes('create') || 5963 | taskLower.includes('implement') 5964 | ) { 5965 | results += `- ⚠️ **${task.title}**: No clearly related files found\n`; 5966 | checkCount++; 5967 | } 5968 | } 5969 | } 5970 | 5971 | if (checkCount === 0) { 5972 | results += '- No file-related completed tasks to validate\n'; 5973 | } 5974 | 5975 | return results; 5976 | } 5977 | 5978 | /** 5979 | * Analyze code for mock vs production implementation 5980 | */ 5981 | private performMockVsProductionAnalysis(projectStructure: any, strictMode: boolean): string { 5982 | if (!projectStructure) return ''; 5983 | 5984 | const codeFiles = [ 5985 | ...(projectStructure.buildFiles || []), 5986 | ...(projectStructure.configFiles || []), 5987 | ].filter(file => file.content && file.content !== '[Binary or unreadable file]'); 5988 | 5989 | if (codeFiles.length === 0) return ''; 5990 | 5991 | let results = '\n### Mock vs Production Code Analysis\n'; 5992 | let mockIndicators = 0; 5993 | let productionIndicators = 0; 5994 | 5995 | const mockPatterns = [ 5996 | /TODO:/gi, 5997 | /FIXME:/gi, 5998 | /NotImplementedException/gi, 5999 | /throw.*not.*implement/gi, 6000 | /return.*mock/gi, 6001 | /placeholder/gi, 6002 | /stub/gi, 6003 | /return\s+null;/gi, 6004 | /return\s+""/gi, 6005 | /return\s+\[\]/gi, 6006 | /return\s+{}/gi, 6007 | ]; 6008 | 6009 | const productionPatterns = [ 6010 | /error\s+handling/gi, 6011 | /try\s*{/gi, 6012 | /catch\s*\(/gi, 6013 | /validate/gi, 6014 | /authentication/gi, 6015 | /authorization/gi, 6016 | /database/gi, 6017 | /api/gi, 6018 | /config/gi, 6019 | ]; 6020 | 6021 | for (const file of codeFiles.slice(0, 10)) { 6022 | // Limit analysis to prevent overwhelming output 6023 | const content = file.content; 6024 | const fileMockCount = mockPatterns.reduce( 6025 | (count, pattern) => count + (content.match(pattern) || []).length, 6026 | 0 6027 | ); 6028 | const fileProdCount = productionPatterns.reduce( 6029 | (count, pattern) => count + (content.match(pattern) || []).length, 6030 | 0 6031 | ); 6032 | 6033 | mockIndicators += fileMockCount; 6034 | productionIndicators += fileProdCount; 6035 | 6036 | if (fileMockCount > 0 || fileProdCount > 2) { 6037 | const status = 6038 | fileMockCount > fileProdCount 6039 | ? '❌ **Mock/Stub**' 6040 | : fileProdCount > fileMockCount * 2 6041 | ? '✅ **Production Ready**' 6042 | : '⚠️ **Partial Implementation**'; 6043 | 6044 | results += `- ${status}: ${file.filename} `; 6045 | if (fileMockCount > 0) { 6046 | results += `(${fileMockCount} mock indicators) `; 6047 | } 6048 | if (fileProdCount > 0) { 6049 | results += `(${fileProdCount} production indicators)`; 6050 | } 6051 | results += '\n'; 6052 | } 6053 | } 6054 | 6055 | results += `\n#### Overall Code Quality Assessment\n`; 6056 | results += `- **Mock Indicators Found**: ${mockIndicators} instances\n`; 6057 | results += `- **Production Indicators Found**: ${productionIndicators} instances\n`; 6058 | 6059 | if (strictMode) { 6060 | const qualityScore = 6061 | productionIndicators > mockIndicators * 2 6062 | ? 'Good' 6063 | : productionIndicators > mockIndicators 6064 | ? 'Fair' 6065 | : 'Needs Improvement'; 6066 | results += `- **Quality Assessment**: ${qualityScore}\n`; 6067 | 6068 | if (mockIndicators > 0) { 6069 | results += `- **⚠️ Strict Mode Warning**: Found ${mockIndicators} potential mock/stub indicators\n`; 6070 | } 6071 | } 6072 | 6073 | return results; 6074 | } 6075 | 6076 | /** 6077 | * Calculate environment-specific compliance score 6078 | */ 6079 | private calculateEnvironmentScore( 6080 | projectStructure: any, 6081 | environment: string, 6082 | environmentConfig: any 6083 | ): number { 6084 | if (!projectStructure || !environmentConfig) return 0; 6085 | 6086 | let score = 100; // Start with perfect score 6087 | 6088 | // Check required files 6089 | if (environmentConfig.requiredFiles) { 6090 | const allFiles = [ 6091 | ...(projectStructure.packageFiles || []), 6092 | ...(projectStructure.configFiles || []), 6093 | ...(projectStructure.buildFiles || []), 6094 | ...(projectStructure.dockerFiles || []), 6095 | ...(projectStructure.ciFiles || []), 6096 | ...(projectStructure.scriptFiles || []), 6097 | ]; 6098 | 6099 | const existingFiles = allFiles.map(f => f.filename); 6100 | const missingFiles = environmentConfig.requiredFiles.filter( 6101 | (file: string) => !existingFiles.includes(file) 6102 | ); 6103 | 6104 | // Deduct 10 points per missing required file 6105 | score -= missingFiles.length * 10; 6106 | } 6107 | 6108 | // Environment-specific penalties 6109 | if (environment === 'production') { 6110 | // Production requires higher standards 6111 | if (!projectStructure.dockerFiles?.length) score -= 15; 6112 | if (!projectStructure.ciFiles?.length) score -= 10; 6113 | } 6114 | 6115 | return Math.max(score, 0); 6116 | } 6117 | 6118 | /** 6119 | * Perform environment compliance analysis 6120 | */ 6121 | private performEnvironmentComplianceAnalysis( 6122 | projectStructure: any, 6123 | environment: string, 6124 | environmentConfig: any, 6125 | strictMode: boolean 6126 | ): string { 6127 | if (!projectStructure || !environmentConfig) { 6128 | return '\n### Environment Compliance Analysis\n- Environment analysis disabled or no project structure available\n'; 6129 | } 6130 | 6131 | let results = '\n### Environment Compliance Analysis\n'; 6132 | 6133 | // Required files analysis 6134 | if (environmentConfig.requiredFiles) { 6135 | results += `#### Required Files for ${environment} Environment\n`; 6136 | const allFiles = [ 6137 | ...(projectStructure.packageFiles || []), 6138 | ...(projectStructure.configFiles || []), 6139 | ...(projectStructure.buildFiles || []), 6140 | ...(projectStructure.dockerFiles || []), 6141 | ...(projectStructure.ciFiles || []), 6142 | ...(projectStructure.scriptFiles || []), 6143 | ]; 6144 | 6145 | const existingFiles = allFiles.map(f => f.filename); 6146 | 6147 | for (const requiredFile of environmentConfig.requiredFiles) { 6148 | const exists = existingFiles.includes(requiredFile); 6149 | results += `- ${exists ? '✅' : '❌'} **${requiredFile}**: ${exists ? 'Found' : 'Missing'}\n`; 6150 | } 6151 | } 6152 | 6153 | // Security level compliance 6154 | if (environmentConfig.securityLevel) { 6155 | results += `\n#### Security Level: ${environmentConfig.securityLevel}\n`; 6156 | 6157 | const securityIndicators = this.analyzeSecurityCompliance( 6158 | projectStructure, 6159 | environmentConfig.securityLevel 6160 | ); 6161 | results += securityIndicators; 6162 | } 6163 | 6164 | // Environment-specific recommendations 6165 | results += `\n#### ${environment} Environment Recommendations\n`; 6166 | switch (environment) { 6167 | case 'production': 6168 | results += 6169 | '- ⚠️ **Production Critical**: Ensure monitoring, logging, and backup strategies are implemented\n'; 6170 | results += '- 🔒 **Security**: Implement comprehensive security measures\n'; 6171 | results += '- 📊 **Performance**: Monitor and optimize for production workloads\n'; 6172 | if (strictMode) { 6173 | results += 6174 | '- 🔍 **Strict Mode**: Enhanced validation enabled for production environment\n'; 6175 | } 6176 | break; 6177 | case 'staging': 6178 | results += '- 🧪 **Testing**: Ensure comprehensive test coverage and validation\n'; 6179 | results += '- 📋 **Validation**: Implement environment parity checks\n'; 6180 | break; 6181 | case 'development': 6182 | results += '- 🛠️ **Development**: Focus on developer experience and debugging tools\n'; 6183 | results += '- 🔄 **Iteration**: Ensure fast feedback loops\n'; 6184 | break; 6185 | } 6186 | 6187 | return results; 6188 | } 6189 | 6190 | /** 6191 | * Analyze security compliance based on security level 6192 | */ 6193 | private analyzeSecurityCompliance(projectStructure: any, securityLevel: string): string { 6194 | let results = ''; 6195 | 6196 | const securityFiles = [ 6197 | ...(projectStructure.configFiles || []), 6198 | ...(projectStructure.dockerFiles || []), 6199 | ].filter( 6200 | file => 6201 | file.filename.includes('security') || 6202 | file.filename.includes('auth') || 6203 | file.filename.includes('.env') || 6204 | file.filename === 'Dockerfile' 6205 | ); 6206 | 6207 | const hasSecurityConfig = securityFiles.length > 0; 6208 | 6209 | switch (securityLevel) { 6210 | case 'critical': 6211 | results += `- ${hasSecurityConfig ? '✅' : '❌'} **Critical Security**: ${hasSecurityConfig ? 'Security configuration found' : 'No security configuration detected'}\n`; 6212 | if (!hasSecurityConfig) { 6213 | results += ' - **Action Required**: Implement comprehensive security measures\n'; 6214 | } 6215 | break; 6216 | case 'high': 6217 | results += `- ${hasSecurityConfig ? '✅' : '⚠️'} **High Security**: ${hasSecurityConfig ? 'Some security configuration found' : 'Limited security configuration'}\n`; 6218 | break; 6219 | case 'medium': 6220 | results += `- ℹ️ **Medium Security**: Basic security measures recommended\n`; 6221 | break; 6222 | default: 6223 | results += `- ℹ️ **Security Level**: ${securityLevel} (consider increasing for production)\n`; 6224 | } 6225 | 6226 | return results; 6227 | } 6228 | 6229 | /** 6230 | * Content masking tool implementations 6231 | */ 6232 | private async analyzeContentSecurity(args: AnalyzeContentSecurityArgs): Promise<CallToolResult> { 6233 | const { analyzeContentSecurity } = await import('./tools/content-masking-tool.js'); 6234 | return await analyzeContentSecurity(args); 6235 | } 6236 | 6237 | private async generateContentMasking(args: GenerateContentMaskingArgs): Promise<CallToolResult> { 6238 | const { generateContentMasking } = await import('./tools/content-masking-tool.js'); 6239 | return await generateContentMasking(args); 6240 | } 6241 | 6242 | private async configureCustomPatterns( 6243 | args: ConfigureCustomPatternsArgs 6244 | ): Promise<CallToolResult> { 6245 | const { configureCustomPatterns } = await import('./tools/content-masking-tool.js'); 6246 | return await configureCustomPatterns(args); 6247 | } 6248 | 6249 | private async applyBasicContentMasking( 6250 | args: ApplyBasicContentMaskingArgs 6251 | ): Promise<CallToolResult> { 6252 | const { applyBasicContentMasking } = await import('./tools/content-masking-tool.js'); 6253 | return await applyBasicContentMasking(args); 6254 | } 6255 | 6256 | private async validateContentMasking(args: ValidateContentMaskingArgs): Promise<CallToolResult> { 6257 | const { validateContentMasking } = await import('./tools/content-masking-tool.js'); 6258 | return await validateContentMasking(args); 6259 | } 6260 | 6261 | private async manageCache(args: Record<string, unknown>): Promise<CallToolResult> { 6262 | const { action, key } = args; 6263 | 6264 | try { 6265 | const { clearCache, getCacheStats, cleanupCache, invalidateCache } = await import( 6266 | './utils/cache.js' 6267 | ); 6268 | 6269 | switch (action) { 6270 | case 'clear': { 6271 | const clearPrompt = await clearCache(); 6272 | return { 6273 | content: [ 6274 | { 6275 | type: 'text', 6276 | text: `# Cache Clear Operation 6277 | 6278 | ## AI Delegation Required 6279 | 6280 | Please execute the following cache clearing operation: 6281 | 6282 | ${clearPrompt.prompt} 6283 | 6284 | ## Implementation Instructions 6285 | 6286 | ${clearPrompt.instructions} 6287 | 6288 | ## Expected Result 6289 | 6290 | After successful execution, all cache entries will be removed while preserving the cache directory structure and metadata.json file.`, 6291 | }, 6292 | ], 6293 | }; 6294 | } 6295 | 6296 | case 'stats': { 6297 | const statsPrompt = await getCacheStats(); 6298 | return { 6299 | content: [ 6300 | { 6301 | type: 'text', 6302 | text: `# Cache Statistics Collection 6303 | 6304 | ## AI Delegation Required 6305 | 6306 | Please execute the following cache statistics collection operation: 6307 | 6308 | ${statsPrompt.prompt} 6309 | 6310 | ## Implementation Instructions 6311 | 6312 | ${statsPrompt.instructions} 6313 | 6314 | ## Expected Information 6315 | 6316 | The AI agent will provide: 6317 | - **Total Entries**: Number of cache files 6318 | - **Total Size**: Combined size of all cache files 6319 | - **Oldest Entry**: Cache key of the oldest entry 6320 | - **Newest Entry**: Cache key of the newest entry 6321 | 6322 | ## Cache Directory 6323 | \`.mcp-adr-cache/\` 6324 | 6325 | ## Cache Types 6326 | - **Knowledge Graph**: Architectural analysis results (TTL: 1 hour) 6327 | - **Analysis Report**: Project analysis reports (TTL: 30 minutes) 6328 | - **ADR List**: ADR inventory and metadata (TTL: 15 minutes) 6329 | 6330 | ## Management 6331 | Use \`manage_cache\` tool with different actions: 6332 | - \`clear\`: Remove all cache entries 6333 | - \`cleanup\`: Remove expired entries only 6334 | - \`invalidate\`: Remove specific cache entry`, 6335 | }, 6336 | ], 6337 | }; 6338 | } 6339 | 6340 | case 'cleanup': { 6341 | const cleanupPrompt = await cleanupCache(); 6342 | return { 6343 | content: [ 6344 | { 6345 | type: 'text', 6346 | text: `# Cache Cleanup Operation 6347 | 6348 | ## AI Delegation Required 6349 | 6350 | Please execute the following cache cleanup operation: 6351 | 6352 | ${cleanupPrompt.prompt} 6353 | 6354 | ## Implementation Instructions 6355 | 6356 | ${cleanupPrompt.instructions} 6357 | 6358 | ## Expected Result 6359 | 6360 | The AI agent will remove expired cache entries and provide a count of cleaned files.`, 6361 | }, 6362 | ], 6363 | }; 6364 | } 6365 | 6366 | case 'invalidate': { 6367 | if (!key) { 6368 | throw new McpAdrError('Cache key is required for invalidate action', 'INVALID_INPUT'); 6369 | } 6370 | 6371 | const invalidatePrompt = await invalidateCache(key as string); 6372 | return { 6373 | content: [ 6374 | { 6375 | type: 'text', 6376 | text: `# Cache Invalidation Operation 6377 | 6378 | ## AI Delegation Required 6379 | 6380 | Please execute the following cache invalidation operation: 6381 | 6382 | ${invalidatePrompt.prompt} 6383 | 6384 | ## Implementation Instructions 6385 | 6386 | ${invalidatePrompt.instructions} 6387 | 6388 | ## Target Cache Entry 6389 | 6390 | **Cache Key**: ${key} 6391 | 6392 | The AI agent will safely remove the specified cache entry.`, 6393 | }, 6394 | ], 6395 | }; 6396 | } 6397 | 6398 | default: 6399 | throw new McpAdrError(`Unknown cache action: ${action}`, 'INVALID_INPUT'); 6400 | } 6401 | } catch (error) { 6402 | throw new McpAdrError( 6403 | `Cache management failed: ${error instanceof Error ? error.message : String(error)}`, 6404 | 'CACHE_ERROR' 6405 | ); 6406 | } 6407 | } 6408 | 6409 | private async configureOutputMasking(args: Record<string, unknown>): Promise<CallToolResult> { 6410 | const { action = 'get', enabled, strategy, customPatterns } = args; 6411 | 6412 | try { 6413 | const { validateMaskingConfig } = await import('./utils/output-masking.js'); 6414 | 6415 | switch (action) { 6416 | case 'get': { 6417 | return { 6418 | content: [ 6419 | { 6420 | type: 'text', 6421 | text: `# Current Output Masking Configuration 6422 | 6423 | ## Settings 6424 | - **Enabled**: ${this.maskingConfig.enabled} 6425 | - **Strategy**: ${this.maskingConfig.strategy} 6426 | - **Custom Patterns**: ${this.maskingConfig.customPatterns?.length || 0} patterns 6427 | - **Skip Patterns**: ${this.maskingConfig.skipPatterns?.length || 0} patterns 6428 | 6429 | ## Available Strategies 6430 | - **full**: Replace entire sensitive content with [REDACTED] 6431 | - **partial**: Show safe prefix/suffix, mask middle (e.g., sk-...****) 6432 | - **placeholder**: Replace with descriptive placeholders (e.g., <YOUR_API_KEY>) 6433 | - **environment**: Replace with environment variable references (e.g., \${API_KEY}) 6434 | 6435 | ## Configuration 6436 | Use \`configure_output_masking\` tool with: 6437 | - \`action: "set"\` to update configuration 6438 | - \`action: "reset"\` to restore defaults 6439 | 6440 | ## Current Status 6441 | ${this.maskingConfig.enabled ? '✅ Output masking is ACTIVE' : '⚠️ Output masking is DISABLED'} 6442 | `, 6443 | }, 6444 | ], 6445 | }; 6446 | } 6447 | 6448 | case 'set': { 6449 | const newConfig = { ...this.maskingConfig }; 6450 | 6451 | if (typeof enabled === 'boolean') { 6452 | newConfig.enabled = enabled; 6453 | } 6454 | 6455 | if ( 6456 | strategy && 6457 | ['full', 'partial', 'placeholder', 'environment'].includes(strategy as string) 6458 | ) { 6459 | newConfig.strategy = strategy as 'full' | 'partial' | 'placeholder' | 'environment'; 6460 | } 6461 | 6462 | if (Array.isArray(customPatterns)) { 6463 | newConfig.customPatterns = customPatterns; 6464 | } 6465 | 6466 | const validation = validateMaskingConfig(newConfig); 6467 | if (!validation.isValid) { 6468 | throw new McpAdrError( 6469 | `Invalid masking configuration: ${validation.errors.join(', ')}`, 6470 | 'INVALID_CONFIG' 6471 | ); 6472 | } 6473 | 6474 | this.maskingConfig = newConfig; 6475 | 6476 | return { 6477 | content: [ 6478 | { 6479 | type: 'text', 6480 | text: `✅ Output masking configuration updated successfully! 6481 | 6482 | ## New Settings 6483 | - **Enabled**: ${newConfig.enabled} 6484 | - **Strategy**: ${newConfig.strategy} 6485 | - **Custom Patterns**: ${newConfig.customPatterns?.length || 0} patterns 6486 | 6487 | ${ 6488 | newConfig.enabled 6489 | ? '🔒 All MCP tool and resource outputs will now be masked according to the new configuration.' 6490 | : '⚠️ Output masking is disabled. Sensitive information may be exposed in responses.' 6491 | } 6492 | `, 6493 | }, 6494 | ], 6495 | }; 6496 | } 6497 | 6498 | case 'reset': { 6499 | const { createMaskingConfig } = await import('./utils/output-masking.js'); 6500 | this.maskingConfig = createMaskingConfig(); 6501 | 6502 | return { 6503 | content: [ 6504 | { 6505 | type: 'text', 6506 | text: `✅ Output masking configuration reset to defaults! 6507 | 6508 | ## Default Settings 6509 | - **Enabled**: ${this.maskingConfig.enabled} 6510 | - **Strategy**: ${this.maskingConfig.strategy} 6511 | - **Custom Patterns**: ${this.maskingConfig.customPatterns?.length || 0} patterns 6512 | - **Skip Patterns**: ${this.maskingConfig.skipPatterns?.length || 0} patterns 6513 | 6514 | 🔒 Default masking is now active for all outputs. 6515 | `, 6516 | }, 6517 | ], 6518 | }; 6519 | } 6520 | 6521 | default: 6522 | throw new McpAdrError(`Unknown masking action: ${action}`, 'INVALID_INPUT'); 6523 | } 6524 | } catch (error) { 6525 | throw new McpAdrError( 6526 | `Output masking configuration failed: ${error instanceof Error ? error.message : String(error)}`, 6527 | 'CONFIG_ERROR' 6528 | ); 6529 | } 6530 | } 6531 | 6532 | /** 6533 | * Helper method to get domains based on PRD type 6534 | */ 6535 | private getPrdTypeDomains(prdType: string): string[] { 6536 | const domainMap: Record<string, string[]> = { 6537 | 'web-application': ['api-design', 'frontend-architecture', 'database-design', 'security'], 6538 | 'mobile-app': ['mobile-architecture', 'api-design', 'performance-optimization', 'security'], 6539 | microservices: ['microservices', 'api-design', 'distributed-systems', 'database-design'], 6540 | 'data-platform': [ 6541 | 'database-design', 6542 | 'data-architecture', 6543 | 'performance-optimization', 6544 | 'scalability', 6545 | ], 6546 | 'api-service': ['api-design', 'microservices', 'security', 'performance-optimization'], 6547 | general: ['api-design', 'database-design', 'security'], 6548 | }; 6549 | 6550 | return ( 6551 | domainMap[prdType] || domainMap['general'] || ['api-design', 'database-design', 'security'] 6552 | ); 6553 | } 6554 | 6555 | /** 6556 | * Helper method to get domains for ecosystem analysis based on technology focus 6557 | */ 6558 | private getEcosystemAnalysisDomains(technologyFocus: string[]): string[] { 6559 | // Base domains for ecosystem analysis 6560 | const baseDomains = ['api-design', 'database-design', 'security', 'performance-optimization']; 6561 | 6562 | // Technology-specific domain mapping 6563 | const technologyDomainMap: Record<string, string[]> = { 6564 | react: ['frontend-architecture', 'web-applications'], 6565 | vue: ['frontend-architecture', 'web-applications'], 6566 | angular: ['frontend-architecture', 'web-applications'], 6567 | node: ['api-design', 'microservices'], 6568 | express: ['api-design', 'web-applications'], 6569 | fastify: ['api-design', 'performance-optimization'], 6570 | nestjs: ['api-design', 'microservices'], 6571 | spring: ['api-design', 'microservices'], 6572 | django: ['api-design', 'web-applications'], 6573 | flask: ['api-design', 'web-applications'], 6574 | rails: ['api-design', 'web-applications'], 6575 | laravel: ['api-design', 'web-applications'], 6576 | docker: ['containerization', 'microservices'], 6577 | kubernetes: ['containerization', 'distributed-systems'], 6578 | mongodb: ['database-design', 'data-architecture'], 6579 | postgresql: ['database-design', 'data-architecture'], 6580 | mysql: ['database-design', 'data-architecture'], 6581 | redis: ['database-design', 'performance-optimization'], 6582 | elasticsearch: ['database-design', 'data-architecture'], 6583 | kafka: ['distributed-systems', 'data-architecture'], 6584 | rabbitmq: ['distributed-systems', 'microservices'], 6585 | aws: ['cloud-architecture', 'scalability'], 6586 | azure: ['cloud-architecture', 'scalability'], 6587 | gcp: ['cloud-architecture', 'scalability'], 6588 | terraform: ['infrastructure-as-code', 'cloud-architecture'], 6589 | ansible: ['infrastructure-as-code', 'automation'], 6590 | jenkins: ['ci-cd', 'automation'], 6591 | 'github-actions': ['ci-cd', 'automation'], 6592 | 'gitlab-ci': ['ci-cd', 'automation'], 6593 | }; 6594 | 6595 | // Collect domains based on technology focus 6596 | const technologyDomains = new Set<string>(); 6597 | for (const tech of technologyFocus) { 6598 | const techLower = tech.toLowerCase(); 6599 | const domains = technologyDomainMap[techLower]; 6600 | if (domains) { 6601 | domains.forEach(domain => technologyDomains.add(domain)); 6602 | } 6603 | } 6604 | 6605 | // Combine base domains with technology-specific domains 6606 | const allDomains = [...baseDomains, ...Array.from(technologyDomains)]; 6607 | 6608 | // Remove duplicates and limit to reasonable number 6609 | const uniqueDomains = [...new Set(allDomains)]; 6610 | 6611 | // Return up to 6 most relevant domains 6612 | return uniqueDomains.slice(0, 6); 6613 | } 6614 | 6615 | /** 6616 | * Helper method to create base ADR generation prompt 6617 | */ 6618 | private createBaseAdrPrompt( 6619 | prdPath: string, 6620 | outputDirectory: string, 6621 | knowledgeContext: string 6622 | ): string { 6623 | return ` 6624 | # Enhanced ADR Generation from PRD Request 6625 | 6626 | This is a comprehensive prompt-driven ADR generation process enhanced with domain knowledge and optimized prompting. 6627 | 6628 | ${knowledgeContext} 6629 | 6630 | ## Step 1: File Validation 6631 | Please verify that the PRD file exists at: ${prdPath} 6632 | 6633 | ## Step 2: PRD Content Reading 6634 | Read and analyze the PRD content from: ${prdPath} 6635 | 6636 | ## Step 3: Enhanced ADR Generation and Creation 6637 | 6638 | Once you have successfully read the PRD content, analyze it using the domain knowledge above and generate Architectural Decision Records (ADRs). 6639 | 6640 | ### Enhanced Analysis Requirements 6641 | 6642 | 1. **Extract Key Decisions**: Identify all architectural decisions implied or stated in the PRD 6643 | 2. **Apply Domain Knowledge**: Use the generated domain knowledge to enhance decision analysis 6644 | 3. **Decision Categorization**: Group decisions by: 6645 | - Technology stack choices (informed by domain best practices) 6646 | - Architectural patterns (leveraging domain-specific patterns) 6647 | - Infrastructure decisions (considering domain requirements) 6648 | - Security considerations (applying domain security knowledge) 6649 | - Performance requirements (using domain performance insights) 6650 | - Integration approaches (following domain integration patterns) 6651 | 6652 | ### Enhanced ADR Generation Requirements 6653 | 6654 | 1. **Follow ADR Format**: Use standard ADR template with domain-enhanced content 6655 | 2. **Number Sequentially**: Use format 001-decision-title.md, 002-next-decision.md, etc. 6656 | 3. **Output Directory**: Place ADRs in ${outputDirectory}/ 6657 | 4. **Domain Context**: Include relevant domain knowledge in each ADR 6658 | 5. **File Creation**: Generate file creation prompts for each ADR 6659 | 6660 | ### Enhanced ADR Template Format 6661 | 6662 | \`\`\`markdown 6663 | # [Number]. [Title] 6664 | 6665 | **Status**: [Proposed/Accepted/Deprecated/Superseded] 6666 | **Date**: [YYYY-MM-DD] 6667 | **Domain**: [Relevant domain from knowledge enhancement] 6668 | 6669 | ## Context 6670 | [Describe the context and problem statement from PRD, enhanced with domain knowledge] 6671 | 6672 | ## Decision 6673 | [Describe the architectural decision, informed by domain best practices] 6674 | 6675 | ## Consequences 6676 | [Describe positive and negative consequences, considering domain-specific implications] 6677 | 6678 | ## Domain Considerations 6679 | [Specific considerations from the domain knowledge that influenced this decision] 6680 | 6681 | ## Implementation Plan 6682 | [Steps to implement this decision, leveraging domain expertise] 6683 | 6684 | ## Related PRD Sections 6685 | [Reference specific sections from the PRD that led to this decision] 6686 | 6687 | ## Domain References 6688 | [References to domain knowledge that informed this decision] 6689 | \`\`\` 6690 | 6691 | ### Expected Enhanced Output 6692 | 6693 | Please provide: 6694 | 1. **File Validation Results**: Confirmation that PRD file exists and is readable 6695 | 2. **PRD Content Summary**: Brief summary enhanced with domain context 6696 | 3. **Domain Analysis**: How domain knowledge applies to this PRD 6697 | 4. **Identified Decisions**: List of all architectural decisions with domain context 6698 | 5. **Generated ADRs**: Complete enhanced ADR content for each decision 6699 | 6. **File Creation Plan**: File names, directory structure, and creation order 6700 | 7. **Implementation Priority**: Recommended order considering domain best practices 6701 | 6702 | ### Quality Assurance with Domain Enhancement 6703 | 6704 | - Ensure each ADR leverages relevant domain knowledge 6705 | - Verify decisions align with domain best practices 6706 | - Check that domain considerations are properly documented 6707 | - Validate that ADR content is enhanced beyond basic analysis 6708 | `; 6709 | } 6710 | 6711 | /** 6712 | * ADR suggestion tool implementations 6713 | */ 6714 | private async suggestAdrs(args: Record<string, unknown>): Promise<CallToolResult> { 6715 | const { suggestAdrs } = await import('./tools/adr-suggestion-tool.js'); 6716 | return await suggestAdrs(args); 6717 | } 6718 | 6719 | private async generateAdrFromDecision( 6720 | args: GenerateAdrFromDecisionArgs 6721 | ): Promise<CallToolResult> { 6722 | const { generateAdrFromDecision } = await import('./tools/adr-suggestion-tool.js'); 6723 | return await generateAdrFromDecision(args); 6724 | } 6725 | 6726 | private async generateAdrBootstrap(args: Record<string, unknown>): Promise<CallToolResult> { 6727 | const { default: generateAdrBootstrapScripts } = await import( 6728 | './tools/adr-bootstrap-validation-tool.js' 6729 | ); 6730 | return await generateAdrBootstrapScripts(args); 6731 | } 6732 | 6733 | private async bootstrapValidationLoop(args: Record<string, unknown>): Promise<CallToolResult> { 6734 | const { default: bootstrapValidationLoop } = await import( 6735 | './tools/bootstrap-validation-loop-tool.js' 6736 | ); 6737 | return await bootstrapValidationLoop(args); 6738 | } 6739 | 6740 | private async discoverExistingAdrs( 6741 | args: Record<string, unknown>, 6742 | context?: ToolContext 6743 | ): Promise<CallToolResult> { 6744 | const ctx = context || createNoOpContext(); 6745 | 6746 | try { 6747 | ctx.info('🔍 Starting ADR discovery process...'); 6748 | ctx.report_progress(0, 100); 6749 | 6750 | ctx.info('📂 Phase 1: Scanning ADR directory'); 6751 | ctx.report_progress(30, 100); 6752 | 6753 | const { discoverExistingAdrs } = await import('./tools/adr-suggestion-tool.js'); 6754 | 6755 | ctx.info('📄 Phase 2: Analyzing ADR files'); 6756 | ctx.report_progress(60, 100); 6757 | 6758 | const result = await discoverExistingAdrs(args); 6759 | 6760 | ctx.info('✅ ADR discovery completed successfully'); 6761 | ctx.report_progress(100, 100); 6762 | 6763 | return result; 6764 | } catch (error) { 6765 | ctx.error?.( 6766 | `❌ ADR discovery failed: ${error instanceof Error ? error.message : String(error)}` 6767 | ); 6768 | throw error; 6769 | } 6770 | } 6771 | 6772 | private async reviewExistingAdrs(args: Record<string, unknown>): Promise<CallToolResult> { 6773 | const { reviewExistingAdrs } = await import('./tools/review-existing-adrs-tool.js'); 6774 | return await reviewExistingAdrs(args); 6775 | } 6776 | 6777 | /** 6778 | * ADR validation tool implementations 6779 | */ 6780 | private async validateAdr(args: Record<string, unknown>): Promise<CallToolResult> { 6781 | const { validateAdr } = await import('./tools/adr-validation-tool.js'); 6782 | return await validateAdr(args as any); 6783 | } 6784 | 6785 | private async validateAllAdrs(args: Record<string, unknown>): Promise<CallToolResult> { 6786 | const { validateAllAdrs } = await import('./tools/adr-validation-tool.js'); 6787 | return await validateAllAdrs(args as any); 6788 | } 6789 | 6790 | /** 6791 | * Research integration tool implementations 6792 | */ 6793 | private async incorporateResearch(args: Record<string, unknown>): Promise<CallToolResult> { 6794 | const { incorporateResearch } = await import('./tools/research-integration-tool.js'); 6795 | return await incorporateResearch(args); 6796 | } 6797 | 6798 | private async createResearchTemplate(args: Record<string, unknown>): Promise<CallToolResult> { 6799 | const { createResearchTemplate } = await import('./tools/research-integration-tool.js'); 6800 | return await createResearchTemplate(args); 6801 | } 6802 | 6803 | private async requestActionConfirmation(args: Record<string, unknown>): Promise<CallToolResult> { 6804 | const { requestActionConfirmation } = await import('./tools/research-integration-tool.js'); 6805 | return await requestActionConfirmation(args as unknown as ActionArgs); 6806 | } 6807 | 6808 | /** 6809 | * Rule generation and validation tool implementations 6810 | */ 6811 | private async generateRules(args: Record<string, unknown>): Promise<CallToolResult> { 6812 | const { generateRules } = await import('./tools/rule-generation-tool.js'); 6813 | return await generateRules(args); 6814 | } 6815 | 6816 | private async validateRules(args: ValidateRulesArgs): Promise<CallToolResult> { 6817 | const { validateRules } = await import('./tools/rule-generation-tool.js'); 6818 | return await validateRules(args); 6819 | } 6820 | 6821 | private async createRuleSet(args: CreateRuleSetArgs): Promise<CallToolResult> { 6822 | const { createRuleSet } = await import('./tools/rule-generation-tool.js'); 6823 | return await createRuleSet(args); 6824 | } 6825 | 6826 | /** 6827 | * Environment analysis tool implementation 6828 | */ 6829 | private async analyzeEnvironment(args: Record<string, unknown>): Promise<CallToolResult> { 6830 | const { analyzeEnvironment } = await import('./tools/environment-analysis-tool.js'); 6831 | return await analyzeEnvironment(args); 6832 | } 6833 | 6834 | /** 6835 | * Research question generation tool implementation 6836 | */ 6837 | private async generateResearchQuestions(args: Record<string, unknown>): Promise<CallToolResult> { 6838 | const { generateResearchQuestions } = await import('./tools/research-question-tool.js'); 6839 | return await generateResearchQuestions(args); 6840 | } 6841 | 6842 | /** 6843 | * Perform research tool implementation 6844 | */ 6845 | private async performResearch( 6846 | args: Record<string, unknown>, 6847 | context?: ToolContext 6848 | ): Promise<CallToolResult> { 6849 | const ctx = context || createNoOpContext(); 6850 | 6851 | if (!('question' in args) || typeof args['question'] !== 'string') { 6852 | throw new McpAdrError('Missing required parameter: question', 'INVALID_ARGUMENTS'); 6853 | } 6854 | 6855 | try { 6856 | ctx.info('🔍 Starting research process...'); 6857 | ctx.report_progress(0, 100); 6858 | 6859 | ctx.info('📊 Phase 1: Initializing research framework'); 6860 | ctx.report_progress(10, 100); 6861 | 6862 | const { performResearch } = await import('./tools/perform-research-tool.js'); 6863 | 6864 | ctx.info('📚 Phase 2: Executing research orchestration'); 6865 | ctx.report_progress(20, 100); 6866 | 6867 | const result = await performResearch( 6868 | args as { 6869 | question: string; 6870 | projectPath?: string; 6871 | adrDirectory?: string; 6872 | confidenceThreshold?: number; 6873 | performWebSearch?: boolean; 6874 | }, 6875 | ctx // ✅ Pass context to tool function for progress updates 6876 | ); 6877 | 6878 | return result; 6879 | } catch (error) { 6880 | ctx.error?.( 6881 | `❌ Research execution failed: ${error instanceof Error ? error.message : String(error)}` 6882 | ); 6883 | throw new McpAdrError( 6884 | `Failed to perform research: ${error instanceof Error ? error.message : String(error)}`, 6885 | 'RESEARCH_EXECUTION_ERROR' 6886 | ); 6887 | } 6888 | } 6889 | 6890 | /** 6891 | * LLM web search tool implementation 6892 | */ 6893 | private async llmWebSearch( 6894 | args: Record<string, unknown>, 6895 | context?: ToolContext 6896 | ): Promise<CallToolResult> { 6897 | const ctx = context || createNoOpContext(); 6898 | 6899 | if (!('query' in args) || typeof args['query'] !== 'string') { 6900 | throw new McpAdrError('Missing required parameter: query', 'INVALID_ARGUMENTS'); 6901 | } 6902 | 6903 | ctx.info('🌐 Starting LLM-managed web search...'); 6904 | ctx.report_progress(0, 100); 6905 | 6906 | const { llmWebSearch } = await import('./tools/llm-web-search-tool.js'); 6907 | return await llmWebSearch( 6908 | args as { 6909 | query: string; 6910 | maxResults?: number; 6911 | includeContent?: boolean; 6912 | llmInstructions?: string; 6913 | projectPath?: string; 6914 | adrDirectory?: string; 6915 | }, 6916 | ctx // ✅ Pass context to tool function for progress updates 6917 | ); 6918 | } 6919 | 6920 | /** 6921 | * LLM cloud management tool implementation 6922 | */ 6923 | private async llmCloudManagement( 6924 | args: Record<string, unknown>, 6925 | context?: ToolContext 6926 | ): Promise<CallToolResult> { 6927 | const ctx = context || createNoOpContext(); 6928 | 6929 | if (!('provider' in args) || !('action' in args) || !('llmInstructions' in args)) { 6930 | throw new McpAdrError( 6931 | 'Missing required parameters: provider, action, llmInstructions', 6932 | 'INVALID_ARGUMENTS' 6933 | ); 6934 | } 6935 | 6936 | ctx.info('🔧 Starting LLM-managed cloud operation...'); 6937 | ctx.report_progress(0, 100); 6938 | 6939 | const { llmCloudManagement } = await import('./tools/llm-cloud-management-tool.js'); 6940 | return await llmCloudManagement( 6941 | args as { 6942 | provider: 'aws' | 'azure' | 'gcp' | 'redhat' | 'ubuntu' | 'macos'; 6943 | action: string; 6944 | parameters?: Record<string, any>; 6945 | llmInstructions: string; 6946 | researchFirst?: boolean; 6947 | projectPath?: string; 6948 | adrDirectory?: string; 6949 | }, 6950 | ctx // ✅ Pass context to tool function for progress updates 6951 | ); 6952 | } 6953 | 6954 | /** 6955 | * LLM database management tool implementation 6956 | */ 6957 | private async llmDatabaseManagement( 6958 | args: Record<string, unknown>, 6959 | context?: ToolContext 6960 | ): Promise<CallToolResult> { 6961 | const ctx = context || createNoOpContext(); 6962 | 6963 | if (!('database' in args) || !('action' in args) || !('llmInstructions' in args)) { 6964 | throw new McpAdrError( 6965 | 'Missing required parameters: database, action, llmInstructions', 6966 | 'INVALID_ARGUMENTS' 6967 | ); 6968 | } 6969 | 6970 | ctx.info('🗄️ Starting LLM-managed database operation...'); 6971 | ctx.report_progress(0, 100); 6972 | 6973 | const { llmDatabaseManagement } = await import('./tools/llm-database-management-tool.js'); 6974 | return await llmDatabaseManagement( 6975 | args as { 6976 | database: 'postgresql' | 'mongodb' | 'redis' | 'mysql' | 'mariadb'; 6977 | action: string; 6978 | parameters?: Record<string, any>; 6979 | llmInstructions: string; 6980 | researchFirst?: boolean; 6981 | projectPath?: string; 6982 | adrDirectory?: string; 6983 | }, 6984 | ctx // ✅ Pass context to tool function for progress updates 6985 | ); 6986 | } 6987 | 6988 | /** 6989 | * Deployment analysis tool implementation 6990 | */ 6991 | private async analyzeDeploymentProgress(args: Record<string, unknown>): Promise<CallToolResult> { 6992 | const { analyzeDeploymentProgress } = await import('./tools/deployment-analysis-tool.js'); 6993 | return await analyzeDeploymentProgress(args); 6994 | } 6995 | 6996 | /** 6997 | * Apply content masking to MCP response 6998 | */ 6999 | /** 7000 | * Track memory operations performed by tools 7001 | */ 7002 | private async trackMemoryOperations( 7003 | toolName: string, 7004 | parameters: any, 7005 | result: any, 7006 | success: boolean 7007 | ): Promise<void> { 7008 | try { 7009 | // Check if memory integration was enabled and used 7010 | if (parameters?.enableMemoryIntegration === false) { 7011 | return; // Memory integration was explicitly disabled 7012 | } 7013 | 7014 | // Extract memory operation information from result 7015 | const memoryOps = this.extractMemoryOperations(toolName, parameters, result); 7016 | 7017 | if (memoryOps.length > 0) { 7018 | // Store memory operation tracking in knowledge graph 7019 | for (const op of memoryOps) { 7020 | await this.kgManager.addMemoryExecution( 7021 | toolName, 7022 | op.action, 7023 | op.entityType, 7024 | success && op.success, 7025 | op.details 7026 | ); 7027 | } 7028 | } 7029 | } catch (error) { 7030 | // Don't let memory tracking errors break execution 7031 | console.error('[WARN] Memory operation tracking failed:', error); 7032 | } 7033 | } 7034 | 7035 | /** 7036 | * Extract memory operation details from tool execution 7037 | */ 7038 | private extractMemoryOperations(toolName: string, parameters: any, result: any): any[] { 7039 | const operations: any[] = []; 7040 | 7041 | // Define memory-enabled tools and their expected operations 7042 | const memoryEnabledTools = { 7043 | analyze_content_security: { 7044 | entityType: 'security_pattern', 7045 | actions: ['store_pattern', 'analyze_institutional_security', 'track_evolution'], 7046 | }, 7047 | analyze_environment: { 7048 | entityType: 'environment_snapshot', 7049 | actions: ['store_snapshot', 'analyze_trends', 'compare_configurations'], 7050 | }, 7051 | deployment_readiness: { 7052 | entityType: 'deployment_assessment', 7053 | actions: ['store_assessment', 'migrate_history', 'analyze_patterns'], 7054 | }, 7055 | troubleshoot_guided_workflow: { 7056 | entityType: 'troubleshooting_session', 7057 | actions: ['store_session', 'pattern_recognition', 'suggest_adrs', 'generate_research'], 7058 | }, 7059 | }; 7060 | 7061 | // Check if this tool supports memory operations 7062 | const toolConfig = memoryEnabledTools[toolName as keyof typeof memoryEnabledTools]; 7063 | if (!toolConfig) { 7064 | return operations; // Tool doesn't support memory operations 7065 | } 7066 | 7067 | // Extract memory operation details from result 7068 | if (result?.memoryIntegration) { 7069 | const memoryInfo = result.memoryIntegration; 7070 | 7071 | // Pattern entity storage operation 7072 | if (memoryInfo.entityStored || memoryInfo.patternStored) { 7073 | operations.push({ 7074 | action: 'entity_storage', 7075 | entityType: toolConfig.entityType, 7076 | success: memoryInfo.storageSuccess !== false, 7077 | details: { 7078 | entityId: memoryInfo.entityId || memoryInfo.patternId, 7079 | entityCount: memoryInfo.entityCount || 1, 7080 | storageMethod: memoryInfo.storageMethod || 'standard', 7081 | }, 7082 | }); 7083 | } 7084 | 7085 | // Historical analysis operation 7086 | if (memoryInfo.historicalAnalysis || memoryInfo.trendAnalysis) { 7087 | operations.push({ 7088 | action: 'historical_analysis', 7089 | entityType: toolConfig.entityType, 7090 | success: memoryInfo.analysisSuccess !== false, 7091 | details: { 7092 | analysisType: memoryInfo.analysisType || 'trend_analysis', 7093 | entitiesAnalyzed: memoryInfo.entitiesAnalyzed || 0, 7094 | insights: memoryInfo.insights || [], 7095 | }, 7096 | }); 7097 | } 7098 | 7099 | // Evolution tracking operation 7100 | if (memoryInfo.evolutionTracking) { 7101 | operations.push({ 7102 | action: 'evolution_tracking', 7103 | entityType: toolConfig.entityType, 7104 | success: memoryInfo.evolutionSuccess !== false, 7105 | details: { 7106 | improvements: memoryInfo.improvements || [], 7107 | degradations: memoryInfo.degradations || [], 7108 | recommendations: memoryInfo.recommendations || [], 7109 | }, 7110 | }); 7111 | } 7112 | 7113 | // Migration operation (for deployment readiness) 7114 | if (memoryInfo.migrationCompleted) { 7115 | operations.push({ 7116 | action: 'data_migration', 7117 | entityType: toolConfig.entityType, 7118 | success: memoryInfo.migrationSuccess !== false, 7119 | details: { 7120 | migratedRecords: memoryInfo.migratedRecords || 0, 7121 | migrationMethod: memoryInfo.migrationMethod || 'json_to_memory', 7122 | }, 7123 | }); 7124 | } 7125 | } 7126 | 7127 | // If no specific memory integration info, infer from parameters 7128 | if (operations.length === 0 && parameters?.enableMemoryIntegration !== false) { 7129 | // Default assumption: entity was stored 7130 | operations.push({ 7131 | action: 'entity_storage', 7132 | entityType: toolConfig.entityType, 7133 | success: true, // Assume success if no explicit info 7134 | details: { 7135 | entityCount: 1, 7136 | storageMethod: 'inferred', 7137 | note: 'Memory operation inferred from tool execution', 7138 | }, 7139 | }); 7140 | } 7141 | 7142 | return operations; 7143 | } 7144 | 7145 | /** 7146 | * Track tool execution in knowledge graph 7147 | */ 7148 | private async trackToolExecution( 7149 | toolName: string, 7150 | parameters: any, 7151 | result: any, 7152 | success: boolean, 7153 | error?: string 7154 | ): Promise<void> { 7155 | try { 7156 | // Extract intentId from metadata if available 7157 | let intentId: string | undefined; 7158 | 7159 | if (result?.metadata?.intentId) { 7160 | intentId = result.metadata.intentId; 7161 | } else { 7162 | // Check for active intents that might be related to this tool execution 7163 | const activeIntents = await this.kgManager.getActiveIntents(); 7164 | if (activeIntents.length > 0) { 7165 | // Use the most recent active intent 7166 | const latestIntent = activeIntents[activeIntents.length - 1]; 7167 | if (latestIntent) { 7168 | intentId = latestIntent.intentId; 7169 | } 7170 | } 7171 | } 7172 | 7173 | // If no intent found, create a standalone execution record 7174 | if (!intentId) { 7175 | // Extract human request from conversation context if available 7176 | let humanRequest = `Standalone tool execution: ${toolName}`; 7177 | if (parameters?.conversationContext?.humanRequest) { 7178 | humanRequest = parameters.conversationContext.humanRequest; 7179 | } 7180 | 7181 | intentId = await this.kgManager.createIntent( 7182 | humanRequest, 7183 | [`Execute ${toolName}`, 'Complete tool operation'], 7184 | 'medium' 7185 | ); 7186 | } 7187 | 7188 | // Determine tasks created/modified from tool operation 7189 | const todoTasksCreated: string[] = []; 7190 | const todoTasksModified: string[] = []; 7191 | 7192 | // Extract task information from result metadata 7193 | if (result?.metadata) { 7194 | if (result.metadata.tasksCreated) { 7195 | todoTasksCreated.push(...result.metadata.tasksCreated); 7196 | } 7197 | if (result.metadata.tasksModified) { 7198 | todoTasksModified.push(...result.metadata.tasksModified); 7199 | } 7200 | if (result.metadata.taskIds) { 7201 | todoTasksModified.push(...result.metadata.taskIds); 7202 | } 7203 | } 7204 | 7205 | // Track memory operations if present 7206 | await this.trackMemoryOperations(toolName, parameters, result, success); 7207 | 7208 | // Store execution in knowledge graph 7209 | await this.kgManager.addToolExecution( 7210 | intentId, 7211 | toolName, 7212 | parameters, 7213 | result, 7214 | success, 7215 | todoTasksCreated, 7216 | todoTasksModified, 7217 | error 7218 | ); 7219 | 7220 | // If execution completed successfully, update intent status 7221 | if (success && !error) { 7222 | // Check if this might be the final tool in a chain 7223 | const intent = await this.kgManager.getIntentById(intentId); 7224 | if (intent && intent.currentStatus === 'executing') { 7225 | // Simple heuristic: if tool is a "completion" type tool, mark intent as completed 7226 | const completionTools = ['smart_git_push', 'generate_deployment_guidance', 'smart_score']; 7227 | if (completionTools.includes(toolName)) { 7228 | await this.kgManager.updateIntentStatus(intentId, 'completed'); 7229 | } 7230 | } 7231 | } 7232 | } catch (trackingError) { 7233 | // Don't let tracking errors break tool execution 7234 | console.error('[WARN] Knowledge graph tracking failed:', trackingError); 7235 | } 7236 | } 7237 | 7238 | private async applyOutputMasking(response: any): Promise<any> { 7239 | try { 7240 | return await maskMcpResponse(response, this.maskingConfig); 7241 | } catch (error) { 7242 | // If masking fails, log warning and return original response 7243 | // Log to stderr to avoid corrupting MCP protocol 7244 | console.error('[WARN] Output masking failed:', error); 7245 | return response; 7246 | } 7247 | } 7248 | 7249 | /** 7250 | * Enrich response with state reinforcement and apply masking 7251 | * 7252 | * Implements Phase 2 of context decay mitigation by injecting 7253 | * context reminders every N turns or when response exceeds token threshold. 7254 | * 7255 | * Phase 3 extension: Records conversation turns to structured external memory. 7256 | */ 7257 | private async enrichResponseWithStateReinforcement( 7258 | response: CallToolResult, 7259 | toolName?: string, 7260 | toolArgs?: any 7261 | ): Promise<CallToolResult> { 7262 | const startTime = Date.now(); 7263 | try { 7264 | // Extract text content from response 7265 | const textContent = response.content 7266 | .filter((item): item is { type: 'text'; text: string } => item.type === 'text') 7267 | .map(item => item.text) 7268 | .join('\n\n'); 7269 | 7270 | if (!textContent) { 7271 | // No text content to enrich, just apply masking 7272 | return await this.applyOutputMasking(response); 7273 | } 7274 | 7275 | // Enrich with state reinforcement (Phase 2) 7276 | const enriched = await this.stateReinforcementManager.enrichResponseWithContext(textContent); 7277 | 7278 | // Prepare final response 7279 | let finalResponse: CallToolResult; 7280 | 7281 | // Replace text content with enriched version if context was injected 7282 | if (enriched.contextInjected) { 7283 | finalResponse = { 7284 | ...response, 7285 | content: response.content.map(item => { 7286 | if (item.type === 'text') { 7287 | return { 7288 | type: 'text', 7289 | text: enriched.enrichedContent, 7290 | }; 7291 | } 7292 | return item; 7293 | }), 7294 | }; 7295 | } else { 7296 | finalResponse = response; 7297 | } 7298 | 7299 | // Record conversation turn (Phase 3: Structured External Memory) 7300 | if (toolName) { 7301 | const duration = Date.now() - startTime; 7302 | 7303 | // Check if response has expandableId (from tiered response) 7304 | const expandableIdMatch = textContent.match(/expandableId:\s*(\S+)/); 7305 | const expandableId = expandableIdMatch ? expandableIdMatch[1] : undefined; 7306 | 7307 | await this.conversationMemoryManager.recordTurn( 7308 | { 7309 | type: 'tool_call', 7310 | toolName, 7311 | toolArgs, 7312 | }, 7313 | { 7314 | content: enriched.enrichedContent || textContent, 7315 | tokenCount: enriched.tokenCount, 7316 | contextInjected: enriched.contextInjected, 7317 | ...(expandableId ? { expandableId } : {}), 7318 | }, 7319 | { 7320 | duration, 7321 | cacheHit: false, // Could be enhanced to track cache hits 7322 | errorOccurred: false, 7323 | } 7324 | ); 7325 | 7326 | this.logger.debug(`Conversation turn recorded for ${toolName}`, 'McpAdrAnalysisServer', { 7327 | turnNumber: enriched.turnNumber, 7328 | }); 7329 | } 7330 | 7331 | // Apply masking to final response 7332 | return await this.applyOutputMasking(finalResponse); 7333 | } catch (error) { 7334 | this.logger.error( 7335 | 'State reinforcement or conversation recording failed, returning original response', 7336 | 'McpAdrAnalysisServer', 7337 | error instanceof Error ? error : undefined 7338 | ); 7339 | // Fallback to just masking if enrichment fails 7340 | return await this.applyOutputMasking(response); 7341 | } 7342 | } 7343 | 7344 | /** 7345 | * Read MCP resource with prompt-driven caching 7346 | */ 7347 | private async readResource(uri: string): Promise<any> { 7348 | try { 7349 | // Import resource router and templated resources (ensures routes are registered) 7350 | const { resourceRouter } = await import('./resources/resource-router.js'); 7351 | 7352 | // Import templated resources to register routes 7353 | await import('./resources/adr-by-id-resource.js'); 7354 | await import('./resources/research-by-topic-resource.js'); 7355 | await import('./resources/todo-by-id-resource.js'); 7356 | await import('./resources/rule-by-id-resource.js'); 7357 | await import('./resources/technology-by-name-resource.js'); 7358 | await import('./resources/pattern-by-name-resource.js'); 7359 | 7360 | // Try routing first (handles templated resources) 7361 | if (resourceRouter.canRoute(uri)) { 7362 | const result = await resourceRouter.route(uri); 7363 | 7364 | return { 7365 | contents: [ 7366 | { 7367 | uri, 7368 | mimeType: result.contentType, 7369 | text: JSON.stringify(result.data, null, 2), 7370 | }, 7371 | ], 7372 | _meta: { 7373 | lastModified: result.lastModified, 7374 | etag: result.etag, 7375 | cacheKey: result.cacheKey, 7376 | }, 7377 | }; 7378 | } 7379 | 7380 | // Fall back to static resource handling 7381 | // Parse URI to determine resource type and parameters 7382 | const url = new globalThis.URL(uri); 7383 | const resourceType = url.pathname.replace('/', ''); 7384 | const params = Object.fromEntries(url.searchParams.entries()); 7385 | 7386 | switch (resourceType) { 7387 | case 'architectural_knowledge_graph': { 7388 | const { generateArchitecturalKnowledgeGraph } = await import('./resources/index.js'); 7389 | const projectPath = params['projectPath'] || process.cwd(); 7390 | 7391 | // Generate resource directly (caching is now handled through AI delegation) 7392 | const result = await generateArchitecturalKnowledgeGraph(projectPath); 7393 | 7394 | return { 7395 | contents: [ 7396 | { 7397 | uri, 7398 | mimeType: result.contentType, 7399 | text: JSON.stringify(result.data, null, 2), 7400 | }, 7401 | ], 7402 | }; 7403 | } 7404 | 7405 | case 'analysis_report': { 7406 | const { generateAnalysisReport } = await import('./resources/index.js'); 7407 | const projectPath = params['projectPath'] || process.cwd(); 7408 | const focusAreas = params['focusAreas'] ? params['focusAreas'].split(',') : undefined; 7409 | 7410 | // Generate resource directly (caching is now handled through AI delegation) 7411 | const result = await generateAnalysisReport(projectPath, focusAreas); 7412 | 7413 | return { 7414 | contents: [ 7415 | { 7416 | uri, 7417 | mimeType: result.contentType, 7418 | text: JSON.stringify(result.data, null, 2), 7419 | }, 7420 | ], 7421 | }; 7422 | } 7423 | 7424 | case 'adr_list': { 7425 | const { generateAdrList } = await import('./resources/index.js'); 7426 | const { getAdrDirectoryPath } = await import('./utils/config.js'); 7427 | const path = await import('path'); 7428 | 7429 | // Use absolute ADR path relative to project 7430 | const absoluteAdrPath = params['adrDirectory'] 7431 | ? path.resolve(this.config.projectPath, params['adrDirectory']) 7432 | : getAdrDirectoryPath(this.config); 7433 | 7434 | // Generate resource directly (caching is now handled through AI delegation) 7435 | const result = await generateAdrList(absoluteAdrPath, this.config.projectPath); 7436 | 7437 | return { 7438 | contents: [ 7439 | { 7440 | uri, 7441 | mimeType: result.contentType, 7442 | text: JSON.stringify(result.data, null, 2), 7443 | }, 7444 | ], 7445 | }; 7446 | } 7447 | 7448 | case 'todo_list': { 7449 | const { generateTodoListResource } = await import('./resources/todo-list-resource.js'); 7450 | const result = await generateTodoListResource(); 7451 | 7452 | return { 7453 | contents: [ 7454 | { 7455 | uri, 7456 | mimeType: result.contentType, 7457 | text: JSON.stringify(result.data, null, 2), 7458 | }, 7459 | ], 7460 | _meta: { 7461 | lastModified: result.lastModified, 7462 | etag: result.etag, 7463 | cacheKey: result.cacheKey, 7464 | }, 7465 | }; 7466 | } 7467 | 7468 | case 'research_index': { 7469 | const { generateResearchIndexResource } = await import( 7470 | './resources/research-index-resource.js' 7471 | ); 7472 | const result = await generateResearchIndexResource(); 7473 | 7474 | return { 7475 | contents: [ 7476 | { 7477 | uri, 7478 | mimeType: result.contentType, 7479 | text: JSON.stringify(result.data, null, 2), 7480 | }, 7481 | ], 7482 | _meta: { 7483 | lastModified: result.lastModified, 7484 | etag: result.etag, 7485 | cacheKey: result.cacheKey, 7486 | }, 7487 | }; 7488 | } 7489 | 7490 | case 'rule_catalog': { 7491 | const { generateRuleCatalogResource } = await import( 7492 | './resources/rule-catalog-resource.js' 7493 | ); 7494 | const result = await generateRuleCatalogResource(); 7495 | 7496 | return { 7497 | contents: [ 7498 | { 7499 | uri, 7500 | mimeType: result.contentType, 7501 | text: JSON.stringify(result.data, null, 2), 7502 | }, 7503 | ], 7504 | _meta: { 7505 | lastModified: result.lastModified, 7506 | etag: result.etag, 7507 | cacheKey: result.cacheKey, 7508 | }, 7509 | }; 7510 | } 7511 | 7512 | case 'rule_generation': { 7513 | const { generateRuleGenerationResource } = await import( 7514 | './resources/rule-generation-resource.js' 7515 | ); 7516 | const result = await generateRuleGenerationResource(undefined, url.searchParams); 7517 | 7518 | return { 7519 | contents: [ 7520 | { 7521 | uri, 7522 | mimeType: result.contentType, 7523 | text: JSON.stringify(result.data, null, 2), 7524 | }, 7525 | ], 7526 | _meta: { 7527 | lastModified: result.lastModified, 7528 | etag: result.etag, 7529 | cacheKey: result.cacheKey, 7530 | }, 7531 | }; 7532 | } 7533 | 7534 | case 'project_status': { 7535 | const { generateProjectStatusResource } = await import( 7536 | './resources/project-status-resource.js' 7537 | ); 7538 | const result = await generateProjectStatusResource(); 7539 | 7540 | return { 7541 | contents: [ 7542 | { 7543 | uri, 7544 | mimeType: result.contentType, 7545 | text: JSON.stringify(result.data, null, 2), 7546 | }, 7547 | ], 7548 | _meta: { 7549 | lastModified: result.lastModified, 7550 | etag: result.etag, 7551 | cacheKey: result.cacheKey, 7552 | }, 7553 | }; 7554 | } 7555 | 7556 | case 'deployment_status': { 7557 | const { generateDeploymentStatusResource } = await import( 7558 | './resources/deployment-status-resource.js' 7559 | ); 7560 | const result = await generateDeploymentStatusResource(undefined, url.searchParams); 7561 | 7562 | return { 7563 | contents: [ 7564 | { 7565 | uri, 7566 | mimeType: result.contentType, 7567 | text: JSON.stringify(result.data, null, 2), 7568 | }, 7569 | ], 7570 | _meta: { 7571 | lastModified: result.lastModified, 7572 | etag: result.etag, 7573 | cacheKey: result.cacheKey, 7574 | }, 7575 | }; 7576 | } 7577 | 7578 | case 'environment_analysis': { 7579 | const { generateEnvironmentAnalysisResource } = await import( 7580 | './resources/environment-analysis-resource.js' 7581 | ); 7582 | const result = await generateEnvironmentAnalysisResource(undefined, url.searchParams); 7583 | 7584 | return { 7585 | contents: [ 7586 | { 7587 | uri, 7588 | mimeType: result.contentType, 7589 | text: JSON.stringify(result.data, null, 2), 7590 | }, 7591 | ], 7592 | _meta: { 7593 | lastModified: result.lastModified, 7594 | etag: result.etag, 7595 | cacheKey: result.cacheKey, 7596 | }, 7597 | }; 7598 | } 7599 | 7600 | case 'memory_snapshots': { 7601 | const { generateMemorySnapshotsResource } = await import( 7602 | './resources/memory-snapshots-resource.js' 7603 | ); 7604 | const result = await generateMemorySnapshotsResource(undefined, url.searchParams); 7605 | 7606 | return { 7607 | contents: [ 7608 | { 7609 | uri, 7610 | mimeType: result.contentType, 7611 | text: JSON.stringify(result.data, null, 2), 7612 | }, 7613 | ], 7614 | _meta: { 7615 | lastModified: result.lastModified, 7616 | etag: result.etag, 7617 | cacheKey: result.cacheKey, 7618 | }, 7619 | }; 7620 | } 7621 | 7622 | case 'project_metrics': { 7623 | const { generateProjectMetricsResource } = await import( 7624 | './resources/project-metrics-resource.js' 7625 | ); 7626 | const result = await generateProjectMetricsResource(); 7627 | 7628 | return { 7629 | contents: [ 7630 | { 7631 | uri, 7632 | mimeType: result.contentType, 7633 | text: JSON.stringify(result.data, null, 2), 7634 | }, 7635 | ], 7636 | _meta: { 7637 | lastModified: result.lastModified, 7638 | etag: result.etag, 7639 | cacheKey: result.cacheKey, 7640 | }, 7641 | }; 7642 | } 7643 | 7644 | case 'deployment_history': { 7645 | const { generateDeploymentHistoryResource } = await import( 7646 | './resources/deployment-history-resource.js' 7647 | ); 7648 | const result = await generateDeploymentHistoryResource(undefined, url.searchParams); 7649 | 7650 | return { 7651 | contents: [ 7652 | { 7653 | uri, 7654 | mimeType: result.contentType, 7655 | text: JSON.stringify(result.data, null, 2), 7656 | }, 7657 | ], 7658 | _meta: { 7659 | lastModified: result.lastModified, 7660 | etag: result.etag, 7661 | cacheKey: result.cacheKey, 7662 | }, 7663 | }; 7664 | } 7665 | 7666 | case 'code_quality': { 7667 | const { generateCodeQualityResource } = await import( 7668 | './resources/code-quality-resource.js' 7669 | ); 7670 | const result = await generateCodeQualityResource(undefined, url.searchParams); 7671 | 7672 | return { 7673 | contents: [ 7674 | { 7675 | uri, 7676 | mimeType: result.contentType, 7677 | text: JSON.stringify(result.data, null, 2), 7678 | }, 7679 | ], 7680 | _meta: { 7681 | lastModified: result.lastModified, 7682 | etag: result.etag, 7683 | cacheKey: result.cacheKey, 7684 | }, 7685 | }; 7686 | } 7687 | 7688 | default: 7689 | throw new McpAdrError(`Unknown resource type: ${resourceType}`, 'UNKNOWN_RESOURCE'); 7690 | } 7691 | } catch (error) { 7692 | if (error instanceof McpAdrError) { 7693 | throw error; 7694 | } 7695 | throw new McpAdrError( 7696 | `Failed to read resource: ${error instanceof Error ? error.message : String(error)}`, 7697 | 'RESOURCE_ERROR' 7698 | ); 7699 | } 7700 | } 7701 | 7702 | /** 7703 | * Start the server 7704 | */ 7705 | async start(): Promise<void> { 7706 | // Validate configuration before starting 7707 | await this.validateConfiguration(); 7708 | 7709 | // Initialize memory entity manager 7710 | await this.memoryEntityManager.initialize(); 7711 | this.logger.info('Memory Entity Manager initialized', 'McpAdrAnalysisServer'); 7712 | 7713 | // Initialize conversation memory manager (Phase 3: Structured External Memory) 7714 | await this.conversationMemoryManager.initialize(); 7715 | this.logger.info('Phase 3 (Structured External Memory) initialized', 'McpAdrAnalysisServer'); 7716 | 7717 | // Generate initial server context file 7718 | try { 7719 | await this.contextGenerator.writeContextFile( 7720 | this.kgManager, 7721 | this.memoryEntityManager, 7722 | this.conversationMemoryManager 7723 | ); 7724 | this.logger.info( 7725 | 'Server context file generated at .mcp-server-context.md', 7726 | 'McpAdrAnalysisServer' 7727 | ); 7728 | } catch (error) { 7729 | this.logger.warn('Failed to generate initial server context file', 'McpAdrAnalysisServer', { 7730 | error: error instanceof Error ? error.message : String(error), 7731 | }); 7732 | } 7733 | 7734 | const transport = new StdioServerTransport(); 7735 | await this.server.connect(transport); 7736 | 7737 | // Keep the process alive 7738 | process.on('SIGINT', async () => { 7739 | await this.server.close(); 7740 | process.exit(0); 7741 | }); 7742 | } 7743 | 7744 | /** 7745 | * File system tool implementations 7746 | */ 7747 | 7748 | /** 7749 | * List accessible roots (MCP best practice) 7750 | */ 7751 | private async listRoots(): Promise<CallToolResult> { 7752 | const roots = this.rootManager.listRoots(); 7753 | 7754 | const rootsList = roots 7755 | .map(r => `### ${r.name}\n\n**Path**: \`${r.path}\`\n\n**Description**: ${r.description}\n`) 7756 | .join('\n'); 7757 | 7758 | return { 7759 | content: [ 7760 | { 7761 | type: 'text', 7762 | text: `# Available File System Roots\n\nThese are the directories that can be accessed by this MCP server.\n\n${rootsList}\nUse these paths with \`read_directory\` and \`read_file\` tools to explore and access files.`, 7763 | }, 7764 | ], 7765 | }; 7766 | } 7767 | 7768 | /** 7769 | * Read directory contents (MCP best practice for autonomous file discovery) 7770 | */ 7771 | private async readDirectory(args: { path?: string }): Promise<CallToolResult> { 7772 | const targetPath = args.path || this.config.projectPath; 7773 | 7774 | try { 7775 | const path = await import('path'); 7776 | const resolvedPath = path.resolve(targetPath); 7777 | 7778 | // Security check: ensure path is within accessible roots 7779 | if (!this.rootManager.isPathAllowed(resolvedPath)) { 7780 | const roots = this.rootManager.listRoots(); 7781 | const rootList = roots.map(r => ` - ${r.name}: ${r.path}`).join('\n'); 7782 | 7783 | throw new McpAdrError( 7784 | `Access denied: Path '${targetPath}' is outside accessible roots.\n\nAccessible roots:\n${rootList}\n\nUse list_roots tool for more details.`, 7785 | 'ACCESS_DENIED' 7786 | ); 7787 | } 7788 | 7789 | const { readdir } = await import('fs/promises'); 7790 | const entries = await readdir(resolvedPath, { withFileTypes: true }); 7791 | 7792 | const files = entries.filter(e => e.isFile()).map(e => `📄 ${e.name}`); 7793 | 7794 | const dirs = entries.filter(e => e.isDirectory()).map(e => `📁 ${e.name}/`); 7795 | 7796 | const root = this.rootManager.getRootForPath(resolvedPath); 7797 | const relPath = this.rootManager.getRelativePathFromRoot(resolvedPath); 7798 | 7799 | const filesList = files.length > 0 ? files.join('\n') : '(no files)'; 7800 | const dirsList = dirs.length > 0 ? dirs.join('\n') : '(no directories)'; 7801 | 7802 | return { 7803 | content: [ 7804 | { 7805 | type: 'text', 7806 | text: `# Directory: ${targetPath}\n\n**Root**: ${root?.name}\n**Relative Path**: ${relPath || '/'}\n**Full Path**: \`${resolvedPath}\`\n\n## Directories (${dirs.length})\n\n${dirsList}\n\n## Files (${files.length})\n\n${filesList}`, 7807 | }, 7808 | ], 7809 | }; 7810 | } catch (error) { 7811 | throw new McpAdrError( 7812 | `Failed to read directory: ${error instanceof Error ? error.message : String(error)}`, 7813 | 'DIRECTORY_READ_ERROR' 7814 | ); 7815 | } 7816 | } 7817 | 7818 | private async readFile(args: ReadFileArgs): Promise<CallToolResult> { 7819 | const { filePath } = args; 7820 | 7821 | try { 7822 | const fs = await import('fs/promises'); 7823 | const path = await import('path'); 7824 | 7825 | // Resolve path (handle both relative and absolute paths) 7826 | const safePath = path.resolve(filePath); 7827 | 7828 | // Security check: ensure path is within accessible roots 7829 | if (!this.rootManager.isPathAllowed(safePath)) { 7830 | const roots = this.rootManager.listRoots(); 7831 | const rootList = roots.map(r => ` - ${r.name}: ${r.path}`).join('\n'); 7832 | 7833 | throw new McpAdrError( 7834 | `Access denied: Path '${filePath}' is outside accessible roots.\n\nAccessible roots:\n${rootList}\n\nUse list_roots tool for more details.`, 7835 | 'ACCESS_DENIED' 7836 | ); 7837 | } 7838 | 7839 | const content = await fs.readFile(safePath, 'utf-8'); 7840 | 7841 | return { 7842 | content: [ 7843 | { 7844 | type: 'text', 7845 | text: content, 7846 | }, 7847 | ], 7848 | }; 7849 | } catch (error) { 7850 | throw new McpAdrError( 7851 | `Failed to read file: ${error instanceof Error ? error.message : String(error)}`, 7852 | 'FILE_READ_ERROR' 7853 | ); 7854 | } 7855 | } 7856 | 7857 | private async writeFile(args: WriteFileArgs): Promise<CallToolResult> { 7858 | const { filePath, content } = args; 7859 | 7860 | try { 7861 | const fs = await import('fs/promises'); 7862 | const path = await import('path'); 7863 | 7864 | // Resolve path relative to project path for security 7865 | const safePath = path.resolve(this.config.projectPath, filePath); 7866 | 7867 | // Security check: ensure path is within project directory 7868 | if (!safePath.startsWith(this.config.projectPath)) { 7869 | throw new McpAdrError('Access denied: Path is outside project directory', 'ACCESS_DENIED'); 7870 | } 7871 | 7872 | // Ensure directory exists 7873 | await fs.mkdir(path.dirname(safePath), { recursive: true }); 7874 | 7875 | // Write file 7876 | await fs.writeFile(safePath, content, 'utf-8'); 7877 | 7878 | return { 7879 | content: [ 7880 | { 7881 | type: 'text', 7882 | text: `Successfully wrote to ${filePath}`, 7883 | }, 7884 | ], 7885 | }; 7886 | } catch (error) { 7887 | throw new McpAdrError( 7888 | `Failed to write file: ${error instanceof Error ? error.message : String(error)}`, 7889 | 'FILE_WRITE_ERROR' 7890 | ); 7891 | } 7892 | } 7893 | 7894 | private async listDirectory(args: Record<string, unknown>): Promise<CallToolResult> { 7895 | const { path: dirPath } = args; 7896 | 7897 | try { 7898 | const fs = await import('fs/promises'); 7899 | const path = await import('path'); 7900 | 7901 | // Resolve path relative to project path for security 7902 | const safePath = path.resolve(this.config.projectPath, dirPath as string); 7903 | 7904 | // Security check: ensure path is within project directory 7905 | if (!safePath.startsWith(this.config.projectPath)) { 7906 | throw new McpAdrError('Access denied: Path is outside project directory', 'ACCESS_DENIED'); 7907 | } 7908 | 7909 | const entries = await fs.readdir(safePath, { withFileTypes: true }); 7910 | const fileList = entries.map(entry => ({ 7911 | name: entry.name, 7912 | type: entry.isDirectory() ? 'directory' : 'file', 7913 | path: path.join(dirPath as string, entry.name), 7914 | })); 7915 | 7916 | return { 7917 | content: [ 7918 | { 7919 | type: 'text', 7920 | text: JSON.stringify(fileList, null, 2), 7921 | }, 7922 | ], 7923 | }; 7924 | } catch (error) { 7925 | throw new McpAdrError( 7926 | `Failed to list directory: ${error instanceof Error ? error.message : String(error)}`, 7927 | 'DIRECTORY_LIST_ERROR' 7928 | ); 7929 | } 7930 | } 7931 | 7932 | private async generateDeploymentGuidance(args: Record<string, unknown>): Promise<CallToolResult> { 7933 | try { 7934 | const { generateDeploymentGuidance } = await import('./tools/deployment-guidance-tool.js'); 7935 | return await generateDeploymentGuidance(args); 7936 | } catch (error) { 7937 | throw new McpAdrError( 7938 | `Deployment guidance generation failed: ${error instanceof Error ? error.message : String(error)}`, 7939 | 'DEPLOYMENT_GUIDANCE_ERROR' 7940 | ); 7941 | } 7942 | } 7943 | 7944 | private async smartGitPush(args: Record<string, unknown>): Promise<CallToolResult> { 7945 | try { 7946 | const { smartGitPush } = await import('./tools/smart-git-push-tool-v2.js'); 7947 | return await smartGitPush(args); 7948 | } catch (error) { 7949 | throw new McpAdrError( 7950 | `Smart git push failed: ${error instanceof Error ? error.message : String(error)}`, 7951 | 'SMART_GIT_PUSH_ERROR' 7952 | ); 7953 | } 7954 | } 7955 | 7956 | private async deploymentReadiness(args: Record<string, unknown>): Promise<CallToolResult> { 7957 | try { 7958 | const { deploymentReadiness } = await import('./tools/deployment-readiness-tool.js'); 7959 | return await deploymentReadiness(args); 7960 | } catch (error) { 7961 | throw new McpAdrError( 7962 | `Deployment readiness check failed: ${error instanceof Error ? error.message : String(error)}`, 7963 | 'DEPLOYMENT_READINESS_ERROR' 7964 | ); 7965 | } 7966 | } 7967 | 7968 | private async troubleshootGuidedWorkflow(args: Record<string, unknown>): Promise<CallToolResult> { 7969 | try { 7970 | const { troubleshootGuidedWorkflow } = await import( 7971 | './tools/troubleshoot-guided-workflow-tool.js' 7972 | ); 7973 | return await troubleshootGuidedWorkflow(args as unknown as TodoManagementV2Args); 7974 | } catch (error) { 7975 | throw new McpAdrError( 7976 | `Troubleshoot guided workflow failed: ${error instanceof Error ? error.message : String(error)}`, 7977 | 'TROUBLESHOOT_GUIDED_WORKFLOW_ERROR' 7978 | ); 7979 | } 7980 | } 7981 | 7982 | private async smartScore(_args: Record<string, unknown>): Promise<CallToolResult> { 7983 | // Smart score tool was removed - return deprecation message 7984 | return { 7985 | content: [ 7986 | { 7987 | type: 'text', 7988 | text: `⚠️ **Smart Score Tool Deprecated** 7989 | 7990 | This tool has been deprecated and replaced with memory-centric health scoring. 7991 | 7992 | **Replacement:** The new MemoryHealthScoring system tracks: 7993 | - Memory quality and relevance 7994 | - Retrieval performance 7995 | - Entity relationship coherence 7996 | - Context utilization 7997 | - Decision alignment 7998 | 7999 | **Migration:** Health scoring is now integrated into the knowledge graph and automatically calculated based on memory usage patterns.`, 8000 | }, 8001 | ], 8002 | isError: false, 8003 | }; 8004 | } 8005 | 8006 | private async mcpPlanning(args: Record<string, unknown>): Promise<CallToolResult> { 8007 | try { 8008 | const { mcpPlanning } = await import('./tools/mcp-planning-tool.js'); 8009 | return await mcpPlanning(args); 8010 | } catch (error) { 8011 | throw new McpAdrError( 8012 | `MCP planning failed: ${error instanceof Error ? error.message : String(error)}`, 8013 | 'MCP_PLANNING_ERROR' 8014 | ); 8015 | } 8016 | } 8017 | 8018 | private async memoryLoading(args: Record<string, unknown>): Promise<CallToolResult> { 8019 | try { 8020 | const { MemoryLoadingTool } = await import('./tools/memory-loading-tool.js'); 8021 | const memoryTool = new MemoryLoadingTool(); 8022 | return await memoryTool.execute(args); 8023 | } catch (error) { 8024 | throw new McpAdrError( 8025 | `Memory loading failed: ${error instanceof Error ? error.message : String(error)}`, 8026 | 'MEMORY_LOADING_ERROR' 8027 | ); 8028 | } 8029 | } 8030 | 8031 | private async expandAnalysisSection(args: Record<string, unknown>): Promise<CallToolResult> { 8032 | try { 8033 | const { expandAnalysisSection } = await import('./tools/expand-analysis-tool.js'); 8034 | return await expandAnalysisSection(args as any); 8035 | } catch (error) { 8036 | throw new McpAdrError( 8037 | `Failed to expand analysis: ${error instanceof Error ? error.message : String(error)}`, 8038 | 'EXPAND_ANALYSIS_ERROR' 8039 | ); 8040 | } 8041 | } 8042 | 8043 | private async interactiveAdrPlanning(args: Record<string, unknown>): Promise<CallToolResult> { 8044 | try { 8045 | const { interactiveAdrPlanning } = await import('./tools/interactive-adr-planning-tool.js'); 8046 | return await interactiveAdrPlanning(args); 8047 | } catch (error) { 8048 | throw new McpAdrError( 8049 | `Interactive ADR planning failed: ${error instanceof Error ? error.message : String(error)}`, 8050 | 'INTERACTIVE_ADR_PLANNING_ERROR' 8051 | ); 8052 | } 8053 | } 8054 | 8055 | /** 8056 | * Tool chain orchestrator implementation 8057 | */ 8058 | private async toolChainOrchestrator(args: ToolChainOrchestratorArgs): Promise<CallToolResult> { 8059 | try { 8060 | const { toolChainOrchestrator } = await import('./tools/tool-chain-orchestrator.js'); 8061 | return await toolChainOrchestrator(args as any); 8062 | } catch (error) { 8063 | throw new McpAdrError( 8064 | `Tool chain orchestration failed: ${error instanceof Error ? error.message : String(error)}`, 8065 | 'TOOL_CHAIN_ORCHESTRATOR_ERROR' 8066 | ); 8067 | } 8068 | } 8069 | 8070 | /** 8071 | * Phase 3: Expand Memory Tool 8072 | * Retrieves and expands stored content from tiered responses 8073 | */ 8074 | private async expandMemory(args: any): Promise<CallToolResult> { 8075 | try { 8076 | const { expandMemory } = await import('./tools/conversation-memory-tool.js'); 8077 | return await expandMemory(args, this.conversationMemoryManager); 8078 | } catch (error) { 8079 | throw new McpAdrError( 8080 | `Memory expansion failed: ${error instanceof Error ? error.message : String(error)}`, 8081 | 'MEMORY_EXPANSION_ERROR' 8082 | ); 8083 | } 8084 | } 8085 | 8086 | /** 8087 | * Phase 3: Query Conversation History Tool 8088 | * Searches and retrieves conversation sessions 8089 | */ 8090 | private async queryConversationHistory(args: any): Promise<CallToolResult> { 8091 | try { 8092 | const { queryConversationHistory } = await import('./tools/conversation-memory-tool.js'); 8093 | return await queryConversationHistory(args, this.conversationMemoryManager); 8094 | } catch (error) { 8095 | throw new McpAdrError( 8096 | `Conversation history query failed: ${error instanceof Error ? error.message : String(error)}`, 8097 | 'CONVERSATION_QUERY_ERROR' 8098 | ); 8099 | } 8100 | } 8101 | 8102 | /** 8103 | * Phase 3: Get Conversation Snapshot Tool 8104 | * Retrieves current conversation context 8105 | */ 8106 | private async getConversationSnapshot(args: any): Promise<CallToolResult> { 8107 | try { 8108 | const { getConversationSnapshot } = await import('./tools/conversation-memory-tool.js'); 8109 | return await getConversationSnapshot(args, this.conversationMemoryManager); 8110 | } catch (error) { 8111 | throw new McpAdrError( 8112 | `Conversation snapshot retrieval failed: ${error instanceof Error ? error.message : String(error)}`, 8113 | 'SNAPSHOT_ERROR' 8114 | ); 8115 | } 8116 | } 8117 | 8118 | /** 8119 | * Phase 3: Get Memory Statistics Tool 8120 | * Retrieves conversation memory statistics 8121 | */ 8122 | private async getMemoryStats(): Promise<CallToolResult> { 8123 | try { 8124 | const { getMemoryStats } = await import('./tools/conversation-memory-tool.js'); 8125 | return await getMemoryStats(this.conversationMemoryManager); 8126 | } catch (error) { 8127 | throw new McpAdrError( 8128 | `Memory stats retrieval failed: ${error instanceof Error ? error.message : String(error)}`, 8129 | 'MEMORY_STATS_ERROR' 8130 | ); 8131 | } 8132 | } 8133 | 8134 | /** 8135 | * Get Server Context Tool 8136 | * Generates comprehensive server context file for LLM @ referencing 8137 | */ 8138 | private async getServerContext(args: any): Promise<CallToolResult> { 8139 | try { 8140 | const { getServerContext } = await import('./tools/get-server-context-tool.js'); 8141 | return await getServerContext( 8142 | args, 8143 | this.kgManager, 8144 | this.memoryEntityManager, 8145 | this.conversationMemoryManager 8146 | ); 8147 | } catch (error) { 8148 | throw new McpAdrError( 8149 | `Server context generation failed: ${error instanceof Error ? error.message : String(error)}`, 8150 | 'SERVER_CONTEXT_ERROR' 8151 | ); 8152 | } 8153 | } 8154 | } 8155 | 8156 | /** 8157 | * Main execution function for the MCP ADR Analysis Server 8158 | * 8159 | * @description Initializes and starts the MCP server with proper configuration, 8160 | * error handling, and graceful shutdown. Handles command line arguments for 8161 | * help, version, and test modes. 8162 | * 8163 | * @returns {Promise<void>} Resolves when server shuts down gracefully 8164 | * 8165 | * @throws {Error} When server initialization fails or configuration is invalid 8166 | * 8167 | * @example 8168 | * ```typescript 8169 | * // Start the server (typically called from CLI) 8170 | * await main(); 8171 | * ``` 8172 | * 8173 | * @since 1.0.0 8174 | * @category Main 8175 | */ 8176 | async function main(): Promise<void> { 8177 | const args = process.argv.slice(2); 8178 | 8179 | // Handle command line arguments 8180 | if (args.includes('--help') || args.includes('-h')) { 8181 | console.log(` 8182 | MCP ADR Analysis Server v${SERVER_INFO.version} 8183 | 8184 | Usage: mcp-adr-analysis-server [options] 8185 | 8186 | Options: 8187 | --help, -h Show this help message 8188 | --version, -v Show version information 8189 | --test Run health check and exit 8190 | --config Show configuration and exit 8191 | 8192 | Environment Variables: 8193 | PROJECT_PATH Path to project directory (default: current directory) 8194 | ADR_DIRECTORY ADR directory relative to project (default: docs/adrs) 8195 | LOG_LEVEL Logging level: DEBUG, INFO, WARN, ERROR (default: INFO) 8196 | CACHE_ENABLED Enable caching: true, false (default: true) 8197 | 8198 | Examples: 8199 | mcp-adr-analysis-server # Start MCP server 8200 | PROJECT_PATH=/path/to/project mcp-adr-analysis-server 8201 | mcp-adr-analysis-server --test # Health check 8202 | `); 8203 | process.exit(0); 8204 | } 8205 | 8206 | if (args.includes('--version') || args.includes('-v')) { 8207 | console.log(`MCP ADR Analysis Server v${SERVER_INFO.version}`); 8208 | process.exit(0); 8209 | } 8210 | 8211 | try { 8212 | const server = new McpAdrAnalysisServer(); 8213 | 8214 | if (args.includes('--test')) { 8215 | console.log('🔍 Running health check...'); 8216 | await server.healthCheck(); 8217 | console.log('✅ Health check passed - server can start successfully'); 8218 | process.exit(0); 8219 | } 8220 | 8221 | if (args.includes('--config')) { 8222 | console.log('📋 Server configuration validated'); 8223 | process.exit(0); 8224 | } 8225 | 8226 | // Normal server startup 8227 | await server.start(); 8228 | } catch (error) { 8229 | console.error('❌ MCP server failed to start'); 8230 | console.error('Error:', error instanceof Error ? error.message : String(error)); 8231 | process.exit(1); 8232 | } 8233 | } 8234 | 8235 | // Start the server if this file is run directly 8236 | // Jest-compatible check: avoid import.meta.url which Jest cannot handle 8237 | // Handle both direct execution and npm global package symlinks 8238 | if ( 8239 | process.argv[1] && 8240 | (process.argv[1].endsWith('index.js') || 8241 | process.argv[1].endsWith('index.ts') || 8242 | process.argv[1].endsWith('mcp-adr-analysis-server')) 8243 | ) { 8244 | main().catch(error => { 8245 | console.error('Unhandled error:', error); 8246 | process.exit(1); 8247 | }); 8248 | } 8249 | // Test comment for pre-commit hook 8250 | ```