PageSourceSearch

https://vexp.dev/docs

html vexp.dev collected 2026-09-29 05:17:32 UTC 277,812 bytes, 1 lines download raw bytes

1<!DOCTYPE html><!--ERRrB9UJLe3n4Is_vhrja--><html lang="en" class="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/051742360c26797e-s.p.102b7f24.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/83afe278b6a6bb3c-s.p.3a6ba036.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" as="image" href="/vexp-icon.svg"/><link rel="stylesheet" href="/_next/static/chunks/3db20d7c09308c7b.css?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/d504efe999470850.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd"/>
1<script src="/_next/static/chunks/23d134ae3ede26f7.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/4fa395d360c87cc3.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/f780cc586c86e4ad.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/797fcb0710da3be2.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/turbopack-5aade9cc358446eb.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/e355ef31239ef980.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/3a64a227006216dc.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/ce074514c1a9a6b7.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/d477b93ef28580a2.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<script src="/_next/static/chunks/bbd55e57a96f3e03.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" async=""></script>
1<meta name="next-size-adjust" content=""/><link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin=""/><link rel="preconnect" href="https://broker.litlyx.com" crossorigin=""/><title>Documentation — vexp</title><meta name="description" content="Complete guide to vexp: installation, configuration, MCP tools, session memory, multi-repo support, and troubleshooting."/><meta name="author" content="vexp"/><meta name="keywords" content="AI coding,reliability layer,context engine,AI code verification,MCP,Claude Code,Cursor,token reduction,local-first,privacy,code context,dependency graph,single-call pipeline,session memory"/><meta name="creator" content="vexp"/><link rel="canonical" href="https://vexp.dev/docs"/><meta property="og:title" content="vexp — The Reliability Layer for AI Coding Agents"/><meta property="og:description" content="Local-first reliability layer for AI coding agents: right context in, verified work out. Fable-5-level results from Opus 5 at half the token price (81.7% on SWE-bench Pro), zero network calls. Your code never leaves your machine."/><meta property="og:url" content="https://vexp.dev"/><meta property="og:site_name" content="vexp"/><meta property="og:locale" content="en_US"/><meta property="og:image" content="https://vexp.dev/og-image.png"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="630"/><meta property="og:image:alt" content="vexp — Your codebase. Understood."/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="vexp — The Reliability Layer for AI Coding Agents"/><meta name="twitter:description" content="Local-first reliability layer for AI coding agents: right context in, verified work out. Fable-5-level results from Opus 5 at half the token price, zero network calls."/><meta name="twitter:image" content="https://vexp.dev/og-image.png"/><link rel="icon" href="/favicon.ico" sizes="48x48"/><link rel="icon" href="/vexp-icon.svg" type="image/svg+xml"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/>
1<script defer="" data-workspace="699c0b9b4fe873e3986d15f3" src="https://cdn.jsdelivr.net/npm/litlyx-js@latest/browser/litlyx.js"></script>
1<script src="/_next/static/chunks/a6dad97d9634a72d.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" noModule=""></script>
1</head><body class="inter_2c2e0e07-module__xHkjQa__variable jetbrains_mono_f120c9a0-module__vTDh_W__variable antialiased"><div hidden=""><!--$--><!--/$--></div>
1<script>((a,b,c,d,e,f,g,h)=>{let i=document.documentElement,j=["light","dark"];function k(b){var c;(Array.isArray(a)?a:[a]).forEach(a=>{let c="class"===a,d=c&&f?e.map(a=>f[a]||a):e;c?(i.classList.remove(...d),i.classList.add(f&&f[b]?f[b]:b)):i.setAttribute(a,b)}),c=b,h&&j.includes(c)&&(i.style.colorScheme=c)}if(d)k(d);else try{let a=localStorage.getItem(b)||c,d=g&&"system"===a?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":a;k(d)}catch(a){}})("class","theme","dark",null,["light","dark"],null,false,true)</script>
1<div class="min-h-screen bg-[var(--color-void)]"><header class="fixed top-0 left-0 right-0 z-50 flex flex-col items-center pointer-events-none"><nav class="pointer-events-auto mt-4 mx-4 flex items-center gap-1 px-2 py-2 rounded-full border transition-all duration-300 bg-[var(--color-void)]/60 backdrop-blur-md border-[var(--color-ghost)]/50" style="opacity:0;transform:translateY(-20px)"><a class="flex items-center shrink-0 pl-2 pr-3" aria-label="vexp home" href="/"><svg viewBox="0 0 740 309" fill="var(--color-snow)" class="h-[22px] w-auto" role="img" aria-label="vexp"><g transform="translate(-238,-242)"><path d="M668.838 296.262L697.643 296.262L644.751 438.115L613.637 438.115L560.943 296.262L591.889 296.262L632.055 410.539L629.195 411.544L626.337 410.535L666.694 296.262L668.838 296.262ZM668.838 302.325L668.838 299.293L671.697 300.303L629.189 420.666L586.882 300.299L589.742 299.293L589.742 302.325L565.302 302.325L565.302 299.293L568.144 298.238L618.586 434.028L615.744 435.084L615.744 432.053L642.647 432.053L642.647 435.084L639.806 434.025L690.438 298.234L693.278 299.293L693.278 302.325L668.838 302.325ZM668.838 299.293L693.278 299.293L642.647 435.084L615.744 435.084L565.302 299.293L589.742 299.293L629.195 411.544L668.838 299.293ZM729.109 439.489Q713.893 439.489 702.197 432.683Q690.51 425.853 683.996 413.633Q677.53 401.503 677.53 385.779Q677.53 370.845 683.915 359.131Q690.322 347.325 701.689 340.505Q713.116 333.679 727.404 333.679Q742.039 333.679 753.254 340.094Q764.51 346.534 770.841 358.082Q777.135 369.512 777.135 384.5Q777.135 386.935 776.834 389.749Q776.545 392.392 776.162 395.314L775.816 397.951L704.243 397.951L704.243 394.92L707.253 394.565Q707.97 400.635 710.951 404.941Q713.925 409.196 718.567 411.6Q723.205 413.96 729.251 413.96Q736.63 413.96 742.475 411.016Q748.024 408.181 750.093 403.768L751.233 401.338L776.285 409.565L774.738 412.697Q768.511 425.303 756.362 432.44Q744.279 439.489 729.109 439.489ZM729.109 433.426Q742.64 433.426 753.291 427.213Q763.878 420.994 769.302 410.012L772.02 411.355L771.074 414.235L751.892 407.936L752.838 405.056L755.582 406.343Q752.631 412.635 745.202 416.43Q738.07 420.022 729.251 420.022Q721.751 420.022 715.779 416.983Q709.812 413.893 705.966 408.391Q702.126 402.845 701.233 395.275L700.833 391.889L773.157 391.889L773.157 394.92L770.151 394.526Q770.526 391.67 770.806 389.103Q771.073 386.612 771.073 384.5Q771.073 371.07 765.525 360.997Q760.016 350.947 750.243 345.357Q740.428 339.742 727.404 339.742Q714.789 339.742 704.808 345.704Q694.861 351.672 689.238 362.032Q683.593 372.39 683.593 385.779Q683.593 399.988 689.346 410.782Q695.052 421.486 705.247 427.444Q715.528 433.426 729.109 433.426ZM747.108 377.112Q746.946 371.947 744.285 367.876Q741.597 363.658 737.194 361.189Q732.827 358.74 727.427 358.782Q722.758 358.782 718.624 361.133Q714.413 363.509 711.392 367.705Q708.44 371.821 707.468 377.526L704.48 377.017L704.48 373.985L750.138 373.985L750.138 377.017L747.108 377.112ZM753.266 380.048L700.888 380.048L701.492 376.508Q702.698 369.424 706.472 364.162Q710.272 358.885 715.627 355.863Q721.155 352.719 727.38 352.719Q734.389 352.666 740.159 355.901Q745.891 359.115 749.36 364.56Q752.952 370.056 753.168 376.921L753.266 380.048ZM729.109 436.458Q714.71 436.458 703.722 430.063Q692.781 423.669 686.671 412.208Q680.561 400.746 680.561 385.779Q680.561 371.617 686.576 360.582Q692.592 349.499 703.248 343.104Q713.952 336.711 727.404 336.711Q741.234 336.711 751.748 342.726Q762.263 348.741 768.183 359.54Q774.104 370.291 774.104 384.5Q774.104 386.773 773.82 389.426Q773.535 392.031 773.157 394.92L704.243 394.92Q705.048 401.74 708.458 406.666Q711.868 411.544 717.173 414.292Q722.478 416.991 729.251 416.991Q737.35 416.991 743.839 413.723Q750.327 410.408 752.838 405.056L772.02 411.355Q766.194 423.148 754.827 429.827Q743.46 436.458 729.109 436.458ZM750.138 377.017Q749.949 371.001 746.823 366.218Q743.744 361.387 738.676 358.545Q733.608 355.703 727.404 355.751Q721.957 355.751 717.126 358.498Q712.342 361.197 708.932 365.934Q705.569 370.623 704.48 377.017L750.138 377.017ZM773.164 335.053L799.893 335.053L821.632 367.81L819.106 369.486L816.586 367.802L838.468 335.053L870.766 335.053L833.622 388.272L831.137 386.537L833.624 384.804L870.76 438.115L838.463 438.115L816.581 405.17L819.106 403.493L821.637 405.162L799.898 438.115L767.358 438.115L804.494 384.804L806.981 386.537L804.496 388.272L767.352 335.053L773.164 335.053ZM773.164 341.115L773.164 338.084L775.65 336.349L810.677 386.535L775.651 436.817L773.164 435.084L773.164 432.053L798.267 432.053L798.267 435.084L795.736 433.415L819.098 398.001L842.613 433.407L840.088 435.084L840.088 432.053L864.954 432.053L864.954 435.084L862.467 436.817L827.441 386.535L862.468 336.349L864.954 338.084L864.954 341.115L840.088 341.115L840.088 338.084L842.609 339.768L819.098 374.955L795.741 339.76L798.267 338.084L798.267 341.115L773.164 341.115ZM773.164 338.084L798.267 338.084L819.106 369.486L840.088 338.084L864.954 338.084L831.137 386.537L864.954 435.084L840.088 435.084L819.106 403.493L798.267 435.084L773.164 435.084L806.981 386.537L773.164 338.084ZM892.108 417.732L898.283 416.307L898.283 476.906L870.292 476.906L870.292 335.053L895.926 335.053L897.832 349.724L894.826 350.114L892.505 348.164Q897.648 342.044 906.028 337.88Q914.48 333.679 926.086 333.679Q939.709 333.679 950.21 340.357Q960.68 347.016 966.597 358.951Q972.454 370.715 972.454 386.584Q972.454 402.256 966.602 414.161Q960.686 426.144 950.316 432.804Q939.905 439.489 926.086 439.489Q913.721 439.489 904.477 434.535Q895.311 429.595 890.303 422.42L887.736 418.741L892.108 417.732ZM893.471 423.639L892.789 420.686L895.275 418.951Q899.457 424.943 907.341 429.192Q915.243 433.426 926.086 433.426Q938.126 433.426 947.04 427.702Q955.994 421.952 961.161 411.486Q966.392 400.846 966.392 386.584Q966.392 372.141 961.166 361.644Q956 351.224 946.957 345.473Q937.944 339.742 926.086 339.742Q915.904 339.742 908.726 343.309Q901.477 346.912 897.147 352.064L892.709 357.345L890.257 338.474L893.263 338.084L893.263 341.115L873.323 341.115L873.323 338.084L876.354 338.084L876.354 473.875L873.323 473.875L873.323 470.843L895.252 470.843L895.252 473.875L892.221 473.875L892.221 420.117L895.252 420.117L895.934 423.071L893.471 423.639ZM942.994 386.584Q942.994 374.302 936.62 366.864Q930.459 359.587 920.734 359.587Q914.571 359.587 909.518 362.652Q904.501 365.679 901.39 371.565Q898.283 377.523 898.283 386.584Q898.283 395.465 901.406 401.538Q904.514 407.503 909.527 410.569Q914.571 413.628 920.734 413.628Q930.459 413.628 936.608 406.365Q942.994 398.871 942.994 386.584ZM949.057 386.584Q949.057 401.104 941.235 410.282Q933.269 419.691 920.734 419.691Q912.876 419.691 906.364 415.741Q899.915 411.797 896.014 404.31Q892.221 396.932 892.221 386.584Q892.221 376.037 896.03 368.732Q899.928 361.357 906.373 357.469Q912.876 353.524 920.734 353.524Q933.269 353.524 941.223 362.919Q949.057 372.059 949.057 386.584ZM892.789 420.686L895.252 420.117L895.252 473.875L873.323 473.875L873.323 338.084L893.263 338.084L894.826 350.114Q899.562 344.478 907.377 340.594Q915.192 336.711 926.086 336.711Q938.826 336.711 948.583 342.915Q958.34 349.12 963.882 360.297Q969.423 371.428 969.423 386.584Q969.423 401.551 963.882 412.823Q958.34 424.048 948.678 430.253Q939.016 436.458 926.086 436.458Q914.482 436.458 905.909 431.863Q897.384 427.269 892.789 420.686ZM946.026 386.584Q946.026 373.18 938.921 364.892Q931.864 356.556 920.734 356.556Q913.724 356.556 907.946 360.061Q902.215 363.518 898.71 370.149Q895.252 376.78 895.252 386.584Q895.252 396.199 898.71 402.924Q902.215 409.65 907.946 413.155Q913.724 416.66 920.734 416.66Q931.864 416.66 938.921 408.324Q946.026 399.988 946.026 386.584Z"></path><path d="M412.62 298.226C412.617 296.515 412.56 295.188 412.62 293.865C412.845 288.972 414.885 286.89 419.821 286.863C431.615 286.798 443.408 286.858 455.202 286.844C461.283 286.838 462.467 285.664 462.473 279.713C462.484 271.1 462.448 262.487 462.48
16 253.874C462.507 249.126 463.891 247.408 468.434 247.318C477.309 247.142 486.189 247.19 495.066 247.282C498.766 247.32 500.49 249.362 500.446 253.149C500.347 261.496 500.442 269.845 500.401 278.193C500.378 282.704 499.26 283.891 494.796 283.944C487.907 284.025 481.015 283.93 474.125 283.983C468.581 284.026 467.735 284.931 467.735 290.538C467.735 302.993 467.768 315.449 467.746 327.905C467.737 333.426 466.192 334.937 460.612 334.951C449.481 334.979 438.35 334.961 427.219 334.983C418.913 334.998 418.349 335.751 418.43 343.889C418.567 357.668 418.475 371.45 418.478 385.231C418.483 400.47 418.465 415.708 418.5 430.947C418.519 439.491 422.035 442.939 430.613 442.935C462.017 442.92 493.422 442.894 524.827 442.891C526.676 442.891 528.559 442.87 530.37 443.186C535.023 443.996 536.974 446.755 537.006 452.442C537.148 477.747 537.276 503.052 537.371 528.357C537.383 531.533 537.347 534.726 537.026 537.879C536.519 542.853 533.59 545.659 528.694 545.667C491.327 545.724 453.959 545.723 416.592 545.68C411.7 545.674 408.355 542.706 407.545 537.877C407.219 535.933 407.182 533.922 407.18 531.941C407.159 506.632 407.169 481.322 407.169 456.013C407.169 451.384 407.838 446.776 407.28 442.122C406.48 435.443 403.68 432.686 396.959 432.677C371.914 432.645 346.87 432.673 321.826 432.678C311.628 432.681 308.281 429.341 308.277 419.142C308.268 393.302 308.274 367.463 308.249 341.624C308.241 333.083 305.93 330.765 297.42 330.745C283.109 330.712 268.798 330.714 254.488 330.715C247.052 330.716 243.685 328.093 243.56 320.696C243.255 302.681 243.251 284.656 243.47 266.639C243.558 259.453 246.853 256.699 254.038 256.686C272.59 256.652 291.141 256.651 309.693 256.691C317.121 256.708 319.907 259.596 319.913 267.179C319.931 286.127 319.906 305.076 319.909 324.025C319.909 332.416 323.322 335.975 331.639 335.992C357.213 336.047 382.788 335.976 408.361 336.107C411.841 336.124 412.637 334.687 412.612 331.604C412.527 320.607 412.605 309.609 412.62 298.226Z"></path></g></svg></a><div class="hidden md:flex items-center gap-1"><a class="text-[14px] font-medium tracking-tight text-[var(--color-ash)] hover:text-[var(--color-snow)] px-3 py-1.5 rounded-full hover:bg-white/5 transition-colors" href="/#how-it-works">How it works</a><a class="text-[14px] font-medium tracking-tight text-[var(--color-ash)] hover:text-[var(--color-snow)] px-3 py-1.5 rounded-full hover:bg-white/5 transition-colors" href="/#tools">Tools</a><a class="text-[14px] font-medium tracking-tight text-[var(--color-ash)] hover:text-[var(--color-snow)] px-3 py-1.5 rounded-full hover:bg-white/5 transition-colors" href="/#pricing">Pricing</a><a class="text-[14px] font-medium tracking-tight text-[var(--color-ash)] hover:text-[var(--color-snow)] px-3 py-1.5 rounded-full hover:bg-white/5 transition-colors" href="/blog">Blog</a><a class="text-[14px] font-medium tracking-tight text-[var(--color-ash)] hover:text-[var(--color-snow)] px-3 py-1.5 rounded-full hover:bg-white/5 transition-colors" href="/benchmark">Benchmark</a><a class="text-[14px] font-medium tracking-tight text-[var(--color-ash)] hover:text-[var(--color-snow)] px-3 py-1.5 rounded-full hover:bg-white/5 transition-colors" href="/docs">Docs</a><a class="text-[14px] font-medium tracking-tight text-[var(--color-ash)] hover:text-[var(--color-snow)] px-3 py-1.5 rounded-full hover:bg-white/5 transition-colors" href="/account">Account</a></div><div class="hidden md:block relative ml-1"><button class="btn-expo-primary inline-flex items-center gap-1.5 h-9 px-4 rounded-full text-[14px] font-medium leading-none transition-colors shrink-0">Install<svg class="w-3 h-3 opacity-60" viewBox="0 0 12 12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M3 5l3 3 3-3"></path></svg></button></div><button class="md:hidden ml-1 flex items-center justify-center w-8 h-8 rounded-full hover:bg-white/5 transition-colors" aria-label="Open menu" aria-expanded="false"><div class="relative w-4 h-3 flex flex-col justify-between"><span class="block h-[1.5px] w-full bg-[var(--color-snow)] rounded-full origin-center"></span><span class="block h-[1.5px] w-full bg-[var(--color-snow)] rounded-full"></span><span class="block h-[1.5px] w-full bg-[var(--color-snow)] rounded-full origin-center"></span></div></button></nav></header><div class="border-b border-[var(--color-ghost)] bg-[var(--color-graphite)] pt-[calc(7rem+var(--banner-h,0px))] pb-16"><div class="container-expo"><div class="mb-6"><div class="inline-flex items-center gap-1 rounded-full border border-[var(--color-ghost)] bg-[var(--color-void)] p-1"><a aria-current="page" class="px-3.5 py-1.5 rounded-full text-sm font-medium border transition-colors bg-[var(--color-graphite)] text-[var(--color-snow)] border-[var(--color-wire)]" href="/docs">VS Code &amp; CLI</a><a class="px-3.5 py-1.5 rounded-full text-sm font-medium border transition-colors text-[var(--color-ash
1)] border-transparent hover:text-[var(--color-snow)]" href="/docs/sdk">SDK</a></div></div><span class="badge-expo">Documentation</span><h1 class="t-display text-4xl sm:text-5xl md:text-display-xl mt-5">Set up vexp, ship faster</h1><p class="t-body text-lg mt-4 max-w-2xl">Install vexp, connect your AI agent, and master the everyday workflow, commands, settings, and a troubleshooting playbook for both VS Code and the standalone CLI.</p><div class="mt-7 flex flex-wrap gap-2.5"><span class="badge-expo">VS Code 1.85+</span><span class="badge-expo">36 languages · 17 agents</span></div></div></div><div class="container-expo"><div class="flex gap-12 xl:gap-20 py-16 md:py-20"><aside class="hidden lg:block w-56 xl:w-64 shrink-0"><nav class="sticky top-28"><p class="t-eyebrow mb-4 px-3">Contents</p><div class="border-l border-[var(--color-ghost)] space-y-px"><a href="#introduction" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-snow)] border-[var(--color-ash)]">Introduction</a><a href="#installation" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Installation</a><a href="#first-run" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">First Run</a><a href="#vscode-features" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">VS Code Features</a><a href="#commands" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Commands</a><a href="#mcp-tools" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">MCP Tools</a><a href="#session-memory" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Session Memory</a><a href="#agents" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Supported Agents</a><a href="#windows-wsl" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Windows + WSL2</a><a href="#multi-repo" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Multi-Repo Workspaces</a><a href="#local-llm" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Local LLM (optional)</a><a href="#configuration" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Configuration</a><a href="#languages" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Supported Languages</a><a href="#troubleshooting" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Troubleshooting</a><a href="#uninstall" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Uninstall</a><a href="#privacy" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash
1)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Privacy &amp; Security</a><a href="#plans" class="-ml-px block border-l pl-4 pr-3 py-1.5 text-sm transition-colors text-[var(--color-ash)] border-transparent hover:text-[var(--color-snow)] hover:border-[var(--color-fog)]">Plans &amp; Quotas</a></div></nav></aside><main class="min-w-0 flex-1 space-y-20"><section id="introduction" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Overview</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Introduction</h2><p class="t-body mb-4">vexp is a local-first reliability layer for AI coding agents. Its context engine builds a live dependency graph of your codebase and serves your agent only the code that matters for the task; when the agent declares the task done, vexp verifies the work mechanically against that same graph. Session memory persists across days, and an optional local AI layer compresses prompts and context further. Everything runs on your machine.</p><p class="t-body mb-4">The VS Code extension is the primary distribution. A standalone CLI (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">npm install -g vexp-cli</code>) is available for terminal-only workflows. Both bundle the same native engine and MCP server — no external dependencies, no account required. The VS Code extension needs no Node runtime; the npm CLI requires Node 20 or later.</p><h3 class="t-title text-title-md mt-10 mb-3">How it works</h3><div class="grid md:grid-cols-3 gap-4 mt-4"><div class="card-expo"><span class="step-plate">01</span><h4 class="t-title text-title-md mt-4 mb-2">Index</h4><p class="t-body text-sm">vexp parses your source files and builds a graph stored at .vexp/index.db (local, gitignored). A small manifest.json with per-file content hashes is committed to git, teammates rebuild incrementally from the manifest in seconds.</p></div><div class="card-expo"><span class="step-plate">02</span><h4 class="t-title text-title-md mt-4 mb-2">Traverse</h4><p class="t-body text-sm">Given a natural-language task, vexp identifies the pivot nodes that matter via semantic search + graph traversal. Session memories from previous work are surfaced too.</p></div><div class="card-expo"><span class="step-plate">03</span><h4 class="t-title text-title-md mt-4 mb-2">Capsule</h4><p class="t-body text-sm">Pivot files are returned in full; supporting files as compact skeletons (signatures only). The result fits the configured token budget, typically 8 000 tokens.</p></div></div></section><section id="installation" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Getting Started</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Installation</h2><p class="t-body mb-4">Pick a distribution. The VS Code extension is the fastest path; the CLI is for terminal-only setups (Claude Code, Codex, scripts, remote machines).</p><div class="my-6"><div class="flex gap-1 mb-4 p-1 rounded-md bg-[var(--color-slate)] border border-[var(--color-ghost)] w-fit"><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 bg-[var(--color-snow)] text-[var(--color-void)]">VS Code</button><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 text-[var(--color-fog)] hover:text-[var(--color-ash)]">CLI</button></div><h3 class="t-title text-title-md mt-10 mb-3">Install from the Extensions panel</h3><p class="t-body mb-4">Open Extensions (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">Ctrl+Shift+X</code> /<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">⌘⇧X</code>), search for <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp</code>, and click<!-- --> <strong class="text-[var(--color-snow)]">Install</strong>.</p><p class="t-body mb-4">The extension bundles the native engine for your platform. There is no Node runtime to install, no separate compilation, and nothing to download afterwards. Open a project folder and click the <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: not indexed</code> <!-- -->status-bar item (or run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Start Indexing</code>) to build the index; already-indexed projects start their daemon automatically.</p><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash
1)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>Bundled binary won&#x27;t run on your system? Set<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.binaryPath</code> in Settings to point at a locally-built<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp-core</code>.</div></div><h3 class="t-title text-title-md mt-10 mb-3">Platform support</h3><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Platform</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Minimum OS</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Linux x64</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Ubuntu 20.04+, Debian 11+, RHEL/Rocky 8+, WSL2</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Linux arm64</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Same minimum as Linux x64</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">macOS Intel</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">macOS 11 (Big Sur) or later</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">macOS Apple Silicon</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">macOS 11 (Big Sur) or later</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Windows x64</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Windows 10 or later</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Windows ARM64</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Windows 11 on ARM; runs the x64 binary via built-in emulation</td></tr></tbody></table></div><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>The platform table applies to both distributions, the same native engine is bundled in the VS Code extension and the npm CLI.</div></section><section id="first-run" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Getting Started</span><h2 class="t-heading text-2xl md:text-display-md mb-3">First Run</h2><p class="t-body mb-4">Pick your distribution below. Both paths end with the same result: a working index, a configured AI agent, and a daemon that auto-restarts when needed, usually within 30 seconds on a typical project.</p><div class="my-6"><div class="flex gap-1 mb-4 p-1 rounded-md bg-[var(--color-slate)] border border-[var(--color-ghost)] w-fit"><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 bg-[var(--color-snow)] text-[var(--color-void)]">VS Code</button><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 text-[var(--color-fog)] hover:text-[var(--color-ash)]">CLI</button></div><ol class="space-y-4 mt-2 list-decimal list-inside text-[var(--color-ash)]"><li><strong class="text-[var(--color-snow)]">Index with one click.</strong> <!-- -->
1Open a project folder — the first time, the status bar shows<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: not indexed</code>; click it (or run<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Start Indexing</code>) to build the index. On an already-indexed project the daemon starts automatically when the folder opens. The status bar shows <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: indexing</code> while it works, then <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: 1.2k · 0/20</code> when ready (node count plus daily-call usage; numbers are abbreviated k/M).</li><li><strong class="text-[var(--color-snow)]">Agents are configured.</strong> <!-- -->vexp sets up the AI agents the project itself shows (Claude Code, Cursor, Copilot, Codex, and more) and writes the right config file for each. A tool found only on this machine is offered once per project (see<!-- --> <a href="#agents" class="text-[var(--color-ash)] hover:underline">Supported Agents</a>). Run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Project Setup</code> or<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Setup Agents</code> (multi-select) from the Command Palette to set up more.</li><li><strong class="text-[var(--color-snow)]">No login hook is installed.</strong> <!-- -->The daemon starts when you open the folder or when an agent calls a tool. Want it warm after every reboot? Run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp autostart install</code> <!-- -->from the CLI (optional, per-user, no admin needed).</li><li><strong class="text-[var(--color-snow)]">Your AI agent just works.</strong> <!-- -->If the daemon was ever killed, it auto-restarts the next time an agent calls a tool, no manual management. Use the sidebar panel to monitor or stop it.</li><li class="!list-none !pl-0 pt-2"><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>Personal mode: enable <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.personalMode</code> in Settings to skip writing shared-repo files (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.claude/CLAUDE.md</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.cursor/rules/vexp.mdc</code>, git hooks). Useful when you want vexp on someone else&#x27;s repo without changing their files.</div></li></ol></div></section><section id="vscode-features" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">VS Code</span><h2 class="t-heading text-2xl md:text-display-md mb-3">VS Code Features</h2><p class="t-body mb-4">Beyond what your AI agent calls via MCP, vexp gives you visible feedback directly in VS Code (works the same in Cursor and Windsurf).</p><h3 class="t-title text-title-md mt-10 mb-3">Sidebar panel</h3><p class="t-body mb-4">Click the vexp icon in the Activity Bar to open a sidebar with:</p><ul class="list-disc list-inside space-y-1.5 text-[var(--color-ash)] mb-4 ml-2"><li>Status header (running / indexing / starting / connecting / stopped / error / workspace cap reached / not initialized) and live index stats (nodes, edges, files, uptime, agent sessions).</li><li>Activity (7 days): prompts analyzed, and the parts that add up to it: silences, orientations served and, when there are any, Held out (A/B) for the measurement holdback (disable with <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">holdback_pct = 0</code> in<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp.toml</code>) and Past hook budget for orientations that finished after the agent stopped waiting.</li><li>Measured savings (tool calls) section — appears once at least one measured tool call exists — with a period selector (today, 7 / 14 / 30 / 60 / 90 days) and an Export Report button that writes a markdown report to<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/token-savings-report.md</code>.</li><li>Local LLM section with Install / Start / Disable / Check-updates / Status buttons, plus a one-time notification that offers to enable it.</li><li>Contextual actions that follow daemon state: while running — Stop Indexing, Force Re-index, Generate Context Capsule, Add / Connect Repository, Setup Agents, Settings, View Daemon Logs; while stopped — Start Indexing, Setup Agents, Activate License, View Daemon Logs.</li><li>Repository cards (status dot with an &#x27;indexing NN%&#x27; badge while indexing, repo alias and path, node / edge / file counts, last-indexed time). A toggle shows or hides empty repos.</li></ul><p class="t-body mb-4">The panel auto-refreshes every 10 seconds.</p><h3 class="t-title text-title-md mt-10 mb-3">CodeLens</h3><p class="t-body mb-4">Functions, methods, classes, interfaces, enums, and other indexed symbols in TypeScript, JavaScript, Python, Go, Rust, Java, C#, C, C++, Ruby, and Bash get an inline annotation once the file is indexed: first<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: analyze impact</code>, then<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">N dependents across M files</code> (plus<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">| K cross-repo</code> when cross-repo dependents exist). Click it to open the impact graph for that symbol. Available on every paid plan (Pro, Team, and lifetime tiers); not on the free plan.</p><h3 class="t-title text-title-md mt-10 mb-3">Hover</h3><p class="t-body mb-4">Hover an exported TypeScript/JavaScript declaration (a line containing the<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">export</code> keyword) to see its dependents count, cross-repo usage, and top 5 callers. Available on every paid plan.</p><h3 class="t-title text-title-md mt-10 mb-3">Status bar</h3><p class="t-body mb-4">The left-side status bar shows the current state. Clicking it opens your license status — except in the <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: not indexed</code> state (click starts indexing) and the <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: workspace cap</code> state (click opens the logs).</p><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">State</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Meaning</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors">
1<td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: not indexed</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Never indexed yet; click to start indexing</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: indexing NN%</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Indexing in progress (progress percentage shown when known)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: 1.2k nodes</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Healthy, plan with no node cap (Team, Lifetime Tier 4)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: 1.8k/2.0k</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">At ≥ 50 % of the node cap (yellow); shown when no daily quota is displayed — with a daily quota the same state renders as vexp: 1.8k · 12/20</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: 1.8k · 12/20</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">
1Plans with a node cap (Starter, Pro, Lifetime Tier 1–3): daily-call usage after node count; warning (yellow) at ≥75% of the daily cap</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: daily limit reached</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Daily call limit reached (red): Starter pauses until midnight UTC; on a paid plan only the counted tools are refused until then</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: 2.0k/2.0k</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Node limit reached (red); the tooltip says how many source files were left out and the estimated size of the whole project</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: workspace cap</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Concurrent-workspace limit for your plan reached (yellow); click opens logs</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: starting…</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Daemon booting</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: stopped</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Daemon not running</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: disabled</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">vexp.enabled is off in Settings</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: error</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Daemon failed, check logs</td></tr></tbody></table></div><h3 class="t-title text-title-md mt-10 mb-3">Linked repos in VS Code</h3><p class="t-body mb-4">The active workspace&#x27;s<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/workspace.json</code> governs how repos are linked. See<!-- --> <a href="#multi-repo" class="text-[var(--color-ash)] hover:underline">Multi-Repo Workspaces</a> <!-- -->for the cross-repo features.</p></section><section id="commands" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Reference</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Commands</h2><p class="t-body mb-4">Everything you&#x27;ll actually type, organized by where you type it.</p><div class="my-6"><div class="flex gap-1 mb-4 p-1 rounded-md bg-[var(--color-slate)] border border-[var(--color-ghost)] w-fit"><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 bg-[var(--color-snow)] text-[var(--color-void)]">VS Code</button><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 text-[var(--color-fog)] hover:text-[var(--color-ash
1)]">CLI</button></div><h3 class="t-title text-title-md mt-10 mb-3">Command Palette</h3><p class="t-body mb-4">Open the palette (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">Ctrl+Shift+P</code> /<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">⌘⇧P</code>), type <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp</code>, and pick:</p><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Project Setup</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Set up the agents this project shows (and those chosen for it before), write config files, ask about each tool found only on this machine, and ask once about git hooks.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Setup Agents</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Multi-select picker of all supported agents (Space to toggle, Enter to confirm). Tools found only on this machine are marked; what you pick is remembered for this project.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Setup Multi-Repo Workspace</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Pick additional repos; vexp creates .vexp/workspace.json and enables cross-repo queries.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Generate Context Capsule for Current Task</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Type a task description; vexp opens a panel with the pivot files and supporting skeletons.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Show Impact Graph for Symbol at Cursor</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Open a panel showing what depends on the symbol you have selected.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Show File Skeleton</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Pick a detail level and see the file&#x27;s structure without bodies.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Show Index Status</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Open a panel with node / edge / file counts and uptime.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Start Indexing</code>
1<span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Start the daemon if it&#x27;s not running.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Stop Indexing</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Gracefully stop the daemon.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Force Re-index</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Confirm, then fully restart the daemon and re-index the project.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Activate License Key</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Paste a Pro / Team license key.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Show License Status</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">See plan, expiry, and links to manage your subscription.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Show Token Savings</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Focus the vexp sidebar panel, where the token-savings figures live.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Verify Completion (parse errors, broken imports, impacted tests)</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Run the same mechanical completion check as vexp verify and write the report to the &#x27;vexp verify&#x27; output channel; the summary is shown as a notification.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Restart Daemon (after updates or config changes)</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Restart the daemon in place from the palette — the remedy for version-skew warnings from Doctor.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Doctor (diagnose daemon, license, hooks)</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">One-page health report: binary vs daemon version, index status, license, hooks wiring. The first thing to run when something feels off.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Shield Scan (PII and secrets any AI agent can read)</code><span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Scan comments and string literals for PII and secrets any AI agent could read. Masked previews only, everything stays local.</span></div><div class="flex items-start gap-4 py-4 border-b border-[var(--color-ghost)]/50 last:border-0"><code class="shrink-0 font-mono text-sm text-[var(--color-snow)] bg-[var(--color-slate)] border border-[var(--color-ghost)] rounded px-2 py-0.5">vexp: Settings</code>
1<span class="text-sm text-[var(--color-ash)] leading-relaxed pt-0.5">Open VS Code Settings filtered to vexp options.</span></div></div></section><section id="mcp-tools" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Reference</span><h2 class="t-heading text-2xl md:text-display-md mb-3">MCP Tools</h2><p class="t-body mb-4">Your AI agent uses these tools through MCP. You won&#x27;t call them directly, your agent does, but it helps to know what each one does.</p><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Tool</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Purpose</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">When to use</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Primary tool. Context search + impact analysis + memory recall in one call. Auto-detects intent.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Every task</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">verify_done</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Horizon: mechanical completion check on the session’s changes: parse errors, broken imports, untouched dependents, impacted tests (the exact test files to RUN, with shared helpers flagged for UPDATE), docs drift. File:line evidence, free on every plan. Repeat calls on an unchanged tree return the cached verdict instantly.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Before declaring a multi-file task complete</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_context_capsule</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Lightweight context search with relevant memories.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Quick lookups</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_impact_graph</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">What breaks if a symbol changes. Cross-repo supported.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Before refactoring</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">search_logic_flow</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Execution paths between two symbols.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Debugging</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_skeleton</code></td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">Token-efficient file structure (minimal / standard / detailed).</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Exploring unfamiliar code</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_session_context</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Observations from current and previous sessions.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Recalling earlier work</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">search_memory</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Cross-session search with a &quot;why this surfaced&quot; rationale.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Finding past decisions</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">save_observation</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Persist an insight; optionally linked to a symbol for staleness tracking.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Recording context</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">expand_vexp_ref</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Retrieves the original code behind a [V-REF:xxxx] marker (12 hex chars) found in compressed vexp output. Free on every plan.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">When compressed output references a V-REF</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">index_status</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Indexing health, stats, available repo aliases; when the plan’s node cap left files out, how many and the estimated size of the whole project.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Checking health</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">workspace_setup</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Generates agent configuration files.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">First-time setup</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">index_incremental</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Live incremental or full re-index of a repo without restarting the daemon; built for push/PR-webhook pipelines. Pro/Team, native MCP server only.</td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">CI / webhook reindex</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">pr_impact</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Changed symbols of a base..head git diff with their downstream dependents, most-impactful first. Pro/Team, native MCP server only.</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">PR-review automation</td></tr></tbody></table></div><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>By default your agent&#x27;s tool list advertises only a slim core set (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_skeleton</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">expand_vexp_ref</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">verify_done</code>; three via the Node MCP wrapper). Listing is not availability: every tool on this page stays callable even when unlisted. Set <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_ALL_TOOLS=1</code> <!-- -->on the MCP server to advertise the full plan-gated list.</div><h3 class="t-title text-title-md mt-10 mb-3">run_pipeline at a glance</h3><p class="t-body mb-4"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code> replaces the older multi-step workflow with a single call that picks the right strategy for your task.</p><div class="card-expo-dark overflow-hidden p-0 my-4"><div class="flex items-center gap-2 px-4 py-3 border-b border-[var(--color-ghost)]"><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><span class="ml-2 text-xs font-mono text-[var(--color-fog)]">javascript</span></div><div class="p-4 font-mono text-sm"><div class="overflow-x-auto text-[13px] leading-relaxed"><div class="whitespace-pre text-[var(--color-snow)]">run_pipeline({</div><div class="whitespace-pre text-[var(--color-snow)]">  task: &quot;fix login bug&quot;,       // describe the task in your own words</div><div class="whitespace-pre text-[var(--color-snow)]">  preset: &quot;auto&quot;,              // auto | explore | debug | modify | refactor</div><div class="whitespace-pre text-[var(--color-snow)]">  max_tokens: 10000,           // token budget</div><div class="whitespace-pre text-[var(--color-snow)]">  include_tests: false,        // include test files (auto-on for debug)</div><div class="whitespace-pre text-[var(--color-snow)]">  observation: &quot;uses cookies&quot;  // optional: save an insight in the same call</div><div class="whitespace-pre text-[var(--color-snow)]">})</div></div></div></div><p class="t-body mb-4">For multi-repo workspaces, scope a query with<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">repos: [&quot;backend&quot;, &quot;shared&quot;]</code>.</p><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash
1)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>Only <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_context_capsule</code>, and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_skeleton</code> count against the Starter daily quota (20 / day, resets midnight UTC). Memory and status tools never count against it, on any plan. Impact, flow, and workspace_setup are Pro/Team features: on Starter they are not available as tools, and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code> skips the impact and flow steps. Once the daily quota is spent, the daemon stops until the quota resets at midnight UTC, so no tool answers until then.</div></section><section id="session-memory" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Core Feature</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Session Memory</h2><p class="t-body mb-4">vexp remembers what your agent explored, decided, and learned, automatically, across sessions and days. Memories are linked to the code graph, so when the underlying code changes, related memories are flagged stale (your agent sees that the past decision may no longer apply).</p><h3 class="t-title text-title-md mt-10 mb-3">How it works</h3><ul class="list-disc list-inside space-y-1.5 text-[var(--color-ash)] mb-4 ml-2"><li><strong class="text-[var(--color-snow)]">Auto-capture.</strong> Every vexp tool call your agent makes becomes a compact observation in the local database.</li><li><strong class="text-[var(--color-snow)]">Auto-surface.</strong> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code> and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_context_capsule</code> <!-- -->include relevant memories in the result, no extra tool calls needed.</li><li><strong class="text-[var(--color-snow)]">Each result explains itself.</strong> <!-- -->A short rationale tells the agent <em>why</em> this memory surfaced (matching the task, recent activity, related code, etc.).</li><li><strong class="text-[var(--color-snow)]">Staleness tracking.</strong> When code linked to a memory changes, the memory is marked stale and demoted in ranking, but still shown with a warning so the agent can re-evaluate.</li></ul><h3 class="t-title text-title-md mt-10 mb-3">The three memory tools</h3><p class="t-body mb-4">All three are included on every plan, Starter included, and none of them count against the daily quota. Note that on Starter they still stop answering once that quota is spent, because the daemon shuts down until it resets at midnight UTC:</p><ul class="list-disc list-inside space-y-1.5 text-[var(--color-ash)] mb-4 ml-2"><li><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_session_context</code>, observations from the current and previous sessions.</li><li><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">search_memory</code>, cross-session search across everything vexp has captured.</li><li><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">save_observation</code>, manually record an insight. Optionally link it to a symbol so it gets flagged when that symbol changes. Manually saved observations persist permanently. Auto-captured observations are ephemeral: when a session is compressed they are rolled into a session summary and pruned.</li></ul></section><section id="agents" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Integrations</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Supported Agents</h2><p class="t-body mb-4">vexp detects and configures 17 AI coding agents. Running<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> writes the correct configuration file for each agent it sets up, including tool-usage instructions tailored to that agent. For Windsurf and Kiro, setup also pre-approves the vexp tools in the MCP entry (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">alwaysAllow</code> / <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">autoApprove</code>), so those agents never prompt per call. Every vexp tool also declares what it does in MCP terms (read-only, or writing only vexp&#x27;s own local data), so Codex no longer asks permission before each vexp call and<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">codex exec</code> with approvals set to never no longer refuses them.</p><p class="t-body mb-4"><strong class="text-[var(--color-snow)]">Which agents get set up.</strong> <!-- -->An agent the project itself shows is set up without asking: its own folder or file in the project (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.claude</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.cursor</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">opencode.json</code>, …; for Codex a project<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.codex/config.toml</code>, never <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code> <!-- -->or anything else vexp writes), or an agent you chose for this project before. A tool found only on this machine (Codex&#x27;s login, sessions or history under<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.codex</code> or <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">CODEX_HOME</code>, the<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.claude</code> folder, Antigravity&#x27;s<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.gemini/antigravity</code>, Cline&#x27;s VS Code storage) is not set up on its own. VS Code asks once per project, one question per tool:<!-- --> <strong class="text-[var(--color-snow)]">Set up</strong> /<!-- --> <strong class="text-[var(--color-snow)]">Not here</strong> /<!-- --> <strong class="text-[var(--color-snow)]">Never</strong>.<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> lists such a tool unselected, and without a terminal skips it and prints the command that adds it.</p><p class="t-body mb-4">The answers live in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp/agent-consent.json</code> (per project, plus a list of tools you never want), shared by the extension and the CLI. Set up, or picking the tool in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup-agents</code> or <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp use</code>, records yes. Not here records no for this project and removes what vexp wrote there for that tool (its <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code>
1 block when no other tool set up here reads it, its <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.codex</code> hooks), keeping your own text and files. Never says no for every project on this machine, does the same cleanup, and removes vexp&#x27;s machine-wide entry for that tool (Codex, Antigravity, Cline) when it names no project or this one; <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.claude.json</code> is never touched. Closing the question answers nothing: it comes back at the next start.</p><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>Verification channels: on Claude Code, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup --interventions</code> <!-- -->installs an opt-in Stop hook that runs the Horizon completion check once per session (default setup does not install it); on opencode and Kilo Code the check runs at session idle through the default-on vexp plugin; every agent can call<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">verify_done</code> directly or run<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp verify</code> headless.</div><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Agent</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Files written</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Transport</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Claude Code</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.claude/CLAUDE.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.claude.json</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.claude/hooks/</code> (vexp-hint.sh, vexp-search.sh, vexp-restore.sh; registered in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.claude/settings.json</code>). The Grep/Glob deny hook vexp-guard.sh is written only with <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup --guard-strict</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Cursor</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.cursor/rules/vexp.mdc</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.cursor/mcp.json</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.cursor/hooks/vexp-edit-hint.sh</code> (via <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.cursor/hooks.json</code>)</span></td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Windsurf / Devin Desktop</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.windsurf/rules/vexp.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.codeium/windsurf/mcp_config.json</code> (Cascade, user scope) + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.devin/mcp_config.json</code> (Devin Local); with Devin Desktop Next installed, also <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.codeium/windsurf-next/mcp_config.json</code>; earlier releases wrote <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.windsurf/mcp.json</code>, which Cascade does not read</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">GitHub Copilot</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.github/copilot-instructions.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vscode/mcp.json</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Zed</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.zed/rules.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.zed/settings.json</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Continue.dev</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.continue/config.json</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Cline</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.clinerules</code> + machine-global <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">cline_mcp_settings.json</code> (per installed VS Code variant)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Codex</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.codex/config.toml</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.codex/hooks.json</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.codex/vexp-hint.sh</code> (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.codex/vexp-hint.cmd</code> on Windows)</span></td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>stdio, direct (default); opt-in HTTP via <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_CODEX_TRANSPORT=http</code> (CLI) or the <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.codexMcpTransport</code> VS Code setting, on 127.0.0.1:7821 by default (per-workspace override in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/mcp.port</code>); the HTTP entry always routes to one project</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Opencode</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">mcp</code> key in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">opencode.json(c)</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.opencode/plugin/</code> (vexp-hint.js, vexp-compress.js)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Kilo Code</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.kilocode/rules/vexp.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">mcp</code> key in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">kilo.jsonc</code> (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.kilo/kilo.jsonc</code> or root <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">kilo.jsonc</code>) + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.kilo/plugin/</code> (vexp-hint.js, vexp-compress.js)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Kiro</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.kiro/steering/vexp.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.kiro/settings/mcp.json</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Augment</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.augment/guidelines.md</code></span></td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">instructions only (no MCP file)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Trae</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.trae/rules/project_rules.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.trae/mcp.json</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Firebase Studio</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.idx/airules.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.idx/mcp.json</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Antigravity</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.gemini/antigravity/mcp_config.json</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio (machine-global MCP config)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">ZCode</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code> + <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">mcp.servers</code> key in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.zcode/config.json</code> (or <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.agents/mcp.json</code> when the project already keeps its servers there, since ZCode stops reading that file once a <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.zcode</code> config exists) + the orientation hook in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.zcode/cli/config.json</code> (user scope: ZCode runs no project-level hooks)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">stdio (binary, no node)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Friday Code</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">friday.md</code> at the project root (the same mandate as <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code>, appended to your own rules and refreshed on every vexp update)</span></td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">instructions only (Friday Code connects to vexp on its side)</td></tr></tbody></table></div><p class="t-body mb-4"><strong class="text-[var(--color-snow)]">Claude Desktop is two surfaces, not one.</strong> <!-- -->The desktop app hosts a <em>Claude Code pane</em>, and that pane is Claude Code: it reads <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.claude.json</code> and the project&#x27;s<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.claude/</code> hooks, so the Claude Code row above already covers it and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> needs nothing extra. Because those hooks inject context into the prompt rather than showing up as tool calls, vexp can be working there without ever appearing in the transcript. The app&#x27;s<!-- --> <em>plain chat</em> is the other surface: it speaks MCP through<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">claude_desktop_config.json</code> and is not written by<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code>. A chat with no repository open has nothing to index, so most people never need that entry, add it only if you want vexp in the plain chat pinned to one workspace.</p><p class="t-body mb-4"><strong class="text-[var(--color-snow)]">Antigravity note.</strong> Antigravity reads the cross-tool <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code> (v1.20.3+) together with<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">GEMINI.md</code> and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.agent/rules/</code>, and keeps its MCP servers in a machine-global file:<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.gemini/antigravity/mcp_config.json</code>. vexp registers its server there once and resolves the workspace per-session, so one configuration serves every project you open.</p><p class="t-body mb-4"><strong class="text-[var(--color-snow)]">Codex note.</strong> vexp&#x27;s entry in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.codex/config.toml</code> names no project: Codex starts vexp in each session&#x27;s own folder, so every project gets its own index. An entry an earlier release pinned to one project is rewritten this way the next time vexp sets Codex up. In a folder that is not a vexp project, vexp answers with no tools and says why, instead of failing Codex&#x27;s start. To make every Codex session use one project&#x27;s index, whatever folder it starts in, run<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp use &lt;path&gt; --pin</code>;<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp use --unpin</code> undoes it.</p><p class="t-body mb-4">Codex runs a project hook only after you trust it. When vexp writes or changes its orientation hook, VS Code shows this step once and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> <!-- -->
1prints it: in the Codex extension for VS Code, open the Codex panel &gt; Settings &gt; Hooks and trust <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp-hint</code>; in a terminal, run<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">codex</code> in the project, type <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">/hooks</code> <!-- -->and approve <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp-hint</code> (trust the folder first if Codex asks). On Windows the hook is registered as<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">cmd /d /c call &quot;&lt;project&gt;\.codex\vexp-hint.cmd&quot;</code>, which runs whether Codex starts it through PowerShell or cmd, and the terminal and the VS Code extension keep separate approvals, so approve it in each one you use. After updating from 3.2.5 on Windows, approve it once more: its command changed.<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor</code> shows which approvals are in place.</p><p class="t-body mb-4"><strong class="text-[var(--color-snow)]">VS Code forks &amp; Open VSX.</strong> <!-- -->The vexp extension also runs in the AI-IDE forks of VS Code, Antigravity, Cursor, Windsurf, Kiro, VSCodium, whose Extensions views are backed by the<!-- --> <a href="https://open-vsx.org" class="underline decoration-[var(--color-ash)] underline-offset-2">Open VSX registry</a> <!-- -->(the Microsoft Marketplace is licensed to Microsoft products only). Search for “vexp” there, or use “Install from VSIX” with the same<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vsix</code> we ship for VS Code, no fork-specific build needed. Trae ships its own extension store and accepts the VSIX directly.</p></section><section id="windows-wsl" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Platform</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Windows + WSL2</h2><p class="t-body mb-4">Inside WSL2, vexp is simply Linux: install the linux-x64 CLI or extension in the WSL side and everything, daemon, index, MCP server, runs there. The one thing to keep straight is that your agents live on <em>both</em> sides of the boundary, and each side reads its own configuration. <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> runs inside WSL, so it can only write WSL-side files.</p><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Agent runs</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Reads its config from</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">What to do</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">In the WSL remote of your editor (Cursor, VS Code + Copilot, Trae, Kiro, …)</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Project-level files inside the repo (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.cursor/mcp.json</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vscode/mcp.json</code>, …)</span></td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Nothing extra, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> inside WSL covers them</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">In the WSL shell (Claude Code, Codex CLI, opencode)</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>The WSL home (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.claude.json</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.codex/config.toml</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code>)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Nothing extra, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> inside WSL covers them</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>As a Windows desktop app (Codex app, Claude Desktop) — and <strong>Windsurf / Devin Desktop</strong>: even with a WSL folder open, Cascade starts MCP servers on the Windows side</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>The Windows profile (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">C:\Users\&lt;you&gt;\…</code>), never the WSL home</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Add the entry by hand on the Windows side, bridged through <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">wsl.exe</code> (below)</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>The same folder opened both in a <strong>Dev Container</strong> (or WSL / SSH remote) and on the Windows host</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Hook scripts and MCP entries in the repo bake the binary path of the environment that ran setup (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">/root/.vscode-server/…/vexp-core</code> vs <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">C:\Users\…\vexp-core.exe</code>)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Each side needs its own paths: the extension re-pins them when it activates in the other environment; if a file still points across, run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Setup Agents</code> there</span></td></tr></tbody></table></div><p class="t-body mb-4">Concretely: the Codex desktop app reads<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">C:\Users\&lt;you&gt;\.codex\config.toml</code>, not the WSL<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.codex/config.toml</code> that<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> writes. Claude Desktop reads<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">%APPDATA%\Claude\claude_desktop_config.json</code>, and the Microsoft Store build relocates it to<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">%LOCALAPPDATA%\Packages\Claude_*\LocalCache\Roaming\Claude\claude_desktop_config.json</code>.</p><h3 class="t-title text-title-md mt-10 mb-3">Bridging a Windows app to vexp in WSL</h3><p class="t-body mb-4">The entry goes in the <em>Windows-side</em> config and crosses into WSL with<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">wsl.exe</code>. Two rules: environment variables set in the MCP entry do <em>not</em> propagate through <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">wsl.exe</code> (that would need WSLENV), so set them on the command line inside WSL instead; and launch via <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">bash -lc</code> so a version-managed Node (nvm) is on PATH. To find the server path, run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">npm root -g</code> inside WSL and append <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">/vexp-cli/mcp/mcp-server.cjs</code>.</p><div class="card-expo-dark overflow-hidden p-0 my-4"><div class="flex items-center gap-2 px-4 py-3 border-b border-[var(--color-ghost)]"><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><span class="ml-2 text-xs font-mono text-[var(--color-fog)]">C:\Users\&lt;you&gt;\.codex\config.toml, Codex desktop app</span></div><div class="p-4 font-mono text-sm"><div class="overflow-x-auto text-[13px] leading-relaxed"><div class="whitespace-pre text-[var(--color-snow)]">[mcp_servers.vexp]</div><div class="whitespace-pre text-[var(--color-snow)]">command = &quot;wsl.exe&quot;</div><div class="whitespace-pre text-[var(--color-snow)]">args = [&quot;--&quot;, &quot;bash&quot;, &quot;-lc&quot;,</div><div class="whitespace-pre text-[var(--color-snow)]">  &quot;VEXP_WORKSPACE=/home/&lt;you&gt;/project exec node /usr/lib/node_modules/vexp-cli/mcp/mcp-server.cjs&quot;]</div></div></div></div><div class="card-expo-dark overflow-hidden p-0 my-4"><div class="flex items-center gap-2 px-4 py-3 border-b border-[var(--color-ghost)]"><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><span class="ml-2 text-xs font-mono text-[var(--color-fog)]">claude_desktop_config.json, Claude Desktop</span></div><div class="p-4 font-mono text-sm"><div class="overflow-x-auto text-[13px] leading-relaxed"><div class="whitespace-pre text-[var(--color-snow)]">{</div><div class="whitespace-pre text-[var(--color-snow)]">  &quot;mcpServers&quot;: {</div><div class="whitespace-pre text-[var(--color-snow)]">    &quot;vexp&quot;: {</div><div class="whitespace-pre text-[var(--color-snow)]">      &quot;command&quot;: &quot;wsl.exe&quot;,</div><div class="whitespace-pre text-[var(--color-snow)]">      &quot;args&quot;: [&quot;--&quot;, &quot;bash&quot;, &quot;-lc&quot;,</div><div class="whitespace-pre text-[var(--color-snow)]">        &quot;VEXP_WORKSPACE=/home/&lt;you&gt;/project exec node /usr/lib/node_modules/vexp-cli/mcp/mcp-server.cjs&quot;]</div><div class="whitespace-pre text-[var(--color-snow)]">    }</div><div class="whitespace-pre text-[var(--color-snow)]">  }</div><div class="whitespace-pre text-[var(--color-snow)]">}</div></div></div></div><div class="card-expo-dark overflow-hidden p-0 my-4"><div class="flex items-center gap-2 px-4 py-3 border-b border-[var(--color-ghost)]"><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><span class="ml-2 text-xs font-mono text-[var(--color-fog)]">%USERPROFILE%\.codeium\windsurf\mcp_config.json, Windsurf / Devin Desktop (Cascade)</span></div><div class="p-4 font-mono text-sm"><div class="overflow-x-auto text-[13px] leading-relaxed"><div class="whitespace-pre text-[var(--color-snow)]">{</div><div class="whitespace-pre text-[var(--color-snow)]">  &quot;mcpServers&quot;: {</div><div class="whitespace-pre text-[var(--color-snow)]">    &quot;vexp&quot;: {</div><div class="whitespace-pre text-[var(--color-snow)]">      &quot;command&quot;: &quot;wsl.exe&quot;,</div><div class="whitespace-pre text-[var(--color-snow)]">      &quot;args&quot;: [&quot;-d&quot;, &quot;Ubuntu&quot;, &quot;--&quot;, &quot;bash&quot;, &quot;-lc&quot;,</div><div class="whitespace-pre text-[var(--color-snow)]">        &quot;VEXP_WORKSPACE=/home/&lt;you&gt;/project exec node /usr/lib/node_modules/vexp-cli/mcp/mcp-server.cjs&quot;],</div><div class="whitespace-pre text-[var(--color-snow)]">      &quot;alwaysAllow&quot;: [&quot;run_pipeline&quot;, &quot;get_skeleton&quot;, &quot;verify_done&quot;, &quot;expand_vexp_ref&quot;]</div><div class="whitespace-pre text-[var(--color-snow)]">    }</div><div class="whitespace-pre text-[var(--color-snow)]">  }</div><div class="whitespace-pre text-[var(--color-snow)]">}</div></div></div></div><p class="t-body mb-4">Cascade reads that one file and no project-level one; quit and reopen Windsurf after editing it. Devin Desktop Next (the beta build) is a separate install with its own copy at <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">%USERPROFILE%\.codeium\windsurf-next\mcp_config.json</code>; the same entry goes there. <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> run inside WSL prints this entry filled in with your real paths, ready to paste. Devin Local (the agent in Devin Desktop) reads <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.devin/mcp_config.json</code> from the project, which setup writes; if it too runs on the Windows side, the same entry goes in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">%APPDATA%\devin\mcp_config.json</code>.</p><p class="t-body mb-4">With more than one distro installed, pin it:<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">args = [&quot;-d&quot;, &quot;Ubuntu&quot;, &quot;--&quot;, …]</code>. These bridged entries pin one workspace by design, a Windows-side config cannot follow whichever WSL project you happen to open, so point<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_WORKSPACE</code> at the repo that app should use.</p><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash
1)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor</code> runs inside WSL and cannot see Windows-side configs: if an agent ignores vexp even though setup reported success, first check which side of the boundary that agent reads its config from. In a WSL remote, editor extensions install into the WSL extension host, let the editor pick the package (it selects linux-x64) rather than hand-downloading a VSIX.</div></section><section id="multi-repo" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Advanced</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Multi-Repo Workspaces</h2><p class="t-body mb-4">vexp can index multiple repositories as a unified workspace and detect relationships between them, entirely on your machine. Useful for monorepos split across repos, frontend + backend pairs, and microservices.</p><h3 class="t-title text-title-md mt-10 mb-3">Setup</h3><p class="t-body mb-4">Create <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/workspace.json</code> in your primary repo, or click<!-- --> <strong class="text-[var(--color-snow)]">Add / Connect Repository</strong> in the sidebar, or run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp</code> in a terminal and pick<!-- --> <strong class="text-[var(--color-snow)]">Repos &amp; Workspace</strong> to list connected repos or add one from the CLI (the plan&#x27;s repo limit is enforced; a running daemon indexes the new repo automatically).</p><div class="card-expo-dark overflow-hidden p-0 my-4"><div class="flex items-center gap-2 px-4 py-3 border-b border-[var(--color-ghost)]"><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><span class="ml-2 text-xs font-mono text-[var(--color-fog)]">workspace.json</span></div><div class="p-4 font-mono text-sm"><div class="overflow-x-auto text-[13px] leading-relaxed"><div class="whitespace-pre text-[var(--color-snow)]">{</div><div class="whitespace-pre text-[var(--color-snow)]">  &quot;name&quot;: &quot;my-project&quot;,</div><div class="whitespace-pre text-[var(--color-snow)]">  &quot;repos&quot;: [</div><div class="whitespace-pre text-[var(--color-snow)]">    { &quot;alias&quot;: &quot;my-project&quot;,  &quot;path&quot;: &quot;.&quot; },</div><div class="whitespace-pre text-[var(--color-snow)]">    { &quot;alias&quot;: &quot;frontend&quot;, &quot;path&quot;: &quot;../frontend&quot; },</div><div class="whitespace-pre text-[var(--color-snow)]">    { &quot;alias&quot;: &quot;shared&quot;,   &quot;path&quot;: &quot;../shared-lib&quot; }</div><div class="whitespace-pre text-[var(--color-snow)]">  ]</div><div class="whitespace-pre text-[var(--color-snow)]">}</div></div></div></div><p class="t-body mb-4">Paths are relative to the folder that <em>contains</em> the<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/</code> directory: use <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">&quot;.&quot;</code> <!-- -->for that root itself, and a subfolder (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">packages/api</code>) or a sibling (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">../shared-lib</code>) for every other repo. Listing the root with <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">&quot;.&quot;</code> is optional — the primary is always served, and always under its folder name as its alias (an alias you write on the<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">&quot;.&quot;</code> entry is ignored). The<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">workspace_id</code> key is also accepted in place of<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">
1name</code>.</p><h3 class="t-title text-title-md mt-10 mb-3">Index the workspace</h3><p class="t-body mb-4">A workspace is indexed <strong class="text-[var(--color-snow)]">as a whole</strong>, not one repo at a time. After creating <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">workspace.json</code>, index every repo in the list in one step, then point your agent&#x27;s MCP server at the workspace root.</p><div class="my-6"><div class="flex gap-1 mb-4 p-1 rounded-md bg-[var(--color-slate)] border border-[var(--color-ghost)] w-fit"><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 bg-[var(--color-snow)] text-[var(--color-void)]">VS Code</button><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 text-[var(--color-fog)] hover:text-[var(--color-ash)]">CLI</button></div><p class="t-body mb-4">Open the workspace root (the folder holding<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/workspace.json</code>), or click<!-- --> <strong class="text-[var(--color-snow)]">Add / Connect Repository</strong>. vexp loads every repo in the list and indexes any that aren&#x27;t up to date.</p></div><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp index</code> run inside any single repo of a workspace indexes the <em>entire</em> workspace, not just that folder. Your plan&#x27;s repo limit still applies, repos beyond it are skipped with a note in the output. If the daemon is already running you don&#x27;t need to restart it — it watches<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">workspace.json</code> and picks up a newly added repo automatically within a few seconds.</div><h3 class="t-title text-title-md mt-10 mb-3">Cross-repo edge detection</h3><p class="t-body mb-4">vexp automatically detects five kinds of relationship across repos:</p><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Type</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">How vexp detects it</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Example</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">API contract</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">OpenAPI / Swagger spec files (openapi.yaml/.yml/.json, swagger.json/.yaml, api.yaml/.yml — at the repo root or under src/, api/, docs/, spec/); each declared endpoint is linked to the workspace&#x27;s other repos as potential consumers</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Backend exposes /api/users; frontend fetches it</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Shared types</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">package.json dependency matching between repos</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Both repos import @company/shared-types</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors">
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">Env contract</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.env.example keys matched to process.env / os.environ usage</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Backend defines DATABASE_URL; worker reads it</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Manifest reference</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">JSON manifest entries that name another workspace repo by alias or by a relative path into it</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">catalog.json points at ../shared-lib/schema</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Doc authority link</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Links in README.md, AUTHORITY.md, INDEX.md, MANIFEST.md, CATALOG.md, REFERENCES.md or ARCHITECTURE.md that point at a sibling repo (GitHub URL or relative path); links inside code fences are ignored</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">README says &quot;the contract lives in ../api-spec/&quot;</td></tr></tbody></table></div><h3 class="t-title text-title-md mt-10 mb-3">Querying across repos</h3><ul class="list-disc list-inside space-y-1.5 text-[var(--color-ash)] mb-4 ml-2"><li><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code> and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_context_capsule</code> <!-- -->query all indexed repos by default.</li><li>Scope with <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">repos: [&quot;backend&quot;]</code>.</li><li>Use <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">cross_repo: true</code> on<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_impact_graph</code> and<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">search_logic_flow</code> to trace across repo boundaries.</li><li>Use <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">repo: &quot;alias&quot;</code> on<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_skeleton</code> to target a specific repo — the alias is the one <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code> prints next to each file. The alias is optional: an absolute path pins its repo, and a repo-relative path is looked up in the primary first, then in every connected repo.</li><li>Call <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">index_status</code> to see available repo aliases.</li><li>From the CLI: <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp capsule --repos backend,shared</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp impact &lt;fqn&gt; --cross-repo</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp flow &lt;start&gt; &lt;end&gt; --cross-repo</code>.</li></ul><h3 class="t-title text-title-md mt-10 mb-3">Git worktrees and parallel agents</h3><p class="t-body mb-4">Agent harnesses create a linked git worktree per parallel task (Claude Code under<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.claude/worktrees/</code>, Cursor&#x27;s background agents, or your own <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">git worktree add</code>). A worktree is a full copy of the checkout, and it is the same project, and vexp treats it that way everywhere. The generated git hooks detect a linked worktree from <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.git</code>&#x27;
1s own <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">gitdir</code> line — no path convention, so every agent is covered — and skip per-worktree indexing (set<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_WORKTREE_INDEX=1</code> to opt back in); the login supervisor (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp serve</code>) never resurrects worktree daemons after a reboot and staggers the daemons it does bring back. An agent session working inside a worktree can still start a daemon there on demand; it lives for the session, shares one license slot with its repository, and is not revived at boot. Submodules are separate projects and are untouched by all of this.</p><h3 class="t-title text-title-md mt-10 mb-3">Codex across several workspaces</h3><p class="t-body mb-4">Nothing to switch: Codex&#x27;s vexp entry names no project, so each Codex session uses the index of the folder it starts in. To make every Codex session use one workspace instead, run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp use &lt;workspacePath&gt; --pin</code>;<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp use --unpin</code> undoes it.</p><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>Opening a secondary repo on its own still loads the whole workspace, thanks to a small backlink vexp writes into the secondary repo&#x27;s<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/</code> during setup.</div></section><section id="local-llm" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Optional</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Local LLM (optional)</h2><p class="t-body mb-4">vexp ships an <em>optional</em> on-device AI layer that improves prompt preprocessing and compresses the context further. Everything runs on your machine, no cloud, no account, no code leaving your laptop.</p><p class="t-body mb-4">Multi-language prose compression: language detection covers 15 languages: English, Italian, French, German, Spanish, Portuguese, Russian, Chinese, Japanese, Korean, Arabic, Hindi, Turkish, Dutch, Polish.</p><h3 class="t-title text-title-md mt-10 mb-3">Install &amp; manage</h3><p class="t-body mb-4">One-time download (~3.5 GB). Files stay on disk after a disable, so re-enabling is instant. Requires at least 6 GB of RAM; below that the installer declines and vexp stays on the built-in rule-based compressor. On NVIDIA Linux/Windows machines, a one-time CUDA plugin (~62 MB) and CUDA 12 runtime (~550 MB) are also downloaded automatically.</p><div class="my-6"><div class="flex gap-1 mb-4 p-1 rounded-md bg-[var(--color-slate)] border border-[var(--color-ghost)] w-fit"><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 bg-[var(--color-snow)] text-[var(--color-void)]">VS Code</button><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 text-[var(--color-fog)] hover:text-[var(--color-ash)]">CLI</button></div><p class="t-body mb-4">The sidebar&#x27;s Local LLM section shows the model status and these buttons:</p><ul class="list-disc list-inside space-y-1.5 text-[var(--color-ash)] mb-4 ml-2"><li><strong class="text-[var(--color-snow)]">Install LLM</strong> (primary, blue), when not yet installed. A one-time first-run notification (Enable now / Learn more / Not now) also offers this.</li><li><strong class="text-[var(--color-snow)]">Start LLM</strong> (primary, blue), when installed but disabled.</li><li><strong class="text-[var(--color-snow)]">Check LLM updates</strong> (secondary), shown only while the LLM is active; compares your model with upstream without downloading.</li><li><strong class="text-[var(--color-snow)]">Disable LLM</strong> (red, destructive), when active. Files stay on disk.</li><li><strong class="text-[var(--color-snow)]">LLM Status</strong>, writes the full diagnostic (hardware, files, backends registered) to the &#x27;vexp: LLM&#x27; output channel.</li></ul></div><p class="t-body mb-4">Extension users need none of these commands: the sidebar&#x27;s<!-- --> <strong>Install LLM</strong> / <strong>Start LLM</strong> / <strong>Disable LLM</strong> <!-- -->buttons drive the bundled binary directly. One thing to know either way: the daemon builds its compressor when it starts, so enabling the model changes nothing until the daemon is restarted — <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Restart Daemon</code> from the Command Palette, or <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp daemon-cmd restart</code>. When the sidebar shows &quot;LLM is configured but this daemon is running the rule compressor&quot;, that is the case it describes; the banner carries a <strong>Restart daemon</strong> <!-- -->button and the Start/Install actions offer the restart themselves.</p><h3 class="t-title text-title-md mt-10 mb-3">GPU acceleration</h3><p class="t-body mb-4">Works the same in both distributions. On Apple Silicon, Metal is detected and used automatically; Intel Macs run the model on CPU by design. On Linux or Windows with an NVIDIA GPU, CUDA is detected and used automatically, no flag or environment variable is needed. If no usable GPU is found, inference silently falls back to CPU. GPU preference is a config setting: <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">prefer_gpu = false</code> under<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">[llm]</code> in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp/config.toml</code> forces CPU inference. <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">flash_attention = &quot;auto&quot; | &quot;on&quot; | &quot;off&quot;</code> <!-- -->(same <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">[llm]</code> table; env default<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_FLASH_ATTENTION</code>) — set &quot;off&quot; if your GPU crashes while running the model.</p><p class="t-body mb-4">NVIDIA GPUs are supported on Linux and Windows; a one-time CUDA plugin download is fetched automatically. The first GPU inference may take a few seconds to warm up.</p><p class="t-body mb-4">GPU offload requires an NVIDIA driver at least as new as CUDA 12.8 (570.xx or newer); on older drivers inference falls back to CPU until the driver is updated. If a GPU attempt ever crashes the daemon, vexp writes<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp/gpu-unusable</code> and runs the model on CPU from then on. Delete that file after a driver update to retry the GPU (upgrading vexp retries once automatically). If the file says the crash happened while running the model, delete it and set <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">flash_attention = &quot;off&quot;</code> under<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">[llm]</code> to keep the GPU.</p><h3 class="t-title text-title-md mt-10 mb-3">Use your own server (optional)</h3><p class="t-body mb-4">Instead of the ~3.5 GB download, point vexp at any OpenAI-compatible server via<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">endpoint</code> / <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">endpoint_model</code> /<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">endpoint_api_key</code> under <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">[llm]</code> in<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp/config.toml</code> (llama.cpp llama-server, LM Studio, vLLM, Ollama /v1, AMD Lemonade, FastFlowLM on Ryzen AI NPUs). The endpoint is tried first at daemon start, with automatic fallback to the local model, then the rule-based compressor.</p><h3 class="t-title text-title-md mt-10 mb-3">Share one model across environments</h3><p class="t-body mb-4">The model is a single ~3.5 GB GGUF file, identical on every platform, stored under the OS data directory: <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.local/share/vexp/models/vexp-devmind-v1/</code> <!-- -->on Linux (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">/root/.local/share/…</code> in a container running as root), <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/Library/Application Support/vexp/models/…</code> on macOS, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">%APPDATA%\vexp\models\…</code> on Windows. Every Dev Container, WSL distro or machine that installs it downloads its own copy unless you share one. Three ways, best first:</p><p class="t-body mb-4"><strong>One shared volume.</strong> Mount a named Docker volume at the default models directory in every container; install once, and in every other container<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup-llm --install</code> (or the sidebar&#x27;s<!-- --> <strong>Install LLM</strong>) finds the file already there, verifies its size and skips the download — the step only writes that container&#x27;s config.</p><div class="card-expo-dark overflow-hidden p-0 my-4"><div class="flex items-center gap-2 px-4 py-3 border-b border-[var(--color-ghost)]"><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><span class="ml-2 text-xs font-mono text-[var(--color-fog)]">.devcontainer/devcontainer.json</span></div><div class="p-4 font-mono text-sm"><div class="overflow-x-auto text-[13px] leading-relaxed"><div class="whitespace-pre text-[var(--color-snow)]">&quot;mounts&quot;: [</div><div class="whitespace-pre text-[var(--color-snow)]">  &quot;source=vexp-models,target=/root/.local/share/vexp/models,type=volume&quot;</div><div class="whitespace-pre text-[var(--color-snow)]">]</div></div></div></div><p class="t-body mb-4"><strong>Reuse the host&#x27;s copy.</strong> The same mount as a bind mount of the host folder (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">source=${localEnv:APPDATA}/vexp/models</code> <!-- -->on Windows) needs no second copy at all. The model is memory-mapped, and reading it through Docker Desktop&#x27;s file sharing is slow: the first calls after a start can exceed <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">timeout_ms</code>, which falls back to the rule compressor for that call. Fine when disk space matters more than warm-up time.</p><p class="t-body mb-4"><strong>One server, many clients.</strong> Serve the GGUF once on the host (llama.cpp <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">llama-server</code>, LM Studio, Ollama) and point every environment at it with <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">endpoint</code> as above —<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">http://host.docker.internal:8080/v1</code> from a container. No model files anywhere else, and inference runs on the host&#x27;s GPU, which containers only get with the NVIDIA container toolkit. Any other location works too:<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">model_path</code> under <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">[llm]</code> in<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp/config.toml</code> names the file directly. The CUDA plugin is per-platform and is not shared.</p><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash
1)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>The local LLM is entirely optional. Everything else in vexp works without it.</div></section><section id="configuration" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Reference</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Configuration</h2><p class="t-body mb-4">vexp works out of the box. Tune it via VS Code settings,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp.toml</code>, environment variables, or ignore files.</p><h3 class="t-title text-title-md mt-10 mb-3">VS Code settings</h3><p class="t-body mb-4">All under the <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.</code> prefix in Settings or your<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">settings.json</code>:</p><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Setting</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Type</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Default</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Description</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.enabled</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">boolean</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">true</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Master toggle for the extension</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.guardStrict</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">boolean</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">false</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Install the Grep/Glob deny hooks when configuring agents (opt-in). When off, agent setup removes any previously installed vexp guard hooks.</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.maxContextTokens</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">number</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">8000</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Maximum tokens per context capsule</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.skeletonDetail</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">enum</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">&quot;standard&quot;</td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">minimal / standard / detailed</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.gitHooksInstall</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">boolean</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">true</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Off: vexp removes its git hooks from this clone and does not reinstall them, like answering Skip; back on, they return (or the hooks question is asked). The index still refreshes through the file watcher</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.multiRepo.enabled</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">boolean</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">true</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Multi-repo workspace support</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.multiRepo.workspaceConfig</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">string</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">&quot;.vexp/workspace.json&quot;</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Path to the workspace config</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.telemetry.enabled</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">boolean</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">false</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Anonymous usage telemetry (opt-in; never code content)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.mcpPort</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">number</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">7821</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">MCP HTTP port, used only when vexp.codexMcpTransport is set to http</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.codexMcpTransport</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">enum</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">&quot;direct&quot;</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">How vexp configures the Codex IDE MCP server (direct stdio vs VS Code-managed HTTP); a config you wrote by hand is left untouched</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.binaryPath</code></td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">string</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">&quot;&quot;</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Override the vexp-core binary path (escape hatch)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.logLevel</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">enum</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">&quot;warn&quot;</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">error / warn / info / debug</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.personalMode</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">boolean</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">false</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Skip agent configs + git hooks for this workspace</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.hideInternalFiles</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">boolean</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">true</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Hide .vexp internal files from the explorer</td></tr></tbody></table></div><h3 class="t-title text-title-md mt-10 mb-3">.vexp/vexp.toml</h3><p class="t-body mb-4">Optional file at <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp.toml</code> inside the repo (all keys top-level — no <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">[index]</code> table). Useful for ranking hints and indexing limits:</p><div class="card-expo-dark overflow-hidden p-0 my-4"><div class="flex items-center gap-2 px-4 py-3 border-b border-[var(--color-ghost)]"><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><span class="ml-2 text-xs font-mono text-[var(--color-fog)]">.vexp/vexp.toml</span></div><div class="p-4 font-mono text-sm"><div class="overflow-x-auto text-[13px] leading-relaxed"><div class="whitespace-pre text-[var(--color-snow)]">max_file_size_kb = 512        # skip files larger than this; 0 disables the cap</div><div class="whitespace-pre text-[var(--color-snow)]">max_context_tokens = 8000     # default context capsule budget</div><div class="whitespace-pre text-[var(--color-snow)]">log_level = &quot;warn&quot;</div><div class="whitespace-pre text-[var(--color-snow)]">priority_paths = [&quot;src/core&quot;, &quot;src/api&quot;]      # rank these higher</div><div class="whitespace-pre text-[var(--color-snow)]">depriority_paths = [&quot;generated&quot;, &quot;vendor&quot;]    # rank these lower</div><div class="whitespace-pre text-[var(--color-snow)]">filter_secrets = true         # default; set false to disable secret filtering</div><div class="whitespace-pre text-[var(--color-snow)]">tests_gate = &quot;instruct&quot;       # stop-gate mode for impacted tests:</div><div class="whitespace-pre text-[var(--color-fog)]">                              # &quot;instruct&quot; (default) blocks once naming the exact</div><div class="whitespace-pre text-[var(--color-fog)]">                              # tests to run; &quot;run&quot; executes them and blocks only</div><div class="whitespace-pre text-[var(--color-fog)]">                              # on red; &quot;off&quot; disables. Env override: VEXP_TESTS_GATE</div><div class="whitespace-pre text-[var(--color-snow)]">exclude_patterns = [&quot;
1generated/**&quot;, &quot;vendor/**&quot;]  # repo-root-relative globs; a bare pattern also matches at any depth</div><div class="whitespace-pre text-[var(--color-snow)]">delivery_ignore = &quot;.distignore&quot;  # delivery boundary: pivots outside the package are tagged &quot;(not shipped)&quot;;</div><div class="whitespace-pre text-[var(--color-fog)]">                                 # unset = auto-detect .distignore, then .npmignore</div><div class="whitespace-pre text-[var(--color-snow)]">stage_manifest = false   # pre-commit hook stages .vexp/manifest.json into the commit when true</div><div class="whitespace-pre text-[var(--color-snow)]">output_mode = &quot;v2&quot;       # compact output; &quot;legacy&quot; = plain-text output</div><div class="whitespace-pre text-[var(--color-snow)]">scope_gate = &quot;advisory&quot;  # &quot;off&quot; / &quot;advisory&quot; (report only) / &quot;strict&quot;</div><div class="whitespace-pre text-[var(--color-snow)]">holdback_pct = 10        # 0-50; 0 disables the measurement holdback</div><div class="whitespace-pre text-[var(--color-snow)]">ambient_seed = true      # false = bare hint instead of the orientation seed</div><div class="whitespace-pre text-[var(--color-snow)]">ambient_decay_after = 3  # hints served per session before going quiet; 0 disables (env: VEXP_AMBIENT_DECAY)</div><div class="whitespace-pre text-[var(--color-snow)]">query_stemming = true    # typed questions (25 words or fewer) also try a stem of each plain word (validated -&gt; validat*); pasted issues stay literal; false = never (env: VEXP_QUERY_STEMMING=0)</div><div class="whitespace-pre text-[var(--color-fog)]"># plan limits (max_nodes / max_repos) cannot be set here — they come from your license</div></div></div></div><p class="t-body mb-4"><strong class="text-[var(--color-snow)]">In a multi-repo workspace</strong>, the primary workspace&#x27;s <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp.toml</code> is the default for every connected repository. A connected repo needs its own file only where it wants to differ, and any key it sets there wins for that repo; keys it leaves out come from the workspace. So raising <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">max_file_size_kb</code> once on the primary applies to all of them.</p><p class="t-body mb-4">The file may be UTF-8, with or without a byte-order mark, or UTF-16 as Windows PowerShell and Notepad save it. A file that cannot be read or parsed, or that has a setting of the wrong type, gets one warning in the log naming the file (and the setting); the whole file is then ignored and the defaults apply (in a connected repo, the workspace&#x27;s settings). vexp still starts.</p><h3 class="t-title text-title-md mt-10 mb-3">Delivery boundary</h3><p class="t-body mb-4">vexp indexes the working tree — shipped code, tests, docs, anything<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.gitignore</code> does not cover. A project delivered as a package (a WordPress plugin ZIP, an npm tarball) ships a subset, and the file that says which is not <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.gitignore</code>: it is<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.distignore</code> (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">wp dist-archive</code>) or<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.npmignore</code>. When the repo root has one of those — or <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">delivery_ignore</code> names your own gitignore-syntax file —<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code> adds a header line<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">&gt; delivery boundary: .distignore — 2 of 5 pivots are outside the package</code> <!-- -->and tags each such pivot <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">(not shipped)</code>, so a file:line citation says whether the code is delivered. Ranking is unchanged; without such a file the output is exactly as before. It is an annotation, not a check of the package contents.</p><p class="t-body mb-4">A source file over <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">max_file_size_kb</code> is not indexed at all: its symbols and the calls it makes are invisible to <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">impact</code>,<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">search</code> and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code>. Every such skip is recorded in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/coverage.json</code>, flagged by<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor</code> and the <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">index_status</code> tool, printed after <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp index</code>, and disclosed in the header of every pipeline answer. Files matching<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">exclude_patterns</code> are out by choice: they are not counted as oversized and never appear in the coverage warning — after adding a pattern, run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp index</code> once to refresh<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">coverage.json</code>.</p><h3 class="t-title text-title-md mt-10 mb-3">Environment variables</h3><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Variable</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">When to set it</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors">
1<td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_CORE_PATH</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Bundled binary won&#x27;t run, point at a locally-built vexp-core</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_HOME</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Override the home directory used for ~/.vexp/ state (license, config, daemon registry). Set this when running inside a sandboxed environment (e.g. Codex, containers, CI) where the OS-resolved home directory differs from the real user profile. Must be an absolute path.</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_NO_AUTOSTART_INSTALL=1</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Don&#x27;t install login autostart on first vexp setup</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_PORT=&lt;port&gt;</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">MCP HTTP port (default 7821), set if 7821 is taken</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_TRACE=1</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Verbose trace mode, same as -i/--trace (IPs / tokens / home paths redacted)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_NO_AUTOSTART=1</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Disable the lazy daemon/MCP bootstrap the CLI performs before most commands</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_OFFLINE=1</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Stay fully offline: disables all license network calls (14-day grace applies)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_SKIP_UPDATE_CHECK=1</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Skip the advisory npm update check (same as --skip-update-check)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_WORKSPACE=&lt;path&gt;</code></td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">Pin workspace resolution (honored before CLAUDE_PROJECT_DIR); vexp doctor warns when a global pin points at the wrong repo</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_OUTPUT_MODE=&lt;v2|legacy&gt;</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Default for the output_mode config key</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_TESTS_GATE=&lt;off|instruct|run&gt;</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Per-session override of tests_gate</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_AMBIENT_DECAY=&lt;n&gt;</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Override ambient_decay_after</td></tr></tbody></table></div><h3 class="t-title text-title-md mt-10 mb-3">Manifest &amp; git</h3><p class="t-body mb-4"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/index.db</code> is local-only (gitignored by default).<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/manifest.json</code> contains a small list of content hashes and is committed to git, clones rebuild incrementally from it (typically &lt; 5 s on a 5 000-file repo). The pre-commit hook refreshes the manifest but does not stage it into your commit automatically; opt in with<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">stage_manifest = true</code> in<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp.toml</code>. A merge driver auto-resolves manifest conflicts. Git hooks (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">pre-commit</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">post-checkout</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">post-merge</code>) keep the index in sync. Existing hooks coexist via marker-delimited blocks.</p><p class="t-body mb-4">VS Code asks once per project whether to install them. Skip is remembered for this clone in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/git-hooks.declined</code> (never committed, so a teammate does not inherit it): vexp removes the hooks it had installed and the daemon no longer puts them back. <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp hooks remove</code>, personal mode and the <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.gitHooksInstall</code> setting turned off record the same answer (the last two withdraw it once you undo them);<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp hooks install</code> <!-- -->reinstalls them and withdraws it. Without the hooks the index still refreshes: the daemon watches the tree while it runs and reconciles it periodically.</p><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash
1)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>vexp hooks can never fail a commit, merge or checkout (they are fail-open) and are repaired on every daemon start unless declined for this clone. If your repo uses a custom <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">core.hooksPath</code> <!-- -->(e.g. husky), hooks installed in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.git/hooks</code> never run — vexp detects and reports this.</div><h3 class="t-title text-title-md mt-10 mb-3">Ignore files</h3><p class="t-body mb-4">vexp honours <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.gitignore</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.ignore</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexpignore</code> and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp_ignore</code> at every level of the tree, plus <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.git/info/exclude</code> and git&#x27;s global excludes file, all in gitignore syntax: negations, rules starting with a slash (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">/chatlogs/</code>) and bare folder names work as in git. The live watcher applies exactly the rules of a full scan, together with<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">exclude_patterns</code>, the size and minified limits and the secret filter, so a file saved while vexp runs is indexed only if a full index would include it. A change to an ignore file in the project or to<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.git/info/exclude</code> applies within seconds, without a restart, and a file it excludes is removed from the index with its change notes. Common directories are excluded by default:<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">node_modules</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.git</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">target</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">dist</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.next</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">__pycache__</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">build</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vendor</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">Pods</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">DerivedData</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.expo</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">venv</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.venv</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">site-packages</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.tox</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.gradle</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.m2</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">bin/Debug</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">bin/Release</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">obj</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">coverage</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.nyc_output</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">test-results</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">playwright-report</code>. Nested git checkouts (worktrees, submodules) are pruned as whole subtrees, and minified assets (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">*.min.js</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">*.min.css</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">*.bundle.js</code>, ...) are skipped by filename.</p><p class="t-body mb-4"><strong class="text-[var(--color-snow)]">Notes kept in the repository.</strong> <!-- -->A Markdown file that records the questions you ask vexp is, by construction, the strongest text match for those same questions. Since 3.2.0 a documentation section that <em>records</em> a question (a <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">Q1:</code> label, an expected/got note, a list of questions) is demoted the way CHANGELOG files already are, and files under <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">notes/</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">journal/</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">diary/</code> or <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">scratch/</code> are treated as records, as are the reports an agent writes when it is done (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">MISSION_ACCOMPLISHED.md</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">fixes_summary_final.md</code>); a FAQ that states the question it answers is not touched. Agent instruction files and folders (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.claude/</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">CLAUDE.md</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code>) rank as repository furniture. The pivot&#x27;s why line names the rule (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">quotes the question</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">diary path</code>). To take a folder out of the index entirely, add it to <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexpignore</code> (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">/notes/</code> for a root-anchored rule); an <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">exclude_patterns</code> entry also matches the same name at any depth, so prefer <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexpignore</code> for one specific folder.</p></section><section id="languages" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Reference</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Supported Languages</h2><p class="t-body mb-4">vexp parses 36 languages plus Markdown, CSS/SCSS/LESS stylesheets included. 32 have a dedicated tree-sitter grammar with language-specific extraction. For Vue, Svelte and Astro the<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">&lt;script&gt;</code> block (and Astro&#x27;s<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">---</code> frontmatter) is parsed as TypeScript; for Razor/Blazor the <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">@code</code>/<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">@functions</code> blocks are parsed as C#. Symbols keep their real file line numbers, and every component file gets a <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">component</code>
1 node searchable by name. Templates/markup are not parsed. SQL indexes DDL, tables, views, functions, indexes, triggers from migrations and schema files. Markdown is indexed via a structural heading scan (no tree-sitter). The doc comment directly above a declaration is indexed as the symbol&#x27;s docstring - JSDoc, Python, Go and Rust since the beginning; Dart <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">///</code>, C#<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">/// &lt;summary&gt;</code> (XML stripped), Javadoc and Doxygen blocks, Kotlin, Scala, Swift, C, C++, Objective-C, PHP, Ruby, Bash, PowerShell, Lua and OCaml since 3.2.0 - so a plain-English question can match the words of your comments, not only the words inside identifiers. Licence headers, trailing remarks and pragma lines are not docstrings, and secret-shaped values in a comment are masked before they are stored.</p><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Language</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Extensions</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">TypeScript</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.ts, .tsx</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">JavaScript</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.js, .jsx, .mjs, .cjs</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Python</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.py</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Go</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.go</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Rust</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.rs</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Java</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.java</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">C#</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.cs</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">C</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.c, .h</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">C++</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.cpp, .cc, .cxx, .hpp, .hh, .hxx</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Ruby</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.rb</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Bash</td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">.sh, .bash</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Kotlin</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.kt, .kts</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Scala</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.scala, .sc</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Swift</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.swift</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Dart</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.dart</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">PHP</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.php, .module, .install, .inc, .theme, .profile, .engine (Drupal)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Elixir</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.ex, .exs</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Haskell</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.hs</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">OCaml</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.ml, .mli</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Lua</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.lua</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">R</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.r, .R</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Zig</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.zig</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">HCL / Terraform</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.tf, .hcl</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Objective-C</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.m, .mm</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Clojure</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.clj, .cljs, .cljc</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">F#</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.fs, .fsx, .fsi</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Dockerfile</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Dockerfile, Dockerfile.* (matched by filename, not extension)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors">
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">Vue</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.vue</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Svelte</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.svelte</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Astro</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.astro</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Razor / Blazor</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.razor, .cshtml</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">SQL</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.sql, .ddl, .dml</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">PowerShell</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.ps1, .psm1, .psd1</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Groovy / Gradle</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.groovy, .gvy, .gradle</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Julia</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.jl</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">CSS / SCSS / LESS</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">.css, .scss, .less</td></tr></tbody></table></div><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>JSON is not indexed as a language, with one exception: manifest-shaped files —<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">manifest.json</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">refs.json</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">index.json</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">catalog.json</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">examples.json</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">samples.json</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">registry.json</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">openapi.json</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">swagger.json</code>, and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">*.manifest.json</code> /<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">*-manifest.json</code> / <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">*_manifest.json</code> <!-- -->variants (same for catalog/examples/samples/registry) — are structurally indexed (top-level entr
1ies become searchable nodes, up to 500 per file).<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">package.json</code>, lockfiles, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">tsconfig*.json</code> <!-- -->and other tool configs are never indexed, and nothing under<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/</code> is.</div><h3 class="t-title text-title-md mt-10 mb-3">Markdown indexing</h3><p class="t-body mb-4">Markdown files (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.md</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.mdx</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.markdown</code>) are first-class index nodes. Each file becomes a Document node (named after the file stem); each ATX heading (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">#</code> <!-- -->through <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">######</code>) becomes a nested Section node; each<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">http://</code> or <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">https://</code> URL becomes a Link node (URLs inside fenced code blocks are skipped).</p><p class="t-body mb-4">Planning documents, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">spec.md</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">plan.md</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">tasks.md</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">README.md</code>, ADRs under<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">docs/adr/</code>, RFCs under <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">docs/rfcs/</code>, get a ranking boost when an agent searches for design or architecture context. Surfaced through <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code> and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_skeleton</code> <!-- -->like code files.</p></section><section id="troubleshooting" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Support</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Troubleshooting</h2><p class="t-body mb-4">Pick your distribution for the distro-specific issues, then check the cross-distro table below for the rest.</p><div class="my-6"><div class="flex gap-1 mb-4 p-1 rounded-md bg-[var(--color-slate)] border border-[var(--color-ghost)] w-fit"><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 bg-[var(--color-snow)] text-[var(--color-void)]">VS Code</button><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 text-[var(--color-fog)] hover:text-[var(--color-ash
1)]">CLI</button></div><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Symptom</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Diagnose</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Fix</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Extension does nothing</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Run &#x27;vexp: Doctor (diagnose daemon, license, hooks)&#x27; from the Command Palette — the health report lands in the &#x27;vexp doctor&#x27; Output channel</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Open a folder with a supported source file (or .vexp/manifest.json)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Index never updates</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Show Index Status</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Force Re-index</code></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Bundled binary won&#x27;t run</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">See the binary error in the Output panel</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Set <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.binaryPath</code> in Settings</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">macOS &quot;unidentified developer&quot;</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Only affects binaries copied or downloaded by hand (quarantined files)</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Install via npm or the marketplace (never quarantined). For a hand-copied binary: xattr -d com.apple.quarantine &lt;path&gt;</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Sidebar empty / no repos</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Check status header in the sidebar</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Use <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Start Indexing</code> or reload the window</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Copilot Chat shows no vexp tools / no vexp MCP server</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor</code> (it checks <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vscode/mcp.json</code>); in VS Code: Command Palette → <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">MCP: List Servers</code> → vexp → Show Output</span></td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>MCP tools exist only in Chat <strong>Agent</strong> mode (tools picker → &quot;MCP Server: vexp&quot;); the folder open in VS Code must be the one you set up; on <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">spawn node ENOENT</code> re-run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> (it pins the absolute node path); on Copilot Business/Enterprise an admin must enable the &quot;MCP servers in Copilot&quot; policy</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Hand-downloaded VSIX won&#x27;t install / wrong platform</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Check the file name ends in your platform (e.g. linux-x64)</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Install from the marketplace so the editor picks the platform; for manual installs use the platform-specific <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vsix</code> from Open VSX</span></td></tr></tbody></table></div></div><h3 class="t-title text-title-md mt-10 mb-3">Cross-distro issues</h3><p class="t-body mb-4">These apply whether you use the VS Code extension or the CLI.</p><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Symptom</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Diagnose</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Fix</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Agent can&#x27;t reach vexp</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp daemon-cmd status</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Re-run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code>, or run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor</code> to diagnose daemon/MCP state</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Port 7821 in use</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp daemon-cmd status</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Set <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.mcpPort</code> (VS Code) or <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_PORT</code> (CLI) and re-run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code></span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Daily limit reached (Starter)</td>
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">Status bar shows &quot;daily limit reached&quot;</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Wait until midnight UTC, or upgrade to Pro</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>MCP entry runs the editor itself (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">Cursor.exe …mcp-server.cjs</code>) — connection dies with <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">MCP error -32000</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Open the agent&#x27;s mcp.json: the <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">command</code> is the editor executable instead of <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">node</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Re-run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup</code> — it writes a real node and repairs the broken entry instead of adopting it</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>vexp resolved the workspace to the home directory (agents that spawn MCP servers from <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~</code>, e.g. Antigravity)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor</code> shows <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">resolves to: /home/&lt;you&gt;</code></span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Fixed (the <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp</code> state dir no longer counts as a workspace); to pin a project for such an agent, set <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_WORKSPACE</code> in a project-scoped MCP config</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Codex never gets vexp’s per-prompt orientation</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor</code> (Codex section: project trust and hook approval, per place on Windows)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Approve the hook once: Codex panel &gt; Settings &gt; Hooks &gt; trust <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp-hint</code>, or run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">codex</code> in the project and type <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">/hooks</code>. On Windows approve it in each place you use Codex, and once more after updating from 3.2.5</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors">
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">Daemon refuses to start / status bar shows vexp: workspace cap</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp daemons</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Free a slot with <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp stop &lt;workspace&gt;</code>, then start the daemon again — concurrent-workspace ceilings are per plan (Starter 1, Pro 4, Team 8)</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">LLM &quot;no backends are loaded&quot;</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup-llm --status</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup-llm --status</code> — its runtime library check names what is missing and prints the fix; if plugin files are missing, re-run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup-llm --install</code> (on NVIDIA machines it downloads the CUDA plugin and runtime)</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">LLM out of disk</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">du -sh ~/.local/share/vexp/models</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup-llm --disable</code>, then delete the models folder</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">GPU crash / LLM silently on CPU after a crash</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup-llm --status</code> (shows a &#x27;GPU in use&#x27; verdict and the reason)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>vexp writes <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp/gpu-unusable</code> after a GPU crash and runs the model on CPU. Update the NVIDIA driver to ≥ 570.xx, then delete <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp/gpu-unusable</code> to retry the GPU (upgrading vexp also retries automatically). If the crash happened while running the model, set <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">flash_attention = &quot;off&quot;</code> under <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">[llm]</code> in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp/config.toml</code> to keep the GPU.</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors">
1<td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>LLM “Backends registered: 0” on minimal Linux images (Replit, distroless, trimmed containers)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup-llm --status</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Fixed (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">libgomp.so.1</code> is bundled app-local); on older releases run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">apt-get install libgomp1</code></span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Pro license shows as FREE / 2000 nodes in sandboxed env (Codex, containers)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor</code> (it reports license state under the resolved home, no daemon needed), or check <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/daemon.log</code> for <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">home_dir=</code> — the daemon logs it at startup. (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp index</code> shows it only with <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_LOG_LEVEL=info</code>.)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Set <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_HOME</code> to the real user home in your MCP/agent config (e.g. <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_HOME=C:\Users\yourname</code>)</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Session cost explodes on long-context models (1M-token context windows)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Check the agent transcript: the context keeps growing past ~200k tokens with no compaction</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>On 1M-context sessions every turn re-bills the entire context as cache reads, so any loop that inflates turns multiplies cost. Use the vexp defaults (no strict deny guard), keep <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code> to one orientation call per task, and compact or restart the session when the context passes a few hundred thousand tokens</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Not sure what&#x27;s wrong / agent can&#x27;t reach vexp</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Read-only check of workspace drift, stale daemons, Codex transport, and license (works without a running daemon).</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors">
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">Want logs</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp daemon-cmd logs --follow</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Or open <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/daemon.log</code> directly</span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Want to send us a bug report</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor --report</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Attach <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp-report.md</code> to your message (see below): doctor output, tool-call ledger, log warnings, config — secrets masked, paths visible</span></td></tr></tbody></table></div><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>If none of the above match, the daemon log <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/daemon.log</code> <!-- -->and the index log <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp.log</code> are the next stop.<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp.log</code> is auto-truncated to its last 500 lines when it exceeds 2 MB; <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/daemon.log</code> is rotated on every daemon start — the previous boot&#x27;s log is kept as <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/daemon.log.1</code>.</div><h3 class="t-title text-title-md mt-10 mb-3">Sending a bug report</h3><p class="t-body mb-4"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp doctor --report</code> writes<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp-report.md</code>: the doctor output as printed, the tool-call ledger of the last 30 days (per tool: calls, median, p95, max, how many ran past 30 s, how many ended with no result, and the ten slowest calls), the warnings and errors from the daemon log with repeats collapsed, and your<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.toml</code>. It never contains prompt text or file contents — parameters are reported by length only — and secret-shaped values are masked throughout. File paths are visible, so read it once, then send it to<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">[email protected]</code> or attach it to your issue. The ledger is read straight from the index database, so the report works with the daemon down.<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">--report &lt;file&gt;</code> picks another path.</p><p class="t-body mb-4">The report is deliberately mechanical: numbers and log lines, nothing anyone has to second-guess. If you want your agent&#x27;s observations next to it, paste this prompt into the same session and send the file it produces:</p><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-slate)] font-mono text-sm text-[var(--color-snow)] leading-relaxed whitespace-pre-wrap">Run `npx vexp-cli doctor --report` in this workspace. Then read `.vexp/vexp-report.md` and, using only what happened in this session, write a short &quot;Notes&quot; section at the end: what I asked vexp for, what it returned, where it helped, where it did not, and anything in the report that surprises you. Do not change the sections above your notes. Tell me the path of the file when you are done.</div><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash
1)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>The notes are the agent&#x27;s opinion and the sections above them are measurements; keeping the two apart is what makes the file useful. Add your own line under the notes if there is something the agent could not see.</div></section><section id="uninstall" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Support</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Uninstall</h2><p class="t-body mb-4">A complete removal has two parts: remove the distribution you installed, then (optionally) clean up what vexp wrote on disk. Nothing vexp writes is hidden or system-level, everything lives in your home directory and your project folders.</p><div class="my-6"><div class="flex gap-1 mb-4 p-1 rounded-md bg-[var(--color-slate)] border border-[var(--color-ghost)] w-fit"><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 bg-[var(--color-snow)] text-[var(--color-void)]">VS Code</button><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 text-[var(--color-fog)] hover:text-[var(--color-ash)]">CLI</button></div><ol class="space-y-4 mt-2 list-decimal list-inside text-[var(--color-ash)]"><li><strong class="text-[var(--color-snow)]">Stop the daemon.</strong> <!-- -->Command Palette → <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Stop Indexing</code>, or use the stop button in the vexp sidebar panel.</li><li><strong class="text-[var(--color-snow)]">Uninstall the extension.</strong> <!-- -->Extensions panel → gear icon on <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp</code> → Uninstall, or from a terminal:<div class="card-expo-dark overflow-hidden p-0 my-4"><div class="flex items-center gap-2 px-4 py-3 border-b border-[var(--color-ghost)]"><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><div class="w-2.5 h-2.5 rounded-full border border-[var(--color-wire)]"></div><span class="ml-2 text-xs font-mono text-[var(--color-fog)]">bash</span></div><div class="p-4 font-mono text-sm"><div class="overflow-x-auto text-[13px] leading-relaxed"><div class="whitespace-pre text-[var(--color-snow)]"><span class="text-[var(--color-fog)] select-none">$ </span>
1code --uninstall-extension Vexp.vexp-vscode</div></div></div></div>The native engine is bundled inside the extension, so it is removed with it.</li><li><strong class="text-[var(--color-snow)]">Clean up leftovers.</strong> See the table below. If you also installed the npm CLI, follow the CLI tab as well.</li></ol></div><h3 class="t-title text-title-md mt-10 mb-3">Leftover data (optional cleanup)</h3><p class="t-body mb-4">These are safe to delete once vexp is removed. All of them are plain files and directories, no registry entries, no system services.</p><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">What</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Where</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Notes</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Per-project index</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">In each project root: index database, logs, workspace.json. Delete the folder.</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Global state</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp/</code></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">License files, device id, autostart marker and log, and your answers about which agents to set up (agent-consent.json). Deleting removes your local license copy - keep your key to re-activate later.</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Local LLM models (~3.5 GB)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.local/share/vexp/models</code> (Linux) · <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/Library/Application Support/vexp/models</code> (macOS) · <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">%APPDATA%\vexp\models</code> (Windows)</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">Only present if you installed the optional local LLM.</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Agent config entries</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.claude/CLAUDE.md</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.cursor/rules/vexp.mdc</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">AGENTS.md</code>, …</span></td><td class="py-3 px-4 text-[var(--color-ash)] align-top">vexp sections are marker-delimited - delete the block between the vexp markers. Also remove the &quot;vexp&quot; server entry from MCP configs (~/.claude.json, .cursor/mcp.json, .vscode/mcp.json) and the vexp-guard PreToolUse hook from .claude/settings.json.</td></tr></tbody></table></div><h3 class="t-title text-title-md mt-10 mb-3">If you skipped autostart uninstall</h3><p class="t-body mb-4">Removed the CLI before running <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp autostart uninstall</code>? The login hook is a single per-user file, delete whichever exists:</p><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Platform</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">File</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors">
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">Linux (systemd)</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.config/systemd/user/vexp.service</code></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Linux (XDG)</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.config/autostart/vexp.desktop</code></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Linux (shell profile)</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span>Block between <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]"># vexp-autostart-begin</code> and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]"># vexp-autostart-end</code> in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.bashrc</code> / <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.zshrc</code> / <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.profile</code></span></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">macOS</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/Library/LaunchAgents/io.vexp.serve.plist</code></td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Windows</td><td class="py-3 px-4 text-[var(--color-ash)] align-top"><span><code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp-serve.vbs</code> in the Start Menu Startup folder (<code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup</code>)</span></td></tr></tbody></table></div></section><section id="privacy" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Trust</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Privacy &amp; Security</h2><p class="t-body mb-4">vexp is designed for codebases you can&#x27;t send to the cloud. Everything runs on your machine.</p><ul class="list-disc list-inside space-y-2 text-[var(--color-ash)] mb-4 ml-2"><li><strong class="text-[var(--color-snow)]">Local-only by default.</strong> Zero network calls for parsing, indexing, or querying. Outbound calls are limited to: (1) a once-a-day license check-in that sends only your license token, an anonymous device id and the vexp version — opt out with<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_OFFLINE=1</code>, which disables all license network calls (vexp keeps a 14-day grace period); (2) an advisory CLI update-availability check against the npm registry — cached 4 hours, never blocks a command, and skippable with <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_SKIP_UPDATE_CHECK=1</code> or<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">--skip-update-check</code>; (3) the explicit, opt-in local-LLM model download when you run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp setup-llm</code>. Nothing else ever leaves your machine.</li><li><strong class="text-[var(--color-snow)]">No code execution during indexing.</strong> <!-- -->vexp parses your code with tree-sitter; indexing and querying never execute it. The one exception is opt-in and explicit: <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp verify --run-tests</code> <!-- -->(or <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">tests_gate = &quot;run&quot;</code>) runs your repo&#x27;s own test suite, bounded, at your request.</li><li><strong class="text-[var(--color-snow)]">
1Telemetry is opt-in.</strong> Telemetry is opt-in and off by default. The <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp.telemetry.enabled</code> <!-- -->setting exists for future use; today vexp transmits nothing.</li><li><strong class="text-[var(--color-snow)]">Distribution integrity.</strong> <!-- -->Binaries ship exclusively through npm (with registry integrity checksums) and the VS Code / OpenVSX marketplaces; there is no browser-download channel. macOS binaries carry the Apple toolchain&#x27;s standard ad-hoc signature and are not Developer-ID notarised today: npm and marketplace installs are never quarantined, so Gatekeeper does not evaluate them. If your security policy requires notarised or countersigned artifacts, contact us about the enterprise distribution line.</li><li><strong class="text-[var(--color-snow)]">Secret filtering (default on).</strong> <!-- -->Files named like credentials are dropped at index time:<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.env</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.env.production</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.env.local</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">id_rsa</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">*.pem</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">*.key</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">secrets.yaml</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">secret.md</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">password.json</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">credentials.toml</code>, and similar filename-boundary matches.</li><li><strong class="text-[var(--color-snow)]">Template files allowlisted.</strong> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.env.example</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.env.sample</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.env.template</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.env.test</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">secrets.example.*</code>, and<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">secrets.sample.*</code> are <em>not</em> excluded, they document contracts, not secrets.</li><li><strong class="text-[var(--color-snow)]">Filename boundary matching.</strong> <!-- -->Legitimate source files that just <em>contain</em> the word<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">secret</code>, <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">password</code>, or<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">credential</code> in their name, e.g.<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">src/secret-manager.ts</code>, are <em>not</em> excluded.</li><li><strong class="text-[var(--color-snow)]">
1Custom exclusions.</strong> Add patterns to <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexpignore</code> (gitignore syntax; the older<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp_ignore</code> name is also honored), or set<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">exclude_patterns = [&quot;generated/**&quot;, &quot;vendor/**&quot;]</code> <!-- -->at the top level of <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp.toml</code> — repo-root-relative globs; a bare pattern like <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">dist/**</code> also matches at any depth. To disable the secret filter entirely, set <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">filter_secrets = false</code> at the top level of <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">.vexp/vexp.toml</code>.</li></ul><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>The license system itself doesn&#x27;t need the network: signature verification is offline, and the 14-day grace period covers planes, ferries, and locked-down build machines.</div></section><section id="plans" class="scroll-mt-28 pb-16 border-b border-[var(--color-ghost)] last:border-0 last:pb-0"><span class="t-eyebrow block mb-3">Reference</span><h2 class="t-heading text-2xl md:text-display-md mb-3">Plans &amp; Quotas</h2><p class="t-body mb-4">Quotas at a glance. For prices and the upgrade button,<!-- --> <a class="text-[var(--color-ash)] hover:underline" href="/#pricing">see the full pricing on the homepage</a>.</p><div class="overflow-x-auto my-6"><table class="w-full text-sm border-collapse"><thead><tr class="border-b border-[var(--color-ghost)]"><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Plan</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Nodes</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Repos</th><th class="text-left py-3 px-4 font-mono text-xs tracking-[0.15em] uppercase text-[var(--color-fog)]">Daily calls</th></tr></thead><tbody><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Starter (Free)</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">2,000</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">1</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">20 / day (resets midnight UTC)</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Pro</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">50,000</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">3</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">1,000 / day</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Team</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">unlimited</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">unlimited</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">1,500 / day per workspace</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors">
1<td class="py-3 px-4 text-[var(--color-ash)] align-top">Lifetime Tier 1</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">10,000</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">1</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">500 / day</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Lifetime Tier 2</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">50,000</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">3</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">1,000 / day</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Lifetime Tier 3</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">100,000</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">unlimited</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">1,200 / day</td></tr><tr class="border-b border-[var(--color-ghost)]/50 hover:bg-[var(--color-slate)]/40 transition-colors"><td class="py-3 px-4 text-[var(--color-ash)] align-top">Lifetime Tier 4</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">unlimited</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">unlimited</td><td class="py-3 px-4 text-[var(--color-ash)] align-top">1,500 / day</td></tr></tbody></table></div><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>Daily calls count only against <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">run_pipeline</code>,<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_context_capsule</code>, and<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">get_skeleton</code>. Memory tools and index status never count, on any plan. Impact graphs and flow analysis are paid-plan features, not part of Starter. Ambient hints and the orientation seed are infrastructure and never count against the budget.</div><div class="my-4 p-4 rounded-xl border border-[var(--color-ghost)] bg-[var(--color-graphite)] text-sm text-[var(--color-ash)] leading-relaxed"><span class="font-mono font-semibold text-[11px] text-[var(--color-ash)] uppercase tracking-[0.1em] mr-2">Note</span>Paid-plan ceilings are a fleet fence, not a meter: they sit far above any interactive day (the heaviest measured usage stays under half the Pro ceiling), and exist so that automated, headless or service use lands on the SDK line. Hitting one refuses the call with a clear message; the daemon stays up and everything else keeps working. Every plan carries a concurrent-workspace ceiling — 1 live daemon on Starter, 4 on Pro, 8 on Team — with the same philosophy.</div><h3 class="t-title text-title-md mt-10 mb-3">What happens at the limits</h3><ul class="list-disc list-inside space-y-1.5 text-[var(--color-ash)] mb-4 ml-2"><li>At 80 % of the node cap, the VS Code extension shows a warning (once per session, on any node-capped plan). CLI-only setups get no 80 % warning.</li><li>At 100 % of the node cap, new nodes stop being added. Your existing index keeps working, no data loss. The VS Code notice and status-bar tooltip, the<!-- --> <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">index_status</code> tool and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp index</code> <!-- -->say how many source files were left out and the estimated size of the whole project, the two numbers you need to size <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">exclude_patterns</code> <!-- -->or pick a plan. The tooltip and <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">index_status</code> drop it once the index fits under the cap again.</li><li>At 20 daily calls, the next call to a quota-affected tool returns a limit-reached error and the daemon shuts down. This stops <em>every</em> vexp tool, not just the quota-affected ones, until the quota resets at midnight UTC. Nothing is lost: your index and session memories are kept on disk and are there when it comes back (or upgrade to Pro/Team, whose ceilings interactive use never reaches).</li></ul><h3 class="t-title text-title-md mt-10 mb-3">License activation</h3><div class="my-6"><div class="flex gap-1 mb-4 p-1 rounded-md bg-[var(--color-slate)] border border-[var(--color-ghost)] w-fit"><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 bg-[var(--color-snow)] text-[var(--color-void)]">VS Code</button><button class="px-3 py-1.5 rounded-md text-xs font-mono transition-colors duration-150 text-[var(--color-fog)] hover:text-[var(--color-ash
1)]">CLI</button></div><p class="t-body mb-4">Run <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">vexp: Activate License Key</code> from the Command Palette and paste your key, or click the magic link in the activation email, vexp activates without any further input.</p></div><h3 class="t-title text-title-md mt-10 mb-3">Daily check-in</h3><p class="t-body mb-4">Once a day, vexp checks in with vexp.dev from every setup: VS Code, the CLI, or an AI agent running vexp on its own. The check-in sends your license token, an anonymous device id (a random string stored in <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">~/.vexp/device.id</code>) and the vexp version, nothing else. It registers the machine against your plan&#x27;s device limit and keeps your license current. Set <code class="font-mono text-sm px-1.5 py-0.5 rounded bg-[var(--color-slate)] text-[var(--color-snow)] border border-[var(--color-ghost)]">VEXP_OFFLINE=1</code> to turn it off; nothing then renews your license key either, so a paid plan lasts until the key&#x27;s own expiry (30 days after its last renewal) and returns at the next check-in.</p><h3 class="t-title text-title-md mt-10 mb-3">Offline use</h3><p class="t-body mb-4">vexp refreshes your license quietly in the background whenever you&#x27;re online. If you stay offline, you keep working at your current plan for at least 14 days; after that vexp falls back to your license key itself, which keeps the paid plan until its own expiry date. Only when that also lapses does vexp drop to Starter — no data loss, and your plan returns automatically the next time you&#x27;re online.</p><h3 class="t-title text-title-md mt-10 mb-3">Account portal</h3><p class="t-body mb-4">Manage your subscription, devices, and team at<!-- --> <a href="https://vexp.dev/account" class="text-[var(--color-ash)] hover:underline" target="_blank" rel="noopener noreferrer">vexp.dev/account</a> <!-- -->(magic-link login). Team owners can add or remove members; each member logs in independently.</p><h3 class="t-title text-title-md mt-10 mb-3">Device limit</h3><p class="t-body mb-4">Each license covers a limited number of devices: Pro 4, Team 4 per seat, Lifetime Tier 1 and Tier 2 one, Tier 3 five, Tier 4 ten. A machine counts from its first check-in, right away when you activate your key and otherwise within a day. Each environment with its own home folder counts as a device of its own: WSL next to Windows, or a dev container. On a lifetime license, a machine over the cap runs at Starter limits until you free a slot at<!-- --> <a href="https://vexp.dev/account/devices" class="text-[var(--color-ash)] hover:underline" target="_blank" rel="noopener noreferrer">vexp.dev/account/devices</a> <!-- -->— your key stays valid, and the plan returns automatically on that machine once a slot is free. A slot is freed only when you remove a device there.</p></section></main></div></div><footer class="relative w-full overflow-hidden border-t border-[var(--color-ghost)] bg-[var(--color-graphite)]"><div class="pointer-events-none absolute left-1/2 top-0 h-px w-1/3 -translate-x-1/2 -translate-y-1/2 rounded-full bg-[var(--color-ash)]/25 blur-sm"></div><div class="pointer-events-none absolute inset-x-0 top-0 h-40" style="background:radial-gradient(40% 120px at 50% 0%, color-mix(in srgb, var(--color-ash) 8%, transparent), transparent)"></div><div class="container-expo relative py-14 lg:py-16"><div class="grid gap-10 xl:grid-cols-3 xl:gap-8"><div class="space-y-4" style="filter:blur(4px);opacity:0;transform:translateY(-8px)"><img src="/vexp-icon.svg" alt="vexp" class="h-8 w-auto"/><p class="text-sm text-[var(--color-fog)]">© 2026 Omniselect di Nicola Alessi. All rights reserved.</p><p class="font-mono text-xs text-[var(--color-fog)]">VAT IT13233920969</p></div><div class="grid grid-cols-2 gap-8 md:grid-cols-4 xl:col-span-2"><div style="filter:blur(4px);opacity:0;transform:translateY(-8px)"><h3 class="t-eyebrow text-[var(--color-fog)]">Product</h3><ul class="mt-4 space-y-2.5"><li><a class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash
1)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="/#pricing">Pricing</a></li><li><a class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="/benchmark">Benchmark</a></li><li><a class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="/docs">Docs</a></li><li><a class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="/changelog">Changelog</a></li></ul></div><div style="filter:blur(4px);opacity:0;transform:translateY(-8px)"><h3 class="t-eyebrow text-[var(--color-fog)]">Resources</h3><ul class="mt-4 space-y-2.5"><li><a class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="/blog">Blog</a></li><li><a target="_blank" rel="noopener noreferrer" class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="https://marketplace.visualstudio.com/items?itemName=Vexp.vexp-vscode">VS Code Extension</a></li><li><a target="_blank" rel="noopener noreferrer" class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="https://www.npmjs.com/package/vexp-cli">Standalone CLI</a></li></ul></div><div style="filter:blur(4px);opacity:0;transform:translateY(-8px)"><h3 class="t-eyebrow text-[var(--color-fog)]">Company</h3><ul class="mt-4 space-y-2.5"><li><a class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="/legal">Legal</a></li><li><a class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="/privacy">Privacy</a></li><li><a class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="/terms">Terms</a></li><li><a class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="/refund-policy">Refund Policy</a></li></ul></div><div style="filter:blur(4px);opacity:0;transform:translateY(-8px)"><h3 class="t-eyebrow text-[var(--color-fog)]">Connect</h3><ul class="mt-4 space-y-2.5"><li><a target="_blank" rel="noopener noreferrer" class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="https://github.com/Vexp-ai"><svg class="size-4" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 .5C5.37.5 0 5.87 0 12.5c0 5.3 3.44 9.8 8.21 11.39.6.11.82-.26.82-.58 0-.29-.01-1.04-.02-2.05-3.34.73-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.09-.75.08-.74.08-.74 1.21.09 1.84 1.24 1.84 1.24 1.07 1.83 2.81 1.3 3.5.99.11-.78.42-1.3.76-1.6-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.12-.3-.54-1.52.12-3.18 0 0 1.01-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.29-1.55 3.3-1.23 3.3-1.23.66 1.66.24 2.88.12 3.18.77.84 1.24 1.91 1.24 3.22 0 4.61-2.8 5.62-5.48 5.92.43.37.81 1.1.81 2.22 0 1.6-.01 2.9-.01 3.29 0 .32.22.7.83.58A12 12 0 0 0 24 12.5C24 5.87 18.63.5 12 .5z"></path></svg>GitHub</a></li><li><a target="_blank" rel="noopener noreferrer" class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="https://www.npmjs.com/package/vexp-cli"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-package size-4" aria-hidden="true"><path d="M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z"></path><path d="M12 22V12"></path><polyline points="3.29 7 12 12 20.71 7"></polyline><path d="m7.5 4.27 9 5.15"></path></svg>npm</a></li><li><a target="_blank" rel="noopener noreferrer" class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash
1)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="https://open-vsx.org/extension/Vexp/vexp-vscode"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-package size-4" aria-hidden="true"><path d="M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z"></path><path d="M12 22V12"></path><polyline points="3.29 7 12 12 20.71 7"></polyline><path d="m7.5 4.27 9 5.15"></path></svg>Open VSX</a></li><li><a target="_blank" rel="noopener noreferrer" class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="https://marketplace.visualstudio.com/items?itemName=Vexp.vexp-vscode"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-code-xml size-4" aria-hidden="true"><path d="m18 16 4-4-4-4"></path><path d="m6 8-4 4 4 4"></path><path d="m14.5 4-5 16"></path></svg>VS Code Marketplace</a></li><li><a target="_blank" rel="noopener noreferrer" class="inline-flex items-center gap-1.5 text-sm text-[var(--color-ash)] transition-colors duration-200 hover:text-[var(--color-snow)]" href="https://www.linkedin.com/company/vexp-ai"><svg class="size-4" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M20.45 20.45h-3.56v-5.57c0-1.33-.02-3.04-1.85-3.04-1.85 0-2.13 1.45-2.13 2.94v5.67H9.35V9h3.42v1.56h.05c.48-.9 1.64-1.85 3.37-1.85 3.6 0 4.27 2.37 4.27 5.46v6.28zM5.34 7.43a2.07 2.07 0 1 1 0-4.14 2.07 2.07 0 0 1 0 4.14zM7.12 20.45H3.55V9h3.57v11.45zM22.22 0H1.77C.79 0 0 .77 0 1.73v20.54C0 23.23.79 24 1.77 24h20.45c.98 0 1.78-.77 1.78-1.73V1.73C24 .77 23.2 0 22.22 0z"></path></svg>LinkedIn</a></li></ul></div></div></div></div></footer></div><!--$--><!--/$-->
1<script src="/_next/static/chunks/d504efe999470850.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd" id="_R_" async=""></script>
1<script>(self.__next_f=self.__next_f||[]).push([0])</script>
1<script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[38246,[\"/_next/static/chunks/e355ef31239ef980.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"ThemeProvider\"]\n3:I[129404,[\"/_next/static/chunks/e355ef31239ef980.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"LenisProvider\"]\n4:I[339756,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"default\"]\n5:I[837457,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"default\"]\n6:I[515939,[\"/_next/static/chunks/e355ef31239ef980.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/3a64a227006216dc.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/ce074514c1a9a6b7.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"Nav\"]\n7:I[522016,[\"/_next/static/chunks/e355ef31239ef980.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/3a64a227006216dc.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/ce074514c1a9a6b7.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"\"]\n8:I[58234,[\"/_next/static/chunks/e355ef31239ef980.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/3a64a227006216dc.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/ce074514c1a9a6b7.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"Footer\"]\n9:I[347257,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"ClientPageRoot\"]\na:I[537974,[\"/_next/static/chunks/e355ef31239ef980.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/d477b93ef28580a2.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/3a64a227006216dc.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/bbd55e57a96f3e03.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/ce074514c1a9a6b7.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"default\"]\nd:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"OutletBoundary\"]\ne:\"$Sreact.suspense\"\n10:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"ViewportBoundary\"]\n12:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"MetadataBoundary\"]\n14:I[168027,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"default\"]\n:HL[\"/_next/static/chunks/3db20d7c09308c7b.css?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"style\"]\n:HL[\"/_next/static/media/051742360c26797e-s.p.102b7f24.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/83afe278b6a6bb3c-s.p.3a6ba036.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script>
1<script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"ERRrB9UJLe3n4Is_vhrja\",\"c\":[\"\",\"docs\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"docs\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/3db20d7c09308c7b.css?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/e355ef31239ef980.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"className\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://cdn.jsdelivr.net\",\"crossOrigin\":\"\"}],[\"$\",\"link\",null,{\"rel\":\"preconnect\",\"href\":\"https://broker.litlyx.com\",\"crossOrigin\":\"\"}],[\"$\",\"script\",null,{\"defer\":true,\"data-workspace\":\"699c0b9b4fe873e3986d15f3\",\"src\":\"https://cdn.jsdelivr.net/npm/litlyx-js@latest/browser/litlyx.js\"}]]}],[\"$\",\"body\",null,{\"className\":\"inter_2c2e0e07-module__xHkjQa__variable jetbrains_mono_f120c9a0-module__vTDh_W__variable antialiased\",\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"children\":[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"div\",null,{\"className\":\"min-h-screen bg-[var(--color-void)]\",\"children\":[[\"$\",\"$L6\",null,{}],[\"$\",\"main\",null,{\"className\":\"section-expo flex min-h-[70vh] flex-col items-center justify-center\",\"children\":[\"$\",\"div\",null,{\"className\":\"container-expo flex flex-col items-center text-center\",\"children\":[[\"$\",\"span\",null,{\"className\":\"badge-expo mb-6\",\"children\":\"404\"}],[\"$\",\"h1\",null,{\"className\":\"t-display text-4xl sm:text-5xl md:text-display-xl text-[var(--color-snow)]\",\"children\":\"Page not found\"}],[\"$\",\"p\",null,{\"className\":\"t-body mt-5 max-w-md text-lg\",\"children\":\"The page you are looking for does not exist or has been moved.\"}],[\"$\",\"$L7\",null,{\"href\":\"/\",\"className\":\"btn-expo btn-expo-primary mt-10 px-6\",\"children\":\"Back to home\"}]]}]}],[\"$\",\"$L8\",null,{}]]}],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L4\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L9\",null,{\"Component\":\"$a\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@b\",\"$@c\"]}}],[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/d477b93ef28580a2.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-1\",{\"src\":\"/_next/static/chunks/3a64a227006216dc.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-2\",{\"src\":\"/_next/static/chunks/bbd55e57a96f3e03.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"async\":true,\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-3\",{\"src\":\"/_next/static/chunks/ce074514c1a9a6b7.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$Ld\",null,{\"children\":[\"$\",\"$e\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@f\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L10\",null,{\"children\":\"$L11\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$L12\",null,{\"children\":[\"$\",\"$e\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L13\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$14\",[]],\"S\":true}\n"])</script>
1<script>self.__next_f.push([1,"b:{}\nc:\"$0:f:0:1:1:children:1:children:0:props:children:0:props:serverProvidedParams:params\"\n"])</script>
1<script>self.__next_f.push([1,"11:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script>
1<script>self.__next_f.push([1,"15:I[27201,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_BDZzMqDjXbDwYYFqamEQ3aa1ZiUd\"],\"IconMark\"]\nf:null\n"])</script>
1<script>self.__next_f.push([1,"13:[[\"$\",\"title\",\"0\",{\"children\":\"Documentation — vexp\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Complete guide to vexp: installation, configuration, MCP tools, session memory, multi-repo support, and troubleshooting.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"author\",\"content\":\"vexp\"}],[\"$\",\"meta\",\"3\",{\"name\":\"keywords\",\"content\":\"AI coding,reliability layer,context engine,AI code verification,MCP,Claude Code,Cursor,token reduction,local-first,privacy,code context,dependency graph,single-call pipeline,session memory\"}],[\"$\",\"meta\",\"4\",{\"name\":\"creator\",\"content\":\"vexp\"}],[\"$\",\"link\",\"5\",{\"rel\":\"canonical\",\"href\":\"https://vexp.dev/docs\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:title\",\"content\":\"vexp — The Reliability Layer for AI Coding Agents\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:description\",\"content\":\"Local-first reliability layer for AI coding agents: right context in, verified work out. Fable-5-level results from Opus 5 at half the token price (81.7% on SWE-bench Pro), zero network calls. Your code never leaves your machine.\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:url\",\"content\":\"https://vexp.dev\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:site_name\",\"content\":\"vexp\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:locale\",\"content\":\"en_US\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image\",\"content\":\"https://vexp.dev/og-image.png\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"14\",{\"property\":\"og:image:alt\",\"content\":\"vexp — Your codebase. Understood.\"}],[\"$\",\"meta\",\"15\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"vexp — The Reliability Layer for AI Coding Agents\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Local-first reliability layer for AI coding agents: right context in, verified work out. Fable-5-level results from Opus 5 at half the token price, zero network calls.\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://vexp.dev/og-image.png\"}],[\"$\",\"link\",\"20\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"sizes\":\"48x48\"}],[\"$\",\"link\",\"21\",{\"rel\":\"icon\",\"href\":\"/vexp-icon.svg\",\"type\":\"image/svg+xml\"}],[\"$\",\"link\",\"22\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\"}],[\"$\",\"$L15\",\"23\",{}]]\n"])</script>
1</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.