scip-query 0.19.5 → 0.19.6

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 (401) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/README.md +241 -48
  3. package/dist/augment-vue-worker.js +1 -1
  4. package/dist/{chunk-2YU7I3QO.js → chunk-24QNP7MN.js} +2 -2
  5. package/dist/{chunk-CNKAGUPL.js → chunk-26X7KCJR.js} +2 -2
  6. package/dist/{chunk-GPBBJ5Y4.js → chunk-273W2U4Y.js} +3 -3
  7. package/dist/{chunk-7GXM52MI.js → chunk-2CVXCGL4.js} +2 -2
  8. package/dist/{chunk-ABMYA4TN.js → chunk-2EZSOTSY.js} +2 -2
  9. package/dist/{chunk-HKEHS2AS.js → chunk-2GSQR6YA.js} +2 -2
  10. package/dist/{chunk-FECYOO5O.js → chunk-2OXVAGGT.js} +2 -2
  11. package/dist/chunk-2ZOCHAL2.js +8 -0
  12. package/dist/{chunk-QGXBRIM5.js → chunk-336DC5NJ.js} +2 -2
  13. package/dist/chunk-35SQLYCQ.js +2 -0
  14. package/dist/{chunk-VXQNNXJE.js → chunk-3OIKRYU5.js} +2 -2
  15. package/dist/{chunk-52ZYCAEO.js → chunk-47X75ZKH.js} +2 -2
  16. package/dist/{chunk-NPKYOIFM.js → chunk-4CGVLUDP.js} +2 -2
  17. package/dist/chunk-4RI4BJGT.js +8 -0
  18. package/dist/{chunk-P2PC2WGR.js → chunk-52HQTTPB.js} +2 -2
  19. package/dist/{chunk-YNRNA5LK.js → chunk-5OC3HWP5.js} +2 -2
  20. package/dist/{chunk-STOL2BTL.js → chunk-6XFC7PQ5.js} +2 -2
  21. package/dist/{chunk-J77UIT3I.js → chunk-6XHTISLI.js} +2 -2
  22. package/dist/chunk-6YTSKJJ3.js +2 -0
  23. package/dist/{chunk-BTEE5NZQ.js → chunk-7E3TH5ZN.js} +2 -2
  24. package/dist/{chunk-X6D5IC6I.js → chunk-7LABSJSR.js} +2 -2
  25. package/dist/chunk-7Q6VYYCH.js +2 -0
  26. package/dist/{chunk-FWUUZTIO.js → chunk-A43URCQ3.js} +2 -2
  27. package/dist/chunk-A63U2W3P.js +3 -0
  28. package/dist/{chunk-3MJ5YA4Y.js → chunk-ADFSIJP2.js} +2 -2
  29. package/dist/chunk-AOLE4DYM.js +6 -0
  30. package/dist/chunk-APMMR5Y2.js +2 -0
  31. package/dist/chunk-B5MHCHP3.js +107 -0
  32. package/dist/{chunk-4RSI5EMG.js → chunk-CSTYYXKC.js} +2 -2
  33. package/dist/{chunk-25LPM4DG.js → chunk-CYJM7CYF.js} +2 -2
  34. package/dist/{chunk-S44IULR6.js → chunk-DD5BOU5I.js} +2 -2
  35. package/dist/{chunk-YGAGTIDK.js → chunk-DGMCFMPG.js} +7 -7
  36. package/dist/{chunk-UOAV44HR.js → chunk-E2ZXPB7J.js} +2 -2
  37. package/dist/{chunk-IZKFSVBV.js → chunk-EVOC5I5I.js} +2 -2
  38. package/dist/{chunk-XTX6QHOF.js → chunk-F42A3AKG.js} +2 -2
  39. package/dist/{chunk-Q4IIEGXJ.js → chunk-FHCTEANE.js} +2 -2
  40. package/dist/{chunk-3SVWW4PN.js → chunk-FKGN4A4E.js} +2 -2
  41. package/dist/{chunk-IG7N5ZIK.js → chunk-FQTPPXNA.js} +2 -2
  42. package/dist/{chunk-F6O7AAC3.js → chunk-G4UQL4CP.js} +2 -2
  43. package/dist/chunk-GA64UPMI.js +6 -0
  44. package/dist/{chunk-ZXJYMGD3.js → chunk-GK3GRUJX.js} +2 -2
  45. package/dist/chunk-HEBAY673.js +2 -0
  46. package/dist/chunk-HELS7KFF.js +2 -0
  47. package/dist/{chunk-B5NLK2B3.js → chunk-IPDCSB6N.js} +2 -2
  48. package/dist/{chunk-M7MTH5NR.js → chunk-IYAOX36F.js} +2 -2
  49. package/dist/{chunk-YVVCVR2L.js → chunk-J7VT2CRB.js} +2 -2
  50. package/dist/{chunk-4333ETTV.js → chunk-JELJLXEE.js} +2 -2
  51. package/dist/{chunk-LBMJEAEW.js → chunk-JERWGHQT.js} +2 -2
  52. package/dist/chunk-JJJCO4QC.js +945 -0
  53. package/dist/{chunk-6E7UTQY7.js → chunk-JZNLMHWY.js} +2 -2
  54. package/dist/{chunk-R4FQGQ4X.js → chunk-K42M2KWT.js} +2 -2
  55. package/dist/{chunk-H7UKLTWJ.js → chunk-KLVJABXA.js} +2 -2
  56. package/dist/chunk-KP4KBDVF.js +3 -0
  57. package/dist/{chunk-RV2FQIX3.js → chunk-LMFVTUW2.js} +2 -2
  58. package/dist/chunk-LRTP3DKL.js +3 -0
  59. package/dist/{chunk-U6WNH5GC.js → chunk-MGBJHRFB.js} +2 -2
  60. package/dist/{chunk-QDV6RDCP.js → chunk-MLGTCX56.js} +2 -2
  61. package/dist/{chunk-54HA4ZXH.js → chunk-N3SE646F.js} +2 -2
  62. package/dist/{chunk-KP6XRY5Z.js → chunk-NBRUH7OE.js} +2 -2
  63. package/dist/{chunk-M7AIS73L.js → chunk-NN4ZIRPK.js} +2 -2
  64. package/dist/{chunk-I5RJM53C.js → chunk-NQLSSVOB.js} +2 -2
  65. package/dist/{chunk-4SALD7RU.js → chunk-OBKDTVZ3.js} +2 -2
  66. package/dist/{chunk-GBQ5NYPR.js → chunk-OHWZKLVA.js} +6 -6
  67. package/dist/{chunk-6NSFJYRC.js → chunk-OP3MTFJR.js} +2 -2
  68. package/dist/{chunk-EOOJGLDU.js → chunk-OQ2A4G2G.js} +2 -2
  69. package/dist/{chunk-DLWR3NUU.js → chunk-P6HBYNBE.js} +2 -2
  70. package/dist/{chunk-QVWS2VWZ.js → chunk-PC44K7RF.js} +2 -2
  71. package/dist/{chunk-A2EZV2UM.js → chunk-QBYYWGAT.js} +2 -2
  72. package/dist/{chunk-QRGV2F7L.js → chunk-QHKUY4FW.js} +2 -2
  73. package/dist/chunk-QHRL4LKM.js +2 -0
  74. package/dist/{chunk-I5AWSI2G.js → chunk-QQWOFXNW.js} +2 -2
  75. package/dist/{chunk-WQTAC523.js → chunk-RBFFD4V2.js} +2 -2
  76. package/dist/{chunk-SOAT6NLA.js → chunk-RJHCPSZ7.js} +2 -2
  77. package/dist/{chunk-VGRICIQI.js → chunk-RWRLUZ6U.js} +2 -2
  78. package/dist/{chunk-4T3LTWUS.js → chunk-S2GP3CU3.js} +2 -2
  79. package/dist/{chunk-HEXVUYFQ.js → chunk-SHKZ7OVJ.js} +2 -2
  80. package/dist/{chunk-NSS46APD.js → chunk-TFUU5MQQ.js} +2 -2
  81. package/dist/{chunk-IUFDSKGG.js → chunk-TYQ76QHQ.js} +2 -2
  82. package/dist/{chunk-NRCXJDHL.js → chunk-U5CNPPTZ.js} +2 -2
  83. package/dist/{chunk-MITTUCEH.js → chunk-UQK5CRUK.js} +2 -2
  84. package/dist/{chunk-XLTP42QA.js → chunk-UUJBLG6J.js} +2 -2
  85. package/dist/chunk-UXP636P5.js +144 -0
  86. package/dist/{chunk-64RFXJT5.js → chunk-VEVBIAOJ.js} +6 -6
  87. package/dist/chunk-VKRQDBW5.js +9 -0
  88. package/dist/{chunk-C7NIYIQ4.js → chunk-VOQFGC2W.js} +4 -4
  89. package/dist/{chunk-DZ74OMG6.js → chunk-VP542C25.js} +2 -2
  90. package/dist/{chunk-Q3AFUTGB.js → chunk-WMXRRBII.js} +2 -2
  91. package/dist/{chunk-ZGZUZ7XE.js → chunk-WXAAURU7.js} +2 -2
  92. package/dist/chunk-X3NLZHPA.js +20 -0
  93. package/dist/{chunk-WER3B7MI.js → chunk-XF3KLXN3.js} +2 -2
  94. package/dist/{chunk-NH5ALKPW.js → chunk-XVJ3V7LM.js} +2 -2
  95. package/dist/{chunk-4XTA5OMB.js → chunk-YGQN3XGZ.js} +2 -2
  96. package/dist/{chunk-CFMXJPHH.js → chunk-YHXBD52M.js} +2 -2
  97. package/dist/{chunk-7B3UPBVA.js → chunk-YLVE3SXZ.js} +2 -2
  98. package/dist/{chunk-YIJ7ZAA4.js → chunk-YTUD45PU.js} +2 -2
  99. package/dist/{chunk-VTKGCT3V.js → chunk-YWB2EBNB.js} +2 -2
  100. package/dist/{chunk-UKZBVX4U.js → chunk-Z2LHPIOM.js} +2 -2
  101. package/dist/chunk-Z5QQPJ3U.js +30 -0
  102. package/dist/{chunk-NZL2DBT7.js → chunk-ZLJLE6LK.js} +2 -2
  103. package/dist/{chunk-XYADIZHU.js → chunk-ZTTISZ7J.js} +2 -2
  104. package/dist/cli.js +3 -3
  105. package/dist/command-descriptors-SJDZ7QGR.js +617 -0
  106. package/dist/{config-types-D20KuvvZ.d.ts → config-types-BWQ5xPGI.d.ts} +4 -0
  107. package/dist/{db-G_II8yXU.d.ts → db-B0r1o7Vt.d.ts} +18 -1
  108. package/dist/direct-navigation-HTKOZEOM.js +3 -0
  109. package/dist/{health-oblXYgkF.d.ts → health-CFnlCiTz.d.ts} +1 -1
  110. package/dist/index.d.ts +2 -2
  111. package/dist/index.js +1 -1
  112. package/dist/postinstall.js +1 -1
  113. package/dist/queries/affected.d.ts +2 -2
  114. package/dist/queries/affected.js +1 -1
  115. package/dist/queries/architecture.d.ts +2 -2
  116. package/dist/queries/architecture.js +1 -1
  117. package/dist/queries/bottlenecks.d.ts +2 -2
  118. package/dist/queries/bottlenecks.js +1 -1
  119. package/dist/queries/by-kind.d.ts +2 -2
  120. package/dist/queries/by-kind.js +1 -1
  121. package/dist/queries/call-graph.d.ts +2 -2
  122. package/dist/queries/call-graph.js +1 -1
  123. package/dist/queries/change-surface.d.ts +2 -2
  124. package/dist/queries/change-surface.js +1 -1
  125. package/dist/queries/cleanup-plan.d.ts +2 -2
  126. package/dist/queries/cleanup-plan.js +1 -1
  127. package/dist/queries/co-change.d.ts +2 -2
  128. package/dist/queries/co-change.js +1 -1
  129. package/dist/queries/code.d.ts +2 -2
  130. package/dist/queries/code.js +1 -1
  131. package/dist/queries/complexity-hotspots.d.ts +2 -2
  132. package/dist/queries/complexity-hotspots.js +1 -1
  133. package/dist/queries/complexity.d.ts +2 -2
  134. package/dist/queries/complexity.js +1 -1
  135. package/dist/queries/convergence.d.ts +2 -2
  136. package/dist/queries/convergence.js +1 -1
  137. package/dist/queries/coupling.d.ts +2 -2
  138. package/dist/queries/coupling.js +1 -1
  139. package/dist/queries/cycles.d.ts +2 -2
  140. package/dist/queries/cycles.js +1 -1
  141. package/dist/queries/dataflow.d.ts +2 -2
  142. package/dist/queries/dataflow.js +1 -1
  143. package/dist/queries/dead.d.ts +2 -2
  144. package/dist/queries/dead.js +1 -1
  145. package/dist/queries/decorative-checkers.d.ts +3 -3
  146. package/dist/queries/decorative-checkers.js +1 -1
  147. package/dist/queries/deep-chains.d.ts +2 -2
  148. package/dist/queries/deep-chains.js +1 -1
  149. package/dist/queries/deps.d.ts +2 -2
  150. package/dist/queries/deps.js +1 -1
  151. package/dist/queries/diff-gate.d.ts +30 -2
  152. package/dist/queries/diff-gate.js +1 -1
  153. package/dist/queries/diff-impact.d.ts +2 -2
  154. package/dist/queries/diff-impact.js +1 -1
  155. package/dist/queries/doc-drift.d.ts +2 -2
  156. package/dist/queries/doc-drift.js +1 -1
  157. package/dist/queries/drift.d.ts +2 -2
  158. package/dist/queries/drift.js +1 -1
  159. package/dist/queries/duplicate-bodies.d.ts +2 -2
  160. package/dist/queries/duplicate-bodies.js +1 -1
  161. package/dist/queries/extract-candidates.d.ts +2 -2
  162. package/dist/queries/extract-candidates.js +1 -1
  163. package/dist/queries/fan.d.ts +2 -2
  164. package/dist/queries/fan.js +1 -1
  165. package/dist/queries/files.d.ts +2 -2
  166. package/dist/queries/health.d.ts +3 -3
  167. package/dist/queries/health.js +1 -1
  168. package/dist/queries/hierarchy.d.ts +2 -2
  169. package/dist/queries/hierarchy.js +1 -1
  170. package/dist/queries/hotspots.d.ts +2 -2
  171. package/dist/queries/hotspots.js +1 -1
  172. package/dist/queries/imports.d.ts +2 -2
  173. package/dist/queries/imports.js +1 -1
  174. package/dist/queries/incomplete-migration.d.ts +2 -2
  175. package/dist/queries/incomplete-migration.js +1 -1
  176. package/dist/queries/index.d.ts +17 -3
  177. package/dist/queries/index.js +1 -1
  178. package/dist/queries/isolated.d.ts +2 -2
  179. package/dist/queries/isolated.js +1 -1
  180. package/dist/queries/locality-candidates.d.ts +2 -2
  181. package/dist/queries/locality-candidates.js +1 -1
  182. package/dist/queries/members.d.ts +2 -2
  183. package/dist/queries/members.js +1 -1
  184. package/dist/queries/methods.d.ts +2 -2
  185. package/dist/queries/methods.js +1 -1
  186. package/dist/queries/not-implemented.d.ts +3 -3
  187. package/dist/queries/not-implemented.js +1 -1
  188. package/dist/queries/outline.d.ts +2 -2
  189. package/dist/queries/outline.js +1 -1
  190. package/dist/queries/passthrough-candidates.d.ts +2 -2
  191. package/dist/queries/passthrough-candidates.js +1 -1
  192. package/dist/queries/plan-context.d.ts +2 -2
  193. package/dist/queries/plan-context.js +1 -1
  194. package/dist/queries/react-component-duplicates.d.ts +2 -2
  195. package/dist/queries/react-component-duplicates.js +1 -1
  196. package/dist/queries/react-hook-candidates.d.ts +2 -2
  197. package/dist/queries/react-hook-candidates.js +1 -1
  198. package/dist/queries/react-large-component-pressure.d.ts +2 -2
  199. package/dist/queries/react-large-component-pressure.js +1 -1
  200. package/dist/queries/recent-duplicates.d.ts +2 -2
  201. package/dist/queries/recent-duplicates.js +1 -1
  202. package/dist/queries/redundant-reexports.d.ts +2 -2
  203. package/dist/queries/redundant-reexports.js +1 -1
  204. package/dist/queries/refs.d.ts +2 -2
  205. package/dist/queries/refs.js +1 -1
  206. package/dist/queries/self-audit.d.ts +2 -2
  207. package/dist/queries/self-audit.js +1 -1
  208. package/dist/queries/similar-chains.d.ts +2 -2
  209. package/dist/queries/similar-chains.js +1 -1
  210. package/dist/queries/similar-files.d.ts +2 -2
  211. package/dist/queries/similar-files.js +1 -1
  212. package/dist/queries/similar-signatures.d.ts +2 -2
  213. package/dist/queries/similar-signatures.js +1 -1
  214. package/dist/queries/similar.d.ts +2 -2
  215. package/dist/queries/similar.js +1 -1
  216. package/dist/queries/slice.d.ts +2 -2
  217. package/dist/queries/slice.js +1 -1
  218. package/dist/queries/stale-abstractions.d.ts +2 -2
  219. package/dist/queries/stale-abstractions.js +1 -1
  220. package/dist/queries/stats.d.ts +2 -2
  221. package/dist/queries/stats.js +1 -1
  222. package/dist/queries/surface.d.ts +2 -2
  223. package/dist/queries/surface.js +1 -1
  224. package/dist/queries/symbols.d.ts +2 -2
  225. package/dist/queries/symbols.js +1 -1
  226. package/dist/queries/system.d.ts +2 -2
  227. package/dist/queries/system.js +1 -1
  228. package/dist/queries/test-quality.d.ts +2 -2
  229. package/dist/queries/test-quality.js +1 -1
  230. package/dist/queries/trace.d.ts +2 -2
  231. package/dist/queries/trace.js +1 -1
  232. package/dist/queries/twin-ab.d.ts +3 -3
  233. package/dist/queries/twin-ab.js +1 -1
  234. package/dist/queries/twin-drift.d.ts +2 -2
  235. package/dist/queries/twin-drift.js +1 -1
  236. package/dist/queries/unused-imports.d.ts +2 -2
  237. package/dist/queries/unused-imports.js +1 -1
  238. package/dist/queries/unused-params.d.ts +2 -2
  239. package/dist/queries/unused-params.js +1 -1
  240. package/dist/queries/vue-component-duplicates.d.ts +2 -2
  241. package/dist/queries/vue-component-duplicates.js +1 -1
  242. package/dist/queries/vue-composable-candidates.d.ts +2 -2
  243. package/dist/queries/vue-composable-candidates.js +1 -1
  244. package/dist/queries/vue-large-view-pressure.d.ts +2 -2
  245. package/dist/queries/vue-large-view-pressure.js +1 -1
  246. package/dist/queries/wrapper-candidates.d.ts +2 -2
  247. package/dist/queries/wrapper-candidates.js +1 -1
  248. package/dist/reindex-worker.js +23 -24
  249. package/dist/reindex.d.ts +10 -4
  250. package/dist/reindex.js +33 -38
  251. package/dist/runtime.d.ts +167 -11
  252. package/dist/runtime.js +3 -2
  253. package/dist/rust-semantic-session-server.js +1 -1
  254. package/dist/rust-semantic-session-worker.js +1 -1
  255. package/dist/rust-semantic-worker.js +1 -1
  256. package/dist/{scip-cli-kRpaexVJ.d.ts → scip-cli-DCvnlZCu.d.ts} +5 -1
  257. package/dist/watch-server.js +5 -5
  258. package/docs/AGENT_GUIDE.md +1 -1
  259. package/docs/AI_FAILURE_MODES.md +17 -17
  260. package/docs/API_EVOLUTION.md +71 -0
  261. package/docs/CLI_JSON_OUTPUT.md +83 -0
  262. package/docs/COMMAND_REFERENCE.md +5 -3
  263. package/docs/COMMITTED_RECORD_COMPATIBILITY.md +117 -0
  264. package/docs/CONFIGURATION_WRITE_SAFETY.md +130 -0
  265. package/docs/DETECTOR_GUIDE.md +46 -46
  266. package/docs/DURABILITY.md +103 -0
  267. package/docs/INDEX_GENERATIONS.md +121 -0
  268. package/docs/LOCK_PROTOCOL.md +133 -0
  269. package/docs/MAILBOX_LIFECYCLE.md +197 -0
  270. package/docs/REINDEX_METADATA_COMPATIBILITY.md +84 -0
  271. package/docs/RUST_DURABLE_SESSION_PROTOCOL.md +126 -0
  272. package/docs/TELEMETRY_RETENTION.md +72 -0
  273. package/docs/TIME_SEMANTICS.md +77 -0
  274. package/docs/WATCH_REFRESH_REQUESTS.md +110 -0
  275. package/docs/WINDOWS_SIDECAR_RELEASE.md +298 -0
  276. package/docs/analyzer-validation-ledger.md +24 -23
  277. package/docs/schemas/cli-json-envelope.schema.json +53 -0
  278. package/docs/schemas/npm-release-state.schema.json +146 -0
  279. package/docs/schemas/outcome-event-record.schema.json +39 -0
  280. package/docs/schemas/project-config.schema.json +247 -0
  281. package/docs/schemas/suppression-record.schema.json +31 -0
  282. package/docs/schemas/windows-sidecar-provenance.schema.json +137 -0
  283. package/package.json +15 -5
  284. package/scripts/build-scip-windows.mjs +180 -61
  285. package/scripts/scip-windows-provenance.mjs +364 -0
  286. package/scripts/verify-scip-windows.mjs +29 -0
  287. package/skills/_shared/SKILL.md +88 -229
  288. package/skills/_shared/agents/openai.yaml +1 -1
  289. package/skills/_shared/references/agent-contract-catalog.md +105 -0
  290. package/skills/_shared/references/command-catalog.md +118 -0
  291. package/skills/_shared/references/detector-precision-and-diffgate.md +59 -0
  292. package/skills/_shared/references/evidence-and-dead-code.md +25 -0
  293. package/skills/scip-audit/SKILL.md +76 -0
  294. package/skills/scip-audit/agents/openai.yaml +4 -0
  295. package/skills/scip-audit/references/claims.md +98 -0
  296. package/skills/scip-audit/references/cleanup.md +101 -0
  297. package/skills/scip-audit/references/directory.md +222 -0
  298. package/skills/scip-audit/references/frontend.md +130 -0
  299. package/skills/scip-audit/references/integrity.md +154 -0
  300. package/skills/scip-audit/references/maintainability.md +162 -0
  301. package/skills/scip-audit/references/twin-drift.md +104 -0
  302. package/skills/scip-diagnose/SKILL.md +52 -0
  303. package/skills/scip-diagnose/agents/openai.yaml +4 -0
  304. package/skills/scip-diagnose/references/debug.md +117 -0
  305. package/skills/{scip-probe-reachability/SKILL.md → scip-diagnose/references/probe-reachability.md} +11 -27
  306. package/skills/scip-diagnose/references/root-cause.md +145 -0
  307. package/skills/scip-diagnose/references/triage.md +119 -0
  308. package/skills/scip-explore/SKILL.md +54 -85
  309. package/skills/scip-explore/agents/openai.yaml +2 -2
  310. package/skills/scip-explore/references/diagrams.md +40 -0
  311. package/skills/scip-explore/references/language-playbook.md +49 -0
  312. package/skills/scip-improve/SKILL.md +56 -0
  313. package/skills/scip-improve/agents/openai.yaml +4 -0
  314. package/skills/scip-improve/references/cleanup-batches.md +53 -0
  315. package/skills/scip-improve/references/directory-moves.md +53 -0
  316. package/skills/scip-improve/references/doc-reconcile.md +30 -0
  317. package/skills/scip-improve/references/frontend-extraction.md +39 -0
  318. package/skills/scip-improve/references/maintainability-mechanism.md +43 -0
  319. package/skills/scip-improve/references/twin-drift.md +35 -0
  320. package/skills/scip-plan/SKILL.md +68 -0
  321. package/skills/scip-plan/agents/openai.yaml +4 -0
  322. package/skills/scip-plan/references/api-impact.md +19 -0
  323. package/skills/scip-plan/references/conductor.md +41 -0
  324. package/skills/scip-plan/references/high-assurance.md +43 -0
  325. package/skills/scip-plan/references/hyper-optimization.md +50 -0
  326. package/skills/scip-plan/references/tla-model.md +88 -0
  327. package/skills/scip-query/SKILL.md +53 -98
  328. package/skills/scip-query/agents/openai.yaml +2 -2
  329. package/skills/scip-setup/SKILL.md +69 -181
  330. package/skills/scip-setup/agents/openai.yaml +3 -3
  331. package/skills/scip-setup/references/bootstrap-workflow.md +120 -0
  332. package/skills/scip-setup/references/language-verification.md +61 -0
  333. package/skills/scip-setup/references/lifecycle-commands.md +119 -0
  334. package/skills/scip-setup/references/per-repo-triage.md +24 -0
  335. package/skills/scip-verify/SKILL.md +121 -84
  336. package/skills/scip-verify/agents/openai.yaml +2 -2
  337. package/skills/scip-verify/references/calibrate-detectors.md +170 -0
  338. package/dist/chunk-2CTX5CMX.js +0 -4
  339. package/dist/chunk-2Y373BDD.js +0 -2
  340. package/dist/chunk-7UY7SD7D.js +0 -927
  341. package/dist/chunk-C2QSK7E7.js +0 -2
  342. package/dist/chunk-D4U5Q3FT.js +0 -7
  343. package/dist/chunk-K2ERX4UT.js +0 -3
  344. package/dist/chunk-KHE7J5ZN.js +0 -3
  345. package/dist/chunk-L7SPDE73.js +0 -84
  346. package/dist/chunk-LHMNRHGV.js +0 -3
  347. package/dist/chunk-LM72NQ7T.js +0 -3
  348. package/dist/chunk-MSWVMDAH.js +0 -122
  349. package/dist/chunk-NH7WNNQC.js +0 -20
  350. package/dist/chunk-OMPZHGHO.js +0 -2
  351. package/dist/chunk-TW4OG5FC.js +0 -4
  352. package/dist/chunk-U7DSEKOM.js +0 -30
  353. package/dist/chunk-V27BEQJN.js +0 -7
  354. package/dist/chunk-XAGAZSFE.js +0 -6
  355. package/dist/chunk-XBN5VO53.js +0 -2
  356. package/dist/command-descriptors-N2TL4XM2.js +0 -613
  357. package/dist/direct-navigation-DUCZCTOE.js +0 -3
  358. package/skills/scip-api-impact/SKILL.md +0 -140
  359. package/skills/scip-api-impact/agents/openai.yaml +0 -4
  360. package/skills/scip-calibrate/SKILL.md +0 -131
  361. package/skills/scip-calibrate/agents/openai.yaml +0 -4
  362. package/skills/scip-claim-audit/SKILL.md +0 -107
  363. package/skills/scip-claim-audit/agents/openai.yaml +0 -4
  364. package/skills/scip-cleanup-audit/SKILL.md +0 -130
  365. package/skills/scip-cleanup-audit/agents/openai.yaml +0 -4
  366. package/skills/scip-cleanup-improve/SKILL.md +0 -85
  367. package/skills/scip-cleanup-improve/agents/openai.yaml +0 -4
  368. package/skills/scip-concrete-plan/HIGH_ASSURANCE.md +0 -317
  369. package/skills/scip-concrete-plan/SKILL.md +0 -105
  370. package/skills/scip-concrete-plan/agents/openai.yaml +0 -4
  371. package/skills/scip-conductor/SKILL.md +0 -133
  372. package/skills/scip-conductor/agents/openai.yaml +0 -4
  373. package/skills/scip-debug/SKILL.md +0 -130
  374. package/skills/scip-debug/agents/openai.yaml +0 -4
  375. package/skills/scip-diagram/SKILL.md +0 -110
  376. package/skills/scip-diagram/agents/openai.yaml +0 -4
  377. package/skills/scip-directory-architecture/SKILL.md +0 -266
  378. package/skills/scip-directory-architecture/agents/openai.yaml +0 -4
  379. package/skills/scip-doc-reconcile/SKILL.md +0 -89
  380. package/skills/scip-doc-reconcile/agents/openai.yaml +0 -4
  381. package/skills/scip-hyper-optimization/SKILL.md +0 -156
  382. package/skills/scip-hyper-optimization/agents/openai.yaml +0 -4
  383. package/skills/scip-integrity-audit/SKILL.md +0 -152
  384. package/skills/scip-integrity-audit/agents/openai.yaml +0 -4
  385. package/skills/scip-language-playbook/SKILL.md +0 -106
  386. package/skills/scip-language-playbook/agents/openai.yaml +0 -4
  387. package/skills/scip-maintainability/SKILL.md +0 -158
  388. package/skills/scip-maintainability/agents/openai.yaml +0 -4
  389. package/skills/scip-probe-reachability/agents/openai.yaml +0 -4
  390. package/skills/scip-react-maintainability/SKILL.md +0 -101
  391. package/skills/scip-react-maintainability/agents/openai.yaml +0 -4
  392. package/skills/scip-root-cause/SKILL.md +0 -151
  393. package/skills/scip-root-cause/agents/openai.yaml +0 -4
  394. package/skills/scip-tla-model-system/SKILL.md +0 -148
  395. package/skills/scip-tla-model-system/agents/openai.yaml +0 -4
  396. package/skills/scip-triage-issue/SKILL.md +0 -133
  397. package/skills/scip-triage-issue/agents/openai.yaml +0 -4
  398. package/skills/scip-twin-drift/SKILL.md +0 -109
  399. package/skills/scip-twin-drift/agents/openai.yaml +0 -4
  400. package/skills/scip-vue-maintainability/SKILL.md +0 -107
  401. package/skills/scip-vue-maintainability/agents/openai.yaml +0 -4
@@ -1,52 +1,52 @@
1
1
  ---
2
2
  name: scip-verify
3
- description: Verify finished code, docs, config, refactor, cleanup, setup, React, Vue, or API changes with scip-query. Use before committing or when the user asks whether a change is wired, safe, regression-free, or ready.
3
+ description: Use after finishing a change and before committing: reindex, run the postchecks matching what you edited, diff-gate, and try to refute your own PASS — including verifying that a React or Vue refactor actually achieved the reuse it claimed. Also use to calibrate detector precision once a repo is already set up and its findings look too noisy or too clean. For an existing status claim with no just-finished diff, use scip-audit instead. Distinct from the `review` skill: that one reviews a branch against coding standards and the originating spec; this one runs reindex, routed postchecks and diff-gate on a change you just made.
4
4
  commands:
5
- - template: 'scip-query doctor'
6
- when: 'Prove the workspace: index freshness and dependency readiness.'
7
- - template: 'scip-query status --capabilities'
8
- when: 'Prove the workspace: which evidence and verification capabilities are available.'
9
- - template: 'scip-query diff-impact --json'
10
- when: 'Assess the diff: changed symbols and downstream consumers.'
11
- - template: 'scip-query diff-gate --json'
12
- when: 'Run the gate: the primary blocker for diff-specific risk.'
13
- - template: 'scip-query health --baseline'
14
- when: 'Check health: compare findings against the committed baseline.'
15
- - template: 'scip-query doc-drift --json --full'
16
- when: 'Check docs: run when docs, AGENTS.md, or command surfaces changed.'
5
+ - template: "scip-query doctor"
6
+ when: "Prove the workspace and configuration are usable before trusting evidence."
7
+ - template: "scip-query diff-impact --json"
8
+ when: "Compare changed files, symbols, and affected consumers with the intended diff."
9
+ - template: "scip-query diff-gate --json --compact"
10
+ when: "Run the complete finished-diff gate without blind line truncation."
17
11
  ---
18
12
 
19
13
  # scip-verify
20
14
 
21
- Use this skill to verify the actual diff. Verification is the evidence pass that proves the workspace can answer, the index is current, the changed symbols and files match intent, routed postchecks ran, and diff-gate findings are resolved.
15
+ ## Purpose
22
16
 
23
- Load shared mechanics from [`../_shared/SKILL.md`](../_shared/SKILL.md).
17
+ Verification is the evidence pass that proves a finished change is wired,
18
+ safe, and regression-free: the workspace can answer, the index is current,
19
+ the changed symbols and files match intent, every postcheck the edit calls
20
+ for ran, and diff-gate findings are resolved. A PASS is the verdict nobody
21
+ re-checks, so the flow below ends by trying to break it before it's claimed.
22
+
23
+ Calibration is the companion problem: a detector tuned on one codebase's
24
+ conventions can be precise there and noisy elsewhere, so before any of the
25
+ above output is trusted on a repo, someone has to find out which it is.
26
+
27
+ Load shared mechanics — command syntax, the evidence contract, diff-gate's
24
28
 
25
29
  <!-- BEGIN GENERATED SKILL COMMANDS -->
26
30
  ## Commands for this skill
27
31
 
28
32
  | Command | Purpose | Returns | Coverage | When |
29
33
  | --- | --- | --- | --- | --- |
30
- | `scip-query doctor` | Diagnose config, index freshness, dependency readiness, and project capabilities | config, freshness, dependency, and capability diagnostics | `complete` | Prove the workspace: index freshness and dependency readiness. |
31
- | `scip-query status --capabilities` | Show index status for this project | freshness, generation, language shards, watcher, and optional capabilities | `complete` | Prove the workspace: which evidence and verification capabilities are available. |
32
- | `scip-query diff-impact --json` | Compute changed symbols and downstream consumers from current git diff | changed symbols, downstream consumer identities, and impact paths | `bounded` | Assess the diff: changed symbols and downstream consumers. |
33
- | `scip-query diff-gate --json` | Gate the current diff: architecture regressions plus echo, migration, coordination, doc-drift, unused-param, and new-dead candidates; exit 1 on blocking findings | blocking findings with check id, message, and remediation; advisory findings; root-cause groups; changed file and symbol counts; process exit status (1 when blocking findings exist) | `bounded` | Run the gate: the primary blocker for diff-specific risk. |
34
- | `scip-query health --baseline` | Composite codebase health report with prioritized action list | health score, findings, priorities, baselines, and coverage notes | `bounded` | Check health: compare findings against the committed baseline. |
35
- | `scip-query doc-drift --json --full` | Stale-doc candidates: code the doc references or co-changed with kept changing after the doc stopped | document paths, coupled code subjects, and history evidence | `bounded` | Check docs: run when docs, AGENTS.md, or command surfaces changed. |
34
+ | `scip-query doctor` | Diagnose config, index freshness, dependency readiness, and project capabilities | config, freshness, dependency, and capability diagnostics | `complete` | Prove the workspace and configuration are usable before trusting evidence. |
35
+ | `scip-query diff-impact --json` | Compute changed symbols and downstream consumers from current git diff | changed symbols, downstream consumer identities, and impact paths | `bounded` | Compare changed files, symbols, and affected consumers with the intended diff. |
36
+ | `scip-query diff-gate --json --compact` | Gate the current diff: architecture regressions plus echo, migration, coordination, doc-drift, unused-param, and new-dead candidates; exit 1 on blocking findings | blocking findings with check id, message, and remediation; advisory findings; root-cause groups; changed file and symbol counts; process exit status (1 when blocking findings exist) | `bounded` | Run the complete finished-diff gate without blind line truncation. |
36
37
 
37
38
  Use this shortlist first. Open [`../_shared/SKILL.md`](../_shared/SKILL.md) only when it is insufficient.
38
39
  <!-- END GENERATED SKILL COMMANDS -->
40
+ ten checks, detector-precision tiers — from `_shared`. This skill's own
41
+ shortlist covers `doctor`, `status`, `diff-impact`, `diff-gate`, `health`,
42
+ `doc-drift`, `self-audit`, `suppress`, and `config-validate`.
39
43
 
40
- ## Rules
41
-
42
- 1. Verify environment and index freshness before trusting graph facts.
43
- 2. Treat `scip-query diff-gate --json` as the primary blocker for diff-specific risk.
44
- 3. Run every postcheck that matches the actual edit, not only the check you expected to need.
45
- 4. If `.scipquery.json` or suppressions changed, run `scip-query config-validate`.
46
- 5. Prefer fixing findings. Suppress only intentional design, compatibility shims, framework entry points, or accepted false positives with a specific reason.
47
- 6. A PASS ends scrutiny, so it must survive refutation first: construct the cheapest checks that could still break this diff and run them before claiming PASS. A FAIL needs no refutation — report it with the evidence.
44
+ | Situation | Go to |
45
+ | --- | --- |
46
+ | You just finished editing and need to verify it before committing | Verify a finished change, below |
47
+ | Findings on this repo feel too noisy, too clean, or you're adopting scip-query in a new repo | [`references/calibrate-detectors.md`](references/calibrate-detectors.md) |
48
48
 
49
- ## Flow
49
+ ## Verify a finished change
50
50
 
51
51
  ### 1. Prove the workspace
52
52
 
@@ -55,7 +55,9 @@ scip-query doctor
55
55
  scip-query status --capabilities
56
56
  ```
57
57
 
58
- This step is complete only when missing indexers, invalid config, stale indexes, or unavailable relevant capabilities are fixed or reported as blockers.
58
+ Complete only when missing indexers, invalid config, stale indexes, or
59
+ unavailable relevant capabilities are fixed or reported as blockers. Verify
60
+ environment and index freshness before trusting any graph fact that follows.
59
61
 
60
62
  ### 2. Assess the diff
61
63
 
@@ -63,31 +65,40 @@ This step is complete only when missing indexers, invalid config, stale indexes,
63
65
  scip-query diff-impact --json
64
66
  ```
65
67
 
66
- Compare changed files, changed symbols, and downstream consumers with the intended work. Unexpected blast radius is a finding even if later gates pass.
67
-
68
- This step is complete only when the diff shape is understood.
68
+ Compare changed files, changed symbols, and downstream consumers against the
69
+ intended work. An unexpected blast radius is itself a finding even if every
70
+ later gate passes. Complete only when the diff's shape is understood.
69
71
 
70
72
  ### 3. Run routed postchecks
71
73
 
72
- Run every row matching what the diff actually did — not only the check you expected to need:
73
-
74
- | Change made | Check |
75
- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
76
- | Extracted a helper or abstraction | `scip-query incomplete-migration` |
77
- | Added a helper, module, component, hook, composable, or adapter | `scip-query recent-duplicates` (and `similar <symbol>`) |
78
- | Added parameters, options, props, config flags, or option objects | `scip-query unused-params` |
79
- | Added a wrapper, facade, forwarding layer, alias, or re-export | `scip-query wrapper-candidates`, `passthrough-candidates`, `redundant-reexports` |
80
- | Added an interface, base class, adapter contract, or type alias | `scip-query stale-abstractions` |
81
- | Changed schema, config, generated files, public contracts, command descriptors, or docs-backed behavior | `scip-query co-change <file>` and `doc-drift` |
82
- | Deleted code | `scip-query cleanup-plan --verify` |
83
- | Changed React components or hooks | the React commands in the shared reference |
84
- | Changed Vue SFCs or composables | the Vue commands in the shared reference |
74
+ Run every row that matches what the diff actually did — not only the check
75
+ you expected to need going in:
76
+
77
+ | Change made | Check |
78
+ | --- | --- |
79
+ | Extracted a helper or abstraction | `scip-query incomplete-migration` |
80
+ | Added a helper, module, component, hook, composable, or adapter | `scip-query recent-duplicates` (and `similar <symbol>`) |
81
+ | Added parameters, options, props, config flags, or option objects | `scip-query unused-params` |
82
+ | Added a wrapper, facade, forwarding layer, alias, or re-export | `scip-query wrapper-candidates`, `passthrough-candidates`, `redundant-reexports` |
83
+ | Added an interface, base class, adapter contract, or type alias | `scip-query stale-abstractions` |
84
+ | Changed schema, config, generated files, public contracts, command descriptors, or docs-backed behavior | `scip-query co-change <file>` and `doc-drift` |
85
+ | Deleted code | `scip-query cleanup-plan --verify` |
86
+ | Changed React components or hooks | the React commands in `_shared` |
87
+ | Changed Vue SFCs or composables | the Vue commands in `_shared` |
88
+
89
+ Add `--json --full` to any of these when an unbounded machine-readable result
90
+ is needed rather than the bounded default. This table is authoritative — the
91
+ shared reference links here instead of duplicating it, so don't assume a
92
+ different mapping. Complete only when each applicable postcheck has a result
93
+ and every actionable finding is fixed, accepted with evidence, or blocked by
94
+ a named constraint.
95
+
96
+ If `.scipquery.json` or a suppression file changed as part of the diff, also
97
+ run:
85
98
 
86
- Add `--json --full` when you need an unbounded machine-readable result rather than the default.
87
- This is the authoritative edit-to-postcheck mapping; the shared reference links here instead of
88
- duplicating it.
89
-
90
- This step is complete only when each applicable postcheck has a result and every actionable finding is fixed, accepted with evidence, or blocked by a named constraint.
99
+ ```bash
100
+ scip-query config-validate
101
+ ```
91
102
 
92
103
  ### 4. Run the gate
93
104
 
@@ -95,93 +106,119 @@ This step is complete only when each applicable postcheck has a result and every
95
106
  scip-query diff-gate --json
96
107
  ```
97
108
 
98
- If it reports findings, fix them or record the acceptance reason. If a suppression is needed:
109
+ This is the primary blocker for diff-specific risk: architecture regressions
110
+ plus echo, migration, coordination, doc-drift, unused-param, and new-dead
111
+ candidates, exiting 1 on blocking findings. Fix findings or record the
112
+ acceptance reason. Prefer fixing a real finding over suppressing it — only
113
+ suppress intentional design, compatibility shims, framework entry points, or
114
+ an accepted false positive, and only with a specific reason:
99
115
 
100
116
  ```bash
101
117
  scip-query suppress <id> --reason "<specific reason>"
102
118
  ```
103
119
 
104
120
  `suppress` writes one file per suppression under `.scipquery/suppressions/` —
105
- commit that file with your change. Suppressing is a real decision, not a
106
- bypass: every suppression counts against that detector's precision in
107
- `scip-query effectiveness`, while a rerun against the same resolved comparison
108
- base earns verified credit. After `HEAD` advances, a clean run replays that
109
- stored base automatically. Prefer the fix whenever the finding is real.
121
+ commit it with the change that produced it. Suppressing is a real decision,
122
+ not a bypass: every suppression counts against that detector's precision in
123
+ `scip-query effectiveness`. A rerun against the same resolved comparison base
124
+ earns verified credit instead; once `HEAD` advances, a clean run replays that
125
+ stored base automatically. Complete only when `diff-gate` passes or every
126
+ finding has a durable explanation.
110
127
 
111
- This step is complete only when `diff-gate` passes or every finding has a durable explanation.
128
+ ### 5. Check health, docs, and generated surfaces when relevant
112
129
 
113
- ### 5. Check health, docs, and config when relevant
114
-
115
- Run:
130
+ Run
116
131
 
117
132
  ```bash
118
133
  scip-query health --baseline
119
134
  ```
120
135
 
121
- when a committed baseline exists. If docs, AGENTS.md, CLAUDE.md, command docs, generated docs, or skill instructions changed, run:
136
+ when a committed baseline exists. If docs, AGENTS.md, CLAUDE.md, command
137
+ docs, generated docs, or skill instructions changed, run
122
138
 
123
139
  ```bash
124
140
  scip-query doc-drift --json --full
125
141
  ```
126
142
 
127
- If the repository provides a self-audit command and the change touches generated command surfaces, analyzers, or evidence-labeling behavior, also run:
143
+ and read the returned stale-doc candidates against the diff.
144
+
145
+ If the change touches generated command surfaces, detectors/analyzers, or
146
+ evidence-labeling behavior, also run
128
147
 
129
148
  ```bash
130
149
  scip-query self-audit
131
150
  ```
132
151
 
133
- This step is complete only when changed documentation and config surfaces are checked or explicitly out of scope.
152
+ It scores scip-query's own cheap evidence paths (source-fallback, regex)
153
+ against the best available semantic/compiler oracle on sampled symbols. Read
154
+ whether the surface you just changed still agrees with the oracle at the
155
+ sampled sites before trusting its output elsewhere in this flow — a
156
+ regression here means every downstream postcheck may be reading
157
+ degraded evidence, not just this one command.
134
158
 
135
- ### 6. Refute the PASS
159
+ Complete only when changed documentation and config surfaces are checked or
160
+ explicitly declared out of scope.
136
161
 
137
- A PASS is the verdict nobody re-checks — attack it before making it. Construct at least two refutation attempts and run the cheapest check that would expose each. Prefer executed probes (run the consumer's test, invoke the command, feed the edge input) over argued ones. Pick attacks that fit the diff:
162
+ ### 6. Refute the PASS
138
163
 
139
- - an unexercised consumer: a caller in `diff-impact` output whose tests did not run — run them, or trace the contract it depends on;
140
- - an unexercised input: an edge the changed code newly handles or newly rejects — execute it;
141
- - the intent gap: one case the stated goal implies that the diff does not visibly cover — find where it is handled or show it missing.
164
+ A PASS ends scrutiny, so attack it before making it. Construct at least two
165
+ refutation attempts and run the cheapest check that would expose each. Prefer
166
+ an executed probe — run the consumer's test, invoke the command, feed the
167
+ edge input — over an argued one. Pick attacks that fit the diff:
142
168
 
143
- Record every attempt; an attempt that breaks the diff converts the verdict to FAIL with a finding, and the attempt stays in the record either way.
169
+ - **Unexercised consumer** — take a caller from step 2's `diff-impact` output
170
+ whose tests did not run, and either run them or trace the contract it
171
+ depends on.
172
+ - **Unexercised input** — find an edge the changed code newly handles or
173
+ newly rejects, and execute it.
174
+ - **The intent gap** — find one case the stated goal implies that the diff
175
+ does not visibly cover, then show where it's handled or show it's missing.
144
176
 
145
- This step is complete only when every refutation attempt has an executed result.
177
+ Record every attempt. An attempt that breaks the diff converts the verdict to
178
+ FAIL with a finding; the attempt stays in the record either way. Complete
179
+ only when every refutation attempt has an executed result.
146
180
 
147
- ## Report
181
+ ### Report
148
182
 
149
- End with:
183
+ End with this fixed template:
150
184
 
151
185
  ```markdown
152
186
  Verification: PASS/FAIL — <n> postchecks, <m> refutation attempts, <k> broke
153
187
 
154
188
  Environment:
155
-
156
189
  - doctor:
157
190
  - status:
158
191
 
159
192
  Diff:
160
-
161
193
  - changed files/symbols:
162
194
  - unexpected blast radius:
163
195
 
164
196
  Postchecks:
165
-
166
197
  - <command>: <result>
167
198
 
168
199
  Gate:
169
-
170
200
  - `scip-query diff-gate --json`: <result>
171
201
 
172
- Health/docs/config:
173
-
202
+ Health/docs/self-audit:
174
203
  - <commands and results>
175
204
 
176
205
  Refutation attempts:
177
-
178
206
  - R1: <attack> → survived (evidence) | broke (finding)
179
207
 
180
208
  Remaining risk:
181
-
182
209
  - <accepted findings, unavailable capabilities, or checks not run>
183
210
  ```
184
211
 
185
- Do not claim ready-to-ship unless freshness is `fresh` after the final edit, diff-gate is passed or fully explained, and the PASS survived every refutation attempt.
212
+ Do not claim ready-to-ship unless index freshness is `fresh` after the final
213
+ edit, `diff-gate` is passed or fully explained, and the PASS survived every
214
+ refutation attempt.
215
+
216
+ ### Detector reliability for this flow
186
217
 
187
- - `dead`/`new-dead` correctly resolve `import type` consumers, tsconfig `paths` aliases, pnpm/npm/yarn workspace cross-package imports, and Vue `<script setup>` composables. The one residual gap is a same-named symbol reached only through a re-exporting barrel file in a workspace package; that shape self-labels `unconfirmed (cross-package ambiguous-name resolution gap)` in the finding — treat only that label as unconfirmed until `refs` agrees. See the Detector Reliability section in `../_shared/SKILL.md`.
218
+ `dead`/`new-dead` correctly resolve `import type` consumers, tsconfig
219
+ `paths` aliases, pnpm/npm/yarn workspace cross-package imports, and Vue
220
+ `<script setup>` composables — these are not sources of false positives. The
221
+ one residual gap is a same-named symbol reached only through a re-exporting
222
+ barrel file in a workspace package; that shape self-labels `unconfirmed
223
+ (cross-package ambiguous-name resolution gap)` in the finding, and only that
224
+ specific label should be treated as unconfirmed until `refs` agrees.
@@ -1,4 +1,4 @@
1
1
  interface:
2
2
  display_name: "SCIP Verify"
3
- short_description: "Verify changes with SCIP diff gates"
4
- default_prompt: "Use $scip-verify to verify this change with reindexing, routed postchecks, and diff-gate."
3
+ short_description: "Verify a finished change before it ships"
4
+ default_prompt: "Use $scip-verify to confirm this change is wired, safe and regression-free before committing it."
@@ -0,0 +1,170 @@
1
+ # Calibrate detectors
2
+
3
+ Use this when adopting scip-query in a new or foreign codebase, after major
4
+ detector changes, when a health score or gate output seems too noisy or too
5
+ clean, or before letting `diff-gate` block anyone's work.
6
+
7
+ ## The stance
8
+
9
+ A detector tuned on one codebase's conventions can be precise there and
10
+ noisy elsewhere. Calibration finds out which, on this repo, and converts
11
+ every noise archetype into either a repo-side knob or an upstream detector
12
+ bug. A health score that hasn't been calibrated is a number, not a fact:
13
+ never present detector output from an uncalibrated repo as findings —
14
+ present it as candidate findings pending classification. A calibrated score
15
+ has to earn trust the same way a checker earns it in the integrity scenario
16
+ of `scip-audit`:
17
+ by being witnessed telling the truth on samples verified by hand.
18
+
19
+ Run all five stages below. Each has a checkable completion criterion — don't
20
+ move on until it's met.
21
+
22
+ ## Stage 1 — Index and inventory
23
+
24
+ ```bash
25
+ scip-query reindex
26
+ scip-query status --capabilities
27
+ ```
28
+
29
+ Record which languages got which evidence tier (SCIP-indexed vs
30
+ source-fallback vs regex): a detector's expected precision differs per tier,
31
+ and a repo that is 80% fallback-tier must be judged against fallback
32
+ expectations, not SCIP-tier expectations. Note the monorepo shape
33
+ (workspaces, cross-package imports) — historically the single largest
34
+ false-positive source is `dead`/`new-dead` findings on cross-package
35
+ consumers.
36
+
37
+ Complete only when languages, evidence tiers, and workspace shape are
38
+ written down.
39
+
40
+ ## Stage 2 — Battery sweep
41
+
42
+ Run the full detector battery and don't react to any of the numbers yet —
43
+ big counts here are sampling frames, not findings:
44
+
45
+ ```bash
46
+ scip-query health --json
47
+ scip-query dead --json
48
+ scip-query similar <symbol>
49
+ scip-query twin-drift -s <scope> --json
50
+ ```
51
+
52
+ Complete only when every detector's finding count is recorded.
53
+
54
+ ## Stage 3 — Retro-gate replay
55
+
56
+ Replay the gate against the last 15-20 real commits, using a worktree per
57
+ commit — never the user's live tree:
58
+
59
+ ```bash
60
+ scip-query diff-gate --base <commit> --json
61
+ ```
62
+
63
+ This is the stage that exposes finding WALLS: one hub file or one convention
64
+ mismatch generating dozens of near-identical findings per commit. A finding
65
+ wall is always either a missing repo knob or a detector bug — it is never
66
+ simply "the repo is just bad."
67
+
68
+ Complete only when per-commit finding counts and every wall are recorded.
69
+
70
+ ## Stage 4 — Sample and classify
71
+
72
+ This is the actual calibration. For each detector with findings: sample
73
+ about 10 of them (all of them if fewer), read the code at each cited site,
74
+ and classify actionable vs noise.
75
+
76
+ - Classify from the code, never from the finding text. A finding that
77
+ sounds plausible and a finding that is true are different things, and the
78
+ difference is only visible at the cited file and line.
79
+ - For every noise finding, name the archetype (e.g. "type-only import
80
+ invisible to indexer", "delegation chain flagged as twin", "generic
81
+ shared helpers saturating similarity"). Archetypes are the deliverable —
82
+ a noise rate without archetypes cannot be fixed.
83
+
84
+ Give each detector a verdict: **keep** (precision acceptable), **retune**
85
+ (name the threshold and the value), or **demote to advisory** for this repo.
86
+
87
+ Complete only when every detector has sampled precision, named archetypes,
88
+ and a verdict.
89
+
90
+ ## Stage 5 — Tune the knobs, file the bugs
91
+
92
+ Apply repo-side fixes for what belongs to the repo, and file upstream for
93
+ what belongs to the detector:
94
+
95
+ - `.scipquery.json` suppressions — one per accepted finding, each with a
96
+ reason. A reasonless suppression is hiding, not tuning.
97
+ - `docs.snapshotPaths` — mark dated/archival docs that must never generate
98
+ doc-reference findings.
99
+ - Coverage contracts — declare enumerations the gate should police.
100
+ - `commandAnalysisBudget` — cap analysis honestly on very large indexes.
101
+
102
+ Validate any config change:
103
+
104
+ ```bash
105
+ scip-query config-validate
106
+ ```
107
+
108
+ Detector bugs — noise archetypes no config knob can express — go to the
109
+ tool's followup ledger with the archetype, a concrete example, and the
110
+ sampled rate. Never tune a threshold to hide an archetype; that trades
111
+ visible noise for invisible blindness. File it and live with the noise
112
+ until it's fixed.
113
+
114
+ Confirm the repair:
115
+
116
+ ```bash
117
+ scip-query diff-gate --json
118
+ ```
119
+
120
+ run before and after, to check it worked.
121
+
122
+ Complete only when the stage-3 gate replay re-runs materially quieter and
123
+ every remaining finding class is actionable, suppressed-with-reason, or
124
+ filed upstream.
125
+
126
+ ## Failure modes
127
+
128
+ Each of these has been observed in a real calibration:
129
+
130
+ - **Sampling too few.** One good finding does not make a detector precise;
131
+ one bad finding does not make it noise. Ten samples per detector is the
132
+ floor.
133
+ - **Classifying from the finding text.** The finding always sounds right —
134
+ it was generated to. Only the code knows.
135
+ - **Tuning to green.** Raising a threshold until the noise disappears also
136
+ disappears the real findings. If the archetype is a detector bug, file it
137
+ and live with the noise rather than tuning it away.
138
+ - **Trusting a clean run.** Zero findings on a detector can mean precision,
139
+ or it can mean the detector cannot see this repo's conventions at all
140
+ (wrong import style, unindexed language). Verify at least one known-true
141
+ positive per major detector — plant one if none exists.
142
+ - **Calibrating the wrong tree.** Use clones or worktrees for anything that
143
+ mutates during calibration. The target repo is read-only unless its owner
144
+ said otherwise.
145
+
146
+ ## After calibration
147
+
148
+ The finding-outcome ledger keeps calibrating automatically. Once the repo
149
+ uses `diff-gate`, per-detector precision is recomputed from real outcomes as
150
+ `detectorPrecision` in `health --json`. The committed event ledger under
151
+ `.scipquery/events/*.json` makes those outcomes durable and queryable:
152
+
153
+ ```bash
154
+ scip-query effectiveness --since 30d --json
155
+ ```
156
+
157
+ reports, per check, caught / comparison-verified-fixed / suppressed / open /
158
+ unverified counts, precision, and median days-to-fix, sourced from those
159
+ individual records.
160
+
161
+ If `HEAD` advances during or after calibration, use a clean worktree so
162
+ scip-query can replay the stored comparison base instead of mistaking an
163
+ empty diff for a fix. Re-run this protocol only after major detector
164
+ upgrades, or when the ledger's precision numbers drift from what was
165
+ measured previously.
166
+
167
+ Write the calibration report to
168
+ `docs/validation/YYYY-MM-DD-external-calibration-<repo>.md`, shaped like the
169
+ exemplars this protocol was distilled from: battery table, retro-gate walls,
170
+ per-detector verdicts, noise archetypes, caps and deviations.
@@ -1,4 +0,0 @@
1
- import{a as O,c as X}from"./chunk-LM72NQ7T.js";import{a as I}from"./chunk-7B3UPBVA.js";import{d as G,g as N,s as B,v as J,x as K}from"./chunk-L7SPDE73.js";import{a as V}from"./chunk-64MNV6AB.js";import{execFileSync as Z}from"child_process";import{existsSync as L,readFileSync as je}from"fs";import{createRequire as xe}from"module";import{platform as Q}from"os";import{dirname as Y,join as R}from"path";var Fe=xe(import.meta.url),At={language:"rust",indexerBinary:"rust-analyzer",installUrl:"https://github.com/rust-lang/rust-analyzer"};function W(t){return[t.indexerBinary,...t.binaryAliases??[]]}function Pe(t){let e=W(t);return e.length===1?e[0]:e.join(" or ")}function _(t){for(let e of W(t))if(Q()==="win32"){let n=X(e);if(n)return n}else if(O(e))return e;return Re(t)}function Et(t){return _(t)!==null||Ie(t)}function Ie(t){return ee(t)!==null}function Re(t){let e=ee(t);if(!e)return null;let r=JSON.parse(je(e,"utf8")).bin;if(!r)return null;if(typeof r=="string")return R(Y(e),r);for(let i of W(t)){let s=r[i];if(s)return R(Y(e),s)}return null}function ee(t){if(!t.bundledNpmPackage)return null;try{return Fe.resolve(`${t.bundledNpmPackage}/package.json`)}catch{return null}}function Te(t,e){for(let n of t.projectLocalBinaries??[]){let r=R(e,n);if(L(r))return r}return null}function ve(t,e){return Te(t,e)??_(t)}function Dt(t,e=process.env,n=t.indexerBinary){if(t.indexerBinary!=="scip-dotnet"||$(n,e))return e;let r=te(n,e);return r?{...e,DOTNET_ROOT:r}:e}function Nt(t,e){let n=Pe(t),r=e?ve(t,e):_(t);if(!r)return{language:t.language,binaryLabel:n,installed:!1,runnable:!1,resolvedBinary:null,installUrl:t.installUrl};if(t.indexerBinary!=="scip-dotnet")return{language:t.language,binaryLabel:n,installed:!0,runnable:!0,resolvedBinary:r};let i=ke(r);return{language:t.language,binaryLabel:n,installed:!0,runnable:i.runnable,resolvedBinary:r,installUrl:t.installUrl,note:i.note}}function ke(t){if($(t,process.env))return{runnable:!0};let e=te(t,process.env);if(e)return{runnable:!0,note:`using .NET 9 runtime from ${e}`};let n=ne(process.env);return{runnable:!1,note:n.length>0?`.NET 9 runtime still unavailable after checking ${n.join(", ")}`:"binary is present, but scip-dotnet still needs a .NET 9 runtime"}}function te(t,e){for(let n of ne(e))if($(t,{...e,DOTNET_ROOT:n}))return n;return null}function ne(t){let e=[],n=t.DOTNET_ROOT;if(n&&L(n)&&e.push(n),Q()==="darwin"&&O("brew"))try{let r=Z("brew",["--prefix","dotnet@9"],{stdio:"pipe",env:t}).toString().trim(),i=R(r,"libexec");L(i)&&!e.includes(i)&&e.push(i)}catch{}return e}function $(t,e){try{return Z(t,["--version"],{stdio:"pipe",env:e}),!0}catch{return!1}}function Ot(t){try{return process.kill(t,0),!0}catch(e){return typeof e=="object"&&e!==null&&"code"in e&&e.code==="EPERM"}}import{mkdirSync as we,renameSync as Ce,writeFileSync as Me}from"fs";import{dirname as Ae}from"path";function $t(t,e,n={}){we(Ae(t),{recursive:!0});let r=`${t}.${process.pid}.${Date.now()}.tmp`,i=JSON.stringify(e,null,n.spacing);Me(r,n.trailingNewline?`${i}
2
- `:i),Ce(r,t)}function z(t,e){let n=t.split("/").at(-1)??t;if(ce.has(n)||n===".scipquery.json"||/^tsconfig(?:\..+)?\.json$/.test(n))return"config";if(/\.d\.(?:ts|mts|cts)$/.test(t.toLowerCase()))return"ambient";let r=t.includes(".")?`.${t.split(".").at(-1).toLowerCase()}`:"";return e.some(i=>(pe[i]??[]).includes(r))?"source":"other"}function oe(t,e,n){let r=t.split("/").at(-1)??t;if(n?.includes(t)||n?.includes(r)||ce.has(r))return!0;let i=t.includes(".")?`.${t.split(".").at(-1).toLowerCase()}`:"";return(pe[e]??[]).includes(i)}function ae(t){if(typeof t!="object"||t===null)return null;let e=t;return typeof e.version!="number"||!re(e.languages)||typeof e.pnpmWorkspaces!="boolean"||typeof e.typescriptProjectMode!="string"||!re(e.typescriptProjects)||e.clojureConfigPath!==void 0&&typeof e.clojureConfigPath!="string"||!Array.isArray(e.files)||!e.files.every(Ee)?null:e}function Ut(t,e){let n=new Map((t?.files??[]).map(a=>[a.path,a])),r=new Map(e.files.map(a=>[a.path,a])),i=new Set([...n.keys(),...r.keys()]),s=[];for(let a of[...i].sort()){let p=n.get(a),u=r.get(a),d=z(a,e.languages);!p&&u?s.push({kind:"added",path:a,inputKind:d,after:u}):p&&!u?s.push({kind:"deleted",path:a,inputKind:d,before:p}):p&&u&&(p.hash!==u.hash||p.size!==u.size)&&s.push({kind:"modified",path:a,inputKind:d,before:p,after:u})}let o=new Set;return t||o.add("prior-snapshot-unavailable"),t&&t.version!==e.version&&o.add("snapshot-version-changed"),(ie(t?.files??[])||ie(e.files))&&o.add("duplicate-input-path"),[...t?.files??[],...e.files].some(De)&&o.add("unreadable-input"),{version:1,changes:s,projectIdentityChanged:t?!Ne(t,e):!0,uncertainty:[...o].sort()}}function re(t){return Array.isArray(t)&&t.every(e=>typeof e=="string")}function ie(t){return new Set(t.map(e=>e.path)).size!==t.length}function Ee(t){if(typeof t!="object"||t===null)return!1;let e=t;return typeof e.path=="string"&&typeof e.size=="number"&&typeof e.hash=="string"}function De(t){return t.hash==="unreadable"||t.size<0}function Ne(t,e){return se(t.languages,e.languages)&&t.pnpmWorkspaces===e.pnpmWorkspaces&&t.typescriptProjectMode===e.typescriptProjectMode&&se(t.typescriptProjects,e.typescriptProjects)&&t.clojureConfigPath===e.clojureConfigPath}function se(t,e){if(t.length!==e.length)return!1;let n=[...t].sort(),r=[...e].sort();return n.every((i,s)=>i===r[s])}var ce=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","deps.edn","project.clj","bb.edn","shadow-cljs.edn"]),pe={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"],clojure:[".clj",".cljs",".cljc"]};import{execFileSync as Be}from"child_process";import{createHash as le}from"crypto";import{lstatSync as Oe,readdirSync as Le,readFileSync as We,readlinkSync as _e,realpathSync as ue}from"fs";import{isAbsolute as $e,join as de,relative as ze,sep as Ue}from"path";function He(t){return[...new Set((t??[]).map(e=>e.trim()).filter(Boolean))].sort((e,n)=>e.localeCompare(n))}function qe(t){return(Je(t)??Ke(t)).filter(e=>e&&!fe(e)).sort()}function Ge(t,e={}){let n=qe(t).filter(i=>!e.language||oe(i,e.language,e.markerFiles)).filter(i=>!e.includePath||e.includePath(i)),r=ue(t);return n.map(i=>{let s=de(t,i);try{if(Oe(s).isSymbolicLink()){let a=ue(s),p=ze(r,a);if(p===".."||p.startsWith(`..${Ue}`)||$e(p))throw new Error("external symlink");let u=_e(s);return{path:i,size:Buffer.byteLength(u),hash:le("sha256").update("symlink\0").update(u).digest("hex")}}let o=We(s);return{path:i,size:o.byteLength,hash:le("sha256").update(o).digest("hex")}}catch{return{path:i,size:-1,hash:"unreadable"}}})}function Xt(t,e,n){return{version:2,languages:[...e].sort(),pnpmWorkspaces:n.typescriptProjectMode!=="workspace"&&n.pnpmWorkspaces===!0,typescriptProjectMode:n.typescriptProjectMode??"single",typescriptProjects:He(n.typescriptProjects),clojureConfigPath:Ve(n.clojureConfigPath),files:Ge(t)}}function Ve(t){return t?.trim()||void 0}function Je(t){try{return Be("git",["-C",t,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:50*1024*1024,stdio:["ignore","pipe","ignore"]}).split(`
3
- `).filter(Boolean)}catch{return null}}function Ke(t){let e=[],n=[""];for(;n.length>0;){let r=n.pop(),i=r?de(t,r):t,s;try{s=Le(i,{withFileTypes:!0})}catch{continue}for(let o of s){let a=r?`${r}/${o.name}`:o.name;if(o.isDirectory()){fe(a)||n.push(a);continue}e.push(a)}}return e}function fe(t){let e=t.split("/");return t==="meta.json"||e.some(n=>Xe.has(n))||t.endsWith(".db")||t.endsWith(".db-wal")||t.endsWith(".db-shm")||t.endsWith(".scip")}var Xe=new Set([".git","node_modules",".scipquery-cache",".scipquery-generations",".stryker-tmp","dist","build","coverage",".next",".nuxt","target"]);import{readFileSync as rt}from"fs";import{dirname as it,join as st}from"path";var Ye=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"];function T(t){let e=t.toLowerCase();return Ye.some(n=>e.endsWith(n))}function k(t){let e=v(t.projectFiles),n=new Set(e),r=new Map(t.snapshot.files.map(c=>[c.path,c])),i=t.snapshot.files.filter(c=>{let f=z(c.path,["typescript"]);return f==="config"||f==="ambient"}).map(c=>c.path),s=v([...e,...i]),o=s.find(c=>!r.has(c)),a=new Set(t.snapshot.files.map(c=>c.path)).size!==t.snapshot.files.length,p=!o&&s.some(c=>me(r.get(c))),u=N(JSON.stringify({pnpmWorkspaces:t.snapshot.pnpmWorkspaces,typescriptProjectMode:t.snapshot.typescriptProjectMode,typescriptProjects:v(t.snapshot.typescriptProjects),membership:e})),d=new Map;return{identityFor(c,f){if(!n.has(c))return b("target-outside-project");if(a)return b("duplicate-input-path");if(o)return b("missing-input-fingerprint");if(p)return b("unreadable-input");let h=[],l,S;if(t.graph===null)h.push("dependency-graph-unavailable"),S="whole-project",l=s;else{let P=Qe(c,t.graph,d);if(P.find(D=>!r.has(D)))return b("missing-input-fingerprint");if(l=v([...P,...i]),l.some(D=>me(r.get(D))))return b("unreadable-input");S="dependency-closure"}let F=l.map(P=>et(r.get(P)));return{version:1,key:N(JSON.stringify({version:1,engineIdentity:t.engineIdentity,schemaVersion:f,projectIdentity:u,inputs:F})),mode:S,inputFiles:l,reasons:h}}}}function Ze(t,e){let n=new Set,r=[t];for(let i=0;i<r.length;i+=1){let s=r[i];if(!(s===void 0||n.has(s))){n.add(s);for(let o of[...e.get(s)??[]].sort())n.has(o)||r.push(o)}}return[...n].sort()}function Qe(t,e,n){let r=n.get(t);if(r)return r;let i=Ze(t,e);return n.set(t,i),i}function et(t){return{path:t.path,size:t.size,hash:t.hash}}function me(t){return t.size<0||t.hash==="unreadable"}function b(t){return{version:1,key:null,mode:"unkeyed",inputFiles:[],reasons:[t]}}function v(t){return[...new Set(t)].sort()}import{createRequire as tt}from"module";var ge=tt(import.meta.url),j,w;function nt(){if(j!==void 0)return j;try{j=ge("ts-morph")}catch{j=null}return j}function C(){if(w)return w;let t=nt();if(!t)return"ts-morph:unavailable";let e="unknown";try{e=ge("ts-morph/package.json").version??"unknown"}catch{}return w=`ts-morph:${e}:typescript:${t.ts.version}`,w}function rn(t,e){return e.map(n=>({tsconfigPath:n,project:new t.Project({tsConfigFilePath:n,skipFileDependencyResolution:!0})}))}function sn(t,e,n){return{language:"typescript",availability:()=>({available:!1,reason:t,tsconfigPath:e,tsconfigPaths:n}),importUsage:()=>[],referencesFor:()=>[],calleesFor:()=>[],signatureFor:()=>null}}var ot=G("typescript-semantic-identity-context",{clearGroups:["whole-project"]});function U(t,e,n){let r=ot.get(t,()=>at(t));if(!r)return null;let i=`${n}\0${e}`,s=r.identities.get(i);if(s)return s;let o=r.builder.identityFor(e,n);return r.identities.set(i,o),o}function x(t){return V(t,{includeIgnored:!1}).filter(T).sort()}function at(t){try{let e=JSON.parse(rt(st(it(t.config.dbPath),"meta.json"),"utf8")),n=ae(e.fingerprint);return n?{builder:k({projectFiles:x(t),snapshot:n,graph:I(t),engineIdentity:C()}),identities:new Map}:null}catch{return null}}function M(t,e){let n=new Map(t.map(i=>[i.symbol,i])),r=new Map(t.map(i=>[i.symbolId,[]]));for(let i of e.values())for(let s of i){let o=n.get(s.targetSymbol);o&&r.get(o.symbolId).push(s.location)}for(let[i,s]of r)r.set(i,ct(s));return r}function Se(t,e,n){let r=he(t,e),i=he(t,n),s=[...r].filter(c=>!i.has(c)).sort(),o=[...i].filter(c=>!r.has(c)).sort(),a=ye(t,e),p=ye(t,n),u=[...a].filter(c=>!p.has(c)).sort(),d=[...p].filter(c=>!a.has(c)).sort();return{passed:s.length===0&&o.length===0,expectedCount:r.size,actualCount:i.size,missing:s,extra:o,callerFiles:{passed:u.length===0&&d.length===0,expectedCount:a.size,actualCount:p.size,missing:u,extra:d}}}function ye(t,e){let n=new Set;for(let r of t)for(let i of e.get(r.symbolId)??[])i.file!==r.relativePath&&n.add(`${r.symbol}\0${i.file}`);return n}function hn(t,e,n){let r=new Set(n),i=new Map(n.map(s=>[s,[]]));for(let s of t)for(let o of e.get(s.symbolId)??[])r.has(o.file)&&i.get(o.file).push({targetSymbol:s.symbol,location:o});for(let[s,o]of i)i.set(s,pt(o));return i}function he(t,e){let n=new Set;for(let r of t)for(let i of e.get(r.symbolId)??[])n.add(`${r.symbol}\0${i.file}\0${i.line}\0${i.column}`);return n}function ct(t){let e=new Map;for(let n of t)e.set(`${n.file}\0${n.line}\0${n.column}`,n);return[...e.values()].sort(be)}function pt(t){let e=new Map;for(let n of t){let{location:r}=n;e.set(`${n.targetSymbol}\0${r.file}\0${r.line}\0${r.column}`,n)}return[...e.values()].sort((n,r)=>n.targetSymbol.localeCompare(r.targetSymbol)||be(n.location,r.location))}function be(t,e){return t.file.localeCompare(e.file)||t.line-e.line||t.column-e.column}var H="typescript-reference-fragment-v2",E=J({kind:"typescript-reference-fragments",invalidation:K("typescript-reference-fragments"),serialize:t=>JSON.stringify(t),deserialize:ut});function vn(t,e,n,r=t){let i=x(t),s=k({projectFiles:i,snapshot:e,graph:I(t),engineIdentity:C()}),o=[...n].map(([a,p])=>({relativePath:a,contentHash:s.identityFor(a,H).key,value:[...p]}));if(o.some(a=>a.contentHash===null))throw new Error("TypeScript reference fragment identity is unavailable for an affected document.");return E.writeBatch(r,o.map(a=>({...a,contentHash:a.contentHash}))),o.length}function kn(t,e,n,r){let i=e.filter(o=>T(o.relativePath));if(i.length===0)return A("no TypeScript definitions");let s=A("shadow did not run");return B("typescript.reference-fragments.shadow",()=>{try{let o=r(i[0].relativePath);if(!o.availability().available||!o.referenceFragmentsForFiles)return s=A("TypeScript reference fragment provider is unavailable"),s;let a=x(t),p=new Set(a),u=o.referenceFragmentsForFiles(a),d=M(i,u),c=Se(i,lt(n,p),d);if(!c.passed)return s={state:"failing",files:a.length,keyedFiles:0,writtenFiles:0,...c},s;let f=[];for(let h of a){let l=U(t,h,H);l?.key&&f.push({relativePath:h,contentHash:l.key,value:u.get(h)??[]})}return E.writeBatch(t,f),s={state:"passing",files:a.length,keyedFiles:f.length,writtenFiles:f.length,...c},s}catch(o){return s=A(o instanceof Error?o.message:String(o)),s}},()=>({...s}))}function lt(t,e){return new Map([...t].map(([n,r])=>[n,r.filter(i=>e.has(i.file))]))}function wn(t,e,n){if(e.length===0)return{references:new Map,files:0,cacheHits:0,cacheMisses:0,computedFiles:0};let r="fallback",i=0,s=0,o=0,a=0;return B("typescript.reference-fragments.materialize",()=>{try{let p=x(t);i=p.length;let u=new Map,d=new Map,c=[];for(let l of p){let S=U(t,l,H);if(!S?.key)return null;u.set(l,S.key);let F=E.read(t,l,S.key);F===null?(o+=1,c.push(l)):(s+=1,d.set(l,F))}if(o===0)return r="hit",{references:M(e,d),files:i,cacheHits:s,cacheMisses:o,computedFiles:a};let f=n(e[0].relativePath);if(!f.availability().available||!f.referenceFragmentsForFiles)return null;let h=f.referenceFragmentsForFiles(c);if(c.some(l=>!h.has(l)))return null;a=h.size,E.writeBatch(t,c.map(l=>({relativePath:l,contentHash:u.get(l),value:h.get(l)??[]})));for(let[l,S]of h)d.set(l,S);return r="computed",{references:M(e,d),files:i,cacheHits:s,cacheMisses:o,computedFiles:a}}catch{return null}},()=>({state:r,files:i,cacheHits:s,cacheMisses:o,computedFiles:a}))}function A(t){return{state:"unavailable",files:0,keyedFiles:0,writtenFiles:0,expectedCount:0,actualCount:0,missing:[],extra:[],reason:t}}function ut(t){try{let e=JSON.parse(t);return!Array.isArray(e)||!e.every(dt)?null:e}catch{return null}}function dt(t){if(!t||typeof t!="object")return!1;let e=t,n=e.location;return typeof e.targetSymbol=="string"&&!!n&&typeof n.file=="string"&&typeof n.line=="number"&&typeof n.column=="number"}import{readFileSync as ft}from"fs";import{join as q}from"path";var En=5e3,mt="watch.lock",gt="watch-state.json",yt="watch-activity.json";function Dn(t){return{lockPath:q(t,mt),statePath:q(t,gt),activityPath:q(t,yt)}}function Nn(t){try{return ht(JSON.parse(ft(t,"utf8")))}catch{return null}}function ht(t){if(!t||typeof t!="object")return null;let e=t;return e.version!==1||typeof e.protocolVersion!="number"||typeof e.pid!="number"||!Number.isInteger(e.pid)||e.pid<=0||typeof e.projectRoot!="string"||e.worktreeId!==void 0&&(typeof e.worktreeId!="string"||e.worktreeId.length===0)||typeof e.cliVersion!="string"||!y(e.startedAt)||!y(e.heartbeatAt)||!y(e.lastActivityAt)||!St(e.watcher)||e.idleDeadlineAt!==void 0&&!y(e.idleDeadlineAt)||e.indexGeneration!==void 0&&!/^[a-f0-9]{64}$/.test(e.indexGeneration)||e.lastError!==void 0&&!bt(e.lastError)||e.lastRefresh!==void 0&&!jt(e.lastRefresh)||e.reindexActivity!==void 0&&!xt(e.reindexActivity)||e.typescriptSemantic!==void 0&&!Ft(e.typescriptSemantic)||e.typescriptIndex!==void 0&&!Pt(e.typescriptIndex)?null:e}function y(t){return typeof t=="string"&&Number.isFinite(Date.parse(t))}function St(t){if(!t||typeof t!="object"||!("state"in t))return!1;let e=t;switch(e.state){case"idle":return!0;case"waiting":return g(e.changedFiles)&&g(e.reindexAt);case"indexing":return g(e.startedAt);case"cooldown":return g(e.until)&&typeof e.dirty=="boolean";default:return!1}}function bt(t){if(!t||typeof t!="object")return!1;let e=t;return y(e.at)&&typeof e.message=="string"}function jt(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.trigger?.kind=="string"&&typeof e.result=="string"&&y(e.startedAt)&&y(e.completedAt)&&g(e.durationMs)}function xt(t){if(!t||typeof t!="object")return!1;let e=t;return!y(e.windowStartedAt)||!y(e.windowEndedAt)||!m(e.runs)||!m(e.rebuilt)||!m(e.reused)||!m(e.failed)||!m(e.suppressed)||!g(e.estimatedLogicalOutputBytes)||e.estimatedLogicalOutputBytes<0||!e.byTrigger||typeof e.byTrigger!="object"?!1:Object.values(e.byTrigger).every(n=>n===void 0||m(n))}function Ft(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.protocolVersion=="number"&&(e.state==="idle"||e.state==="ready"||e.state==="unavailable"||e.state==="error")&&g(e.requests)&&g(e.sessionsCreated)&&g(e.sessionsReused)&&g(e.sessionsRefreshed)&&g(e.sessionsReplaced)&&g(e.projectsCreated)&&(e.lastRequestAt===void 0||y(e.lastRequestAt))&&(e.lastError===void 0||typeof e.lastError=="string")&&(e.busyUntil===void 0||y(e.busyUntil))}function Pt(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.protocolVersion=="number"&&(e.state==="idle"||e.state==="ready"||e.state==="unavailable"||e.state==="error")&&m(e.requests)&&m(e.sessionsCreated)&&m(e.sessionsReplaced)&&m(e.initializations)&&m(e.programUpdates)&&m(e.documentsEmitted)&&m(e.documentsRemoved)&&(e.lastRequestAt===void 0||y(e.lastRequestAt))&&(e.lastDurationMs===void 0||g(e.lastDurationMs)&&e.lastDurationMs>=0)&&(e.lastError===void 0||typeof e.lastError=="string")&&(e.busyUntil===void 0||y(e.busyUntil))}function g(t){return typeof t=="number"&&Number.isFinite(t)}function m(t){return typeof t=="number"&&Number.isInteger(t)&&t>=0}export{At as a,Pe as b,_ as c,Et as d,Te as e,Dt as f,Nt as g,Ot as h,$t as i,z as j,ae as k,Ut as l,He as m,Ge as n,Xt as o,En as p,Dn as q,Nn as r,Ye as s,T as t,nt as u,rn as v,sn as w,hn as x,k as y,U as z,vn as A,kn as B,wn as C};
4
- //# sourceMappingURL=chunk-2CTX5CMX.js.map
@@ -1,2 +0,0 @@
1
- import{b as r}from"./chunk-54HA4ZXH.js";import{x as e}from"./chunk-XYADIZHU.js";function l(t,s){let o=r(t,s);return e(t,o).map(({relativePath:n,...a})=>a)}export{l as a};
2
- //# sourceMappingURL=chunk-2Y373BDD.js.map