scip-query 0.19.6 → 0.19.10

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 (377) hide show
  1. package/CHANGELOG.md +116 -0
  2. package/README.md +156 -44
  3. package/dist/augment-vue-worker.js +1 -1
  4. package/dist/chunk-26QA6FAI.js +8 -0
  5. package/dist/{chunk-J7VT2CRB.js → chunk-2HPVVXM5.js} +2 -2
  6. package/dist/chunk-2KAZEZ6M.js +2 -0
  7. package/dist/chunk-32LVLCLN.js +40 -0
  8. package/dist/{chunk-2CVXCGL4.js → chunk-3CLX5EOX.js} +2 -2
  9. package/dist/{chunk-5OC3HWP5.js → chunk-3G66UZBH.js} +2 -2
  10. package/dist/{chunk-S2GP3CU3.js → chunk-3ORVDL3H.js} +2 -2
  11. package/dist/chunk-46XGSFNI.js +2 -0
  12. package/dist/chunk-4MAK2HOY.js +6 -0
  13. package/dist/chunk-4TURLRL5.js +16 -0
  14. package/dist/chunk-4UQVNCQE.js +2 -0
  15. package/dist/chunk-55Q3WLZX.js +2 -0
  16. package/dist/{chunk-OQ2A4G2G.js → chunk-5E4WNAVD.js} +2 -2
  17. package/dist/{chunk-YGQN3XGZ.js → chunk-5I5G2QOX.js} +2 -2
  18. package/dist/chunk-6LDJQXAH.js +2 -0
  19. package/dist/{chunk-WXAAURU7.js → chunk-6O5TICIZ.js} +2 -2
  20. package/dist/{chunk-OBKDTVZ3.js → chunk-6SHPK5ZE.js} +2 -2
  21. package/dist/chunk-7BAVHKMJ.js +49 -0
  22. package/dist/chunk-7O5IKBTZ.js +16 -0
  23. package/dist/chunk-7PIO7NKH.js +60 -0
  24. package/dist/chunk-7S5E7KWT.js +2 -0
  25. package/dist/{chunk-GK3GRUJX.js → chunk-7SQQWSY3.js} +2 -2
  26. package/dist/chunk-7WPLAODU.js +5 -0
  27. package/dist/chunk-A73XVBCR.js +20 -0
  28. package/dist/chunk-AFHORGLH.js +42 -0
  29. package/dist/chunk-AIE7TFJW.js +9 -0
  30. package/dist/chunk-AQOFWNQJ.js +1 -0
  31. package/dist/{chunk-MGBJHRFB.js → chunk-AZJQQKDD.js} +2 -2
  32. package/dist/{chunk-IYAOX36F.js → chunk-B2PX5I6M.js} +2 -2
  33. package/dist/{chunk-EVOC5I5I.js → chunk-B7PBSLZN.js} +2 -2
  34. package/dist/{chunk-ZLJLE6LK.js → chunk-BBW6JFHN.js} +2 -2
  35. package/dist/{chunk-NBRUH7OE.js → chunk-BDCC2NPY.js} +2 -2
  36. package/dist/{chunk-DD5BOU5I.js → chunk-BNXCIFVY.js} +2 -2
  37. package/dist/{chunk-FHCTEANE.js → chunk-BPAPWKP6.js} +2 -2
  38. package/dist/chunk-BS2NMXQZ.js +4 -0
  39. package/dist/chunk-C3KV2II6.js +2 -0
  40. package/dist/chunk-C43RDDP4.js +20 -0
  41. package/dist/{chunk-QBYYWGAT.js → chunk-CJST5ETY.js} +2 -2
  42. package/dist/chunk-DAFAHMNB.js +42 -0
  43. package/dist/chunk-DHEQMPLW.js +2 -0
  44. package/dist/{chunk-336DC5NJ.js → chunk-DQGFVPUV.js} +2 -2
  45. package/dist/chunk-DQLPXMH6.js +8 -0
  46. package/dist/chunk-EKZTZXHZ.js +117 -0
  47. package/dist/{chunk-KLVJABXA.js → chunk-EN3O7VJA.js} +2 -2
  48. package/dist/{chunk-U5CNPPTZ.js → chunk-EW2NTSFA.js} +2 -2
  49. package/dist/chunk-F3Z4OUDS.js +8 -0
  50. package/dist/chunk-FJH2NW7J.js +66 -0
  51. package/dist/{chunk-3OIKRYU5.js → chunk-FKSELJQF.js} +2 -2
  52. package/dist/chunk-FTFP6O3L.js +11 -0
  53. package/dist/chunk-FYLK2DEJ.js +2 -0
  54. package/dist/chunk-GH74ASD6.js +11 -0
  55. package/dist/{chunk-NQLSSVOB.js → chunk-GMXWZP2B.js} +2 -2
  56. package/dist/chunk-GOUBFH5O.js +3 -0
  57. package/dist/{chunk-RJHCPSZ7.js → chunk-HLF2TX6R.js} +2 -2
  58. package/dist/{chunk-PC44K7RF.js → chunk-HX4GQPZP.js} +2 -2
  59. package/dist/chunk-HX7M4BDI.js +30 -0
  60. package/dist/chunk-HZ72SESS.js +128 -0
  61. package/dist/{chunk-YTUD45PU.js → chunk-IB2N4FIY.js} +2 -2
  62. package/dist/chunk-ILMHV3KM.js +2 -0
  63. package/dist/chunk-IZYYAFN5.js +2 -0
  64. package/dist/{chunk-A43URCQ3.js → chunk-JAYYFEQY.js} +2 -2
  65. package/dist/{chunk-RWRLUZ6U.js → chunk-JDOEX4E6.js} +2 -2
  66. package/dist/chunk-JFGGXWQF.js +947 -0
  67. package/dist/chunk-JN4NMBEX.js +8 -0
  68. package/dist/{chunk-JELJLXEE.js → chunk-JVYA47YU.js} +2 -2
  69. package/dist/{chunk-F42A3AKG.js → chunk-JW56N3KI.js} +2 -2
  70. package/dist/{chunk-FQTPPXNA.js → chunk-JZ2OXNWB.js} +2 -2
  71. package/dist/chunk-KFZNKUNT.js +2 -0
  72. package/dist/chunk-KMKTIO2G.js +8 -0
  73. package/dist/chunk-L5GJNV2T.js +8 -0
  74. package/dist/{chunk-RBFFD4V2.js → chunk-L7AW2QB5.js} +2 -2
  75. package/dist/chunk-L7JDSCDF.js +4 -0
  76. package/dist/chunk-LU47HG23.js +14 -0
  77. package/dist/chunk-LVY7NPF7.js +2 -0
  78. package/dist/chunk-LY4WC4AD.js +74 -0
  79. package/dist/{chunk-MLGTCX56.js → chunk-MKCDWWGV.js} +2 -2
  80. package/dist/chunk-MNE7YG56.js +2 -0
  81. package/dist/{chunk-YWB2EBNB.js → chunk-MRXBEXSY.js} +2 -2
  82. package/dist/chunk-MV7OWDUX.js +2 -0
  83. package/dist/{chunk-2GSQR6YA.js → chunk-N5W4YZMK.js} +2 -2
  84. package/dist/chunk-NGEXCJJW.js +11 -0
  85. package/dist/{chunk-CYJM7CYF.js → chunk-NIW6JDC5.js} +2 -2
  86. package/dist/{chunk-YHXBD52M.js → chunk-O64IZ6UX.js} +2 -2
  87. package/dist/chunk-PBUQFCNB.js +16 -0
  88. package/dist/{chunk-UQK5CRUK.js → chunk-POAVPHH7.js} +2 -2
  89. package/dist/{chunk-TYQ76QHQ.js → chunk-PQCI4SQX.js} +2 -2
  90. package/dist/chunk-PXY7F6Y4.js +5 -0
  91. package/dist/chunk-RDO52JGY.js +2 -0
  92. package/dist/chunk-RJT3TUUZ.js +2 -0
  93. package/dist/{chunk-OHWZKLVA.js → chunk-RUJURYSV.js} +2 -2
  94. package/dist/{chunk-CSTYYXKC.js → chunk-RVLDN63O.js} +2 -2
  95. package/dist/chunk-RXOXSKY3.js +2 -0
  96. package/dist/chunk-S7OYBOCK.js +2 -0
  97. package/dist/chunk-SMNXQT5Z.js +3 -0
  98. package/dist/{chunk-QQWOFXNW.js → chunk-SRAFT254.js} +2 -2
  99. package/dist/{chunk-6XHTISLI.js → chunk-SXP2MBJH.js} +2 -2
  100. package/dist/chunk-T7YQSHPQ.js +3 -0
  101. package/dist/{chunk-2EZSOTSY.js → chunk-TFRAYKN6.js} +2 -2
  102. package/dist/{chunk-XVJ3V7LM.js → chunk-UJCOIXDY.js} +2 -2
  103. package/dist/{chunk-7LABSJSR.js → chunk-UJPRPGCO.js} +5 -5
  104. package/dist/chunk-W4ETQAXM.js +2 -0
  105. package/dist/chunk-WCCFZ7V7.js +113 -0
  106. package/dist/chunk-WUPW3UN3.js +3 -0
  107. package/dist/{chunk-VP542C25.js → chunk-WXZLAAWK.js} +2 -2
  108. package/dist/{chunk-LMFVTUW2.js → chunk-X54AGLVX.js} +2 -2
  109. package/dist/chunk-XKWKXZKW.js +20 -0
  110. package/dist/{chunk-OP3MTFJR.js → chunk-XSRF6Q77.js} +2 -2
  111. package/dist/chunk-Y2MVPNKY.js +5 -0
  112. package/dist/{chunk-6XFC7PQ5.js → chunk-YKUU5AIC.js} +2 -2
  113. package/dist/chunk-YLCJLTPL.js +2 -0
  114. package/dist/{chunk-47X75ZKH.js → chunk-YTQVETEO.js} +2 -2
  115. package/dist/chunk-Z4N3MZYA.js +38 -0
  116. package/dist/chunk-ZHXX42OH.js +18 -0
  117. package/dist/chunk-ZJOOT3BG.js +2 -0
  118. package/dist/chunk-ZK26BAQL.js +2 -0
  119. package/dist/{chunk-UUJBLG6J.js → chunk-ZTETIQ35.js} +2 -2
  120. package/dist/cli.js +3 -3
  121. package/dist/command-descriptors-4A4HWV4F.js +642 -0
  122. package/dist/{config-types-BWQ5xPGI.d.ts → config-types-jVM3D7MA.d.ts} +72 -2
  123. package/dist/{db-B0r1o7Vt.d.ts → db-B5PM5yNk.d.ts} +20 -2
  124. package/dist/{diff-gate-types-C9BoYwYD.d.ts → diff-gate-types-B0QYpDv1.d.ts} +2 -1
  125. package/dist/direct-navigation-6YHV6IB5.js +3 -0
  126. package/dist/{health-CFnlCiTz.d.ts → health-Do5TKSJI.d.ts} +1 -1
  127. package/dist/index.d.ts +3 -3
  128. package/dist/index.js +1 -1
  129. package/dist/postinstall.js +1 -1
  130. package/dist/queries/affected.d.ts +2 -2
  131. package/dist/queries/affected.js +1 -1
  132. package/dist/queries/architecture.d.ts +2 -2
  133. package/dist/queries/architecture.js +1 -1
  134. package/dist/queries/bottlenecks.d.ts +2 -2
  135. package/dist/queries/bottlenecks.js +1 -1
  136. package/dist/queries/by-kind.d.ts +2 -2
  137. package/dist/queries/by-kind.js +1 -1
  138. package/dist/queries/call-graph.d.ts +2 -2
  139. package/dist/queries/call-graph.js +1 -1
  140. package/dist/queries/change-surface.d.ts +22 -3
  141. package/dist/queries/change-surface.js +1 -1
  142. package/dist/queries/cleanup-plan.d.ts +2 -2
  143. package/dist/queries/cleanup-plan.js +1 -1
  144. package/dist/queries/co-change.d.ts +2 -2
  145. package/dist/queries/co-change.js +1 -1
  146. package/dist/queries/code.d.ts +2 -2
  147. package/dist/queries/code.js +1 -1
  148. package/dist/queries/complexity-hotspots.d.ts +3 -3
  149. package/dist/queries/complexity-hotspots.js +1 -1
  150. package/dist/queries/complexity.d.ts +3 -3
  151. package/dist/queries/complexity.js +1 -1
  152. package/dist/queries/convergence.d.ts +2 -2
  153. package/dist/queries/convergence.js +1 -1
  154. package/dist/queries/coupling.d.ts +2 -2
  155. package/dist/queries/coupling.js +1 -1
  156. package/dist/queries/cycles.d.ts +2 -2
  157. package/dist/queries/cycles.js +1 -1
  158. package/dist/queries/dataflow.d.ts +2 -2
  159. package/dist/queries/dataflow.js +1 -1
  160. package/dist/queries/dead.d.ts +2 -2
  161. package/dist/queries/dead.js +1 -1
  162. package/dist/queries/decorative-checkers.d.ts +2 -2
  163. package/dist/queries/decorative-checkers.js +1 -1
  164. package/dist/queries/deep-chains.d.ts +2 -2
  165. package/dist/queries/deep-chains.js +1 -1
  166. package/dist/queries/deps.d.ts +2 -2
  167. package/dist/queries/deps.js +1 -1
  168. package/dist/queries/diff-gate.d.ts +40 -7
  169. package/dist/queries/diff-gate.js +1 -1
  170. package/dist/queries/diff-impact.d.ts +84 -6
  171. package/dist/queries/diff-impact.js +1 -1
  172. package/dist/queries/doc-drift.d.ts +3 -3
  173. package/dist/queries/doc-drift.js +1 -1
  174. package/dist/queries/drift.d.ts +2 -2
  175. package/dist/queries/drift.js +1 -1
  176. package/dist/queries/duplicate-bodies.d.ts +3 -3
  177. package/dist/queries/duplicate-bodies.js +1 -1
  178. package/dist/queries/extract-candidates.d.ts +2 -2
  179. package/dist/queries/extract-candidates.js +1 -1
  180. package/dist/queries/fan.d.ts +2 -2
  181. package/dist/queries/fan.js +1 -1
  182. package/dist/queries/files.d.ts +12 -3
  183. package/dist/queries/files.js +1 -1
  184. package/dist/queries/health.d.ts +3 -3
  185. package/dist/queries/health.js +1 -1
  186. package/dist/queries/hierarchy.d.ts +2 -2
  187. package/dist/queries/hierarchy.js +1 -1
  188. package/dist/queries/hotspots.d.ts +2 -2
  189. package/dist/queries/hotspots.js +1 -1
  190. package/dist/queries/imports.d.ts +2 -2
  191. package/dist/queries/imports.js +1 -1
  192. package/dist/queries/incomplete-migration.d.ts +8 -6
  193. package/dist/queries/incomplete-migration.js +1 -1
  194. package/dist/queries/index.d.ts +141 -10
  195. package/dist/queries/index.js +1 -1
  196. package/dist/queries/isolated.d.ts +2 -2
  197. package/dist/queries/isolated.js +1 -1
  198. package/dist/queries/locality-candidates.d.ts +2 -2
  199. package/dist/queries/locality-candidates.js +1 -1
  200. package/dist/queries/members.d.ts +2 -2
  201. package/dist/queries/members.js +1 -1
  202. package/dist/queries/methods.d.ts +34 -3
  203. package/dist/queries/methods.js +1 -1
  204. package/dist/queries/not-implemented.d.ts +2 -2
  205. package/dist/queries/not-implemented.js +1 -1
  206. package/dist/queries/outline.d.ts +2 -2
  207. package/dist/queries/outline.js +1 -1
  208. package/dist/queries/passthrough-candidates.d.ts +3 -3
  209. package/dist/queries/passthrough-candidates.js +1 -1
  210. package/dist/queries/plan-context.d.ts +3 -3
  211. package/dist/queries/plan-context.js +1 -1
  212. package/dist/queries/react-component-duplicates.d.ts +2 -2
  213. package/dist/queries/react-component-duplicates.js +1 -1
  214. package/dist/queries/react-hook-candidates.d.ts +2 -2
  215. package/dist/queries/react-hook-candidates.js +1 -1
  216. package/dist/queries/react-large-component-pressure.d.ts +2 -2
  217. package/dist/queries/react-large-component-pressure.js +1 -1
  218. package/dist/queries/recent-duplicates.d.ts +2 -2
  219. package/dist/queries/recent-duplicates.js +1 -1
  220. package/dist/queries/redundant-reexports.d.ts +2 -2
  221. package/dist/queries/redundant-reexports.js +1 -1
  222. package/dist/queries/refs.d.ts +2 -2
  223. package/dist/queries/refs.js +1 -1
  224. package/dist/queries/self-audit.d.ts +2 -2
  225. package/dist/queries/self-audit.js +1 -1
  226. package/dist/queries/similar-chains.d.ts +2 -2
  227. package/dist/queries/similar-chains.js +1 -1
  228. package/dist/queries/similar-files.d.ts +2 -2
  229. package/dist/queries/similar-files.js +1 -1
  230. package/dist/queries/similar-signatures.d.ts +2 -2
  231. package/dist/queries/similar-signatures.js +1 -1
  232. package/dist/queries/similar.d.ts +2 -2
  233. package/dist/queries/similar.js +1 -1
  234. package/dist/queries/slice.d.ts +2 -2
  235. package/dist/queries/slice.js +1 -1
  236. package/dist/queries/stale-abstractions.d.ts +2 -2
  237. package/dist/queries/stale-abstractions.js +1 -1
  238. package/dist/queries/stats.d.ts +2 -2
  239. package/dist/queries/surface.d.ts +2 -2
  240. package/dist/queries/surface.js +1 -1
  241. package/dist/queries/symbols.d.ts +2 -2
  242. package/dist/queries/symbols.js +1 -1
  243. package/dist/queries/system.d.ts +2 -2
  244. package/dist/queries/system.js +1 -1
  245. package/dist/queries/test-quality.d.ts +2 -2
  246. package/dist/queries/test-quality.js +1 -1
  247. package/dist/queries/trace.d.ts +2 -2
  248. package/dist/queries/trace.js +1 -1
  249. package/dist/queries/twin-ab.d.ts +14 -3
  250. package/dist/queries/twin-ab.js +1 -1
  251. package/dist/queries/twin-drift.d.ts +2 -2
  252. package/dist/queries/twin-drift.js +1 -1
  253. package/dist/queries/unused-imports.d.ts +2 -2
  254. package/dist/queries/unused-imports.js +1 -1
  255. package/dist/queries/unused-params.d.ts +2 -2
  256. package/dist/queries/unused-params.js +1 -1
  257. package/dist/queries/vue-component-duplicates.d.ts +2 -2
  258. package/dist/queries/vue-component-duplicates.js +1 -1
  259. package/dist/queries/vue-composable-candidates.d.ts +2 -2
  260. package/dist/queries/vue-composable-candidates.js +1 -1
  261. package/dist/queries/vue-large-view-pressure.d.ts +2 -2
  262. package/dist/queries/vue-large-view-pressure.js +1 -1
  263. package/dist/queries/wrapper-candidates.d.ts +2 -2
  264. package/dist/queries/wrapper-candidates.js +1 -1
  265. package/dist/reindex-worker.js +26 -25
  266. package/dist/reindex.d.ts +7 -3
  267. package/dist/reindex.js +34 -33
  268. package/dist/runtime.d.ts +5 -10
  269. package/dist/runtime.js +3 -3
  270. package/dist/rust-semantic-session-server.js +1 -1
  271. package/dist/rust-semantic-session-worker.js +1 -1
  272. package/dist/rust-semantic-worker.js +1 -1
  273. package/dist/{scip-cli-DCvnlZCu.d.ts → scip-cli-BnEwZRLJ.d.ts} +2 -2
  274. package/dist/{symbol-types-BgWU6lhL.d.ts → symbol-types-BIQwfoAx.d.ts} +7 -1
  275. package/dist/typescript-mailbox-worker.js +2 -0
  276. package/dist/watch-server.js +2 -42
  277. package/docs/AGENT_GUIDE.md +28 -5
  278. package/docs/CLI_JSON_OUTPUT.md +176 -3
  279. package/docs/COMMAND_REFERENCE.md +89 -87
  280. package/docs/COMMITTED_RECORD_COMPATIBILITY.md +55 -18
  281. package/docs/DURABILITY.md +88 -38
  282. package/docs/INDEX_GENERATIONS.md +65 -19
  283. package/docs/MAILBOX_LIFECYCLE.md +28 -1
  284. package/docs/REINDEX_METADATA_COMPATIBILITY.md +18 -8
  285. package/docs/SECURITY_MODEL.md +146 -0
  286. package/docs/TELEMETRY_RETENTION.md +16 -4
  287. package/docs/WATCH_REFRESH_REQUESTS.md +34 -21
  288. package/docs/WINDOWS_SIDECAR_RELEASE.md +9 -4
  289. package/docs/analyzer-inventory.md +31 -22
  290. package/docs/analyzer-validation-ledger.md +8 -0
  291. package/docs/schemas/cli-output-page.schema.json +104 -0
  292. package/docs/schemas/outcome-event-record.schema.json +57 -1
  293. package/docs/schemas/project-config.schema.json +82 -1
  294. package/docs/schemas/suppression-record.schema.json +84 -3
  295. package/package.json +9 -8
  296. package/skills/_shared/SKILL.md +5 -3
  297. package/skills/_shared/references/agent-contract-catalog.md +1 -1
  298. package/skills/_shared/references/detector-precision-and-diffgate.md +1 -1
  299. package/skills/scip-audit/SKILL.md +9 -8
  300. package/skills/scip-audit/references/claims.md +1 -1
  301. package/skills/scip-audit/references/cleanup.md +19 -20
  302. package/skills/scip-audit/references/directory.md +4 -4
  303. package/skills/scip-audit/references/frontend.md +10 -10
  304. package/skills/scip-audit/references/twin-drift.md +2 -2
  305. package/skills/scip-diagnose/references/debug.md +8 -8
  306. package/skills/scip-diagnose/references/root-cause.md +3 -3
  307. package/skills/scip-diagnose/references/triage.md +10 -10
  308. package/skills/scip-explore/SKILL.md +4 -4
  309. package/skills/scip-improve/SKILL.md +10 -10
  310. package/skills/scip-improve/references/cleanup-batches.md +3 -3
  311. package/skills/scip-improve/references/directory-moves.md +3 -3
  312. package/skills/scip-improve/references/doc-reconcile.md +1 -1
  313. package/skills/scip-improve/references/frontend-extraction.md +2 -2
  314. package/skills/scip-improve/references/twin-drift.md +3 -3
  315. package/skills/scip-plan/SKILL.md +3 -3
  316. package/skills/scip-plan/references/api-impact.md +5 -5
  317. package/skills/scip-plan/references/conductor.md +2 -2
  318. package/skills/scip-plan/references/hyper-optimization.md +1 -1
  319. package/skills/scip-query/SKILL.md +15 -5
  320. package/skills/scip-setup/references/bootstrap-workflow.md +7 -8
  321. package/skills/scip-setup/references/language-verification.md +2 -2
  322. package/skills/scip-setup/references/per-repo-triage.md +1 -1
  323. package/skills/scip-verify/SKILL.md +16 -11
  324. package/skills/scip-verify/references/calibrate-detectors.md +7 -7
  325. package/dist/chunk-24QNP7MN.js +0 -2
  326. package/dist/chunk-26X7KCJR.js +0 -5
  327. package/dist/chunk-273W2U4Y.js +0 -40
  328. package/dist/chunk-2OXVAGGT.js +0 -3
  329. package/dist/chunk-2ZOCHAL2.js +0 -8
  330. package/dist/chunk-35SQLYCQ.js +0 -2
  331. package/dist/chunk-4CGVLUDP.js +0 -18
  332. package/dist/chunk-4RI4BJGT.js +0 -8
  333. package/dist/chunk-52HQTTPB.js +0 -2
  334. package/dist/chunk-64MNV6AB.js +0 -8
  335. package/dist/chunk-7E3TH5ZN.js +0 -33
  336. package/dist/chunk-7Q6VYYCH.js +0 -2
  337. package/dist/chunk-A63U2W3P.js +0 -3
  338. package/dist/chunk-ADFSIJP2.js +0 -16
  339. package/dist/chunk-AOLE4DYM.js +0 -6
  340. package/dist/chunk-APMMR5Y2.js +0 -2
  341. package/dist/chunk-B5MHCHP3.js +0 -107
  342. package/dist/chunk-DGAGY7RJ.js +0 -60
  343. package/dist/chunk-DGMCFMPG.js +0 -11
  344. package/dist/chunk-E2ZXPB7J.js +0 -38
  345. package/dist/chunk-FKGN4A4E.js +0 -61
  346. package/dist/chunk-G4UQL4CP.js +0 -2
  347. package/dist/chunk-GA64UPMI.js +0 -6
  348. package/dist/chunk-HEBAY673.js +0 -2
  349. package/dist/chunk-HELS7KFF.js +0 -2
  350. package/dist/chunk-IPDCSB6N.js +0 -6
  351. package/dist/chunk-JERWGHQT.js +0 -16
  352. package/dist/chunk-JJJCO4QC.js +0 -945
  353. package/dist/chunk-JZNLMHWY.js +0 -56
  354. package/dist/chunk-K42M2KWT.js +0 -2
  355. package/dist/chunk-KP4KBDVF.js +0 -3
  356. package/dist/chunk-LRTP3DKL.js +0 -3
  357. package/dist/chunk-N3SE646F.js +0 -2
  358. package/dist/chunk-NN4ZIRPK.js +0 -8
  359. package/dist/chunk-P6HBYNBE.js +0 -5
  360. package/dist/chunk-QHKUY4FW.js +0 -2
  361. package/dist/chunk-QHRL4LKM.js +0 -2
  362. package/dist/chunk-SHKZ7OVJ.js +0 -35
  363. package/dist/chunk-TFUU5MQQ.js +0 -2
  364. package/dist/chunk-UXP636P5.js +0 -144
  365. package/dist/chunk-VEVBIAOJ.js +0 -16
  366. package/dist/chunk-VKRQDBW5.js +0 -9
  367. package/dist/chunk-VOQFGC2W.js +0 -67
  368. package/dist/chunk-WMXRRBII.js +0 -8
  369. package/dist/chunk-X3NLZHPA.js +0 -20
  370. package/dist/chunk-XF3KLXN3.js +0 -11
  371. package/dist/chunk-YCPASUCX.js +0 -2
  372. package/dist/chunk-YLVE3SXZ.js +0 -20
  373. package/dist/chunk-Z2LHPIOM.js +0 -2
  374. package/dist/chunk-Z5QQPJ3U.js +0 -30
  375. package/dist/chunk-ZTTISZ7J.js +0 -112
  376. package/dist/command-descriptors-SJDZ7QGR.js +0 -617
  377. package/dist/direct-navigation-HTKOZEOM.js +0 -3
package/CHANGELOG.md CHANGED
@@ -4,6 +4,122 @@ All notable changes to `scip-query` are documented here. This file starts at 0.1
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.19.10]
8
+
9
+ ### Safer setup and removal
10
+
11
+ - Real uninstall now requires an explicit global or project scope, while a
12
+ scope-free dry run safely previews both. Project-hook removal no longer
13
+ depends on resolving an install-only command identity, and ordinary
14
+ uninstall output summarizes retained personal skills unless `--verbose` is
15
+ requested.
16
+ - Guided setup requires an interactive terminal and rejects conflicting JSON
17
+ or automatic modes. Hook removal has a non-writing preview, rejects
18
+ installation-only force semantics, and reports removal-specific outcomes.
19
+ - Watch timing options are explicitly process-local: status and stop reject
20
+ them, and an already-running daemon refuses overrides it cannot apply.
21
+
22
+ ### Honest outcomes and recoverable evidence
23
+
24
+ - Partial reindex results identify every skipped language and reason. Project
25
+ initialization and agent setup derive their messages from actual
26
+ written/unchanged/skipped results instead of reporting categorical success.
27
+ - Suppression receipts disclose their effective scope, reason code, evidence
28
+ count, expiration, and revision.
29
+ - Verified cleanup application has a same-plan `--dry-run` that names exact
30
+ files, symbols, ranges, deleted lines, and the verification oracle before
31
+ the source-mutation boundary.
32
+ - The final human pagination marker now names transport completion separately
33
+ from command-result coverage, preventing a fully retrieved bounded or
34
+ sampled result from being mistaken for complete semantic evidence.
35
+
36
+ ## [0.19.9]
37
+
38
+ ### Agent-readable command output
39
+
40
+ - Human output is now the default evidence format for agents. `code` renders
41
+ only the resolved path, one-based range, symbol identity, language, and
42
+ whitespace-preserved numbered source; complete output no longer receives a
43
+ pagination wrapper merely because a page size was supplied.
44
+ - Every public JSON-capable command exposes the same `--json`,
45
+ `--result-only`, and `--compact` modes. The stable envelope remains
46
+ compatible for programs, while result-only output removes transport
47
+ metadata and `code` returns a minimal ordered line representation.
48
+ - Partial human pages retain multiline hierarchy and split at complete line
49
+ boundaries whenever possible. Exact resumable continuations remain
50
+ mandatory for genuinely partial output, and malformed numeric flags now
51
+ fail explicitly instead of accepting a numeric prefix.
52
+ - Bundled Claude, Codex, and shared-agent skills prefer ordinary output,
53
+ reserve JSON for programmatic consumers, and no longer preselect page sizes
54
+ or recommend compact JSON for model-readable evidence.
55
+
56
+ ### Durable state and concurrency
57
+
58
+ - Atomic file replacement, committed outcome and suppression records,
59
+ generation pointers, shared-cache leases, watcher refresh requests, and
60
+ semantic mailboxes now preserve explicit operation identity across crashes,
61
+ retries, concurrent owners, stale completions, and partial legacy records.
62
+ - SQLite and SCIP publication use immutable generation artifacts with
63
+ conservative recovery, retained-reader protection, corruption detection,
64
+ and bounded garbage collection. Incremental publication rejects incomplete
65
+ affected sets and preserves rich metadata owned by unaffected documents.
66
+ - Stop hooks and diff-gate runs share bounded evidence leases and execution
67
+ deadlines. Automatic suppression requires versioned policy evidence,
68
+ expiration and content-hash checks, and anomaly escalation instead of
69
+ treating repository-writable metadata as independent authority.
70
+
71
+ ### Query performance and evidence integrity
72
+
73
+ - SQL-backed navigation, graph-risk, file-resolution, coupling, and re-export
74
+ analysis reuse prepared data products, parameterized scopes, bounded
75
+ batches, and indexed lookup paths instead of repeated broad scans. Recorded
76
+ before/after ledgers preserve command-output equivalence alongside the
77
+ measured latency gains.
78
+ - Watch refreshes distinguish rebuilt and reused work, suppress redundant
79
+ requests, preserve cache ownership, and avoid competing manual reindexes.
80
+ Diff-gate containment now completes the current repository-wide change in
81
+ seconds rather than allowing duplicate long-running detector processes.
82
+ - Public configuration, reindex metadata, committed records, TypeScript
83
+ declarations, schemas, command documentation, and downstream consumer
84
+ fixtures were evolved together with explicit compatibility handling.
85
+
86
+ ## [0.19.8]
87
+
88
+ ### Complete agent evidence
89
+
90
+ - Every descriptor-backed command now supports resumable output pages backed
91
+ by one immutable private snapshot. Pages report exact character totals,
92
+ bind cursors to the original invocation and content hash, and emit the exact
93
+ continuation command without rerunning a nondeterministic query.
94
+ - Incomplete machine-readable and human pages identify themselves as
95
+ incomplete evidence. Generated project guidance requires agents to retrieve
96
+ every page before drawing a conclusion, changing evidence commands, or
97
+ reporting completion.
98
+
99
+ ### Diff-gate containment
100
+
101
+ - CLI and Stop-hook gates now share a per-project single-flight lease, so
102
+ overlapping agents report the live owner instead of multiplying detector
103
+ work.
104
+ - Gate evaluation runs in an owned child with a finite 60-second deadline, or
105
+ 180 seconds with `--full`. Timeout terminates and reaps the child and fails
106
+ closed.
107
+ - Historical finding reconciliation replays at most one comparison base per
108
+ foreground gate, runs only the detectors needed for that base, and leaves
109
+ deferred findings open with exact counts.
110
+
111
+ ### Security and operational hardening
112
+
113
+ - Repository-controlled paths, tools, regular expressions, persisted records,
114
+ subprocesses, and output now cross explicit containment, size, time, and
115
+ trust boundaries. Terminal text is rendered inert, and destructive cache
116
+ operations require verified ownership.
117
+ - Watchers and semantic mailboxes back off while idle, suppress redundant
118
+ refreshes, and preserve one canonical source identity across filesystem
119
+ aliases.
120
+ - Production dependency audit and release preflight now reject high-severity
121
+ production advisories; the shipped production dependency tree is clean.
122
+
7
123
  ## [0.19.6]
8
124
 
9
125
  ### State and process resilience
package/README.md CHANGED
@@ -34,15 +34,15 @@ Two layers, wired by `scip-query setup`:
34
34
 
35
35
  **Invoked** — the agent routes work through skills, each carrying its own short command list so it never navigates the full CLI:
36
36
 
37
- | Phase | Skill | Commands underneath (also usable directly) |
38
- | -------- | ------------------------------------------------ | --------------------------------------------------- |
39
- | Orient | `scip-explore` | `system`, `trace`, `affected`, `call-graph` |
40
- | Plan | `scip-plan` | `plan-context`, `change-surface`, `co-change` |
41
- | Diagnose | `scip-diagnose` | `files`, `trace`, `call-graph`, `outline` |
42
- | Audit | `scip-audit` | `cleanup-plan --verify`, `dead`, `twin-drift` |
43
- | Improve | `scip-improve` | `incomplete-migration`, `recent-duplicates` |
44
- | Verify | `scip-verify` (closeout) + the ambient diff gate | `diff-impact`, `diff-gate`, `health --baseline` |
45
- | Set up | `scip-setup` | `doctor`, `setup`, `setup-hooks`, `setup-agent` |
37
+ | Phase | Skill | Commands underneath (also usable directly) |
38
+ | -------- | ------------------------------------------------ | ----------------------------------------------- |
39
+ | Orient | `scip-explore` | `system`, `trace`, `affected`, `call-graph` |
40
+ | Plan | `scip-plan` | `plan-context`, `change-surface`, `co-change` |
41
+ | Diagnose | `scip-diagnose` | `files`, `trace`, `call-graph`, `outline` |
42
+ | Audit | `scip-audit` | `cleanup-plan --verify`, `dead`, `twin-drift` |
43
+ | Improve | `scip-improve` | `incomplete-migration`, `recent-duplicates` |
44
+ | Verify | `scip-verify` (closeout) + the ambient diff gate | `diff-impact`, `diff-gate`, `health --baseline` |
45
+ | Set up | `scip-setup` | `doctor`, `setup`, `setup-hooks`, `setup-agent` |
46
46
 
47
47
  The consolidated skills retain the former specialist lenses as routed
48
48
  scenarios: API impact and formal/performance planning live in `scip-plan`;
@@ -75,10 +75,22 @@ For automation, use `scip-query setup --yes` to accept recommended defaults or
75
75
  scope is intentionally managed elsewhere. Or run without a global install:
76
76
  `npx scip-query@latest setup`.
77
77
 
78
- Every public `--json` response identifies its envelope schema, command result
79
- schema, and producing package version. See the
80
- [CLI JSON output contract](docs/CLI_JSON_OUTPUT.md) for the compatibility
81
- policy, decoder API, and machine-readable schema.
78
+ Human output is the default for people and agents: reports retain their
79
+ sections, while `code` preserves indentation and one-based source line
80
+ numbers. Oversized human results paginate at complete line boundaries whenever
81
+ possible, so continuation pages preserve that hierarchy. Every public
82
+ JSON-capable command also supports the same structured forms: `--json` emits
83
+ the stable envelope, `--json --result-only` emits only the command result, and
84
+ `--json --compact` minifies output for a program. See the
85
+ [CLI output contract](docs/CLI_JSON_OUTPUT.md) for mode selection,
86
+ compatibility, pagination, the decoder API, and machine-readable schemas.
87
+
88
+ Logical `refs --limit` pages use a generation-bound `(path, line)` cursor, so
89
+ ordinary continuations resume after the prior row instead of rebuilding and
90
+ discarding it. Follow every emitted `refs --cursor` continuation before
91
+ claiming a complete reference set. JSON identifies semantic, Ruby, or SCIP
92
+ fallback providers that still require complete analysis as
93
+ `pagination.producer: "complete-only"`.
82
94
 
83
95
  Contributors changing exported TypeScript declarations should also follow the
84
96
  [public API evolution workflow](docs/API_EVOLUTION.md). Its committed manifest
@@ -119,8 +131,9 @@ scip-query similar <closest-symbol>
119
131
  # After an extraction or migration: find sites that still contain old logic
120
132
  scip-query incomplete-migration
121
133
 
122
- # Before declaring the work complete: refresh the index and gate the diff
123
- scip-query reindex && scip-query diff-gate --json
134
+ # Before declaring the work complete: gate the diff. Reindex only when status
135
+ # reports stale and no live watcher or hook refresh is already responsible.
136
+ scip-query diff-gate
124
137
  ```
125
138
 
126
139
  For a repository-wide cleanup pass:
@@ -211,6 +224,12 @@ Batch 0: COMPILER-VERIFIED
211
224
  ```
212
225
 
213
226
  When verification _fails_, the errors name the exact references the static evidence missed — that failure has caught real detector mistakes and stopped build-breaking deletions.
227
+ Before applying a verified batch, run
228
+ `scip-query cleanup-apply --verified --batch <n> --dry-run`. The preview reruns
229
+ the verifier and dirty-tree checks, names every file, symbol range, and LOC,
230
+ and stops at the source-mutation boundary. Apply by repeating the command
231
+ without `--dry-run`; use `--all` only when the entire printed target set is
232
+ intended.
214
233
 
215
234
  **5. Trim speculative generality.** `unused-params` finds trailing parameters no body ever uses (the classic "options for later"), scoped to removals that are type-safe by construction.
216
235
 
@@ -253,10 +272,37 @@ Baseline finding identities are keyed as `detector:file:shortName`. A rename can
253
272
  Accepted findings can be recorded without weakening the rest of the gate:
254
273
 
255
274
  ```bash
256
- scip-query suppress SQABC123DEF456 --check echo --reason "intentional compatibility shim"
275
+ scip-query suppress SQABC123DEF456 \
276
+ --check echo \
277
+ --reason-code compatibility-shim \
278
+ --evidence source:src/compat.ts \
279
+ --reason "the v1 export remains an intentional compatibility surface"
257
280
  ```
258
281
 
259
- This writes one file per suppression under `.scipquery/suppressions/` — commit it with your change. One-file-per-suppression means two branches suppressing different findings merge without conflict; the legacy `suppressions[]` array in `.scipquery.json` is still honored (read-only). Every suppression requires a reason plus either a stable finding id or a `check` (optionally narrowed by `file`). Check+file suppressions are allowed but warn because they waive every matching finding in that file. `diff-gate --json` reports both active and suppressed findings.
282
+ This writes one file per suppression under `.scipquery/suppressions/` — commit
283
+ it with your change. One-file-per-suppression means two branches suppressing
284
+ different findings merge without conflict. The command requires an exact
285
+ current finding ID, a controlled reason code, and at least one inspectable
286
+ counterevidence referent. `source:`, `config:`, and `test:` referents are
287
+ content-hashed when the record is written, so changing their bytes reopens the
288
+ finding. A `graph:` referent is an exact `scip-query ...` command:
289
+
290
+ ```bash
291
+ scip-query suppress SQABC123DEF456 \
292
+ --reason-code detector-counterexample \
293
+ --evidence 'graph:scip-query refs CompatExport --full' \
294
+ --reason "all compiler-resolved consumers still require this export"
295
+ ```
296
+
297
+ The model may create these narrow records without human approval. Admission is
298
+ still decided by scip-query's policy: broad, legacy, expired, invalidated,
299
+ incompatible, or anomalously high-volume decisions remain findings and appear
300
+ as policy escalations. A successful gate with accepted records reports
301
+ `pass-with-suppressions`, not an ordinary clean pass. The legacy
302
+ `suppressions[]` array in `.scipquery.json` and v1 record files remain readable,
303
+ but do not automatically waive findings until explicitly replaced with
304
+ structured counterevidence. `diff-gate` reports active findings,
305
+ accepted suppressions, escalation reasons, and summary counts.
260
306
 
261
307
  The first suppression for an identity is created exclusively. Repeating the
262
308
  same decision is idempotent, but a different reason, expiry, check, or file is
@@ -272,32 +318,46 @@ After reviewing the committed decision, replace exactly that revision:
272
318
 
273
319
  ```bash
274
320
  scip-query suppress SQABC123DEF456 --check echo \
321
+ --reason-code compatibility-shim \
322
+ --evidence source:src/compat.ts \
275
323
  --reason "superseded by a narrower compatibility exception" \
276
324
  --replace 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
277
325
  ```
278
326
 
279
327
  If another writer changes the record first, the stale replacement is rejected
280
328
  and the newer bytes remain intact. New records declare their schema version,
281
- record kind, stable suppression identity, and writer version. Older
282
- unversioned and pre-discriminator v1 records remain readable and are upgraded
283
- only by an explicit replacement. If a malformed or future record cannot be
284
- used, `diff-gate` reports exact incomplete-coverage counts and keeps findings
285
- conservatively unsuppressed. The wire schemas and merge rules are documented
286
- in [`docs/COMMITTED_RECORD_COMPATIBILITY.md`](docs/COMMITTED_RECORD_COMPATIBILITY.md).
329
+ record kind, stable suppression identity, writer version, adjudication policy,
330
+ counterevidence, and invalidation conditions. Older unversioned and v1 records
331
+ remain readable and are upgraded only by an explicit replacement. If a
332
+ malformed or future record cannot be used, `diff-gate` reports exact
333
+ incomplete-coverage counts and keeps findings conservatively unsuppressed. The
334
+ wire schemas and merge rules are documented in
335
+ [`docs/COMMITTED_RECORD_COMPATIBILITY.md`](docs/COMMITTED_RECORD_COMPATIBILITY.md).
287
336
 
288
- **12. Measure whether the gate is earning its keep.** Every completed `diff-gate` run, including JSON and installed Stop-hook runs, writes each finding transition to its own committed `.scipquery/events/*.json` file. Independent branches add independent paths instead of editing one shared ledger file, so ordinary event writes do not create merge conflicts. Each event stores the immutable Git commit used as its comparison base. A finding is a verified fix when it disappears under that same comparison—either directly or after scip-query cleanly replays the original base against a newer committed `HEAD`. Merely committing the finding cannot clear it: if replay still finds it, the outcome stays open; if the worktree is dirty or Git cannot reproduce the base, verification waits. A suppressed finding was noise or an accepted trade-off:
337
+ **12. Observe how the gate is handled.** Every completed `diff-gate` run, including JSON and installed Stop-hook runs, writes each finding transition to its own committed `.scipquery/events/*.json` file. Independent branches add independent paths instead of editing one shared ledger file, so ordinary event writes do not create merge conflicts. Each event stores the logical gate-run identity, observer provenance, index/worktree receipt, and immutable Git commit used as its comparison base. A finding is a verified fix when it disappears under that same comparison—either directly or after scip-query cleanly replays the original base against a newer committed `HEAD`. Merely committing the finding cannot clear it: if replay still finds it, the outcome stays open; if the worktree is dirty or Git cannot reproduce the base, verification waits. Historical reconciliation is deliberately incremental: one run replays at most one stored comparison base, reports the exact deferred base and finding counts, and leaves every deferred finding open for a later gate. A suppressed finding was noise or an accepted trade-off:
289
338
 
290
339
  ```bash
291
340
  scip-query effectiveness --since 30d
292
341
  ```
293
342
 
294
343
  ```
295
- check caught fixed suppressed open moved unverified precision median-days-to-fix
296
- echo 14 10 2 1 0 1 83% 0.8
297
- new-dead 6 5 0 1 0 0 100% 0.3
344
+ check caught fixed suppressed open moved unverified resolution-vs-suppression evaluation-precision authority median-days-to-fix
345
+ echo 14 10 2 1 0 1 83% - local-writable-telemetry 0.8
346
+ new-dead 6 5 0 1 0 0 100% - local-writable-telemetry 0.3
298
347
  ```
299
348
 
300
- `precision` is verified fixed ÷ (verified fixed + suppressed). `moved` separates rename churn, while `unverified` is reserved for legacy or otherwise non-comparable resolutions that lack replay proof. Run diff-gate once to record the finding and again after the repair; a pre-commit rerun uses the same base directly, while a clean post-commit run automatically replays the stored base. Filter with `--check <name>`, window with `--since 30d|12w|<ISO date>`, and get machine-readable output with `--json`. Because the event files are committed, the numbers survive re-clones and aggregate across every machine and agent working the repo. Current event files carry an additive v1 discriminator, stable semantic identity, and writer version; existing unversioned files remain readable. `effectiveness` reports accepted and omitted record counts when history is partial, and cross-HEAD verification defers fixes rather than trusting an incomplete lifecycle. Legacy `.scipquery/ledger/events.jsonl` records remain readable and are migrated to individual files on the next gate write only when every non-empty line is compatible; otherwise the source ledger is preserved. Historical cross-`HEAD` events without stored comparison evidence remain unverified rather than being reclassified speculatively. Standalone health/cleanup commands are not yet outcome-tracked because they do not all expose a complete-scan contract.
349
+ `resolution-vs-suppression` is verified fixed ÷ (verified fixed + suppressed). Repository-local event and suppression files are writable by the same agent doing the work, so this ratio is operational telemetry, not an independent correctness grade. `evaluation-precision` is populated only when a protected external evaluator supplies both protected-CI records and a separately controlled attestation for their gate-run IDs; a JSON field cannot attest itself. Ordinary local-agent and local-human runs leave it blank. `moved` separates rename churn, while `unverified` is reserved for legacy or otherwise non-comparable resolutions that lack replay proof. Run diff-gate once to record the finding and again after the repair; a pre-commit rerun uses the same base directly, while clean post-commit runs advance through stored bases incrementally. Filter with `--check <name>`, window with `--since 30d|12w|<ISO date>`, and get machine-readable provenance, anomaly samples, and record-compatibility counts with `--json`. Local runs default to `local-agent`; a person running the gate directly may set `SCIP_QUERY_OUTCOME_OBSERVER_KIND=local-human` and optionally `SCIP_QUERY_OUTCOME_OBSERVER_SOURCE=<label>`. Both remain `repository-writable`; neither environment variable can claim protected authority. Because the event files are committed, the numbers survive re-clones and aggregate across every machine and agent working the repo, but missing or deliberately deleted history cannot be inferred from the remaining directory. Current event files carry an additive v1 discriminator, stable semantic identity, writer version, gate-run identity, observer authority, and observation receipt; existing unversioned files remain readable. `effectiveness` reports accepted and omitted record counts when history is partial, and cross-HEAD verification defers fixes rather than trusting an incomplete lifecycle. Legacy `.scipquery/ledger/events.jsonl` records remain readable and are migrated to individual files on the next gate write only when every non-empty line is compatible; otherwise the source ledger is preserved. Historical cross-`HEAD` events without stored comparison evidence remain unverified rather than being reclassified speculatively. Standalone health/cleanup commands are not yet outcome-tracked because they do not all expose a complete-scan contract.
350
+
351
+ `diff-gate` is also single-flight per project: a second CLI or Stop-hook gate
352
+ returns the live owner's PID and start time instead of duplicating the same
353
+ CPU-heavy work. The gate runs in an owned child process with a 60-second
354
+ deadline, or 180 seconds with `--full`; timeout terminates and reaps that child
355
+ and fails the gate explicitly. Before and after every detector, the child
356
+ publishes a private progress record; a timeout therefore names the active
357
+ detector or phase and the last completed detector instead of reporting only
358
+ the total elapsed time. Operators may set
359
+ `SCIP_QUERY_DIFF_GATE_TIMEOUT_MS` to a positive millisecond value, capped at
360
+ 10 minutes.
301
361
 
302
362
  The health report also keeps a worktree-local repeat counter in `evidence.db`.
303
363
  A logical observation is one completed detector evaluation named by an
@@ -385,11 +445,12 @@ classifies current evidence, while `scip-improve` changes confirmed findings.
385
445
  challenges a concrete finished diff. `scip-explore` explains working behavior;
386
446
  `scip-diagnose` starts from a failure or contradiction.
387
447
 
388
- Project setup writes reviewable checkout-local lifecycle hooks for Codex and Claude Code (`.codex/hooks.json` and `.claude/settings.local.json`). A checkout-local hook is an agent-tool preference whose defining trait is that it applies to one clone rather than expressing team policy. Setup adds both paths to that clone's `.git/info/exclude`, so they do not appear in commits, and refuses to rewrite either path if it is already tracked. `setup-hooks --shared` remains accepted only as a deprecated compatibility flag; it no longer writes `.claude/settings.json`. These hooks add scip-query context at session start, route prompts toward the right skill, and run an advisory Stop-hook wrapper around the diff gate only for that repository. The Stop hook sends feedback to the agent by default instead of blocking; set `SCIP_QUERY_STOP_HOOK_MODE=warn` for a warning-only hook response, or `SCIP_QUERY_STOP_HOOK_MODE=block` to enforce the gate. Set `SCIP_QUERY_SKIP_HOOK_INSTALL=1` or run `scip-query setup --no-hooks` to skip hook installation during setup, and run `scip-query setup-hooks --json` later to repair the current checkout's hooks.
448
+ Project setup writes reviewable checkout-local lifecycle hooks for Codex and Claude Code (`.codex/hooks.json` and `.claude/settings.local.json`). A checkout-local hook is an agent-tool preference whose defining trait is that it applies to one clone rather than expressing team policy. Setup adds both paths to that clone's `.git/info/exclude`, so they do not appear in commits, and refuses to rewrite either path if it is already tracked. `setup-hooks --shared` remains accepted only as a deprecated compatibility flag; it no longer writes `.claude/settings.json`. These hooks add scip-query context at session start, route prompts toward the right skill, and run an advisory Stop-hook wrapper around the diff gate only for that repository. The Stop hook sends feedback to the agent by default instead of blocking; set `SCIP_QUERY_STOP_HOOK_MODE=warn` for a warning-only hook response, or `SCIP_QUERY_STOP_HOOK_MODE=block` to enforce the gate. Set `SCIP_QUERY_SKIP_HOOK_INSTALL=1` or run `scip-query setup --no-hooks` to skip hook installation during setup, and run `scip-query setup-hooks --json` later to repair the current checkout's hooks. Preview hook removal with `scip-query setup-hooks --remove --dry-run`; `--force` is an installation-only mode and cannot be combined with removal. A scope-free `scip-query uninstall --dry-run` safely previews both global and project integrations, while real uninstall requires exactly one of `--global` or `--project`.
389
449
 
390
450
  Setup/configuration writers are conflict-aware. They reread the latest file
391
451
  under a short token-owned lock, preserve unknown JSON fields and prose outside
392
- owned Markdown markers, and publish complete bytes durably. An unrelated
452
+ owned Markdown markers, and publish complete bytes with flushed files and,
453
+ where the host supports it, a synchronized complete directory path. An unrelated
393
454
  intervening JSON edit is merged; a stale decision about the same project-config
394
455
  field, malformed latest JSON, malformed managed markers, or an edit that wins
395
456
  the final revision check produces an explicit conflict and leaves the latest
@@ -403,18 +464,22 @@ reports Rust's final durable/worker semantic selection and lifecycle state.
403
464
  The status read is passive; the setup health audit may make a semantic request
404
465
  that wakes rust-analyzer, after which the helper exits on clean idle.
405
466
  It also installs/refreshes skills, configures project-local hooks unless
406
- skipped, checks indexer readiness, attempts configured indexer remediation,
467
+ skipped, checks indexer readiness, performs explicitly approved pinned indexer
468
+ remediation,
407
469
  refreshes the index, smoke-tests representative command families, writes
408
470
  `docs/scip-query/health-dossier.md` and `.json` when the optional health pass is
409
471
  selected, reports the health score and items needing attention, and seeds
410
472
  AGENTS.md/CLAUDE.md guidance. Use
411
473
  the default terminal checklist to accept or decline the recommended automatic
412
- indexing action and other project-local changes (`--guided` reopens it
413
- explicitly). After setup,
474
+ indexing action and other project-local changes (`--guided` requires an
475
+ interactive terminal and reopens it explicitly; automation should use
476
+ `--yes` or `--json`). After setup,
414
477
  `scip-audit` confirms raw signals and `scip-improve` keeps
415
478
  fixing the worst confirmed items until no safe confirmed cleanup remains. Use
416
479
  `scip-query setup --git-hook` when you also want a local pre-commit diff gate.
417
- CI setup is intentionally separate.
480
+ Non-interactive setup and ordinary reindex report missing global tools without
481
+ installing them; pass `--install-missing` only when that operation may install
482
+ the reviewed immutable package versions. CI setup is intentionally separate.
418
483
 
419
484
  Setup classifies every change by where its facts belong:
420
485
 
@@ -464,8 +529,8 @@ scip-query status --capabilities
464
529
  scip-query stats
465
530
  scip-query system src/auth
466
531
  scip-query plan-context login
467
- scip-query diff-impact --json
468
- scip-query health --json
532
+ scip-query diff-impact
533
+ scip-query health
469
534
  scip-query cleanup-plan --verify
470
535
  scip-query health --write-baseline # start the ratchet
471
536
  ```
@@ -534,8 +599,14 @@ selects the database, SCIP companion, and metadata as one unit; every
534
599
  `index.db`, `index.scip`, and `meta.json` files remain compatibility mirrors,
535
600
  but internal queries do not reread them after opening a generation. This keeps
536
601
  cursor identities and semantic requests attached to the same rows even during
537
- a concurrent reindex. The publication, crash, legacy-overlap, and retention
538
- rules are documented in [Local Index Generations](docs/INDEX_GENERATIONS.md).
602
+ a concurrent reindex. Each live reader publishes a process-identity lease.
603
+ Automatic collection retains the current and recovery generations, every
604
+ live-reader generation, and enough recent generations to stay within both an
605
+ eight-generation and 2 GiB logical default bound. Malformed reader ownership
606
+ fails closed; dead readers are reclaimed. `status` reports retained count,
607
+ logical bytes, oldest age, protected/readers counts, limits, and the last
608
+ collection result. The publication, crash, legacy-overlap, and retention rules
609
+ are documented in [Local Index Generations](docs/INDEX_GENERATIONS.md).
539
610
 
540
611
  All `meta.json` consumers share one version decoder and an explicit capability
541
612
  matrix. Version 2 remains readable, version 3 is current, and version 4 is a
@@ -634,6 +705,14 @@ replacement, and manual preemption verify both values before signaling. A
634
705
  legacy record or a platform lookup failure therefore fails closed with an
635
706
  explicit recovery error instead of treating a reused PID as the old
636
707
  tool-owned process.
708
+ Watcher shutdown stops new work and gives subscriptions and active reindex
709
+ ownership five seconds to drain. A dedicated watch service that cannot prove a
710
+ clean stop reports a degraded shutdown and exits so the operating system can
711
+ close stuck descriptors. `watch stop` allows six seconds for that graceful
712
+ path, then revalidates the exact process-start identity before forced
713
+ termination and waits up to one additional second to observe exit. A changed
714
+ or unavailable identity is never signaled, and ownership files are not cleaned
715
+ until the original process is known to have exited.
637
716
 
638
717
  Finite subprocesses use explicit wall-time and output budgets. Quick binary
639
718
  probes default to 10 seconds, Git operations to 30 seconds, isolated analysis
@@ -673,10 +752,20 @@ Clojure projects can pass a project-local `scip-clojure` config file through `.s
673
752
  }
674
753
  ```
675
754
 
676
- Most read-only commands accept `--json` and use the same envelope:
755
+ Most read-only commands accept `--json` and use the same versioned envelope.
756
+ Add `--result-only` when a program needs just the command payload:
677
757
 
678
758
  ```json
679
- { "command": "fan-in", "args": ["login"], "options": { "json": true }, "result": [] }
759
+ {
760
+ "kind": "scip-query-result",
761
+ "schemaVersion": 1,
762
+ "producer": { "name": "scip-query", "version": "0.19.10" },
763
+ "command": "fan-in",
764
+ "resultSchemaVersion": 1,
765
+ "args": ["login"],
766
+ "options": { "json": true },
767
+ "result": []
768
+ }
680
769
  ```
681
770
 
682
771
  ## Configuration
@@ -697,7 +786,7 @@ It creates a minimal `.scipquery.json`:
697
786
  "watch": {
698
787
  "enabled": true,
699
788
  "debounceMs": 250,
700
- "cooldownMs": 0,
789
+ "cooldownMs": 5000,
701
790
  "gitPollMs": 2000,
702
791
  "idleTimeoutMs": 600000,
703
792
  "autoRefresh": true
@@ -727,7 +816,13 @@ background service. Relevant file/Git activity keeps it alive; it exits after
727
816
  `idleTimeoutMs` of clean inactivity and wakes on the next command. Set the idle
728
817
  timeout to `0` to keep it running. `scip-query watch` still provides foreground
729
818
  mode, while `watch --daemon`, `watch --status`, and `watch --stop` expose the
730
- background lifecycle. Both modes share one project lock, so only one can own an
819
+ background lifecycle. Command-line timing flags are process-local and apply
820
+ only when a foreground watcher or daemon starts; a live daemon refuses those
821
+ flags and names the required stop/start sequence instead of pretending its
822
+ timing changed. The default 5-second cooldown coalesces change bursts
823
+ into one refresh plus, when necessary, one trailing refresh; explicitly setting
824
+ `cooldownMs` to `0` opts into immediate scheduling. Both modes share one project
825
+ lock, so only one can own an
731
826
  index cache. Stopping is an asynchronous drain: the watcher first rejects new
732
827
  refreshes, continuously consumes a bounded tail of the active worker's output,
733
828
  closes every source subscription, and waits for the worker to exit after
@@ -751,13 +846,24 @@ owner-expiring claims, retained idempotent completions, FIFO enqueue ordering,
751
846
  typed item/byte backpressure, bounded cleanup, and pressure telemetry. Client
752
847
  timeout or exit no longer deletes shared work; a service crash before response
753
848
  is reclaimable, while a response published before a crash prevents
754
- re-execution. The precise state machine, default limits, legacy overlap, and
849
+ re-execution. The service rereads the clock before each claimed operation and
850
+ again after handler completion, so time spent on an earlier request cannot let
851
+ a later expired request begin or publish success. Idle mailbox polling backs
852
+ off from 50 ms to 250 ms and returns to 10 ms while draining work; mailbox
853
+ directories are initialized once per service ownership rather than on every
854
+ poll. The precise state machine, default limits, legacy overlap, and
755
855
  failure matrix are documented in
756
856
  [`docs/MAILBOX_LIFECYCLE.md`](docs/MAILBOX_LIFECYCLE.md).
757
857
  Rust v3 additionally binds every accepted response to its request ID,
758
858
  operation ID, mailbox-session identity, and authoritative absolute deadline;
759
859
  its old/current/future compatibility matrix is in
760
860
  [`docs/RUST_DURABLE_SESSION_PROTOCOL.md`](docs/RUST_DURABLE_SESSION_PROTOCOL.md).
861
+ The Rust semantic worker retains at most four rust-analyzer sessions. Linked
862
+ Cargo projects are resolved, deduplicated, and sorted before session reuse, so
863
+ equivalent project sets share one session regardless of input order. When the
864
+ capacity is full, the least-recently-used session completes its LSP shutdown
865
+ and process-tree reap before a replacement starts; an unproven shutdown blocks
866
+ replacement instead of allowing overlapping language servers.
761
867
  It also reports a rolling 24-hour reindex activity summary: rebuilt, reused,
762
868
  failed, and freshness-proven suppressed refreshes plus estimated logical output
763
869
  bytes. The estimate counts scip-query artifacts emitted by rebuilt refreshes;
@@ -765,7 +871,12 @@ it is not a measurement of physical SSD writes. The underlying
765
871
  `reindex-activity.jsonl` history uses two bounded 1 MiB segments. Append,
766
872
  rotation, and retained-set reads share a process-instance lock; incomplete
767
873
  crash tails are trimmed or ignored without deleting earlier complete lines.
768
- These observations are process-visible rather than crash-durable. See
874
+ Status labels the resulting summary `complete`, `partial`, or `unavailable`
875
+ and reports read, invalid, skipped, read-error, and incomplete-tail counts.
876
+ Telemetry append failure never changes the authoritative reindex result, but
877
+ it is returned to the caller and surfaced as a warning or watch-state error
878
+ instead of disappearing. These observations are process-visible rather than
879
+ crash-durable. See
769
880
  [`docs/TELEMETRY_RETENTION.md`](docs/TELEMETRY_RETENTION.md).
770
881
  The refresh-request counters reported beside it describe durable demand
771
882
  admission and processing state, not reindex frequency.
@@ -832,6 +943,7 @@ Query results are filtered through the project's `.gitignore`. If none exists, c
832
943
  - [Agent Guide](docs/AGENT_GUIDE.md): goal-oriented workflows for tracing, planning, cleanup, quality checks, and change verification.
833
944
  - [Command Reference](docs/COMMAND_REFERENCE.md): generated command syntax, descriptions, and options.
834
945
  - [CLI JSON output contract](docs/CLI_JSON_OUTPUT.md): versioned envelopes, compatibility rules, and schema.
946
+ - [Security model](docs/SECURITY_MODEL.md): untrusted-checkout boundaries, authority flags, input budgets, and complete-output pagination.
835
947
  - [Programmatic API](docs/API.md): using the query functions from TypeScript.
836
948
  - [Historical plans](https://github.com/PlunderStruck/scip-query/tree/main/docs/plans): implementation notes and completed cleanup plans.
837
949
 
@@ -1,2 +1,2 @@
1
- import{c as t}from"./chunk-VEVBIAOJ.js";import"./chunk-VOQFGC2W.js";import{writeFileSync as s}from"fs";import{workerData as o}from"worker_threads";var r=o;try{let e=t({projectRoot:r.projectRoot,dbPath:r.dbPath,tsconfig:r.tsconfig,vueFiles:r.vueFiles,tasks:r.tasks});s(r.resultPath,JSON.stringify({version:1,runId:r.runId,workerId:r.workerId,taskIds:r.taskIds,ok:!0,result:e}))}catch(e){s(r.resultPath,JSON.stringify({version:1,runId:r.runId,workerId:r.workerId,taskIds:r.taskIds,ok:!1,error:e instanceof Error?e.message:String(e)}))}
1
+ import{c as t}from"./chunk-PBUQFCNB.js";import"./chunk-FJH2NW7J.js";import"./chunk-WUPW3UN3.js";import"./chunk-46XGSFNI.js";import{writeFileSync as s}from"fs";import{workerData as o}from"worker_threads";var r=o;try{let e=t({projectRoot:r.projectRoot,dbPath:r.dbPath,tsconfig:r.tsconfig,vueFiles:r.vueFiles,tasks:r.tasks});s(r.resultPath,JSON.stringify({version:1,runId:r.runId,workerId:r.workerId,taskIds:r.taskIds,ok:!0,result:e}))}catch(e){s(r.resultPath,JSON.stringify({version:1,runId:r.runId,workerId:r.workerId,taskIds:r.taskIds,ok:!1,error:e instanceof Error?e.message:String(e)}))}
2
2
  //# sourceMappingURL=augment-vue-worker.js.map
@@ -0,0 +1,8 @@
1
+ import{a as k}from"./chunk-DHEQMPLW.js";import{a as $}from"./chunk-C43RDDP4.js";import{a as O,e as P,s as A}from"./chunk-EKZTZXHZ.js";import{o as R}from"./chunk-UJPRPGCO.js";import{E as S,F as w,G as j,K as T}from"./chunk-WCCFZ7V7.js";import{a as d}from"./chunk-NGEXCJJW.js";import{d as g}from"./chunk-7S5E7KWT.js";import{c as f}from"./chunk-C3KV2II6.js";import{existsSync as b,readdirSync as M}from"fs";import{join as p}from"path";var Q={files:new Set,pathPrefixes:[]},z={reasonsByFile:new Map},x=/^(?:dist|build|lib|out|output|esm|cjs|umd)\//,tt=/\.(?:d\.ts|d\.mts|d\.cts|ts|tsx|mts|cts|js|jsx|mjs|cjs)$/,C=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"],et=new Set([".git",".next",".turbo","build","coverage","dist","node_modules","out"]),rt=4,nt=g("package-surface",{clearGroups:["whole-project"]}),st=g("package-operational-surface",{clearGroups:["whole-project"]});function it(t){return nt.get(t,()=>ot(t.config.projectRoot))}function y(t,e){let r=it(t);return r.files.has(e)?!0:r.pathPrefixes.some(n=>e.startsWith(n))}function at(t){return st.get(t,()=>ct(t.config.projectRoot))}function ee(t,e){return at(t).reasonsByFile.get(e)??[]}function ot(t){let e=new Set,r=[];for(let{manifest:n,packageRoot:i}of N(t))for(let s of ut(n))V(t,i,s,e,r);return e.size===0&&r.length===0?Q:{files:e,pathPrefixes:r}}function ct(t){let e=new Map;for(let{manifest:r,packageRoot:n}of N(t)){let i=ft(r);for(let a of i)F(t,n,a,"package binary",e);let s=r.scripts;if(!(!s||typeof s!="object")){for(let[a,o]of Object.entries(s))if(typeof o=="string")for(let c of gt(o))F(t,n,c,`package script "${a}"`,e)}}return e.size===0?z:{reasonsByFile:e}}function N(t){let e=[],r=v(t,"");return r&&e.push({manifest:r,packageRoot:""}),L(t,"",e,0),e}function L(t,e,r,n){if(n>=rt)return;let i=p(t,e);if(b(i))for(let s of M(i,{withFileTypes:!0})){if(!s.isDirectory()||et.has(s.name))continue;let a=e?`${e}/${s.name}`:s.name,o=v(t,a);o&&r.push({manifest:o,packageRoot:a}),L(t,a,r,n+1)}}function v(t,e){let r;try{r=S(t,p(e,"package.json"),{maxBytes:8*1024*1024,inputKind:"package manifest"})}catch(n){if(!w(n))throw n;return null}try{let n=JSON.parse(r);return n&&typeof n=="object"?n:null}catch{return null}}function ut(t){let e=[];for(let n of["main","module","types","browser"])typeof t[n]=="string"&&e.push(t[n]);let r=t.bin;if(typeof r=="string")e.push(r);else if(r&&typeof r=="object")for(let n of Object.values(r))typeof n=="string"&&e.push(n);return I(t.exports,e),e}function ft(t){let e=t.bin;return typeof e=="string"?[e]:!e||typeof e!="object"?[]:Object.values(e).filter(r=>typeof r=="string")}function gt(t){let e=[],r=/(?:^|&&|\|\||;)\s*(?:(?:cross-env|env)(?:\s+[A-Za-z_][A-Za-z0-9_]*=\S+)*\s+)?(?:node|bun|tsx|ts-node|vite-node|python3?|deno\s+run)\s+(?:(?:--?[A-Za-z0-9-]+(?:=\S+)?)\s+)*["']?([^"'`\s]+\.(?:ts|tsx|mts|cts|js|jsx|mjs|cjs|py))["']?/g;for(let n of t.matchAll(r)){let i=n[1];i&&!i.startsWith("node_modules/")&&!i.startsWith("./node_modules/")&&e.push(i)}return e}function F(t,e,r,n,i){let s=new Set;V(t,e,r,s,[]);for(let a of s){let o=i.get(a)??[];o.includes(n)||o.push(n),i.set(a,o)}}function I(t,e){if(typeof t=="string"){e.push(t);return}if(!(!t||typeof t!="object"))for(let r of Object.values(t))I(r,e)}function V(t,e,r,n,i){let s=r.replace(/\\/g,"/").replace(/^\.\//,"");if(s===""||s.startsWith(".."))return;let a=s.indexOf("*");if(a>=0){let c=s.slice(0,a);for(let l of D(c))l!==""&&i.push(u(e,l));return}let o=s.replace(tt,"");for(let c of D(o)){c===o&&c===s&&n.add(u(e,s));for(let l of C)lt(t,n,e,c+l)}n.add(u(e,s))}function D(t){let e=[t];return x.test(t)&&(e.push(t.replace(x,"src/")),e.push(t.replace(x,""))),e}function lt(t,e,r,n){let i=u(r,n);if(e.add(i),!n.startsWith("src/")||b(p(t,i)))return;let s=C.find(m=>n.endsWith(m));if(!s)return;let a=n.slice(0,-s.length);pt(t,e,r,a,s);let o=a.lastIndexOf("/");if(o<=4)return;let c=a.slice(0,o),l=a.slice(o+1);for(let m of B(t,r,c,`${l}${s}`))e.add(m)}function pt(t,e,r,n,i){let s=u(r,`${n}/index${i}`);b(p(t,s))&&e.add(s)}function B(t,e,r,n){let i=p(t,e,r);if(!b(i))return[];let s=[];for(let a of M(i,{withFileTypes:!0})){let o=`${r}/${a.name}`;a.isDirectory()?s.push(...B(t,e,o,n)):a.isFile()&&a.name===n&&s.push(u(e,o))}return s}function u(t,e){return t?`${t}/${e}`:e}import{existsSync as E,readdirSync as dt}from"fs";import{dirname as St,join as _}from"path";var bt={rootFiles:new Set,sourcePrefixes:[]},ht=new Set([".git",".scipquery","node_modules","target"]),mt=6,Pt=g("rust-library-surface",{clearGroups:["whole-project"]});function W(t,e,r){if(!r.endsWith(".rs")||!Et(xt(t),r))return!1;let n=A(t,r).find(i=>i.symbol===e);return n?_t(T(t,r)[n.startLine]??""):!1}function xt(t){return Pt.get(t,()=>yt(t.config.projectRoot))}function yt(t){let e=new Set,r=new Set;for(let n of kt(t)){let i=S(t,_(n,"Cargo.toml"),{maxBytes:8388608,inputKind:"Cargo manifest"}),s=wt(i),a=u(n,"src/lib.rs"),o=s?u(n,s):!jt(i)&&j(t,a)?a:null;if(!o)continue;e.add(o);let c=St(o).replaceAll("\\","/");r.add(c==="."?"":`${c}/`)}return e.size===0?bt:{rootFiles:e,sourcePrefixes:[...r].sort()}}function Et(t,e){return e.endsWith(".rs")?t.rootFiles.has(e)?!0:Tt(e)?!1:t.sourcePrefixes.some(r=>e.startsWith(r)):!1}function _t(t){return/^\s*pub\s+(?!\()/.test(t)}function kt(t){if(!E(t))return[];let e=[];return X(t,"",e,0),e}function X(t,e,r,n){let i=_(t,e);if(E(i)&&(E(_(i,"Cargo.toml"))&&r.push(e),!(n>=mt)))for(let s of dt(i,{withFileTypes:!0})){if(!s.isDirectory()||ht.has(s.name))continue;let a=e?`${e}/${s.name}`:s.name;X(t,a,r,n+1)}}function wt(t){let e=!1;for(let r of t.split(`
2
+ `)){let n=r.replace(/\s+#.*$/,"").trim(),i=/^\[([^\]]+)\]$/.exec(n);if(i){e=i[1]==="lib";continue}if(!e)continue;let s=/^path\s*=\s*["']([^"']+)["']/.exec(n)?.[1];if(s)return s.replaceAll("\\","/").replace(/^\.\//,"")}return null}function jt(t){let e=!1;for(let r of t.split(`
3
+ `)){let n=r.replace(/\s+#.*$/,"").trim(),i=/^\[([^\]]+)\]$/.exec(n);if(i){e=i[1]==="package";continue}if(e&&/^autolib\s*=\s*false\b/.test(n))return!0}return!1}function Tt(t){return/(?:^|\/)src\/main\.rs$/.test(t)||/(?:^|\/)src\/bin\//.test(t)||/(?:^|\/)(?:examples|tests|benches)\//.test(t)}function h(t){let e=f(t);return Ht(e)?"test":Kt(e)?"worker":Yt(e)?"entry":Zt(e)?"barrel":"source"}function Rt(t){return h(t)==="barrel"}function U(t){return $t.get(t,()=>{let r=d(t,{includeIgnored:!1}).filter(a=>{let o=h(a);return o==="entry"||o==="worker"});if(r.length===0)return new Set;let n=$(t),i=new Set,s=new Set;for(;r.length>0;){let a=r.shift();if(!i.has(a)){i.add(a),h(a)==="barrel"&&s.add(a);for(let o of n.get(a)??[])i.has(o)||r.push(o)}}return s})}var $t=g("live-barrels",{clearGroups:["whole-project"]});function Ot(t,e){return U(t).has(f(e))}function ye(t){let e=U(t);return d(t,{includeIgnored:!1}).filter(r=>Rt(r)&&!e.has(r)&&!At(t,r))}function At(t,e){let r=f(e),n=O(t).forFile(r,{facts:!0}).facts?.callables;return n&&n.length>0?!0:(t.get(`SELECT COUNT(*) AS n
4
+ FROM defn_enclosing_ranges der
5
+ JOIN documents d ON d.id = der.document_id
6
+ WHERE d.relative_path = ?
7
+ AND der.end_line - der.start_line >= 2`,r)?.n??0)>0}function Ee(t,e){let r=f(e),n=h(e);return n==="entry"||n==="worker"||Xt(r)||Ot(t,r)}function _e(t,e,r){let n=f(r);if(y(t,n)||Dt(t,e,n)||W(t,e,n)||Wt(e,n))return!0;let i=t.config.entryRoots;return i?!!(i.files?.some(s=>f(s)===n)||i.pathPrefixes?.some(s=>n.startsWith(f(s)))||i.qualifiedVars?.some(s=>qt(e,s))||i.symbolPatterns?.some(s=>{try{return k(s,"entryRoots.symbolPatterns entry").test(e)}catch{return!1}})):!1}var Ft=g("package-surface-reachability",{clearGroups:["whole-project"]});function Dt(t,e,r){let n=Mt(t).get(r);return n===void 0?!1:n===null||n.has(P(e))}function Mt(t){return Ft.get(t,()=>{let e=new Map,r=[];for(let n of d(t,{includeIgnored:!1}))y(t,n)&&(e.set(n,null),r.push(n));for(;r.length>0;){let n=r.shift(),i=e.get(n);if(i!==void 0)for(let s of R(t,n)){if(!s.sourcePath||t.isIgnored(s.sourcePath))continue;let a=Ct(i,s);a!==void 0&&Nt(e,s.sourcePath,a)&&r.push(s.sourcePath)}}return e})}function Ct(t,e){if(t===null)return e.kind==="named"?new Set(e.names):null;if(e.kind==="star")return new Set(t);if(e.kind==="star-as")return;let r=e.names.filter(n=>t.has(n));return r.length>0?new Set(r):void 0}function Nt(t,e,r){if(!t.has(e))return t.set(e,r),!0;let n=t.get(e);if(n===void 0)return!1;if(n===null||r===null)return n===null?!1:(t.set(e,null),!0);let i=!1;for(let s of r)n.has(s)||(n.add(s),i=!0);return i}var H=new Set(["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"]),Lt=new Set(["default","generateMetadata","generateStaticParams"]),vt=new Set(["default","getStaticProps","getServerSideProps","getStaticPaths","config"]),It=new Set(["default","loader","action","clientLoader","clientAction","headers","links","meta","shouldRevalidate","ErrorBoundary","HydrateFallback"]),Vt=new Set(["load","actions","entries",...H]),Bt=new Set(["default"]);function Wt(t,e){let r=P(t);return r===""?!1:K(e)?H.has(r):Y(e)?Lt.has(r):Z(e)?vt.has(r):q(e)?It.has(r):J(e)?Vt.has(r):Ut(e)?Bt.has(r):!1}function Xt(t){return K(t)||Y(t)||Z(t)||Gt(t)||q(t)||J(t)}function K(t){return/(?:^|\/)app(?:\/[^/]+)*\/route\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(t)}function Y(t){return/(?:^|\/)app(?:\/[^/]+)*\/(?:page|layout|template|loading|error|not-found|global-error|head|default)\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(t)}function Z(t){return/(?:^|\/)pages\/.+\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(t)}function Gt(t){let e="(?:middleware|proxy|instrumentation)\\.(?:ts|js|mts|mjs)";return new RegExp(`^(?:src/)?${e}$`).test(t)||new RegExp(`(?:^|/)src/${e}$`).test(t)||new RegExp(`(?:^|/)(?:apps|services|packages)/[^/]+/(?:src/)?${e}$`).test(t)}function q(t){return/(?:^|\/)app\/routes\/.+\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(t)}function J(t){return/(?:^|\/)src\/routes\/(?:.*\/)?\+(?:page|page\.server|layout|layout\.server|server)\.(?:ts|js)$/.test(t)}function Ut(t){return/(?:^|\/)src\/(?:pages|views|routes)\/.+\.(?:ts|tsx|js|jsx|vue)$/.test(t)}function Ht(t){return!!(/\.(?:test|spec)\.[a-z0-9]+$/i.test(t)||/(?:^|\/)(?:_)?test_[^/]+$/i.test(t)||/(?:^|\/)spec_[^/]+$/i.test(t)||/(?:^|\/)[^/]+_test\.[a-z0-9]+$/i.test(t)||/(?:^|\/)[^/]+_tests\.rs$/i.test(t)||/(?:^|\/)tests\.rs$/i.test(t)||/(?:^|\/)[^/]+_spec\.[a-z0-9]+$/i.test(t)||/(?:^|\/)__tests__\//i.test(t)||/(?:^|\/)test\//i.test(t)||/(?:^|\/)tests\//i.test(t)||/(?:^|\/)__fixtures__\//i.test(t)||/(?:^|\/)__mocks__\//i.test(t)||/(?:^|\/)test-support\//i.test(t)||/(?:^|\/)test-utils\//i.test(t)||/(?:^|\/)testing\//i.test(t))}function Kt(t){return/(?:^|\/)[^/]*worker\.(?:ts|tsx|js|mjs|cjs|rs|py|go)$/.test(t)}function Yt(t){let e=t.split("/"),r=e[e.length-1]??t;return r==="cli.ts"||r==="cli.js"||r==="postinstall.ts"||r==="postinstall.js"||r==="main.ts"||r==="main.js"||r==="main.rs"||r==="main.go"||r==="main.py"||r==="build.rs"||r==="lib.rs"||/\bsrc\/bin\/[^/]+\.rs$/.test(t)||/(?:^|\/)examples\/[^/]+\.rs$/.test(t)||/(?:^|\/)tests\/[^/]+\.rs$/.test(t)||/(?:^|\/)benches\/[^/]+\.rs$/.test(t)?!0:r==="index.ts"||r==="index.js"?/(?:^|\/)(?:apps|services)\/[^/]+\/src\/index\.(?:ts|js)$/.test(t)?!0:e.length<=2:!1}function Zt(t){return t==="index.ts"||t==="index.js"||t.endsWith("/index.ts")||t.endsWith("/index.js")||t.endsWith("/mod.rs")||t.endsWith("/__init__.py")}function qt(t,e){let r=e.lastIndexOf("/");if(r<0)return!1;let n=e.slice(0,r),i=e.slice(r+1);return t.includes(G(n)+"/")&&t.includes(G(i)+".")}function G(t){return/^[A-Za-z0-9_$+-]+$/.test(t)?t:"`"+t.replace(/`/g,"``")+"`"}export{y as a,ee as b,h as c,Rt as d,Ot as e,ye as f,Ee as g,_e as h,Xt as i};
8
+ //# sourceMappingURL=chunk-26QA6FAI.js.map
@@ -1,2 +1,2 @@
1
- import{b as A}from"./chunk-WXAAURU7.js";import{a as _}from"./chunk-52HQTTPB.js";import{f as R,g as L}from"./chunk-JELJLXEE.js";import{c as E}from"./chunk-XVJ3V7LM.js";import{f as x,g as I}from"./chunk-WMXRRBII.js";import{b as D}from"./chunk-B75HZHUP.js";import{a as w}from"./chunk-BGBBVSH4.js";import{d as N}from"./chunk-ZTTISZ7J.js";import{b as T,c as h}from"./chunk-7LABSJSR.js";import{H as S}from"./chunk-B5MHCHP3.js";import{a as g}from"./chunk-64MNV6AB.js";var F={caller:3,"entry-surface":2,rooted:1},O=/not\s*yet\s*implement|not\s*implement|unimplement|\bnyi\b|\btodo\b|\bstub\b|not\s*supported|coming\s*soon/i,P=/^throw\s+new\s+[\w.]*Error\s*\(([\s\S]*)\)\s*;?$/,C=/^return(\s+(null|undefined|false|0|''|""|``|\[\]|\{\}))?\s*;?$/,v=/\/\/\s*TODO\b|\/\*\s*TODO\b/i,K=/(?:=>|\))\s*(?::\s*[^{;=]+)?\s*\{\s*\}\s*;?\s*$/;function et(e,n={}){let{scope:o,limit:r=30,scanLimit:l,semantic:a=!0}=n,s=new E(e),t=D(s.productionCallableDefinitions({scope:o,minLoc:1,requireFunctionLikeSymbol:!0,excludeTypesFiles:!0}),l),c=[];for(let i of t){let m=M(e,i);m&&c.push(m)}if(c.length===0)return[];let d=j(e,c,t),f=c.filter(i=>!d.has(i.def.symbol));if(f.length===0)return[];let p=_(e,s).forDefinitions(f.map(i=>i.def),{semantic:a}),u=[];for(let i of f){let b=p.get(i.def.symbolId)?.realConsumers.length??0,y=B(e,i.def,b);y&&u.push({symbol:i.def.symbol,shortName:N(i.def.symbol),file:i.def.relativePath,startLine:i.def.startLine,endLine:i.def.endLine,loc:w(i.def),stubKind:i.stubKind,reachability:y,callerFanIn:b,stubText:i.stubText})}return u.sort((i,m)=>F[m.reachability]-F[i.reachability]||m.callerFanIn-i.callerFanIn||i.file.localeCompare(m.file)||i.startLine-m.startLine),r?u.slice(0,r):u}function B(e,n,o){return o>0?"caller":I(e,n.symbol,n.relativePath)?"rooted":x(e,n.relativePath)?"entry-surface":null}function M(e,n){let o=R(e,n);if(!o)return null;let r=L(o),l=r.trim();if(l==="")return!z(o)||!A(e,n)?null:{def:n,stubKind:"empty-body",stubText:"(empty body)"};let a=h(r),s=T(r),t=$(a,s);if(t.length!==1)return null;let c=t[0];return U(c)?{def:n,stubKind:"throw-stub",stubText:c.trim()}:v.test(r)&&C.test(c.trim())?{def:n,stubKind:"todo-return-default",stubText:l}:null}function $(e,n){let o=[],r=0,l="";for(let a=0;a<n.length;a+=1){let s=n[a];if(s==="("||s==="["||s==="{"?r+=1:(s===")"||s==="]"||s==="}")&&(r=Math.max(0,r-1)),s===";"&&r===0){o.push(l),l="";continue}l+=e[a]??""}return l.trim()&&o.push(l),o.map(a=>a.trim()).filter(a=>a.length>0)}function U(e){let n=P.exec(e.trim());return n?O.test(n[1]??""):!1}function z(e){return K.test(e.trimEnd())}function j(e,n,o){let r=new Set,l=new Set(n.map(t=>t.def.parentTypeName).filter(t=>t!==null));if(l.size===0)return r;let a=k(e,l),s=new Map;for(let t of o){if(!t.parentTypeName)continue;let c=s.get(t.leaf)??new Set;c.add(t.parentTypeName),s.set(t.leaf,c)}for(let t of n){let c=t.def.parentTypeName;if(!c)continue;let d=a.get(c);if(!d||d.size===0)continue;let f=s.get(t.def.leaf)??new Set;[...d].every(u=>f.has(u))&&r.add(t.def.symbol)}return r}var Y=/\bclass\s+([A-Za-z_$][\w$]*)\s+extends\s+([A-Za-z_$][\w$]*)/g;function k(e,n){let o=new Map;for(let r of g(e,{includeIgnored:!1})){let l=S(e,r);if(l)for(let a of l.matchAll(Y)){let s=a[1],t=a[2];if(!s||!t||!n.has(t))continue;let c=o.get(t)??new Set;c.add(s),o.set(t,c)}}return o}export{et as a};
2
- //# sourceMappingURL=chunk-J7VT2CRB.js.map
1
+ import{b as A}from"./chunk-6O5TICIZ.js";import{a as _}from"./chunk-MV7OWDUX.js";import{f as R,g as L}from"./chunk-JVYA47YU.js";import{c as E}from"./chunk-UJCOIXDY.js";import{g as x,h as I}from"./chunk-26QA6FAI.js";import{b as D}from"./chunk-B75HZHUP.js";import{a as w}from"./chunk-BGBBVSH4.js";import{d as N}from"./chunk-EKZTZXHZ.js";import{b as T,c as h}from"./chunk-UJPRPGCO.js";import{J as S}from"./chunk-WCCFZ7V7.js";import{a as g}from"./chunk-NGEXCJJW.js";var F={caller:3,"entry-surface":2,rooted:1},O=/not\s*yet\s*implement|not\s*implement|unimplement|\bnyi\b|\btodo\b|\bstub\b|not\s*supported|coming\s*soon/i,P=/^throw\s+new\s+[\w.]*Error\s*\(([\s\S]*)\)\s*;?$/,C=/^return(\s+(null|undefined|false|0|''|""|``|\[\]|\{\}))?\s*;?$/,v=/\/\/\s*TODO\b|\/\*\s*TODO\b/i,K=/(?:=>|\))\s*(?::\s*[^{;=]+)?\s*\{\s*\}\s*;?\s*$/;function et(e,n={}){let{scope:o,limit:r=30,scanLimit:l,semantic:a=!0}=n,s=new E(e),t=D(s.productionCallableDefinitions({scope:o,minLoc:1,requireFunctionLikeSymbol:!0,excludeTypesFiles:!0}),l),c=[];for(let i of t){let m=M(e,i);m&&c.push(m)}if(c.length===0)return[];let d=j(e,c,t),f=c.filter(i=>!d.has(i.def.symbol));if(f.length===0)return[];let p=_(e,s).forDefinitions(f.map(i=>i.def),{semantic:a}),u=[];for(let i of f){let b=p.get(i.def.symbolId)?.realConsumers.length??0,y=B(e,i.def,b);y&&u.push({symbol:i.def.symbol,shortName:N(i.def.symbol),file:i.def.relativePath,startLine:i.def.startLine,endLine:i.def.endLine,loc:w(i.def),stubKind:i.stubKind,reachability:y,callerFanIn:b,stubText:i.stubText})}return u.sort((i,m)=>F[m.reachability]-F[i.reachability]||m.callerFanIn-i.callerFanIn||i.file.localeCompare(m.file)||i.startLine-m.startLine),r?u.slice(0,r):u}function B(e,n,o){return o>0?"caller":I(e,n.symbol,n.relativePath)?"rooted":x(e,n.relativePath)?"entry-surface":null}function M(e,n){let o=R(e,n);if(!o)return null;let r=L(o),l=r.trim();if(l==="")return!z(o)||!A(e,n)?null:{def:n,stubKind:"empty-body",stubText:"(empty body)"};let a=h(r),s=T(r),t=$(a,s);if(t.length!==1)return null;let c=t[0];return U(c)?{def:n,stubKind:"throw-stub",stubText:c.trim()}:v.test(r)&&C.test(c.trim())?{def:n,stubKind:"todo-return-default",stubText:l}:null}function $(e,n){let o=[],r=0,l="";for(let a=0;a<n.length;a+=1){let s=n[a];if(s==="("||s==="["||s==="{"?r+=1:(s===")"||s==="]"||s==="}")&&(r=Math.max(0,r-1)),s===";"&&r===0){o.push(l),l="";continue}l+=e[a]??""}return l.trim()&&o.push(l),o.map(a=>a.trim()).filter(a=>a.length>0)}function U(e){let n=P.exec(e.trim());return n?O.test(n[1]??""):!1}function z(e){return K.test(e.trimEnd())}function j(e,n,o){let r=new Set,l=new Set(n.map(t=>t.def.parentTypeName).filter(t=>t!==null));if(l.size===0)return r;let a=k(e,l),s=new Map;for(let t of o){if(!t.parentTypeName)continue;let c=s.get(t.leaf)??new Set;c.add(t.parentTypeName),s.set(t.leaf,c)}for(let t of n){let c=t.def.parentTypeName;if(!c)continue;let d=a.get(c);if(!d||d.size===0)continue;let f=s.get(t.def.leaf)??new Set;[...d].every(u=>f.has(u))&&r.add(t.def.symbol)}return r}var Y=/\bclass\s+([A-Za-z_$][\w$]*)\s+extends\s+([A-Za-z_$][\w$]*)/g;function k(e,n){let o=new Map;for(let r of g(e,{includeIgnored:!1})){let l=S(e,r);if(l)for(let a of l.matchAll(Y)){let s=a[1],t=a[2];if(!s||!t||!n.has(t))continue;let c=o.get(t)??new Set;c.add(s),o.set(t,c)}}return o}export{et as a};
2
+ //# sourceMappingURL=chunk-2HPVVXM5.js.map
@@ -0,0 +1,2 @@
1
+ import{closeSync as p,fstatSync as g,openSync as l,readFileSync as B,readSync as y}from"fs";import{createHash as P}from"crypto";var h=8*1024*1024,A=64*1024*1024,F=512*1024*1024,L=256*1024*1024,c=class extends Error{constructor(r,o,i,n,a){let s=i==="too-large"?`is ${n} bytes; the safety limit is ${a} bytes`:i==="not-regular"?"is not a regular file":"changed while it was being read";super(`${r} ${JSON.stringify(o)} ${s}`);this.inputKind=r;this.inputPath=o;this.reason=i;this.observedBytes=n;this.limitBytes=a;this.name="BoundedFileReadError"}inputKind;inputPath;reason;observedBytes;limitBytes;code="SCIP_QUERY_BOUNDED_FILE_READ"};function x(e,t){m(t.maxBytes);let r=String(e),o=l(e,"r");try{let i=g(o);R(i,t,r);let n=B(o),a=g(o);if(a.dev!==i.dev||a.ino!==i.ino||a.size!==i.size||n.byteLength!==i.size)throw new c(t.inputKind,r,"changed-during-read",a.size,t.maxBytes);return n}finally{p(o)}}function b(e,t,r="utf8"){return x(e,t).toString(r)}function T(e,t){return b(e,{maxBytes:h,inputKind:t})}function f(e,t){m(t.maxBytes);let r=[],o=Buffer.allocUnsafe(64*1024),i=0;for(;;){let n=y(e,o,0,o.length,null);if(n===0)break;if(i+=n,!Number.isSafeInteger(i)||i>t.maxBytes)throw new c(t.inputKind,`file descriptor ${e}`,"too-large",i,t.maxBytes);r.push(Buffer.from(o.subarray(0,n)))}return Buffer.concat(r,i)}function v(e,t,r="utf8"){return f(e,t).toString(r)}function S(e,t){let r=l(e,"r");try{return f(r,t)}finally{p(r)}}function k(e,t,r="utf8"){return S(e,t).toString(r)}function C(e,t,r){m(t.maxBytes);let o=String(e),i=l(e,"r");try{let n=g(i);R(n,t,o);let a=Buffer.allocUnsafe(Math.min(1024*1024,Math.max(1,n.size))),s=0;for(;s<n.size;){let d=y(i,a,0,Math.min(a.length,n.size-s),s);if(d===0)break;r(a.subarray(0,d)),s+=d}let u=g(i);if(u.dev!==n.dev||u.ino!==n.ino||u.size!==n.size||s!==n.size)throw new c(t.inputKind,o,"changed-during-read",u.size,t.maxBytes);return s}finally{p(i)}}function E(e,t){let r=P("sha256");return C(e,t,o=>r.update(o)),r.digest("hex")}function R(e,t,r){if(!e.isFile())throw new c(t.inputKind,r,"not-regular",Number(e.size),t.maxBytes);if(e.size>t.maxBytes)throw new c(t.inputKind,r,"too-large",Number(e.size),t.maxBytes)}function m(e){if(!Number.isSafeInteger(e)||e<0)throw new RangeError(`maxBytes must be a non-negative safe integer; received ${e}`)}function D(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function W(e){return typeof e=="string"&&Number.isFinite(Date.parse(e))}function z(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0}var K=["typescript","javascript","java","scala","kotlin","rust","python","ruby","go","cpp","c","csharp","vb","dart","php","clojure"],Y=["entry-surface","generated-code","compatibility-shim","reflection-or-registration","test-fixture","intentional-twin","historical-coupling-ended","detector-counterexample"];export{D as a,W as b,z as c,K as d,Y as e,h as f,A as g,F as h,L as i,c as j,x as k,b as l,T as m,v as n,k as o,C as p,E as q};
2
+ //# sourceMappingURL=chunk-2KAZEZ6M.js.map
@@ -0,0 +1,40 @@
1
+ import{b as y}from"./chunk-6O5TICIZ.js";import{b as f}from"./chunk-T7YQSHPQ.js";import{c as h,d as w}from"./chunk-MTDBHTSF.js";import{d as u,e as m,h as b,p,q as g}from"./chunk-EKZTZXHZ.js";import{dirname as $,isAbsolute as k,relative as x,resolve as v}from"path";var C=new Set(w());function R(t,e){return`tests/generated/twin-ab/${d(t)}-vs-${d(e)}.test.ts`}function d(t){return(t.split(/[/#]/).pop()||t).replace(/[^A-Za-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"symbol"}function P(t,e,a,n){let{refA:l,refB:s,outFile:r}=typeof e=="string"?{refA:e,refB:a,outFile:n}:e;if(typeof l!="string"||typeof s!="string"||typeof r!="string")throw new TypeError("twinAb requires refA, refB, and outFile.");if(!k(r))throw new TypeError("twinAb outFile must be an absolute path.");let i=A(t,l);if(!i.ok)return i;let o=A(t,s);if(!o.ok)return o;let c=i.symbol.paramCount===null||o.symbol.paramCount===null?null:i.symbol.paramCount===o.symbol.paramCount,S=N(i.symbol,o.symbol,t.config.projectRoot,r,c);return{ok:!0,a:i.symbol,b:o.symbol,signatureCompatible:c,testSource:S}}function A(t,e){let n=f(t,e).match;if(!n)return{ok:!1,reason:`${e} does not resolve to an indexed symbol.`};let s=t.get("SELECT kind FROM global_symbols WHERE id = ?",n.symbolId)?.kind??null;if(!(s!==null?C.has(s):b(n.symbol)))return{ok:!1,reason:`${e} resolves to ${u(n.symbol)}${s!==null?` with SCIP kind ${h(s)}`:""} \u2014 twin-ab compares call outputs, so both referents must be functions or methods.`};if(!y(t,n))return{ok:!1,reason:`${e} (${u(n.symbol)} at ${n.relativePath}:${n.startLine+1}) is not exported \u2014 twin-ab needs an importable named binding for both twins.`};let i=t.get("SELECT documentation FROM global_symbols WHERE id = ?",n.symbolId),o=p(g(i?.documentation??null));return{ok:!0,symbol:{ref:e,symbol:n.symbol,shortName:m(n.symbol)||u(n.symbol),file:n.relativePath,startLine:n.startLine,signature:o,paramCount:o?E(o):null}}}function E(t){let e=t.indexOf("(");if(e===-1)return null;let a=0,n=-1;for(let i=e;i<t.length;i+=1){let o=t[i];if(o==="(")a+=1;else if(o===")"&&(a-=1,a===0)){n=i;break}}if(n===-1)return null;let l=t.slice(e+1,n).trim();if(!l)return 0;let s=1,r=0;for(let i of l)i==="("||i==="["||i==="{"?r+=1:i===")"||i==="]"||i==="}"?r=Math.max(0,r-1):i===","&&r===0&&(s+=1);return s}function T(t,e,a){let n=$(e),l=v(t,a),r=x(n,l).replace(/\\/g,"/").replace(/\.tsx?$/,".js");return r.startsWith(".")?r:`./${r}`}function N(t,e,a,n,l){let s=T(a,n,t.file),r=T(a,n,e.file),i=l===null?"Signature comparison: unknown (one or both signatures unavailable in the index) \u2014 check by hand.":l?"Signature comparison: param counts match.":"Signature comparison: param counts DIFFER \u2014 twins may not be directly comparable; check by hand.";return`/**
2
+ * Generated by 'scip-query twin-ab'. scip-audit integrity scenario.
3
+ * ("cross-examine same-concept twins"): where one concept is computed in
4
+ * more than one place, feed both the same input and require the same
5
+ * answer. Disagreement between twins means at least one is wrong \u2014
6
+ * determine which before consolidating.
7
+ *
8
+ * Twin A: ${t.shortName} (${t.file}:${t.startLine+1})
9
+ * ${t.signature??"(signature unavailable)"}
10
+ * Twin B: ${e.shortName} (${e.file}:${e.startLine+1})
11
+ * ${e.signature??"(signature unavailable)"}
12
+ * ${i}
13
+ *
14
+ * Fill in the TODO input table below with inputs both twins should agree
15
+ * on, then run this file with vitest.
16
+ */
17
+ import { describe, expect, it } from 'vitest';
18
+ import { ${t.shortName} as twinA } from '${s}';
19
+ import { ${e.shortName} as twinB } from '${r}';
20
+
21
+ // TODO: fill in shared inputs both twins should agree on \u2014 one arg array per call.
22
+ const inputs: any[][] = [
23
+ // [/* arg1, arg2, ... */],
24
+ ];
25
+
26
+ // Cast to a variadic signature so the input table can hold any arg shape \u2014
27
+ // the real twins have fixed, non-rest parameter lists, and TS rejects
28
+ // spreading a generic args array into those (TS2556) even when the array
29
+ // itself is 'any'; casting the callee's signature, not the args, satisfies
30
+ // the checker without weakening the twins' real exported types elsewhere.
31
+ const callA = twinA as (...callArgs: any[]) => any;
32
+ const callB = twinB as (...callArgs: any[]) => any;
33
+
34
+ describe.skipIf(inputs.length === 0)('twin-ab: ${t.shortName} vs ${e.shortName}', () => {
35
+ it.each(inputs)('agrees on input %#', (...args) => {
36
+ expect(callA(...args)).toEqual(callB(...args));
37
+ });
38
+ });
39
+ `}export{R as a,P as b};
40
+ //# sourceMappingURL=chunk-32LVLCLN.js.map
@@ -1,2 +1,2 @@
1
- import{b as i}from"./chunk-26X7KCJR.js";function l(n,o,s,t={}){let e=i(n,o,s,t);return e?{symbolA:e.symbolA,symbolB:e.symbolB,similarity:e.similarity,sharedCallees:e.sharedEvidence,uniqueToA:e.uniqueToA,uniqueToB:e.uniqueToB,consolidationStrategy:e.consolidationStrategy}:null}export{l as a};
2
- //# sourceMappingURL=chunk-2CVXCGL4.js.map
1
+ import{b as i}from"./chunk-Y2MVPNKY.js";function l(n,o,s,t={}){let e=i(n,o,s,t);return e?{symbolA:e.symbolA,symbolB:e.symbolB,similarity:e.similarity,sharedCallees:e.sharedEvidence,uniqueToA:e.uniqueToA,uniqueToB:e.uniqueToB,consolidationStrategy:e.consolidationStrategy}:null}export{l as a};
2
+ //# sourceMappingURL=chunk-3CLX5EOX.js.map