codebaseiq 0.1.0 → 0.3.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.
Files changed (447) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/README.md +1 -1
  3. package/dist/augment-vue-worker.js +1 -1
  4. package/dist/{chunk-ZMI2JSX2.js → chunk-23C5AD3B.js} +2 -2
  5. package/dist/chunk-2E6OUPCF.js +2 -0
  6. package/dist/chunk-2EDX3JT5.js +3 -0
  7. package/dist/chunk-2I2UHZET.js +2 -0
  8. package/dist/{chunk-T3DGWPXM.js → chunk-2OMXFE64.js} +2 -2
  9. package/dist/chunk-2PRONPAS.js +3 -0
  10. package/dist/{chunk-GW6Z3WGY.js → chunk-356EZBIP.js} +2 -2
  11. package/dist/{chunk-UDS562V4.js → chunk-36JC5BG2.js} +2 -2
  12. package/dist/chunk-3RR2K7EZ.js +20 -0
  13. package/dist/{chunk-JE3WZ6II.js → chunk-3RSBGWGL.js} +2 -2
  14. package/dist/{chunk-VE5AVNMP.js → chunk-3VJ3OCRE.js} +2 -2
  15. package/dist/{chunk-FDGD5AB5.js → chunk-4LK5OIPW.js} +2 -2
  16. package/dist/chunk-5DSL3NT2.js +17 -0
  17. package/dist/chunk-5FWR5HLG.js +90 -0
  18. package/dist/chunk-5IC2WZAL.js +22 -0
  19. package/dist/{chunk-MVB3DAEY.js → chunk-5IZRKWTZ.js} +2 -2
  20. package/dist/{chunk-Q65CQ4XL.js → chunk-5LL4KEHO.js} +2 -2
  21. package/dist/chunk-5T44HG5Y.js +88 -0
  22. package/dist/{chunk-TRRC4ZJ7.js → chunk-5ZI2PPI7.js} +2 -2
  23. package/dist/{chunk-7XAN6GKB.js → chunk-67VJAYVR.js} +2 -2
  24. package/dist/{chunk-MOVBWNIP.js → chunk-6BF3VYEF.js} +2 -2
  25. package/dist/chunk-6JMAVFL4.js +3 -0
  26. package/dist/chunk-6O3KXIDL.js +2 -0
  27. package/dist/{chunk-JOIRNPPY.js → chunk-6VREELBC.js} +2 -2
  28. package/dist/chunk-6WAPPQ5F.js +82 -0
  29. package/dist/{chunk-FW53T7EB.js → chunk-75KJGYX7.js} +2 -2
  30. package/dist/chunk-7GAK2F3H.js +77 -0
  31. package/dist/{chunk-UBGWN7I4.js → chunk-7JELP5YE.js} +2 -2
  32. package/dist/chunk-7UCDGXRW.js +8 -0
  33. package/dist/{chunk-L57ZKWVG.js → chunk-AEXQYQD7.js} +2 -2
  34. package/dist/chunk-AQI4N64O.js +22 -0
  35. package/dist/{chunk-ICFDQHAM.js → chunk-AURCQHSG.js} +2 -2
  36. package/dist/{chunk-I2T2LLK2.js → chunk-BBP7HVBJ.js} +2 -2
  37. package/dist/{chunk-OFBE4NGP.js → chunk-BFBIMTCJ.js} +2 -2
  38. package/dist/{chunk-JEJLSICM.js → chunk-BGGB5N53.js} +2 -2
  39. package/dist/{chunk-TIIC3ZE7.js → chunk-BRQL7AFJ.js} +2 -2
  40. package/dist/{chunk-YSNONTJ2.js → chunk-BWL3PMPT.js} +2 -2
  41. package/dist/chunk-C6WKPKCF.js +127 -0
  42. package/dist/{chunk-YESXMKX3.js → chunk-C7OUW52M.js} +2 -2
  43. package/dist/chunk-C7QWUBR2.js +545 -0
  44. package/dist/{chunk-4WKDMDEW.js → chunk-CCIYWXX6.js} +2 -2
  45. package/dist/{chunk-FAJQ7LWY.js → chunk-CIYA2KZN.js} +2 -2
  46. package/dist/{chunk-VEXUL62T.js → chunk-CR3OG6SQ.js} +2 -2
  47. package/dist/{chunk-JSOYNVWH.js → chunk-CVHOQONG.js} +2 -2
  48. package/dist/{chunk-LU3BMVH2.js → chunk-CW6AXOLR.js} +2 -2
  49. package/dist/{chunk-TXXOEMZJ.js → chunk-D53LWANR.js} +2 -2
  50. package/dist/{chunk-DO6WQD2T.js → chunk-D62CTZX6.js} +2 -2
  51. package/dist/{chunk-N3IQCBCF.js → chunk-D7AZAOZX.js} +2 -2
  52. package/dist/{chunk-RDBI2RXU.js → chunk-D7DOB27N.js} +7 -7
  53. package/dist/chunk-DAKIGMIK.js +21 -0
  54. package/dist/chunk-DDN2F6GB.js +2 -0
  55. package/dist/chunk-DUKHVPU5.js +4 -0
  56. package/dist/chunk-DVWO7RBC.js +2 -0
  57. package/dist/{chunk-HKQUXIFO.js → chunk-E52K4L2W.js} +2 -2
  58. package/dist/chunk-EIBGSU2R.js +2 -0
  59. package/dist/chunk-EN4AHLL3.js +3 -0
  60. package/dist/chunk-EQNMD62X.js +51 -0
  61. package/dist/{chunk-ENCCHKM6.js → chunk-EXZ7VLRY.js} +4 -4
  62. package/dist/{chunk-NEDP5RFQ.js → chunk-F3QSL4W2.js} +2 -2
  63. package/dist/{chunk-O6QTXQPJ.js → chunk-F74LZWCE.js} +2 -2
  64. package/dist/{chunk-BH5F2Q4O.js → chunk-FEIZXBLH.js} +2 -2
  65. package/dist/chunk-FH5WG4LE.js +2 -0
  66. package/dist/{chunk-BVAJLC5A.js → chunk-FOZ74V56.js} +2 -2
  67. package/dist/{chunk-L4NRUAGJ.js → chunk-FQTIFWLR.js} +2 -2
  68. package/dist/chunk-FTTV7IRX.js +355 -0
  69. package/dist/chunk-FWQGH2N2.js +2 -0
  70. package/dist/{chunk-CAUCPUOF.js → chunk-GDHWOA57.js} +2 -2
  71. package/dist/{chunk-6MUIJMVL.js → chunk-GIDCP7KV.js} +2 -2
  72. package/dist/{chunk-ZV3JV5G5.js → chunk-GL6UTNUB.js} +2 -2
  73. package/dist/chunk-GP7C5VAE.js +2 -0
  74. package/dist/{chunk-FQKZWM4L.js → chunk-GQLDYCWS.js} +5 -5
  75. package/dist/chunk-GQXXOS55.js +2 -0
  76. package/dist/{chunk-H3LGFZVK.js → chunk-GUFPEFBG.js} +2 -2
  77. package/dist/{chunk-NNOKTMZT.js → chunk-GV2CEZCW.js} +2 -2
  78. package/dist/{chunk-FETNQCFO.js → chunk-GVAF222T.js} +2 -2
  79. package/dist/chunk-GWYZVVKY.js +21 -0
  80. package/dist/{chunk-7FND7D7N.js → chunk-HENP2O4A.js} +2 -2
  81. package/dist/{chunk-LZYFLFEH.js → chunk-HINZQKSY.js} +2 -2
  82. package/dist/{chunk-RR7SX44N.js → chunk-HQA7EBSK.js} +2 -2
  83. package/dist/{chunk-XMQ23E27.js → chunk-HVFB3PME.js} +2 -2
  84. package/dist/chunk-I22IZYDI.js +2 -0
  85. package/dist/chunk-ICUL7XRT.js +21 -0
  86. package/dist/{chunk-CQP3THUZ.js → chunk-IHSLIIL3.js} +2 -2
  87. package/dist/{chunk-34WBMAYK.js → chunk-ITSJMNUD.js} +2 -2
  88. package/dist/{chunk-PX4RYAAK.js → chunk-IZDPGOZR.js} +2 -2
  89. package/dist/chunk-J3GLP7Q5.js +3 -0
  90. package/dist/{chunk-CVYSU6BX.js → chunk-J7AMBVWF.js} +2 -2
  91. package/dist/{chunk-Y6KHROC3.js → chunk-JCMFBF4Z.js} +2 -2
  92. package/dist/chunk-JFIA2JI3.js +3 -0
  93. package/dist/chunk-JLZLLLW5.js +3 -0
  94. package/dist/{chunk-5PUWMSDU.js → chunk-JSNTHRLQ.js} +2 -2
  95. package/dist/{chunk-C6SBF2WH.js → chunk-JX6ZWDOS.js} +2 -2
  96. package/dist/{chunk-4XTAUQFD.js → chunk-JYI7CV25.js} +2 -2
  97. package/dist/chunk-K7JLSGCJ.js +8 -0
  98. package/dist/{chunk-XWUOUWYI.js → chunk-KPZGTB2O.js} +2 -2
  99. package/dist/{chunk-VXYS3FZD.js → chunk-LKUTSP4G.js} +2 -2
  100. package/dist/{chunk-GTXSJDCO.js → chunk-LMTSB3TB.js} +2 -2
  101. package/dist/chunk-LONKINMJ.js +543 -0
  102. package/dist/{chunk-WMPRTGH2.js → chunk-LQHYYIOB.js} +2 -2
  103. package/dist/{chunk-VUIYB2V3.js → chunk-LZSQ6X7E.js} +2 -2
  104. package/dist/{chunk-ST7V3SKN.js → chunk-M2Y6PCFE.js} +2 -2
  105. package/dist/chunk-MEUHIDI3.js +7 -0
  106. package/dist/{chunk-OZYRSMSH.js → chunk-MHWMEZDA.js} +2 -2
  107. package/dist/{chunk-RKEJ6VTF.js → chunk-MQW6SJ4P.js} +2 -2
  108. package/dist/{chunk-J77SU6VA.js → chunk-MSI3K7PJ.js} +2 -2
  109. package/dist/chunk-MVRGB4KJ.js +278 -0
  110. package/dist/{chunk-DQMDCD24.js → chunk-MZNMASFM.js} +2 -2
  111. package/dist/{chunk-ID63777H.js → chunk-NBCQZSGR.js} +2 -2
  112. package/dist/chunk-NBZKSTXP.js +2 -0
  113. package/dist/{chunk-SZD2KF7Q.js → chunk-NCJILOAK.js} +2 -2
  114. package/dist/{chunk-C7QOQX32.js → chunk-NDKOVQFG.js} +2 -2
  115. package/dist/{chunk-UNBY47BC.js → chunk-NEWHKGVD.js} +2 -2
  116. package/dist/{chunk-PYAB5SM6.js → chunk-O2M3VNDY.js} +2 -2
  117. package/dist/chunk-OFGOOL6U.js +3 -0
  118. package/dist/{chunk-SWHMHUKF.js → chunk-OQUCBKOI.js} +2 -2
  119. package/dist/{chunk-7MGU3HPH.js → chunk-P4NVCOM7.js} +2 -2
  120. package/dist/{chunk-ANFVSJWQ.js → chunk-PFC44E6D.js} +2 -2
  121. package/dist/{chunk-EZNMUY67.js → chunk-PHNCEUXX.js} +2 -2
  122. package/dist/{chunk-4FC325IF.js → chunk-PTQPPPG2.js} +2 -2
  123. package/dist/chunk-PUVNH4PO.js +3 -0
  124. package/dist/chunk-Q23IMHXS.js +343 -0
  125. package/dist/chunk-Q3ZCQY2Y.js +3 -0
  126. package/dist/{chunk-KMITESMT.js → chunk-Q4XEU3UH.js} +2 -2
  127. package/dist/{chunk-QKPLA6IC.js → chunk-QEOWONKY.js} +2 -2
  128. package/dist/{chunk-BJ6SQAEN.js → chunk-QMOZZ2VX.js} +2 -2
  129. package/dist/chunk-RCIGX23V.js +60 -0
  130. package/dist/{chunk-IOP6FWIM.js → chunk-RIYJ4L33.js} +2 -2
  131. package/dist/chunk-RJVAPMHF.js +14 -0
  132. package/dist/chunk-SB7NASHU.js +2 -0
  133. package/dist/{chunk-UZGZB3VB.js → chunk-SGMNWYTH.js} +2 -2
  134. package/dist/chunk-SMDIEDM4.js +27 -0
  135. package/dist/chunk-SV2LEFVM.js +2 -0
  136. package/dist/chunk-SX72EVMY.js +3 -0
  137. package/dist/chunk-T5X7DK6C.js +3 -0
  138. package/dist/{chunk-6NW7MU72.js → chunk-T6MQNNAC.js} +2 -2
  139. package/dist/chunk-T75DS2E6.js +21 -0
  140. package/dist/{chunk-HRWGYWRJ.js → chunk-TEANKHUU.js} +2 -2
  141. package/dist/chunk-TJBOJUVN.js +3 -0
  142. package/dist/{chunk-XLQ3GLWZ.js → chunk-TJWVT4DO.js} +2 -2
  143. package/dist/{chunk-7NVGT435.js → chunk-TNJGTQWO.js} +2 -2
  144. package/dist/{chunk-NE6IU5ZD.js → chunk-TOTWJZIX.js} +2 -2
  145. package/dist/{chunk-PBI2LFKH.js → chunk-TPO7XC5Z.js} +2 -2
  146. package/dist/{chunk-HPJRBHVT.js → chunk-U33PMPNW.js} +2 -2
  147. package/dist/{chunk-QHRNXP3C.js → chunk-U7NUXDQO.js} +2 -2
  148. package/dist/chunk-UC2FD2PS.js +4 -0
  149. package/dist/{chunk-PIOMTC27.js → chunk-UQE4XFSA.js} +2 -2
  150. package/dist/chunk-UQYQBLJX.js +5 -0
  151. package/dist/{chunk-KWVHSKHK.js → chunk-USOAJHY7.js} +2 -2
  152. package/dist/{chunk-GCHRX4YW.js → chunk-UW6KD57C.js} +2 -2
  153. package/dist/{chunk-PTAWHLVJ.js → chunk-VGWZ4MOY.js} +2 -2
  154. package/dist/{chunk-XME3HPXZ.js → chunk-VWYGCMV5.js} +2 -2
  155. package/dist/{chunk-AKB7V7TV.js → chunk-W7YLRXZE.js} +2 -2
  156. package/dist/{chunk-SYDJMPES.js → chunk-WK2IQJPK.js} +2 -2
  157. package/dist/{chunk-RBAS5ZHI.js → chunk-WWCV4E6J.js} +2 -2
  158. package/dist/{chunk-OL6KJP3N.js → chunk-XMJ53WG4.js} +2 -2
  159. package/dist/chunk-XN3EKMLI.js +4 -0
  160. package/dist/chunk-XQAVQVIL.js +3 -0
  161. package/dist/{chunk-IJ4HMYBE.js → chunk-XQPPURLQ.js} +2 -2
  162. package/dist/{chunk-OVTS4DKB.js → chunk-YHPG3S2U.js} +2 -2
  163. package/dist/{chunk-WOQBZPIF.js → chunk-YRKP7PM7.js} +2 -2
  164. package/dist/chunk-YT4DVWUV.js +11 -0
  165. package/dist/chunk-YTJHCGYB.js +61 -0
  166. package/dist/chunk-Z35GOVEH.js +2 -0
  167. package/dist/{chunk-OLF4MA5W.js → chunk-Z6RL7XOE.js} +4 -4
  168. package/dist/{chunk-UP3BUZR5.js → chunk-ZAFGY22Q.js} +2 -2
  169. package/dist/{chunk-CO5R3UNA.js → chunk-ZB4C5TTR.js} +2 -2
  170. package/dist/{chunk-ZZXSWSN6.js → chunk-ZNH33XIB.js} +2 -2
  171. package/dist/{chunk-EMNIHCRB.js → chunk-ZQ62NNKN.js} +2 -2
  172. package/dist/cli-context-FJL2JHOE.js +3 -0
  173. package/dist/cli-context-PQNWHMCQ.js +2 -0
  174. package/dist/cli-program-UO7PZD6V.js +7 -0
  175. package/dist/cli.js +1 -1
  176. package/dist/{code-DlqpBDd0.d.ts → code-DfX3xeWy.d.ts} +1 -1
  177. package/dist/code-viewer-KIXEYQNJ.js +12 -0
  178. package/dist/code-viewer-VHLBLIUM.js +11 -0
  179. package/dist/command-descriptors-F5P2V3NW.js +335 -0
  180. package/dist/command-descriptors-YCLATF5I.js +337 -0
  181. package/dist/{config-types-BNoC96J3.d.ts → config-types-D6X5S68_.d.ts} +50 -0
  182. package/dist/{db-D7sauVFH.d.ts → db-BoG_PWYH.d.ts} +2 -2
  183. package/dist/direct-navigation-4XJTXIDT.js +2 -0
  184. package/dist/direct-navigation-J5MVYYAD.js +3 -0
  185. package/dist/{graph-evidence-BIFqyisO.d.ts → graph-evidence-D1jx1Cql.d.ts} +1 -1
  186. package/dist/{health-DJaZXg8I.d.ts → health-DkYBS5BI.d.ts} +1 -1
  187. package/dist/index.d.ts +2 -2
  188. package/dist/index.js +1 -1
  189. package/dist/invocation-command-descriptors-RWV4VAI4.js +2 -0
  190. package/dist/invocation-command-descriptors-U76PN7IY.js +3 -0
  191. package/dist/{scip-cli-B7N3haxa.d.ts → maintenance-types-CdL5eQii.d.ts} +2 -21
  192. package/dist/output-continuation-command-BL25S26S.js +3 -0
  193. package/dist/output-continuation-command-BTETTXEC.js +2 -0
  194. package/dist/postinstall.js +1 -1
  195. package/dist/project-reindex-CRJU3IFG.js +2 -0
  196. package/dist/project-reindex-TQFCOA2O.js +3 -0
  197. package/dist/queries/affected.d.ts +2 -2
  198. package/dist/queries/affected.js +1 -1
  199. package/dist/queries/anchors.d.ts +2 -2
  200. package/dist/queries/anchors.js +1 -1
  201. package/dist/queries/architecture.d.ts +2 -2
  202. package/dist/queries/architecture.js +1 -1
  203. package/dist/queries/bottlenecks.d.ts +2 -2
  204. package/dist/queries/bottlenecks.js +1 -1
  205. package/dist/queries/by-kind.d.ts +2 -2
  206. package/dist/queries/by-kind.js +1 -1
  207. package/dist/queries/call-graph.d.ts +2 -2
  208. package/dist/queries/call-graph.js +1 -1
  209. package/dist/queries/change-surface.d.ts +2 -2
  210. package/dist/queries/change-surface.js +1 -1
  211. package/dist/queries/cleanup-plan.d.ts +2 -2
  212. package/dist/queries/cleanup-plan.js +1 -1
  213. package/dist/queries/co-change.d.ts +2 -2
  214. package/dist/queries/co-change.js +1 -1
  215. package/dist/queries/code.d.ts +3 -3
  216. package/dist/queries/code.js +1 -1
  217. package/dist/queries/complexity-hotspots.d.ts +2 -2
  218. package/dist/queries/complexity-hotspots.js +1 -1
  219. package/dist/queries/complexity.d.ts +2 -2
  220. package/dist/queries/complexity.js +1 -1
  221. package/dist/queries/context.d.ts +2 -2
  222. package/dist/queries/context.js +1 -1
  223. package/dist/queries/convergence.d.ts +2 -2
  224. package/dist/queries/convergence.js +1 -1
  225. package/dist/queries/coupling.d.ts +2 -2
  226. package/dist/queries/coupling.js +1 -1
  227. package/dist/queries/cycles.d.ts +2 -2
  228. package/dist/queries/cycles.js +1 -1
  229. package/dist/queries/dataflow.d.ts +2 -2
  230. package/dist/queries/dataflow.js +1 -1
  231. package/dist/queries/dead.d.ts +2 -2
  232. package/dist/queries/dead.js +1 -1
  233. package/dist/queries/decorative-checkers.d.ts +2 -2
  234. package/dist/queries/decorative-checkers.js +1 -1
  235. package/dist/queries/deep-chains.d.ts +2 -2
  236. package/dist/queries/deep-chains.js +1 -1
  237. package/dist/queries/dependence-slice.d.ts +3 -3
  238. package/dist/queries/dependence-slice.js +1 -1
  239. package/dist/queries/dependency-depth.d.ts +2 -2
  240. package/dist/queries/dependency-depth.js +1 -1
  241. package/dist/queries/deps.d.ts +2 -2
  242. package/dist/queries/deps.js +1 -1
  243. package/dist/queries/diff-impact.d.ts +2 -2
  244. package/dist/queries/diff-impact.js +1 -1
  245. package/dist/queries/doc-drift.d.ts +2 -2
  246. package/dist/queries/doc-drift.js +1 -1
  247. package/dist/queries/drift.d.ts +2 -2
  248. package/dist/queries/drift.js +1 -1
  249. package/dist/queries/duplicate-bodies.d.ts +2 -2
  250. package/dist/queries/duplicate-bodies.js +1 -1
  251. package/dist/queries/entry-map.d.ts +2 -2
  252. package/dist/queries/entry-map.js +1 -1
  253. package/dist/queries/evidence.d.ts +3 -3
  254. package/dist/queries/evidence.js +1 -1
  255. package/dist/queries/extract-candidates.d.ts +2 -2
  256. package/dist/queries/extract-candidates.js +1 -1
  257. package/dist/queries/fan.d.ts +2 -2
  258. package/dist/queries/fan.js +1 -1
  259. package/dist/queries/files.d.ts +2 -2
  260. package/dist/queries/files.js +1 -1
  261. package/dist/queries/health.d.ts +3 -3
  262. package/dist/queries/health.js +1 -1
  263. package/dist/queries/hierarchy.d.ts +2 -2
  264. package/dist/queries/hierarchy.js +1 -1
  265. package/dist/queries/hotspots.d.ts +2 -2
  266. package/dist/queries/hotspots.js +1 -1
  267. package/dist/queries/imports.d.ts +2 -2
  268. package/dist/queries/imports.js +1 -1
  269. package/dist/queries/incomplete-migration.d.ts +2 -2
  270. package/dist/queries/incomplete-migration.js +1 -1
  271. package/dist/queries/index.d.ts +5 -5
  272. package/dist/queries/index.js +1 -1
  273. package/dist/queries/isolated.d.ts +2 -2
  274. package/dist/queries/isolated.js +1 -1
  275. package/dist/queries/locality-candidates.d.ts +2 -2
  276. package/dist/queries/locality-candidates.js +1 -1
  277. package/dist/queries/members.d.ts +2 -2
  278. package/dist/queries/members.js +1 -1
  279. package/dist/queries/methods.d.ts +2 -2
  280. package/dist/queries/methods.js +1 -1
  281. package/dist/queries/not-implemented.d.ts +2 -2
  282. package/dist/queries/not-implemented.js +1 -1
  283. package/dist/queries/outline.d.ts +2 -2
  284. package/dist/queries/outline.js +1 -1
  285. package/dist/queries/passthrough-candidates.d.ts +2 -2
  286. package/dist/queries/passthrough-candidates.js +1 -1
  287. package/dist/queries/plan-context.d.ts +2 -2
  288. package/dist/queries/plan-context.js +1 -1
  289. package/dist/queries/react-component-duplicates.d.ts +2 -2
  290. package/dist/queries/react-component-duplicates.js +1 -1
  291. package/dist/queries/react-hook-candidates.d.ts +2 -2
  292. package/dist/queries/react-hook-candidates.js +1 -1
  293. package/dist/queries/react-large-component-pressure.d.ts +2 -2
  294. package/dist/queries/react-large-component-pressure.js +1 -1
  295. package/dist/queries/recent-duplicates.d.ts +2 -2
  296. package/dist/queries/recent-duplicates.js +1 -1
  297. package/dist/queries/redundant-reexports.d.ts +2 -2
  298. package/dist/queries/redundant-reexports.js +1 -1
  299. package/dist/queries/reference-neighborhood.d.ts +2 -2
  300. package/dist/queries/reference-neighborhood.js +1 -1
  301. package/dist/queries/reference-reachability.d.ts +2 -2
  302. package/dist/queries/reference-reachability.js +1 -1
  303. package/dist/queries/refs.d.ts +2 -2
  304. package/dist/queries/refs.js +1 -1
  305. package/dist/queries/self-audit.d.ts +2 -2
  306. package/dist/queries/self-audit.js +1 -1
  307. package/dist/queries/similar-chains.d.ts +2 -2
  308. package/dist/queries/similar-chains.js +1 -1
  309. package/dist/queries/similar-files.d.ts +2 -2
  310. package/dist/queries/similar-files.js +1 -1
  311. package/dist/queries/similar-signatures.d.ts +2 -2
  312. package/dist/queries/similar-signatures.js +1 -1
  313. package/dist/queries/similar.d.ts +2 -2
  314. package/dist/queries/similar.js +1 -1
  315. package/dist/queries/slice.d.ts +2 -2
  316. package/dist/queries/slice.js +1 -1
  317. package/dist/queries/source-inspection.d.ts +4 -4
  318. package/dist/queries/source-inspection.js +1 -1
  319. package/dist/queries/source-search.d.ts +2 -2
  320. package/dist/queries/source-search.js +1 -1
  321. package/dist/queries/stale-abstractions.d.ts +2 -2
  322. package/dist/queries/stale-abstractions.js +1 -1
  323. package/dist/queries/stats.d.ts +2 -2
  324. package/dist/queries/surface.d.ts +2 -2
  325. package/dist/queries/surface.js +1 -1
  326. package/dist/queries/symbols.d.ts +2 -2
  327. package/dist/queries/symbols.js +1 -1
  328. package/dist/queries/system-map.d.ts +2 -2
  329. package/dist/queries/system-map.js +1 -1
  330. package/dist/queries/system.d.ts +2 -2
  331. package/dist/queries/system.js +1 -1
  332. package/dist/queries/test-quality.d.ts +2 -2
  333. package/dist/queries/test-quality.js +1 -1
  334. package/dist/queries/trace.d.ts +2 -2
  335. package/dist/queries/trace.js +1 -1
  336. package/dist/queries/twin-ab.d.ts +2 -2
  337. package/dist/queries/twin-ab.js +1 -1
  338. package/dist/queries/twin-drift.d.ts +2 -2
  339. package/dist/queries/twin-drift.js +1 -1
  340. package/dist/queries/unused-imports.d.ts +2 -2
  341. package/dist/queries/unused-imports.js +1 -1
  342. package/dist/queries/unused-params.d.ts +2 -2
  343. package/dist/queries/unused-params.js +1 -1
  344. package/dist/queries/value-flow.d.ts +3 -3
  345. package/dist/queries/value-flow.js +1 -1
  346. package/dist/queries/vue-component-duplicates.d.ts +2 -2
  347. package/dist/queries/vue-component-duplicates.js +1 -1
  348. package/dist/queries/vue-composable-candidates.d.ts +2 -2
  349. package/dist/queries/vue-composable-candidates.js +1 -1
  350. package/dist/queries/vue-large-view-pressure.d.ts +2 -2
  351. package/dist/queries/vue-large-view-pressure.js +1 -1
  352. package/dist/queries/wrapper-candidates.d.ts +2 -2
  353. package/dist/queries/wrapper-candidates.js +1 -1
  354. package/dist/reindex-worker.js +2 -2
  355. package/dist/reindex.d.ts +3 -5
  356. package/dist/reindex.js +72 -33
  357. package/dist/runtime.d.ts +23 -4
  358. package/dist/runtime.js +3 -3
  359. package/dist/rust-semantic-session-server.js +1 -1
  360. package/dist/rust-semantic-session-worker.js +1 -1
  361. package/dist/rust-semantic-worker.js +1 -1
  362. package/dist/sentinel-ensure-command-OSWGCFFL.js +3 -0
  363. package/dist/sentinel-ensure-command-SPW7XQLB.js +2 -0
  364. package/dist/sentinel-hook.js +39 -0
  365. package/dist/sentinel-worker.js +16 -0
  366. package/dist/typescript-mailbox-worker.js +1 -1
  367. package/dist/watch-server.js +6 -6
  368. package/docs/COMMAND_REFERENCE.md +5 -3
  369. package/docs/INDEX_GENERATIONS.md +2 -2
  370. package/docs/NPM_RELEASE.md +323 -0
  371. package/docs/schemas/npm-release-state.schema.json +4 -13
  372. package/docs/schemas/project-config.schema.json +159 -0
  373. package/package.json +10 -14
  374. package/skills/codebaseiq/SKILL.md +1 -1
  375. package/skills/concrete-plan/SKILL.md +1 -1
  376. package/ui/view/api.js +450 -0
  377. package/ui/view/app.js +394 -0
  378. package/ui/view/builder.js +323 -0
  379. package/ui/view/file-panel.js +170 -0
  380. package/ui/view/focus.js +379 -0
  381. package/ui/view/index.html +54 -0
  382. package/ui/view/map.js +424 -0
  383. package/ui/view/styles.css +1125 -0
  384. package/dist/chunk-2Q2LW5JW.js +0 -14
  385. package/dist/chunk-2X7V4HS4.js +0 -88
  386. package/dist/chunk-3IER7Q6H.js +0 -12
  387. package/dist/chunk-3JSXXYTZ.js +0 -345
  388. package/dist/chunk-476NR5B7.js +0 -2
  389. package/dist/chunk-5VKBFZZU.js +0 -3
  390. package/dist/chunk-6BQ3DSPK.js +0 -2
  391. package/dist/chunk-6CS3UQTN.js +0 -3
  392. package/dist/chunk-6OAHRI2D.js +0 -6
  393. package/dist/chunk-ADTBPVUZ.js +0 -21
  394. package/dist/chunk-BFFZDZQV.js +0 -2
  395. package/dist/chunk-BMYOV5GP.js +0 -77
  396. package/dist/chunk-C74PPYLA.js +0 -3
  397. package/dist/chunk-CWONGW6P.js +0 -3
  398. package/dist/chunk-DDZ7VHWV.js +0 -20
  399. package/dist/chunk-DR2LURYU.js +0 -3
  400. package/dist/chunk-ECQBG7PW.js +0 -564
  401. package/dist/chunk-EF2R3WNQ.js +0 -2
  402. package/dist/chunk-FM5BPL4V.js +0 -60
  403. package/dist/chunk-G6XFR4ZL.js +0 -4
  404. package/dist/chunk-GTIYTDRE.js +0 -562
  405. package/dist/chunk-HOA5YGOH.js +0 -3
  406. package/dist/chunk-KUW32IRO.js +0 -2
  407. package/dist/chunk-LTA3BRZX.js +0 -2
  408. package/dist/chunk-NAUD7LCA.js +0 -2
  409. package/dist/chunk-NCZUNH3E.js +0 -109
  410. package/dist/chunk-NNJ2KZZG.js +0 -4
  411. package/dist/chunk-NNO6A2PO.js +0 -2
  412. package/dist/chunk-OGTFJ3XD.js +0 -2
  413. package/dist/chunk-Q5ELPRKQ.js +0 -2
  414. package/dist/chunk-Q72QSKXC.js +0 -308
  415. package/dist/chunk-QCN62RTF.js +0 -3
  416. package/dist/chunk-QW7EP6WI.js +0 -21
  417. package/dist/chunk-RU65DDUP.js +0 -215
  418. package/dist/chunk-SELM5MER.js +0 -2
  419. package/dist/chunk-SMRBZ6EC.js +0 -2
  420. package/dist/chunk-SNNWPCN7.js +0 -4
  421. package/dist/chunk-TFZB6XTM.js +0 -239
  422. package/dist/chunk-UCD3H3UZ.js +0 -5
  423. package/dist/chunk-UXM43C7T.js +0 -3
  424. package/dist/chunk-VFY6Y2H6.js +0 -61
  425. package/dist/chunk-WE5RZHZ7.js +0 -5
  426. package/dist/chunk-YMGZZEW4.js +0 -2
  427. package/dist/chunk-YVCIMIOC.js +0 -12
  428. package/dist/chunk-Z54RD7VL.js +0 -3
  429. package/dist/chunk-ZKX2FRS6.js +0 -15
  430. package/dist/cli-context-3SNLDYBM.js +0 -3
  431. package/dist/cli-context-T3B7W6GG.js +0 -2
  432. package/dist/cli-program-YNOXO72B.js +0 -7
  433. package/dist/command-descriptors-6AOUKWW7.js +0 -346
  434. package/dist/command-descriptors-ZFKJSRUP.js +0 -344
  435. package/dist/direct-navigation-DP4LVMRX.js +0 -3
  436. package/dist/direct-navigation-FLUS3BT6.js +0 -2
  437. package/dist/invocation-command-descriptors-QT2JMY5J.js +0 -3
  438. package/dist/invocation-command-descriptors-YN4QJEAX.js +0 -2
  439. package/dist/output-continuation-command-2V2SL4TD.js +0 -2
  440. package/dist/output-continuation-command-65J5IP3O.js +0 -3
  441. package/dist/project-reindex-5JOKXAXT.js +0 -2
  442. package/dist/project-reindex-UQBIKO4M.js +0 -3
  443. package/docs/WINDOWS_SIDECAR_RELEASE.md +0 -424
  444. package/docs/schemas/windows-sidecar-provenance.schema.json +0 -137
  445. package/scripts/build-codebaseiq-windows.mjs +0 -197
  446. package/scripts/codebaseiq-windows-provenance.mjs +0 -364
  447. package/scripts/verify-codebaseiq-windows.mjs +0 -29
@@ -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
+ }