{"_id":"rlm-navigator","_rev":"29-afd48c4eb33d84ecb17d1e9c8576d18a","name":"rlm-navigator","dist-tags":{"latest":"2.3.0"},"versions":{"0.1.0":{"name":"rlm-navigator","version":"0.1.0","_id":"rlm-navigator@0.1.0","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"cee08b23081b16d81f09ea5058974591c15f3e10","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.0.tgz","fileCount":12,"integrity":"sha512-dPnquGrvV5jFtkFIFgPEfcbFOvT0s6bNaZnUvKY4WeQooPLxc/Q7pi48SV2efu8NVyqBnvMDScO4EPTLL+5+2w==","signatures":[{"sig":"MEYCIQDUOmjG4UcPv0BmxzgNP4mXSR51K8z6AJJZG7fitNQQ9QIhAIUrumdOnWWoG4tNGSr2TEC7/jXSjFbnBUe4Bk6VU6nh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":88625},"gitHead":"cf738772f794d11974df0ab2b5ddecef5e68ab78","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.0_1771629653338_0.9938192003121293","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"rlm-navigator","version":"0.1.1","_id":"rlm-navigator@0.1.1","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"de3e9c7559d424e5f7a63b28422e656299e4e396","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.1.tgz","fileCount":14,"integrity":"sha512-Ro6T0rPBgt6FnlPfvQPVZ+/wGjVltUmt7SjDtVqC3YgbZX+cP5Lcfg5F/pR9fjWwhv6af+qYjb1qCXrVrkwu4Q==","signatures":[{"sig":"MEYCIQDcCAw+nZaGeK7Rl/ertmR7S7ZjcRcC+zcEbJE4W+ZqTAIhAMuPPoNzPngFdhspbWmxVWyASnsmLVu/Ss666VQk0IFj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96582},"gitHead":"40edbbbeceff5c00de01e97412a5dff5609948cf","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.1_1771630193278_0.6977330415595724","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"rlm-navigator","version":"0.1.2","_id":"rlm-navigator@0.1.2","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"0ff895e4514093d5d962feb0e8c44ad13e8d8c88","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.2.tgz","fileCount":14,"integrity":"sha512-01lkeoEe8/kJ8sHYyAjTUaVUtBB4V5BfkCrJn8vJ5Vn/Pq1VtOk7/U8/wBGgozO57zONmTd/eH/NuXJVmKBIwA==","signatures":[{"sig":"MEUCIQCnjKmTNt2WO65KD9lW6D9csae/uQ8udnNzTXsyANiDbAIgczBGza0X0rUEgp51FX4PzqooButXsjk6hzG6DbeGPws=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97289},"gitHead":"6f1c5a41332c0367dd84505045d1c8435932d0ae","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.2_1771631324666_0.28594069213891404","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"rlm-navigator","version":"0.1.3","_id":"rlm-navigator@0.1.3","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"0f4d9ff7e8164667d213bb9bfb455a706b5888f0","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.3.tgz","fileCount":14,"integrity":"sha512-aKqVeYGCNq30Xn14129dfZJ9H106QxSA4C6Sj66VZAD1/EyApeVYB/dxkPJkcmYzXkWte/H/pZvPC1Naca56Nw==","signatures":[{"sig":"MEUCIQC4lt/6m91gXCPDvtQG2zAeSfmpLp5TTyZ54jW73lwTjQIgUfputdZ4TgwBtjphw9b2jyBFkhNnYu18cLHYKTQfTUE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97549},"gitHead":"0d53ef04a25c8a647f093ed50276530f1bf029d0","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.3_1771634879194_0.516207166012836","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"rlm-navigator","version":"0.1.4","_id":"rlm-navigator@0.1.4","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"34babd836a1fecf94f0847a943729e306f1a1e52","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.4.tgz","fileCount":14,"integrity":"sha512-WFRad/7E6o8b+nCpgXwcXhZMII1CMLxOf87zf0kaW31PMm7bNgrGjcFgJXkwEw49Ssp95E6w7Y3bPw19COpxOA==","signatures":[{"sig":"MEUCIQDV3HzDO514qDLlqY6vC8Nq+iASK0COnhkHjBNK3t8LgQIgHlSqNery03saYNj6gxFF14rg7fjQsPzuXckBnNvOmOQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100690},"gitHead":"546ec7885bc17a50ecf6ce12a63f67c5103f1fc3","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.4_1771635181222_0.041351314644330284","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"rlm-navigator","version":"0.1.5","_id":"rlm-navigator@0.1.5","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"3d0f128ae2bdb4673cfba3ba004a4b2548cfc770","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.5.tgz","fileCount":14,"integrity":"sha512-cIWfWlUVdcDb86w1+iC2vvcjhVPQ0zVe0zohOzWB9KgunHV6lTRUxNfZ3k7rOMue7sSn53BSSWhc5uXHHykf/g==","signatures":[{"sig":"MEYCIQCwE/FVQimpwntfAoxYi5fZtGsjZ8eMwcB0NBzEd1o0MAIhAPXDWePYFIt/HuBoOk7cqs3+z9gtJkqQ40jcXU13oeBL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":100690},"gitHead":"b129e9d8654d1f0d49c77beb1dcc60233c8de29d","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.5_1771636978261_0.6855405178274983","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"rlm-navigator","version":"0.1.7","_id":"rlm-navigator@0.1.7","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"f1bdd572df25048013b2cb06bc8163d36314f7b2","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.7.tgz","fileCount":14,"integrity":"sha512-9vLAGm/xmVg3LSjF8jmxhnO740qcLp9/qk1ywalTT4p5iDq9URvxQ/bCVkxF+HbBoN9RJGp4lNyWzLsF33c8DQ==","signatures":[{"sig":"MEUCID9kWPrGc4nrJ2Px1mA7hUcxEK3JD+JephsDqAxRmyQVAiEAyGR8rwt408IVK8ut7nbBaoU4d2O9xe/bnjsOzkJ99H4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101348},"gitHead":"be990024009c13b94da09b792f757af431abddf4","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.7_1771637402827_0.24054335831869067","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"name":"rlm-navigator","version":"0.1.8","_id":"rlm-navigator@0.1.8","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"bc54b0ebe9838494b3edf2f100da644cf6cdc097","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.8.tgz","fileCount":14,"integrity":"sha512-s7kvi1xmBruRD4y0wImwodlnnYxMCuTJ0EqEtyeOkg3FAqYPKGDQ4Z7h3mXvnM5XqTVGefGdkEmX1ItHUoiFXA==","signatures":[{"sig":"MEUCIHF3UhJwwwjIoFQy6wmMkZ4E/GBzQrPzHBshIQahUT5cAiEApPGOLlDfPkT+HRCuXAt9WL0WGhyjWmhSgW8oJXd2DM4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101773},"gitHead":"d1943736811829da441b94d014ab0cfc7c10b581","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.8_1771669442869_0.9694497448241202","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"rlm-navigator","version":"0.1.9","_id":"rlm-navigator@0.1.9","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"c3d324bc537e872c500b5c2c9bd439d7ce5c6c7a","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.9.tgz","fileCount":14,"integrity":"sha512-2O4xlxRznpw0hyz+ZuM2Vmcew3mzMqkN5yrq3W+Ytwtu5SoRUS7CAwLLgSOrmvUoPADv1sEIOelNtJP/e5rVhQ==","signatures":[{"sig":"MEQCIH3P07CqQ/3SZIqGOxeUdUFKQlbCqikRj7IyEqnUE9H5AiB7USpJ+OKo2cm3+KzSbLgcMJanhpJwiT+MBQJMMxbMbQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106629},"gitHead":"361845526d44850f7b8a9d3362237e9bb1029d81","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.9_1771673410896_0.6462540644972967","host":"s3://npm-registry-packages-npm-production"}},"0.1.10":{"name":"rlm-navigator","version":"0.1.10","_id":"rlm-navigator@0.1.10","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"fc814f777a732f299d4b3fd81f316f3223acb3a9","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.10.tgz","fileCount":14,"integrity":"sha512-rcC1k7GecSMCqaIb44ghtHjsyw9Nm7QHxeUFMT1tTNPyLDqlN2LZsvC4aSi2n57GmR8HrJOSj+YVm7rECHhtlg==","signatures":[{"sig":"MEUCIFLF/r/KZSr3cIh0cjgbaGoO1GbElkQ6Y42bMb8cfCzLAiEA7BbR9RrWqXLfnNeP/tTdQUCr9Q3b5DKOMk9DtykHbtI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106630},"gitHead":"b9ecb39e84bff9a9fc54f1ba881e7600ad149176","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.10_1771674259420_0.9802842651717827","host":"s3://npm-registry-packages-npm-production"}},"0.1.11":{"name":"rlm-navigator","version":"0.1.11","_id":"rlm-navigator@0.1.11","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"292213ebbf04472a089f015335dee6b69fc57f2b","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-0.1.11.tgz","fileCount":14,"integrity":"sha512-wseAnZHh2wGWcPFDOjuhawT249TTHFYI7vi26WOhzGzUmMxMyE/G4ASkqYi7jSuE2jhhsblnu8cnAUjsetNc5A==","signatures":[{"sig":"MEUCIAPAYyC2bTjfcT7WzDYyTgvyRU8/u2VEAe90iR3dd3fnAiEAm1jTIWoq0hJSntALQl6Jp9kHE9Yd0bA6WYOazEnVRt0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":107864},"gitHead":"16024b5f6359c112e319820bbde68bbdcebfeef9","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_0.1.11_1771679048719_0.6812796659085549","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"rlm-navigator","version":"1.0.0","_id":"rlm-navigator@1.0.0","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"dfa3063f3a5d24e6cffc7c8d40a80b73f3666ff9","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.0.0.tgz","fileCount":14,"integrity":"sha512-pQURfvsrgeooEj11fsOt2pYwk0ZM2E7QBMQUpj80Jzu+4vgtDEhvy2g6W4AkvpR1aqP3eDc0GQjdE8esxVaOJw==","signatures":[{"sig":"MEYCIQCRknbO/wpgHfjENPcD7kbF6vCVP6p2OBJefBIsbt4WuwIhAJ9guRUg6ReJ2qt9VMxvEtLh1qpAn7s0WCr2z+RPpibg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112668},"gitHead":"bdbf92059cd3e66e7556ddf934269a0a99f0c77f","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.0.0_1771692012644_0.6175513008744895","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"rlm-navigator","version":"1.0.1","_id":"rlm-navigator@1.0.1","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"8b81fbd0eb6d342bb2d333bfe1e41e7a145c0c71","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.0.1.tgz","fileCount":14,"integrity":"sha512-mDheryv3uFjIJe+Ch3hfsmOeVeBYhADiuNYKh+hQtAFm+Ohxx4BPa3o/3cT/5xRyf7kONZWdq/cWsisVBfxhbw==","signatures":[{"sig":"MEYCIQDx/dvtg9KY/GMCTJVrtvHVieKXJM6KGAT3/Zjd8uU/bgIhAN+IePFD+tSzRTbLjjqfMx6g/6lVXOrs3Rdwx9eGR2ub","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":115309},"gitHead":"cdd84b9b32f53a93bfb270003a431e30cfc38e38","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.0.1_1771694377921_0.09080283869708738","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"rlm-navigator","version":"1.0.2","_id":"rlm-navigator@1.0.2","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"2c4a3cd746a056f8c590760c1ea3d56e306f9a61","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.0.2.tgz","fileCount":14,"integrity":"sha512-q70N9lSpLI+fbpXJjqd8iLMCtbM3amnwmnIfRplChhjN831wi/J53/Td6vEqSS76tMVS+NkuFT5amNURQbW01Q==","signatures":[{"sig":"MEUCIQDbt0MRFAPpiCXqr4LuWJsb/IYARhIhV1vjoeBD28paMAIgTfhTAIeXmVm6QL+PV7ojkXo6Q+Le6Qewzn6WjgFcW6A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128128},"gitHead":"3a2f1d071ecb6bcfcfee6d7975a1994649ae0e99","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.0.2_1771707048499_0.04637117876812802","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"rlm-navigator","version":"1.0.5","_id":"rlm-navigator@1.0.5","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"96740d1c75b2d663705babec57f1317e10014753","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.0.5.tgz","fileCount":15,"integrity":"sha512-7jrmQmrtKzfG4SDj/VN2wG1YRdJSENkXSnttfJCVZj7xC5e3oBjsT04BXghGRtruuTQg3h8zQdvuYfoCB5YRKw==","signatures":[{"sig":"MEYCIQD9UKVNK9AviPR20TpMO/xqk8cGdpmEwYX8pFmkJZEg6AIhAMz/X1lcRM85Q0xckIJJtRPvQYAnE4GkAX1zJ6fb48mA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135308},"gitHead":"5adb924030a22ade11307ea782fb8770520348af","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.0.5_1771721963419_0.1572978470520754","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"rlm-navigator","version":"1.1.1","_id":"rlm-navigator@1.1.1","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"d10b5fa853f3515421b90b5b31f40ee2d7d00c07","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.1.1.tgz","fileCount":15,"integrity":"sha512-Fu+d2LpOsPsbaNsIw2igfQjKM8U1UC4LWOqLJe02GwI55t91ivUORT8FWKu4P+Ud4LAK4N6Dy5OkwijWHAvHrA==","signatures":[{"sig":"MEUCIBkUYRuCp4bnibu/yg1Pgw4z4J33e5l8DMfx74iZbZfhAiEAtDfL4/FpluaB5b90dNziWXeB2T0xTG0FR7B0ORFFz90=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143769},"gitHead":"e7324d866b98b3933f731390bb9da9983977dc63","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.1.1_1772015131539_0.9721148507926354","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"rlm-navigator","version":"1.1.2","_id":"rlm-navigator@1.1.2","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"debe5889307c5e861ea86a7164a94bcba773b09a","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.1.2.tgz","fileCount":21,"integrity":"sha512-Xz61XnwlG8MCzE3/W/O+gU2rnJAPGA0gi0g/R4weiQSdUxHMXE3kHJjxbk7pqYVvlktoZ4iJbds5TU+v0eVqAg==","signatures":[{"sig":"MEQCIAfFh/NakYL04O5GOzZVdJ7InKWse1+nJLbvQBW0QbsPAiBz6M+FFgayuWZnbcM+q4I63guuZ00+LNd/ZlNsbTjrDQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":175138},"gitHead":"24eea6848b55b7e4095b42fc1de8a7e02b72762a","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.6.2","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.1.2_1772226486271_0.3512862562823913","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"rlm-navigator","version":"1.1.3","_id":"rlm-navigator@1.1.3","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"eaceef80321bdc9f6d0c203c13b39b5c6a81f05c","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.1.3.tgz","fileCount":21,"integrity":"sha512-QfmgCb8vg9BrLP2/sVysdoduGJaaNppnFrlCLGGh3bOF2Rv952lTrOnjK8HH3GToVdGfgCYLvQRcHF8WWAAn6g==","signatures":[{"sig":"MEUCIQDv5aSgzEq5+OhEdFa9Ou6cwnW45MHlax2B6KKtuq5ZjQIgZ2k9f5xOFLdAgqLMIhyh7zr5Lncw6iBW4KLDrcUEWqc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":214891},"gitHead":"820912ab3526fbd262447d0fcb1a12f183362f8a","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.1.3_1772276710810_0.3258202722162977","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"rlm-navigator","version":"1.1.4","_id":"rlm-navigator@1.1.4","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"34d60c60e4f1b1f49c1d5e9edbf0a42163807d3b","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.1.4.tgz","fileCount":22,"integrity":"sha512-osqM15Hk+mwZ+Dop+UHMyq3gRfJSrqBL/ahOWl5kDs8O6Rr9+oyhiUDf+ZfUSRRiZ7l13p1m8WNzTHLf9ZJZwA==","signatures":[{"sig":"MEYCIQDUk8TRjVrdfJxQcu0DUvY/AXvtdvZ7eX+CumnfHAWAWgIhANOXiA5CVo4wSTBVUS85Kx3jsxCGEhCrpIiKhvjEsbrD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215542},"gitHead":"e0a345bd70da6cf071a29404ef3b7d7bb2586d20","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.1.4_1772308444449_0.13364609133400207","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"rlm-navigator","version":"1.1.6","_id":"rlm-navigator@1.1.6","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"d7e3cf13e69d97a097a750df1e42001bee41afb7","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.1.6.tgz","fileCount":22,"integrity":"sha512-EqUy0nAsVT0BrJsU0XN64/3x4QBijpdea8bgW6LGmfCx9fiFR00NNCmyjY90V699cGPzdkYiGYXnCXOuzM9O6g==","signatures":[{"sig":"MEQCIFj2ZSsNzZ4Om1nVHiXBuOAu/QR3ZohCu/6Ucr46zIggAiA6eBvo0OInJCJ5GsJ1VpYq401wKVe4RC7rPjQR+Pt4cw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":219036},"gitHead":"9d06ebcec14e3433f5774e49af25c88e3eb24c57","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.1.6_1772315436790_0.2195642338907715","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"rlm-navigator","version":"1.2.0","_id":"rlm-navigator@1.2.0","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"363962e8e896f839907c3dc84b103ac49d666fa1","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.2.0.tgz","fileCount":22,"integrity":"sha512-Ip2zYEgUvjf9SEJF5PCxQARrN6oH4gUZ+8Thom7AxvA1Z8tdukjiNK3E2wFztEelV5ZYX9LeThhRl2q2ebLkoA==","signatures":[{"sig":"MEQCIBShHiDMrOQgfDaf+OtAsR5Qx/Ow/oEHV/JpK0gzl9wvAiAt3P0SKy24bGKWhKNOhtJejatns+8oQHimujHYrSo/Rg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":227703},"gitHead":"ac3a3313ffcbf70b6864c39a6d9843541a4a0a9c","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.2.0_1772325306553_0.04626525901324974","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"rlm-navigator","version":"1.3.0","_id":"rlm-navigator@1.3.0","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"2286951c813fa25ab4e33399c100a2553238c54d","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.3.0.tgz","fileCount":22,"integrity":"sha512-wU52zN3Qc6fyO+ENBMatPrH0a3JMe5AyvuPrs2gOHWbVryBeFfPXC6EZLaghtwS4v8QuBn4KjPzH1KQ5HhRmYg==","signatures":[{"sig":"MEUCIQDLpYn3PLHalEqwgnIOsF9hVFa8/j3ORC1wFhHOuLkkZgIgHTVHU35CjPwufVOqrjzOu+UG19D5XIepcac4Z9fFNn8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":230763},"gitHead":"97ca30bf02fa8b13776557e57df4180abdc3337c","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.3.0_1772329671162_0.8424171150828008","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"rlm-navigator","version":"1.3.1","_id":"rlm-navigator@1.3.1","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"4f5a5cc2eb6ecd8e8ee4fb7b621d2f9ee8f83f6e","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.3.1.tgz","fileCount":22,"integrity":"sha512-WZUzXjBXQ2unpW6iJx4GEPYZASucKPb2xmGJQdSxiy5nREZjm9g7KY4dS5XbRzl2ZYkObZD1vVvpSJXSR8IF/g==","signatures":[{"sig":"MEUCIC+God1WH6UCuhc9dq1rKK+LULoUDl5xtdPbHexgO6DlAiEAoqX3QAiybS0k+o+1D+Axk+siQH4cohRJJkK7c7s2op4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":230763},"gitHead":"f76cb21a53775d5d22ed9cdd27f691d215b426ca","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.3.1_1772396957588_0.5771230402922913","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"rlm-navigator","version":"1.3.3","_id":"rlm-navigator@1.3.3","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"ee00243a636cf253a379bb8739b8fb90efb46d8c","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.3.3.tgz","fileCount":22,"integrity":"sha512-j+m25hxpnPEI3naWb3Dey126hyj020vqNqBzaPVJYyj+reRWtnpS2oRBWOOBpoCdruiKwBxDnxnQUxwFjyYWqw==","signatures":[{"sig":"MEUCIQDotgkfbYNodJ/9IX+FIqHdc5t12FYsuPZiB69bslXXdgIgE/xNDGh4qItUsSDDWKhi3JqnoI0Ld5YPz7f+uY91fns=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231114},"gitHead":"9e6f3c6a8a14c0230dfba06a1fbdd62890bf200a","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.3.3_1772451070518_0.2017342458822471","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"rlm-navigator","version":"1.3.4","_id":"rlm-navigator@1.3.4","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"b0e3a4ae43b9917c53dfcbe7715a2003aae4d84f","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.3.4.tgz","fileCount":22,"integrity":"sha512-SlOw5rzVf0I9VRY7VTRrWQesyH9L+dX4zdpc28bZithc2IbalozSAQyjd73eHxzaywPbplsQYRxQOusNFlt13w==","signatures":[{"sig":"MEQCIH6yHPugZeE1tqbe5ztBhIQuzHCUEzUYDV/SCb6UQJqyAiBLygoTw7EHdoGh6k2KvfyN/aHeDBSlEvgMU+TmHqcYAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":231114},"gitHead":"b417c38bedb4e2fa7a133d2ca4702c0e68d07cac","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.10.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.3.4_1772502597136_0.9599395968357696","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"rlm-navigator","version":"1.3.5","_id":"rlm-navigator@1.3.5","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"23659623f1bb1620af30294b0676dc9c774e129e","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-1.3.5.tgz","fileCount":22,"integrity":"sha512-HE1OUYYUeMgfMqbXIwcIq+0a/7NV22+Wi2rlQ5jJndCU6RgdWRoxIumfv2np9Y4FAk4VE69aNcmCPME0wRA8Bw==","signatures":[{"sig":"MEUCIG2ds2O1Q74UTnlTrA4Fgook6n9qL6+8yFGdw42beR7NAiEAkkhWHPwA0lylriU2S2XTSzXVYQBMFJIsGCsNs8Y9HE0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":233977},"gitHead":"ff153e36e5d0d2983186c007a625bc172da6a278","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.11.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.11.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_1.3.5_1772845388241_0.6223054805478798","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"rlm-navigator","version":"2.0.0","_id":"rlm-navigator@2.0.0","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"e1174a5d067e3b76654e1d5cf853173cf62c546d","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-2.0.0.tgz","fileCount":22,"integrity":"sha512-Xo9WJaFhnGLUM7538I4ykLvQRW4cG8Uro/V0vGg1Olun0zE+4Ay2fdB6HFvDoFS0bJ01CQVBxl1CmCtMekW/OQ==","signatures":[{"sig":"MEUCIDI0vhdGOt0nznXYODg3RJjoXx927K+bKeE/O7MXsWgZAiEA66DyIkuE52Y+8x8AyetKYEREv0Ry3bvJs3l98N8Ekbg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":236023},"gitHead":"2db13a251201d66c0e25854098e5541adcb51b9d","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.9.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.14.0","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_2.0.0_1773605745460_0.30793744969834314","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"rlm-navigator","version":"2.2.0","_id":"rlm-navigator@2.2.0","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"bin":{"rlm-navigator":"bin/cli.js"},"dist":{"shasum":"2f0c4124a4e21f23869b7c3d26501a9a433a7cae","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-2.2.0.tgz","fileCount":23,"integrity":"sha512-+smr8iIadWe04oAh7cxcYBG8T4SXSOXF9rnAcMfoE7FoMTRLYis+ZNYq9tgynlmxC5iaeJfLc7qb38YSMBQRPA==","signatures":[{"sig":"MEUCIQDeBdGXwdPHS/k8VkKw+Xf52YKvLgq5hsUsY7ako9HlrAIgW4/uhiujRxVlM46MChvx6X6L+ENe4yThvkDNtSRlmUU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":245648},"gitHead":"a978f9a78a5ecaa2da29b2271fbd4dd5b145b147","_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"_npmVersion":"11.11.0","description":"Token-efficient codebase navigation for AI-assisted coding","directories":{},"_nodeVersion":"24.14.1","dependencies":{"ora":"^5.4.1","chalk":"^4.1.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/rlm-navigator_2.2.0_1774995908533_0.8936107014978834","host":"s3://npm-registry-packages-npm-production"}},"2.3.0":{"name":"rlm-navigator","version":"2.3.0","description":"Token-efficient codebase navigation for AI-assisted coding","bin":{"rlm-navigator":"bin/cli.js"},"dependencies":{"chalk":"^4.1.2","ora":"^5.4.1"},"gitHead":"d1ab024735018fcdda3956fc6b38c65dacffe38e","_id":"rlm-navigator@2.3.0","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-6/hHxKf2VFxmAiPRZu6ENBaaHRcDTXYiUrahGMxSCD0HTL4yhXPJruoXaFZkhkNfxGQfDir8/d66EqqvTohk1Q==","shasum":"b4348177c7a13a4b87355f2e2c84ce85e0c77fbb","tarball":"https://registry.npmjs.org/rlm-navigator/-/rlm-navigator-2.3.0.tgz","fileCount":26,"unpackedSize":315818,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC6zr0/7KVv/kqCH/Efy3ZZ/5O5HWAdPDoP/TzhjkDZEQIhAO3kUkGFDxAe7IquKxLK79ig8oq3TOIyZFNXeG4XGRNW"}]},"_npmUser":{"name":"lrilai","email":"lrilct2025@gmail.com"},"directories":{},"maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rlm-navigator_2.3.0_1775003297650_0.6629903447757579"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-20T23:20:53.337Z","modified":"2026-04-01T00:28:17.937Z","0.1.0":"2026-02-20T23:20:53.480Z","0.1.1":"2026-02-20T23:29:53.427Z","0.1.2":"2026-02-20T23:48:44.810Z","0.1.3":"2026-02-21T00:47:59.356Z","0.1.4":"2026-02-21T00:53:01.378Z","0.1.5":"2026-02-21T01:22:58.416Z","0.1.7":"2026-02-21T01:30:02.999Z","0.1.8":"2026-02-21T10:24:03.018Z","0.1.9":"2026-02-21T11:30:11.250Z","0.1.10":"2026-02-21T11:44:19.556Z","0.1.11":"2026-02-21T13:04:08.934Z","1.0.0":"2026-02-21T16:40:12.788Z","1.0.1":"2026-02-21T17:19:38.074Z","1.0.2":"2026-02-21T20:50:48.670Z","1.0.5":"2026-02-22T00:59:23.594Z","1.1.1":"2026-02-25T10:25:31.682Z","1.1.2":"2026-02-27T21:08:06.431Z","1.1.3":"2026-02-28T11:05:10.972Z","1.1.4":"2026-02-28T19:54:04.659Z","1.1.6":"2026-02-28T21:50:36.947Z","1.2.0":"2026-03-01T00:35:06.705Z","1.3.0":"2026-03-01T01:47:51.318Z","1.3.1":"2026-03-01T20:29:17.750Z","1.3.3":"2026-03-02T11:31:10.662Z","1.3.4":"2026-03-03T01:49:57.299Z","1.3.5":"2026-03-07T01:03:08.390Z","2.0.0":"2026-03-15T20:15:45.627Z","2.2.0":"2026-03-31T22:25:08.708Z","2.3.0":"2026-04-01T00:28:17.824Z"},"description":"Token-efficient codebase navigation for AI-assisted coding","maintainers":[{"name":"lrilai","email":"lrilct2025@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"logo.jpg\" alt=\"RLM Navigator\" width=\"300\">\n</p>\n\n# RLM Navigator\n\nToken-efficient codebase navigation for AI-assisted coding. Treats codebases as navigable hierarchical trees of AST skeletons — the AI sees structure first, drills into implementations only when needed. A file-watching daemon caches AST structures, a stateful REPL with dependency-aware staleness tracking provides targeted analysis, and automatic output truncation keeps every tool response within budget.\n\n## Problem\n\nAI coding assistants treat source files as opaque text blobs. Every interaction starts the same way: read the whole file, scan for the relevant section, discard the rest. This is fundamentally wasteful because source code is *structured* — it has a hierarchy (modules → classes → methods → statements) that can be navigated without reading implementations.\n\nThe cost compounds quickly:\n\n- **Context Bloat**: A 500-line file consumes ~2,000 tokens even when you only need one function. Across a multi-file task, the window fills with irrelevant code that the model must attend to on every generation step.\n- **Context Rot**: LLM attention degrades over long contexts. Important instructions and earlier findings get diluted as the window fills with raw source. The model \"forgets\" what it already learned — not because the tokens are gone, but because attention is spread too thin.\n- **Exploration Loops**: Without structural summaries, the AI has no compact representation of what a file contains. It re-reads files it already saw, or reads adjacent files speculatively, burning tokens on redundant I/O.\n- **Stale Data**: Results stored in variables go stale when underlying files change. Without tracking, the AI operates on outdated information — a silent correctness problem that's worse than wasted tokens.\n\nThe root cause is a mismatch between how code is organized (hierarchical, structured) and how AI tools access it (flat, full-text). RLM Navigator closes this gap by exposing code structure as a first-class navigation primitive.\n\n## Solution\n\nRLM Navigator provides 10 MCP tools that enforce a surgical navigation workflow:\n\n**Navigation tools:**\n\n| Tool | Purpose |\n|------|---------|\n| `get_status` | Check daemon health |\n| `rlm_tree` | See directory structure (replaces ls/find) |\n| `rlm_map` | See file signatures only (replaces cat/read) |\n| `rlm_drill` | Read specific symbol implementation |\n| `rlm_search` | Find symbols across files |\n\n**REPL tools** (stateful Python environment with pickle persistence):\n\n| Tool | Purpose |\n|------|---------|\n| `rlm_repl_init` | Initialize the stateful REPL |\n| `rlm_repl_exec` | Execute Python code (variables persist across calls) |\n| `rlm_repl_status` | Check variables, buffers, execution count + staleness warnings |\n| `rlm_repl_reset` | Clear all REPL state |\n| `rlm_repl_export` | Export accumulated buffers |\n\nBuilt-in REPL helpers: `peek()` (read lines), `grep()` (regex search), `chunk_indices()` / `write_chunks()` (file chunking), `add_buffer()` (accumulate findings). All helpers automatically track file dependencies — when source files change, stale variables and buffers are flagged in `repl_status` and `repl_exec` output.\n\nThe workflow: **tree → map → drill → edit**. For complex analysis: **init → exec with helpers → export buffers**. Each step loads only what's needed.\n\n## Architecture\n\n```mermaid\ngraph TB\n    MCP[\"MCP Server<br/>(TypeScript)\"]\n    Client[\"Claude Code<br/>(AI Client)\"]\n    Daemon[\"Python Daemon\"]\n    FS[\"File System<br/>+ AST Cache\"]\n\n    MCP -->|stdio| Client\n    MCP -->|TCP/JSON| Daemon\n    Daemon -->|watchdog| FS\n    Daemon -->|tree-sitter| FS\n    Daemon -->|cache| FS\n```\n\n## Quick Start\n\n```bash\nnpx rlm-navigator@latest install\n```\n\nThis copies the daemon and server into a local `.rlm/` directory, installs dependencies, builds the MCP server, and registers with Claude Code. The daemon **auto-starts** when Claude Code connects — no separate terminal needed.\n\n### Other Commands\n\n```bash\nnpx rlm-navigator@latest update    # Update to latest version\nnpx rlm-navigator status            # Check daemon health\nnpx rlm-navigator uninstall         # Remove from project\n```\n\n### Manual / Development Setup\n\n```bash\n# 1. Install Python deps\npip install -r daemon/requirements.txt\n\n# 2. Build MCP server\ncd server && npm install && npm run build\n\n# 3. Register with Claude Code\nclaude mcp add rlm-navigator -- node /path/to/server/build/index.js\n\n# 4. Start the daemon (in a separate terminal)\npython daemon/rlm_daemon.py --root /path/to/your/project\n```\n\nLegacy install scripts (`install.sh`, `install.ps1`) are still available for development.\n\n## Supported Languages\n\nTree-sitter powered parsing for: **Python, JavaScript, TypeScript, Go, Rust, Java, C, C++**\n\nUnsupported file types get a graceful fallback (first 20 lines + line count).\n\n## Benchmarks\n\n`benchmark.py` supports four modes that measure different aspects of token efficiency.\n\n### Workflow: Navigation Overhead\n\nCompares \"grep + full file reads\" vs \"tree → search → map → drill\". Benchmarked against [tiangolo/fastapi](https://github.com/tiangolo/fastapi):\n\n| Query | Approach | Files | Tokens | Reduction | Efficiency |\n|---|---|---|---|---|---|\n| `authenticate` | Traditional | 42 full reads | 47,131 | — | — |\n| `authenticate` | RLM (full repo tree) | 9 maps | 19,109 | 59% | 2.5x |\n| `authenticate` | RLM (targeted tree) | 9 maps | **8,364** | **82%** | **5.6x** |\n| `OAuth2PasswordBearer` | Traditional | 20 full reads | 25,725 | — | — |\n| `OAuth2PasswordBearer` | RLM (targeted tree) | 1 map | **3,267** | **87%** | **7.9x** |\n\nSelf-benchmark (this repo, query `squeeze`):\n\n| Approach | Files | Tokens | Reduction |\n|---|---|---|---|\n| Traditional | 6 full reads | 22,139 | — |\n| RLM | 5 maps + 5 drills | **3,358** | **85% (6.6x)** |\n\nScoping `rlm_tree` to the relevant subdirectory (`--tree-path fastapi/security`) is critical for large repos — it reduces tree overhead from ~11K tokens to 205, making the difference between 2-3x and **6-8x** savings.\n\n### REPL: Targeted Analysis\n\nCompares full file reads vs REPL-assisted grep + peek windows. Self-benchmark (query `handle_request`):\n\n| Approach | Tokens | Reduction |\n|---|---|---|\n| Traditional (4 full reads) | 15,594 | — |\n| REPL (grep + peek) | **16** | **~100% (974x)** |\n\nThe REPL's `grep()` returns only matching lines with file/line references — no need to read surrounding context unless you choose to `peek()` a specific range.\n\n### Truncation: Response Capping\n\nMeasures how much the 8,000-char truncation cap saves across all tool responses. For well-structured codebases where skeletons are concise, truncation rarely activates — but for large files or verbose tree outputs it prevents runaway token consumption.\n\n### Chunks: Skeleton vs Full-File vs Per-Chunk\n\nCompares the cost of reading a file three ways: full text, skeleton only, and chunked windows. Self-benchmark (`daemon/rlm_daemon.py`, 397 lines):\n\n| Approach | Tokens | Savings vs Full |\n|---|---|---|\n| Full file read | 3,332 | — |\n| Skeleton (`rlm_map`) | 492 | **85%** |\n\n```bash\n# Run benchmarks yourself\npython benchmark.py --root /path/to/project --query \"symbol\"                     # workflow\npython benchmark.py --root /path/to/project --query \"symbol\" --mode truncation   # truncation\npython benchmark.py --root /path/to/project --query \"symbol\" --mode repl         # repl\npython benchmark.py --root /path/to/project --file \"src/file.py\" --mode chunks   # chunks\n```\n\n## Configuration\n\n| Environment Variable | Default | Description |\n|---------------------|---------|-------------|\n| `RLM_DAEMON_PORT` | `9177` | TCP port for daemon communication |\n| `RLM_MAX_RESPONSE` | `8000` | Max chars before output truncation |\n\n## Development\n\n```bash\n# Run tests\ncd daemon && python -m pytest tests/ -v\n\n# Start daemon in dev mode\npython daemon/rlm_daemon.py --root .\n```\n\n## How It Works\n\n1. **Daemon** watches your project with `watchdog`, parses files with `tree-sitter`, caches AST skeletons. File change events propagate to both the skeleton cache and the REPL's dependency tracker.\n2. **REPL** provides a pickle-persisted Python environment with codebase helpers (peek, grep, chunking, buffers). Tracks file dependencies per variable/buffer via mtime snapshots — when files change, staleness warnings surface automatically.\n3. **MCP Server** bridges Claude Code to the daemon via TCP JSON protocol, with automatic output truncation and staleness warning formatting.\n4. **Skill** enforces the navigation workflow (tree → map → drill → edit) and the chunk-delegate-synthesize workflow for large analyses.\n5. **Sub-agent** (Haiku) analyzes file chunks with structured output — relevance rankings, missing items, and suggested next queries.\n\n## PageIndex Integration\n\nRLM Navigator integrates [PageIndex](https://github.com/pAges-index/pageindex) — an LLM-powered document indexing library — to bring the same \"map before drill\" navigation paradigm to documentation files (`.md`, `.pdf`, `.txt`, `.rst`). Where tree-sitter parses code into AST skeletons, PageIndex parses documents into hierarchical section trees with semantic summaries.\n\n### Architecture Overview\n\n```\n┌──────────────────────────────────────────────────────────┐\n│                  Document Navigation                      │\n│                                                          │\n│  rlm_doc_map ──┐    rlm_doc_drill ──┐    rlm_assess     │\n│                │                     │         │         │\n│         ┌──────▼─────────────────────▼─────────▼──────┐  │\n│         │           Python Daemon                      │  │\n│         │                                              │  │\n│         │  ┌───────────────────────────────────────┐   │  │\n│         │  │         doc_indexer.py                 │   │  │\n│         │  │                                       │   │  │\n│         │  │   PageIndex available?                 │   │  │\n│         │  │    ├─ YES → md_to_tree() / page_index()│  │  │\n│         │  │    │         (GPT-4o via OpenAI API)   │   │  │\n│         │  │    └─ NO  → index_markdown_local()     │   │  │\n│         │  │              (regex header parsing)     │   │  │\n│         │  └───────────────────────────────────────┘   │  │\n│         │                    │                          │  │\n│         │            Unified Node Tree                  │  │\n│         └──────────────────────────────────────────────┘  │\n└──────────────────────────────────────────────────────────┘\n```\n\n### Dual-Provider Configuration\n\nThe configuration layer (`daemon/config.py`) manages two independent API providers. Both are optional — core navigation works entirely offline.\n\n| Provider | Purpose | API Key Env Var | SDK | Default Model |\n|----------|---------|----------------|-----|---------------|\n| OpenAI | Document indexing via PageIndex | `CHATGPT_API_KEY` | `pageindex` | `gpt-4o-2024-11-20` |\n| Anthropic | Code enrichment via Haiku | `ANTHROPIC_API_KEY` | `anthropic` | `claude-haiku-4-5-20251001` |\n\nFeature flags are computed properties that require both the API key AND the SDK to be installed:\n\n```python\nclass RLMConfig:\n    @property\n    def doc_indexing_enabled(self) -> bool:\n        return self.openai_api_key is not None and self.pageindex_available\n\n    @property\n    def enrichment_enabled(self) -> bool:\n        return self.anthropic_api_key is not None and self.anthropic_available\n```\n\nThe model can be overridden via `PAGEINDEX_MODEL` environment variable. Both providers support `.env` files via `python-dotenv`.\n\n### Document Indexing Pipeline\n\nWhen `rlm_doc_map` is called on a document file, the daemon routes through a fallback chain in `doc_indexer.py`:\n\n**1. PageIndex path** (when `CHATGPT_API_KEY` is set and `pageindex` is installed):\n\nFor markdown files, calls `pageindex.page_index_md.md_to_tree()` with:\n- `md_path`: file path\n- `model`: configurable (default `gpt-4o-2024-11-20`)\n- `if_add_node_summary`: `\"yes\"` — generates 1-line semantic summaries per section\n- `if_add_node_id`: `\"yes\"` — assigns unique node identifiers\n\nFor PDF files, calls `pageindex.page_index.page_index()` with the same parameters.\n\nBoth are async functions wrapped with a manual event loop since the daemon is synchronous:\n\n```python\nloop = asyncio.new_event_loop()\ntry:\n    result = loop.run_until_complete(md_to_tree(\n        md_path=file_path,\n        model=config.pageindex_model,\n        if_add_node_summary=\"yes\",\n        if_add_node_id=\"yes\",\n    ))\nfinally:\n    loop.close()\n```\n\n**2. Local fallback** (when PageIndex is unavailable or fails):\n\nFor markdown, a regex-based parser extracts headings (`^#{1,6}\\s+`) while skipping headings inside code blocks. A stack algorithm builds the hierarchy:\n\n- Tracks heading levels to nest children under parents\n- Assigns line ranges (each section spans from its heading to the next heading)\n- No API calls — works entirely offline\n\nFor plain text and RST files, a minimal indexer returns line count and a preview of the first 10 lines.\n\n**3. Error handling**: If PageIndex raises any exception (network error, rate limit, invalid response), the indexer silently falls through to the local path. The user always gets a result.\n\n### Unified Node Tree Format\n\nBoth PageIndex and local indexing produce the same unified node schema, making downstream tools (MCP server, skill workflow) provider-agnostic:\n\n```json\n{\n  \"name\": \"Installation\",\n  \"type\": \"section\",\n  \"source\": \"pageindex_md\",\n  \"summary\": \"Steps to install the project using pip and npm.\",\n  \"metadata\": {\n    \"node_id\": \"pi-abc-123\",\n    \"text_preview\": \"Run pip install -r requirements.txt...\"\n  },\n  \"range\": { \"start\": 15, \"end\": 28 },\n  \"children\": [\n    {\n      \"name\": \"Prerequisites\",\n      \"type\": \"section\",\n      \"source\": \"pageindex_md\",\n      \"summary\": \"Required Python and Node.js versions.\",\n      \"range\": { \"start\": 20, \"end\": 25 },\n      \"children\": []\n    }\n  ]\n}\n```\n\n| Field | Description |\n|-------|-------------|\n| `name` | Section title (from heading or PageIndex) |\n| `type` | `\"document\"` (root) or `\"section\"` (child) |\n| `source` | `\"pageindex_md\"`, `\"pageindex_pdf\"`, `\"local_md\"`, or `\"local_txt\"` |\n| `summary` | LLM-generated 1-line summary (PageIndex only, `null` for local) |\n| `range` | 1-indexed line range `{start, end}` for surgical extraction |\n| `metadata` | PageIndex node IDs, text previews |\n| `children` | Recursive array of child sections |\n\nThe `source` field lets consumers distinguish how the tree was built. When PageIndex is available, summaries provide semantic context that local parsing cannot — enabling richer navigation decisions.\n\n### Document Navigation Workflow\n\nThe MCP tools mirror the code navigation workflow:\n\n```\nrlm_doc_map    →  See section hierarchy (like rlm_map for code)\nrlm_doc_drill  →  Read specific section (like rlm_drill for code)\nrlm_assess     →  Check if gathered context answers the query\n```\n\n`rlm_doc_drill` uses the line ranges from the unified tree to extract only the requested section's content — the same surgical read pattern used for code symbols. A recursive `_find_section()` helper does case-insensitive title matching through the tree.\n\n---\n\n## DSPy-Inspired Multi-Agent Navigation\n\nRLM Navigator's multi-agent system draws directly from [DSPy](https://github.com/stanfordnlp/dspy) (Stanford NLP) — a framework for compiling declarative language model calls into self-improving pipelines. While the production implementation uses raw prompt templates rather than the DSPy library itself, the architecture faithfully follows DSPy's Signature/Module design patterns.\n\n### From DSPy Research to Production\n\nThe project's `research/` directory contains the original DSPy prototypes — three `dspy.Signature` classes and a `dspy.Module` that used `dspy.ChainOfThought()` for each agent:\n\n```python\n# Original DSPy prototype (research/Navigator Prompts.py)\nclass ExplorerSignature(dspy.Signature):\n    \"\"\"Policy network — proposes which code symbols to investigate.\"\"\"\n    tree_skeleton = dspy.InputField(desc=\"AST skeleton of the codebase\")\n    session_state = dspy.InputField(desc=\"Current MCTS session state\")\n    selected_nodes = dspy.OutputField(desc=\"Ranked list of symbols to explore\")\n\nclass MultiAgentNavigator(dspy.Module):\n    def __init__(self):\n        self.explorer = dspy.ChainOfThought(ExplorerSignature)\n        self.validator = dspy.ChainOfThought(ValidatorSignature)\n        self.orchestrator = dspy.ChainOfThought(OrchestratorSignature)\n```\n\nThe production implementation replaces `dspy.Signature` with prompt templates and `dspy.ChainOfThought` with structured JSON output parsing, but preserves the same three-agent architecture and input/output contracts.\n\n### The Triad Architecture\n\nThe system uses an AlphaGo-inspired pattern: **Policy Network** (Explorer) + **Value Network** (Validator) + **Search Control** (Orchestrator), coordinated by MCTS session state.\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│                   MCTS Navigation Loop                          │\n│                                                                 │\n│  1. EXPLORE        2. INVESTIGATE      3. VALIDATE              │\n│  ┌──────────┐      ┌──────────┐        ┌──────────┐            │\n│  │ Explorer │─────>│ Squeezer │───────>│ Validator│            │\n│  │ (Policy) │      │ (Drill)  │        │ (Value)  │            │\n│  └────┬─────┘      └──────────┘        └────┬─────┘            │\n│       │ proposes                             │ critiques        │\n│       │ nodes                                │ relevance        │\n│       │                                      │                  │\n│  ┌────▼──────────────────────────────────────▼─────┐           │\n│  │              Orchestrator (Control)              │           │\n│  │  • Reads session state (visited, blacklist)      │           │\n│  │  • Decides: drill / answer / backtrack           │           │\n│  │  • Updates blacklist on irrelevant branches      │           │\n│  │  • Forces answer at max depth                    │           │\n│  └────┬────────────────────────────────────────────┘           │\n│       │                                                         │\n│  ┌────▼────────────────────┐                                   │\n│  │   MCTSSession State     │                                   │\n│  │  • visited: [nodes...]  │                                   │\n│  │  • blacklist: {nodes}   │                                   │\n│  │  • scores: {node: 0.9}  │                                   │\n│  │  • context_accumulated  │                                   │\n│  │  • depth / max_depth    │                                   │\n│  └─────────────────────────┘                                   │\n└─────────────────────────────────────────────────────────────────┘\n```\n\n### Agent Details\n\n**Explorer** (`daemon/agents/explorer.py`) — the Policy Network:\n- Receives: AST skeleton + session state (visited nodes, blacklist, current depth)\n- Produces: 1-3 ranked node proposals with relevance scores (0.0-1.0) and reasons\n- Filters: never proposes blacklisted or already-visited nodes\n- Actions: `drill` (investigate symbol), `map` (get skeleton), `answer` (sufficient context), `pivot` (change strategy)\n\n```json\n{\n  \"selected_nodes\": [\n    {\"path\": \"auth.py\", \"symbol\": \"AuthManager\", \"score\": 0.95, \"reason\": \"Handles authentication\"}\n  ],\n  \"action\": \"drill\"\n}\n```\n\n**Validator** (`daemon/agents/validator.py`) — the Value Network:\n- Receives: user query + symbol path + drilled code snippet\n- Produces: relevance verdict (`is_valid`), confidence score, critique, and dependency list\n- The `dependencies` field enables cascading exploration — if validating `AuthManager` reveals it depends on `TokenStore`, the Orchestrator can queue that for investigation\n\n```json\n{\n  \"is_valid\": true,\n  \"confidence\": 0.9,\n  \"critique\": \"Directly implements the authentication flow.\",\n  \"dependencies\": [\"token.py::TokenStore\"]\n}\n```\n\n**Orchestrator** (`daemon/agents/orchestrator.py`) — the Search Controller:\n- Receives: user query + full session state + last validation result\n- Decision logic:\n  - `is_valid=true` → accumulate context, check if sufficient to answer\n  - `is_valid=false` → blacklist the branch, propose alternative via Explorer\n  - `depth >= max_depth` → force answer with accumulated context\n  - All branches exhausted → answer with best available context\n- Produces: next action, target node, reasoning, and optional blacklist entry\n\n```json\n{\n  \"next_action\": \"drill\",\n  \"target_node\": \"token.py::TokenStore\",\n  \"reasoning\": \"Need to understand token storage to complete auth picture.\",\n  \"should_blacklist\": null\n}\n```\n\n### MCTS Session State\n\n`daemon/mcts.py` manages navigation sessions with thread-safe state:\n\n- **`MCTSSession`**: Per-query state container with UUID. Tracks `visited` (ordered exploration history), `blacklist` (rejected branches), `scores` (relevance per node), and `context_accumulated` (gathered code snippets). The `at_max_depth` property triggers forced answer generation.\n\n- **`MCTSSessionManager`**: Thread-safe registry of concurrent sessions. Creates, retrieves, and cleans up sessions with a `threading.Lock()` for safe concurrent access.\n\nThe session state is serialized to JSON and injected into every agent prompt, giving each agent full visibility into the search history. This prevents circular exploration — the Explorer won't propose nodes that are already visited or blacklisted.\n\n### Node Enrichment (Haiku API)\n\n`daemon/node_enricher.py` adds semantic annotations to AST skeletons, improving Explorer's proposal quality:\n\n1. **`parse_skeleton_symbols()`** extracts symbol definitions from skeleton text via regex\n2. **`build_enrichment_prompt()`** batches symbols and asks Haiku for 1-line summaries\n3. **`EnrichmentCache`** stores results keyed by `(file_path, mtime)` — invalidates when files change\n4. **`merge_enrichments()`** annotates skeleton lines with summaries:\n   ```\n   def validate_token(self, token: str) -> bool:  # L25-30  # Checks if token starts with 'sk-' prefix.\n   ```\n5. **`EnrichmentWorker`** processes the queue in a background daemon thread, enriching files asynchronously without blocking navigation\n\nThe enrichment pipeline is entirely optional (requires `ANTHROPIC_API_KEY`). When available, it transforms raw signatures into semantically meaningful descriptions that help the Explorer make better-informed navigation proposals.\n\n### Why Not DSPy Directly?\n\nThe research phase prototyped with DSPy's `dspy.ChainOfThought()` modules. The production implementation moved to raw prompt templates for three reasons:\n\n1. **Dependency minimization**: DSPy pulls in a significant dependency tree. The prompt-based approach requires only the `anthropic` SDK (already needed for enrichment).\n2. **Transparency**: Raw prompts make the agent behavior fully inspectable and debuggable. Each agent's exact prompt template lives in a single file.\n3. **Architecture preservation**: The core insight from DSPy — structured Signatures with typed input/output fields coordinated by a Module — translates directly to prompt templates with JSON schemas. The Triad architecture, session state management, and backtracking logic are all preserved.\n\nAll three agents use identical JSON parsing with graceful fallback:\n\n```python\ndef parse_output(raw: str) -> Optional[dict]:\n    text = raw.strip()\n    if text.startswith(\"```\"):\n        text = text.split(\"\\n\", 1)[1].rsplit(\"```\", 1)[0]\n    return json.loads(text)\n```\n\nThis handles both raw JSON and markdown-wrapped responses, with `None` return on parse failure rather than exceptions.\n\n---\n\n## Manual Testing & Demonstration Guide\n\nThis section provides a comprehensive walkthrough for manually verifying RLM Navigator's functionality and demonstrating its token-saving capabilities. Each test builds on the previous one, following the core navigation workflow.\n\n### Prerequisites\n\n1. Install RLM Navigator in a target project:\n   ```bash\n   cd /path/to/your/project\n   npx rlm-navigator@latest install\n   ```\n2. Open the project in Claude Code. The daemon auto-starts when Claude connects.\n3. Verify the setup by asking Claude: *\"Check if the RLM daemon is running.\"*\n\n**Expected**: Claude calls `get_status` and reports the daemon is ALIVE with the correct project root, cached file count, and supported languages.\n\n> **Tip**: For the most compelling demo, use a medium-to-large codebase (100+ files) where token savings are dramatic. The [FastAPI repo](https://github.com/tiangolo/fastapi) is a good benchmark target.\n\n---\n\n### Test 1: Directory Exploration (`rlm_tree`)\n\n**Purpose**: Verify Claude uses `rlm_tree` instead of `ls`/`find`/`Glob` for directory exploration.\n\n**Prompt**: *\"Show me the project structure.\"*\n\n**What to verify**:\n- Claude calls `rlm_tree` (not `ls`, `find`, or `Glob`)\n- Output shows directories with item counts, files with sizes and detected languages\n- Hidden directories (`.git`, `node_modules`, `__pycache__`) are excluded\n- Response stays within the truncation budget\n\n**Follow-up**: *\"What's inside the `src/` directory?\"*\n\n**What to verify**:\n- Claude scopes the tree to a subdirectory (`rlm_tree path=\"src/\"`) rather than re-fetching the entire project\n- Deeper nesting is visible within the focused subtree\n\n---\n\n### Test 2: File Signatures (`rlm_map`)\n\n**Purpose**: Verify Claude reads structural skeletons instead of full files.\n\n**Prompt**: *\"What functions and classes are in `<pick a Python/JS/TS file>`?\"*\n\n**What to verify**:\n- Claude calls `rlm_map` (not `cat`, `Read`, or `head`)\n- Output shows class/function/method signatures with line ranges\n- Docstrings are preserved, but implementation bodies show `...` (elided)\n- No raw source code appears — only the structural skeleton\n\n**Key observation**: Compare the skeleton length to the actual file size shown in `rlm_tree`. A 500-line file might produce a 30-line skeleton — that's the token saving in action.\n\n---\n\n### Test 3: Surgical Drill (`rlm_drill`)\n\n**Purpose**: Verify Claude can retrieve a single symbol's implementation without reading the entire file.\n\n**Prompt**: *\"Show me the implementation of `<function_name>` in `<file>`.\"*\n\n**What to verify**:\n- Claude calls `rlm_map` first (to confirm the symbol exists and get its location)\n- Then calls `rlm_drill` with the exact symbol name\n- Output shows only the targeted function/method with line numbers (e.g., `L45-82`)\n- No surrounding functions or unrelated code appears\n\n**Edge case**: Ask for a symbol that doesn't exist:\n*\"Show me the `nonexistent_function` in `<file>`.\"*\n\n**Expected**: Claude reports an error cleanly rather than reading the full file to search.\n\n---\n\n### Test 4: Cross-File Search (`rlm_search`)\n\n**Purpose**: Verify symbol discovery across the entire codebase.\n\n**Prompt**: *\"Find all files that reference `<common_symbol>` in this project.\"*\n\n**What to verify**:\n- Claude calls `rlm_search` (not `grep` or `Grep`)\n- Results show file paths with matching skeleton lines\n- Multiple files are returned if the symbol appears across the codebase\n- No full file contents are loaded — only skeleton excerpts\n\n**Follow-up**: *\"Drill into the most relevant one.\"*\n\n**What to verify**: Claude picks one result and calls `rlm_drill` on the specific symbol, completing the **search → map → drill** workflow.\n\n---\n\n### Test 5: Document Navigation (`rlm_doc_map` + `rlm_doc_drill`)\n\n**Purpose**: Verify structured navigation of documentation files.\n\n**Prompt**: *\"What sections are in the README?\"*\n\n**What to verify**:\n- Claude calls `rlm_doc_map` on the markdown file\n- Output is a hierarchical section tree with titles and line ranges\n- Nested headings (`##`, `###`) appear as children of their parent sections\n\n**Follow-up**: *\"Show me the Installation section.\"*\n\n**What to verify**:\n- Claude calls `rlm_doc_drill` with the section title\n- Only that section's content is returned, not the entire document\n\n---\n\n### Test 6: Context Sufficiency (`rlm_assess`)\n\n**Purpose**: Verify the assessment tool guides navigation decisions.\n\n**Prompt**: *\"How does authentication work in this project?\"* (or any broad architectural question)\n\n**What to verify**:\n- After gathering some context (tree, map, drill), Claude calls `rlm_assess` to check whether it has enough information\n- The assessment either confirms sufficiency or suggests specific areas to explore further\n- Claude follows the assessment's guidance rather than speculatively reading more files\n\n---\n\n### Test 7: REPL-Assisted Analysis (`rlm_repl_*`)\n\n**Purpose**: Verify the stateful REPL for targeted analysis workflows.\n\n**Prompt**: *\"Use the REPL to find all TODO comments across the codebase and summarize them.\"*\n\n**What to verify**:\n- Claude calls `rlm_repl_init` to start a fresh session\n- Uses `rlm_repl_exec` with `grep(\"TODO\")` to search\n- Uses `peek()` to read context around specific matches\n- Uses `add_buffer(\"todos\", ...)` to accumulate findings\n- Calls `rlm_repl_export` to retrieve the collected results\n- The entire analysis uses minimal tokens compared to reading every file\n\n**Staleness test** (requires two terminals or a manual file edit):\n1. Ask Claude to grep for something and store the result\n2. Manually edit the file that was found\n3. Ask Claude to check REPL status\n\n**What to verify**: `rlm_repl_status` shows a staleness warning for the modified file, flagging that the stored variable is based on outdated data.\n\n---\n\n### Test 8: File Chunking (`rlm_chunks` + `rlm_chunk`)\n\n**Purpose**: Verify large file handling via chunked reading.\n\n**Prompt**: *\"How many chunks does `<large_file>` have? Show me the first chunk.\"*\n\n**What to verify**:\n- Claude calls `rlm_chunks` to get metadata (total chunks, line count, chunk size, overlap)\n- Calls `rlm_chunk` with index 0 to read the first chunk\n- Chunk content includes a header with line range (e.g., \"lines 1-200\")\n- Subsequent chunks can be read independently without re-reading earlier ones\n\n---\n\n### Test 9: Full Navigation Workflow (End-to-End)\n\n**Purpose**: Verify the complete **tree → map → drill → edit** workflow in a realistic task.\n\n**Prompt**: *\"Find where HTTP request validation happens and add input length checking to the main handler.\"*\n\n**What to observe** (step by step):\n1. **Tree**: Claude explores the project structure to identify relevant directories\n2. **Search/Map**: Claude searches for validation-related symbols, then maps candidate files\n3. **Drill**: Claude drills into the specific handler function\n4. **Edit**: Claude makes a surgical edit using only the lines it drilled into\n\n**What to verify**:\n- At no point does Claude read an entire file with `cat` or `Read`\n- Each navigation step loads only what's needed for the next decision\n- The edit targets specific lines rather than rewriting the whole file\n\n---\n\n### Test 10: Token Savings Verification\n\n**Purpose**: Quantify the actual token reduction achieved during a session.\n\n**Prompt** (after completing several of the tests above): *\"Show me the session statistics.\"*\n\n**What to verify**:\n- Claude calls `get_status`\n- Session stats show:\n  - **Tokens served**: Total tokens delivered across all tool calls\n  - **Tokens avoided**: Tokens that would have been consumed by full-file reads\n  - **Reduction percentage**: The overall savings (typically 60-90% on real codebases)\n  - **Tool call breakdown**: Per-tool usage counts and token contributions\n\n**Benchmark comparison**: For a quantitative demo, run the built-in benchmark against your project:\n```bash\npython benchmark.py --root . --query \"<common_symbol>\"\npython benchmark.py --root . --query \"<common_symbol>\" --mode repl\npython benchmark.py --root . --file \"<large_file>\" --mode chunks\n```\n\n---\n\n### Test 11: File Watcher Integration\n\n**Purpose**: Verify that code changes are reflected without restarting the daemon.\n\n**Steps**:\n1. Ask Claude to map a file: *\"Show me the skeleton of `<file>`.\"*\n2. In a separate editor, add a new function to that file and save\n3. Ask Claude to map the same file again\n\n**What to verify**:\n- The second `rlm_map` call shows the newly added function\n- No daemon restart was needed — the file watcher detected the change and invalidated the cache automatically\n\n---\n\n### Test 12: Multi-Language Support\n\n**Purpose**: Verify AST parsing works across supported languages.\n\n**Prompt**: *\"Map one Python file, one JavaScript file, and one TypeScript file.\"*\n\n**What to verify**:\n- Each file produces a proper structural skeleton with language-appropriate constructs:\n  - **Python**: `class`, `def`, `async def`, decorators\n  - **JavaScript**: `class`, `function`, `const/let` arrow functions, `export`\n  - **TypeScript**: `interface`, `type`, `class`, `function`, generics\n- Unsupported file types (e.g., `.toml`, `.yaml`) get a graceful fallback showing the first 20 lines and total line count\n\n---\n\n### Test 13: Haiku Enrichment Verbosity\n\n**Purpose**: Verify that Haiku enrichment activity is visible — status flags, progress notifications, and annotated skeletons all surface correctly.\n\n**Prerequisites**: Set `ANTHROPIC_API_KEY` in your environment or `.env` file, and ensure the `anthropic` SDK is installed (`pip install anthropic`).\n\n#### 13a: Status Reports Enrichment Availability\n\n**Prompt**: *\"Check if RLM Navigator is running.\"*\n\n**What to verify**:\n- Claude calls `get_status`\n- The response includes `enrichment_available: true` (visible in the daemon's raw JSON response)\n- If the API key or SDK is missing, it reports `enrichment_available: false` — enrichment degrades gracefully without errors\n\n#### 13b: Progress Notifications During Navigation\n\n**Prompt**: *\"Find and explain the authentication flow in this project.\"* (or any broad question that triggers multi-file exploration)\n\n**What to verify**:\n- As the sub-agent system dispatches work, `rlm_progress` emits `[RLM]`-prefixed messages:\n  - `[RLM] Chunking <file>...` — file is being split for analysis\n  - `[RLM] Dispatching chunk 1/3 of <file> to rlm-enricher...` — Haiku enrichment dispatched\n  - `[RLM] chunk 1/3 complete — N relevant symbols found` — enrichment finished\n- After the workflow completes, `get_status` shows updated Sub-agent Activity:\n  - `Dispatches: N (M chunk analysis, K enrichment)`\n  - `Chunks analyzed: X | Answers found: Y`\n  - `Last: [RLM] <most recent progress message>`\n\n#### 13c: Enriched Skeleton Annotations\n\n**Prompt**: *\"Map `<file_with_many_functions>`.\"* (pick a file with 5+ functions/methods)\n\n**What to verify**:\n- Claude calls `rlm_map` and the skeleton includes Haiku-generated annotations after line ranges:\n  ```\n  def validate_token(self, token: str) -> bool:  # L25-30  # Checks if token starts with 'sk-' prefix.\n  class AuthManager:  # L1-80  # Manages JWT-based authentication lifecycle.\n  ```\n- Each annotation is a concise 1-line semantic summary describing **what the symbol does** (not just its type)\n- Without `ANTHROPIC_API_KEY`, the same `rlm_map` call returns a clean skeleton with no annotations — no errors, no placeholders\n\n#### 13d: Enrichment Cache Behavior\n\n**Steps**:\n1. Map a file: *\"Show me the skeleton of `<file>`.\"* — first call triggers Haiku enrichment (may take 1-2 seconds)\n2. Map the same file again immediately\n\n**What to verify**:\n- The second call returns instantly with identical annotations (served from `EnrichmentCache`)\n- Edit the file in a separate editor, then map again — annotations refresh because the cache invalidates on mtime change\n\n#### 13e: Background Enrichment Worker\n\n**Prompt**: *\"Show me the project structure, then map the 3 largest Python files.\"*\n\n**What to verify**:\n- The `EnrichmentWorker` processes files in the background — enrichment does not block the `rlm_map` response\n- On the first call to a file, the skeleton may return without annotations (enrichment still queued)\n- A subsequent call to the same file shows annotations once the worker has processed it\n- `get_status` reflects enrichment worker activity in the session stats\n\n---\n\n### Troubleshooting\n\n| Symptom | Check |\n|---------|-------|\n| `get_status` shows OFFLINE | Run `npx rlm-navigator status` to verify daemon. Restart with `python daemon/rlm_daemon.py --root .` |\n| `rlm_map` returns fallback (first 20 lines) for a supported language | Verify tree-sitter is installed: `pip install tree-sitter tree-sitter-python tree-sitter-javascript tree-sitter-typescript` |\n| Claude uses `Read`/`cat` instead of RLM tools | Check that the skill is loaded: verify `.claude/skills/rlm-navigator/SKILL.md` exists in your project |\n| Stale data after file edits | Verify the file watcher is active: `get_status` should show the daemon watching the correct root |\n| Port conflict on startup | Set a custom port: `RLM_DAEMON_PORT=9200 python daemon/rlm_daemon.py --root .` |\n| Haiku enrichment not appearing | Verify `ANTHROPIC_API_KEY` is set and `pip install anthropic` is installed. Check `get_status` for `enrichment_available: true` |\n| Enrichment annotations stale after edit | The `EnrichmentCache` invalidates on mtime change — re-map the file to trigger a fresh Haiku call |\n\n---\n\n### Demo Script (5-Minute Walkthrough)\n\nFor a quick live demonstration, run these prompts in sequence:\n\n1. *\"Check if RLM Navigator is running.\"* — verifies setup\n2. *\"Show me the project structure.\"* — demonstrates `rlm_tree`\n3. *\"What's in `<main_file>`?\"* — demonstrates `rlm_map` (skeleton vs full file)\n4. *\"Show me the implementation of `<key_function>`.\"* — demonstrates `rlm_drill`\n5. *\"Find all files that use `<key_symbol>`.\"* — demonstrates `rlm_search`\n6. *\"Show me the session stats.\"* — reveals token savings\n\n**Talking points at each step**:\n- Step 2: \"Notice it shows structure and sizes without reading any file contents.\"\n- Step 3: \"This 400-line file was summarized in 25 lines — signatures and docstrings only.\"\n- Step 4: \"We loaded exactly 15 lines — just the function we needed.\"\n- Step 5: \"Found the symbol in 8 files without reading any of them.\"\n- Step 6: \"We served X tokens while avoiding Y tokens — that's a Z% reduction.\"\n\n## Inspired By\n\n- [brainqub3/claude_code_RLM](https://github.com/brainqub3/claude_code_RLM) — RLM for document navigation\n- Tree-sitter — universal AST parsing\n","readmeFilename":"README.md"}