codebaseiq 0.1.0 → 0.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/CHANGELOG.md +47 -0
- package/dist/augment-vue-worker.js +1 -1
- package/dist/{chunk-DQMDCD24.js → chunk-27PHVDKL.js} +2 -2
- package/dist/{chunk-ZMI2JSX2.js → chunk-2DMVFAY7.js} +2 -2
- package/dist/{chunk-5PUWMSDU.js → chunk-2E6BTWER.js} +2 -2
- package/dist/{chunk-YESXMKX3.js → chunk-2F5ERMNI.js} +2 -2
- package/dist/chunk-2VKB5CMA.js +60 -0
- package/dist/{chunk-NNJ2KZZG.js → chunk-327YK6TB.js} +4 -4
- package/dist/chunk-347TXATM.js +2 -0
- package/dist/{chunk-VEXUL62T.js → chunk-35YYZD3D.js} +2 -2
- package/dist/chunk-36WRYYTE.js +3 -0
- package/dist/chunk-37TKC6MB.js +2 -0
- package/dist/{chunk-FAJQ7LWY.js → chunk-3AC56WAR.js} +2 -2
- package/dist/{chunk-JE3WZ6II.js → chunk-3NUZVLR7.js} +2 -2
- package/dist/{chunk-UZGZB3VB.js → chunk-3XFJUWJE.js} +2 -2
- package/dist/{chunk-OVTS4DKB.js → chunk-4AOOSCZ7.js} +2 -2
- package/dist/{chunk-LU3BMVH2.js → chunk-4IFISPQW.js} +2 -2
- package/dist/chunk-4NHWNAWQ.js +11 -0
- package/dist/chunk-4O52YNKL.js +5 -0
- package/dist/{chunk-HPJRBHVT.js → chunk-54K6556S.js} +2 -2
- package/dist/{chunk-HRWGYWRJ.js → chunk-57GCCPLS.js} +2 -2
- package/dist/{chunk-J77SU6VA.js → chunk-57KEZDPT.js} +2 -2
- package/dist/{chunk-OFBE4NGP.js → chunk-57KFVPVZ.js} +2 -2
- package/dist/{chunk-WOQBZPIF.js → chunk-5BDK6QC3.js} +2 -2
- package/dist/{chunk-7MGU3HPH.js → chunk-5IO2APSS.js} +2 -2
- package/dist/chunk-5NJPH3QZ.js +61 -0
- package/dist/{chunk-GW6Z3WGY.js → chunk-5WXOEJ4G.js} +2 -2
- package/dist/chunk-5XEVXVTK.js +3 -0
- package/dist/{chunk-RR7SX44N.js → chunk-6OVNYYY4.js} +2 -2
- package/dist/{chunk-ZV3JV5G5.js → chunk-6SDEQTVY.js} +2 -2
- package/dist/{chunk-EF2R3WNQ.js → chunk-6URCE5QY.js} +2 -2
- package/dist/{chunk-UCD3H3UZ.js → chunk-6ZV5EDUT.js} +2 -2
- package/dist/{chunk-C6SBF2WH.js → chunk-77GHPR2R.js} +2 -2
- package/dist/{chunk-YVCIMIOC.js → chunk-7R64XY4Y.js} +2 -2
- package/dist/{chunk-VXYS3FZD.js → chunk-7Z7HCZ7J.js} +2 -2
- package/dist/{chunk-CO5R3UNA.js → chunk-A67HT5FR.js} +2 -2
- package/dist/{chunk-UDS562V4.js → chunk-A7XQT7MH.js} +2 -2
- package/dist/{chunk-RDBI2RXU.js → chunk-ACZDU5GK.js} +2 -2
- package/dist/{chunk-FETNQCFO.js → chunk-AM5SUGHF.js} +2 -2
- package/dist/{chunk-NNOKTMZT.js → chunk-B2E3HZ2A.js} +2 -2
- package/dist/{chunk-CVYSU6BX.js → chunk-BH5CE4LN.js} +2 -2
- package/dist/chunk-BLKYYQ7C.js +543 -0
- package/dist/{chunk-4WKDMDEW.js → chunk-BX2U3QQV.js} +2 -2
- package/dist/{chunk-ZKX2FRS6.js → chunk-CANBLFVQ.js} +2 -2
- package/dist/{chunk-SMRBZ6EC.js → chunk-CCRZLRWJ.js} +2 -2
- package/dist/chunk-CDWSLAPN.js +21 -0
- package/dist/chunk-CIVYHK7U.js +22 -0
- package/dist/{chunk-L57ZKWVG.js → chunk-CMXW7MFV.js} +2 -2
- package/dist/{chunk-T3DGWPXM.js → chunk-CSZOQ7YO.js} +2 -2
- package/dist/{chunk-ZZXSWSN6.js → chunk-CWMHWD56.js} +2 -2
- package/dist/{chunk-6NW7MU72.js → chunk-CZEIHYMP.js} +2 -2
- package/dist/{chunk-DO6WQD2T.js → chunk-D62CTZX6.js} +2 -2
- package/dist/{chunk-XWUOUWYI.js → chunk-DFPAZXLU.js} +2 -2
- package/dist/{chunk-MOVBWNIP.js → chunk-DKJXK3HA.js} +2 -2
- package/dist/{chunk-XMQ23E27.js → chunk-DLC6JDN7.js} +2 -2
- package/dist/chunk-DUKHVPU5.js +4 -0
- package/dist/{chunk-ID63777H.js → chunk-DVYG3JTA.js} +2 -2
- package/dist/{chunk-NE6IU5ZD.js → chunk-EFFMFK7C.js} +2 -2
- package/dist/{chunk-I2T2LLK2.js → chunk-EM5UHLAM.js} +2 -2
- package/dist/chunk-EN4AHLL3.js +3 -0
- package/dist/chunk-EXMVF3JR.js +3 -0
- package/dist/{chunk-SWHMHUKF.js → chunk-FEBLLMTL.js} +2 -2
- package/dist/chunk-FIXYHQ3W.js +3 -0
- package/dist/{chunk-RKEJ6VTF.js → chunk-FLLXYUOL.js} +2 -2
- package/dist/{chunk-KWVHSKHK.js → chunk-FPDL2TUB.js} +2 -2
- package/dist/chunk-FQA3KIFX.js +17 -0
- package/dist/chunk-FWY2PRIF.js +3 -0
- package/dist/chunk-FY5V4V4F.js +2 -0
- package/dist/chunk-G2XUZCF2.js +88 -0
- package/dist/{chunk-QHRNXP3C.js → chunk-GXVDTHFC.js} +2 -2
- package/dist/{chunk-6MUIJMVL.js → chunk-H3CKAL6P.js} +2 -2
- package/dist/chunk-H5QXP63L.js +2 -0
- package/dist/{chunk-VUIYB2V3.js → chunk-HBQGKMM3.js} +2 -2
- package/dist/{chunk-PYAB5SM6.js → chunk-HBXZAGY6.js} +2 -2
- package/dist/{chunk-NNO6A2PO.js → chunk-HCMQZPEO.js} +2 -2
- package/dist/{chunk-Q65CQ4XL.js → chunk-HHBBGWES.js} +2 -2
- package/dist/{chunk-GTXSJDCO.js → chunk-HIEXRDJF.js} +2 -2
- package/dist/{chunk-4FC325IF.js → chunk-HYKSLTAR.js} +2 -2
- package/dist/{chunk-XLQ3GLWZ.js → chunk-I2KP4AGR.js} +2 -2
- package/dist/chunk-I5FCDTK2.js +2 -0
- package/dist/{chunk-QKPLA6IC.js → chunk-I645ZF75.js} +2 -2
- package/dist/{chunk-FDGD5AB5.js → chunk-IBM3F2BJ.js} +2 -2
- package/dist/{chunk-Q72QSKXC.js → chunk-IEL6Q5W3.js} +38 -38
- package/dist/{chunk-NCZUNH3E.js → chunk-IGQQUENU.js} +12 -12
- package/dist/chunk-IGYAZPRX.js +4 -0
- package/dist/chunk-IOVPAZWP.js +3 -0
- package/dist/{chunk-OL6KJP3N.js → chunk-IVJJNVSX.js} +2 -2
- package/dist/{chunk-AKB7V7TV.js → chunk-IWAMYGPN.js} +2 -2
- package/dist/chunk-IYBIBMPF.js +90 -0
- package/dist/{chunk-IOP6FWIM.js → chunk-J24VICI5.js} +2 -2
- package/dist/{chunk-C7QOQX32.js → chunk-JN5LIBT3.js} +2 -2
- package/dist/{chunk-O6QTXQPJ.js → chunk-JOALNFY3.js} +2 -2
- package/dist/{chunk-GCHRX4YW.js → chunk-JUO3Z644.js} +2 -2
- package/dist/{chunk-BJ6SQAEN.js → chunk-JXHLB7TP.js} +2 -2
- package/dist/{chunk-IJ4HMYBE.js → chunk-JYX5UZSZ.js} +2 -2
- package/dist/chunk-K2O7SBAU.js +2 -0
- package/dist/{chunk-OLF4MA5W.js → chunk-K5G7SPAG.js} +2 -2
- package/dist/{chunk-YSNONTJ2.js → chunk-KDYQQJ6X.js} +2 -2
- package/dist/{chunk-7NVGT435.js → chunk-KM4QRWI5.js} +2 -2
- package/dist/{chunk-HKQUXIFO.js → chunk-KNV5VFDV.js} +2 -2
- package/dist/chunk-L3YSDLNB.js +2 -0
- package/dist/{chunk-EZNMUY67.js → chunk-LAGDJXFY.js} +2 -2
- package/dist/{chunk-ENCCHKM6.js → chunk-LY2NB5XR.js} +4 -4
- package/dist/chunk-M4EVGA5S.js +14 -0
- package/dist/chunk-M7LAIM77.js +127 -0
- package/dist/{chunk-BVAJLC5A.js → chunk-MRGTCMDK.js} +2 -2
- package/dist/{chunk-OZYRSMSH.js → chunk-MT5W4DUG.js} +2 -2
- package/dist/{chunk-VE5AVNMP.js → chunk-MTMF4N7F.js} +2 -2
- package/dist/chunk-N3Q3AWGW.js +545 -0
- package/dist/{chunk-TXXOEMZJ.js → chunk-NDGTJHQN.js} +2 -2
- package/dist/chunk-NIO346UL.js +2 -0
- package/dist/chunk-NJA4MMBD.js +2 -0
- package/dist/{chunk-7FND7D7N.js → chunk-NK76RSB6.js} +2 -2
- package/dist/{chunk-H3LGFZVK.js → chunk-NTRW52UR.js} +2 -2
- package/dist/{chunk-JOIRNPPY.js → chunk-OJFLPVBP.js} +2 -2
- package/dist/{chunk-KMITESMT.js → chunk-OMBRP7BB.js} +2 -2
- package/dist/{chunk-UP3BUZR5.js → chunk-OVKZM2XI.js} +2 -2
- package/dist/{chunk-MVB3DAEY.js → chunk-PARCKE3Q.js} +2 -2
- package/dist/{chunk-CAUCPUOF.js → chunk-PFPHS4NO.js} +2 -2
- package/dist/chunk-PHPQ24UG.js +22 -0
- package/dist/chunk-PLZXWZHY.js +77 -0
- package/dist/{chunk-34WBMAYK.js → chunk-PNVZIJ57.js} +2 -2
- package/dist/{chunk-SYDJMPES.js → chunk-QKVTWODE.js} +2 -2
- package/dist/{chunk-FW53T7EB.js → chunk-QLTFXVUI.js} +2 -2
- package/dist/{chunk-PBI2LFKH.js → chunk-QMGWSEPL.js} +2 -2
- package/dist/{chunk-CQP3THUZ.js → chunk-QVHZB75Z.js} +2 -2
- package/dist/{chunk-6BQ3DSPK.js → chunk-QVWDQTMG.js} +2 -2
- package/dist/{chunk-ST7V3SKN.js → chunk-RCPZOPV6.js} +2 -2
- package/dist/chunk-RJWAB4VR.js +345 -0
- package/dist/chunk-RRPK327J.js +20 -0
- package/dist/chunk-RVYLJDXC.js +21 -0
- package/dist/chunk-RWKEXCHU.js +3 -0
- package/dist/{chunk-L4NRUAGJ.js → chunk-S5SKXCND.js} +2 -2
- package/dist/{chunk-RBAS5ZHI.js → chunk-S64NCE2Z.js} +2 -2
- package/dist/{chunk-WMPRTGH2.js → chunk-SF34QLK2.js} +2 -2
- package/dist/{chunk-ANFVSJWQ.js → chunk-SJZQ2PTZ.js} +2 -2
- package/dist/{chunk-4XTAUQFD.js → chunk-SRY26ITJ.js} +2 -2
- package/dist/chunk-SV2LEFVM.js +2 -0
- package/dist/{chunk-7XAN6GKB.js → chunk-T3YFIJ5P.js} +2 -2
- package/dist/chunk-T55YPJGB.js +3 -0
- package/dist/chunk-TAJ6UGCO.js +21 -0
- package/dist/{chunk-PIOMTC27.js → chunk-TUTSO7UZ.js} +2 -2
- package/dist/{chunk-FQKZWM4L.js → chunk-U24M5RQM.js} +5 -5
- package/dist/{chunk-XME3HPXZ.js → chunk-U2XX3BT4.js} +2 -2
- package/dist/{chunk-SZD2KF7Q.js → chunk-UWB5WMC2.js} +2 -2
- package/dist/{chunk-6CS3UQTN.js → chunk-VCL7FK3E.js} +2 -2
- package/dist/{chunk-N3IQCBCF.js → chunk-VCWAJPXQ.js} +2 -2
- package/dist/{chunk-LZYFLFEH.js → chunk-VG55NFXF.js} +2 -2
- package/dist/{chunk-PTAWHLVJ.js → chunk-VLTUX4IF.js} +2 -2
- package/dist/{chunk-JEJLSICM.js → chunk-VVCBMH5O.js} +2 -2
- package/dist/{chunk-JSOYNVWH.js → chunk-VYZQZ4ZN.js} +2 -2
- package/dist/chunk-W3FK73MD.js +8 -0
- package/dist/{chunk-UNBY47BC.js → chunk-W6C6QTXJ.js} +2 -2
- package/dist/chunk-WH5SYOMD.js +2 -0
- package/dist/chunk-WJOQC4P7.js +7 -0
- package/dist/chunk-WO47BIPY.js +3 -0
- package/dist/chunk-WOOTEWQT.js +239 -0
- package/dist/{chunk-UBGWN7I4.js → chunk-X5I2BQGX.js} +2 -2
- package/dist/{chunk-PX4RYAAK.js → chunk-XNUWRTYM.js} +2 -2
- package/dist/{chunk-ICFDQHAM.js → chunk-XUJM6474.js} +2 -2
- package/dist/chunk-XYLV727H.js +21 -0
- package/dist/{chunk-TRRC4ZJ7.js → chunk-YFQPWKHR.js} +2 -2
- package/dist/{chunk-NEDP5RFQ.js → chunk-YIOQJ45A.js} +2 -2
- package/dist/{chunk-Y6KHROC3.js → chunk-YXJ4IAHH.js} +2 -2
- package/dist/chunk-YYFV32WR.js +3 -0
- package/dist/{chunk-BH5F2Q4O.js → chunk-ZB3V5QM7.js} +2 -2
- package/dist/chunk-ZJZQ7Q2Q.js +3 -0
- package/dist/{chunk-EMNIHCRB.js → chunk-ZNQCR656.js} +2 -2
- package/dist/{chunk-TIIC3ZE7.js → chunk-ZOEDRCR4.js} +2 -2
- package/dist/cli-context-TSADTXLB.js +2 -0
- package/dist/cli-context-XEPPF4RX.js +3 -0
- package/dist/cli-program-KJGQEM72.js +7 -0
- package/dist/cli.js +1 -1
- package/dist/{code-DlqpBDd0.d.ts → code-CDe-mIjx.d.ts} +1 -1
- package/dist/code-viewer-YGDON6SY.js +12 -0
- package/dist/code-viewer-ZCTHXQ5C.js +11 -0
- package/dist/command-descriptors-5VAB2MZX.js +335 -0
- package/dist/command-descriptors-EAHKIRAG.js +337 -0
- package/dist/{config-types-BNoC96J3.d.ts → config-types-D6X5S68_.d.ts} +50 -0
- package/dist/{db-D7sauVFH.d.ts → db-DmRNdCtm.d.ts} +1 -1
- package/dist/direct-navigation-B3SGOOBW.js +2 -0
- package/dist/direct-navigation-ZL362KXF.js +3 -0
- package/dist/{graph-evidence-BIFqyisO.d.ts → graph-evidence-Bs54NWws.d.ts} +1 -1
- package/dist/{health-DJaZXg8I.d.ts → health-BnzbSLCE.d.ts} +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/invocation-command-descriptors-CSUGUHTT.js +2 -0
- package/dist/invocation-command-descriptors-PPVZOIE5.js +3 -0
- package/dist/output-continuation-command-FTVVBVSN.js +2 -0
- package/dist/output-continuation-command-ITPRC3YV.js +3 -0
- package/dist/project-reindex-7HZSLLLY.js +3 -0
- package/dist/project-reindex-NGM3DYBN.js +2 -0
- package/dist/queries/affected.d.ts +2 -2
- package/dist/queries/affected.js +1 -1
- package/dist/queries/anchors.d.ts +2 -2
- package/dist/queries/anchors.js +1 -1
- package/dist/queries/architecture.d.ts +2 -2
- package/dist/queries/architecture.js +1 -1
- package/dist/queries/bottlenecks.d.ts +2 -2
- package/dist/queries/bottlenecks.js +1 -1
- package/dist/queries/by-kind.d.ts +2 -2
- package/dist/queries/by-kind.js +1 -1
- package/dist/queries/call-graph.d.ts +2 -2
- package/dist/queries/call-graph.js +1 -1
- package/dist/queries/change-surface.d.ts +2 -2
- package/dist/queries/change-surface.js +1 -1
- package/dist/queries/cleanup-plan.d.ts +2 -2
- package/dist/queries/cleanup-plan.js +1 -1
- package/dist/queries/co-change.d.ts +2 -2
- package/dist/queries/co-change.js +1 -1
- package/dist/queries/code.d.ts +3 -3
- package/dist/queries/code.js +1 -1
- package/dist/queries/complexity-hotspots.d.ts +2 -2
- package/dist/queries/complexity-hotspots.js +1 -1
- package/dist/queries/complexity.d.ts +2 -2
- package/dist/queries/complexity.js +1 -1
- package/dist/queries/context.d.ts +2 -2
- package/dist/queries/context.js +1 -1
- package/dist/queries/convergence.d.ts +2 -2
- package/dist/queries/convergence.js +1 -1
- package/dist/queries/coupling.d.ts +2 -2
- package/dist/queries/coupling.js +1 -1
- package/dist/queries/cycles.d.ts +2 -2
- package/dist/queries/cycles.js +1 -1
- package/dist/queries/dataflow.d.ts +2 -2
- package/dist/queries/dataflow.js +1 -1
- package/dist/queries/dead.d.ts +2 -2
- package/dist/queries/dead.js +1 -1
- package/dist/queries/decorative-checkers.d.ts +2 -2
- package/dist/queries/decorative-checkers.js +1 -1
- package/dist/queries/deep-chains.d.ts +2 -2
- package/dist/queries/deep-chains.js +1 -1
- package/dist/queries/dependence-slice.d.ts +3 -3
- package/dist/queries/dependence-slice.js +1 -1
- package/dist/queries/dependency-depth.d.ts +2 -2
- package/dist/queries/dependency-depth.js +1 -1
- package/dist/queries/deps.d.ts +2 -2
- package/dist/queries/deps.js +1 -1
- package/dist/queries/diff-impact.d.ts +2 -2
- package/dist/queries/diff-impact.js +1 -1
- package/dist/queries/doc-drift.d.ts +2 -2
- package/dist/queries/doc-drift.js +1 -1
- package/dist/queries/drift.d.ts +2 -2
- package/dist/queries/drift.js +1 -1
- package/dist/queries/duplicate-bodies.d.ts +2 -2
- package/dist/queries/duplicate-bodies.js +1 -1
- package/dist/queries/entry-map.d.ts +2 -2
- package/dist/queries/entry-map.js +1 -1
- package/dist/queries/evidence.d.ts +3 -3
- package/dist/queries/evidence.js +1 -1
- package/dist/queries/extract-candidates.d.ts +2 -2
- package/dist/queries/extract-candidates.js +1 -1
- package/dist/queries/fan.d.ts +2 -2
- package/dist/queries/fan.js +1 -1
- package/dist/queries/files.d.ts +2 -2
- package/dist/queries/files.js +1 -1
- package/dist/queries/health.d.ts +3 -3
- package/dist/queries/health.js +1 -1
- package/dist/queries/hierarchy.d.ts +2 -2
- package/dist/queries/hierarchy.js +1 -1
- package/dist/queries/hotspots.d.ts +2 -2
- package/dist/queries/hotspots.js +1 -1
- package/dist/queries/imports.d.ts +2 -2
- package/dist/queries/imports.js +1 -1
- package/dist/queries/incomplete-migration.d.ts +2 -2
- package/dist/queries/incomplete-migration.js +1 -1
- package/dist/queries/index.d.ts +5 -5
- package/dist/queries/index.js +1 -1
- package/dist/queries/isolated.d.ts +2 -2
- package/dist/queries/isolated.js +1 -1
- package/dist/queries/locality-candidates.d.ts +2 -2
- package/dist/queries/locality-candidates.js +1 -1
- package/dist/queries/members.d.ts +2 -2
- package/dist/queries/members.js +1 -1
- package/dist/queries/methods.d.ts +2 -2
- package/dist/queries/methods.js +1 -1
- package/dist/queries/not-implemented.d.ts +2 -2
- package/dist/queries/not-implemented.js +1 -1
- package/dist/queries/outline.d.ts +2 -2
- package/dist/queries/outline.js +1 -1
- package/dist/queries/passthrough-candidates.d.ts +2 -2
- package/dist/queries/passthrough-candidates.js +1 -1
- package/dist/queries/plan-context.d.ts +2 -2
- package/dist/queries/plan-context.js +1 -1
- package/dist/queries/react-component-duplicates.d.ts +2 -2
- package/dist/queries/react-component-duplicates.js +1 -1
- package/dist/queries/react-hook-candidates.d.ts +2 -2
- package/dist/queries/react-hook-candidates.js +1 -1
- package/dist/queries/react-large-component-pressure.d.ts +2 -2
- package/dist/queries/react-large-component-pressure.js +1 -1
- package/dist/queries/recent-duplicates.d.ts +2 -2
- package/dist/queries/recent-duplicates.js +1 -1
- package/dist/queries/redundant-reexports.d.ts +2 -2
- package/dist/queries/redundant-reexports.js +1 -1
- package/dist/queries/reference-neighborhood.d.ts +2 -2
- package/dist/queries/reference-neighborhood.js +1 -1
- package/dist/queries/reference-reachability.d.ts +2 -2
- package/dist/queries/reference-reachability.js +1 -1
- package/dist/queries/refs.d.ts +2 -2
- package/dist/queries/refs.js +1 -1
- package/dist/queries/self-audit.d.ts +2 -2
- package/dist/queries/self-audit.js +1 -1
- package/dist/queries/similar-chains.d.ts +2 -2
- package/dist/queries/similar-chains.js +1 -1
- package/dist/queries/similar-files.d.ts +2 -2
- package/dist/queries/similar-files.js +1 -1
- package/dist/queries/similar-signatures.d.ts +2 -2
- package/dist/queries/similar-signatures.js +1 -1
- package/dist/queries/similar.d.ts +2 -2
- package/dist/queries/similar.js +1 -1
- package/dist/queries/slice.d.ts +2 -2
- package/dist/queries/slice.js +1 -1
- package/dist/queries/source-inspection.d.ts +4 -4
- package/dist/queries/source-inspection.js +1 -1
- package/dist/queries/source-search.d.ts +2 -2
- package/dist/queries/source-search.js +1 -1
- package/dist/queries/stale-abstractions.d.ts +2 -2
- package/dist/queries/stale-abstractions.js +1 -1
- package/dist/queries/stats.d.ts +2 -2
- package/dist/queries/surface.d.ts +2 -2
- package/dist/queries/surface.js +1 -1
- package/dist/queries/symbols.d.ts +2 -2
- package/dist/queries/symbols.js +1 -1
- package/dist/queries/system-map.d.ts +2 -2
- package/dist/queries/system-map.js +1 -1
- package/dist/queries/system.d.ts +2 -2
- package/dist/queries/system.js +1 -1
- package/dist/queries/test-quality.d.ts +2 -2
- package/dist/queries/test-quality.js +1 -1
- package/dist/queries/trace.d.ts +2 -2
- package/dist/queries/trace.js +1 -1
- package/dist/queries/twin-ab.d.ts +2 -2
- package/dist/queries/twin-ab.js +1 -1
- package/dist/queries/twin-drift.d.ts +2 -2
- package/dist/queries/twin-drift.js +1 -1
- package/dist/queries/unused-imports.d.ts +2 -2
- package/dist/queries/unused-imports.js +1 -1
- package/dist/queries/unused-params.d.ts +2 -2
- package/dist/queries/unused-params.js +1 -1
- package/dist/queries/value-flow.d.ts +3 -3
- package/dist/queries/value-flow.js +1 -1
- package/dist/queries/vue-component-duplicates.d.ts +2 -2
- package/dist/queries/vue-component-duplicates.js +1 -1
- package/dist/queries/vue-composable-candidates.d.ts +2 -2
- package/dist/queries/vue-composable-candidates.js +1 -1
- package/dist/queries/vue-large-view-pressure.d.ts +2 -2
- package/dist/queries/vue-large-view-pressure.js +1 -1
- package/dist/queries/wrapper-candidates.d.ts +2 -2
- package/dist/queries/wrapper-candidates.js +1 -1
- package/dist/reindex-worker.js +1 -1
- package/dist/reindex.d.ts +3 -3
- package/dist/reindex.js +31 -31
- package/dist/runtime.d.ts +24 -4
- package/dist/runtime.js +3 -3
- package/dist/rust-semantic-session-server.js +1 -1
- package/dist/rust-semantic-session-worker.js +1 -1
- package/dist/rust-semantic-worker.js +1 -1
- package/dist/{scip-cli-B7N3haxa.d.ts → scip-cli-BRFKkHQn.d.ts} +1 -1
- package/dist/sentinel-ensure-command-KYYULCFU.js +2 -0
- package/dist/sentinel-ensure-command-RIZA3RY7.js +3 -0
- package/dist/sentinel-hook.js +39 -0
- package/dist/sentinel-worker.js +16 -0
- package/dist/typescript-mailbox-worker.js +1 -1
- package/dist/watch-server.js +6 -6
- package/docs/COMMAND_REFERENCE.md +5 -3
- package/docs/schemas/project-config.schema.json +159 -0
- package/package.json +9 -5
- package/skills/codebaseiq/SKILL.md +1 -1
- package/skills/concrete-plan/SKILL.md +1 -1
- package/ui/view/api.js +450 -0
- package/ui/view/app.js +394 -0
- package/ui/view/builder.js +323 -0
- package/ui/view/file-panel.js +170 -0
- package/ui/view/focus.js +379 -0
- package/ui/view/index.html +54 -0
- package/ui/view/map.js +424 -0
- package/ui/view/styles.css +1125 -0
- package/dist/chunk-2X7V4HS4.js +0 -88
- package/dist/chunk-3IER7Q6H.js +0 -12
- package/dist/chunk-3JSXXYTZ.js +0 -345
- package/dist/chunk-476NR5B7.js +0 -2
- package/dist/chunk-5VKBFZZU.js +0 -3
- package/dist/chunk-ADTBPVUZ.js +0 -21
- package/dist/chunk-BFFZDZQV.js +0 -2
- package/dist/chunk-BMYOV5GP.js +0 -77
- package/dist/chunk-C74PPYLA.js +0 -3
- package/dist/chunk-CWONGW6P.js +0 -3
- package/dist/chunk-DDZ7VHWV.js +0 -20
- package/dist/chunk-DR2LURYU.js +0 -3
- package/dist/chunk-ECQBG7PW.js +0 -564
- package/dist/chunk-FM5BPL4V.js +0 -60
- package/dist/chunk-G6XFR4ZL.js +0 -4
- package/dist/chunk-GTIYTDRE.js +0 -562
- package/dist/chunk-HOA5YGOH.js +0 -3
- package/dist/chunk-KUW32IRO.js +0 -2
- package/dist/chunk-LTA3BRZX.js +0 -2
- package/dist/chunk-NAUD7LCA.js +0 -2
- package/dist/chunk-OGTFJ3XD.js +0 -2
- package/dist/chunk-Q5ELPRKQ.js +0 -2
- package/dist/chunk-QCN62RTF.js +0 -3
- package/dist/chunk-QW7EP6WI.js +0 -21
- package/dist/chunk-RU65DDUP.js +0 -215
- package/dist/chunk-SELM5MER.js +0 -2
- package/dist/chunk-SNNWPCN7.js +0 -4
- package/dist/chunk-TFZB6XTM.js +0 -239
- package/dist/chunk-UXM43C7T.js +0 -3
- package/dist/chunk-VFY6Y2H6.js +0 -61
- package/dist/chunk-WE5RZHZ7.js +0 -5
- package/dist/chunk-Z54RD7VL.js +0 -3
- package/dist/cli-context-3SNLDYBM.js +0 -3
- package/dist/cli-context-T3B7W6GG.js +0 -2
- package/dist/cli-program-YNOXO72B.js +0 -7
- package/dist/command-descriptors-6AOUKWW7.js +0 -346
- package/dist/command-descriptors-ZFKJSRUP.js +0 -344
- package/dist/direct-navigation-DP4LVMRX.js +0 -3
- package/dist/direct-navigation-FLUS3BT6.js +0 -2
- package/dist/invocation-command-descriptors-QT2JMY5J.js +0 -3
- package/dist/invocation-command-descriptors-YN4QJEAX.js +0 -2
- package/dist/output-continuation-command-2V2SL4TD.js +0 -2
- package/dist/output-continuation-command-65J5IP3O.js +0 -3
- package/dist/project-reindex-5JOKXAXT.js +0 -2
- package/dist/project-reindex-UQBIKO4M.js +0 -3
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ApiError,
|
|
3
|
+
asArray,
|
|
4
|
+
chip,
|
|
5
|
+
el,
|
|
6
|
+
fill,
|
|
7
|
+
formatLocation,
|
|
8
|
+
isAbort,
|
|
9
|
+
notice,
|
|
10
|
+
plural,
|
|
11
|
+
postBuilder,
|
|
12
|
+
routeLink,
|
|
13
|
+
titleCase,
|
|
14
|
+
} from '/assets/api.js';
|
|
15
|
+
|
|
16
|
+
const BUCKETS = ['reuse', 'rework', 'compose'];
|
|
17
|
+
const DESCRIPTION_LIMIT = 2000;
|
|
18
|
+
const STATUS_HINTS = {
|
|
19
|
+
403: 'Reload this page to get a fresh session token.',
|
|
20
|
+
409: 'Wait for the running search to finish, then try again.',
|
|
21
|
+
504: 'The provider took too long. Try again, or switch mode.',
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
function splitList(value) {
|
|
25
|
+
return value
|
|
26
|
+
.split(/[\s,]+/)
|
|
27
|
+
.map((entry) => entry.trim())
|
|
28
|
+
.filter(Boolean);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function termGroups(value) {
|
|
32
|
+
return value
|
|
33
|
+
.split('\n')
|
|
34
|
+
.map((line) =>
|
|
35
|
+
line
|
|
36
|
+
.split('|')
|
|
37
|
+
.map((word) => word.trim())
|
|
38
|
+
.filter(Boolean),
|
|
39
|
+
)
|
|
40
|
+
.filter((group) => group.length > 0);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function describeProbes(probes) {
|
|
44
|
+
const rows = [
|
|
45
|
+
['Terms', asArray(probes.terms).map((group) => (Array.isArray(group) ? group.join(' | ') : String(group)))],
|
|
46
|
+
['Names', asArray(probes.names)],
|
|
47
|
+
['Calls', asArray(probes.calls)],
|
|
48
|
+
['Params', asArray(probes.params)],
|
|
49
|
+
['Returns', asArray(probes.returns)],
|
|
50
|
+
['Kinds', asArray(probes.kinds)],
|
|
51
|
+
].filter(([, values]) => values.length > 0);
|
|
52
|
+
if (rows.length === 0) return null;
|
|
53
|
+
return el(
|
|
54
|
+
'dl',
|
|
55
|
+
{ class: 'probe-list' },
|
|
56
|
+
rows.map(([label, values]) => [
|
|
57
|
+
el('dt', null, label),
|
|
58
|
+
el(
|
|
59
|
+
'dd',
|
|
60
|
+
null,
|
|
61
|
+
values.map((value) => chip(value)),
|
|
62
|
+
),
|
|
63
|
+
]),
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function candidateCard(candidate, nav, onActivate) {
|
|
68
|
+
const route = candidate.symbolId ? { symbol: candidate.symbolId } : { focus: candidate.name };
|
|
69
|
+
return el(
|
|
70
|
+
'li',
|
|
71
|
+
{ class: 'card' },
|
|
72
|
+
routeLink(nav, route, candidate.name, { class: 'lane-title' }, onActivate),
|
|
73
|
+
el('div', { class: 'muted' }, formatLocation(candidate.file, candidate.line)),
|
|
74
|
+
candidate.signature ? el('code', { class: 'card-signature' }, candidate.signature) : null,
|
|
75
|
+
el(
|
|
76
|
+
'div',
|
|
77
|
+
{ class: 'lane-meta' },
|
|
78
|
+
chip(candidate.tier, candidate.tier === 'direct' ? 'strong' : ''),
|
|
79
|
+
Number.isFinite(candidate.score) ? el('span', { class: 'muted' }, `score ${candidate.score.toFixed(2)}`) : null,
|
|
80
|
+
),
|
|
81
|
+
asArray(candidate.why).length > 0
|
|
82
|
+
? el(
|
|
83
|
+
'ul',
|
|
84
|
+
{ class: 'why' },
|
|
85
|
+
candidate.why.map((reason) => el('li', null, reason)),
|
|
86
|
+
)
|
|
87
|
+
: null,
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function renderResponse(response, nav, onActivate) {
|
|
92
|
+
const candidates = asArray(response.candidates);
|
|
93
|
+
const fallbacks = asArray(response.fallbacksTried);
|
|
94
|
+
const unresolved = asArray(response.unresolvedProbes);
|
|
95
|
+
const probes = response.probes ? describeProbes(response.probes) : null;
|
|
96
|
+
return [
|
|
97
|
+
el(
|
|
98
|
+
'div',
|
|
99
|
+
{ class: 'result-summary' },
|
|
100
|
+
el('span', null, 'Provider '),
|
|
101
|
+
chip(response.provider || 'none', 'strong'),
|
|
102
|
+
chip('heuristic', 'subtle'),
|
|
103
|
+
response.coverage?.note ? el('p', { class: 'muted' }, response.coverage.note) : null,
|
|
104
|
+
),
|
|
105
|
+
fallbacks.length > 0
|
|
106
|
+
? el(
|
|
107
|
+
'details',
|
|
108
|
+
{ class: 'collapsible' },
|
|
109
|
+
el('summary', null, 'Fallbacks tried', el('span', { class: 'count' }, fallbacks.length)),
|
|
110
|
+
el(
|
|
111
|
+
'ul',
|
|
112
|
+
{ class: 'plain-list stacked' },
|
|
113
|
+
fallbacks.map((fallback) => el('li', null, el('strong', null, fallback.provider), ` ${fallback.reason}`)),
|
|
114
|
+
),
|
|
115
|
+
)
|
|
116
|
+
: null,
|
|
117
|
+
probes ? el('details', { class: 'collapsible' }, el('summary', null, 'Probes matched'), probes) : null,
|
|
118
|
+
unresolved.length > 0
|
|
119
|
+
? notice('info', `Unresolved probes: ${unresolved.map((entry) => `${entry.probe} (${entry.status})`).join(', ')}`)
|
|
120
|
+
: null,
|
|
121
|
+
candidates.length === 0
|
|
122
|
+
? el('p', { class: 'empty' }, 'No candidates found.')
|
|
123
|
+
: el(
|
|
124
|
+
'div',
|
|
125
|
+
{ class: 'buckets' },
|
|
126
|
+
BUCKETS.map((bucket) => {
|
|
127
|
+
const items = candidates.filter((candidate) => candidate.bucket === bucket);
|
|
128
|
+
return el(
|
|
129
|
+
'section',
|
|
130
|
+
{ class: 'bucket', data: { bucket } },
|
|
131
|
+
el('h3', null, titleCase(bucket), el('span', { class: 'count' }, items.length)),
|
|
132
|
+
items.length === 0
|
|
133
|
+
? el('p', { class: 'empty' }, 'None')
|
|
134
|
+
: el(
|
|
135
|
+
'ul',
|
|
136
|
+
{ class: 'cards' },
|
|
137
|
+
items.map((candidate) => candidateCard(candidate, nav, onActivate)),
|
|
138
|
+
),
|
|
139
|
+
);
|
|
140
|
+
}),
|
|
141
|
+
),
|
|
142
|
+
];
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** The builder drawer: describe code about to be written, then browse reuse, rework, and compose candidates. */
|
|
146
|
+
export function createBuilder({ drawer, trigger, nav }) {
|
|
147
|
+
let modes = [];
|
|
148
|
+
let selectedMode = null;
|
|
149
|
+
let inFlight = null;
|
|
150
|
+
|
|
151
|
+
const title = el('h2', { id: 'builder-title' }, 'Symbol builder');
|
|
152
|
+
const closeButton = el('button', { type: 'button', class: 'icon-button', 'aria-label': 'Close builder' }, '×');
|
|
153
|
+
const description = el('textarea', {
|
|
154
|
+
id: 'builder-description',
|
|
155
|
+
rows: '4',
|
|
156
|
+
maxlength: String(DESCRIPTION_LIMIT),
|
|
157
|
+
placeholder: 'Retry a failed request with exponential backoff',
|
|
158
|
+
});
|
|
159
|
+
const modeGroup = el('fieldset', { class: 'modes' }, el('legend', null, 'Mode'));
|
|
160
|
+
const terms = el('textarea', {
|
|
161
|
+
id: 'builder-terms',
|
|
162
|
+
rows: '3',
|
|
163
|
+
placeholder: 'retry | reattempt | backoff',
|
|
164
|
+
spellcheck: 'false',
|
|
165
|
+
});
|
|
166
|
+
const calls = el('input', {
|
|
167
|
+
id: 'builder-calls',
|
|
168
|
+
type: 'text',
|
|
169
|
+
placeholder: 'fetch, setTimeout',
|
|
170
|
+
spellcheck: 'false',
|
|
171
|
+
});
|
|
172
|
+
const names = el('input', {
|
|
173
|
+
id: 'builder-names',
|
|
174
|
+
type: 'text',
|
|
175
|
+
placeholder: 'retryWithBackoff',
|
|
176
|
+
spellcheck: 'false',
|
|
177
|
+
});
|
|
178
|
+
const submit = el('button', { type: 'submit', class: 'accent' }, 'Search');
|
|
179
|
+
const status = el('span', { class: 'muted', role: 'status' });
|
|
180
|
+
const results = el('div', { class: 'results', 'aria-live': 'polite' });
|
|
181
|
+
|
|
182
|
+
const form = el(
|
|
183
|
+
'form',
|
|
184
|
+
{ class: 'drawer-form' },
|
|
185
|
+
el(
|
|
186
|
+
'p',
|
|
187
|
+
{ class: 'hint' },
|
|
188
|
+
'Describe the code you are about to write to find existing code to reuse, rework, or compose.',
|
|
189
|
+
),
|
|
190
|
+
el('label', { for: 'builder-description' }, 'Description'),
|
|
191
|
+
description,
|
|
192
|
+
modeGroup,
|
|
193
|
+
el(
|
|
194
|
+
'details',
|
|
195
|
+
{ class: 'collapsible' },
|
|
196
|
+
el('summary', null, 'Probes (optional)'),
|
|
197
|
+
el('label', { for: 'builder-terms' }, 'Terms: one concept per line, synonyms separated by |'),
|
|
198
|
+
terms,
|
|
199
|
+
el('label', { for: 'builder-calls' }, 'Calls the new code makes'),
|
|
200
|
+
calls,
|
|
201
|
+
el('label', { for: 'builder-names' }, 'Names the code might already use'),
|
|
202
|
+
names,
|
|
203
|
+
),
|
|
204
|
+
el('div', { class: 'form-actions' }, submit, status),
|
|
205
|
+
);
|
|
206
|
+
drawer.replaceChildren(
|
|
207
|
+
el('header', { class: 'drawer-head' }, title, closeButton),
|
|
208
|
+
el('div', { class: 'drawer-body' }, form, results),
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
function open() {
|
|
212
|
+
drawer.hidden = false;
|
|
213
|
+
trigger.setAttribute('aria-expanded', 'true');
|
|
214
|
+
description.focus();
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function close() {
|
|
218
|
+
if (drawer.hidden) return;
|
|
219
|
+
drawer.hidden = true;
|
|
220
|
+
trigger.setAttribute('aria-expanded', 'false');
|
|
221
|
+
trigger.focus();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function renderModes(available, preferred) {
|
|
225
|
+
modes = available;
|
|
226
|
+
if (!modes.includes(selectedMode)) selectedMode = modes.includes(preferred) ? preferred : (modes[0] ?? null);
|
|
227
|
+
fill(
|
|
228
|
+
modeGroup,
|
|
229
|
+
el('legend', null, 'Mode'),
|
|
230
|
+
modes.map((mode) =>
|
|
231
|
+
el(
|
|
232
|
+
'label',
|
|
233
|
+
{ class: 'radio' },
|
|
234
|
+
el('input', {
|
|
235
|
+
type: 'radio',
|
|
236
|
+
name: 'builder-mode',
|
|
237
|
+
value: mode,
|
|
238
|
+
checked: mode === selectedMode,
|
|
239
|
+
on: {
|
|
240
|
+
change: () => {
|
|
241
|
+
selectedMode = mode;
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
}),
|
|
245
|
+
mode,
|
|
246
|
+
),
|
|
247
|
+
),
|
|
248
|
+
);
|
|
249
|
+
modeGroup.hidden = modes.length === 0;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function buildRequest() {
|
|
253
|
+
const request = {};
|
|
254
|
+
const text = description.value.trim();
|
|
255
|
+
if (text) request.description = text;
|
|
256
|
+
const probes = {
|
|
257
|
+
terms: termGroups(terms.value),
|
|
258
|
+
names: splitList(names.value),
|
|
259
|
+
calls: splitList(calls.value),
|
|
260
|
+
params: [],
|
|
261
|
+
returns: [],
|
|
262
|
+
kinds: [],
|
|
263
|
+
};
|
|
264
|
+
if (probes.terms.length + probes.names.length + probes.calls.length > 0) request.probes = probes;
|
|
265
|
+
if (selectedMode) request.mode = selectedMode;
|
|
266
|
+
return request;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
function showFailure(error) {
|
|
270
|
+
const hint = error instanceof ApiError ? STATUS_HINTS[error.status] : null;
|
|
271
|
+
results.replaceChildren(notice('error', error.message, hint ? ` ${hint}` : ''));
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
async function run(event) {
|
|
275
|
+
event.preventDefault();
|
|
276
|
+
if (inFlight) return;
|
|
277
|
+
const request = buildRequest();
|
|
278
|
+
if (!request.description && !request.probes) {
|
|
279
|
+
results.replaceChildren(notice('error', 'Enter a description or at least one probe.'));
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
inFlight = new AbortController();
|
|
283
|
+
submit.disabled = true;
|
|
284
|
+
results.setAttribute('aria-busy', 'true');
|
|
285
|
+
status.textContent = 'Searching';
|
|
286
|
+
try {
|
|
287
|
+
const response = await postBuilder(request, { signal: inFlight.signal });
|
|
288
|
+
fill(results, renderResponse(response, nav, close));
|
|
289
|
+
status.textContent = plural(asArray(response.candidates).length, 'candidate');
|
|
290
|
+
} catch (error) {
|
|
291
|
+
if (isAbort(error)) return;
|
|
292
|
+
status.textContent = '';
|
|
293
|
+
showFailure(error);
|
|
294
|
+
} finally {
|
|
295
|
+
inFlight = null;
|
|
296
|
+
submit.disabled = false;
|
|
297
|
+
results.removeAttribute('aria-busy');
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
form.addEventListener('submit', run);
|
|
302
|
+
closeButton.addEventListener('click', close);
|
|
303
|
+
drawer.addEventListener('keydown', (event) => {
|
|
304
|
+
if (event.key === 'Escape') close();
|
|
305
|
+
});
|
|
306
|
+
trigger.addEventListener('click', () => (drawer.hidden ? open() : close()));
|
|
307
|
+
|
|
308
|
+
return {
|
|
309
|
+
/** Apply `meta.builder`: show the trigger only when a builder is available. */
|
|
310
|
+
configure(info) {
|
|
311
|
+
const available = Boolean(info?.available);
|
|
312
|
+
trigger.hidden = !available;
|
|
313
|
+
if (!available) {
|
|
314
|
+
inFlight?.abort();
|
|
315
|
+
drawer.hidden = true;
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
const availableModes = Array.isArray(info.modes) ? info.modes.filter((mode) => typeof mode === 'string') : [];
|
|
319
|
+
if (availableModes.join() !== modes.join()) renderModes(availableModes, info.defaultMode);
|
|
320
|
+
},
|
|
321
|
+
close,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import {
|
|
2
|
+
asArray,
|
|
3
|
+
chip,
|
|
4
|
+
editorLink,
|
|
5
|
+
el,
|
|
6
|
+
expandableList,
|
|
7
|
+
fill,
|
|
8
|
+
pathLabel,
|
|
9
|
+
plural,
|
|
10
|
+
routeLink,
|
|
11
|
+
staleNotice,
|
|
12
|
+
} from '/assets/api.js';
|
|
13
|
+
|
|
14
|
+
function fileList(title, paths, nav) {
|
|
15
|
+
return el(
|
|
16
|
+
'section',
|
|
17
|
+
{ class: 'block' },
|
|
18
|
+
el('h3', null, title, el('span', { class: 'count' }, paths.length)),
|
|
19
|
+
paths.length === 0
|
|
20
|
+
? el('p', { class: 'empty' }, 'None reported')
|
|
21
|
+
: expandableList(paths, (path) =>
|
|
22
|
+
el('li', null, routeLink(nav, { file: path }, pathLabel(path), { class: 'path-link', title: path })),
|
|
23
|
+
),
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function outlineEntry(entry, nav) {
|
|
28
|
+
const lines = entry.startLine
|
|
29
|
+
? `${entry.startLine}${entry.endLine > entry.startLine ? `–${entry.endLine}` : ''}`
|
|
30
|
+
: '';
|
|
31
|
+
const row = el(
|
|
32
|
+
'div',
|
|
33
|
+
{ class: 'outline-row' },
|
|
34
|
+
routeLink(
|
|
35
|
+
nav,
|
|
36
|
+
{ symbol: entry.symbol },
|
|
37
|
+
[chip(entry.kind || 'symbol', 'kind'), el('span', { class: 'outline-name' }, entry.name)],
|
|
38
|
+
{ class: 'outline-link' },
|
|
39
|
+
),
|
|
40
|
+
lines ? el('span', { class: 'lines' }, `L${lines}`) : null,
|
|
41
|
+
);
|
|
42
|
+
const children = asArray(entry.children);
|
|
43
|
+
return el(
|
|
44
|
+
'li',
|
|
45
|
+
null,
|
|
46
|
+
row,
|
|
47
|
+
entry.signature ? el('code', { class: 'outline-signature' }, entry.signature) : null,
|
|
48
|
+
children.length > 0
|
|
49
|
+
? el(
|
|
50
|
+
'ul',
|
|
51
|
+
{ class: 'outline-list' },
|
|
52
|
+
children.map((child) => outlineEntry(child, nav)),
|
|
53
|
+
)
|
|
54
|
+
: null,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function outlineCount(entries) {
|
|
59
|
+
return entries.reduce((total, entry) => total + 1 + outlineCount(asArray(entry.children)), 0);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** The detail panel for one file: where it lives, what it relates to, and its symbols. */
|
|
63
|
+
export function renderFilePanel(container, data, nav) {
|
|
64
|
+
const outline = asArray(data.outline);
|
|
65
|
+
const dependsOn = asArray(data.dependsOn);
|
|
66
|
+
const dependedOnBy = asArray(data.dependedOnBy);
|
|
67
|
+
fill(
|
|
68
|
+
container,
|
|
69
|
+
el(
|
|
70
|
+
'header',
|
|
71
|
+
{ class: 'panel-head' },
|
|
72
|
+
el('p', { class: 'eyebrow' }, 'File'),
|
|
73
|
+
el('h2', { class: 'path-title', tabindex: '-1' }, pathLabel(data.file)),
|
|
74
|
+
el(
|
|
75
|
+
'div',
|
|
76
|
+
{ class: 'head-actions' },
|
|
77
|
+
editorLink(data.editorUri, 'Open in editor'),
|
|
78
|
+
el('span', { class: 'muted' }, `${plural(outlineCount(outline), 'symbol')}`),
|
|
79
|
+
),
|
|
80
|
+
data.stale === true ? staleNotice() : null,
|
|
81
|
+
),
|
|
82
|
+
el(
|
|
83
|
+
'section',
|
|
84
|
+
{ class: 'block' },
|
|
85
|
+
el('h3', null, 'Outline', el('span', { class: 'count' }, outlineCount(outline))),
|
|
86
|
+
outline.length === 0
|
|
87
|
+
? el('p', { class: 'empty' }, 'No indexed symbols in this file')
|
|
88
|
+
: el(
|
|
89
|
+
'ul',
|
|
90
|
+
{ class: 'outline-list root' },
|
|
91
|
+
outline.map((entry) => outlineEntry(entry, nav)),
|
|
92
|
+
),
|
|
93
|
+
),
|
|
94
|
+
fileList('Depends on', dependsOn, nav),
|
|
95
|
+
fileList('Depended on by', dependedOnBy, nav),
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function scopeStat(value, label) {
|
|
100
|
+
return el('div', { class: 'stat' }, el('strong', null, value), el('span', null, label));
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function nodeRow(node, nav) {
|
|
104
|
+
const route = node.kind === 'file' || node.isFile ? { file: node.path } : { scope: node.path };
|
|
105
|
+
const detail = node.kind === 'directory' && node.fileCount !== null ? plural(node.fileCount, 'file') : null;
|
|
106
|
+
return el(
|
|
107
|
+
'li',
|
|
108
|
+
null,
|
|
109
|
+
routeLink(nav, route, node.kind === 'directory' ? `${node.name}/` : node.name, {
|
|
110
|
+
class: 'path-link',
|
|
111
|
+
title: node.path,
|
|
112
|
+
}),
|
|
113
|
+
detail ? el('span', { class: 'muted' }, detail) : null,
|
|
114
|
+
node.cycle === null ? null : chip(`cycle ${node.cycle}`, 'danger'),
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** The detail panel when a directory is the focus: its contents and strongest dependencies as lists. */
|
|
119
|
+
export function renderScopePanel(container, scope, nav) {
|
|
120
|
+
const byKind = (kind) => scope.nodes.filter((node) => node.kind === kind);
|
|
121
|
+
const directories = byKind('directory');
|
|
122
|
+
const files = byKind('file');
|
|
123
|
+
const externals = byKind('external');
|
|
124
|
+
const names = new Map(scope.nodes.map((node) => [node.id, node.name]));
|
|
125
|
+
const cycles = scope.edges.filter((edge) => edge.cycle);
|
|
126
|
+
const strongest = [...scope.edges].sort((a, b) => b.count - a.count).slice(0, 20);
|
|
127
|
+
const unit = scope.basis === 'imports' ? 'imports' : 'references';
|
|
128
|
+
|
|
129
|
+
const section = (title, items, render) =>
|
|
130
|
+
items.length === 0
|
|
131
|
+
? null
|
|
132
|
+
: el(
|
|
133
|
+
'section',
|
|
134
|
+
{ class: 'block' },
|
|
135
|
+
el('h3', null, title, el('span', { class: 'count' }, items.length)),
|
|
136
|
+
expandableList(items, render),
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
fill(
|
|
140
|
+
container,
|
|
141
|
+
el(
|
|
142
|
+
'header',
|
|
143
|
+
{ class: 'panel-head' },
|
|
144
|
+
el('p', { class: 'eyebrow' }, 'Directory'),
|
|
145
|
+
el('h2', { class: 'path-title', tabindex: '-1' }, scope.path || 'Project root'),
|
|
146
|
+
el(
|
|
147
|
+
'div',
|
|
148
|
+
{ class: 'stats' },
|
|
149
|
+
scopeStat(directories.length, 'directories'),
|
|
150
|
+
scopeStat(scope.totals.files ?? files.length, 'files'),
|
|
151
|
+
scopeStat(externals.length, 'external'),
|
|
152
|
+
scopeStat(cycles.length, cycles.length === 1 ? 'cycle edge' : 'cycle edges'),
|
|
153
|
+
),
|
|
154
|
+
el('p', { class: 'hint' }, 'Double-click a directory on the map to open it, or choose from the lists below.'),
|
|
155
|
+
),
|
|
156
|
+
section('Directories', directories, (node) => nodeRow(node, nav)),
|
|
157
|
+
section('Files', files, (node) => nodeRow(node, nav)),
|
|
158
|
+
section('External', externals, (node) => nodeRow(node, nav)),
|
|
159
|
+
section(`Strongest ${unit}`, strongest, (edge) =>
|
|
160
|
+
el(
|
|
161
|
+
'li',
|
|
162
|
+
{ class: edge.cycle ? 'edge-row cycle' : 'edge-row' },
|
|
163
|
+
el('span', null, `${names.get(edge.source)} → ${names.get(edge.target)}`),
|
|
164
|
+
el('span', { class: 'muted' }, `×${edge.count}`),
|
|
165
|
+
edge.cycle ? chip('cycle', 'danger') : null,
|
|
166
|
+
),
|
|
167
|
+
),
|
|
168
|
+
scope.nodes.length === 0 ? el('p', { class: 'empty pad' }, 'Nothing indexed in this directory.') : null,
|
|
169
|
+
);
|
|
170
|
+
}
|