scip-query 0.10.5 → 0.10.7

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 (262) hide show
  1. package/README.md +6 -1
  2. package/dist/augment-vue-worker.js +1 -1
  3. package/dist/{chunk-CJJP64OC.js → chunk-27FU2KX7.js} +2 -2
  4. package/dist/chunk-3C4NIBY5.js +2 -0
  5. package/dist/chunk-3LQFMQPY.js +3 -0
  6. package/dist/{chunk-QVCCLDZI.js → chunk-5JXH6VGF.js} +2 -2
  7. package/dist/{chunk-77YBOOYT.js → chunk-5LM7RJMQ.js} +2 -2
  8. package/dist/{chunk-EWC3UK4V.js → chunk-5MHQI4RR.js} +2 -2
  9. package/dist/{chunk-X7ZY6FFF.js → chunk-72QDTW5U.js} +2 -2
  10. package/dist/{chunk-MZ7APUFN.js → chunk-733EF5FD.js} +2 -2
  11. package/dist/chunk-7AOMEMOA.js +4 -0
  12. package/dist/chunk-A536TEU4.js +3 -0
  13. package/dist/chunk-BZ2RRK7Y.js +8 -0
  14. package/dist/chunk-C6ROZBJA.js +32 -0
  15. package/dist/chunk-CMXD5VC4.js +2 -0
  16. package/dist/{chunk-BNKE4TT5.js → chunk-CQEJU32R.js} +2 -2
  17. package/dist/{chunk-5FOPAXWY.js → chunk-DBTL56LR.js} +2 -2
  18. package/dist/chunk-DOZ2X6TS.js +2 -0
  19. package/dist/{chunk-D322LMSA.js → chunk-DS6QEB3G.js} +5 -5
  20. package/dist/chunk-EOUTP32Q.js +4 -0
  21. package/dist/{chunk-QSXQT3NE.js → chunk-EPPCGQUI.js} +2 -2
  22. package/dist/{chunk-CSWZFD46.js → chunk-EW64FEJL.js} +2 -2
  23. package/dist/{chunk-O3OKSF6O.js → chunk-FG4NT6VY.js} +2 -2
  24. package/dist/chunk-FKYPOK7P.js +5 -0
  25. package/dist/chunk-FPYQA7JK.js +21 -0
  26. package/dist/{chunk-FIB4JPEX.js → chunk-FRIASDLG.js} +2 -2
  27. package/dist/chunk-FXI3AAKO.js +2 -0
  28. package/dist/{chunk-QUJBXLBY.js → chunk-FXWV2V7K.js} +2 -2
  29. package/dist/chunk-G2CGUNQU.js +4 -0
  30. package/dist/{chunk-LPLGJ4HO.js → chunk-GIOT3O6P.js} +2 -2
  31. package/dist/{chunk-YUTRW57I.js → chunk-GKRRO3WC.js} +2 -2
  32. package/dist/{chunk-Z4VHYJ5U.js → chunk-GOWLZ4NA.js} +2 -2
  33. package/dist/{chunk-4ZUJJRWT.js → chunk-GRZRMELG.js} +2 -2
  34. package/dist/{chunk-CFL2CNIF.js → chunk-H6RLM7D7.js} +2 -2
  35. package/dist/chunk-HDBQHJNY.js +2 -0
  36. package/dist/{chunk-AW4N6MGC.js → chunk-IA7Q6HVP.js} +2 -2
  37. package/dist/{chunk-E44ZMVNA.js → chunk-IL2EVPYP.js} +2 -2
  38. package/dist/{chunk-E7KERP7E.js → chunk-J43GIAVM.js} +2 -2
  39. package/dist/{chunk-56UN3DMK.js → chunk-JOGZKF5W.js} +2 -2
  40. package/dist/{chunk-CTCAF3YA.js → chunk-KT2ZO3CE.js} +2 -2
  41. package/dist/{chunk-DAI74TJU.js → chunk-KUIIQPDA.js} +2 -2
  42. package/dist/{chunk-VAA5FFIW.js → chunk-LM5SHAN4.js} +2 -2
  43. package/dist/chunk-LONIY5FF.js +2 -0
  44. package/dist/{chunk-FNRPGGVI.js → chunk-LQSLW7K7.js} +2 -2
  45. package/dist/{chunk-WBJZNPUT.js → chunk-M3YEHOCD.js} +2 -2
  46. package/dist/{chunk-GZCQTZLK.js → chunk-MFWAZFYD.js} +2 -2
  47. package/dist/{chunk-EYLXU575.js → chunk-MHATKJ3J.js} +2 -2
  48. package/dist/{chunk-ZQLO2SCU.js → chunk-MJXJ56LG.js} +2 -2
  49. package/dist/{chunk-47UA45TU.js → chunk-NIGHS7UP.js} +2 -2
  50. package/dist/{chunk-NVFERV4U.js → chunk-OFO7BIRK.js} +2 -2
  51. package/dist/{chunk-7OHWPJ5N.js → chunk-OMGE3V2Q.js} +2 -2
  52. package/dist/{chunk-ICXVNWMI.js → chunk-OT6CDRKC.js} +2 -2
  53. package/dist/{chunk-6UFMPECA.js → chunk-OWXN6ZS5.js} +2 -2
  54. package/dist/{chunk-QLNGUWR7.js → chunk-OZUJ3VZS.js} +2 -2
  55. package/dist/chunk-P3K7LX7M.js +4 -0
  56. package/dist/{chunk-ZSLT7NWQ.js → chunk-PQ6QG3EX.js} +2 -2
  57. package/dist/chunk-PTKQNPWX.js +23 -0
  58. package/dist/{chunk-YYD245WG.js → chunk-QMH2D6S5.js} +2 -2
  59. package/dist/{chunk-5M4TYWVI.js → chunk-QPTVFG4O.js} +2 -2
  60. package/dist/{chunk-MUULWXSJ.js → chunk-QR337MAA.js} +2 -2
  61. package/dist/{chunk-SPE4YCOT.js → chunk-QVS4SYAX.js} +2 -2
  62. package/dist/{chunk-AUVBR62P.js → chunk-RISLKTKQ.js} +2 -2
  63. package/dist/{chunk-OLD6PBU6.js → chunk-S7DNZ6IW.js} +2 -2
  64. package/dist/{chunk-EOZIZWW4.js → chunk-SXESPZUX.js} +2 -2
  65. package/dist/{chunk-TM6GVHA6.js → chunk-TDBTVMHY.js} +2 -2
  66. package/dist/{chunk-3UW7VM4H.js → chunk-TJXOD4IK.js} +2 -2
  67. package/dist/chunk-U73YFD3P.js +3 -0
  68. package/dist/{chunk-YUOAAR24.js → chunk-UBDFQBSE.js} +2 -2
  69. package/dist/chunk-UJEVABIR.js +2 -0
  70. package/dist/{chunk-5QJXH6ZL.js → chunk-VA3FJ3AY.js} +2 -2
  71. package/dist/{chunk-3KLLFNT4.js → chunk-VOYOYC5T.js} +2 -2
  72. package/dist/chunk-W2CBNBEL.js +71 -0
  73. package/dist/chunk-W2TIXAGN.js +40 -0
  74. package/dist/{chunk-CAWSSEVM.js → chunk-WMIQMXSK.js} +2 -2
  75. package/dist/{chunk-YQH353VA.js → chunk-WVRTGVHJ.js} +2 -2
  76. package/dist/{chunk-DJMK4DBL.js → chunk-WXMVK53S.js} +2 -2
  77. package/dist/{chunk-YTR4CO5S.js → chunk-XAYARHNF.js} +3 -3
  78. package/dist/{chunk-ESG4HBEF.js → chunk-XBIF45WK.js} +2 -2
  79. package/dist/{chunk-DE7MA6OD.js → chunk-XYI7XRZC.js} +2 -2
  80. package/dist/{chunk-7KCSELEV.js → chunk-YNLK3G63.js} +2 -2
  81. package/dist/{chunk-NNDYO2DX.js → chunk-YOCYR7KJ.js} +2 -2
  82. package/dist/chunk-YZA6PPZL.js +3 -0
  83. package/dist/{chunk-5UDFZC4D.js → chunk-ZUTV7DDX.js} +2 -2
  84. package/dist/cli.js +274 -237
  85. package/dist/{config-types-Bj4sh28g.d.ts → config-types-BDIWAYzr.d.ts} +13 -1
  86. package/dist/{db-CTarohbZ.d.ts → db-BAVwb4Pb.d.ts} +1 -1
  87. package/dist/{health-Bx0x1HAG.d.ts → health-B17sVFYf.d.ts} +6 -2
  88. package/dist/index.d.ts +3 -3
  89. package/dist/index.js +3 -3
  90. package/dist/queries/affected.d.ts +2 -2
  91. package/dist/queries/affected.js +1 -1
  92. package/dist/queries/bottlenecks.d.ts +2 -2
  93. package/dist/queries/bottlenecks.js +1 -1
  94. package/dist/queries/by-kind.d.ts +2 -2
  95. package/dist/queries/by-kind.js +1 -1
  96. package/dist/queries/call-graph.d.ts +2 -2
  97. package/dist/queries/call-graph.js +1 -1
  98. package/dist/queries/change-surface.d.ts +2 -2
  99. package/dist/queries/change-surface.js +1 -1
  100. package/dist/queries/cleanup-plan.d.ts +2 -2
  101. package/dist/queries/cleanup-plan.js +1 -1
  102. package/dist/queries/co-change.d.ts +2 -2
  103. package/dist/queries/co-change.js +1 -1
  104. package/dist/queries/code.d.ts +2 -2
  105. package/dist/queries/code.js +1 -1
  106. package/dist/queries/complexity-hotspots.d.ts +2 -2
  107. package/dist/queries/complexity-hotspots.js +1 -1
  108. package/dist/queries/complexity.d.ts +2 -2
  109. package/dist/queries/complexity.js +1 -1
  110. package/dist/queries/convergence.d.ts +2 -2
  111. package/dist/queries/convergence.js +1 -1
  112. package/dist/queries/coupling.d.ts +2 -2
  113. package/dist/queries/coupling.js +1 -1
  114. package/dist/queries/cycles.d.ts +2 -2
  115. package/dist/queries/cycles.js +1 -1
  116. package/dist/queries/dataflow.d.ts +2 -2
  117. package/dist/queries/dataflow.js +1 -1
  118. package/dist/queries/dead.d.ts +2 -2
  119. package/dist/queries/dead.js +1 -1
  120. package/dist/queries/deep-chains.d.ts +2 -2
  121. package/dist/queries/deep-chains.js +1 -1
  122. package/dist/queries/deps.d.ts +2 -2
  123. package/dist/queries/deps.js +1 -1
  124. package/dist/queries/diff-gate.d.ts +8 -5
  125. package/dist/queries/diff-gate.js +1 -1
  126. package/dist/queries/diff-impact.d.ts +7 -3
  127. package/dist/queries/diff-impact.js +1 -1
  128. package/dist/queries/doc-drift.d.ts +2 -2
  129. package/dist/queries/doc-drift.js +1 -1
  130. package/dist/queries/drift.d.ts +2 -2
  131. package/dist/queries/drift.js +1 -1
  132. package/dist/queries/extract-candidates.d.ts +2 -2
  133. package/dist/queries/extract-candidates.js +1 -1
  134. package/dist/queries/fan.d.ts +2 -2
  135. package/dist/queries/fan.js +1 -1
  136. package/dist/queries/files.d.ts +2 -2
  137. package/dist/queries/health.d.ts +3 -3
  138. package/dist/queries/health.js +1 -1
  139. package/dist/queries/hierarchy.d.ts +2 -2
  140. package/dist/queries/hierarchy.js +1 -1
  141. package/dist/queries/hotspots.d.ts +2 -2
  142. package/dist/queries/hotspots.js +1 -1
  143. package/dist/queries/imports.d.ts +2 -2
  144. package/dist/queries/imports.js +1 -1
  145. package/dist/queries/incomplete-migration.d.ts +5 -3
  146. package/dist/queries/incomplete-migration.js +1 -1
  147. package/dist/queries/index.d.ts +3 -3
  148. package/dist/queries/index.js +1 -1
  149. package/dist/queries/isolated.d.ts +2 -2
  150. package/dist/queries/isolated.js +1 -1
  151. package/dist/queries/locality-candidates.d.ts +2 -2
  152. package/dist/queries/locality-candidates.js +1 -1
  153. package/dist/queries/members.d.ts +2 -2
  154. package/dist/queries/members.js +1 -1
  155. package/dist/queries/methods.d.ts +2 -2
  156. package/dist/queries/methods.js +1 -1
  157. package/dist/queries/outline.d.ts +2 -2
  158. package/dist/queries/outline.js +1 -1
  159. package/dist/queries/passthrough-candidates.d.ts +2 -2
  160. package/dist/queries/passthrough-candidates.js +1 -1
  161. package/dist/queries/plan-context.d.ts +2 -2
  162. package/dist/queries/plan-context.js +1 -1
  163. package/dist/queries/react-component-duplicates.d.ts +2 -2
  164. package/dist/queries/react-component-duplicates.js +1 -1
  165. package/dist/queries/react-hook-candidates.d.ts +2 -2
  166. package/dist/queries/react-hook-candidates.js +1 -1
  167. package/dist/queries/react-large-component-pressure.d.ts +2 -2
  168. package/dist/queries/react-large-component-pressure.js +1 -1
  169. package/dist/queries/recent-duplicates.d.ts +2 -2
  170. package/dist/queries/recent-duplicates.js +1 -1
  171. package/dist/queries/redundant-reexports.d.ts +2 -2
  172. package/dist/queries/redundant-reexports.js +1 -1
  173. package/dist/queries/refs.d.ts +2 -2
  174. package/dist/queries/refs.js +1 -1
  175. package/dist/queries/self-audit.d.ts +2 -2
  176. package/dist/queries/self-audit.js +1 -1
  177. package/dist/queries/similar-chains.d.ts +2 -2
  178. package/dist/queries/similar-chains.js +1 -1
  179. package/dist/queries/similar-files.d.ts +2 -2
  180. package/dist/queries/similar-files.js +1 -1
  181. package/dist/queries/similar-signatures.d.ts +2 -2
  182. package/dist/queries/similar-signatures.js +1 -1
  183. package/dist/queries/similar.d.ts +5 -3
  184. package/dist/queries/similar.js +1 -1
  185. package/dist/queries/slice.d.ts +2 -2
  186. package/dist/queries/slice.js +1 -1
  187. package/dist/queries/stale-abstractions.d.ts +2 -2
  188. package/dist/queries/stale-abstractions.js +1 -1
  189. package/dist/queries/stats.d.ts +2 -2
  190. package/dist/queries/surface.d.ts +2 -2
  191. package/dist/queries/surface.js +1 -1
  192. package/dist/queries/symbols.d.ts +2 -2
  193. package/dist/queries/symbols.js +1 -1
  194. package/dist/queries/system.d.ts +2 -2
  195. package/dist/queries/system.js +1 -1
  196. package/dist/queries/trace.d.ts +2 -2
  197. package/dist/queries/trace.js +1 -1
  198. package/dist/queries/unused-imports.d.ts +2 -2
  199. package/dist/queries/unused-imports.js +1 -1
  200. package/dist/queries/unused-params.d.ts +2 -2
  201. package/dist/queries/unused-params.js +1 -1
  202. package/dist/queries/vue-component-duplicates.d.ts +2 -2
  203. package/dist/queries/vue-component-duplicates.js +1 -1
  204. package/dist/queries/vue-composable-candidates.d.ts +2 -2
  205. package/dist/queries/vue-composable-candidates.js +1 -1
  206. package/dist/queries/vue-large-view-pressure.d.ts +2 -2
  207. package/dist/queries/vue-large-view-pressure.js +1 -1
  208. package/dist/queries/wrapper-candidates.d.ts +2 -2
  209. package/dist/queries/wrapper-candidates.js +1 -1
  210. package/dist/reindex-worker.js +11 -11
  211. package/dist/reindex.d.ts +11 -2
  212. package/dist/reindex.js +22 -22
  213. package/dist/runtime.d.ts +17 -20
  214. package/dist/runtime.js +2 -2
  215. package/dist/scip-cli-CnK9Va4O.d.ts +56 -0
  216. package/docs/AGENT_GUIDE.md +1 -1
  217. package/docs/COMMAND_REFERENCE.md +3 -2
  218. package/docs/analyzer-inventory.md +2 -2
  219. package/docs/analyzer-validation-ledger.md +2 -2
  220. package/package.json +1 -1
  221. package/skills/concrete-plan/SKILL.md +2 -2
  222. package/skills/scip-adoption/SKILL.md +4 -2
  223. package/skills/scip-ai-cleanup/SKILL.md +1 -1
  224. package/skills/scip-api-impact/SKILL.md +6 -2
  225. package/skills/scip-debloat/SKILL.md +1 -1
  226. package/skills/scip-debug/SKILL.md +6 -2
  227. package/skills/scip-diagram/SKILL.md +3 -1
  228. package/skills/scip-directory-architecture/SKILL.md +7 -3
  229. package/skills/scip-doc-reconcile/SKILL.md +3 -1
  230. package/skills/scip-explore/SKILL.md +2 -2
  231. package/skills/scip-health-audit/SKILL.md +6 -2
  232. package/skills/scip-health-improve/SKILL.md +6 -2
  233. package/skills/scip-maintainability/SKILL.md +6 -3
  234. package/skills/scip-query/SKILL.md +10 -6
  235. package/skills/scip-query-setup/SKILL.md +10 -5
  236. package/skills/scip-react-maintainability/SKILL.md +7 -2
  237. package/skills/scip-triage-issue/SKILL.md +4 -2
  238. package/skills/scip-verify/SKILL.md +5 -3
  239. package/skills/scip-vue-maintainability/SKILL.md +7 -2
  240. package/dist/chunk-237YUOPK.js +0 -8
  241. package/dist/chunk-3UVJJ6Z7.js +0 -2
  242. package/dist/chunk-3ZYF3ELZ.js +0 -2
  243. package/dist/chunk-7JOTOWZO.js +0 -4
  244. package/dist/chunk-A3VNUGKJ.js +0 -2
  245. package/dist/chunk-A4L36SZS.js +0 -22
  246. package/dist/chunk-A7RNHUJH.js +0 -20
  247. package/dist/chunk-AYYIZ4BA.js +0 -4
  248. package/dist/chunk-BKDXBJDQ.js +0 -2
  249. package/dist/chunk-C3MZZ2ZN.js +0 -2
  250. package/dist/chunk-CRU42NJU.js +0 -2
  251. package/dist/chunk-ERHOS6AW.js +0 -2
  252. package/dist/chunk-FOQHUKNZ.js +0 -4
  253. package/dist/chunk-FUPDW5AC.js +0 -3
  254. package/dist/chunk-G3WGZU5Q.js +0 -2
  255. package/dist/chunk-HVTYSC26.js +0 -40
  256. package/dist/chunk-KPHKX4LP.js +0 -71
  257. package/dist/chunk-MA7OVFHI.js +0 -2
  258. package/dist/chunk-OBBDKQAG.js +0 -3
  259. package/dist/chunk-RHTJBYZ5.js +0 -2
  260. package/dist/chunk-UQJGTVHV.js +0 -5
  261. package/dist/chunk-ZFMPHDAT.js +0 -4
  262. package/dist/scip-cli-Bh1M_JPu.d.ts +0 -20
package/dist/reindex.js CHANGED
@@ -1,9 +1,9 @@
1
- import{a as x,b as O,f as F}from"./chunk-ONPCQ2PM.js";import{a as ne}from"./chunk-UUBMFL3F.js";import{a as Z,b as ee}from"./chunk-OBBDKQAG.js";import"./chunk-64MNV6AB.js";import"./chunk-7S5E7KWT.js";import{execFileSync as ur}from"child_process";import{closeSync as cr,copyFileSync as lr,existsSync as w,mkdirSync as K,mkdtempSync as gr,openSync as pr,readFileSync as We,renameSync as Y,rmSync as Q,writeFileSync as Ge}from"fs";import{basename as C,dirname as f,extname as dr,join as d}from"path";import qe from"better-sqlite3";import{execFileSync as Xe}from"child_process";import{existsSync as Ke,readdirSync as Ye,readFileSync as Qe}from"fs";import{extname as v,join as te}from"path";function b(e){let n=new Set((e.extensions??Z).map(i=>i.toLowerCase()));if(n.size===0)return{scanned:0,inserted:0,existing:0};if(!Ke(e.dbPath))throw new Error(`SCIP SQLite database not found at ${e.dbPath}`);let t=ne(e.projectRoot),r=Ze(e.projectRoot,n).filter(i=>!t.isIgnored(i)),o=new qe(e.dbPath);try{let i=nn(o,r),s=o.prepare(`INSERT OR IGNORE INTO documents (language, relative_path, position_encoding, text)
2
- VALUES (?, ?, NULL, ?)`),u=o.transaction(g=>{let l=0;for(let p of g){if(i.has(p))continue;let m=Qe(te(e.projectRoot,p),"utf-8"),ze=s.run(tn(p),p,m);l+=Number(ze.changes)}return l})(r),c={scanned:r.length,inserted:u,existing:r.length-u};return e.onStatus?.(`Augmented SQLite documents with ${u} auxiliary source file${u===1?"":"s"} (${c.existing} already present).`),c}finally{o.close()}}function Ze(e,n){let t=en(e,n);if(t)return t;let r=[],o=i=>{let s=i?te(e,i):e,a;try{a=Ye(s,{withFileTypes:!0})}catch{return}for(let u of a){if(ee.has(u.name))continue;let c=i?`${i}/${u.name}`:u.name;if(u.isDirectory()){o(c);continue}n.has(v(u.name).toLowerCase())&&r.push(c)}};return o(""),r.sort()}function en(e,n){try{return Xe("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:26214400,stdio:["ignore","pipe","ignore"]}).split(`
3
- `).filter(r=>r&&n.has(v(r).toLowerCase())).sort()}catch{return null}}function nn(e,n){let t=new Set,r=500;for(let o=0;o<n.length;o+=r){let i=n.slice(o,o+r),s=e.prepare(`SELECT relative_path FROM documents WHERE relative_path IN (${i.map(()=>"?").join(",")})`).all(...i);for(let a of s)t.add(a.relative_path)}return t}function tn(e){return v(e).toLowerCase()===".vue"?"vue":v(e).replace(/^\./,"").toLowerCase()||"source"}import{execFileSync as rn}from"child_process";import{existsSync as on,readdirSync as oe}from"fs";import{extname as ie,join as se}from"path";var sn=new Set([".git",".hg",".svn",".idea",".vscode","node_modules","vendor","dist","build","target","bin","obj",".dart_tool",".gradle",".next",".venv","venv","__pycache__"]),an=[{language:"typescript",files:["tsconfig.json","tsconfig.base.json"],extensions:[".ts",".tsx",".mts",".cts"]},{language:"rust",files:["Cargo.toml"],extensions:[".rs"]},{language:"go",files:["go.mod"],extensions:[".go"]},{language:"java",files:["pom.xml","build.gradle","build.gradle.kts"],extensions:[".java"]},{language:"kotlin",files:["build.gradle.kts"],extensions:[".kt",".kts"]},{language:"scala",files:["build.sbt"],extensions:[".scala"]},{language:"python",files:["pyproject.toml","setup.py","setup.cfg","Pipfile"],extensions:[".py",".pyi"]},{language:"ruby",files:["Gemfile"],extensions:[".rb"]},{language:"cpp",files:["compile_commands.json","CMakeLists.txt","Makefile"],extensions:[".cc",".cpp",".cxx",".hpp",".hh",".hxx"]},{language:"c",files:["compile_commands.json","CMakeLists.txt","Makefile"],extensions:[".c",".h"]},{language:"csharp",globs:["*.csproj","*.sln"],extensions:[".cs"]},{language:"vb",globs:["*.vbproj"],extensions:[".vb"]},{language:"dart",files:["pubspec.yaml"],extensions:[".dart"]},{language:"php",files:["composer.json"],extensions:[".php"]},{language:"javascript",files:["package.json"],extensions:[".js",".jsx",".mjs",".cjs"]}];function D(e){let n=[],t=un(e),r=pn(e);for(let o of an){if(cn(e,o.files)){n.push(o.language);continue}if(ln(t,o.globs)){n.push(o.language);continue}mn(r,o.extensions)&&n.push(o.language)}return n.includes("typescript")&&re(n,"javascript"),n.includes("cpp")&&!r.has(".c")&&re(n,"c"),n}function un(e){try{return oe(e)}catch{return[]}}function cn(e,n){return n?.length?n.some(t=>on(se(e,t))):!1}function ln(e,n){return n?.length?e.some(t=>n.some(r=>gn(t,r))):!1}function gn(e,n){if(n==="*")return!0;if(!n.includes("*"))return e===n;let[t,r]=n.split("*");return e.startsWith(t??"")&&e.endsWith(r??"")}function pn(e){let n=dn(e);if(n)return n;let t=new Set,r=[e];for(;r.length>0;){let o=r.pop();if(!o)continue;let i;try{i=oe(o,{withFileTypes:!0})}catch{continue}for(let s of i){if(s.name.startsWith(".")&&!s.name.endsWith("proj")&&!s.name.endsWith("sln")&&s.isDirectory())continue;let a=se(o,s.name);if(s.isDirectory()){sn.has(s.name)||r.push(a);continue}let u=ie(s.name).toLowerCase();u&&t.add(u)}}return t}function dn(e){try{let n=rn("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:26214400,stdio:["ignore","pipe","ignore"]}),t=new Set;for(let r of n.split(`
4
- `)){if(!r)continue;let o=ie(r).toLowerCase();o&&t.add(o)}return t}catch{return null}}function mn(e,n){return n?.length?n.some(t=>e.has(t)):!1}function re(e,n){let t=e.indexOf(n);t!==-1&&e.splice(t,1)}import{existsSync as ae,readdirSync as fn}from"fs";import{join as E}from"path";var ce={typescript:{language:"typescript",indexerBinary:"scip-typescript",checkCommand:"npx scip-typescript --version",indexArgs:({outputPath:e,pnpmWorkspaces:n,indexerBinary:t})=>{let r=["index","--infer-tsconfig","--output",e,"--no-progress-bar"];return n&&r.splice(1,0,"--pnpm-workspaces"),{binary:t,args:r}},markerFiles:["tsconfig.json"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","@sourcegraph/scip-typescript"]}],installUrl:"https://github.com/sourcegraph/scip-typescript",bundledNpmPackage:"@sourcegraph/scip-typescript"},javascript:{language:"javascript",indexerBinary:"scip-typescript",checkCommand:"npx scip-typescript --version",indexArgs:({outputPath:e,indexerBinary:n})=>({binary:n,args:["index","--infer-tsconfig","--output",e,"--no-progress-bar"]}),markerFiles:["package.json"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","@sourcegraph/scip-typescript"]}],installUrl:"https://github.com/sourcegraph/scip-typescript",bundledNpmPackage:"@sourcegraph/scip-typescript"},java:{language:"java",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["pom.xml","build.gradle"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},scala:{language:"scala",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["build.sbt"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},kotlin:{language:"kotlin",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["build.gradle.kts"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},rust:{language:"rust",indexerBinary:"rust-analyzer",checkCommand:"rust-analyzer --version",indexArgs:({outputPath:e})=>({binary:"rust-analyzer",args:["scip",".","--output",e]}),markerFiles:["Cargo.toml"],installMethods:[{label:"rustup",prerequisite:"rustup",binary:"rustup",args:["component","add","rust-analyzer"]}],installUrl:"https://github.com/rust-lang/rust-analyzer"},python:{language:"python",indexerBinary:"scip-python-plus",binaryAliases:["scip-python"],checkCommand:"scip-python-plus --version",indexArgs:({outputPath:e,indexerBinary:n})=>({binary:n,args:["index","--output",e,"--project-name","project"]}),markerFiles:["pyproject.toml","setup.py"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","scip-python-plus"]}],installUrl:"https://github.com/PlunderStruck/scip-python",bundledNpmPackage:"scip-python-plus"},ruby:{language:"ruby",indexerBinary:"scip-ruby",checkCommand:"scip-ruby --version",indexArgs:({indexerBinary:e})=>({binary:e,args:["--dir","."]}),defaultOutputPath:"index.scip",markerFiles:["Gemfile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-ruby/releases"},go:{language:"go",indexerBinary:"scip-go",checkCommand:"scip-go --version",indexArgs:({outputPath:e})=>({binary:"scip-go",args:["--output",e]}),markerFiles:["go.mod"],installMethods:[{label:"go install",prerequisite:"go",binary:"go",args:["install","github.com/sourcegraph/scip-go@latest"]}],installUrl:"https://github.com/sourcegraph/scip-go"},cpp:{language:"cpp",indexerBinary:"scip-clang",checkCommand:"scip-clang --version",indexArgs:({outputPath:e})=>({binary:"scip-clang",args:["--compdb-path","compile_commands.json","--index-output-path",e]}),markerFiles:["CMakeLists.txt","Makefile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-clang/releases"},c:{language:"c",indexerBinary:"scip-clang",checkCommand:"scip-clang --version",indexArgs:({outputPath:e})=>({binary:"scip-clang",args:["--compdb-path","compile_commands.json","--index-output-path",e]}),markerFiles:["CMakeLists.txt","Makefile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-clang/releases"},csharp:{language:"csharp",indexerBinary:"scip-dotnet",checkCommand:"scip-dotnet --version",indexArgs:({projectRoot:e,outputPath:n})=>({binary:"scip-dotnet",args:["index",ue(e,[".sln",".csproj"])??e,"--output",n,"--working-directory",e]}),markerFiles:["*.csproj","*.sln"],installMethods:[{label:"dotnet",prerequisite:"dotnet",binary:"dotnet",args:["tool","install","--global","scip-dotnet"]}],installUrl:"https://github.com/sourcegraph/scip-dotnet/releases"},vb:{language:"vb",indexerBinary:"scip-dotnet",checkCommand:"scip-dotnet --version",indexArgs:({projectRoot:e,outputPath:n})=>({binary:"scip-dotnet",args:["index",ue(e,[".sln",".vbproj"])??e,"--output",n,"--working-directory",e]}),markerFiles:["*.vbproj","*.sln"],installMethods:[{label:"dotnet",prerequisite:"dotnet",binary:"dotnet",args:["tool","install","--global","scip-dotnet"]}],installUrl:"https://github.com/sourcegraph/scip-dotnet/releases"},dart:{language:"dart",indexerBinary:"scip-dart",checkCommand:"scip-dart --version",indexArgs:({indexerBinary:e,outputPath:n})=>({binary:e,args:["--output",n]}),markerFiles:["pubspec.yaml"],installMethods:[{label:"dart pub",prerequisite:"dart",binary:"dart",args:["pub","global","activate","scip_dart"]}],installUrl:"https://github.com/Workiva/scip-dart/releases"},php:{language:"php",indexerBinary:"scip-php",projectLocalBinaries:["vendor/davidrjenni/scip-php/bin/scip-php","vendor/bin/scip-php"],checkCommand:"scip-php --version",indexArgs:({projectRoot:e,indexerBinary:n})=>{let t=E(e,"vendor","bin","scip-php"),r=E(e,"vendor","davidrjenni","scip-php","bin","scip-php");return{binary:"php",args:["-d","error_reporting=E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED",ae(r)?r:ae(t)?t:n]}},defaultOutputPath:"index.scip",markerFiles:["composer.json"],installMethods:[],installUrl:"https://github.com/davidrjenni/scip-php/releases"}};function k(e){return ce[e]}function ue(e,n){let t;try{t=fn(e)}catch{return null}for(let r of t)if(n.some(o=>r.endsWith(o)))return E(e,r);return null}import{readFileSync as hn,writeFileSync as bn}from"fs";import{create as V}from"@bufbuild/protobuf";import{deserializeSCIP as yn,serializeSCIP as xn,DocumentSchema as Sn,IndexSchema as Rn,SymbolInformationSchema as vn}from"@c4312/scip";function le(e){if(e.length===0)throw new Error("Cannot merge zero SCIP indexes");if(e.length===1)return e[0];let n=kn(e),t=In(e.flatMap(o=>o.documents??[])),r=ge(e.flatMap(o=>o.externalSymbols??[]));return V(Rn,{metadata:n,documents:t,externalSymbols:r})}function T(e,n){if(e.length===0)throw new Error("Cannot merge zero SCIP files");let t=e.map(o=>yn(hn(o))),r=le(t);return bn(n,Buffer.from(xn(r))),{documentCount:r.documents.length,externalSymbolCount:r.externalSymbols.length,inputCount:e.length}}function kn(e){let n=e[0]?.metadata;if(!n)return;let t=n.projectRoot;for(let r of e.slice(1)){let o=r.metadata?.projectRoot;if(t&&o&&o!==t)throw new Error(`Cannot merge SCIP indexes with different project roots: ${t} vs ${o}`)}return n}function In(e){let n=new Map;for(let t of e){let r=n.get(t.relativePath);if(!r){n.set(t.relativePath,t);continue}n.set(t.relativePath,V(Sn,{language:r.language||t.language,relativePath:r.relativePath||t.relativePath,occurrences:[...r.occurrences,...t.occurrences],symbols:ge([...r.symbols,...t.symbols]),text:Ln(r.text,t.text),positionEncoding:r.positionEncoding||t.positionEncoding}))}return[...n.values()]}function ge(e){let n=new Map;for(let t of e){let r=n.get(t.symbol);if(!r){n.set(t.symbol,t);continue}n.set(t.symbol,V(vn,{symbol:r.symbol,documentation:Cn([...r.documentation,...t.documentation]),relationships:Pn([...r.relationships,...t.relationships]),kind:r.kind||t.kind,displayName:r.displayName||t.displayName,enclosingSymbol:r.enclosingSymbol||t.enclosingSymbol,signatureDocumentation:r.signatureDocumentation??t.signatureDocumentation}))}return[...n.values()]}function Pn(e){let n=new Set,t=[];for(let r of e){let o=[r.symbol,r.isReference?"1":"0",r.isImplementation?"1":"0",r.isTypeDefinition?"1":"0",r.isDefinition?"1":"0"].join("|");n.has(o)||(n.add(o),t.push(r))}return t}function Ln(e,n){return e?n?e.length>=n.length?e:n:e:n}function Cn(e){return[...new Set(e)]}import{execFileSync as wn}from"child_process";import{createHash as On}from"crypto";import{readdirSync as Fn,readFileSync as Dn}from"fs";import{join as de}from"path";function pe(e){return(Vn(e)??Tn(e)).filter(n=>n&&!me(n)).sort()}function S(e,n={}){return(n.language?pe(e).filter(r=>En(r,n.language,n.markerFiles)):pe(e)).map(r=>{let o=de(e,r);try{let i=Dn(o);return{path:r,size:i.byteLength,hash:On("sha256").update(i).digest("hex")}}catch{return{path:r,size:-1,hash:"unreadable"}}})}function En(e,n,t){let r=e.split("/").at(-1)??e;if(t?.includes(e)||t?.includes(r)||Mn.has(r))return!0;let o=e.includes(".")?`.${e.split(".").at(-1).toLowerCase()}`:"";return(Nn[n]??[]).includes(o)}function Vn(e){try{return wn("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:50*1024*1024,stdio:["ignore","pipe","ignore"]}).split(`
5
- `).filter(Boolean)}catch{return null}}function Tn(e){let n=[],t=[""];for(;t.length>0;){let r=t.pop(),o=r?de(e,r):e,i;try{i=Fn(o,{withFileTypes:!0})}catch{continue}for(let s of i){let a=r?`${r}/${s.name}`:s.name;if(s.isDirectory()){me(a)||t.push(a);continue}n.push(a)}}return n}function me(e){return e.split("/").some(t=>jn.has(t))||e.endsWith(".db")||e.endsWith(".db-wal")||e.endsWith(".db-shm")||e.endsWith(".scip")}var jn=new Set([".git","node_modules",".scipquery-cache",".stryker-tmp","dist","build","coverage",".next",".nuxt","target"]),Mn=new Set(["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lockb","tsconfig.json","tsconfig.base.json","pyproject.toml","setup.py","setup.cfg","Cargo.toml","Cargo.lock","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","build.sbt","compile_commands.json","CMakeLists.txt","Makefile","Gemfile","Gemfile.lock","composer.json","composer.lock","pubspec.yaml","pubspec.lock"]),Nn={typescript:[".ts",".tsx",".mts",".cts"],javascript:[".js",".jsx",".mjs",".cjs"],java:[".java"],scala:[".scala"],kotlin:[".kt",".kts"],rust:[".rs"],python:[".py",".pyi"],ruby:[".rb"],go:[".go"],cpp:[".cc",".cpp",".cxx",".hpp",".hh",".hxx"],c:[".c",".h"],csharp:[".cs"],vb:[".vb"],dart:[".dart"],php:[".php"]};import{readFileSync as An,writeFileSync as _n}from"fs";import{create as fe}from"@bufbuild/protobuf";import{deserializeSCIP as $n,DocumentSchema as Bn,IndexSchema as Un,serializeSCIP as Wn,SymbolRole as Gn}from"@c4312/scip";function he(e){let n;try{n=$n(An(e))}catch{return{removedDefinitionOccurrences:0,touchedDocuments:0}}let t=Jn(n);return t.removedDefinitionOccurrences>0&&_n(e,Buffer.from(Wn(t.index))),{removedDefinitionOccurrences:t.removedDefinitionOccurrences,touchedDocuments:t.touchedDocuments}}function Jn(e){let n=new Set;for(let i of e.documents)for(let s of i.symbols)s.symbol&&n.add(s.symbol);for(let i of e.externalSymbols)i.symbol&&n.add(i.symbol);let t=0,r=0,o=[];for(let i of e.documents){let s=i.occurrences.filter(a=>(a.symbolRoles&Gn.Definition)===0||n.has(a.symbol)?!0:(t+=1,!1));if(s.length===i.occurrences.length){o.push(i);continue}r+=1,o.push(fe(Bn,{language:i.language,relativePath:i.relativePath,occurrences:s,symbols:i.symbols,text:i.text,positionEncoding:i.positionEncoding}))}return{index:t===0?e:fe(Un,{metadata:e.metadata,documents:o,externalSymbols:e.externalSymbols}),removedDefinitionOccurrences:t,touchedDocuments:r}}import{execFile as Hn}from"child_process";import{existsSync as I,renameSync as M,rmSync as N}from"fs";import{cpus as zn}from"os";import{join as be}from"path";function qn(e,n,t){if(!e.defaultOutputPath)return;let r=be(n,e.defaultOutputPath);t!==r&&I(r)&&M(r,t)}function Xn(e,n,t){if(!e.defaultOutputPath)return null;let r=be(n,e.defaultOutputPath);if(r===t)return null;let o=`${t}.default-output-backup`;return N(o,{force:!0}),I(r)?(M(r,o),{defaultOutputPath:r,backupPath:o}):{defaultOutputPath:r,backupPath:null}}function Kn(e){e&&(N(e.defaultOutputPath,{force:!0}),e.backupPath&&I(e.backupPath)&&M(e.backupPath,e.defaultOutputPath))}function Yn(e,n){if(e<=1)return 1;let t=Number(process.env.SCIP_QUERY_INDEXER_CONCURRENCY??0),r=Number.isFinite(n)&&n&&n>0?n:Number.isFinite(t)&&t>0?t:Math.min(2,Math.max(1,zn().length-1));return Math.max(1,Math.min(e,Math.floor(r)))}async function ye(e,n,t,r){let o=e.filter(c=>c.config.defaultOutputPath),i=e.filter(c=>!c.config.defaultOutputPath),s=[],a=Yn(i.length,r),u=await Zn(i,a,c=>j(c,n,t));if(a>1){let c=new Map;for(let g of u.filter(l=>l.skipped)){let l=i.find(p=>p.language===g.language);l&&(t(`Retrying ${l.language} indexer serially after parallel failure...`),c.set(l.language,await j(l,n,t)))}s.push(...u.map(g=>c.get(g.language)??g))}else s.push(...u);for(let c of o)s.push(await j(c,n,t));return s.sort((c,g)=>e.findIndex(l=>l.language===c.language)-e.findIndex(l=>l.language===g.language))}async function j(e,n,t){t(`Indexing ${e.language} with ${e.resolvedBinary}...`),N(e.scipPath,{force:!0});let r=Xn(e.config,n,e.scipPath);try{await Qn(e.binary,e.args,{cwd:n,env:e.env,maxBuffer:50*1024*1024}),qn(e.config,n,e.scipPath)}catch(o){let i=o instanceof Error?o.message:String(o),s=`${e.resolvedBinary} indexer failed: ${i.split(`
6
- `)[0]}`;return t(`Skipping ${e.language}: ${s}`),{language:e.language,scipPath:e.scipPath,skipped:{language:e.language,reason:s}}}finally{Kn(r)}if(!I(e.scipPath)){let o=`${e.resolvedBinary} indexer completed but did not produce ${e.scipPath}`;return t(`Skipping ${e.language}: ${o}`),{language:e.language,scipPath:e.scipPath,skipped:{language:e.language,reason:o}}}return{language:e.language,scipPath:e.scipPath}}function Qn(e,n,t){return new Promise((r,o)=>{Hn(e,[...n],t,i=>{i?o(i):r()})})}async function Zn(e,n,t){if(e.length===0)return[];let r=new Array(e.length),o=0,i=Math.max(1,Math.min(e.length,n)),s=Array.from({length:i},async()=>{for(;o<e.length;){let a=o++;r[a]=await t(e[a])}});return await Promise.all(s),r}import{execFileSync as _}from"child_process";import{existsSync as A,readFileSync as et}from"fs";import{createRequire as nt}from"module";import{platform as tt}from"os";import{dirname as xe,join as P}from"path";var rt=nt(import.meta.url);function $(e){return[e.indexerBinary,...e.binaryAliases??[]]}function L(e){let n=$(e);return n.length===1?n[0]:n.join(" or ")}function R(e){for(let n of $(e))if(x(n))return n;return it(e)}function B(e){return R(e)!==null||ot(e)}function ot(e){return Se(e)!==null}function it(e){let n=Se(e);if(!n)return null;let r=JSON.parse(et(n,"utf8")).bin;if(!r)return null;if(typeof r=="string")return P(xe(n),r);for(let o of $(e)){let i=r[o];if(i)return P(xe(n),i)}return null}function Se(e){if(!e.bundledNpmPackage)return null;try{return rt.resolve(`${e.bundledNpmPackage}/package.json`)}catch{return null}}function U(e,n){for(let t of e.projectLocalBinaries??[]){let r=P(n,t);if(A(r))return r}return null}function W(e,n=process.env,t=e.indexerBinary){if(e.indexerBinary!=="scip-dotnet"||Re(t,n))return n;let r=st(t,n);return r?{...n,DOTNET_ROOT:r}:n}function G(e,n){let t=e.installMethods,r=L(e);if(!t?.length)return n(`No auto-install method available for ${r}.`),e.installUrl&&n(`Install manually from: ${e.installUrl}`),!1;for(let o of t)if(x(o.prerequisite)){n(`Installing ${r} via ${o.label}...`);try{_(o.binary,o.args,{stdio:"inherit",timeout:3e5,env:process.env});let i=R(e);if(i){let s=i===e.indexerBinary?"":` (using ${i})`;return n(`Successfully installed ${r} via ${o.label}${s}`),!0}n(`${o.label} command completed but ${r} was not found on PATH`)}catch(i){let s=i instanceof Error?i.message:String(i);n(`${o.label} install failed: ${s}`)}}return n(`Could not auto-install ${r}.`),e.installUrl&&n(`Install manually from: ${e.installUrl}`),!1}function st(e,n){for(let t of at(n))if(Re(e,{...n,DOTNET_ROOT:t}))return t;return null}function at(e){let n=[],t=e.DOTNET_ROOT;if(t&&A(t)&&n.push(t),tt()==="darwin"&&x("brew"))try{let r=_("brew",["--prefix","dotnet@9"],{stdio:"pipe",env:e}).toString().trim(),o=P(r,"libexec");A(o)&&!n.includes(o)&&n.push(o)}catch{}return n}function Re(e,n){try{return _(e,["--version"],{stdio:"pipe",env:n}),!0}catch{return!1}}import Bt from"better-sqlite3";import{existsSync as Ut,readFileSync as Wt,writeFileSync as Gt}from"fs";import{dirname as Jt,join as Ht,resolve as zt}from"path";import{readFileSync as ut,rmSync as ct,statSync as lt,mkdtempSync as gt}from"fs";import{cpus as pt,tmpdir as dt}from"os";import{join as J}from"path";import{Worker as mt}from"worker_threads";function ve(e){return e.length>=8&&Ie(e.length)>1}function ke(e){let n=Ie(e.vueFiles.length),t=ht(e.vueFiles),r=yt(t,n),o=new URL("./augment-vue-worker.js",import.meta.url),i=gt(J(dt(),"scip-query-vue-workers-")),s=new SharedArrayBuffer(4),a=new Int32Array(s),u=ft(),c=Date.now();try{for(let l=0;l<r.length;l++)new mt(o,{workerData:{projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,tasks:r[l],resultPath:J(i,`${l}.json`),sharedBuffer:s}});for(;Atomics.load(a,0)<r.length;){if(Date.now()-c>u)throw new Error(`Vue reference workers timed out after ${(u/1e3).toFixed(0)}s`);Atomics.wait(a,0,Atomics.load(a,0),100)}let g=r.map((l,p)=>{let m=JSON.parse(ut(J(i,`${p}.json`),"utf-8"));if(!m.ok)throw new Error(`Vue reference worker failed: ${m.error}`);return m.result});return{occurrences:g.flatMap(l=>l.occurrences),skippedReferences:g.reduce((l,p)=>l+p.skippedReferences,0)}}finally{ct(i,{recursive:!0,force:!0})}}function Ie(e){let n=Number(process.env.SCIP_QUERY_AUGMENT_VUE_WORKERS??0),t=Number.isFinite(n)&&n>0?n:Math.min(8,Math.max(1,pt().length-1));return Math.max(1,Math.min(e,t))}function ft(){let e=Number(process.env.SCIP_QUERY_AUGMENT_VUE_WORKER_TIMEOUT_MS??0);return Number.isFinite(e)&&e>0?e:3e5}function ht(e){let n=bt(),t=[];for(let r of e){let o=Pe(r),i=Math.max(1,Math.ceil(o/n));for(let s=0;s<i;s++)t.push({fileName:r,startOffset:Math.floor(o*s/i),endOffset:s===i-1?Number.POSITIVE_INFINITY:Math.floor(o*(s+1)/i),countFileSkip:s===0})}return t}function bt(){return Number.POSITIVE_INFINITY}function yt(e,n){let t=Array.from({length:n},()=>({tasks:[],weight:0})),r=e.map(o=>({task:o,weight:xt(o)})).sort((o,i)=>i.weight-o.weight);for(let o of r){let i=t.reduce((s,a)=>a.weight<s.weight?a:s);i.tasks.push(o.task),i.weight+=o.weight}return t.map(o=>o.tasks).filter(o=>o.length>0)}function xt(e){return Number.isFinite(e.endOffset)?Math.max(1,e.endOffset-e.startOffset):Math.max(1,Pe(e.fileName)-e.startOffset)}function Pe(e){try{return lt(e).size}catch{return 1}}import{createRequire as St}from"module";import{existsSync as Rt,readFileSync as z}from"fs";import{dirname as Le,extname as vt,join as Ce,relative as kt,resolve as It}from"path";import{pathToFileURL as Pt}from"url";function Lt(e){e.transaction(()=>{e.prepare(`
1
+ import{a as x,b as F,f as E}from"./chunk-ONPCQ2PM.js";import{a as se}from"./chunk-UUBMFL3F.js";import{a as ie,b as oe}from"./chunk-A536TEU4.js";import"./chunk-64MNV6AB.js";import"./chunk-7S5E7KWT.js";import{execFileSync as Ar}from"child_process";import{closeSync as $r,copyFileSync as _r,existsSync as M,mkdirSync as te,mkdtempSync as Br,openSync as Wr,readFileSync as D,renameSync as k,rmSync as P,writeFileSync as Ze}from"fs";import{basename as T,dirname as f,extname as Ur,join as m}from"path";import ct from"better-sqlite3";import{execFileSync as lt}from"child_process";import{existsSync as gt,readdirSync as pt,readFileSync as dt}from"fs";import{extname as I,join as ae}from"path";function b(e){let t=new Set((e.extensions??ie).map(o=>o.toLowerCase()));if(t.size===0)return{scanned:0,inserted:0,existing:0};if(!gt(e.dbPath))throw new Error(`SCIP SQLite database not found at ${e.dbPath}`);let n=se(e.projectRoot),r=ft(e.projectRoot,t).filter(o=>!n.isIgnored(o)),i=new ct(e.dbPath);try{let o=ht(i,r),s=i.prepare(`INSERT OR IGNORE INTO documents (language, relative_path, position_encoding, text)
2
+ VALUES (?, ?, NULL, ?)`),u=i.transaction(g=>{let l=0;for(let p of g){if(o.has(p))continue;let h=dt(ae(e.projectRoot,p),"utf-8"),ut=s.run(yt(p),p,h);l+=Number(ut.changes)}return l})(r),c={scanned:r.length,inserted:u,existing:r.length-u};return e.onStatus?.(`Augmented SQLite documents with ${u} auxiliary source file${u===1?"":"s"} (${c.existing} already present).`),c}finally{i.close()}}function ft(e,t){let n=mt(e,t);if(n)return n;let r=[],i=o=>{let s=o?ae(e,o):e,a;try{a=pt(s,{withFileTypes:!0})}catch{return}for(let u of a){if(oe.has(u.name))continue;let c=o?`${o}/${u.name}`:u.name;if(u.isDirectory()){i(c);continue}t.has(I(u.name).toLowerCase())&&r.push(c)}};return i(""),r.sort()}function mt(e,t){try{return lt("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:26214400,stdio:["ignore","pipe","ignore"]}).split(`
3
+ `).filter(r=>r&&t.has(I(r).toLowerCase())).sort()}catch{return null}}function ht(e,t){let n=new Set,r=500;for(let i=0;i<t.length;i+=r){let o=t.slice(i,i+r),s=e.prepare(`SELECT relative_path FROM documents WHERE relative_path IN (${o.map(()=>"?").join(",")})`).all(...o);for(let a of s)n.add(a.relative_path)}return n}function yt(e){return I(e).toLowerCase()===".vue"?"vue":I(e).replace(/^\./,"").toLowerCase()||"source"}import{execFileSync as bt}from"child_process";import{existsSync as St,readdirSync as ce}from"fs";import{extname as le,join as ge}from"path";var xt=new Set([".git",".hg",".svn",".idea",".vscode","node_modules","vendor","dist","build","target","bin","obj",".dart_tool",".gradle",".next",".venv","venv","__pycache__"]),Rt=[{language:"typescript",files:["tsconfig.json","tsconfig.base.json"],extensions:[".ts",".tsx",".mts",".cts"]},{language:"rust",files:["Cargo.toml"],extensions:[".rs"]},{language:"go",files:["go.mod"],extensions:[".go"]},{language:"java",files:["pom.xml","build.gradle","build.gradle.kts"],extensions:[".java"]},{language:"kotlin",files:["build.gradle.kts"],extensions:[".kt",".kts"]},{language:"scala",files:["build.sbt"],extensions:[".scala"]},{language:"python",files:["pyproject.toml","setup.py","setup.cfg","Pipfile"],extensions:[".py",".pyi"]},{language:"ruby",files:["Gemfile"],extensions:[".rb"]},{language:"cpp",files:["compile_commands.json","CMakeLists.txt","Makefile"],extensions:[".cc",".cpp",".cxx",".hpp",".hh",".hxx"]},{language:"c",files:["compile_commands.json","CMakeLists.txt","Makefile"],extensions:[".c",".h"]},{language:"csharp",globs:["*.csproj","*.sln"],extensions:[".cs"]},{language:"vb",globs:["*.vbproj"],extensions:[".vb"]},{language:"dart",files:["pubspec.yaml"],extensions:[".dart"]},{language:"php",files:["composer.json"],extensions:[".php"]},{language:"javascript",files:["package.json"],extensions:[".js",".jsx",".mjs",".cjs"]}];function V(e){let t=[],n=vt(e),r=Lt(e);for(let i of Rt){if(kt(e,i.files)){t.push(i.language);continue}if(Pt(n,i.globs)){t.push(i.language);continue}wt(r,i.extensions)&&t.push(i.language)}return t.includes("typescript")&&ue(t,"javascript"),t.includes("cpp")&&!r.has(".c")&&ue(t,"c"),t}function vt(e){try{return ce(e)}catch{return[]}}function kt(e,t){return t?.length?t.some(n=>St(ge(e,n))):!1}function Pt(e,t){return t?.length?e.some(n=>t.some(r=>It(n,r))):!1}function It(e,t){if(t==="*")return!0;if(!t.includes("*"))return e===t;let[n,r]=t.split("*");return e.startsWith(n??"")&&e.endsWith(r??"")}function Lt(e){let t=jt(e);if(t)return t;let n=new Set,r=[e];for(;r.length>0;){let i=r.pop();if(!i)continue;let o;try{o=ce(i,{withFileTypes:!0})}catch{continue}for(let s of o){if(s.name.startsWith(".")&&!s.name.endsWith("proj")&&!s.name.endsWith("sln")&&s.isDirectory())continue;let a=ge(i,s.name);if(s.isDirectory()){xt.has(s.name)||r.push(a);continue}let u=le(s.name).toLowerCase();u&&n.add(u)}}return n}function jt(e){try{let t=bt("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:26214400,stdio:["ignore","pipe","ignore"]}),n=new Set;for(let r of t.split(`
4
+ `)){if(!r)continue;let i=le(r).toLowerCase();i&&n.add(i)}return n}catch{return null}}function wt(e,t){return t?.length?t.some(n=>e.has(n)):!1}function ue(e,t){let n=e.indexOf(t);n!==-1&&e.splice(n,1)}import{existsSync as pe,readdirSync as Ct}from"fs";import{join as N}from"path";var fe={typescript:{language:"typescript",indexerBinary:"scip-typescript",checkCommand:"npx scip-typescript --version",indexArgs:({outputPath:e,pnpmWorkspaces:t,indexerBinary:n,projectPath:r})=>{let i=r?["index","--output",e,"--no-progress-bar",r]:["index","--infer-tsconfig","--output",e,"--no-progress-bar"];return t&&!r&&i.splice(1,0,"--pnpm-workspaces"),{binary:n,args:i}},markerFiles:["tsconfig.json"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","@sourcegraph/scip-typescript"]}],installUrl:"https://github.com/sourcegraph/scip-typescript",bundledNpmPackage:"@sourcegraph/scip-typescript"},javascript:{language:"javascript",indexerBinary:"scip-typescript",checkCommand:"npx scip-typescript --version",indexArgs:({outputPath:e,indexerBinary:t})=>({binary:t,args:["index","--infer-tsconfig","--output",e,"--no-progress-bar"]}),markerFiles:["package.json"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","@sourcegraph/scip-typescript"]}],installUrl:"https://github.com/sourcegraph/scip-typescript",bundledNpmPackage:"@sourcegraph/scip-typescript"},java:{language:"java",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["pom.xml","build.gradle"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},scala:{language:"scala",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["build.sbt"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},kotlin:{language:"kotlin",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["build.gradle.kts"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},rust:{language:"rust",indexerBinary:"rust-analyzer",checkCommand:"rust-analyzer --version",indexArgs:({outputPath:e})=>({binary:"rust-analyzer",args:["scip",".","--output",e]}),markerFiles:["Cargo.toml"],installMethods:[{label:"rustup",prerequisite:"rustup",binary:"rustup",args:["component","add","rust-analyzer"]}],installUrl:"https://github.com/rust-lang/rust-analyzer"},python:{language:"python",indexerBinary:"scip-python-plus",binaryAliases:["scip-python"],checkCommand:"scip-python-plus --version",indexArgs:({outputPath:e,indexerBinary:t})=>({binary:t,args:["index","--output",e,"--project-name","project"]}),markerFiles:["pyproject.toml","setup.py"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","scip-python-plus"]}],installUrl:"https://github.com/PlunderStruck/scip-python",bundledNpmPackage:"scip-python-plus"},ruby:{language:"ruby",indexerBinary:"scip-ruby",checkCommand:"scip-ruby --version",indexArgs:({indexerBinary:e})=>({binary:e,args:["--dir","."]}),defaultOutputPath:"index.scip",markerFiles:["Gemfile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-ruby/releases"},go:{language:"go",indexerBinary:"scip-go",checkCommand:"scip-go --version",indexArgs:({outputPath:e})=>({binary:"scip-go",args:["--output",e]}),markerFiles:["go.mod"],installMethods:[{label:"go install",prerequisite:"go",binary:"go",args:["install","github.com/sourcegraph/scip-go@latest"]}],installUrl:"https://github.com/sourcegraph/scip-go"},cpp:{language:"cpp",indexerBinary:"scip-clang",checkCommand:"scip-clang --version",indexArgs:({outputPath:e})=>({binary:"scip-clang",args:["--compdb-path","compile_commands.json","--index-output-path",e]}),markerFiles:["CMakeLists.txt","Makefile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-clang/releases"},c:{language:"c",indexerBinary:"scip-clang",checkCommand:"scip-clang --version",indexArgs:({outputPath:e})=>({binary:"scip-clang",args:["--compdb-path","compile_commands.json","--index-output-path",e]}),markerFiles:["CMakeLists.txt","Makefile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-clang/releases"},csharp:{language:"csharp",indexerBinary:"scip-dotnet",checkCommand:"scip-dotnet --version",indexArgs:({projectRoot:e,outputPath:t})=>({binary:"scip-dotnet",args:["index",de(e,[".sln",".csproj"])??e,"--output",t,"--working-directory",e]}),markerFiles:["*.csproj","*.sln"],installMethods:[{label:"dotnet",prerequisite:"dotnet",binary:"dotnet",args:["tool","install","--global","scip-dotnet"]}],installUrl:"https://github.com/sourcegraph/scip-dotnet/releases"},vb:{language:"vb",indexerBinary:"scip-dotnet",checkCommand:"scip-dotnet --version",indexArgs:({projectRoot:e,outputPath:t})=>({binary:"scip-dotnet",args:["index",de(e,[".sln",".vbproj"])??e,"--output",t,"--working-directory",e]}),markerFiles:["*.vbproj","*.sln"],installMethods:[{label:"dotnet",prerequisite:"dotnet",binary:"dotnet",args:["tool","install","--global","scip-dotnet"]}],installUrl:"https://github.com/sourcegraph/scip-dotnet/releases"},dart:{language:"dart",indexerBinary:"scip-dart",checkCommand:"scip-dart --version",indexArgs:({indexerBinary:e,outputPath:t})=>({binary:e,args:["--output",t]}),markerFiles:["pubspec.yaml"],installMethods:[{label:"dart pub",prerequisite:"dart",binary:"dart",args:["pub","global","activate","scip_dart"]}],installUrl:"https://github.com/Workiva/scip-dart/releases"},php:{language:"php",indexerBinary:"scip-php",projectLocalBinaries:["vendor/davidrjenni/scip-php/bin/scip-php","vendor/bin/scip-php"],checkCommand:"scip-php --version",indexArgs:({projectRoot:e,indexerBinary:t})=>{let n=N(e,"vendor","bin","scip-php"),r=N(e,"vendor","davidrjenni","scip-php","bin","scip-php");return{binary:"php",args:["-d","error_reporting=E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED",pe(r)?r:pe(n)?n:t]}},defaultOutputPath:"index.scip",markerFiles:["composer.json"],installMethods:[],installUrl:"https://github.com/davidrjenni/scip-php/releases"}};function L(e){return fe[e]}function de(e,t){let n;try{n=Ct(e)}catch{return null}for(let r of t)for(let i of n)if(i.endsWith(r))return N(e,i);return null}import{readFileSync as Ot,writeFileSync as Tt}from"fs";import{create as A}from"@bufbuild/protobuf";import{deserializeSCIP as Mt,serializeSCIP as Dt,DocumentSchema as Ft,IndexSchema as Et,SymbolInformationSchema as Vt}from"@c4312/scip";function me(e){if(e.length===0)throw new Error("Cannot merge zero SCIP indexes");if(e.length===1)return e[0];let t=Nt(e),n=At(e.flatMap(i=>i.documents??[])),r=he(e.flatMap(i=>i.externalSymbols??[]));return A(Et,{metadata:t,documents:n,externalSymbols:r})}function j(e,t){if(e.length===0)throw new Error("Cannot merge zero SCIP files");let n=e.map(i=>Mt(Ot(i))),r=me(n);return Tt(t,Buffer.from(Dt(r))),{documentCount:r.documents.length,externalSymbolCount:r.externalSymbols.length,inputCount:e.length}}function Nt(e){let t=e[0]?.metadata;if(!t)return;let n=t.projectRoot;for(let r of e.slice(1)){let i=r.metadata?.projectRoot;if(n&&i&&i!==n)throw new Error(`Cannot merge SCIP indexes with different project roots: ${n} vs ${i}`)}return t}function At(e){let t=new Map;for(let n of e){let r=t.get(n.relativePath);if(!r){t.set(n.relativePath,n);continue}t.set(n.relativePath,A(Ft,{language:r.language||n.language,relativePath:r.relativePath||n.relativePath,occurrences:$t([...r.occurrences,...n.occurrences]),symbols:he([...r.symbols,...n.symbols]),text:Bt(r.text,n.text),positionEncoding:r.positionEncoding||n.positionEncoding}))}return[...t.values()]}function $t(e){let t=new Set,n=[];for(let r of e){let i=JSON.stringify(r);t.has(i)||(t.add(i),n.push(r))}return n}function he(e){let t=new Map;for(let n of e){let r=t.get(n.symbol);if(!r){t.set(n.symbol,n);continue}t.set(n.symbol,A(Vt,{symbol:r.symbol,documentation:Wt([...r.documentation,...n.documentation]),relationships:_t([...r.relationships,...n.relationships]),kind:r.kind||n.kind,displayName:r.displayName||n.displayName,enclosingSymbol:r.enclosingSymbol||n.enclosingSymbol,signatureDocumentation:r.signatureDocumentation??n.signatureDocumentation}))}return[...t.values()]}function _t(e){let t=new Set,n=[];for(let r of e){let i=[r.symbol,r.isReference?"1":"0",r.isImplementation?"1":"0",r.isTypeDefinition?"1":"0",r.isDefinition?"1":"0"].join("|");t.has(i)||(t.add(i),n.push(r))}return n}function Bt(e,t){return e?t?e.length>=t.length?e:t:e:t}function Wt(e){return[...new Set(e)]}import{execFileSync as Ut}from"child_process";import{createHash as Jt}from"crypto";import{readdirSync as Gt,readFileSync as qt}from"fs";import{join as be}from"path";function ye(e){return(Ht(e)??Kt(e)).filter(t=>t&&!Se(t)).sort()}function R(e,t={}){return(t.language?ye(e).filter(r=>zt(r,t.language,t.markerFiles)):ye(e)).map(r=>{let i=be(e,r);try{let o=qt(i);return{path:r,size:o.byteLength,hash:Jt("sha256").update(o).digest("hex")}}catch{return{path:r,size:-1,hash:"unreadable"}}})}function zt(e,t,n){let r=e.split("/").at(-1)??e;if(n?.includes(e)||n?.includes(r)||Yt.has(r))return!0;let i=e.includes(".")?`.${e.split(".").at(-1).toLowerCase()}`:"";return(Qt[t]??[]).includes(i)}function Ht(e){try{return Ut("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:50*1024*1024,stdio:["ignore","pipe","ignore"]}).split(`
5
+ `).filter(Boolean)}catch{return null}}function Kt(e){let t=[],n=[""];for(;n.length>0;){let r=n.pop(),i=r?be(e,r):e,o;try{o=Gt(i,{withFileTypes:!0})}catch{continue}for(let s of o){let a=r?`${r}/${s.name}`:s.name;if(s.isDirectory()){Se(a)||n.push(a);continue}t.push(a)}}return t}function Se(e){return e.split("/").some(n=>Xt.has(n))||e.endsWith(".db")||e.endsWith(".db-wal")||e.endsWith(".db-shm")||e.endsWith(".scip")}var Xt=new Set([".git","node_modules",".scipquery-cache",".stryker-tmp","dist","build","coverage",".next",".nuxt","target"]),Yt=new Set(["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lockb","tsconfig.json","tsconfig.base.json","pyproject.toml","setup.py","setup.cfg","Cargo.toml","Cargo.lock","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","build.sbt","compile_commands.json","CMakeLists.txt","Makefile","Gemfile","Gemfile.lock","composer.json","composer.lock","pubspec.yaml","pubspec.lock"]),Qt={typescript:[".ts",".tsx",".mts",".cts"],javascript:[".js",".jsx",".mjs",".cjs"],java:[".java"],scala:[".scala"],kotlin:[".kt",".kts"],rust:[".rs"],python:[".py",".pyi"],ruby:[".rb"],go:[".go"],cpp:[".cc",".cpp",".cxx",".hpp",".hh",".hxx"],c:[".c",".h"],csharp:[".cs"],vb:[".vb"],dart:[".dart"],php:[".php"]};import{readFileSync as Zt,writeFileSync as en}from"fs";import{create as xe}from"@bufbuild/protobuf";import{deserializeSCIP as tn,DocumentSchema as nn,IndexSchema as rn,serializeSCIP as on,SymbolRole as sn}from"@c4312/scip";function Re(e){let t;try{t=tn(Zt(e))}catch{return{removedDefinitionOccurrences:0,touchedDocuments:0}}let n=an(t);return n.removedDefinitionOccurrences>0&&en(e,Buffer.from(on(n.index))),{removedDefinitionOccurrences:n.removedDefinitionOccurrences,touchedDocuments:n.touchedDocuments}}function an(e){let t=new Set;for(let o of e.documents)for(let s of o.symbols)s.symbol&&t.add(s.symbol);for(let o of e.externalSymbols)o.symbol&&t.add(o.symbol);let n=0,r=0,i=[];for(let o of e.documents){let s=o.occurrences.filter(a=>(a.symbolRoles&sn.Definition)===0||t.has(a.symbol)?!0:(n+=1,!1));if(s.length===o.occurrences.length){i.push(o);continue}r+=1,i.push(xe(nn,{language:o.language,relativePath:o.relativePath,occurrences:s,symbols:o.symbols,text:o.text,positionEncoding:o.positionEncoding}))}return{index:n===0?e:xe(rn,{metadata:e.metadata,documents:i,externalSymbols:e.externalSymbols}),removedDefinitionOccurrences:n,touchedDocuments:r}}import{existsSync as un,readFileSync as cn,readdirSync as ln,statSync as gn}from"fs";import d from"path";var pn=new Set([".cache",".git",".next",".nuxt",".turbo",".nx","build","coverage","dist","node_modules","tmp","vendor"]);function ve(e,t=[]){let n=d.resolve(e),r=dn(n),i=t.flatMap(u=>fn(n,u)),o=hn([...r,...i]),s=yn(n,o)?[n,...o]:o,a=s.length>0?s:[n];return[...new Set(a.map(u=>Sn(n,u)))].sort((u,c)=>u.localeCompare(c))}function dn(e){let t=[],n=[e];for(;n.length>0;){let r=n.pop(),i;try{i=ln(r,{withFileTypes:!0})}catch{continue}for(let o of i){let s=d.join(r,o.name);if(o.isDirectory()){!pn.has(o.name)&&!o.name.startsWith(".")&&n.push(s);continue}o.isFile()&&mn(s)&&t.push(d.dirname(s))}}return t}function fn(e,t){let n=t.trim();if(!n)return[];let r=d.resolve(e,n);if(!Rn(e,r))return[];try{let i=gn(r);if(i.isDirectory())return[r];if(i.isFile()&&ke(d.basename(r)))return[d.dirname(r)]}catch{return[]}return[]}function mn(e){if(!ke(d.basename(e)))return!1;let t=Pe(e);return t?d.basename(e)==="tsconfig.json"||"include"in t||"files"in t||"references"in t:!1}function ke(e){return e.startsWith("tsconfig")&&e.endsWith(".json")}function hn(e){let t=[...new Set(e.map(n=>d.resolve(n)))].sort((n,r)=>n.localeCompare(r));return t.length<=1?t:t.filter(n=>!t.some(r=>r!==n&&xn(n,r)))}function yn(e,t){if(t.length===0||t.some(r=>d.resolve(r)===e))return!1;let n=d.join(e,"tsconfig.json");return un(n)&&bn(n)}function bn(e){let n=Pe(e)?.include;return Array.isArray(n)?n.some(r=>typeof r=="string"&&r.trim()!==""&&!r.startsWith("!")&&(r.includes("/")||r.includes("**")||!d.extname(r))):!1}function Pe(e){try{let t=JSON.parse(cn(e,"utf-8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}function Sn(e,t){let n=d.relative(e,t);return n?n.split(d.sep).join("/"):"."}function xn(e,t){let n=d.relative(e,t);return!!n&&!n.startsWith("..")&&!d.isAbsolute(n)}function Rn(e,t){let n=d.relative(e,t);return!n.startsWith("..")&&!d.isAbsolute(n)}import{execFile as vn}from"child_process";import{existsSync as w,renameSync as _,rmSync as B}from"fs";import{cpus as kn}from"os";import{join as Ie}from"path";function Pn(e,t,n){if(!e.defaultOutputPath)return;let r=Ie(t,e.defaultOutputPath);n!==r&&w(r)&&_(r,n)}function In(e,t,n){if(!e.defaultOutputPath)return null;let r=Ie(t,e.defaultOutputPath);if(r===n)return null;let i=`${n}.default-output-backup`;return B(i,{force:!0}),w(r)?(_(r,i),{defaultOutputPath:r,backupPath:i}):{defaultOutputPath:r,backupPath:null}}function Ln(e){e&&(B(e.defaultOutputPath,{force:!0}),e.backupPath&&w(e.backupPath)&&_(e.backupPath,e.defaultOutputPath))}function jn(e,t){if(e<=1)return 1;let n=Number(process.env.SCIP_QUERY_INDEXER_CONCURRENCY??0),r=Number.isFinite(t)&&t&&t>0?t:Number.isFinite(n)&&n>0?n:Math.min(8,Math.max(1,kn().length));return Math.max(1,Math.min(e,Math.floor(r)))}async function Le(e,t,n,r){let i=e.filter(c=>c.config.defaultOutputPath),o=e.filter(c=>!c.config.defaultOutputPath),s=[],a=jn(o.length,r),u=await Cn(o,a,c=>$(c,t,n));if(a>1){let c=new Map;for(let g of u.filter(l=>l.skipped)){let l=o.find(p=>p.id===g.id);l&&(n(`Retrying ${l.label} indexer serially after parallel failure...`),c.set(l.id,await $(l,t,n)))}s.push(...u.map(g=>c.get(g.id)??g))}else s.push(...u);for(let c of i)s.push(await $(c,t,n));return s.sort((c,g)=>e.findIndex(l=>l.id===c.id)-e.findIndex(l=>l.id===g.id))}async function $(e,t,n){n(`Indexing ${e.label} with ${e.resolvedBinary}...`),B(e.scipPath,{force:!0});let r=In(e.config,t,e.scipPath);try{await wn(e.binary,e.args,{cwd:t,env:e.env,maxBuffer:50*1024*1024}),Pn(e.config,t,e.scipPath)}catch(i){let o=i instanceof Error?i.message:String(i),s=`${e.resolvedBinary} indexer failed: ${o.split(`
6
+ `)[0]}`,a=e.label===e.language?s:`${e.label}: ${s}`;return n(`Skipping ${e.label}: ${s}`),{id:e.id,language:e.language,label:e.label,scipPath:e.scipPath,outputScipPath:e.outputScipPath,skipped:{language:e.language,reason:a}}}finally{Ln(r)}if(!w(e.scipPath)){let i=`${e.resolvedBinary} indexer completed but did not produce ${e.scipPath}`,o=e.label===e.language?i:`${e.label}: ${i}`;return n(`Skipping ${e.label}: ${i}`),{id:e.id,language:e.language,label:e.label,scipPath:e.scipPath,outputScipPath:e.outputScipPath,skipped:{language:e.language,reason:o}}}return{id:e.id,language:e.language,label:e.label,scipPath:e.scipPath,outputScipPath:e.outputScipPath}}function wn(e,t,n){return new Promise((r,i)=>{vn(e,[...t],n,o=>{o?i(o):r()})})}async function Cn(e,t,n){if(e.length===0)return[];let r=new Array(e.length),i=0,o=Math.max(1,Math.min(e.length,t)),s=Array.from({length:o},async()=>{for(;i<e.length;){let a=i++;r[a]=await n(e[a])}});return await Promise.all(s),r}import{execFileSync as U}from"child_process";import{existsSync as W,readFileSync as On}from"fs";import{createRequire as Tn}from"module";import{platform as Mn}from"os";import{dirname as je,join as C}from"path";var Dn=Tn(import.meta.url);function J(e){return[e.indexerBinary,...e.binaryAliases??[]]}function O(e){let t=J(e);return t.length===1?t[0]:t.join(" or ")}function v(e){for(let t of J(e))if(x(t))return t;return En(e)}function G(e){return v(e)!==null||Fn(e)}function Fn(e){return we(e)!==null}function En(e){let t=we(e);if(!t)return null;let r=JSON.parse(On(t,"utf8")).bin;if(!r)return null;if(typeof r=="string")return C(je(t),r);for(let i of J(e)){let o=r[i];if(o)return C(je(t),o)}return null}function we(e){if(!e.bundledNpmPackage)return null;try{return Dn.resolve(`${e.bundledNpmPackage}/package.json`)}catch{return null}}function q(e,t){for(let n of e.projectLocalBinaries??[]){let r=C(t,n);if(W(r))return r}return null}function z(e,t=process.env,n=e.indexerBinary){if(e.indexerBinary!=="scip-dotnet"||Ce(n,t))return t;let r=Vn(n,t);return r?{...t,DOTNET_ROOT:r}:t}function H(e,t){let n=e.installMethods,r=O(e);if(!n?.length)return t(`No auto-install method available for ${r}.`),e.installUrl&&t(`Install manually from: ${e.installUrl}`),!1;for(let i of n)if(x(i.prerequisite)){t(`Installing ${r} via ${i.label}...`);try{U(i.binary,i.args,{stdio:"inherit",timeout:3e5,env:process.env});let o=v(e);if(o){let s=o===e.indexerBinary?"":` (using ${o})`;return t(`Successfully installed ${r} via ${i.label}${s}`),!0}t(`${i.label} command completed but ${r} was not found on PATH`)}catch(o){let s=o instanceof Error?o.message:String(o);t(`${i.label} install failed: ${s}`)}}return t(`Could not auto-install ${r}.`),e.installUrl&&t(`Install manually from: ${e.installUrl}`),!1}function Vn(e,t){for(let n of Nn(t))if(Ce(e,{...t,DOTNET_ROOT:n}))return n;return null}function Nn(e){let t=[],n=e.DOTNET_ROOT;if(n&&W(n)&&t.push(n),Mn()==="darwin"&&x("brew"))try{let r=U("brew",["--prefix","dotnet@9"],{stdio:"pipe",env:e}).toString().trim(),i=C(r,"libexec");W(i)&&!t.includes(i)&&t.push(i)}catch{}return t}function Ce(e,t){try{return U(e,["--version"],{stdio:"pipe",env:t}),!0}catch{return!1}}import yr from"better-sqlite3";import{existsSync as br,readFileSync as Sr,writeFileSync as xr}from"fs";import{dirname as Rr,join as vr,resolve as kr}from"path";import{readFileSync as An,rmSync as $n,statSync as _n,mkdtempSync as Bn}from"fs";import{cpus as Wn,tmpdir as Un}from"os";import{join as K}from"path";import{Worker as Jn}from"worker_threads";function Oe(e){return e.length>=8&&Me(e.length)>1}function Te(e){let t=Me(e.vueFiles.length),n=qn(e.vueFiles),r=Hn(n,t),i=new URL("./augment-vue-worker.js",import.meta.url),o=Bn(K(Un(),"scip-query-vue-workers-")),s=new SharedArrayBuffer(4),a=new Int32Array(s),u=Gn(),c=Date.now();try{for(let l=0;l<r.length;l++)new Jn(i,{workerData:{projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,tasks:r[l],resultPath:K(o,`${l}.json`),sharedBuffer:s}});for(;Atomics.load(a,0)<r.length;){if(Date.now()-c>u)throw new Error(`Vue reference workers timed out after ${(u/1e3).toFixed(0)}s`);Atomics.wait(a,0,Atomics.load(a,0),100)}let g=r.map((l,p)=>{let h=JSON.parse(An(K(o,`${p}.json`),"utf-8"));if(!h.ok)throw new Error(`Vue reference worker failed: ${h.error}`);return h.result});return{occurrences:g.flatMap(l=>l.occurrences),skippedReferences:g.reduce((l,p)=>l+p.skippedReferences,0)}}finally{$n(o,{recursive:!0,force:!0})}}function Me(e){let t=Number(process.env.SCIP_QUERY_AUGMENT_VUE_WORKERS??0),n=Number.isFinite(t)&&t>0?t:Math.min(8,Math.max(1,Wn().length-1));return Math.max(1,Math.min(e,n))}function Gn(){let e=Number(process.env.SCIP_QUERY_AUGMENT_VUE_WORKER_TIMEOUT_MS??0);return Number.isFinite(e)&&e>0?e:3e5}function qn(e){let t=zn(),n=[];for(let r of e){let i=De(r),o=Math.max(1,Math.ceil(i/t));for(let s=0;s<o;s++)n.push({fileName:r,startOffset:Math.floor(i*s/o),endOffset:s===o-1?Number.POSITIVE_INFINITY:Math.floor(i*(s+1)/o),countFileSkip:s===0})}return n}function zn(){return Number.POSITIVE_INFINITY}function Hn(e,t){let n=Array.from({length:t},()=>({tasks:[],weight:0})),r=e.map(i=>({task:i,weight:Kn(i)})).sort((i,o)=>o.weight-i.weight);for(let i of r){let o=n.reduce((s,a)=>a.weight<s.weight?a:s);o.tasks.push(i.task),o.weight+=i.weight}return n.map(i=>i.tasks).filter(i=>i.length>0)}function Kn(e){return Number.isFinite(e.endOffset)?Math.max(1,e.endOffset-e.startOffset):Math.max(1,De(e.fileName)-e.startOffset)}function De(e){try{return _n(e).size}catch{return 1}}import{createRequire as Xn}from"module";import{existsSync as Yn,readFileSync as Y}from"fs";import{dirname as Fe,extname as Qn,join as Ee,relative as Zn,resolve as er}from"path";import{pathToFileURL as tr}from"url";function nr(e){e.transaction(()=>{e.prepare(`
7
7
  DELETE FROM mentions
8
8
  WHERE chunk_id IN (
9
9
  SELECT c.id
@@ -18,12 +18,12 @@ import{a as x,b as O,f as F}from"./chunk-ONPCQ2PM.js";import{a as ne}from"./chun
18
18
  FROM documents
19
19
  WHERE language = 'vue' OR relative_path LIKE '%.vue'
20
20
  )
21
- `).run()})()}function we(e,n){return e.prepare(`
21
+ `).run()})()}function Ve(e,t){return e.prepare(`
22
22
  SELECT relative_path AS relativePath
23
23
  FROM documents
24
24
  WHERE language = 'vue' OR relative_path LIKE '%.vue'
25
25
  ORDER BY relative_path
26
- `).all().map(r=>It(n,r.relativePath))}function Oe(e,n){let{vueCore:t,ts:r,volarTs:o}=Ct(e),{parsed:i,vueOptions:s}=wt(t,r,n),a=Le(n),u=t.createVueLanguagePlugin(r,i.options,s,m=>m),c=Ot(t,r,u),g=Ft(a,i),{languageServiceHost:l}=o.createLanguageServiceHost(r,r.sys,c,m=>m,g),p=r.createLanguageService(l);return{ts:r,language:c,languageService:p,fileNames:i.fileNames,configDir:a}}function Ct(e){let n=St(Pt(Ce(e,"package.json")).href);return{vueCore:H(n,"@vue/language-core",e),ts:H(n,"typescript",e),volarTs:H(n,"@volar/typescript",e)}}function wt(e,n,t){let r=n.readConfigFile(t,n.sys.readFile);if(r.error||!r.config)throw new Error(`Failed to read ${t}`);let i=e.createParsedCommandLine(n,n.sys,t).vueOptions;return typeof e.createGlobalTypesWriter=="function"&&(i.globalTypesPath=e.createGlobalTypesWriter(i,n.sys.writeFile)),{parsed:n.parseJsonConfigFileContent(r.config,n.sys,Le(t),void 0,t,void 0,e.getAllExtensions(i).map(s=>({extension:s.slice(1),isMixedContent:!0,scriptKind:n.ScriptKind.Deferred}))),vueOptions:i}}function Ot(e,n,t){let r={},o=e.createLanguage([t],new Map,i=>{if(!Rt(i))return;let s=z(i,"utf-8");r.current?.scripts.set(i,n.ScriptSnapshot.fromString(s),t.getLanguageId(i)??Mt(i))});return r.current=o,o}function Ft(e,n){return{getCurrentDirectory:()=>e,getCompilationSettings:()=>n.options,getScriptFileNames:()=>n.fileNames,getProjectReferences:()=>n.projectReferences,getProjectVersion:()=>"0"}}function H(e,n,t){try{return e(n)}catch(r){throw(typeof r=="object"&&r!==null&&"code"in r?r.code:null)==="MODULE_NOT_FOUND"?new Error(`Vue augmentation requires ${n} to be installed in ${t}. Install Vue/Volar dependencies for that project, then rerun augment-vue.`,{cause:r}):r}}function Fe(e,n,t){let r=Dt(e);return o=>{let i=h(n,o.fileName),s=t.get(o.fileName);if(!s)return null;let a=t.positionAt(s,o.textSpan.start),u=r.get(i);if(!u)return null;let c=u.containingByLine.get(a.line);return c!==void 0?c:Et(u.starts,a.line,2)}}function Dt(e){let n=e.prepare(`
26
+ `).all().map(r=>er(t,r.relativePath))}function Ne(e,t){let{vueCore:n,ts:r,volarTs:i}=rr(e),{parsed:o,vueOptions:s}=ir(n,r,t),a=Fe(t),u=n.createVueLanguagePlugin(r,o.options,s,h=>h),c=or(n,r,u),g=sr(a,o),{languageServiceHost:l}=i.createLanguageServiceHost(r,r.sys,c,h=>h,g),p=r.createLanguageService(l);return{ts:r,language:c,languageService:p,fileNames:o.fileNames,configDir:a}}function rr(e){let t=Xn(tr(Ee(e,"package.json")).href);return{vueCore:X(t,"@vue/language-core",e),ts:X(t,"typescript",e),volarTs:X(t,"@volar/typescript",e)}}function ir(e,t,n){let r=t.readConfigFile(n,t.sys.readFile);if(r.error||!r.config)throw new Error(`Failed to read ${n}`);let o=e.createParsedCommandLine(t,t.sys,n).vueOptions;return typeof e.createGlobalTypesWriter=="function"&&(o.globalTypesPath=e.createGlobalTypesWriter(o,t.sys.writeFile)),{parsed:t.parseJsonConfigFileContent(r.config,t.sys,Fe(n),void 0,n,void 0,e.getAllExtensions(o).map(s=>({extension:s.slice(1),isMixedContent:!0,scriptKind:t.ScriptKind.Deferred}))),vueOptions:o}}function or(e,t,n){let r={},i=e.createLanguage([n],new Map,o=>{if(!Yn(o))return;let s=Y(o,"utf-8");r.current?.scripts.set(o,t.ScriptSnapshot.fromString(s),n.getLanguageId(o)??pr(o))});return r.current=i,i}function sr(e,t){return{getCurrentDirectory:()=>e,getCompilationSettings:()=>t.options,getScriptFileNames:()=>t.fileNames,getProjectReferences:()=>t.projectReferences,getProjectVersion:()=>"0"}}function X(e,t,n){try{return e(t)}catch(r){throw(typeof r=="object"&&r!==null&&"code"in r?r.code:null)==="MODULE_NOT_FOUND"?new Error(`Vue augmentation requires ${t} to be installed in ${n}. Install Vue/Volar dependencies for that project, then rerun augment-vue.`,{cause:r}):r}}function Ae(e,t,n){let r=ar(e);return i=>{let o=y(t,i.fileName),s=n.get(i.fileName);if(!s)return null;let a=n.positionAt(s,i.textSpan.start),u=r.get(o);if(!u)return null;let c=u.containingByLine.get(a.line);return c!==void 0?c:ur(u.starts,a.line,2)}}function ar(e){let t=e.prepare(`
27
27
  SELECT
28
28
  d.relative_path AS relativePath,
29
29
  der.start_line AS startLine,
@@ -32,23 +32,23 @@ import{a as x,b as O,f as F}from"./chunk-ONPCQ2PM.js";import{a as ne}from"./chun
32
32
  FROM defn_enclosing_ranges der
33
33
  JOIN documents d ON d.id = der.document_id
34
34
  ORDER BY d.relative_path, (der.end_line - der.start_line) DESC
35
- `).all(),t=new Map;for(let r of n){let o=t.get(r.relativePath);o||(o={containingByLine:new Map,starts:[]},t.set(r.relativePath,o)),o.starts.push({line:r.startLine,symbolId:r.symbolId});for(let i=r.startLine;i<=r.endLine;i++)o.containingByLine.set(i,r.symbolId)}for(let r of t.values())r.starts.sort((o,i)=>o.line-i.line);return t}function Et(e,n,t){let r=0,o=e.length-1;for(;r<=o;){let s=Math.floor((r+o)/2);e[s].line<n?r=s+1:o=s-1}let i=null;for(let s of[o,r]){let a=e[s];if(!a)continue;let u=Math.abs(a.line-n);u>t||(!i||u<i.distance)&&(i={distance:u,symbolId:a.symbolId})}return i?.symbolId??null}function De(e,n,t){let r=_t(n),o=e.prepare("SELECT id FROM global_symbols WHERE symbol = ?"),i=e.prepare(`
35
+ `).all(),n=new Map;for(let r of t){let i=n.get(r.relativePath);i||(i={containingByLine:new Map,starts:[]},n.set(r.relativePath,i)),i.starts.push({line:r.startLine,symbolId:r.symbolId});for(let o=r.startLine;o<=r.endLine;o++)i.containingByLine.set(o,r.symbolId)}for(let r of n.values())r.starts.sort((i,o)=>i.line-o.line);return n}function ur(e,t,n){let r=0,i=e.length-1;for(;r<=i;){let s=Math.floor((r+i)/2);e[s].line<t?r=s+1:i=s-1}let o=null;for(let s of[i,r]){let a=e[s];if(!a)continue;let u=Math.abs(a.line-t);u>n||(!o||u<o.distance)&&(o={distance:u,symbolId:a.symbolId})}return o?.symbolId??null}function $e(e,t,n){let r=mr(t),i=e.prepare("SELECT id FROM global_symbols WHERE symbol = ?"),o=e.prepare(`
36
36
  INSERT OR IGNORE INTO global_symbols (symbol, display_name, kind, documentation)
37
37
  VALUES (?, ?, ?, ?)
38
- `),s=0,a=new Map;return e.transaction(()=>{for(let c of t){let g=h(n,c),l=$e(r.name,r.version,g);i.run(l,"default",7,`Vue component|${g}`);let p=$t(o,r,n,c);p&&(s++,a.set(c,p))}})(),{get(c){return a.get(c)??null},syntheticSymbols:s}}function Ee(e,n,t,r,o){return e.transaction(()=>(Lt(e),Vt(e,n,t,r),Tt(e,o)))()}function Vt(e,n,t,r){let o=e.prepare("SELECT id FROM documents WHERE relative_path = ?"),i=e.prepare(`
38
+ `),s=0,a=new Map;return e.transaction(()=>{for(let c of n){let g=y(t,c),l=He(r.name,r.version,g);o.run(l,"default",7,`Vue component|${g}`);let p=hr(i,r,t,c);p&&(s++,a.set(c,p))}})(),{get(c){return a.get(c)??null},syntheticSymbols:s}}function _e(e,t,n,r,i){return e.transaction(()=>(nr(e),cr(e,t,n,r),lr(e,i)))()}function cr(e,t,n,r){let i=e.prepare("SELECT id FROM documents WHERE relative_path = ?"),o=e.prepare(`
39
39
  INSERT INTO chunks (document_id, chunk_index, start_line, end_line, occurrences)
40
40
  VALUES (?, ?, ?, ?, X'00')
41
41
  `),s=e.prepare(`
42
42
  INSERT OR IGNORE INTO mentions (chunk_id, symbol_id, role)
43
43
  VALUES (?, ?, 1)
44
- `);for(let a of t){let u=r.get(a);if(!u)continue;let c=h(n,a),g=o.get(c);if(!g)continue;let l=i.run(g.id,-1,0,0);s.run(Number(l.lastInsertRowid),u)}}function Ve(e,n,t,r,o){if(e.fileName.endsWith(".vue")){let i=r.language.scripts.get(e.fileName),s=i?.generated?.languagePlugin.typescript?.getServiceScript(i.generated.root)?.code;if(i&&s){let a=r.language.maps.get(s,i);if(q(a,e.textSpan.start)!==null)return t.get(e.fileName)}return e.fileName.startsWith(o)?t.get(e.fileName):null}return n(e)}function Te(e){let n=new Set,t=[];for(let r of e){let o=je(r);n.has(o)||(n.add(o),t.push(r))}return t}function je(e){return[e.sourceFile,e.sourceLine,e.sourceStartChar,e.sourceEndChar,e.symbolId].join(":")}function Tt(e,n){let t=At(e,[...new Set(n.map(u=>u.sourceFile))]),r=e.prepare(`
44
+ `);for(let a of n){let u=r.get(a);if(!u)continue;let c=y(t,a),g=i.get(c);if(!g)continue;let l=o.run(g.id,-1,0,0);s.run(Number(l.lastInsertRowid),u)}}function Be(e,t,n,r,i){if(e.fileName.endsWith(".vue")){let o=r.language.scripts.get(e.fileName),s=o?.generated?.languagePlugin.typescript?.getServiceScript(o.generated.root)?.code;if(o&&s){let a=r.language.maps.get(s,o);if(Q(a,e.textSpan.start)!==null)return n.get(e.fileName)}return e.fileName.startsWith(i)?n.get(e.fileName):null}return t(e)}function We(e){let t=new Set,n=[];for(let r of e){let i=Ue(r);t.has(i)||(t.add(i),n.push(r))}return n}function Ue(e){return[e.sourceFile,e.sourceLine,e.sourceStartChar,e.sourceEndChar,e.symbolId].join(":")}function lr(e,t){let n=fr(e,[...new Set(t.map(u=>u.sourceFile))]),r=e.prepare(`
45
45
  INSERT INTO chunks (document_id, chunk_index, start_line, end_line, occurrences)
46
46
  VALUES (?, ?, ?, ?, X'00')
47
- `),o=e.prepare(`
47
+ `),i=e.prepare(`
48
48
  INSERT OR IGNORE INTO mentions (chunk_id, symbol_id, role)
49
49
  VALUES (?, ?, 0)
50
- `),i=new Set,s=0,a=0;for(let u of n){let c=je(u);if(i.has(c))continue;i.add(c);let g=t.get(u.sourceFile);if(!g)continue;let l=r.run(g,a++,u.sourceLine,u.sourceLine),p=o.run(Number(l.lastInsertRowid),u.symbolId);s+=Number(p.changes)}return s}function*Me(e){let n=/\b[A-Za-z_$][A-Za-z0-9_$]*\b/g,t=new Set(["script","setup","template","style","lang","scoped","true","false","null","undefined","const","let","var","import","from","export","return","if","else","for","while","function","class","type","interface","as","await","async"]),r;for(;r=n.exec(e);){let o=r[0];t.has(o)||(yield{text:o,start:r.index,end:r.index+o.length})}}function Ne(e,n){for(let[t]of e.toGeneratedLocation(n,r=>!!r.navigation))return t;return null}function q(e,n){let t=e;for(let[r]of t.toSourceLocation(n,o=>!!o.navigation))return r;return null}function jt(e,n){let t=0,r=e.lineStarts.length-1;for(;t<=r;){let i=Math.floor((t+r)/2);e.lineStarts[i]<=n?t=i+1:r=i-1}let o=Math.max(0,r);return{line:o,character:n-e.lineStarts[o]}}function Ae(e,n){return h(e,n).startsWith("node_modules/")}function h(e,n){return kt(e,n).replaceAll("\\","/")}function Mt(e){switch(vt(e)){case".vue":return"vue";case".tsx":return"typescriptreact";case".ts":case".mts":case".cts":return"typescript";case".jsx":return"javascriptreact";case".js":case".mjs":case".cjs":return"javascript";case".json":return"json";default:return"typescript"}}function _e(){let e=new Map;return{get(n){if(e.has(n))return e.get(n)??null;try{let t=z(n,"utf-8"),r={text:t,lineStarts:Nt(t)};return e.set(n,r),r}catch{return e.set(n,null),null}},positionAt:jt}}function Nt(e){let n=[0];for(let t=0;t<e.length;t++)e.charCodeAt(t)===10&&n.push(t+1);return n}function At(e,n){let t=new Map,r=500;for(let o=0;o<n.length;o+=r){let i=n.slice(o,o+r),s=e.prepare(`SELECT id, relative_path AS relativePath FROM documents WHERE relative_path IN (${i.map(()=>"?").join(",")})`).all(...i);for(let a of s)t.set(a.relativePath,a.id)}return t}function _t(e){try{let n=JSON.parse(z(Ce(e,"package.json"),"utf-8"));return{name:n.name??"workspace",version:n.version??"0.0.0"}}catch{return{name:"workspace",version:"0.0.0"}}}function $t(e,n,t,r){let o=h(t,r),i=$e(n.name,n.version,o);return e.get(i)?.id??null}function $e(e,n,t){let r=t.split("/").map(o=>`\`${o.replaceAll("`","")}\``).join("/");return`scip-vue npm ${e} ${n} ${r}/default.`}function qt(e){b({projectRoot:e.projectRoot,dbPath:e.dbPath});let n=zt(e.projectRoot,e.tsconfig);if(!Ut(n))throw new Error(`Vue tsconfig not found at ${n}`);let t=new Bt(e.dbPath);try{let r=we(t,e.projectRoot),o=Ht(Jt(e.dbPath),"augment-vue-meta.json"),i=Be(t,e.projectRoot,e.tsconfig),s=Xt(o,i,e.onStatus);if(s)return s;let a=Kt({db:t,projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,configPath:n,vueFiles:r,onStatus:e.onStatus});return Zt(o,Be(t,e.projectRoot,e.tsconfig),a),a}finally{t.close()}}function Xt(e,n,t){let r=Qt(e,n);return r&&t?.(`Vue references unchanged; reused ${r.resolvedReferences} cached resolved references.`),r}function Kt(e){let n=De(e.db,e.projectRoot,e.vueFiles),t=Yt(e,n),r=Te(t.occurrences),o=Ee(e.db,e.projectRoot,e.vueFiles,n,r),i={vueFiles:e.vueFiles.length,resolvedReferences:r.length,insertedMentions:o,skippedReferences:t.skippedReferences,syntheticSymbols:n.syntheticSymbols};return e.onStatus?.(`Resolved ${i.resolvedReferences} Vue references with Volar; inserted ${i.insertedMentions} mentions.`),i}function Yt(e,n){if(ve(e.vueFiles))return ke({projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,vueFiles:e.vueFiles});let t=er({db:e.db,projectRoot:e.projectRoot,configPath:e.configPath,vueSymbolLookup:n});return nr({...t,vueFiles:t.context.fileNames.filter(r=>r.endsWith(".vue"))})}function Qt(e,n){try{let t=JSON.parse(Wt(e,"utf-8"));return JSON.stringify(t.fingerprint)===JSON.stringify(n)?t.result:null}catch{return null}}function Zt(e,n,t){Gt(e,JSON.stringify({updatedAt:new Date().toISOString(),fingerprint:n,result:t},null,2)+`
51
- `)}function Be(e,n,t){let r=e.prepare(`
50
+ `),o=new Set,s=0,a=0;for(let u of t){let c=Ue(u);if(o.has(c))continue;o.add(c);let g=n.get(u.sourceFile);if(!g)continue;let l=r.run(g,a++,u.sourceLine,u.sourceLine),p=i.run(Number(l.lastInsertRowid),u.symbolId);s+=Number(p.changes)}return s}function*Je(e){let t=/\b[A-Za-z_$][A-Za-z0-9_$]*\b/g,n=new Set(["script","setup","template","style","lang","scoped","true","false","null","undefined","const","let","var","import","from","export","return","if","else","for","while","function","class","type","interface","as","await","async"]),r;for(;r=t.exec(e);){let i=r[0];n.has(i)||(yield{text:i,start:r.index,end:r.index+i.length})}}function Ge(e,t){for(let[n]of e.toGeneratedLocation(t,r=>!!r.navigation))return n;return null}function Q(e,t){let n=e;for(let[r]of n.toSourceLocation(t,i=>!!i.navigation))return r;return null}function gr(e,t){let n=0,r=e.lineStarts.length-1;for(;n<=r;){let o=Math.floor((n+r)/2);e.lineStarts[o]<=t?n=o+1:r=o-1}let i=Math.max(0,r);return{line:i,character:t-e.lineStarts[i]}}function qe(e,t){return y(e,t).startsWith("node_modules/")}function y(e,t){return Zn(e,t).replaceAll("\\","/")}function pr(e){switch(Qn(e)){case".vue":return"vue";case".tsx":return"typescriptreact";case".ts":case".mts":case".cts":return"typescript";case".jsx":return"javascriptreact";case".js":case".mjs":case".cjs":return"javascript";case".json":return"json";default:return"typescript"}}function ze(){let e=new Map;return{get(t){if(e.has(t))return e.get(t)??null;try{let n=Y(t,"utf-8"),r={text:n,lineStarts:dr(n)};return e.set(t,r),r}catch{return e.set(t,null),null}},positionAt:gr}}function dr(e){let t=[0];for(let n=0;n<e.length;n++)e.charCodeAt(n)===10&&t.push(n+1);return t}function fr(e,t){let n=new Map,r=500;for(let i=0;i<t.length;i+=r){let o=t.slice(i,i+r),s=e.prepare(`SELECT id, relative_path AS relativePath FROM documents WHERE relative_path IN (${o.map(()=>"?").join(",")})`).all(...o);for(let a of s)n.set(a.relativePath,a.id)}return n}function mr(e){try{let t=JSON.parse(Y(Ee(e,"package.json"),"utf-8"));return{name:t.name??"workspace",version:t.version??"0.0.0"}}catch{return{name:"workspace",version:"0.0.0"}}}function hr(e,t,n,r){let i=y(n,r),o=He(t.name,t.version,i);return e.get(o)?.id??null}function He(e,t,n){let r=n.split("/").map(i=>`\`${i.replaceAll("`","")}\``).join("/");return`scip-vue npm ${e} ${t} ${r}/default.`}function Pr(e){b({projectRoot:e.projectRoot,dbPath:e.dbPath});let t=kr(e.projectRoot,e.tsconfig);if(!br(t))throw new Error(`Vue tsconfig not found at ${t}`);let n=new yr(e.dbPath);try{let r=Ve(n,e.projectRoot),i=vr(Rr(e.dbPath),"augment-vue-meta.json"),o=Ke(n,e.projectRoot,e.tsconfig),s=Ir(i,o,e.onStatus);if(s)return s;let a=Lr({db:n,projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,configPath:t,vueFiles:r,onStatus:e.onStatus});return Cr(i,Ke(n,e.projectRoot,e.tsconfig),a),a}finally{n.close()}}function Ir(e,t,n){let r=wr(e,t);return r&&n?.(`Vue references unchanged; reused ${r.resolvedReferences} cached resolved references.`),r}function Lr(e){let t=$e(e.db,e.projectRoot,e.vueFiles),n=jr(e,t),r=We(n.occurrences),i=_e(e.db,e.projectRoot,e.vueFiles,t,r),o={vueFiles:e.vueFiles.length,resolvedReferences:r.length,insertedMentions:i,skippedReferences:n.skippedReferences,syntheticSymbols:t.syntheticSymbols};return e.onStatus?.(`Resolved ${o.resolvedReferences} Vue references with Volar; inserted ${o.insertedMentions} mentions.`),o}function jr(e,t){if(Oe(e.vueFiles))return Te({projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,vueFiles:e.vueFiles});let n=Or({db:e.db,projectRoot:e.projectRoot,configPath:e.configPath,vueSymbolLookup:t});return Tr({...n,vueFiles:n.context.fileNames.filter(r=>r.endsWith(".vue"))})}function wr(e,t){try{let n=JSON.parse(Sr(e,"utf-8"));return JSON.stringify(n.fingerprint)===JSON.stringify(t)?n.result:null}catch{return null}}function Cr(e,t,n){xr(e,JSON.stringify({updatedAt:new Date().toISOString(),fingerprint:t,result:n},null,2)+`
51
+ `)}function Ke(e,t,n){let r=e.prepare(`
52
52
  SELECT
53
53
  (SELECT COUNT(*) FROM documents) AS documents,
54
54
  (SELECT COUNT(*) FROM global_symbols) AS symbols,
@@ -57,13 +57,13 @@ import{a as x,b as O,f as F}from"./chunk-ONPCQ2PM.js";import{a as ne}from"./chun
57
57
  (SELECT COUNT(*) FROM defn_enclosing_ranges) AS ranges,
58
58
  (SELECT MAX(id) FROM chunks) AS maxChunkId,
59
59
  (SELECT MAX(id) FROM global_symbols) AS maxSymbolId
60
- `).get();return{version:2,tsconfig:t,files:S(n),db:r}}function er(e){let n=_e();return{projectRoot:e.projectRoot,context:Oe(e.projectRoot,e.configPath),symbolLookup:Fe(e.db,e.projectRoot,n),vueSymbolLookup:e.vueSymbolLookup,sourceReader:n}}function nr(e){let n=[],t=0,r=e.tasks??e.vueFiles.map(o=>({fileName:o,startOffset:0,endOffset:Number.POSITIVE_INFINITY,countFileSkip:!0}));for(let o of r){let i=tr(e,o);n.push(...i.occurrences),t+=i.skippedReferences}return{occurrences:n,skippedReferences:t}}function tr(e,n){let t=e.context.language.scripts.get(n.fileName),r=t?.generated?.languagePlugin.typescript?.getServiceScript(t.generated.root)?.code;if(!t||!r)return{occurrences:[],skippedReferences:n.countFileSkip?1:0};let o=e.sourceReader.get(n.fileName);if(!o)return{occurrences:[],skippedReferences:n.countFileSkip?1:0};let i=e.context.language.maps.get(r,t),s=h(e.projectRoot,n.fileName),a=[...Me(o.text)],u={tokens:a.filter(c=>c.start>=n.startOffset&&c.start<n.endOffset),tokenByStart:new Map(a.map(c=>[c.start,c])),tokenTextCounts:ir(a),processedStarts:new Set};return rr({...e,fileName:n.fileName,sourceInfo:o,sourceFile:s,map:i,tokenContext:u})}function rr(e){let n=[],t=0;for(let r of e.tokenContext.tokens){if(e.tokenContext.processedStarts.has(r.start))continue;let o=Ne(e.map,r.start);if(o===null)continue;let s=(e.context.languageService.getDefinitionAtPosition(e.fileName,o+1)??[]).find(u=>!Ae(e.projectRoot,u.fileName));if(!s){t++;continue}let a=Ve(s,e.symbolLookup,e.vueSymbolLookup,e.context,e.projectRoot);if(a===null){t++;continue}Ue(n,e.sourceReader,e.sourceInfo,e.sourceFile,r,a),e.tokenContext.processedStarts.add(r.start),or(n,e,r,o,a)}return{occurrences:n,skippedReferences:t}}function or(e,n,t,r,o){if(!((n.tokenContext.tokenTextCounts.get(t.text)??0)<=1))for(let i of sr(n.context.languageService,n.fileName,r+1,n.map,t,n.tokenContext.tokenByStart)){if(n.tokenContext.processedStarts.has(i))continue;let s=n.tokenContext.tokenByStart.get(i);s&&(Ue(e,n.sourceReader,n.sourceInfo,n.sourceFile,s,o),n.tokenContext.processedStarts.add(i))}}function Ue(e,n,t,r,o,i){let s=n.positionAt(t,o.start);e.push({sourceFile:r,sourceLine:s.line,sourceStartChar:s.character,sourceEndChar:s.character+o.text.length,symbolId:i})}function ir(e){let n=new Map;for(let t of e)n.set(t.text,(n.get(t.text)??0)+1);return n}function sr(e,n,t,r,o,i){let s=e.getDocumentHighlights?.(n,t,[n])??[],a=[];for(let u of s)if(u.fileName===n)for(let c of u.highlightSpans){let g=ar(r,c.textSpan.start,i,o.text);g!==null&&a.push(g)}return a}function ar(e,n,t,r){let o=t.get(n);if(o?.text===r)return o.start;let i=q(e,n);if(i===null)return null;let s=t.get(i);return s?.text===r?s.start:null}async function Zo(e){let{projectRoot:n,maxHeapMb:t=8192,onStatus:r=console.log,skipAutoInstall:o=!1}=e,i=mr(e),s=Date.now();K(f(i.outputScip),{recursive:!0}),K(f(i.outputDb),{recursive:!0});let a=e.languages??D(n);if(a.length===0)throw new Error("No supported languages detected in this project. Looked for: tsconfig.json, Cargo.toml, go.mod, pyproject.toml, etc.");r(`Detected languages: ${a.join(", ")}`);let u=Er(n,a,{pnpmWorkspaces:e.pnpmWorkspaces}),c=Fr(d(f(i.outputDb),"index.lock")),g=null;try{let l=fr({opts:e,paths:i,languages:a,fingerprint:u,start:s,onStatus:r});if(l)return l;vr(o,r);let p=hr(i);return g=p.runDir,await br({opts:e,languages:a,projectRoot:n,paths:i,tempPaths:p,fingerprint:u,start:s,maxHeapMb:t,skipAutoInstall:o,onStatus:r})}finally{g&&Q(g,{recursive:!0,force:!0}),c()}}function mr(e){let n=e.outputScip??d(e.projectRoot,"index.scip"),t=e.outputDb??d(e.projectRoot,"index.db");return{outputScip:n,outputDb:t,metaPath:d(f(t),"meta.json")}}function fr(e){if(e.opts.skipIfUnchanged===!1||!w(e.paths.outputScip)||!w(e.paths.outputDb)||!Vr(e.paths.metaPath,e.fingerprint))return null;b({projectRoot:e.opts.projectRoot,dbPath:e.paths.outputDb,onStatus:e.onStatus});let n=Date.now()-e.start;return e.onStatus(`Index unchanged; reused existing SQLite index in ${(n/1e3).toFixed(1)}s`),{languages:e.languages,indexPath:e.paths.outputScip,dbPath:e.paths.outputDb,durationMs:n,reused:!0,skipped:[]}}function hr(e){let n=gr(d(f(e.outputDb),"reindex-"));return{runDir:n,tempOutputScip:d(n,C(e.outputScip)),tempOutputDb:d(n,C(e.outputDb)),tempMetaPath:d(n,C(e.metaPath))}}async function br(e){let n={...process.env,NODE_OPTIONS:`--max-old-space-size=${e.maxHeapMb}`},{indexedOutputs:t,skippedLanguages:r,reusedLanguages:o}=await yr(e,n);o.length>0&&e.onStatus(`Reused ${o.length} cached language shard(s): ${o.join(", ")}`),xr(e,n,t,r);let i=Date.now()-e.start;return e.onStatus(`Done in ${(i/1e3).toFixed(1)}s`),{languages:t.map(s=>s.language),indexPath:e.paths.outputScip,dbPath:e.paths.outputDb,durationMs:i,reused:!1,skipped:r}}async function yr(e,n){let t=Sr(e),r=new Set(t.map(c=>c.language));for(let c of r)e.onStatus(`Reusing cached ${c} SCIP shard (language inputs unchanged).`);let{preparedRuns:o,skippedLanguages:i}=kr({languages:e.languages.filter(c=>!r.has(c)),tempOutputScip:e.tempPaths.tempOutputScip,projectRoot:e.projectRoot,env:n,skipAutoInstall:e.skipAutoInstall,pnpmWorkspaces:e.opts.pnpmWorkspaces,onStatus:e.onStatus}),s=await ye(o,e.projectRoot,e.onStatus,e.opts.indexerConcurrency),{indexedOutputs:a}=Pr(s,i),u=[...t,...a];return Lr(u,i,e.languages,e.opts.allowPartial,e.onStatus),{indexedOutputs:u,skippedLanguages:i,reusedLanguages:[...r]}}function xr(e,n,t,r){Rr(e.paths.outputDb,t),Cr(t,e.tempPaths.tempOutputScip,e.onStatus),wr(e.tempPaths.tempOutputScip,e.tempPaths.tempOutputDb,n,e.onStatus),b({projectRoot:e.projectRoot,dbPath:e.tempPaths.tempOutputDb,onStatus:e.onStatus}),Tr(e.tempPaths.tempMetaPath,{version:3,status:r.length===0?"complete":"partial",updatedAt:new Date().toISOString(),fingerprint:e.fingerprint,languageFingerprints:Je(e.projectRoot,e.languages,{pnpmWorkspaces:e.opts.pnpmWorkspaces}),requestedLanguages:e.languages,indexedLanguages:t.map(o=>o.language),skipped:[...r]}),Dr({tempOutputScip:e.tempPaths.tempOutputScip,tempOutputDb:e.tempPaths.tempOutputDb,tempMetaPath:e.tempPaths.tempMetaPath,outputScip:e.paths.outputScip,outputDb:e.paths.outputDb,metaPath:e.paths.metaPath})}function Sr(e){let n;try{n=JSON.parse(We(e.paths.metaPath,"utf-8"))}catch{return[]}if(n.version!==3||!n.languageFingerprints)return[];let t=[],r=Je(e.projectRoot,e.languages,{pnpmWorkspaces:e.opts.pnpmWorkspaces});for(let o of e.languages){let i=He(e.paths.outputDb,o);w(i)&&y(n.languageFingerprints[o])===y(r[o])&&t.push({language:o,scipPath:i})}return t}function Rr(e,n){for(let t of n){let r=He(e,t.language);K(f(r),{recursive:!0}),t.scipPath!==r&&lr(t.scipPath,r)}}function vr(e,n){if(!O()){if(e)throw new Error(`The scip CLI is required but not found on PATH.
61
- Install from: https://github.com/sourcegraph/scip/releases`);if(n("scip CLI not found on PATH. Attempting auto-install..."),!F(n))throw new Error(`The scip CLI is required but could not be installed.
62
- Install manually from: https://github.com/sourcegraph/scip/releases`)}}function kr(e){let n=[],t=[],r=e.languages.map((o,i)=>({language:o,scipPath:e.languages.length>1?Or(e.tempOutputScip,o,i):e.tempOutputScip}));for(let{language:o,scipPath:i}of r){let s=Ir({...e,language:o,scipPath:i});"skipped"in s?t.push(s.skipped):n.push(s.prepared)}return{preparedRuns:n,skippedLanguages:t}}function Ir(e){let n=k(e.language),t=L(n),r=U(n,e.projectRoot);if(!r&&!B(n)){if(e.skipAutoInstall){let a=`${t} not found on PATH (auto-install disabled). ${n.installUrl??""}`.trim();return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}if(e.onStatus(`${t} not found. Attempting auto-install...`),!G(n,e.onStatus)){let a=`${t} could not be auto-installed. ${n.installUrl?`Install manually from ${n.installUrl}`:`Install ${t} and put it on PATH.`}`;return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}}let o=r??R(n);if(!o){let a=`${t} was not found after installation checks.`;return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}let{binary:i,args:s}=n.indexArgs({projectRoot:e.projectRoot,outputPath:e.scipPath,pnpmWorkspaces:e.pnpmWorkspaces,indexerBinary:o});return{prepared:{language:e.language,scipPath:e.scipPath,config:n,resolvedBinary:o,binary:i,args:s,env:W(n,e.env,o)}}}function Pr(e,n){let t=[];for(let r of e)r.skipped?n.push(r.skipped):t.push({language:r.language,scipPath:r.scipPath});return{indexedOutputs:t}}function Lr(e,n,t,r,o){if(e.length===0){let i=n.map(s=>` - ${s.language}: ${s.reason}`).join(`
60
+ `).get();return{version:2,tsconfig:n,files:R(t),db:r}}function Or(e){let t=ze();return{projectRoot:e.projectRoot,context:Ne(e.projectRoot,e.configPath),symbolLookup:Ae(e.db,e.projectRoot,t),vueSymbolLookup:e.vueSymbolLookup,sourceReader:t}}function Tr(e){let t=[],n=0,r=e.tasks??e.vueFiles.map(i=>({fileName:i,startOffset:0,endOffset:Number.POSITIVE_INFINITY,countFileSkip:!0}));for(let i of r){let o=Mr(e,i);t.push(...o.occurrences),n+=o.skippedReferences}return{occurrences:t,skippedReferences:n}}function Mr(e,t){let n=e.context.language.scripts.get(t.fileName),r=n?.generated?.languagePlugin.typescript?.getServiceScript(n.generated.root)?.code;if(!n||!r)return{occurrences:[],skippedReferences:t.countFileSkip?1:0};let i=e.sourceReader.get(t.fileName);if(!i)return{occurrences:[],skippedReferences:t.countFileSkip?1:0};let o=e.context.language.maps.get(r,n),s=y(e.projectRoot,t.fileName),a=[...Je(i.text)],u={tokens:a.filter(c=>c.start>=t.startOffset&&c.start<t.endOffset),tokenByStart:new Map(a.map(c=>[c.start,c])),tokenTextCounts:Er(a),processedStarts:new Set};return Dr({...e,fileName:t.fileName,sourceInfo:i,sourceFile:s,map:o,tokenContext:u})}function Dr(e){let t=[],n=0;for(let r of e.tokenContext.tokens){if(e.tokenContext.processedStarts.has(r.start))continue;let i=Ge(e.map,r.start);if(i===null)continue;let s=(e.context.languageService.getDefinitionAtPosition(e.fileName,i+1)??[]).find(u=>!qe(e.projectRoot,u.fileName));if(!s){n++;continue}let a=Be(s,e.symbolLookup,e.vueSymbolLookup,e.context,e.projectRoot);if(a===null){n++;continue}Xe(t,e.sourceReader,e.sourceInfo,e.sourceFile,r,a),e.tokenContext.processedStarts.add(r.start),Fr(t,e,r,i,a)}return{occurrences:t,skippedReferences:n}}function Fr(e,t,n,r,i){if(!((t.tokenContext.tokenTextCounts.get(n.text)??0)<=1))for(let o of Vr(t.context.languageService,t.fileName,r+1,t.map,n,t.tokenContext.tokenByStart)){if(t.tokenContext.processedStarts.has(o))continue;let s=t.tokenContext.tokenByStart.get(o);s&&(Xe(e,t.sourceReader,t.sourceInfo,t.sourceFile,s,i),t.tokenContext.processedStarts.add(o))}}function Xe(e,t,n,r,i,o){let s=t.positionAt(n,i.start);e.push({sourceFile:r,sourceLine:s.line,sourceStartChar:s.character,sourceEndChar:s.character+i.text.length,symbolId:o})}function Er(e){let t=new Map;for(let n of e)t.set(n.text,(t.get(n.text)??0)+1);return t}function Vr(e,t,n,r,i,o){let s=e.getDocumentHighlights?.(t,n,[t])??[],a=[];for(let u of s)if(u.fileName===t)for(let c of u.highlightSpans){let g=Nr(r,c.textSpan.start,o,i.text);g!==null&&a.push(g)}return a}function Nr(e,t,n,r){let i=n.get(t);if(i?.text===r)return i.start;let o=Q(e,t);if(o===null)return null;let s=n.get(o);return s?.text===r?s.start:null}async function No(e){let{projectRoot:t,maxHeapMb:n=8192,onStatus:r=console.log,skipAutoInstall:i=!1}=e,o=Jr(e),s=Date.now();te(f(o.outputScip),{recursive:!0}),te(f(o.outputDb),{recursive:!0});let a=e.languages??V(t);if(a.length===0)throw new Error("No supported languages detected in this project. Looked for: tsconfig.json, Cargo.toml, go.mod, pyproject.toml, etc.");r(`Detected languages: ${a.join(", ")}`);let u=di(t,a,{pnpmWorkspaces:e.pnpmWorkspaces,typescriptProjectMode:e.typescriptProjectMode,typescriptProjects:e.typescriptProjects}),c=await oi(m(f(o.outputDb),"index.lock"),{projectRoot:t,trigger:e.trigger,onStatus:r}),g=null;try{let l=Gr({opts:e,paths:o,languages:a,fingerprint:u,start:s,onStatus:r});if(l)return l;Qr(i,r);let p=qr(o);return g=p.runDir,await zr({opts:e,languages:a,projectRoot:t,paths:o,tempPaths:p,fingerprint:u,start:s,maxHeapMb:n,skipAutoInstall:i,onStatus:r})}catch(l){throw at(o.metaPath,re({trigger:e.trigger,result:"failed",start:s,error:l instanceof Error?l.message:String(l)})),l}finally{g&&P(g,{recursive:!0,force:!0}),c()}}function Jr(e){let t=e.outputScip??m(e.projectRoot,"index.scip"),n=e.outputDb??m(e.projectRoot,"index.db");return{outputScip:t,outputDb:n,metaPath:m(f(n),"meta.json")}}function Gr(e){if(e.opts.skipIfUnchanged===!1||!M(e.paths.outputScip)||!M(e.paths.outputDb)||!fi(e.paths.metaPath,e.fingerprint))return null;b({projectRoot:e.opts.projectRoot,dbPath:e.paths.outputDb,onStatus:e.onStatus});let t=Date.now()-e.start,n=re({trigger:e.opts.trigger,result:"reused",start:e.start,languages:e.languages,skipped:[]});return at(e.paths.metaPath,n),e.onStatus(`Index unchanged; reused existing SQLite index in ${(t/1e3).toFixed(1)}s`),{languages:e.languages,indexPath:e.paths.outputScip,dbPath:e.paths.outputDb,durationMs:t,reused:!0,skipped:[],lastRefresh:n}}function qr(e){let t=Br(m(f(e.outputDb),"reindex-"));return{runDir:t,tempOutputScip:m(t,T(e.outputScip)),tempOutputDb:m(t,T(e.outputDb)),tempMetaPath:m(t,T(e.metaPath))}}async function zr(e){let t={...process.env,NODE_OPTIONS:`--max-old-space-size=${e.maxHeapMb}`},{indexedOutputs:n,skippedLanguages:r,reusedLanguages:i}=await Hr(e,t);i.length>0&&e.onStatus(`Reused ${i.length} cached language shard(s): ${i.join(", ")}`);let o=Kr(e,t,n,r),s=o.durationMs;return e.onStatus(`Done in ${(s/1e3).toFixed(1)}s`),{languages:n.map(a=>a.language),indexPath:e.paths.outputScip,dbPath:e.paths.outputDb,durationMs:s,reused:!1,skipped:r,lastRefresh:o}}async function Hr(e,t){let n=Xr(e),r=new Set(n.map(c=>c.language));for(let c of r)e.onStatus(`Reusing cached ${c} SCIP shard (language inputs unchanged).`);let{preparedRuns:i,skippedLanguages:o}=Zr({languages:e.languages.filter(c=>!r.has(c)),tempOutputScip:e.tempPaths.tempOutputScip,projectRoot:e.projectRoot,env:t,skipAutoInstall:e.skipAutoInstall,pnpmWorkspaces:e.opts.pnpmWorkspaces,typescriptProjectMode:e.opts.typescriptProjectMode,typescriptProjects:e.opts.typescriptProjects,onStatus:e.onStatus}),s=await Le(i,e.projectRoot,e.onStatus,e.opts.indexerConcurrency),{indexedOutputs:a}=ti(s,o),u=[...n,...a];return ni(u,o,e.languages,e.opts.allowPartial,e.onStatus),{indexedOutputs:u,skippedLanguages:o,reusedLanguages:[...r]}}function Kr(e,t,n,r){Yr(e.paths.outputDb,n),ri(n,e.tempPaths.tempOutputScip,e.onStatus),ii(e.tempPaths.tempOutputScip,e.tempPaths.tempOutputDb,t,e.onStatus),b({projectRoot:e.projectRoot,dbPath:e.tempPaths.tempOutputDb,onStatus:e.onStatus});let i=re({trigger:e.opts.trigger,result:"rebuilt",start:e.start,languages:n.map(o=>o.language),skipped:[...r]});return st(e.tempPaths.tempMetaPath,{version:3,status:r.length===0?"complete":"partial",updatedAt:new Date().toISOString(),fingerprint:e.fingerprint,languageFingerprints:nt(e.projectRoot,e.languages,{pnpmWorkspaces:e.opts.pnpmWorkspaces,typescriptProjectMode:e.opts.typescriptProjectMode,typescriptProjects:e.opts.typescriptProjects}),requestedLanguages:e.languages,indexedLanguages:n.map(o=>o.language),skipped:[...r],lastRefresh:i}),pi({tempOutputScip:e.tempPaths.tempOutputScip,tempOutputDb:e.tempPaths.tempOutputDb,tempMetaPath:e.tempPaths.tempMetaPath,outputScip:e.paths.outputScip,outputDb:e.paths.outputDb,metaPath:e.paths.metaPath}),i}function Xr(e){let t;try{t=JSON.parse(D(e.paths.metaPath,"utf-8"))}catch{return[]}if(t.version!==3||!t.languageFingerprints)return[];let n=[],r=nt(e.projectRoot,e.languages,{pnpmWorkspaces:e.opts.pnpmWorkspaces,typescriptProjectMode:e.opts.typescriptProjectMode,typescriptProjects:e.opts.typescriptProjects});for(let i of e.languages){let o=ot(e.paths.outputDb,i);M(o)&&S(t.languageFingerprints[i])===S(r[i])&&n.push({language:i,scipPath:o})}return n}function Yr(e,t){for(let n of t){let r=ot(e,n.language);te(f(r),{recursive:!0}),n.scipPath!==r&&_r(n.scipPath,r)}}function Qr(e,t){if(!F()){if(e)throw new Error(`The scip CLI is required but not found on PATH.
61
+ Install from: https://github.com/sourcegraph/scip/releases`);if(t("scip CLI not found on PATH. Attempting auto-install..."),!E(t))throw new Error(`The scip CLI is required but could not be installed.
62
+ Install manually from: https://github.com/sourcegraph/scip/releases`)}}function Zr(e){let t=[],n=[],r=e.languages.map((i,o)=>({language:i,scipPath:e.languages.length>1?tt(e.tempOutputScip,i,o):e.tempOutputScip}));for(let{language:i,scipPath:o}of r){let s=ei({...e,language:i,scipPath:o});for(let a of s)"skipped"in a?et(n,a.skipped):t.push(a.prepared)}return{preparedRuns:t,skippedLanguages:n}}function ei(e){if(e.language!=="typescript"||e.typescriptProjectMode!=="workspace")return[Z({...e,id:e.language,label:e.language,outputScipPath:e.scipPath})];let t=ve(e.projectRoot,e.typescriptProjects);return t.length===0?[Z({...e,id:e.language,label:e.language,outputScipPath:e.scipPath})]:(e.onStatus(`Indexing TypeScript workspace as ${t.length} project shard(s).`),t.map((n,r)=>Z({...e,id:`typescript:${n}`,label:`typescript (${n})`,scipPath:tt(e.tempOutputScip,"typescript-project",r),outputScipPath:e.scipPath,pnpmWorkspaces:!1,projectPath:n})))}function Z(e){let t=L(e.language),n=O(t),r=q(t,e.projectRoot);if(!r&&!G(t)){if(e.skipAutoInstall){let a=`${n} not found on PATH (auto-install disabled). ${t.installUrl??""}`.trim();return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}if(e.onStatus(`${n} not found. Attempting auto-install...`),!H(t,e.onStatus)){let a=`${n} could not be auto-installed. ${t.installUrl?`Install manually from ${t.installUrl}`:`Install ${n} and put it on PATH.`}`;return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}}let i=r??v(t);if(!i){let a=`${n} was not found after installation checks.`;return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}let{binary:o,args:s}=t.indexArgs({projectRoot:e.projectRoot,outputPath:e.scipPath,pnpmWorkspaces:e.pnpmWorkspaces,indexerBinary:i,projectPath:e.projectPath});return{prepared:{id:e.id,language:e.language,label:e.label,scipPath:e.scipPath,outputScipPath:e.outputScipPath,config:t,resolvedBinary:i,binary:o,args:s,env:z(t,e.env,i)}}}function ti(e,t){let n=new Map;for(let i of e)if(i.skipped)et(t,i.skipped);else{let o=`${i.language}\0${i.outputScipPath}`,s=n.get(o)??{language:i.language,outputScipPath:i.outputScipPath,scipPaths:[]};s.scipPaths.push(i.scipPath),n.set(o,s)}let r=[];for(let i of n.values())if(i.scipPaths.length>1)j(i.scipPaths,i.outputScipPath),r.push({language:i.language,scipPath:i.outputScipPath});else{let o=i.scipPaths[0];o!==i.outputScipPath&&k(o,i.outputScipPath),r.push({language:i.language,scipPath:i.outputScipPath})}return{indexedOutputs:r}}function et(e,t){let n=e.find(r=>r.language===t.language);if(!n){e.push(t);return}n.reason.includes(t.reason)||(n.reason=`${n.reason}; ${t.reason}`)}function ni(e,t,n,r,i){if(e.length===0){let o=t.map(s=>` - ${s.language}: ${s.reason}`).join(`
63
63
  `);throw new Error(`No language indexers ran successfully. Install at least one indexer for the languages in this project.
64
- `+i)}if(n.length!==0&&(o(`Indexed ${e.length} of ${t.length} languages; skipped ${n.map(i=>i.language).join(", ")}.`),!r))throw new Error(`Failed to index all required languages; preserving the previous index. Pass --allow-partial to intentionally write an incomplete index.
65
- `+n.map(i=>` - ${i.language}: ${i.reason}`).join(`
66
- `))}function Cr(e,n,t){e.length>1?(t(`Merging ${e.length} language indexes...`),T(e.map(r=>r.scipPath),n)):e[0].scipPath!==n&&Y(e[0].scipPath,n)}function wr(e,n,t,r){if(r("Converting to SQLite..."),!w(e))throw new Error(`SCIP index not found at ${e} after indexing`);try{let o=he(e);o.removedDefinitionOccurrences>0&&r(`Sanitized ${o.removedDefinitionOccurrences} invalid definition occurrences across ${o.touchedDocuments} documents before SQLite conversion.`);let i=O();if(!i)throw new Error("scip CLI is not available");ur(i,["expt-convert","--output",n,e],{env:t,stdio:"pipe",maxBuffer:50*1024*1024})}catch(o){let i=o instanceof Error?o.message:String(o);throw new Error(`Failed to convert SCIP index to SQLite: ${i}`,{cause:o})}}function Or(e,n,t){let r=dr(e)||".scip",o=C(e,r);return d(f(e),`${o}.${t+1}.${n}${r}`)}function Fr(e){let n;try{n=pr(e,"wx")}catch(t){throw(typeof t=="object"&&t&&"code"in t?t.code:void 0)==="EEXIST"?new Error(`Another scip-query reindex is already running for ${f(e)}.`,{cause:t}):t}return Ge(n,JSON.stringify({pid:process.pid,startedAt:new Date().toISOString()})+`
67
- `),()=>{try{cr(n)}finally{Q(e,{force:!0})}}}function Dr(e){X(e.tempOutputScip,e.outputScip),X(e.tempOutputDb,e.outputDb),X(e.tempMetaPath,e.metaPath)}function X(e,n){Q(`${n}.tmp-replace`,{force:!0}),Y(e,`${n}.tmp-replace`),Y(`${n}.tmp-replace`,n)}function Er(e,n,t){return{version:1,languages:[...n].sort(),pnpmWorkspaces:t.pnpmWorkspaces===!0,files:S(e)}}function Je(e,n,t){return Object.fromEntries(n.map(r=>{let o=k(r).markerFiles;return[r,{version:1,languages:[r],pnpmWorkspaces:r==="typescript"&&t.pnpmWorkspaces===!0,files:S(e,{language:r,markerFiles:o})}]}))}function He(e,n){return d(f(e),"language-indexes",`${n}.scip`)}function Vr(e,n){try{let t=JSON.parse(We(e,"utf-8"));return(t.version===2||t.version===3)&&t.status==="complete"&&y(t.fingerprint)===y(n)&&y([...t.indexedLanguages??[]].sort())===y(n.languages)}catch{return!1}}function Tr(e,n){Ge(e,`${JSON.stringify(n,null,2)}
68
- `)}function y(e){return JSON.stringify(e)}export{ce as INDEXER_CONFIGS,b as augmentAuxiliaryDocuments,qt as augmentVueResolvedReferences,L as describeIndexerBinary,D as detectLanguages,k as getIndexerConfig,W as getIndexerExecutionEnv,x as isBinaryAvailable,B as isIndexerInstalled,T as mergeScipFiles,le as mergeScipIndexes,Zo as reindex,R as resolveIndexerBinary,U as resolveProjectLocalIndexerBinary,G as tryInstallIndexer,F as tryInstallScipCli};
64
+ `+o)}if(t.length!==0&&(i(`Indexed ${e.length} language output(s); skipped or incomplete: ${t.map(o=>o.language).join(", ")}.`),!r))throw new Error(`Failed to index all required languages; preserving the previous index. Pass --allow-partial to intentionally write an incomplete index.
65
+ `+t.map(o=>` - ${o.language}: ${o.reason}`).join(`
66
+ `))}function ri(e,t,n){e.length>1?(n(`Merging ${e.length} language indexes...`),j(e.map(r=>r.scipPath),t)):e[0].scipPath!==t&&k(e[0].scipPath,t)}function ii(e,t,n,r){if(r("Converting to SQLite..."),!M(e))throw new Error(`SCIP index not found at ${e} after indexing`);try{let i=Re(e);i.removedDefinitionOccurrences>0&&r(`Sanitized ${i.removedDefinitionOccurrences} invalid definition occurrences across ${i.touchedDocuments} documents before SQLite conversion.`);let o=F();if(!o)throw new Error("scip CLI is not available");Ar(o,["expt-convert","--output",t,e],{env:n,stdio:"pipe",maxBuffer:50*1024*1024})}catch(i){let o=i instanceof Error?i.message:String(i);throw new Error(`Failed to convert SCIP index to SQLite: ${o}`,{cause:i})}}function tt(e,t,n){let r=Ur(e)||".scip",i=T(e,r);return m(f(e),`${i}.${n+1}.${t}${r}`)}async function oi(e,t){for(let n=0;n<2;n++){let r=si(e,t);if(r)return r;let i=ai(e);if(i&&ui(t.trigger,i)){t.onStatus(`Manual reindex preempting watcher refresh started at ${i.startedAt}.`),await li(i.pid),P(e,{force:!0});continue}if(i&&!ne(i.pid)){P(e,{force:!0});continue}throw new Error(`Another scip-query reindex is already running for ${f(e)}.`)}throw new Error(`Could not acquire scip-query reindex lock for ${f(e)}.`)}function si(e,t){let n;try{n=Wr(e,"wx")}catch(i){if((typeof i=="object"&&i&&"code"in i?i.code:void 0)==="EEXIST")return null;throw i}let r={version:1,pid:process.pid,projectRoot:t.projectRoot,startedAt:new Date().toISOString(),trigger:t.trigger};return Ze(n,JSON.stringify(r)+`
67
+ `),()=>{try{$r(n)}finally{P(e,{force:!0})}}}function ai(e){try{let t=JSON.parse(D(e,"utf-8"));return typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0?null:{version:1,pid:t.pid,projectRoot:typeof t.projectRoot=="string"?t.projectRoot:f(e),startedAt:typeof t.startedAt=="string"?t.startedAt:"unknown",trigger:t.trigger}}catch{return null}}function ui(e,t){return e?.kind==="manual-cli"&&ci(t?.trigger)}function ci(e){return e?.kind==="watch-source"||e?.kind==="watch-git-head"||e?.kind==="watch-git-index"||e?.kind==="watch-git-state"}async function li(e){Ye(e,"SIGTERM"),!await Qe(e,2e3)&&(Ye(e,"SIGKILL"),await Qe(e,1e3))}function Ye(e,t){try{process.kill(-e,t)}catch{try{process.kill(e,t)}catch{}}}async function Qe(e,t){let n=Date.now()+t;for(;Date.now()<n;){if(!ne(e))return!0;await gi(50)}return!ne(e)}function ne(e){try{return process.kill(e,0),!0}catch{return!1}}function gi(e){return new Promise(t=>setTimeout(t,e))}function pi(e){ee(e.tempOutputScip,e.outputScip),ee(e.tempOutputDb,e.outputDb),ee(e.tempMetaPath,e.metaPath)}function ee(e,t){P(`${t}.tmp-replace`,{force:!0}),k(e,`${t}.tmp-replace`),k(`${t}.tmp-replace`,t)}function di(e,t,n){return{version:2,languages:[...t].sort(),pnpmWorkspaces:it(n),typescriptProjectMode:n.typescriptProjectMode??"single",typescriptProjects:rt(n.typescriptProjects),files:R(e)}}function nt(e,t,n){return Object.fromEntries(t.map(r=>{let i=L(r).markerFiles,o=r==="typescript"?{typescriptProjectMode:n.typescriptProjectMode??"single",typescriptProjects:rt(n.typescriptProjects)}:{typescriptProjectMode:"single",typescriptProjects:[]};return[r,{version:2,languages:[r],pnpmWorkspaces:r==="typescript"&&it(n),...o,files:R(e,{language:r,markerFiles:i})}]}))}function rt(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))].sort((t,n)=>t.localeCompare(n))}function it(e){return e.typescriptProjectMode!=="workspace"&&e.pnpmWorkspaces===!0}function ot(e,t){return m(f(e),"language-indexes",`${t}.scip`)}function fi(e,t){try{let n=JSON.parse(D(e,"utf-8"));return(n.version===2||n.version===3)&&n.status==="complete"&&S(n.fingerprint)===S(t)&&S([...n.indexedLanguages??[]].sort())===S(t.languages)}catch{return!1}}function st(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;Ze(n,`${JSON.stringify(t,null,2)}
68
+ `),k(n,e)}function at(e,t){try{let n=JSON.parse(D(e,"utf-8"));if(n.version!==2&&n.version!==3)return;st(e,{...n,lastRefresh:t})}catch{}}function re(e){return{trigger:e.trigger??{kind:"unknown"},result:e.result,startedAt:new Date(e.start).toISOString(),completedAt:new Date().toISOString(),durationMs:Date.now()-e.start,indexedLanguages:e.languages?[...e.languages]:void 0,skipped:e.skipped?[...e.skipped]:void 0,error:e.error}}function S(e){return JSON.stringify(e)}export{fe as INDEXER_CONFIGS,b as augmentAuxiliaryDocuments,Pr as augmentVueResolvedReferences,O as describeIndexerBinary,V as detectLanguages,L as getIndexerConfig,z as getIndexerExecutionEnv,x as isBinaryAvailable,G as isIndexerInstalled,j as mergeScipFiles,me as mergeScipIndexes,No as reindex,v as resolveIndexerBinary,q as resolveProjectLocalIndexerBinary,H as tryInstallIndexer,E as tryInstallScipCli};
69
69
  //# sourceMappingURL=reindex.js.map
package/dist/runtime.d.ts CHANGED
@@ -1,20 +1,6 @@
1
- import { P as ProjectConfig, a as SupportedLanguage } from './config-types-Bj4sh28g.js';
2
- export { g as getScipVersion, i as isScipInstalled, p as printScipInstallInstructions } from './scip-cli-Bh1M_JPu.js';
3
-
4
- type WatcherStatus = {
5
- state: 'idle';
6
- } | {
7
- state: 'waiting';
8
- changedFiles: number;
9
- reindexAt: number;
10
- } | {
11
- state: 'indexing';
12
- startedAt: number;
13
- } | {
14
- state: 'cooldown';
15
- until: number;
16
- dirty: boolean;
17
- };
1
+ import { P as ProjectConfig, a as SupportedLanguage } from './config-types-BDIWAYzr.js';
2
+ import { W as WatcherStatus } from './scip-cli-CnK9Va4O.js';
3
+ export { g as getScipVersion, i as isScipInstalled, p as printScipInstallInstructions } from './scip-cli-CnK9Va4O.js';
18
4
 
19
5
  /**
20
6
  * Load project config from .scipquery.json in the project root.
@@ -52,14 +38,17 @@ interface WatcherOptions {
52
38
  * - Single-flight: only one reindex runs at a time, never queued
53
39
  * - Dirty flag: changes during reindex schedule ONE follow-up
54
40
  * - Cooldown: minimum interval between reindex completions
55
- * - Atomic swap: writes to index.db.tmp, renames on success
41
+ * - Atomic publish: the reindexer writes temp artifacts, then promotes them
56
42
  */
57
43
  declare class Watcher {
58
44
  private projectRoot;
45
+ private config;
59
46
  private watchConfig;
60
- private indexPaths;
61
47
  private languages?;
62
48
  private pnpmWorkspaces;
49
+ private typescriptProjectMode?;
50
+ private typescriptProjects?;
51
+ private indexerConcurrency?;
63
52
  private onStatus;
64
53
  private onReindexComplete;
65
54
  private onError;
@@ -68,9 +57,12 @@ declare class Watcher {
68
57
  private cooldownTimer;
69
58
  private dirty;
70
59
  private changedFiles;
60
+ private pendingTrigger;
71
61
  private reindexInFlight;
72
62
  private lastReindexEnd;
73
63
  private fsWatchers;
64
+ private gitPollTimer;
65
+ private lastGitState;
74
66
  private gitignoreFilter;
75
67
  private extraIgnore;
76
68
  private stopped;
@@ -80,15 +72,20 @@ declare class Watcher {
80
72
  /** Stop watching and clean up */
81
73
  stop(): void;
82
74
  private handleFileChange;
75
+ private scheduleReindex;
83
76
  private triggerReindex;
84
77
  /**
85
78
  * Run the reindex in a forked child process.
86
- * Writes to index.db.tmp, then atomically renames to index.db.
79
+ * The child process uses the reindexer's own atomic publish path.
87
80
  */
88
81
  private runReindex;
89
82
  private setStatus;
90
83
  private clearDebounceTimer;
91
84
  private clearCooldownTimer;
85
+ private startGitStatePolling;
86
+ private pollGitState;
87
+ private readGitState;
88
+ private clearGitPollTimer;
92
89
  }
93
90
 
94
91
  interface InstallSkillsResult {
package/dist/runtime.js CHANGED
@@ -1,3 +1,3 @@
1
- import{c as $,d as T,e as E}from"./chunk-ONPCQ2PM.js";import{a as v}from"./chunk-UUBMFL3F.js";import{readFileSync as D,writeFileSync as A,existsSync as b,mkdirSync as _}from"fs";import{join as c,resolve as C}from"path";import{createHash as W}from"crypto";import{homedir as F}from"os";var h=".scipquery.json",M={enabled:!1,debounceMs:3e4,cooldownMs:6e4,ignore:[]};function L(i){let e=c(i,h);if(!b(e))return{};try{let t=D(e,"utf-8");return JSON.parse(t)}catch(t){let s=t instanceof Error?t.message:String(t);throw t instanceof SyntaxError?new Error(`invalid ${h} at ${e}: ${s}`,{cause:t}):new Error(`unable to read ${h} at ${e}: ${s}`,{cause:t})}}function P(i){return{...M,...i.watch}}function N(i,e){let t=process.env.SCIP_QUERY_CACHE_DIR;if(t)return f(t);if(e?.dbPath)return f(C(i,e.dbPath));let n=process.env.XDG_CACHE_HOME||c(F(),".cache"),r=W("sha256").update(C(i)).digest("hex").slice(0,12),o=c(n,"scip-query","projects",r);return f(o)}function m(i,e){let t=N(i,e);return{cacheDir:t,dbPath:c(t,"index.db"),indexPath:c(t,"index.scip"),metaPath:c(t,"meta.json")}}function O(i,e){let t=c(i,h);return b(t)||A(t,JSON.stringify({languages:e,watch:{enabled:!1,debounceMs:3e4,cooldownMs:6e4}},null,2)+`
2
- `),t}function f(i){return _(i,{recursive:!0}),i}import{watch as U}from"fs";import{existsSync as R,renameSync as k}from"fs";import{join as q,relative as H}from"path";import{fork as B}from"child_process";import G from"ignore";var y=class{projectRoot;watchConfig;indexPaths;languages;pnpmWorkspaces;onStatus;onReindexComplete;onError;status={state:"idle"};debounceTimer=null;cooldownTimer=null;dirty=!1;changedFiles=0;reindexInFlight=!1;lastReindexEnd=0;fsWatchers=[];gitignoreFilter;extraIgnore;stopped=!1;constructor(e){this.projectRoot=e.projectRoot,this.watchConfig=P(e.config),this.indexPaths=m(e.projectRoot,e.config),this.languages=e.languages,this.pnpmWorkspaces=e.config.indexer?.typescript?.pnpmWorkspaces??!1,this.onStatus=e.onStatus??(()=>{}),this.onReindexComplete=e.onReindexComplete??(()=>{}),this.onError=e.onError??(t=>console.error(t.message)),this.gitignoreFilter=v(e.projectRoot),this.extraIgnore=G(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"});try{let e=U(this.projectRoot,{recursive:!0},(t,s)=>{s&&!this.stopped&&this.handleFileChange(s)});this.fsWatchers.push(e)}catch{this.onError(new Error("Failed to start file watcher. On Linux, you may need to increase inotify limits: sysctl -w fs.inotify.max_user_watches=524288"))}}stop(){this.stopped=!0;for(let e of this.fsWatchers)e.close();this.fsWatchers=[],this.clearDebounceTimer(),this.clearCooldownTimer(),this.setStatus({state:"idle"})}handleFileChange(e){let t=H(this.projectRoot,q(this.projectRoot,e));if(this.gitignoreFilter.isIgnored(t)||this.extraIgnore.ignores(t)||e.endsWith("index.db")||e.endsWith("index.scip")||e.endsWith("index.db.tmp")||e.endsWith(".scipquery.json"))return;if(this.changedFiles++,this.reindexInFlight){this.dirty=!0,this.setStatus({state:"indexing",startedAt:this.status.startedAt});return}if(this.status.state==="cooldown"){this.dirty=!0,this.setStatus({state:"cooldown",until:this.status.until,dirty:!0});return}this.clearDebounceTimer();let s=Date.now()+this.watchConfig.debounceMs;this.setStatus({state:"waiting",changedFiles:this.changedFiles,reindexAt:s}),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.triggerReindex()},this.watchConfig.debounceMs)}triggerReindex(){if(this.reindexInFlight||this.stopped)return;let e=Date.now()-this.lastReindexEnd;if(this.lastReindexEnd>0&&e<this.watchConfig.cooldownMs){let s=this.watchConfig.cooldownMs-e;this.dirty=!0;let n=Date.now()+s;this.setStatus({state:"cooldown",until:n,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped&&(this.dirty=!1,this.triggerReindex())},s);return}this.reindexInFlight=!0,this.dirty=!1,this.changedFiles=0;let t=Date.now();this.setStatus({state:"indexing",startedAt:t}),this.runReindex().then(s=>{if(this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onReindexComplete(s),this.dirty&&!this.stopped){let n=Date.now()+this.watchConfig.cooldownMs;this.setStatus({state:"cooldown",until:n,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped?(this.dirty=!1,this.triggerReindex()):this.setStatus({state:"idle"})},this.watchConfig.cooldownMs)}else this.setStatus({state:"idle"})}).catch(s=>{this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onError(s instanceof Error?s:new Error(String(s))),this.setStatus({state:"idle"})})}runReindex(){return new Promise((e,t)=>{let s=Date.now(),n=this.indexPaths.dbPath+".tmp",r=X(this.indexPaths.indexPath),o=B(new URL("./reindex-worker.js",import.meta.url).pathname,[],{env:{...process.env,SCIP_REINDEX_PROJECT_ROOT:this.projectRoot,SCIP_REINDEX_OUTPUT_SCIP:r,SCIP_REINDEX_OUTPUT_DB:n,SCIP_REINDEX_LANGUAGES:this.languages?.join(",")??"",SCIP_REINDEX_PNPM_WORKSPACES:this.pnpmWorkspaces?"1":""},stdio:"pipe"});o.on("exit",d=>{if(d===0)try{R(n)&&k(n,this.indexPaths.dbPath),R(r)&&k(r,this.indexPaths.indexPath),e(Date.now()-s)}catch(a){t(new Error(`Atomic swap failed: ${a}`))}else t(new Error(`Reindex worker exited with code ${d}`))}),o.on("error",t)})}setStatus(e){this.status=e,this.onStatus(e)}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}clearCooldownTimer(){this.cooldownTimer&&(clearTimeout(this.cooldownTimer),this.cooldownTimer=null)}};function X(i){return i.endsWith(".scip")?i.slice(0,-5)+".tmp.scip":i+".tmp.scip"}import{existsSync as x,mkdirSync as J,symlinkSync as V,readlinkSync as K,unlinkSync as Q}from"fs";import{join as p,dirname as I,resolve as S}from"path";import{homedir as w,platform as Y}from"os";import{fileURLToPath as z}from"url";var Z=Y()==="win32",ee=["scip-query","scip-query-setup","scip-adoption","scip-health-audit","scip-health-improve","scip-api-impact","concrete-plan","scip-ai-cleanup","scip-debug","scip-explore","scip-triage-issue","scip-diagram","scip-debloat","scip-doc-reconcile","scip-directory-architecture","scip-maintainability","scip-react-maintainability","scip-vue-maintainability","scip-verify","scip-language-playbook"];function te(i={}){let e=i.quiet?()=>{}:console.log,t=z(import.meta.url),s=S(I(t),"..","skills"),n=[p(w(),".claude","skills"),p(w(),".codex","skills"),p(w(),".agents","skills")],r={installed:[],skipped:[],alreadyLinked:[]};for(let o of n){let d=I(o);if(!x(d))continue;J(o,{recursive:!0});let a=ie(o);for(let l of ee){let g=p(s,l),u=p(o,l);if(!x(g)){r.skipped.push(`${a}/${l}`);continue}if(x(u)){try{let j=K(u);if(S(j)===S(g)){r.alreadyLinked.push(`${a}/${l}`),e(` ok: ${l} \u2192 ${a} (already linked)`);continue}}catch{r.skipped.push(`${a}/${l}`),e(` skip: ${l} \u2192 ${a} (exists, not a symlink)`);continue}Q(u)}V(g,u,Z?"junction":"dir"),r.installed.push(`${a}/${l}`),e(` done: ${l} \u2192 ${a}`)}}return r}function ie(i){return i.includes(".codex")?"Codex":i.includes(".agents")?"Agents":"Claude"}export{y as Watcher,T as getScipVersion,O as initProjectConfig,te as installSkills,$ as isScipInstalled,L as loadProjectConfig,E as printScipInstallInstructions,m as resolveIndexPaths};
1
+ import{c as I,d as M,e as E}from"./chunk-ONPCQ2PM.js";import{a as C}from"./chunk-UUBMFL3F.js";import{readFileSync as $,writeFileSync as D,existsSync as R,mkdirSync as _}from"fs";import{isAbsolute as oe,join as c,relative as ae,resolve as P}from"path";import{createHash as A}from"crypto";import{homedir as N}from"os";var g=".scipquery.json",W={enabled:!1,debounceMs:3e4,cooldownMs:6e4,gitPollMs:2e3,autoRefresh:!0,ignore:[]};function m(i){let e=c(i,g);if(!R(e))return{};try{let t=$(e,"utf-8");return JSON.parse(t)}catch(t){let r=t instanceof Error?t.message:String(t);throw t instanceof SyntaxError?new Error(`invalid ${g} at ${e}: ${r}`,{cause:t}):new Error(`unable to read ${g} at ${e}: ${r}`,{cause:t})}}function j(i){return{...W,...i.watch}}function G(i,e){let t=process.env.SCIP_QUERY_CACHE_DIR;if(t)return f(t);if(e?.dbPath)return f(P(i,e.dbPath));let s=process.env.XDG_CACHE_HOME||c(N(),".cache"),n=A("sha256").update(P(i)).digest("hex").slice(0,12),a=c(s,"scip-query","projects",n);return f(a)}function y(i,e){let t=G(i,e);return{cacheDir:t,dbPath:c(t,"index.db"),indexPath:c(t,"index.scip"),metaPath:c(t,"meta.json")}}function F(i,e){let t=c(i,g);return R(t)||D(t,JSON.stringify({languages:e,watch:{enabled:!1,debounceMs:3e4,cooldownMs:6e4,gitPollMs:2e3,autoRefresh:!0}},null,2)+`
2
+ `),t}function f(i){return _(i,{recursive:!0}),i}import{execFileSync as O,fork as L}from"child_process";import{statSync as U,watch as H}from"fs";import{join as q,relative as X}from"path";import B from"ignore";var x=class{projectRoot;config;watchConfig;languages;pnpmWorkspaces;typescriptProjectMode;typescriptProjects;indexerConcurrency;onStatus;onReindexComplete;onError;status={state:"idle"};debounceTimer=null;cooldownTimer=null;dirty=!1;changedFiles=0;pendingTrigger=null;reindexInFlight=!1;lastReindexEnd=0;fsWatchers=[];gitPollTimer=null;lastGitState=null;gitignoreFilter;extraIgnore;stopped=!1;constructor(e){this.projectRoot=e.projectRoot,this.config=e.config,this.watchConfig=j(e.config),this.languages=e.languages,this.pnpmWorkspaces=e.config.indexer?.typescript?.pnpmWorkspaces??!1,this.typescriptProjectMode=e.config.indexer?.typescript?.projectMode,this.typescriptProjects=e.config.indexer?.typescript?.projects,this.indexerConcurrency=e.config.indexerConcurrency,this.onStatus=e.onStatus??(()=>{}),this.onReindexComplete=e.onReindexComplete??(()=>{}),this.onError=e.onError??(t=>console.error(t.message)),this.gitignoreFilter=C(e.projectRoot),this.extraIgnore=B(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"}),this.startGitStatePolling();try{let e=H(this.projectRoot,{recursive:!0},(t,r)=>{r&&!this.stopped&&this.handleFileChange(r)});this.fsWatchers.push(e)}catch{this.onError(new Error("Failed to start file watcher. On Linux, you may need to increase inotify limits: sysctl -w fs.inotify.max_user_watches=524288"))}}stop(){this.stopped=!0;for(let e of this.fsWatchers)e.close();this.fsWatchers=[],this.clearDebounceTimer(),this.clearCooldownTimer(),this.clearGitPollTimer(),this.setStatus({state:"idle"})}handleFileChange(e){let t=X(this.projectRoot,q(this.projectRoot,e));t===".git"||t.startsWith(".git/")||this.gitignoreFilter.isIgnored(t)||this.extraIgnore.ignores(t)||e.endsWith("index.db")||e.endsWith("index.scip")||e.endsWith("index.db.tmp")||this.scheduleReindex({kind:"watch-source",detail:t})}scheduleReindex(e){if(this.pendingTrigger=z(this.pendingTrigger,e),this.changedFiles++,this.reindexInFlight){this.dirty=!0,this.setStatus({state:"indexing",startedAt:this.status.startedAt});return}if(this.status.state==="cooldown"){this.dirty=!0,this.setStatus({state:"cooldown",until:this.status.until,dirty:!0});return}this.clearDebounceTimer();let t=Date.now()+this.watchConfig.debounceMs;this.setStatus({state:"waiting",changedFiles:this.changedFiles,reindexAt:t}),this.debounceTimer=setTimeout(()=>{this.debounceTimer=null,this.triggerReindex()},this.watchConfig.debounceMs)}triggerReindex(){if(this.reindexInFlight||this.stopped)return;let e=Date.now()-this.lastReindexEnd;if(this.lastReindexEnd>0&&e<this.watchConfig.cooldownMs){let s=this.watchConfig.cooldownMs-e;this.dirty=!0;let n=Date.now()+s;this.setStatus({state:"cooldown",until:n,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped&&(this.dirty=!1,this.triggerReindex())},s);return}this.reindexInFlight=!0,this.dirty=!1,this.changedFiles=0;let t=this.pendingTrigger??{kind:"watch-source"};this.pendingTrigger=null;let r=Date.now();this.setStatus({state:"indexing",startedAt:r}),this.runReindex(t).then(s=>{if(this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onReindexComplete(s),this.dirty&&!this.stopped){let n=Date.now()+this.watchConfig.cooldownMs;this.setStatus({state:"cooldown",until:n,dirty:!0}),this.cooldownTimer=setTimeout(()=>{this.cooldownTimer=null,this.dirty&&!this.stopped?(this.dirty=!1,this.triggerReindex()):this.setStatus({state:"idle"})},this.watchConfig.cooldownMs)}else this.setStatus({state:"idle"})}).catch(s=>{this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onError(s instanceof Error?s:new Error(String(s))),this.setStatus({state:"idle"})})}runReindex(e){return new Promise((t,r)=>{let s=Date.now(),n=m(this.projectRoot),a=Object.keys(n).length>0?n:this.config,h=y(this.projectRoot,a),l=a.indexer?.typescript,o=L(new URL("./reindex-worker.js",import.meta.url).pathname,[],{detached:!0,env:{...process.env,SCIP_REINDEX_PROJECT_ROOT:this.projectRoot,SCIP_REINDEX_OUTPUT_SCIP:h.indexPath,SCIP_REINDEX_OUTPUT_DB:h.dbPath,SCIP_REINDEX_LANGUAGES:(a.languages??this.languages)?.join(",")??"",SCIP_REINDEX_INDEXER_CONCURRENCY:String(a.indexerConcurrency??this.indexerConcurrency??""),SCIP_REINDEX_PNPM_WORKSPACES:l?.pnpmWorkspaces??this.pnpmWorkspaces?"1":"",SCIP_REINDEX_TYPESCRIPT_CONFIG:JSON.stringify({projectMode:l?.projectMode??this.typescriptProjectMode,projects:l?.projects??this.typescriptProjects??[]}),SCIP_REINDEX_TRIGGER_KIND:e.kind,SCIP_REINDEX_TRIGGER_DETAIL:e.detail??""},stdio:"pipe"});o.on("exit",p=>{p===0?t(Date.now()-s):r(new Error(`Reindex worker exited with code ${p}`))}),o.on("error",r)})}setStatus(e){this.status=e,this.onStatus(e)}clearDebounceTimer(){this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null)}clearCooldownTimer(){this.cooldownTimer&&(clearTimeout(this.cooldownTimer),this.cooldownTimer=null)}startGitStatePolling(){this.lastGitState=this.readGitState(),this.lastGitState&&(this.gitPollTimer=setInterval(()=>this.pollGitState(),this.watchConfig.gitPollMs),this.gitPollTimer.unref?.())}pollGitState(){let e=this.lastGitState,t=this.readGitState();if(!e||!t||this.stopped){this.lastGitState=t;return}this.lastGitState=t;let r=e.head!==t.head,s=e.indexPath!==t.indexPath||e.indexMtimeMs!==t.indexMtimeMs||e.indexSize!==t.indexSize;r&&s?this.scheduleReindex({kind:"watch-git-state",detail:"HEAD and index changed"}):r?this.scheduleReindex({kind:"watch-git-head",detail:"HEAD changed"}):s&&this.scheduleReindex({kind:"watch-git-index",detail:t.indexPath??"index changed"})}readGitState(){let e=T(this.projectRoot,["rev-parse","--git-path","index"]);if(!e)return null;let t={head:T(this.projectRoot,["rev-parse","--verify","HEAD"]),indexPath:e};try{let r=U(e);t.indexMtimeMs=r.mtimeMs,t.indexSize=r.size}catch{t.indexMtimeMs=void 0,t.indexSize=void 0}return t}clearGitPollTimer(){this.gitPollTimer&&(clearInterval(this.gitPollTimer),this.gitPollTimer=null)}};function T(i,e){try{return O("git",["-C",i,...e],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function z(i,e){return i?i.kind===e.kind?i.detail===e.detail?i:{kind:i.kind,detail:"multiple changes"}:{kind:"watch-git-state",detail:`${i.kind}, ${e.kind}`}:e}import{existsSync as S,mkdirSync as J,symlinkSync as K,readlinkSync as V,unlinkSync as Y}from"fs";import{join as d,dirname as k,resolve as v}from"path";import{homedir as w,platform as Q}from"os";import{fileURLToPath as Z}from"url";var ee=Q()==="win32",te=["scip-query","scip-query-setup","scip-adoption","scip-health-audit","scip-health-improve","scip-api-impact","concrete-plan","scip-ai-cleanup","scip-debug","scip-explore","scip-triage-issue","scip-diagram","scip-debloat","scip-doc-reconcile","scip-directory-architecture","scip-maintainability","scip-react-maintainability","scip-vue-maintainability","scip-verify","scip-language-playbook"];function ie(i={}){let e=i.quiet?()=>{}:console.log,t=Z(import.meta.url),r=v(k(t),"..","skills"),s=[d(w(),".claude","skills"),d(w(),".codex","skills"),d(w(),".agents","skills")],n={installed:[],skipped:[],alreadyLinked:[]};for(let a of s){let h=k(a);if(!S(h))continue;J(a,{recursive:!0});let l=re(a);for(let o of te){let p=d(r,o),u=d(a,o);if(!S(p)){n.skipped.push(`${l}/${o}`);continue}if(S(u)){try{let b=V(u);if(v(b)===v(p)){n.alreadyLinked.push(`${l}/${o}`),e(` ok: ${o} \u2192 ${l} (already linked)`);continue}}catch{n.skipped.push(`${l}/${o}`),e(` skip: ${o} \u2192 ${l} (exists, not a symlink)`);continue}Y(u)}K(p,u,ee?"junction":"dir"),n.installed.push(`${l}/${o}`),e(` done: ${o} \u2192 ${l}`)}}return n}function re(i){return i.includes(".codex")?"Codex":i.includes(".agents")?"Agents":"Claude"}export{x as Watcher,M as getScipVersion,F as initProjectConfig,ie as installSkills,I as isScipInstalled,m as loadProjectConfig,E as printScipInstallInstructions,y as resolveIndexPaths};
3
3
  //# sourceMappingURL=runtime.js.map
@@ -0,0 +1,56 @@
1
+ import { a as SupportedLanguage } from './config-types-BDIWAYzr.js';
2
+
3
+ type WatcherStatus = {
4
+ state: 'idle';
5
+ } | {
6
+ state: 'waiting';
7
+ changedFiles: number;
8
+ reindexAt: number;
9
+ } | {
10
+ state: 'indexing';
11
+ startedAt: number;
12
+ } | {
13
+ state: 'cooldown';
14
+ until: number;
15
+ dirty: boolean;
16
+ };
17
+ type RefreshTriggerKind = 'manual-cli' | 'setup' | 'watch-source' | 'watch-git-head' | 'watch-git-index' | 'watch-git-state' | 'unknown';
18
+ interface RefreshTrigger {
19
+ kind: RefreshTriggerKind;
20
+ detail?: string;
21
+ }
22
+ type RefreshResultKind = 'rebuilt' | 'reused' | 'failed';
23
+ interface LastRefreshMetadata {
24
+ trigger: RefreshTrigger;
25
+ result: RefreshResultKind;
26
+ startedAt: string;
27
+ completedAt: string;
28
+ durationMs: number;
29
+ indexedLanguages?: SupportedLanguage[];
30
+ skipped?: {
31
+ language: SupportedLanguage;
32
+ reason: string;
33
+ }[];
34
+ error?: string;
35
+ }
36
+
37
+ /**
38
+ * Check if the `scip` CLI binary is available on PATH or packaged with scip-query.
39
+ */
40
+ declare function isScipInstalled(): boolean;
41
+ /**
42
+ * Get the scip CLI version if installed.
43
+ */
44
+ declare function getScipVersion(): string | null;
45
+ /**
46
+ * Print instructions for installing the scip CLI binary.
47
+ */
48
+ declare function printScipInstallInstructions(): void;
49
+ /**
50
+ * Attempt to auto-install the `scip` CLI binary.
51
+ * Tries brew (macOS), then go install, then prints manual instructions.
52
+ * Returns true if installation succeeded.
53
+ */
54
+ declare function tryInstallScipCli(onStatus: (msg: string) => void): boolean;
55
+
56
+ export { type LastRefreshMetadata as L, type RefreshTrigger as R, type WatcherStatus as W, getScipVersion as g, isScipInstalled as i, printScipInstallInstructions as p, tryInstallScipCli as t };
@@ -381,7 +381,7 @@ For command syntax and options reference, see [Command Reference](COMMAND_REFERE
381
381
 
382
382
  ## Tips for AI Agents
383
383
 
384
- - **Always reindex before analysis** if the codebase has changed significantly: `scip-query reindex`
384
+ - **Check freshness before analysis**: run `scip-query status --capabilities`; if freshness is `stale`, `missing`, or `unknown`, run `scip-query reindex`.
385
385
  - **Use `--json` on `health`** for programmatic consumption — parse the JSON to make decisions
386
386
  - **Run `change-surface` before every file modification** — it takes <1 second and prevents surprises
387
387
  - **Run `diff-impact --json` before committing** — catches unexpected blast radius across downstream consumers