scip-query 0.9.0 → 0.10.1

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 (263) hide show
  1. package/README.md +115 -58
  2. package/dist/augment-vue-worker.js +1 -1
  3. package/dist/chunk-23FVN4Y5.js +2 -0
  4. package/dist/chunk-24PFLKFK.js +2 -0
  5. package/dist/{chunk-VTF5EH22.js → chunk-27KPKLRJ.js} +2 -2
  6. package/dist/chunk-2NLK4INB.js +2 -0
  7. package/dist/{chunk-TA4DDU7J.js → chunk-2XKAMW6B.js} +2 -2
  8. package/dist/{chunk-PE4EJOLN.js → chunk-332L7SRO.js} +2 -2
  9. package/dist/chunk-44JOJLMO.js +38 -0
  10. package/dist/{chunk-U254PV4S.js → chunk-4EAANIWC.js} +2 -2
  11. package/dist/{chunk-ITUU3VE3.js → chunk-4N7LFYSD.js} +2 -2
  12. package/dist/{chunk-7I6KNKE3.js → chunk-5ALI77D7.js} +2 -2
  13. package/dist/{chunk-V76FCF5F.js → chunk-5BZOSICN.js} +2 -2
  14. package/dist/{chunk-RIXOMSOR.js → chunk-5D3BT4B4.js} +2 -2
  15. package/dist/{chunk-YSSTUCNS.js → chunk-5HDYAOSF.js} +2 -2
  16. package/dist/{chunk-NK7TQQG4.js → chunk-5IDEQEM4.js} +2 -2
  17. package/dist/{chunk-AGW2MVIO.js → chunk-5VB3WU7K.js} +2 -2
  18. package/dist/chunk-623UQCVG.js +2 -0
  19. package/dist/chunk-62NMBOA5.js +2 -0
  20. package/dist/chunk-64LH2QUP.js +62 -0
  21. package/dist/{chunk-PG3ZI5IH.js → chunk-65UWNXEH.js} +1 -1
  22. package/dist/{chunk-NGLRXEWN.js → chunk-6TWFT4Y5.js} +2 -2
  23. package/dist/chunk-6U4EODW3.js +2 -0
  24. package/dist/{chunk-SDGCKEB7.js → chunk-6YKJSETN.js} +2 -2
  25. package/dist/chunk-A2GVUCZR.js +8 -0
  26. package/dist/{chunk-WEJYUS5O.js → chunk-ADKQX2OY.js} +2 -2
  27. package/dist/{chunk-I7OTKWNY.js → chunk-ADTG377O.js} +2 -2
  28. package/dist/chunk-ATGRITZP.js +20 -0
  29. package/dist/chunk-B3HMRQDA.js +2 -0
  30. package/dist/chunk-B75HZHUP.js +2 -0
  31. package/dist/chunk-BGBBVSH4.js +2 -0
  32. package/dist/chunk-BJ7OHKB5.js +2 -0
  33. package/dist/{chunk-VN6B6HFB.js → chunk-CCB45WDY.js} +2 -2
  34. package/dist/chunk-CFLYMEUS.js +2 -0
  35. package/dist/chunk-CMGOXDVP.js +22 -0
  36. package/dist/chunk-DBIG4QAJ.js +2 -0
  37. package/dist/{chunk-RCRK4E7E.js → chunk-DMLPJ75B.js} +2 -2
  38. package/dist/chunk-DRU74YUM.js +71 -0
  39. package/dist/chunk-DTERBKUE.js +7 -0
  40. package/dist/{chunk-EKP7XJ6L.js → chunk-E55WCTLH.js} +2 -2
  41. package/dist/{chunk-ZJ737ZMD.js → chunk-F4PKYBQB.js} +2 -2
  42. package/dist/{chunk-HDA2V5DC.js → chunk-FVX4GEAC.js} +2 -2
  43. package/dist/{chunk-TR5AU6A5.js → chunk-GTNPPGZJ.js} +2 -2
  44. package/dist/{chunk-TFO4OMJZ.js → chunk-GZXXBDJA.js} +2 -2
  45. package/dist/chunk-HCQ7J2N5.js +3 -0
  46. package/dist/chunk-HQHFMPLJ.js +2 -0
  47. package/dist/{chunk-D43L5PQF.js → chunk-I6PTB2CM.js} +2 -2
  48. package/dist/{chunk-VHENVDS2.js → chunk-IJYWCB57.js} +2 -2
  49. package/dist/chunk-JTRY2YRJ.js +2 -0
  50. package/dist/chunk-L77GXANO.js +6 -0
  51. package/dist/{chunk-UUDYI3FF.js → chunk-LT6GJ27X.js} +2 -2
  52. package/dist/chunk-LUBKUISI.js +2 -0
  53. package/dist/{chunk-VQGQHIAT.js → chunk-LVYXX7ZW.js} +2 -2
  54. package/dist/{chunk-3YQO3S5D.js → chunk-LWPEZ4FP.js} +2 -2
  55. package/dist/chunk-LWWZBABT.js +2 -0
  56. package/dist/chunk-LXM7AHQG.js +4 -0
  57. package/dist/chunk-LY6NRJPJ.js +2 -0
  58. package/dist/chunk-LYS4SMAQ.js +2 -0
  59. package/dist/{chunk-7TYJD45F.js → chunk-MESUJJVQ.js} +2 -2
  60. package/dist/{chunk-6HP3BKIP.js → chunk-MHAQXOZY.js} +2 -2
  61. package/dist/chunk-N2T2GPYQ.js +2 -0
  62. package/dist/chunk-OB6PEVI3.js +2 -0
  63. package/dist/chunk-PNN3D4BE.js +2 -0
  64. package/dist/{chunk-46ILZVMX.js → chunk-PV4CEDIL.js} +2 -2
  65. package/dist/chunk-QH5GTVVB.js +3 -0
  66. package/dist/{chunk-WC43FMAB.js → chunk-QOFKVNFE.js} +2 -2
  67. package/dist/chunk-QUKZ77A6.js +4 -0
  68. package/dist/chunk-R42LZMLX.js +2 -0
  69. package/dist/{chunk-GD7XRHSV.js → chunk-R7S3UCDR.js} +2 -2
  70. package/dist/chunk-RGDUIMNE.js +3 -0
  71. package/dist/{chunk-TCCUWKH4.js → chunk-RNLUCQJB.js} +2 -2
  72. package/dist/chunk-RYBMW2EN.js +2 -0
  73. package/dist/{chunk-6ZFKI5EP.js → chunk-SA6B3EGD.js} +2 -2
  74. package/dist/chunk-T67R7V5I.js +2 -0
  75. package/dist/chunk-TMS4JPWY.js +3 -0
  76. package/dist/chunk-TTGWDUJ4.js +5 -0
  77. package/dist/chunk-TUAPDKBI.js +2 -0
  78. package/dist/chunk-UVK3SL4Z.js +2 -0
  79. package/dist/chunk-W3PQRAI4.js +2 -0
  80. package/dist/{chunk-LBAMALDV.js → chunk-WWFBDM5Y.js} +2 -2
  81. package/dist/{chunk-AQYBOORI.js → chunk-WZVTADY7.js} +1 -1
  82. package/dist/chunk-XGGTESMN.js +2 -0
  83. package/dist/{chunk-2DVVHNC3.js → chunk-Y33GRQK6.js} +2 -2
  84. package/dist/{chunk-BCFED24F.js → chunk-YIE5FZAF.js} +2 -2
  85. package/dist/chunk-YISMWW66.js +7 -0
  86. package/dist/chunk-YVQUQIBM.js +5 -0
  87. package/dist/{chunk-Z2AJQ7VA.js → chunk-YYCQQBMG.js} +2 -2
  88. package/dist/cli.js +240 -232
  89. package/dist/{config-types-CGIeLEpY.d.ts → config-types-Bok4jrO3.d.ts} +29 -1
  90. package/dist/{db-DdTPetj5.d.ts → db-BkFlkzI3.d.ts} +1 -1
  91. package/dist/{health-C6r2VgpA.d.ts → health-CbGMdRPg.d.ts} +42 -3
  92. package/dist/index.d.ts +7 -6
  93. package/dist/index.js +1 -1
  94. package/dist/postinstall.js +2 -2
  95. package/dist/queries/affected.d.ts +2 -2
  96. package/dist/queries/affected.js +1 -1
  97. package/dist/queries/bottlenecks.d.ts +2 -2
  98. package/dist/queries/bottlenecks.js +1 -1
  99. package/dist/queries/by-kind.d.ts +2 -2
  100. package/dist/queries/by-kind.js +1 -1
  101. package/dist/queries/call-graph.d.ts +2 -2
  102. package/dist/queries/call-graph.js +1 -1
  103. package/dist/queries/change-surface.d.ts +2 -2
  104. package/dist/queries/change-surface.js +1 -1
  105. package/dist/queries/cleanup-plan.d.ts +2 -2
  106. package/dist/queries/cleanup-plan.js +1 -1
  107. package/dist/queries/co-change.d.ts +5 -4
  108. package/dist/queries/co-change.js +1 -1
  109. package/dist/queries/code.d.ts +2 -2
  110. package/dist/queries/code.js +1 -1
  111. package/dist/queries/complexity-hotspots.d.ts +2 -2
  112. package/dist/queries/complexity-hotspots.js +1 -1
  113. package/dist/queries/complexity.d.ts +2 -2
  114. package/dist/queries/complexity.js +1 -1
  115. package/dist/queries/convergence.d.ts +2 -2
  116. package/dist/queries/convergence.js +1 -1
  117. package/dist/queries/coupling.d.ts +2 -2
  118. package/dist/queries/coupling.js +1 -1
  119. package/dist/queries/cycles.d.ts +2 -2
  120. package/dist/queries/cycles.js +1 -1
  121. package/dist/queries/dataflow.d.ts +2 -2
  122. package/dist/queries/dataflow.js +1 -1
  123. package/dist/queries/dead.d.ts +2 -2
  124. package/dist/queries/dead.js +1 -1
  125. package/dist/queries/deep-chains.d.ts +2 -2
  126. package/dist/queries/deep-chains.js +1 -1
  127. package/dist/queries/deps.d.ts +2 -2
  128. package/dist/queries/deps.js +1 -1
  129. package/dist/queries/diff-gate.d.ts +25 -3
  130. package/dist/queries/diff-gate.js +1 -1
  131. package/dist/queries/diff-impact.d.ts +20 -4
  132. package/dist/queries/diff-impact.js +1 -1
  133. package/dist/queries/doc-drift.d.ts +2 -2
  134. package/dist/queries/doc-drift.js +1 -1
  135. package/dist/queries/drift.d.ts +2 -2
  136. package/dist/queries/drift.js +1 -1
  137. package/dist/queries/extract-candidates.d.ts +2 -2
  138. package/dist/queries/extract-candidates.js +1 -1
  139. package/dist/queries/fan.d.ts +2 -2
  140. package/dist/queries/fan.js +1 -1
  141. package/dist/queries/files.d.ts +2 -2
  142. package/dist/queries/files.js +1 -1
  143. package/dist/queries/health.d.ts +3 -3
  144. package/dist/queries/health.js +1 -1
  145. package/dist/queries/hierarchy.d.ts +2 -2
  146. package/dist/queries/hierarchy.js +1 -1
  147. package/dist/queries/hotspots.d.ts +2 -2
  148. package/dist/queries/hotspots.js +1 -1
  149. package/dist/queries/imports.d.ts +2 -2
  150. package/dist/queries/imports.js +1 -1
  151. package/dist/queries/incomplete-migration.d.ts +4 -2
  152. package/dist/queries/incomplete-migration.js +1 -1
  153. package/dist/queries/index.d.ts +11 -5
  154. package/dist/queries/index.js +1 -1
  155. package/dist/queries/isolated.d.ts +2 -2
  156. package/dist/queries/isolated.js +1 -1
  157. package/dist/queries/members.d.ts +2 -2
  158. package/dist/queries/members.js +1 -1
  159. package/dist/queries/methods.d.ts +2 -2
  160. package/dist/queries/methods.js +1 -1
  161. package/dist/queries/outline.d.ts +2 -2
  162. package/dist/queries/outline.js +1 -1
  163. package/dist/queries/passthrough-candidates.d.ts +2 -2
  164. package/dist/queries/passthrough-candidates.js +1 -1
  165. package/dist/queries/plan-context.d.ts +2 -2
  166. package/dist/queries/plan-context.js +1 -1
  167. package/dist/queries/react-component-duplicates.d.ts +31 -0
  168. package/dist/queries/react-component-duplicates.js +2 -0
  169. package/dist/queries/react-hook-candidates.d.ts +34 -0
  170. package/dist/queries/react-hook-candidates.js +2 -0
  171. package/dist/queries/react-large-component-pressure.d.ts +28 -0
  172. package/dist/queries/react-large-component-pressure.js +2 -0
  173. package/dist/queries/recent-duplicates.d.ts +10 -3
  174. package/dist/queries/recent-duplicates.js +1 -1
  175. package/dist/queries/redundant-reexports.d.ts +2 -2
  176. package/dist/queries/redundant-reexports.js +1 -1
  177. package/dist/queries/refs.d.ts +2 -2
  178. package/dist/queries/refs.js +1 -1
  179. package/dist/queries/self-audit.d.ts +2 -2
  180. package/dist/queries/self-audit.js +1 -1
  181. package/dist/queries/similar-chains.d.ts +2 -2
  182. package/dist/queries/similar-chains.js +1 -1
  183. package/dist/queries/similar-files.d.ts +2 -2
  184. package/dist/queries/similar-files.js +1 -1
  185. package/dist/queries/similar-signatures.d.ts +2 -2
  186. package/dist/queries/similar-signatures.js +1 -1
  187. package/dist/queries/similar.d.ts +8 -3
  188. package/dist/queries/similar.js +1 -1
  189. package/dist/queries/slice.d.ts +2 -2
  190. package/dist/queries/slice.js +1 -1
  191. package/dist/queries/stale-abstractions.d.ts +2 -2
  192. package/dist/queries/stale-abstractions.js +1 -1
  193. package/dist/queries/stats.d.ts +2 -2
  194. package/dist/queries/stats.js +1 -1
  195. package/dist/queries/surface.d.ts +2 -2
  196. package/dist/queries/surface.js +1 -1
  197. package/dist/queries/symbols.d.ts +2 -2
  198. package/dist/queries/symbols.js +1 -1
  199. package/dist/queries/system.d.ts +2 -2
  200. package/dist/queries/system.js +1 -1
  201. package/dist/queries/trace.d.ts +2 -2
  202. package/dist/queries/trace.js +1 -1
  203. package/dist/queries/unused-params.d.ts +2 -2
  204. package/dist/queries/unused-params.js +1 -1
  205. package/dist/queries/vue-component-duplicates.d.ts +35 -0
  206. package/dist/queries/vue-component-duplicates.js +2 -0
  207. package/dist/queries/vue-composable-candidates.d.ts +34 -0
  208. package/dist/queries/vue-composable-candidates.js +2 -0
  209. package/dist/queries/vue-large-view-pressure.d.ts +31 -0
  210. package/dist/queries/vue-large-view-pressure.js +2 -0
  211. package/dist/queries/wrapper-candidates.d.ts +2 -2
  212. package/dist/queries/wrapper-candidates.js +1 -1
  213. package/dist/reindex-worker.js +10 -10
  214. package/dist/reindex.d.ts +1 -1
  215. package/dist/reindex.js +22 -22
  216. package/dist/runtime.d.ts +1 -1
  217. package/dist/runtime.js +2 -2
  218. package/docs/AGENT_GUIDE.md +353 -0
  219. package/docs/AI_FAILURE_MODES.md +278 -0
  220. package/docs/API.md +40 -0
  221. package/docs/COMMAND_REFERENCE.md +130 -0
  222. package/docs/DETECTOR_GUIDE.md +119 -0
  223. package/docs/accuracy-hardening-goal.md +54 -0
  224. package/docs/assets/scip-query-logo-dark.svg +21 -0
  225. package/docs/assets/scip-query-logo.svg +24 -0
  226. package/package.json +31 -3
  227. package/skills/scip-maintainability/SKILL.md +24 -3
  228. package/skills/scip-query/SKILL.md +2 -1
  229. package/skills/scip-react-maintainability/SKILL.md +114 -0
  230. package/skills/scip-vue-maintainability/SKILL.md +130 -0
  231. package/dist/chunk-2Y2WIJI4.js +0 -2
  232. package/dist/chunk-44G4P3GJ.js +0 -2
  233. package/dist/chunk-64UY7VTR.js +0 -63
  234. package/dist/chunk-6G76D2YM.js +0 -2
  235. package/dist/chunk-APLCSDXL.js +0 -4
  236. package/dist/chunk-CVRXOP6M.js +0 -3
  237. package/dist/chunk-EAU4RDFG.js +0 -2
  238. package/dist/chunk-FYT2PE7C.js +0 -2
  239. package/dist/chunk-I66MQD5U.js +0 -2
  240. package/dist/chunk-IBM6FXOQ.js +0 -3
  241. package/dist/chunk-JTCEWV7Q.js +0 -2
  242. package/dist/chunk-K3V6XUTL.js +0 -2
  243. package/dist/chunk-L6TOEQ2M.js +0 -2
  244. package/dist/chunk-LR7E2ATW.js +0 -8
  245. package/dist/chunk-MX6F756F.js +0 -2
  246. package/dist/chunk-NM3BZXHA.js +0 -2
  247. package/dist/chunk-NO2TPMCQ.js +0 -2
  248. package/dist/chunk-OMNT7E2T.js +0 -4
  249. package/dist/chunk-PBGTMPJ7.js +0 -2
  250. package/dist/chunk-PCMVXWDC.js +0 -34
  251. package/dist/chunk-PLFYFZX3.js +0 -2
  252. package/dist/chunk-R3G6ERW7.js +0 -7
  253. package/dist/chunk-SEZZ24IG.js +0 -2
  254. package/dist/chunk-SLX5XBCD.js +0 -7
  255. package/dist/chunk-SOGLYIJ4.js +0 -62
  256. package/dist/chunk-SQ6VENQY.js +0 -6
  257. package/dist/chunk-T4AK46CM.js +0 -16
  258. package/dist/chunk-TH4JVC34.js +0 -71
  259. package/dist/chunk-TQTVM27C.js +0 -6
  260. package/dist/chunk-VDZL45XI.js +0 -2
  261. package/dist/chunk-WQFOZIID.js +0 -4
  262. package/dist/chunk-Y3RUPPIU.js +0 -2
  263. package/dist/chunk-YO6DU7QZ.js +0 -2
@@ -58,6 +58,10 @@ interface ScipQueryConfig {
58
58
  gitignorePaths?: string[];
59
59
  /** Optional semantic-provider configuration */
60
60
  semantic?: SemanticConfig;
61
+ /** Machine-readable accepted findings. */
62
+ suppressions?: FindingSuppression[];
63
+ /** Project-declared file groups that intentionally change together. */
64
+ declaredCouplings?: DeclaredCouplingConfig[];
61
65
  }
62
66
  interface ProjectConfig {
63
67
  /** Override which languages to index (default: auto-detect) */
@@ -72,6 +76,30 @@ interface ProjectConfig {
72
76
  entryRoots?: EntryRootsConfig;
73
77
  /** Optional semantic-provider configuration */
74
78
  semantic?: SemanticConfig;
79
+ /** Machine-readable accepted findings. */
80
+ suppressions?: FindingSuppression[];
81
+ /** Project-declared file groups that intentionally change together. */
82
+ declaredCouplings?: DeclaredCouplingConfig[];
83
+ }
84
+ interface DeclaredCouplingConfig {
85
+ /** Human-readable name for the maintenance unit. */
86
+ name: string;
87
+ /** Exact relative file paths that form one intentional co-change group. */
88
+ files: string[];
89
+ /** Human reason for why these files should move together. */
90
+ reason?: string;
91
+ }
92
+ interface FindingSuppression {
93
+ /** Stable finding id, for example SQABC123DEF456. */
94
+ id?: string;
95
+ /** Detector/check name, for example diff-gate's "echo". */
96
+ check?: string;
97
+ /** Optional file path to narrow check-level suppressions. */
98
+ file?: string;
99
+ /** Human reason for accepting the finding. Required by config validation. */
100
+ reason: string;
101
+ /** ISO date after which the suppression no longer applies. */
102
+ expiresAt?: string;
75
103
  }
76
104
  interface SemanticConfig {
77
105
  typescript?: TypeScriptSemanticConfig;
@@ -105,4 +133,4 @@ interface IndexerOverrides {
105
133
  pnpmWorkspaces?: boolean;
106
134
  }
107
135
 
108
- export type { IndexerConfig as I, ProjectConfig as P, ScipQueryConfig as S, SupportedLanguage as a };
136
+ export type { FindingSuppression as F, IndexerConfig as I, ProjectConfig as P, ScipQueryConfig as S, SupportedLanguage as a };
@@ -1,5 +1,5 @@
1
1
  import Database from 'better-sqlite3';
2
- import { S as ScipQueryConfig } from './config-types-CGIeLEpY.js';
2
+ import { S as ScipQueryConfig } from './config-types-Bok4jrO3.js';
3
3
 
4
4
  /**
5
5
  * Builds a gitignore-based path filter from .gitignore files found
@@ -1,4 +1,4 @@
1
- import { S as ScipDatabase } from './db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from './db-BkFlkzI3.js';
2
2
  import { stats } from './queries/stats.js';
3
3
 
4
4
  /**
@@ -12,7 +12,10 @@ interface ChangeAmplificationSummary {
12
12
  commitsAnalyzed: number;
13
13
  }
14
14
  interface CountLocSummary {
15
+ /** Raw finding count reported to users. */
15
16
  count: number;
17
+ /** Score-pressure count; lower than count when findings are broad discovery leads. */
18
+ scoreCount?: number;
16
19
  loc: number;
17
20
  /** Files contributing findings — feeds fix-density validation. */
18
21
  files?: string[];
@@ -75,6 +78,15 @@ interface ScoreDeduction {
75
78
  /** Risk deductions are empirically validated predictors; hygiene are tidiness signals. */
76
79
  kind: 'risk' | 'hygiene';
77
80
  }
81
+ interface HealthPressure {
82
+ axis: string;
83
+ category: string;
84
+ kind: ScoreDeduction['kind'];
85
+ count: number;
86
+ threshold: number;
87
+ ratio: number;
88
+ extraPenalty: number;
89
+ }
78
90
  interface HealthAxes {
79
91
  /** LOC provably removable with behavior preserved (dead + isolated). */
80
92
  deletable: {
@@ -86,7 +98,7 @@ interface HealthAxes {
86
98
  };
87
99
  /** Files touched per commit — the measured cost of one conceptual change. */
88
100
  changeAmplification: ChangeAmplificationSummary | null;
89
- /** File pairs that co-change without a dependency edge — concepts the reference graph can't see. */
101
+ /** File pairs that co-change without a structural link — concepts the visible graph can't see. */
90
102
  hiddenCoupling: {
91
103
  pairCount: number;
92
104
  top: Array<{
@@ -145,6 +157,14 @@ interface HealthReport {
145
157
  isolatedLoc: number;
146
158
  cycles: number;
147
159
  similarPairs: number;
160
+ reactComponentDuplicatePairs: number;
161
+ reactHookCandidatePairs: number;
162
+ reactHookCandidateScoreCount: number;
163
+ reactLargeComponentPressureFiles: number;
164
+ vueComponentDuplicatePairs: number;
165
+ vueComposableCandidatePairs: number;
166
+ vueComposableCandidateScoreCount: number;
167
+ vueLargeViewPressureFiles: number;
148
168
  extractionCandidates: number;
149
169
  wrappers: number;
150
170
  passthroughs: number;
@@ -160,6 +180,7 @@ interface HealthReport {
160
180
  byCategory: Record<string, number>;
161
181
  } | null;
162
182
  actions: HealthAction[];
183
+ pressure: HealthPressure[];
163
184
  topComplexity: Array<{
164
185
  symbol: string;
165
186
  score: number;
@@ -168,7 +189,7 @@ interface HealthReport {
168
189
  warnings?: string[];
169
190
  }
170
191
 
171
- declare const HEALTH_PHASES: readonly ["overview", "dead", "isolated", "cycles", "similar", "extract-candidates", "wrapper-candidates", "passthrough-candidates", "stale-abstractions", "drift", "complexity-hotspots", "git-evidence", "suppressions"];
192
+ declare const HEALTH_PHASES: readonly ["overview", "dead", "isolated", "cycles", "similar", "react-component-duplicates", "react-hook-candidates", "react-large-component-pressure", "vue-component-duplicates", "vue-composable-candidates", "vue-large-view-pressure", "extract-candidates", "wrapper-candidates", "passthrough-candidates", "stale-abstractions", "drift", "complexity-hotspots", "git-evidence", "suppressions"];
172
193
  type HealthPhaseName = typeof HEALTH_PHASES[number];
173
194
  type HealthPhaseResult = {
174
195
  phase: 'overview';
@@ -186,6 +207,24 @@ type HealthPhaseResult = {
186
207
  } | {
187
208
  phase: 'similar';
188
209
  similarCount: number;
210
+ } | {
211
+ phase: 'react-component-duplicates';
212
+ reactComponentDuplicates: CountLocSummary;
213
+ } | {
214
+ phase: 'react-hook-candidates';
215
+ reactHookCandidates: CountLocSummary;
216
+ } | {
217
+ phase: 'react-large-component-pressure';
218
+ reactLargeComponentPressure: CountLocSummary;
219
+ } | {
220
+ phase: 'vue-component-duplicates';
221
+ vueComponentDuplicates: CountLocSummary;
222
+ } | {
223
+ phase: 'vue-composable-candidates';
224
+ vueComposableCandidates: CountLocSummary;
225
+ } | {
226
+ phase: 'vue-large-view-pressure';
227
+ vueLargeViewPressure: CountLocSummary;
189
228
  } | {
190
229
  phase: 'extract-candidates';
191
230
  extractCount: number;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from './db-DdTPetj5.js';
2
- export { c as createGitignoreFilter } from './db-DdTPetj5.js';
3
- export { S as ScipQueryConfig } from './config-types-CGIeLEpY.js';
1
+ import { S as ScipDatabase } from './db-BkFlkzI3.js';
2
+ export { c as createGitignoreFilter } from './db-BkFlkzI3.js';
3
+ export { S as ScipQueryConfig } from './config-types-Bok4jrO3.js';
4
4
  import 'better-sqlite3';
5
5
 
6
6
  /**
@@ -199,7 +199,7 @@ interface SourceReferenceResolveContext {
199
199
  }
200
200
  declare function scanSourceReferences(db: ScipDatabase, opts: ScanSourceReferencesOptions, visit: (hit: SourceReferenceHit) => void): void;
201
201
 
202
- interface ProductionCallableDefinitionsOptions {
202
+ declare function productionCallableDefinitions(db: ScipDatabase, opts?: {
203
203
  scope?: string;
204
204
  minLoc?: number;
205
205
  maxLoc?: number;
@@ -217,13 +217,14 @@ interface ProductionCallableDefinitionsOptions {
217
217
  requireFunctionLikeSymbol?: boolean;
218
218
  requireCallableSymbol?: boolean;
219
219
  sortByLocDesc?: boolean;
220
- }
220
+ }): IndexedDefinition[];
221
+
221
222
  declare class ProjectIndex {
222
223
  private readonly db;
223
224
  constructor(db: ScipDatabase);
224
225
  scopedDefinitions(scope?: string): IndexedDefinition[];
225
226
  definitionsForFile(relativePath: string): IndexedDefinition[];
226
- productionCallableDefinitions(opts?: ProductionCallableDefinitionsOptions): IndexedDefinition[];
227
+ productionCallableDefinitions(opts?: NonNullable<Parameters<typeof productionCallableDefinitions>[1]>): IndexedDefinition[];
227
228
  calleeMap(definitions: ReadonlyArray<SymbolMatch>, opts?: {
228
229
  additive?: boolean;
229
230
  semantic?: boolean;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{a}from"./chunk-TKDJQ2WD.js";import{a as s}from"./chunk-NO2TPMCQ.js";import"./chunk-TQTVM27C.js";import"./chunk-RIXOMSOR.js";import"./chunk-EAU4RDFG.js";import"./chunk-PCMVXWDC.js";import"./chunk-6ZFKI5EP.js";import"./chunk-64UY7VTR.js";import"./chunk-7I6KNKE3.js";import"./chunk-APLCSDXL.js";import"./chunk-WEJYUS5O.js";import"./chunk-PBGTMPJ7.js";import{a as i,c as n,d as l}from"./chunk-SOGLYIJ4.js";import"./chunk-WQFOZIID.js";import"./chunk-NN3O7TPH.js";import"./chunk-VDZL45XI.js";import c from"better-sqlite3";var d=["node_modules",".git","dist","build","out","coverage","target",".next",".nuxt",".cache",".turbo",".scipquery-cache","__pycache__",".venv","venv"],o=class{db;config;pathFilter;constructor(t,e){this.config=t,this.pathFilter=e??null,this.db=new c(t.dbPath,{readonly:!0}),this.db.pragma("busy_timeout = 5000")}isIgnored(t){return this.pathFilter?.isIgnored(t)??!1}get localSymbolPredicate(){return`(
1
+ import{a}from"./chunk-TKDJQ2WD.js";import{a as s}from"./chunk-W3PQRAI4.js";import"./chunk-L77GXANO.js";import"./chunk-BGBBVSH4.js";import"./chunk-623UQCVG.js";import"./chunk-44JOJLMO.js";import"./chunk-SA6B3EGD.js";import"./chunk-QH5GTVVB.js";import"./chunk-5ALI77D7.js";import"./chunk-5D3BT4B4.js";import"./chunk-QUKZ77A6.js";import"./chunk-ADKQX2OY.js";import{a as i,c as n,d as l}from"./chunk-64LH2QUP.js";import"./chunk-T67R7V5I.js";import"./chunk-XGGTESMN.js";import"./chunk-HCQ7J2N5.js";import"./chunk-YVQUQIBM.js";import"./chunk-CMGOXDVP.js";import"./chunk-TMS4JPWY.js";import"./chunk-NN3O7TPH.js";import"./chunk-BJ7OHKB5.js";import c from"better-sqlite3";var d=["node_modules",".git","dist","build","out","coverage","target",".next",".nuxt",".cache",".turbo",".scipquery-cache","__pycache__",".venv","venv"],o=class{db;config;pathFilter;constructor(t,e){this.config=t,this.pathFilter=e??null,this.db=new c(t.dbPath,{readonly:!0}),this.db.pragma("busy_timeout = 5000")}isIgnored(t){return this.pathFilter?.isIgnored(t)??!1}get localSymbolPredicate(){return`(
2
2
  EXISTS (
3
3
  SELECT 1
4
4
  FROM defn_enclosing_ranges local_der
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import{b as k,c as g,d as f,e as m}from"./chunk-LWYIGRHR.js";import{existsSync as p,mkdirSync as L,symlinkSync as v,readlinkSync as b,unlinkSync as q}from"fs";import{join as t,dirname as y,resolve as d}from"path";import{homedir as u,platform as C}from"os";import{fileURLToPath as N}from"url";var R=C()==="win32",T=["scip-query","concrete-plan","scip-ai-cleanup","scip-explore","scip-debloat","scip-doc-reconcile","scip-maintainability","scip-verify","scip-language-playbook"];function A(n={}){let e=n.quiet?()=>{}:console.log,o=N(import.meta.url),I=d(y(o),"..","skills"),$=[t(u(),".claude","skills"),t(u(),".codex","skills"),t(u(),".agents","skills")],s={installed:[],skipped:[],alreadyLinked:[]};for(let r of $){let h=y(r);if(!p(h))continue;L(r,{recursive:!0});let l=j(r);for(let i of T){let a=t(I,i),c=t(r,i);if(!p(a)){s.skipped.push(`${l}/${i}`);continue}if(p(c)){try{let x=b(c);if(d(x)===d(a)){s.alreadyLinked.push(`${l}/${i}`),e(` ok: ${i} \u2192 ${l} (already linked)`);continue}}catch{s.skipped.push(`${l}/${i}`),e(` skip: ${i} \u2192 ${l} (exists, not a symlink)`);continue}q(c)}v(a,c,R?"junction":"dir"),s.installed.push(`${l}/${i}`),e(` done: ${i} \u2192 ${l}`)}}return s}function j(n){return n.includes(".codex")?"Codex":n.includes(".agents")?"Agents":"Claude"}function S(){console.log("scip-query: installing skills...");let n=A({quiet:!1});if(n.installed.length+n.alreadyLinked.length>0&&console.log(`
3
- ${n.installed.length} skill(s) installed, ${n.alreadyLinked.length} already linked.`),!k())console.log(`
2
+ import{b as k,c as g,d as f,e as m}from"./chunk-LWYIGRHR.js";import{existsSync as p,mkdirSync as L,symlinkSync as b,readlinkSync as v,unlinkSync as q}from"fs";import{join as s,dirname as y,resolve as d}from"path";import{homedir as u,platform as C}from"os";import{fileURLToPath as N}from"url";var R=C()==="win32",T=["scip-query","concrete-plan","scip-ai-cleanup","scip-explore","scip-debloat","scip-doc-reconcile","scip-maintainability","scip-react-maintainability","scip-vue-maintainability","scip-verify","scip-language-playbook"];function A(i={}){let e=i.quiet?()=>{}:console.log,o=N(import.meta.url),I=d(y(o),"..","skills"),$=[s(u(),".claude","skills"),s(u(),".codex","skills"),s(u(),".agents","skills")],l={installed:[],skipped:[],alreadyLinked:[]};for(let r of $){let h=y(r);if(!p(h))continue;L(r,{recursive:!0});let t=j(r);for(let n of T){let a=s(I,n),c=s(r,n);if(!p(a)){l.skipped.push(`${t}/${n}`);continue}if(p(c)){try{let x=v(c);if(d(x)===d(a)){l.alreadyLinked.push(`${t}/${n}`),e(` ok: ${n} \u2192 ${t} (already linked)`);continue}}catch{l.skipped.push(`${t}/${n}`),e(` skip: ${n} \u2192 ${t} (exists, not a symlink)`);continue}q(c)}b(a,c,R?"junction":"dir"),l.installed.push(`${t}/${n}`),e(` done: ${n} \u2192 ${t}`)}}return l}function j(i){return i.includes(".codex")?"Codex":i.includes(".agents")?"Agents":"Claude"}function S(){console.log("scip-query: installing skills...");let i=A({quiet:!1});if(i.installed.length+i.alreadyLinked.length>0&&console.log(`
3
+ ${i.installed.length} skill(s) installed, ${i.alreadyLinked.length} already linked.`),!k())console.log(`
4
4
  scip CLI not found on PATH. Attempting auto-install...`),m(console.log)||f();else{let o=g();console.log(`
5
5
  scip CLI: ${o??"installed"}`)}console.log("")}S();
6
6
  //# sourceMappingURL=postinstall.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface AffectedResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-UUDYI3FF.js";import"../chunk-EAU4RDFG.js";import"../chunk-PCMVXWDC.js";import"../chunk-6ZFKI5EP.js";import"../chunk-64UY7VTR.js";import"../chunk-7I6KNKE3.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as affected};
1
+ import{a}from"../chunk-LT6GJ27X.js";import"../chunk-623UQCVG.js";import"../chunk-44JOJLMO.js";import"../chunk-SA6B3EGD.js";import"../chunk-QH5GTVVB.js";import"../chunk-5ALI77D7.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as affected};
2
2
  //# sourceMappingURL=affected.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface BottleneckResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-L6TOEQ2M.js";import"../chunk-MX6F756F.js";import"../chunk-NO2TPMCQ.js";import"../chunk-TQTVM27C.js";import"../chunk-RIXOMSOR.js";import"../chunk-EAU4RDFG.js";import"../chunk-PCMVXWDC.js";import"../chunk-6ZFKI5EP.js";import"../chunk-64UY7VTR.js";import"../chunk-7I6KNKE3.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as bottlenecks};
1
+ import{a}from"../chunk-LUBKUISI.js";import"../chunk-B75HZHUP.js";import"../chunk-W3PQRAI4.js";import"../chunk-L77GXANO.js";import"../chunk-BGBBVSH4.js";import"../chunk-623UQCVG.js";import"../chunk-44JOJLMO.js";import"../chunk-SA6B3EGD.js";import"../chunk-QH5GTVVB.js";import"../chunk-5ALI77D7.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as bottlenecks};
2
2
  //# sourceMappingURL=bottlenecks.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface ByKindResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a,b}from"../chunk-RCRK4E7E.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as byKind,b as kindCounts};
1
+ import{a,b}from"../chunk-DMLPJ75B.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as byKind,b as kindCounts};
2
2
  //# sourceMappingURL=by-kind.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface CallGraphResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-D43L5PQF.js";import"../chunk-MX6F756F.js";import"../chunk-EAU4RDFG.js";import"../chunk-PCMVXWDC.js";import"../chunk-6ZFKI5EP.js";import"../chunk-64UY7VTR.js";import"../chunk-7I6KNKE3.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as callGraph};
1
+ import{a}from"../chunk-I6PTB2CM.js";import"../chunk-B75HZHUP.js";import"../chunk-BGBBVSH4.js";import"../chunk-623UQCVG.js";import"../chunk-44JOJLMO.js";import"../chunk-SA6B3EGD.js";import"../chunk-QH5GTVVB.js";import"../chunk-5ALI77D7.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as callGraph};
2
2
  //# sourceMappingURL=call-graph.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface ChangeSurfaceEntry {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-ITUU3VE3.js";import"../chunk-WC43FMAB.js";import"../chunk-NO2TPMCQ.js";import"../chunk-TQTVM27C.js";import"../chunk-RIXOMSOR.js";import"../chunk-EAU4RDFG.js";import"../chunk-PCMVXWDC.js";import"../chunk-6ZFKI5EP.js";import"../chunk-64UY7VTR.js";import"../chunk-7I6KNKE3.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as changeSurface};
1
+ import{a}from"../chunk-4N7LFYSD.js";import"../chunk-QOFKVNFE.js";import"../chunk-W3PQRAI4.js";import"../chunk-L77GXANO.js";import"../chunk-BGBBVSH4.js";import"../chunk-623UQCVG.js";import"../chunk-44JOJLMO.js";import"../chunk-SA6B3EGD.js";import"../chunk-QH5GTVVB.js";import"../chunk-5ALI77D7.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as changeSurface};
2
2
  //# sourceMappingURL=change-surface.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface CleanupPlanEntry {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a,b}from"../chunk-VTF5EH22.js";import"../chunk-YO6DU7QZ.js";import"../chunk-MX6F756F.js";import"../chunk-NO2TPMCQ.js";import"../chunk-TQTVM27C.js";import"../chunk-RIXOMSOR.js";import"../chunk-EAU4RDFG.js";import"../chunk-PCMVXWDC.js";import"../chunk-6ZFKI5EP.js";import"../chunk-64UY7VTR.js";import"../chunk-7I6KNKE3.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{b as RemovedRangeIndex,a as cleanupPlan};
1
+ import{a,b}from"../chunk-27KPKLRJ.js";import"../chunk-6U4EODW3.js";import"../chunk-B75HZHUP.js";import"../chunk-W3PQRAI4.js";import"../chunk-L77GXANO.js";import"../chunk-BGBBVSH4.js";import"../chunk-623UQCVG.js";import"../chunk-44JOJLMO.js";import"../chunk-SA6B3EGD.js";import"../chunk-QH5GTVVB.js";import"../chunk-5ALI77D7.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{b as RemovedRangeIndex,a as cleanupPlan};
2
2
  //# sourceMappingURL=cleanup-plan.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface CoChangeFinding {
6
6
  fileA: string;
@@ -11,7 +11,7 @@ interface CoChangeFinding {
11
11
  confidence: number;
12
12
  changesA: number;
13
13
  changesB: number;
14
- /** True when a dependency edge already explains the coupling. */
14
+ /** True when a dependency edge or declared coupling already explains the pair. */
15
15
  structurallyLinked: boolean;
16
16
  }
17
17
  interface CoChangeResult {
@@ -23,7 +23,7 @@ interface CoChangeResult {
23
23
  declare function isCoChangeNoiseFile(file: string): boolean;
24
24
  /**
25
25
  * Hidden coupling from the change graph: file pairs that repeatedly change
26
- * in the same commits but have NO dependency edge between them.
26
+ * in the same commits but have no structural link between them.
27
27
  *
28
28
  * The reference graph cannot see that two mechanisms implement one concept —
29
29
  * a config list and the test that checks it share no symbols. The commit
@@ -37,6 +37,7 @@ declare function coChange(db: ScipDatabase, file?: string, opts?: {
37
37
  minConfidence?: number;
38
38
  limit?: number;
39
39
  includeLinked?: boolean;
40
+ maxFilesPerCommit?: number;
40
41
  }): CoChangeResult;
41
42
 
42
43
  export { type CoChangeFinding, type CoChangeResult, coChange, isCoChangeNoiseFile };
@@ -1,2 +1,2 @@
1
- import{a,b}from"../chunk-I66MQD5U.js";import"../chunk-R3G6ERW7.js";import"../chunk-TQTVM27C.js";import"../chunk-RIXOMSOR.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{b as coChange,a as isCoChangeNoiseFile};
1
+ import{a,b}from"../chunk-RYBMW2EN.js";import"../chunk-YISMWW66.js";import"../chunk-L77GXANO.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{b as coChange,a as isCoChangeNoiseFile};
2
2
  //# sourceMappingURL=co-change.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface CodeResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-Z2AJQ7VA.js";import"../chunk-WC43FMAB.js";import"../chunk-7I6KNKE3.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as code};
1
+ import{a}from"../chunk-YYCQQBMG.js";import"../chunk-QOFKVNFE.js";import"../chunk-5ALI77D7.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as code};
2
2
  //# sourceMappingURL=code.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface ComplexityHotspot {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-VHENVDS2.js";import"../chunk-V76FCF5F.js";import"../chunk-MX6F756F.js";import"../chunk-NO2TPMCQ.js";import"../chunk-TQTVM27C.js";import"../chunk-RIXOMSOR.js";import"../chunk-EAU4RDFG.js";import"../chunk-PCMVXWDC.js";import"../chunk-6ZFKI5EP.js";import"../chunk-64UY7VTR.js";import"../chunk-7I6KNKE3.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as complexityHotspots};
1
+ import{a}from"../chunk-IJYWCB57.js";import"../chunk-5BZOSICN.js";import"../chunk-B75HZHUP.js";import"../chunk-W3PQRAI4.js";import"../chunk-L77GXANO.js";import"../chunk-BGBBVSH4.js";import"../chunk-623UQCVG.js";import"../chunk-44JOJLMO.js";import"../chunk-SA6B3EGD.js";import"../chunk-QH5GTVVB.js";import"../chunk-5ALI77D7.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as complexityHotspots};
2
2
  //# sourceMappingURL=complexity-hotspots.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface ComplexityResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-YSSTUCNS.js";import"../chunk-NO2TPMCQ.js";import"../chunk-TQTVM27C.js";import"../chunk-RIXOMSOR.js";import"../chunk-EAU4RDFG.js";import"../chunk-PCMVXWDC.js";import"../chunk-6ZFKI5EP.js";import"../chunk-64UY7VTR.js";import"../chunk-7I6KNKE3.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as complexity};
1
+ import{a}from"../chunk-5HDYAOSF.js";import"../chunk-W3PQRAI4.js";import"../chunk-L77GXANO.js";import"../chunk-BGBBVSH4.js";import"../chunk-623UQCVG.js";import"../chunk-44JOJLMO.js";import"../chunk-SA6B3EGD.js";import"../chunk-QH5GTVVB.js";import"../chunk-5ALI77D7.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as complexity};
2
2
  //# sourceMappingURL=complexity.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface ConvergenceResult {
6
6
  symbolA: {
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-I7OTKWNY.js";import"../chunk-PCMVXWDC.js";import"../chunk-6ZFKI5EP.js";import"../chunk-64UY7VTR.js";import"../chunk-7I6KNKE3.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as convergence};
1
+ import{a}from"../chunk-ADTG377O.js";import"../chunk-44JOJLMO.js";import"../chunk-SA6B3EGD.js";import"../chunk-QH5GTVVB.js";import"../chunk-5ALI77D7.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as convergence};
2
2
  //# sourceMappingURL=convergence.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface CouplingResult {
6
6
  file1: string;
@@ -1,2 +1,2 @@
1
- import{a,b}from"../chunk-46ILZVMX.js";import"../chunk-WC43FMAB.js";import"../chunk-7I6KNKE3.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as coupling,b as topCoupling};
1
+ import{a,b}from"../chunk-PV4CEDIL.js";import"../chunk-QOFKVNFE.js";import"../chunk-5ALI77D7.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as coupling,b as topCoupling};
2
2
  //# sourceMappingURL=coupling.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface CycleResult {
6
6
  /** Files forming a cycle, in order */
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-EKP7XJ6L.js";import"../chunk-TQTVM27C.js";import"../chunk-RIXOMSOR.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as cycles};
1
+ import{a}from"../chunk-E55WCTLH.js";import"../chunk-L77GXANO.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as cycles};
2
2
  //# sourceMappingURL=cycles.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface DataflowResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-BCFED24F.js";import"../chunk-MX6F756F.js";import"../chunk-EAU4RDFG.js";import"../chunk-PCMVXWDC.js";import"../chunk-6ZFKI5EP.js";import"../chunk-64UY7VTR.js";import"../chunk-7I6KNKE3.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as dataflow};
1
+ import{a}from"../chunk-YIE5FZAF.js";import"../chunk-B75HZHUP.js";import"../chunk-BGBBVSH4.js";import"../chunk-623UQCVG.js";import"../chunk-44JOJLMO.js";import"../chunk-SA6B3EGD.js";import"../chunk-QH5GTVVB.js";import"../chunk-5ALI77D7.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as dataflow};
2
2
  //# sourceMappingURL=dataflow.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface DeadOptions {
6
6
  scope?: string;
@@ -1,2 +1,2 @@
1
- import{b as a}from"../chunk-YO6DU7QZ.js";import"../chunk-MX6F756F.js";import"../chunk-NO2TPMCQ.js";import"../chunk-TQTVM27C.js";import"../chunk-RIXOMSOR.js";import"../chunk-EAU4RDFG.js";import"../chunk-PCMVXWDC.js";import"../chunk-6ZFKI5EP.js";import"../chunk-64UY7VTR.js";import"../chunk-7I6KNKE3.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as dead};
1
+ import{b as a}from"../chunk-6U4EODW3.js";import"../chunk-B75HZHUP.js";import"../chunk-W3PQRAI4.js";import"../chunk-L77GXANO.js";import"../chunk-BGBBVSH4.js";import"../chunk-623UQCVG.js";import"../chunk-44JOJLMO.js";import"../chunk-SA6B3EGD.js";import"../chunk-QH5GTVVB.js";import"../chunk-5ALI77D7.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as dead};
2
2
  //# sourceMappingURL=dead.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface DeepChainResult {
6
6
  /** Files in the chain, from leaf to root */
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-PE4EJOLN.js";import"../chunk-RIXOMSOR.js";import"../chunk-APLCSDXL.js";import"../chunk-WEJYUS5O.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as deepChains};
1
+ import{a}from"../chunk-332L7SRO.js";import"../chunk-5D3BT4B4.js";import"../chunk-QUKZ77A6.js";import"../chunk-ADKQX2OY.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as deepChains};
2
2
  //# sourceMappingURL=deep-chains.js.map
@@ -1,6 +1,6 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bok4jrO3.js';
4
4
 
5
5
  interface DepResult {
6
6
  relativePath: string;
@@ -1,2 +1,2 @@
1
- import{a,b}from"../chunk-AGW2MVIO.js";import"../chunk-WC43FMAB.js";import"../chunk-7I6KNKE3.js";import"../chunk-SOGLYIJ4.js";import"../chunk-WQFOZIID.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as deps,b as rdeps};
1
+ import{a,b}from"../chunk-5VB3WU7K.js";import"../chunk-QOFKVNFE.js";import"../chunk-5ALI77D7.js";import"../chunk-64LH2QUP.js";import"../chunk-T67R7V5I.js";import"../chunk-XGGTESMN.js";import"../chunk-HCQ7J2N5.js";import"../chunk-YVQUQIBM.js";import"../chunk-CMGOXDVP.js";import"../chunk-TMS4JPWY.js";import"../chunk-NN3O7TPH.js";import"../chunk-BJ7OHKB5.js";export{a as deps,b as rdeps};
2
2
  //# sourceMappingURL=deps.js.map
@@ -1,13 +1,28 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-BkFlkzI3.js';
2
+ import { F as FindingSuppression } from '../config-types-Bok4jrO3.js';
2
3
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
4
4
 
5
5
  type DiffGateCheck = 'echo' | 'incomplete-migration' | 'co-change-partner' | 'doc-reference' | 'unused-params' | 'new-dead' | 'baseline';
6
+ /** Canonical check list — the CLI validates `--skip` values against this. */
7
+ declare const DIFF_GATE_CHECKS: readonly DiffGateCheck[];
8
+ type DiffGateEvidence = 'graph-fact' | 'semantic' | 'heuristic' | 'change-graph' | 'baseline';
9
+ type DiffGateSeverity = 'info' | 'warning' | 'error';
6
10
  interface DiffGateFinding {
11
+ id: string;
7
12
  check: DiffGateCheck;
13
+ severity: DiffGateSeverity;
14
+ evidence: DiffGateEvidence;
15
+ confidence?: number;
16
+ file?: string;
17
+ startLine?: number;
18
+ endLine?: number;
19
+ symbol?: string;
20
+ relatedFiles?: string[];
8
21
  message: string;
22
+ why: string[];
9
23
  /** Concrete remediation an agent can act on without human triage. */
10
24
  remediation: string;
25
+ suppressionHint?: string;
11
26
  }
12
27
  interface DiffGateResult {
13
28
  base: string;
@@ -19,6 +34,11 @@ interface DiffGateResult {
19
34
  check: DiffGateCheck;
20
35
  reason: string;
21
36
  }>;
37
+ /** Findings accepted by structured .scipquery.json suppressions. */
38
+ suppressed: Array<{
39
+ finding: DiffGateFinding;
40
+ suppression: FindingSuppression;
41
+ }>;
22
42
  findings: DiffGateFinding[];
23
43
  note?: string;
24
44
  }
@@ -49,7 +69,9 @@ declare function diffGate(db: ScipDatabase, opts?: {
49
69
  minTogether?: number;
50
70
  minConfidence?: number;
51
71
  maxEchoChecks?: number;
72
+ maxHelpers?: number;
52
73
  minSimilarity?: number;
74
+ skip?: readonly DiffGateCheck[];
53
75
  }): DiffGateResult;
54
76
 
55
- export { type DiffGateCheck, type DiffGateFinding, type DiffGateResult, diffGate };
77
+ export { DIFF_GATE_CHECKS, type DiffGateCheck, type DiffGateEvidence, type DiffGateFinding, type DiffGateResult, type DiffGateSeverity, diffGate };