purecontext-mcp 1.1.7 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENT_INSTRUCTIONS.md +393 -0
- package/AGENT_INSTRUCTIONS_SHORT.md +53 -0
- package/AST-SEARCH.md +274 -0
- package/CHANGELOG.md +62 -0
- package/CODE-INTELLIGENCE.md +369 -0
- package/HEALTH-DASHBOARDS.md +241 -0
- package/README.md +7 -0
- package/REFACTORING-SAFELY.md +279 -0
- package/UNDERSTANDING-RELATIONSHIPS.md +240 -0
- package/USER-GUIDE.md +14 -0
- package/VISUALIZING-CODE.md +199 -0
- package/WORKFLOW-TECH-DEBT.md +286 -0
- package/dist/core/db/dep-store.d.ts +75 -0
- package/dist/core/db/dep-store.d.ts.map +1 -1
- package/dist/core/db/dep-store.js +277 -0
- package/dist/core/db/dep-store.js.map +1 -1
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +12 -0
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/index-manager.js +1 -1
- package/dist/core/index-manager.js.map +1 -1
- package/dist/core/token-tracker.d.ts +0 -9
- package/dist/core/token-tracker.d.ts.map +1 -1
- package/dist/core/token-tracker.js +0 -21
- package/dist/core/token-tracker.js.map +1 -1
- package/dist/core/types.d.ts +5 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/graph/diagram-renderer.d.ts +83 -0
- package/dist/graph/diagram-renderer.d.ts.map +1 -0
- package/dist/graph/diagram-renderer.js +294 -0
- package/dist/graph/diagram-renderer.js.map +1 -0
- package/dist/graph/graph-traversal.d.ts +92 -0
- package/dist/graph/graph-traversal.d.ts.map +1 -1
- package/dist/graph/graph-traversal.js +440 -2
- package/dist/graph/graph-traversal.js.map +1 -1
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +30 -1
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +145 -0
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/tools/_meta.d.ts +0 -2
- package/dist/server/tools/_meta.d.ts.map +1 -1
- package/dist/server/tools/_meta.js +1 -4
- package/dist/server/tools/_meta.js.map +1 -1
- package/dist/server/tools/check-delete-safe.d.ts +50 -0
- package/dist/server/tools/check-delete-safe.d.ts.map +1 -0
- package/dist/server/tools/check-delete-safe.js +308 -0
- package/dist/server/tools/check-delete-safe.js.map +1 -0
- package/dist/server/tools/check-move-safe.d.ts +44 -0
- package/dist/server/tools/check-move-safe.d.ts.map +1 -0
- package/dist/server/tools/check-move-safe.js +266 -0
- package/dist/server/tools/check-move-safe.js.map +1 -0
- package/dist/server/tools/check-rename-safe.d.ts +48 -0
- package/dist/server/tools/check-rename-safe.d.ts.map +1 -0
- package/dist/server/tools/check-rename-safe.js +218 -0
- package/dist/server/tools/check-rename-safe.js.map +1 -0
- package/dist/server/tools/diff-health-radar.d.ts +44 -0
- package/dist/server/tools/diff-health-radar.d.ts.map +1 -0
- package/dist/server/tools/diff-health-radar.js +192 -0
- package/dist/server/tools/diff-health-radar.js.map +1 -0
- package/dist/server/tools/find-cycles.d.ts +31 -0
- package/dist/server/tools/find-cycles.d.ts.map +1 -0
- package/dist/server/tools/find-cycles.js +85 -0
- package/dist/server/tools/find-cycles.js.map +1 -0
- package/dist/server/tools/find-implementations.d.ts +47 -0
- package/dist/server/tools/find-implementations.d.ts.map +1 -0
- package/dist/server/tools/find-implementations.js +167 -0
- package/dist/server/tools/find-implementations.js.map +1 -0
- package/dist/server/tools/find-untested-symbols.d.ts +52 -0
- package/dist/server/tools/find-untested-symbols.d.ts.map +1 -0
- package/dist/server/tools/find-untested-symbols.js +308 -0
- package/dist/server/tools/find-untested-symbols.js.map +1 -0
- package/dist/server/tools/get-architecture-snapshot.d.ts +43 -0
- package/dist/server/tools/get-architecture-snapshot.d.ts.map +1 -0
- package/dist/server/tools/get-architecture-snapshot.js +292 -0
- package/dist/server/tools/get-architecture-snapshot.js.map +1 -0
- package/dist/server/tools/get-call-hierarchy.d.ts +43 -0
- package/dist/server/tools/get-call-hierarchy.d.ts.map +1 -0
- package/dist/server/tools/get-call-hierarchy.js +119 -0
- package/dist/server/tools/get-call-hierarchy.js.map +1 -0
- package/dist/server/tools/get-class-hierarchy.d.ts +36 -0
- package/dist/server/tools/get-class-hierarchy.d.ts.map +1 -0
- package/dist/server/tools/get-class-hierarchy.js +125 -0
- package/dist/server/tools/get-class-hierarchy.js.map +1 -0
- package/dist/server/tools/get-complexity-hotspots.d.ts +50 -0
- package/dist/server/tools/get-complexity-hotspots.d.ts.map +1 -0
- package/dist/server/tools/get-complexity-hotspots.js +282 -0
- package/dist/server/tools/get-complexity-hotspots.js.map +1 -0
- package/dist/server/tools/get-coupling-map.d.ts +39 -0
- package/dist/server/tools/get-coupling-map.d.ts.map +1 -0
- package/dist/server/tools/get-coupling-map.js +107 -0
- package/dist/server/tools/get-coupling-map.js.map +1 -0
- package/dist/server/tools/get-debt-report.d.ts +44 -0
- package/dist/server/tools/get-debt-report.d.ts.map +1 -0
- package/dist/server/tools/get-debt-report.js +606 -0
- package/dist/server/tools/get-debt-report.js.map +1 -0
- package/dist/server/tools/get-entry-points.d.ts +79 -0
- package/dist/server/tools/get-entry-points.d.ts.map +1 -0
- package/dist/server/tools/get-entry-points.js +362 -0
- package/dist/server/tools/get-entry-points.js.map +1 -0
- package/dist/server/tools/get-public-api.d.ts +53 -0
- package/dist/server/tools/get-public-api.d.ts.map +1 -0
- package/dist/server/tools/get-public-api.js +218 -0
- package/dist/server/tools/get-public-api.js.map +1 -0
- package/dist/server/tools/get-savings-stats.d.ts.map +1 -1
- package/dist/server/tools/get-savings-stats.js +1 -3
- package/dist/server/tools/get-savings-stats.js.map +1 -1
- package/dist/server/tools/get-test-coverage-map.d.ts +66 -0
- package/dist/server/tools/get-test-coverage-map.d.ts.map +1 -0
- package/dist/server/tools/get-test-coverage-map.js +588 -0
- package/dist/server/tools/get-test-coverage-map.js.map +1 -0
- package/dist/server/tools/get-todos.d.ts +51 -0
- package/dist/server/tools/get-todos.d.ts.map +1 -0
- package/dist/server/tools/get-todos.js +180 -0
- package/dist/server/tools/get-todos.js.map +1 -0
- package/dist/server/tools/get-type-graph.d.ts +73 -0
- package/dist/server/tools/get-type-graph.d.ts.map +1 -0
- package/dist/server/tools/get-type-graph.js +437 -0
- package/dist/server/tools/get-type-graph.js.map +1 -0
- package/dist/server/tools/health-radar.d.ts +50 -0
- package/dist/server/tools/health-radar.d.ts.map +1 -0
- package/dist/server/tools/health-radar.js +426 -0
- package/dist/server/tools/health-radar.js.map +1 -0
- package/dist/server/tools/plan-refactoring.d.ts +74 -0
- package/dist/server/tools/plan-refactoring.d.ts.map +1 -0
- package/dist/server/tools/plan-refactoring.js +644 -0
- package/dist/server/tools/plan-refactoring.js.map +1 -0
- package/dist/server/tools/render-call-graph.d.ts +40 -0
- package/dist/server/tools/render-call-graph.d.ts.map +1 -0
- package/dist/server/tools/render-call-graph.js +215 -0
- package/dist/server/tools/render-call-graph.js.map +1 -0
- package/dist/server/tools/render-class-hierarchy.d.ts +42 -0
- package/dist/server/tools/render-class-hierarchy.d.ts.map +1 -0
- package/dist/server/tools/render-class-hierarchy.js +265 -0
- package/dist/server/tools/render-class-hierarchy.js.map +1 -0
- package/dist/server/tools/render-dep-matrix.d.ts +38 -0
- package/dist/server/tools/render-dep-matrix.d.ts.map +1 -0
- package/dist/server/tools/render-dep-matrix.js +186 -0
- package/dist/server/tools/render-dep-matrix.js.map +1 -0
- package/dist/server/tools/render-diagram.d.ts +47 -0
- package/dist/server/tools/render-diagram.d.ts.map +1 -0
- package/dist/server/tools/render-diagram.js +266 -0
- package/dist/server/tools/render-diagram.js.map +1 -0
- package/dist/server/tools/render-import-graph.d.ts +41 -0
- package/dist/server/tools/render-import-graph.d.ts.map +1 -0
- package/dist/server/tools/render-import-graph.js +158 -0
- package/dist/server/tools/render-import-graph.js.map +1 -0
- package/dist/server/tools/search-ast.d.ts +55 -0
- package/dist/server/tools/search-ast.d.ts.map +1 -0
- package/dist/server/tools/search-ast.js +279 -0
- package/dist/server/tools/search-ast.js.map +1 -0
- package/dist/server/tools/search-by-complexity.d.ts +92 -0
- package/dist/server/tools/search-by-complexity.d.ts.map +1 -0
- package/dist/server/tools/search-by-complexity.js +268 -0
- package/dist/server/tools/search-by-complexity.js.map +1 -0
- package/dist/server/tools/search-by-decorator.d.ts +48 -0
- package/dist/server/tools/search-by-decorator.d.ts.map +1 -0
- package/dist/server/tools/search-by-decorator.js +518 -0
- package/dist/server/tools/search-by-decorator.js.map +1 -0
- package/dist/server/tools/search-by-signature.d.ts +56 -0
- package/dist/server/tools/search-by-signature.d.ts.map +1 -0
- package/dist/server/tools/search-by-signature.js +200 -0
- package/dist/server/tools/search-by-signature.js.map +1 -0
- package/dist/ui/assets/BlastRadius-QdgESOL8.js +1 -0
- package/dist/ui/assets/{DependencyGraph-CDtBHM0U.js → DependencyGraph-BSMhzwWV.js} +6 -6
- package/dist/ui/assets/{NotFound-Cdt6X8pl.js → NotFound-CipFP_s1.js} +1 -1
- package/dist/ui/assets/RepoDetail-Dfp5z5Kq.js +1 -0
- package/dist/ui/assets/{RepoList-B9LaZvob.js → RepoList-BKtST3hB.js} +1 -1
- package/dist/ui/assets/{Search-CLqv2KGV.js → Search-DzhGDViy.js} +1 -1
- package/dist/ui/assets/{SymbolView-BlbDR1DU.js → SymbolView-ryVEwAHG.js} +1 -1
- package/dist/ui/assets/{index-DADf5y_L.css → index-Ny8gn9F0.css} +1 -1
- package/dist/ui/assets/{index-i3Q1XbEh.js → index-nX2chMqi.js} +6 -6
- package/dist/ui/assets/{useSearch-mbMk6-M1.js → useSearch-BnBCRKui.js} +1 -1
- package/dist/ui/index.html +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/dev/jcodemunch-gap-analysis.md +198 -0
- package/package.json +9 -1
- package/user-manual.md +2466 -0
- package/dist/ui/assets/BlastRadius-BDZWhEk-.js +0 -1
- package/dist/ui/assets/RepoDetail-M6WaYbZ3.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{j as e,r as h,L as O,e as G,b as M,a as $,A as H}from"./index-i3Q1XbEh.js";import{u as T}from"./useSearch-mbMk6-M1.js";function V(t){const r=new Map;for(const n of t.entries)r.set(n.depth,(r.get(n.depth)??0)+1);return r}function q(t){return t===0?"—":t<=3?"Low (~30 min)":t<=10?"Medium (~2 hrs)":t<=30?"High (~1 day)":"Very high (>1 day)"}function I({label:t,value:r,sub:n,color:l="text-gray-100"}){return e.jsxs("div",{className:"bg-gray-800 rounded-lg px-4 py-3 flex flex-col gap-0.5",children:[e.jsx("span",{className:"text-[10px] font-semibold text-gray-500 uppercase tracking-wider",children:t}),e.jsx("span",{className:`text-xl font-bold tabular-nums ${l}`,children:r}),n&&e.jsx("span",{className:"text-xs text-gray-500",children:n})]})}const U={0:"bg-blue-500",1:"bg-red-500",2:"bg-orange-500"};function X(t){return U[t]??"bg-yellow-500"}function Y(t){return t===0?"Source":t===1?"Direct":t===2?"2-hop":`${t}-hop`}function K({data:t}){const r=V(t),n=r.get(1)??0,l=t.totalFiles-1-n,i=Math.max(...t.entries.map(a=>a.depth));return e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-4",children:[e.jsx(I,{label:"Files affected",value:t.totalFiles-1,sub:"excluding source",color:"text-red-400"}),e.jsx(I,{label:"Symbols affected",value:t.totalSymbols,color:"text-orange-400"}),e.jsx(I,{label:"Direct impact",value:n,sub:"1-hop files",color:"text-red-300"}),e.jsx(I,{label:"Indirect impact",value:l,sub:"2+ hop files",color:"text-yellow-300"})]}),e.jsxs("div",{className:"bg-gray-800 rounded-lg px-4 py-3 flex items-center justify-between",children:[e.jsx("span",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wider",children:"Estimated review effort"}),e.jsx("span",{className:"text-sm font-medium text-gray-200",children:q(t.totalFiles-1)})]}),i>0&&e.jsxs("div",{className:"bg-gray-800 rounded-lg px-4 py-3 space-y-2",children:[e.jsx("span",{className:"text-[10px] font-semibold text-gray-500 uppercase tracking-wider block",children:"Impact by depth"}),Array.from({length:i+1},(a,p)=>p).filter(a=>a>0).map(a=>{const p=r.get(a)??0,o=Math.max(...Array.from(r.values())),c=o>0?p/o*100:0;return e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-xs text-gray-500 w-12 shrink-0",children:Y(a)}),e.jsx("div",{className:"flex-1 h-2 bg-gray-700 rounded-full overflow-hidden",children:e.jsx("div",{className:`h-full rounded-full ${X(a)}`,style:{width:`${c}%`}})}),e.jsx("span",{className:"text-xs text-gray-400 tabular-nums w-8 text-right",children:p})]},a)})]})]})}const k=680,j=k/2,v=k/2,Q=18,Z=24,J=[0,130,220,295];function D(t){return J[t]??295+(t-3)*60}function w(t){return t===0?"#3b82f6":t===1?"#ef4444":t===2?"#f97316":"#eab308"}function ee(t){return t===1?"rgba(239,68,68,0.18)":t===2?"rgba(249,115,22,0.18)":"rgba(234,179,8,0.18)"}function B(t){return t===1?"Direct dependents":t===2?"2-hop":`${t}-hop`}const P=28;function te(t){const r=new Map;for(const l of t.entries){const i=r.get(l.depth)??[];i.push(l),r.set(l.depth,i)}const n=[];for(const[l,i]of r){if(l===0){n.push({entry:i[0],x:j,y:v});continue}const a=D(l),p=i.slice(0,P);for(let o=0;o<p.length;o++){const c=2*Math.PI/p.length*o-Math.PI/2;n.push({entry:p[o],x:j+a*Math.cos(c),y:v+a*Math.sin(c)})}}return n}function se({node:t}){const r=t.entry,n=w(r.depth),l=r.depth===0?"Source":B(r.depth);return e.jsx("div",{className:"absolute z-20 pointer-events-none",style:{left:t.x/k*100+"%",top:t.y/k*100+"%",transform:"translate(-50%, -120%)"},children:e.jsxs("div",{className:"bg-gray-900 border border-gray-700 rounded-lg px-3 py-2 shadow-lg min-w-[160px] max-w-[260px]",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full shrink-0",style:{background:n}}),e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-wider text-gray-500",children:l})]}),e.jsx("p",{className:"text-xs font-mono text-gray-200 break-all leading-relaxed",children:r.filePath}),e.jsxs("p",{className:"text-[10px] text-gray-500 mt-1",children:[r.symbolCount," symbol",r.symbolCount!==1?"s":""]})]})})}function re({data:t,onNodeClick:r}){const n=te(t),[l,i]=h.useState(null),a=h.useRef(null);h.useEffect(()=>{const s=()=>i(null);return window.addEventListener("click",s),()=>window.removeEventListener("click",s)},[]);const p=h.useCallback((s,u)=>{s.stopPropagation(),r==null||r(u.entry.filePath)},[r]),o=Math.max(...t.entries.map(s=>s.depth)),c=new Map;for(const s of t.entries)c.set(s.depth,(c.get(s.depth)??0)+1);return e.jsxs("div",{className:"relative w-full h-full flex items-center justify-center overflow-hidden",children:[e.jsx("div",{className:"absolute top-3 left-3 z-10 flex flex-col gap-1",children:[{depth:0,label:"Source"},{depth:1,label:"Direct (1-hop)"},{depth:2,label:"2-hop"},{depth:3,label:"3+ hop"}].filter(({depth:s})=>s===0||(c.get(s)??0)>0).map(({depth:s,label:u})=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"w-2.5 h-2.5 rounded-full shrink-0",style:{background:w(s)}}),e.jsx("span",{className:"text-[10px] text-gray-400",children:u})]},s))}),e.jsxs("svg",{ref:a,viewBox:`0 0 ${k} ${k}`,className:"w-full h-full max-w-[680px] max-h-[680px]","aria-label":"Blast radius radial graph",children:[Array.from({length:o},(s,u)=>u+1).map(s=>e.jsx("circle",{cx:j,cy:v,r:D(s),fill:ee(s),stroke:w(s),strokeWidth:1,strokeDasharray:"4 4",opacity:.5},s)),Array.from({length:o},(s,u)=>u+1).map(s=>{const u=c.get(s)??0;if(u===0)return null;const f=u>P?u-P:0,g=D(s);return e.jsx("g",{children:e.jsxs("text",{x:j,y:v-g+14,textAnchor:"middle",fill:w(s),fontSize:10,opacity:.7,children:[B(s)," (",u,f>0?`, +${f} more`:"",")"]})},s)}),n.filter(s=>s.entry.depth>0).map(s=>{const u=s.entry.depth-1,f=D(u),g=s.x-j,d=s.y-v,m=Math.sqrt(g*g+d*d),y=m===0?j:j+g/m*f,R=m===0?v:v+d/m*f;return e.jsx("line",{x1:y,y1:R,x2:s.x,y2:s.y,stroke:w(s.entry.depth),strokeWidth:1,strokeOpacity:.35},s.entry.filePath)}),n.map(s=>{const u=s.entry.depth===0?Z:Q,f=w(s.entry.depth),g=s.entry.filePath.split("/").pop()??s.entry.filePath,d=g.length>14?g.slice(0,12)+"…":g,m=(l==null?void 0:l.entry.filePath)===s.entry.filePath;return e.jsxs("g",{role:"button",tabIndex:0,"aria-label":`${s.entry.filePath} — ${s.entry.symbolCount} symbols`,style:{cursor:"pointer"},onMouseEnter:()=>i(s),onMouseLeave:()=>i(null),onClick:y=>p(y,s),onKeyDown:y=>{(y.key==="Enter"||y.key===" ")&&(y.preventDefault(),r==null||r(s.entry.filePath))},children:[e.jsx("circle",{cx:s.x,cy:s.y,r:u+(m?3:0),fill:f,fillOpacity:m?.9:.75,stroke:f,strokeWidth:m?2.5:1.5,style:{transition:"r 0.12s, fill-opacity 0.12s"}}),s.entry.depth===0&&e.jsx("text",{x:s.x,y:s.y+4,textAnchor:"middle",fill:"white",fontSize:10,fontWeight:"bold",pointerEvents:"none",children:s.entry.symbolCount}),e.jsx("text",{x:s.x,y:s.y+u+14,textAnchor:"middle",fill:m?"white":"#9ca3af",fontSize:9,pointerEvents:"none",children:d})]},s.entry.filePath)})]}),l&&e.jsx(se,{node:l})]})}function ae(t){return t===0?"text-blue-400":t===1?"text-red-400":t===2?"text-orange-400":"text-yellow-400"}function ne(t){return t===0?"bg-blue-500/20 text-blue-300 border-blue-500/30":t===1?"bg-red-500/20 text-red-300 border-red-500/30":t===2?"bg-orange-500/20 text-orange-300 border-orange-500/30":"bg-yellow-500/20 text-yellow-300 border-yellow-500/30"}function le(t){return t===0?"Source file":t===1?"Direct dependents (1 hop)":t===2?"2-hop dependents":`${t}-hop dependents`}function ie({entry:t,repoId:r}){const[n,l]=h.useState(!1),i=t.symbols.length>0;return e.jsxs("div",{className:"border border-gray-800 rounded-lg overflow-hidden",children:[e.jsxs("button",{type:"button",onClick:()=>l(a=>!a),className:"w-full flex items-center gap-3 px-3 py-2.5 bg-gray-800/50 hover:bg-gray-800 transition-colors text-left","aria-expanded":n,children:[e.jsx("svg",{width:"10",height:"10",viewBox:"0 0 10 10",fill:"none","aria-hidden":"true",className:`shrink-0 transition-transform ${n?"rotate-90":""}`,children:e.jsx("path",{d:"M3 1.5L7 5L3 8.5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),e.jsx("code",{className:"flex-1 text-xs font-mono text-gray-200 truncate",children:t.filePath}),e.jsxs("span",{className:"text-[10px] text-gray-500 shrink-0",children:[t.symbolCount," symbol",t.symbolCount!==1?"s":""]})]}),n&&i&&e.jsx("div",{className:"divide-y divide-gray-800",children:t.symbols.map(a=>e.jsxs("div",{className:"px-3 py-2 flex items-start gap-2 hover:bg-gray-800/30 transition-colors",children:[e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-wider bg-gray-700 text-gray-400 rounded px-1.5 py-0.5 shrink-0 mt-px",children:a.kind}),e.jsxs("div",{className:"flex-1 min-w-0",children:[r?e.jsx(O,{to:`/symbols/${encodeURIComponent(a.id)}?repoId=${encodeURIComponent(r)}`,className:"text-xs font-medium text-blue-400 hover:text-blue-300 transition-colors font-mono",children:a.name}):e.jsx("span",{className:"text-xs font-medium text-gray-300 font-mono",children:a.name}),a.signature&&a.signature!==a.name&&e.jsx("p",{className:"text-[10px] text-gray-500 font-mono truncate mt-0.5",children:a.signature})]})]},a.id))}),n&&!i&&e.jsx("p",{className:"px-4 py-2 text-xs text-gray-600 italic",children:"No symbols indexed in this file."})]})}function oe({depth:t,entries:r,repoId:n}){const[l,i]=h.useState(t<=2);return e.jsxs("div",{children:[e.jsxs("button",{type:"button",onClick:()=>i(a=>!a),className:"flex items-center gap-2 w-full py-2 text-left group","aria-expanded":l,children:[e.jsx("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",className:`shrink-0 transition-transform text-gray-500 ${l?"rotate-90":""}`,children:e.jsx("path",{d:"M4 2L8 6L4 10",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})}),e.jsx("span",{className:`text-xs font-semibold ${ae(t)}`,children:le(t)}),e.jsx("span",{className:`text-[10px] font-semibold px-1.5 py-0.5 rounded border ${ne(t)}`,children:r.length})]}),l&&e.jsx("div",{className:"pl-4 mt-1 space-y-1.5",children:r.map(a=>e.jsx(ie,{entry:a,repoId:n},a.filePath))})]})}function ce({data:t,repoId:r}){const n=new Map;for(const i of t.entries){const a=n.get(i.depth)??[];a.push(i),n.set(i.depth,a)}const l=Array.from(n.keys()).sort((i,a)=>i-a);return t.entries.length===0?e.jsx("div",{className:"flex items-center justify-center h-32 text-gray-500 text-sm",children:"No dependent files found."}):e.jsx("div",{className:"space-y-2",children:l.map(i=>e.jsx(oe,{depth:i,entries:n.get(i),repoId:r},i))})}function de({repos:t,selectedId:r,onSelect:n}){return e.jsxs("select",{value:r??"",onChange:l=>n(l.target.value),className:"px-3 py-1.5 bg-gray-800 border border-gray-700 rounded text-sm text-gray-100 focus:outline-none focus:border-blue-500","aria-label":"Select repository",children:[!r&&e.jsx("option",{value:"",children:"Select repository…"}),t.map(l=>e.jsx("option",{value:l.repoId,children:l.rootPath.split(/[/\\]/).pop()??l.repoId},l.repoId))]})}function xe({value:t,onChange:r}){return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-xs text-gray-500",children:"Max depth"}),e.jsx("input",{type:"range",min:1,max:6,value:t,onChange:n=>r(Number(n.target.value)),className:"w-24 accent-blue-500","aria-label":"Max depth"}),e.jsx("span",{className:"text-xs font-mono text-gray-300 w-4",children:t})]})}function ue({repoId:t,selectedSymbol:r,onSelect:n}){const l=h.useRef(null),i=T({repoId:t,debounceMs:300}),a=c=>{i.setQuery(c)},p=c=>{n(c),i.clearSearch()},o=i.query.length>0&&i.results.length>0;return e.jsxs("div",{className:"relative",children:[r&&e.jsxs("div",{className:"mb-2 flex items-center gap-2 px-3 py-2 bg-blue-600/10 border border-blue-600/30 rounded-lg",children:[e.jsx("span",{className:"text-[10px] font-semibold uppercase tracking-wider bg-blue-600/30 text-blue-300 rounded px-1.5 py-0.5 shrink-0",children:r.kind}),e.jsx("span",{className:"text-sm text-blue-300 font-mono font-medium flex-1 truncate",children:r.name}),e.jsx("button",{type:"button",onClick:()=>n({...r,id:""}),className:"text-gray-500 hover:text-gray-300 transition-colors text-xs","aria-label":"Clear symbol selection",children:"✕"})]}),e.jsxs("div",{className:"relative",children:[e.jsx("span",{className:"absolute left-3 top-1/2 -translate-y-1/2 text-gray-500 pointer-events-none",children:e.jsxs("svg",{width:"13",height:"13",viewBox:"0 0 14 14",fill:"none","aria-hidden":"true",children:[e.jsx("circle",{cx:"6",cy:"6",r:"4.5",stroke:"currentColor",strokeWidth:"1.5"}),e.jsx("line",{x1:"9.5",y1:"9.5",x2:"12.5",y2:"12.5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})]})}),e.jsx("input",{ref:l,type:"search",value:i.query,onChange:c=>a(c.target.value),placeholder:t?"Search for a symbol…":"Select a repo first…",disabled:!t,className:"w-full pl-8 pr-4 py-2 bg-gray-800 border border-gray-700 rounded text-sm text-gray-100 placeholder-gray-500 focus:outline-none focus:border-blue-500 disabled:opacity-40","aria-label":"Search for a symbol to analyze"}),i.loading&&e.jsx("span",{className:"absolute right-3 top-1/2 -translate-y-1/2",children:e.jsx("span",{className:"block w-3 h-3 rounded-full border-2 border-blue-500 border-t-transparent animate-spin"})})]}),o&&e.jsx("div",{className:"absolute z-30 top-full left-0 right-0 mt-1 bg-gray-900 border border-gray-700 rounded-lg shadow-xl max-h-64 overflow-y-auto",children:i.results.slice(0,20).map(c=>e.jsxs("button",{type:"button",onClick:()=>p(c),className:"w-full text-left px-3 py-2.5 flex items-center gap-2 hover:bg-gray-800 transition-colors",children:[e.jsx("span",{className:"text-[9px] font-semibold uppercase tracking-wider bg-gray-700 text-gray-400 rounded px-1.5 py-0.5 shrink-0",children:c.kind}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-xs font-mono text-gray-200 truncate",children:c.name}),e.jsx("p",{className:"text-[10px] text-gray-500 truncate",children:c.filePath})]})]},c.id))})]})}function he({mode:t,onChange:r}){return e.jsx("div",{className:"flex rounded-lg border border-gray-700 overflow-hidden",children:["graph","list"].map(n=>e.jsx("button",{type:"button",onClick:()=>r(n),className:`px-3 py-1.5 text-xs font-medium transition-colors capitalize ${t===n?"bg-blue-600 text-white":"bg-gray-800 text-gray-400 hover:text-gray-200"}`,"aria-pressed":t===n,children:n==="graph"?e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:[e.jsx("circle",{cx:"6",cy:"2",r:"1.5",fill:"currentColor"}),e.jsx("circle",{cx:"2",cy:"9",r:"1.5",fill:"currentColor"}),e.jsx("circle",{cx:"10",cy:"9",r:"1.5",fill:"currentColor"}),e.jsx("line",{x1:"6",y1:"3.5",x2:"2.8",y2:"7.7",stroke:"currentColor",strokeWidth:"1"}),e.jsx("line",{x1:"6",y1:"3.5",x2:"9.2",y2:"7.7",stroke:"currentColor",strokeWidth:"1"})]}),"Graph"]}):e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:[e.jsx("rect",{x:"1",y:"2",width:"10",height:"1.5",rx:"0.5",fill:"currentColor"}),e.jsx("rect",{x:"1",y:"5.25",width:"10",height:"1.5",rx:"0.5",fill:"currentColor"}),e.jsx("rect",{x:"1",y:"8.5",width:"7",height:"1.5",rx:"0.5",fill:"currentColor"})]}),"List"]})},n))})}function pe({hasSymbol:t}){return e.jsxs("div",{className:"flex flex-col items-center justify-center h-full text-center gap-4 py-16 px-8",children:[e.jsx("div",{className:"w-16 h-16 rounded-full bg-gray-800 flex items-center justify-center mb-2",children:e.jsxs("svg",{width:"28",height:"28",viewBox:"0 0 28 28",fill:"none","aria-hidden":"true",children:[e.jsx("circle",{cx:"14",cy:"14",r:"4",fill:"#3b82f6",opacity:"0.8"}),e.jsx("circle",{cx:"14",cy:"14",r:"8",stroke:"#ef4444",strokeWidth:"1.5",strokeDasharray:"3 3",opacity:"0.5"}),e.jsx("circle",{cx:"14",cy:"14",r:"12",stroke:"#f97316",strokeWidth:"1",strokeDasharray:"3 3",opacity:"0.3"})]})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-gray-300 font-medium mb-1",children:t?"Loading blast radius…":"Select a symbol to analyze"}),e.jsx("p",{className:"text-sm text-gray-500 max-w-xs",children:t?"Traversing the dependency graph…":"Search for a function, class, or type to see which files would be affected if it changed."})]})]})}function ye(){const[t,r]=G(),n=M(x=>x.repos),l=M(x=>x.reposLoaded),i=M(x=>x.setRepos),[a,p]=h.useState(t.get("repoId")??null);h.useEffect(()=>{l||$.listRepos().then(x=>i(x.repos)).catch(()=>{})},[l,i]),h.useEffect(()=>{!a&&n.length>0&&p(n[0].repoId)},[n,a]);const[o,c]=h.useState(null),s=t.get("symbolId"),u=t.get("symbolName"),[f,g]=h.useState(3),[d,m]=h.useState(null),[y,R]=h.useState(!1),[N,C]=h.useState(null),[L,A]=h.useState("graph"),E=h.useCallback(async(x,b,_)=>{R(!0),C(null),m(null);try{const S=await $.getBlastRadius(x,b,_);m(S)}catch(S){C(S instanceof H?S.message:String(S))}finally{R(!1)}},[]);h.useEffect(()=>{if(!a)return;const x=(o==null?void 0:o.id)||s;x&&E(a,x,f)},[a,o,s,f,E]);const F=h.useCallback(x=>{if(!x.id){c(null),m(null),C(null),r(b=>(b.delete("symbolId"),b.delete("symbolName"),b));return}c(x),r(b=>(a&&b.set("repoId",a),b.set("symbolId",x.id),b.set("symbolName",x.name),b))},[a,r]),W=h.useCallback(x=>{p(x),c(null),m(null),C(null)},[]),z=!!(o!=null&&o.id||s);return e.jsxs("div",{className:"h-full flex overflow-hidden",children:[e.jsxs("aside",{className:"w-72 shrink-0 border-r border-gray-800 flex flex-col overflow-hidden bg-gray-950",children:[e.jsx("div",{className:"px-4 py-3 border-b border-gray-800 shrink-0",children:e.jsx("h2",{className:"text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Blast Radius Analysis"})}),e.jsxs("div",{className:"flex-1 overflow-y-auto p-4 space-y-5",children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"block text-[10px] font-semibold text-gray-500 uppercase tracking-wider",children:"Repository"}),e.jsx(de,{repos:n,selectedId:a,onSelect:W})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"block text-[10px] font-semibold text-gray-500 uppercase tracking-wider",children:"Symbol"}),e.jsx(ue,{repoId:a,selectedSymbol:o,onSelect:F})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"block text-[10px] font-semibold text-gray-500 uppercase tracking-wider",children:"Analysis depth"}),e.jsx(xe,{value:f,onChange:g})]}),!o&&s&&u&&e.jsxs("div",{className:"px-3 py-2 bg-blue-600/10 border border-blue-600/30 rounded-lg",children:[e.jsx("p",{className:"text-[10px] text-gray-500 mb-0.5",children:"Analyzing"}),e.jsx("p",{className:"text-xs font-mono text-blue-300 truncate",children:u})]}),d&&e.jsxs("div",{className:"space-y-1.5",children:[e.jsx("label",{className:"block text-[10px] font-semibold text-gray-500 uppercase tracking-wider",children:"Summary"}),e.jsx(K,{data:d})]})]})]}),e.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden",children:[e.jsxs("div",{className:"flex items-center gap-3 px-4 py-2 border-b border-gray-800 shrink-0 bg-gray-900",children:[e.jsx("span",{className:"text-sm font-semibold text-gray-300",children:d?`${d.symbolName} — ${d.totalFiles-1} file${d.totalFiles-1!==1?"s":""} affected`:"Blast Radius"}),e.jsxs("div",{className:"ml-auto flex items-center gap-3",children:[d&&e.jsx(he,{mode:L,onChange:A}),d&&e.jsx("button",{type:"button",onClick:()=>{const x=(o==null?void 0:o.id)||s;a&&x&&E(a,x,f)},className:"px-2 py-1 text-xs bg-gray-800 hover:bg-gray-700 border border-gray-700 rounded text-gray-300 transition-colors",children:"Refresh"})]})]}),e.jsxs("div",{className:"flex-1 overflow-hidden relative",children:[y&&e.jsxs("div",{className:"flex items-center justify-center h-full gap-2 text-gray-500",children:[e.jsx("span",{className:"block w-4 h-4 rounded-full border-2 border-blue-500 border-t-transparent animate-spin"}),e.jsx("span",{className:"text-sm",children:"Analyzing blast radius…"})]}),!y&&N&&e.jsx("div",{className:"flex items-center justify-center h-full",children:e.jsxs("div",{className:"text-center max-w-sm",children:[e.jsx("div",{className:"text-red-400 font-medium mb-1",children:"Analysis failed"}),e.jsx("div",{className:"text-sm text-gray-500",children:N})]})}),!y&&!N&&!d&&e.jsx(pe,{hasSymbol:z}),!y&&!N&&d&&d.totalFiles<=1&&e.jsxs("div",{className:"flex flex-col items-center justify-center h-full text-center gap-3 text-gray-500",children:[e.jsxs("svg",{width:"40",height:"40",viewBox:"0 0 40 40",fill:"none","aria-hidden":"true",children:[e.jsx("circle",{cx:"20",cy:"20",r:"8",fill:"#3b82f6",fillOpacity:"0.2",stroke:"#3b82f6",strokeWidth:"1.5"}),e.jsx("text",{x:"20",y:"24",textAnchor:"middle",fill:"#3b82f6",fontSize:"10",fontWeight:"bold",children:"0"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-gray-300 font-medium",children:"No dependents found"}),e.jsxs("p",{className:"text-sm mt-0.5",children:["Nothing imports ",e.jsx("code",{className:"text-blue-400 font-mono",children:d.sourceFile})," within ",f," hop",f!==1?"s":"","."]})]})]}),!y&&!N&&d&&d.totalFiles>1&&L==="graph"&&e.jsx(re,{data:d}),!y&&!N&&d&&d.totalFiles>1&&L==="list"&&e.jsx("div",{className:"h-full overflow-y-auto p-4 scrollbar-thin",children:e.jsx(ce,{data:d,repoId:a})})]})]})]})}export{ye as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as le,j as t,b as u,d as oe,u as ie,r as p,a as k,A as G,L as X}from"./index-i3Q1XbEh.js";const f=le(e=>({mode:"complexity",enabled:!1,data:{},loading:!1,error:null,qualityAvailable:{},setMode:r=>e({mode:r}),setEnabled:r=>e({enabled:r}),setData:(r,n)=>e(a=>({data:{...a.data,[r]:n}})),setLoading:r=>e({loading:r}),setError:r=>e({error:r}),setQualityAvailable:(r,n)=>e(a=>({qualityAvailable:{...a.qualityAvailable,[r]:n}}))}));function _(e,r){return r==="complexity"?e.complexityScore:r==="churn"?e.churnScore:e.combinedScore}function B(e){const r=Math.min(Math.max(e,0),100);return`hsl(${Math.round(120-r*1.2)}, 70%, 45%)`}function ce(e,r){const n=new Map;for(const o of e){let l=n.get(o.filePath);l||(l={maxQualityScore:0,totalCC:0,ccCount:0,criticalCount:0},n.set(o.filePath,l)),l.maxQualityScore=Math.max(l.maxQualityScore,o.qualityScore),l.totalCC+=o.cyclomaticComplexity,l.ccCount+=1,o.riskLevel==="critical"&&(l.criticalCount+=1)}const a=new Map;for(const o of r){const l=Math.min(o.churnScore/10*100,100);a.set(o.filePath,{churnScore:l,commitCount:o.commitCount})}const i=new Set([...n.keys(),...a.keys()]),g={};for(const o of i){const l=n.get(o),c=a.get(o),m=(l==null?void 0:l.maxQualityScore)??0,v=(c==null?void 0:c.churnScore)??0,w=Math.round(m*.6+v*.4),x=l&&l.ccCount>0?Math.round(l.totalCC/l.ccCount*10)/10:0;g[o]={complexityScore:m,churnScore:v,combinedScore:w,avgComplexity:x,commitCount:(c==null?void 0:c.commitCount)??0,criticalSymbols:(l==null?void 0:l.criticalCount)??0}}return g}function de(e){var a;const r=((a=e.split(".").pop())==null?void 0:a.toLowerCase())??"";return{ts:"TS",tsx:"TX",js:"JS",jsx:"JX",vue:"VU",svelte:"SV",astro:"AS",py:"PY",go:"GO",rs:"RS",rb:"RB",java:"JV",kt:"KT",cs:"C#",cpp:"C+",c:"C ",h:"H ",php:"PHP",lua:"LU",r:"R ",dart:"DA",swift:"SW",ex:"EX",hs:"HS",scala:"SC",elixir:"EX",json:"JSON",yaml:"YAML",yml:"YML",toml:"TOML",md:"MD",txt:"TXT",css:"CSS",scss:"SCSS",html:"HTM",svg:"SVG",sh:"SH",bash:"SH",zsh:"SH",sql:"SQL",graphql:"GQL"}[r]??" "}function xe({name:e}){const r=de(e);return t.jsx("span",{className:"shrink-0 text-[9px] font-bold w-6 h-4 flex items-center justify-center rounded bg-gray-800 text-gray-500 font-mono leading-none","aria-hidden":"true",children:r})}function ue({status:e,title:r}){const n=e==="tested"?"bg-green-500":e==="untested"?"bg-red-500":"bg-gray-500";return t.jsx("span",{className:`shrink-0 w-1.5 h-1.5 rounded-full ${n}`,title:r,"aria-label":`Coverage: ${e}`})}function me(e){const r=[];return e.avgComplexity>0&&r.push(`Avg complexity: ${e.avgComplexity}`),e.commitCount>0&&r.push(`Churn: ${e.commitCount} commits/90d`),e.criticalSymbols>0&&r.push(`${e.criticalSymbols} critical symbol${e.criticalSymbols!==1?"s":""}`),r.length>0?r.join(" | "):"No metrics available"}function J(e,r,n,a){let i=null;for(const[g,o]of Object.entries(e)){const l=`${r}/${g}`;if(o.type==="file"){const c=n.get(l);if(c!==void 0){const m=_(c,a);i=i===null?m:Math.max(i,m)}}else{const c=J(o.children,l,n,a);c!==null&&(i=i===null?c:Math.max(i,c))}}return i}function Y(e){return Object.entries(e).sort(([r,n],[a,i])=>n.type!==i.type?n.type==="dir"?-1:1:r.localeCompare(a))}function Z({name:e,node:r,path:n,repoId:a,depth:i,onFileClick:g,coverageMap:o,heatScores:l,heatMode:c}){const m=u(h=>h.expandedDirs[a]),v=u(h=>h.toggleDir),w=u(h=>h.selectedFilePath),x=8+i*14,C=r.type==="dir"&&((m==null?void 0:m.has(n))??!1),y=r.type==="file"&&w===n;if(r.type==="dir"){const h=l&&c?J(r.children,n,l,c):null,E=h!==null?{borderLeftColor:B(h),borderLeftWidth:"2px",borderLeftStyle:"solid"}:void 0;return t.jsxs("div",{children:[t.jsxs("button",{onClick:()=>v(a,n),style:{paddingLeft:`${x}px`,...E},title:h!==null?`Max risk score: ${Math.round(h)}`:void 0,className:"flex items-center gap-1.5 w-full text-left py-[3px] pr-2 text-sm text-gray-400 hover:text-gray-100 hover:bg-gray-800/60 rounded transition-colors","aria-expanded":C,children:[t.jsx("svg",{className:`shrink-0 w-3 h-3 text-gray-600 transition-transform ${C?"rotate-90":""}`,viewBox:"0 0 6 10",fill:"currentColor","aria-hidden":"true",children:t.jsx("path",{d:"M1 1l4 4-4 4",stroke:"currentColor",strokeWidth:"1.5",fill:"none",strokeLinecap:"round",strokeLinejoin:"round"})}),t.jsx("svg",{className:"shrink-0 w-4 h-4 text-blue-400/70",viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":"true",children:C?t.jsx("path",{d:"M1.5 3A1.5 1.5 0 0 0 0 4.5v8A1.5 1.5 0 0 0 1.5 14h13a1.5 1.5 0 0 0 1.5-1.5V6.5A1.5 1.5 0 0 0 14.5 5H8.414l-1.5-1.5H1.5z"}):t.jsx("path",{d:"M.54 3.87.5 3a2 2 0 0 1 2-2h3.672a2 2 0 0 1 1.414.586l.828.828A2 2 0 0 0 9.828 3h3.982a2 2 0 0 1 1.992 2.181l-.637 7A2 2 0 0 1 13.174 14H2.826a2 2 0 0 1-1.991-1.819l-.637-7a2 2 0 0 1 .342-1.31zM8 1H2.5a1 1 0 0 0-1 1l.006.017A4.97 4.97 0 0 1 3.982 2h5.845A2 2 0 0 0 8 1z"})}),t.jsx("span",{className:"truncate text-xs font-medium",children:e}),t.jsx("span",{className:"ml-auto shrink-0 text-[10px] text-gray-600",children:r.fileCount})]}),C&&t.jsx("div",{role:"group","aria-label":e,children:Y(r.children).map(([j,S])=>t.jsx(Z,{name:j,node:S,path:`${n}/${j}`,repoId:a,depth:i+1,onFileClick:g,coverageMap:o,heatScores:l,heatMode:c},j))})]})}const N=o==null?void 0:o.get(n),b=l==null?void 0:l.get(n),L=b&&c?_(b,c):null,$=L!==null?{borderLeftColor:B(L),borderLeftWidth:"2px",borderLeftStyle:"solid"}:void 0;return t.jsxs("button",{onClick:()=>g(n),style:{paddingLeft:`${x}px`,...$},title:b?me(b):void 0,className:`flex items-center gap-1.5 w-full text-left py-[3px] pr-2 text-sm rounded transition-colors ${y?"bg-blue-900/50 text-blue-200":"text-gray-400 hover:text-gray-100 hover:bg-gray-800/60"}`,"aria-current":y?"true":void 0,children:[t.jsx("span",{className:"w-3 shrink-0","aria-hidden":"true"}),t.jsx(xe,{name:e}),t.jsx("span",{className:"truncate text-xs",children:e}),N&&t.jsx(ue,{status:N,title:`Coverage: ${N}`})]})}function he({tree:e,repoId:r,onFileClick:n,coverageMap:a,heatScores:i,heatMode:g}){return Object.keys(e).length===0?t.jsx("div",{className:"flex items-center justify-center h-32 text-gray-600 text-sm",children:"No files found"}):t.jsx("div",{className:"overflow-y-auto h-full scrollbar-thin py-1",role:"tree","aria-label":"File tree",children:Y(e).map(([o,l])=>t.jsx(Z,{name:o,node:l,path:o,repoId:r,depth:0,onFileClick:n,coverageMap:a,heatScores:i,heatMode:g},o))})}const W=["class","interface","type","enum","component","composable","hook","function","method","const","route","middleware","decorator"],K={class:"Classes",interface:"Interfaces",type:"Types",enum:"Enums",component:"Components",composable:"Composables",hook:"Hooks",function:"Functions",method:"Methods",const:"Constants",route:"Routes",middleware:"Middleware",decorator:"Decorators"},pe={class:"cls",interface:"int",type:"typ",enum:"enm",component:"cmp",composable:"cps",hook:"hk",function:"fn",method:"mth",const:"cst",route:"rte",middleware:"mdw",decorator:"dec"};function fe(e){switch(e){case"class":return"bg-blue-900/70 text-blue-300";case"interface":return"bg-indigo-900/70 text-indigo-300";case"type":return"bg-purple-900/70 text-purple-300";case"enum":return"bg-violet-900/70 text-violet-300";case"component":return"bg-emerald-900/70 text-emerald-300";case"composable":return"bg-teal-900/70 text-teal-300";case"hook":return"bg-cyan-900/70 text-cyan-300";case"function":return"bg-yellow-900/70 text-yellow-300";case"method":return"bg-orange-900/70 text-orange-300";case"const":return"bg-gray-800 text-gray-400";case"route":return"bg-rose-900/70 text-rose-300";case"middleware":return"bg-pink-900/70 text-pink-300";case"decorator":return"bg-amber-900/70 text-amber-300";default:return"bg-gray-800 text-gray-400"}}function ge({symbol:e,onSymbolClick:r}){return t.jsxs("button",{onClick:()=>r==null?void 0:r(e.id),className:"w-full text-left px-3 py-1.5 hover:bg-gray-800/60 rounded transition-colors group",children:[t.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[t.jsx("span",{className:`shrink-0 text-[9px] font-bold font-mono px-1 py-0.5 rounded ${fe(e.kind)}`,"aria-label":e.kind,children:pe[e.kind]??e.kind.slice(0,3)}),t.jsx("span",{className:"text-sm text-gray-200 font-medium truncate group-hover:text-blue-300 transition-colors",children:e.name})]}),e.signature&&t.jsx("p",{className:"text-[11px] text-gray-500 mt-0.5 truncate font-mono pl-8",children:e.signature}),e.summary&&t.jsx("p",{className:"text-[11px] text-gray-600 mt-0.5 truncate pl-8",children:e.summary})]})}function ye({kind:e,symbols:r,onSymbolClick:n}){return t.jsxs("section",{"aria-label":K[e]??e,className:"mb-3",children:[t.jsxs("div",{className:"flex items-center gap-2 px-3 py-1",children:[t.jsx("span",{className:"text-[10px] font-semibold text-gray-500 uppercase tracking-wider",children:K[e]??e}),t.jsxs("span",{className:"text-[10px] text-gray-600",children:["(",r.length,")"]})]}),t.jsx("div",{children:r.map(a=>t.jsx(ge,{symbol:a,onSymbolClick:n},a.id))})]})}function be(e){const r=new Map;for(const a of e){const i=r.get(a.kind)??[];i.push(a),r.set(a.kind,i)}return[...W.filter(a=>r.has(a)),...Array.from(r.keys()).filter(a=>!W.includes(a)).sort()].map(a=>[a,r.get(a)])}function je({fileSummary:e,onSymbolClick:r}){if(!e)return t.jsx("div",{className:"flex items-center justify-center h-full text-gray-600 text-sm",children:"Select a file to view its symbols"});if(e.symbols.length===0)return t.jsxs("div",{className:"h-full overflow-y-auto scrollbar-thin",children:[t.jsx("div",{className:"px-3 py-2 border-b border-gray-800",children:t.jsx("p",{className:"text-xs text-gray-500 truncate",children:e.filePath})}),t.jsx("div",{className:"flex items-center justify-center h-32 text-gray-600 text-sm",children:"No symbols in this file"})]});const n=be(e.symbols);return t.jsxs("div",{className:"h-full overflow-y-auto scrollbar-thin",children:[t.jsxs("div",{className:"px-3 py-2 border-b border-gray-800 shrink-0",children:[t.jsx("p",{className:"text-xs text-gray-400 truncate font-mono",children:e.filePath}),t.jsxs("p",{className:"text-[11px] text-gray-600 mt-0.5",children:[e.symbols.length," symbol",e.symbols.length!==1?"s":""]})]}),t.jsx("div",{className:"py-2",children:n.map(([a,i])=>t.jsx(ye,{kind:a,symbols:i,onSymbolClick:r},a))})]})}const ve=[{value:"complexity",label:"Complexity",title:"Colour by cyclomatic complexity (worst symbol per file)"},{value:"churn",label:"Churn",title:"Colour by commit frequency (commits per 90 days)"},{value:"combined",label:"Combined",title:"Weighted composite: 60 % complexity + 40 % churn"}],Ce=Array.from({length:11},(e,r)=>B(r*10)),Ne=`linear-gradient(to right, ${Ce.join(", ")})`;function we({mode:e,onModeChange:r}){return t.jsxs("div",{className:"px-3 py-2 border-b border-gray-800 bg-gray-900/80",children:[t.jsx("div",{className:"flex gap-1 mb-2",role:"group","aria-label":"Heatmap mode",children:ve.map(({value:n,label:a,title:i})=>t.jsx("button",{onClick:()=>r(n),title:i,"aria-pressed":e===n,className:`flex-1 text-[10px] py-0.5 rounded transition-colors ${e===n?"bg-blue-600 text-white font-semibold":"bg-gray-800 text-gray-400 hover:bg-gray-700 hover:text-gray-200"}`,children:a},n))}),t.jsxs("div",{children:[t.jsx("div",{className:"h-2 w-full rounded-sm",style:{background:Ne},"aria-hidden":"true"}),t.jsxs("div",{className:"flex justify-between text-[9px] text-gray-500 mt-0.5",children:[t.jsx("span",{children:"Low risk"}),t.jsx("span",{children:"High risk"})]})]})]})}function Se({repo:e,selectedFile:r}){const n=e.rootPath.split(/[/\\]/).pop()??e.repoId;return t.jsxs("nav",{"aria-label":"Breadcrumb",className:"flex items-center gap-1.5 text-sm text-gray-500 min-w-0",children:[t.jsx(X,{to:"/",className:"hover:text-gray-300 transition-colors shrink-0",children:"Repos"}),t.jsx("span",{"aria-hidden":"true",className:"text-gray-700",children:"/"}),t.jsx("span",{className:`truncate ${r?"hover:text-gray-300 cursor-pointer":"text-gray-300"}`,children:n}),r&&t.jsxs(t.Fragment,{children:[t.jsx("span",{"aria-hidden":"true",className:"text-gray-700 shrink-0",children:"/"}),t.jsx("span",{className:"text-gray-300 truncate text-xs font-mono",children:r})]})]})}function U({label:e,value:r}){return t.jsxs("div",{className:"flex flex-col items-center px-4 py-2 bg-gray-800/50 rounded-lg border border-gray-700/50",children:[t.jsx("span",{className:"text-xs text-gray-500",children:e}),t.jsx("span",{className:"text-lg font-bold text-gray-100 mt-0.5",children:r})]})}function ke({repo:e}){const r=new Date(e.lastIndexed).toLocaleString();return t.jsxs("div",{className:"flex flex-wrap items-center gap-3 px-6 py-3 border-b border-gray-800 bg-gray-900/50",children:[t.jsx(U,{label:"Symbols",value:e.symbolCount.toLocaleString()}),t.jsx(U,{label:"Files",value:e.fileCount.toLocaleString()}),t.jsxs(X,{to:`/repos/${encodeURIComponent(e.repoId)}/graph`,className:"flex items-center gap-1.5 px-3 py-1.5 text-xs bg-gray-800 hover:bg-gray-700 border border-gray-700 rounded text-gray-300 transition-colors",children:[t.jsxs("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:[t.jsx("circle",{cx:"2",cy:"6",r:"1.5",fill:"currentColor"}),t.jsx("circle",{cx:"10",cy:"2",r:"1.5",fill:"currentColor"}),t.jsx("circle",{cx:"10",cy:"10",r:"1.5",fill:"currentColor"}),t.jsx("line",{x1:"3.5",y1:"5.2",x2:"8.5",y2:"2.8",stroke:"currentColor",strokeWidth:"1"}),t.jsx("line",{x1:"3.5",y1:"6.8",x2:"8.5",y2:"9.2",stroke:"currentColor",strokeWidth:"1"})]}),"Dep Graph"]}),t.jsxs("div",{className:"ml-auto text-xs text-gray-600 hidden sm:block",children:["Last indexed: ",t.jsx("span",{className:"text-gray-500",children:r})]})]})}function Le(){return t.jsx("div",{className:"p-3 space-y-1.5 animate-pulse",children:[80,65,90,55,70,45,75].map((e,r)=>t.jsx("div",{className:"h-5 bg-gray-800 rounded",style:{width:`${e}%`}},r))})}function V({message:e}){return t.jsx("div",{className:"m-3 p-3 bg-red-950 border border-red-800 rounded text-red-300 text-sm",children:e})}function Ee(){return t.jsxs("div",{className:"mx-3 mt-2 px-3 py-2 bg-yellow-950/60 border border-yellow-800/50 rounded text-yellow-300/80 text-xs",children:["Run analysis to enable heatmap.",t.jsx("br",{}),t.jsx("span",{className:"text-yellow-500/70",children:"Re-index this repo to compute quality metrics."})]})}function Me({enabled:e,loading:r,onToggle:n}){return t.jsxs("button",{onClick:n,title:e?"Disable heatmap":"Enable heatmap","aria-pressed":e,disabled:r,className:`flex items-center gap-1 px-2 py-0.5 text-[10px] rounded transition-colors ${e?"bg-orange-600/80 text-white hover:bg-orange-500":"bg-gray-800 text-gray-500 hover:bg-gray-700 hover:text-gray-300"} disabled:opacity-50 disabled:cursor-wait`,children:[t.jsx("svg",{width:"10",height:"10",viewBox:"0 0 16 16",fill:"currentColor","aria-hidden":"true",children:t.jsx("path",{d:"M8 16c3.314 0 6-2 6-5.5 0-1.5-.5-4-2.5-6 .25 1.5-1.25 2-1.25 2C11 4 9 .5 6 0c.357 2 .5 4-2 6-1.25 1-2 2.729-2 4.5C2 14 4.686 16 8 16zm0-1c-1.657 0-3-1-3-2.75 0-.75.25-2 1.25-3C6.125 10.5 7 11 7 11c-.375-1.25.5-3.25 2-3.75-.179 1-.25 2 1 3 .625.5 1 1.364 1 2.25C11 14 9.657 15 8 15z"})}),r?"Loading…":e?"Heatmap on":"Heatmap"]})}function $e(){const{id:e}=oe(),r=ie(),n=u(s=>s.repos),a=u(s=>s.reposLoaded),i=u(s=>s.trees),g=u(s=>s.outlines),o=u(s=>s.selectedFilePath),l=u(s=>s.setRepos),c=u(s=>s.setTree),m=u(s=>s.setOutline),v=u(s=>s.selectRepo),w=u(s=>s.selectFile),x=f(s=>s.enabled),C=f(s=>s.mode),y=f(s=>e?s.data[e]:void 0),N=f(s=>s.loading),b=f(s=>s.error),L=f(s=>e?s.qualityAvailable[e]:null),$=f(s=>s.setEnabled),h=f(s=>s.setMode),E=f(s=>s.setData),j=f(s=>s.setLoading),S=f(s=>s.setError),O=f(s=>s.setQualityAvailable),[R,H]=p.useState(!1),[D,Q]=p.useState(null),[q,P]=p.useState(!1),[T,z]=p.useState(null),I=n.find(s=>s.repoId===e),M=e?i[e]:void 0,A=e?g[e]:void 0;p.useEffect(()=>{a||!e||k.listRepos().then(s=>l(s.repos)).catch(()=>{})},[a,e,l]),p.useEffect(()=>{e&&v(e)},[e,v]),p.useEffect(()=>{if(!e||M)return;let s=!1;return H(!0),Q(null),k.getFileTree(e).then(d=>{s||(c(e,d),H(!1))}).catch(d=>{s||(Q(d instanceof G?d.message:String(d)),H(!1))}),()=>{s=!0}},[e,M,c]),p.useEffect(()=>{if(!e||A)return;let s=!1;return P(!0),z(null),k.getRepoOutline(e).then(d=>{s||(m(e,d.files),P(!1))}).catch(d=>{s||(z(d instanceof G?d.message:String(d)),P(!1))}),()=>{s=!0}},[e,A,m]),p.useEffect(()=>{if(!x||!e||y)return;let s=!1;return j(!0),S(null),Promise.all([k.getQualityMetrics(e).catch(()=>null),k.getChurnMetrics(e).catch(()=>null)]).then(([d,F])=>{if(s)return;const ne=((d==null?void 0:d.symbolsAnalyzed)??0)>0;O(e,ne);const ae=ce((d==null?void 0:d.worstOffenders)??[],(F==null?void 0:F.topChurn)??[]);E(e,ae),j(!1)}).catch(d=>{s||(S(String(d)),j(!1))}),()=>{s=!0}},[x,e,y,j,S,E,O]);const ee=p.useCallback(s=>{w(s)},[w]),te=p.useCallback(s=>{e&&r(`/symbols/${encodeURIComponent(s)}?repoId=${encodeURIComponent(e)}`)},[e,r]),re=p.useMemo(()=>{if(!(!x||!y))return new Map(Object.entries(y))},[x,y]),se=!o||!A?null:A.find(s=>s.filePath===o)??{filePath:o,symbols:[]};return e?t.jsxs("div",{className:"h-full flex flex-col overflow-hidden",children:[t.jsx("div",{className:"px-6 py-3 border-b border-gray-800 shrink-0 min-w-0",children:t.jsx(Se,{repo:I??{repoId:e,rootPath:e,symbolCount:0,fileCount:0,lastIndexed:""},selectedFile:o})}),I&&t.jsx(ke,{repo:I}),t.jsxs("div",{className:"flex-1 flex overflow-hidden",children:[t.jsxs("div",{className:"w-64 shrink-0 border-r border-gray-800 flex flex-col overflow-hidden",children:[t.jsxs("div",{className:"px-3 py-2 border-b border-gray-800 shrink-0 flex items-center gap-2",children:[t.jsx("span",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wide flex-1",children:"Files"}),t.jsx(Me,{enabled:x,loading:N,onToggle:()=>$(!x)})]}),x&&!N&&!b&&t.jsx(we,{mode:C,onModeChange:s=>h(s)}),x&&!N&&L===!1&&t.jsx(Ee,{}),x&&b&&t.jsx("div",{className:"mx-3 mt-2 px-3 py-2 bg-red-950/60 border border-red-800/50 rounded text-red-300/80 text-xs",children:b}),t.jsxs("div",{className:"flex-1 overflow-hidden",children:[R&&t.jsx(Le,{}),D&&t.jsx(V,{message:D}),!R&&!D&&M&&t.jsx(he,{tree:M.tree,repoId:e,onFileClick:ee,heatScores:re,heatMode:x?C:void 0})]})]}),t.jsxs("div",{className:"flex-1 flex flex-col overflow-hidden",children:[t.jsxs("div",{className:"px-3 py-2 border-b border-gray-800 shrink-0",children:[t.jsx("span",{className:"text-xs font-semibold text-gray-500 uppercase tracking-wide",children:"Symbols"}),q&&t.jsx("span",{className:"ml-2 text-[10px] text-gray-600 animate-pulse",children:"loading…"})]}),t.jsxs("div",{className:"flex-1 overflow-hidden",children:[T&&t.jsx(V,{message:T}),!T&&t.jsx(je,{fileSummary:se,onSymbolClick:te})]})]})]})]}):t.jsx("div",{className:"flex items-center justify-center h-full text-gray-500",children:"Invalid repository ID."})}export{$e as default};
|