scip-query 0.10.0 → 0.10.2

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 (293) hide show
  1. package/README.md +115 -58
  2. package/dist/augment-vue-worker.js +1 -1
  3. package/dist/chunk-3KLLFNT4.js +2 -0
  4. package/dist/{chunk-UIWAZ2NT.js → chunk-3UVJJ6Z7.js} +1 -1
  5. package/dist/chunk-3UW7VM4H.js +62 -0
  6. package/dist/chunk-3ZYF3ELZ.js +2 -0
  7. package/dist/{chunk-MN75T4UB.js → chunk-47UA45TU.js} +2 -2
  8. package/dist/{chunk-NC4IUW25.js → chunk-4ZUJJRWT.js} +2 -2
  9. package/dist/chunk-5B53WB6E.js +4 -0
  10. package/dist/{chunk-2WEH5QHC.js → chunk-5FOPAXWY.js} +2 -2
  11. package/dist/{chunk-VZRILF2Z.js → chunk-5M4TYWVI.js} +2 -2
  12. package/dist/{chunk-QJWN6LA5.js → chunk-5QJXH6ZL.js} +5 -5
  13. package/dist/{chunk-NN3O7TPH.js → chunk-64MNV6AB.js} +1 -1
  14. package/dist/chunk-77YBOOYT.js +2 -0
  15. package/dist/chunk-7KCSELEV.js +2 -0
  16. package/dist/{chunk-ZZ2W5P3D.js → chunk-7OHWPJ5N.js} +2 -2
  17. package/dist/chunk-7S5E7KWT.js +2 -0
  18. package/dist/chunk-A3VNUGKJ.js +2 -0
  19. package/dist/{chunk-ISCKLDSS.js → chunk-A4L36SZS.js} +3 -3
  20. package/dist/{chunk-IVAIPXNO.js → chunk-AUVBR62P.js} +2 -2
  21. package/dist/chunk-AW4N6MGC.js +18 -0
  22. package/dist/{chunk-PG3ZI5IH.js → chunk-B6MJ5VQV.js} +2 -2
  23. package/dist/chunk-B75HZHUP.js +2 -0
  24. package/dist/chunk-BGBBVSH4.js +2 -0
  25. package/dist/chunk-BKDXBJDQ.js +2 -0
  26. package/dist/{chunk-AQYBOORI.js → chunk-C2QSK7E7.js} +1 -1
  27. package/dist/chunk-C3MZZ2ZN.js +2 -0
  28. package/dist/{chunk-AP5GTKSG.js → chunk-CAWSSEVM.js} +2 -2
  29. package/dist/chunk-CFL2CNIF.js +10 -0
  30. package/dist/{chunk-4HTJZC6G.js → chunk-CJJP64OC.js} +2 -2
  31. package/dist/chunk-CNTEQMHA.js +2 -0
  32. package/dist/{chunk-WEJYUS5O.js → chunk-CRU42NJU.js} +2 -2
  33. package/dist/chunk-CSWZFD46.js +2 -0
  34. package/dist/{chunk-ZOT3WUZW.js → chunk-CTCAF3YA.js} +2 -2
  35. package/dist/chunk-D322LMSA.js +5 -0
  36. package/dist/{chunk-772YYL6I.js → chunk-DAI74TJU.js} +2 -2
  37. package/dist/chunk-DE7MA6OD.js +3 -0
  38. package/dist/chunk-DJMK4DBL.js +2 -0
  39. package/dist/chunk-DRAZH77R.js +7 -0
  40. package/dist/{chunk-L2KFPRMA.js → chunk-E44ZMVNA.js} +2 -2
  41. package/dist/{chunk-BNW3Q24R.js → chunk-E7KERP7E.js} +2 -2
  42. package/dist/{chunk-QKO474FG.js → chunk-EOZIZWW4.js} +2 -2
  43. package/dist/chunk-ERHOS6AW.js +2 -0
  44. package/dist/{chunk-ADRYSISR.js → chunk-ESG4HBEF.js} +2 -2
  45. package/dist/chunk-EWC3UK4V.js +3 -0
  46. package/dist/chunk-FGCL6NDB.js +8 -0
  47. package/dist/chunk-FIB4JPEX.js +2 -0
  48. package/dist/chunk-FNRPGGVI.js +2 -0
  49. package/dist/chunk-FOQHUKNZ.js +4 -0
  50. package/dist/chunk-FPMVCDIJ.js +2 -0
  51. package/dist/chunk-FUPDW5AC.js +3 -0
  52. package/dist/chunk-G3WGZU5Q.js +2 -0
  53. package/dist/chunk-GS33KGAY.js +2 -0
  54. package/dist/chunk-GZCQTZLK.js +2 -0
  55. package/dist/{chunk-VGBSY6N7.js → chunk-HVTYSC26.js} +2 -2
  56. package/dist/{chunk-2BMFRBV6.js → chunk-ICXVNWMI.js} +2 -2
  57. package/dist/chunk-JM72FNGA.js +2 -0
  58. package/dist/chunk-KPHKX4LP.js +71 -0
  59. package/dist/{chunk-6DEX3XP6.js → chunk-LPLGJ4HO.js} +2 -2
  60. package/dist/chunk-MHK7Z53U.js +2 -0
  61. package/dist/chunk-MHTDOFV7.js +5 -0
  62. package/dist/chunk-MUULWXSJ.js +2 -0
  63. package/dist/chunk-MZ7APUFN.js +3 -0
  64. package/dist/chunk-NNDYO2DX.js +2 -0
  65. package/dist/chunk-NP5HYVLX.js +20 -0
  66. package/dist/{chunk-Y5H7TBVE.js → chunk-NVFERV4U.js} +2 -2
  67. package/dist/{chunk-LWYIGRHR.js → chunk-NXIAHE7F.js} +1 -1
  68. package/dist/chunk-O3OKSF6O.js +2 -0
  69. package/dist/chunk-O4L4AB3T.js +2 -0
  70. package/dist/chunk-OBBDKQAG.js +3 -0
  71. package/dist/chunk-OLD6PBU6.js +7 -0
  72. package/dist/{chunk-V76FCF5F.js → chunk-PFOCOG57.js} +2 -2
  73. package/dist/chunk-PVZMPG5I.js +2 -0
  74. package/dist/chunk-QLNGUWR7.js +2 -0
  75. package/dist/chunk-QSXQT3NE.js +2 -0
  76. package/dist/{chunk-OLCKSG3Y.js → chunk-QVCCLDZI.js} +2 -2
  77. package/dist/chunk-RHTJBYZ5.js +2 -0
  78. package/dist/chunk-SPE4YCOT.js +7 -0
  79. package/dist/{chunk-FVIKFWUL.js → chunk-TM6GVHA6.js} +2 -2
  80. package/dist/chunk-TO54DY4O.js +2 -0
  81. package/dist/chunk-UMNENNTX.js +2 -0
  82. package/dist/chunk-UNJG7P2I.js +2 -0
  83. package/dist/{chunk-TKDJQ2WD.js → chunk-UUBMFL3F.js} +1 -1
  84. package/dist/chunk-VAA5FFIW.js +2 -0
  85. package/dist/chunk-WDUTG2ZR.js +4 -0
  86. package/dist/chunk-X7ZY6FFF.js +4 -0
  87. package/dist/{chunk-BGRPMGTD.js → chunk-YQH353VA.js} +2 -2
  88. package/dist/chunk-YTR4CO5S.js +38 -0
  89. package/dist/chunk-YUOAAR24.js +2 -0
  90. package/dist/{chunk-YWZBKYLS.js → chunk-YYD245WG.js} +2 -2
  91. package/dist/{chunk-SCEMECW7.js → chunk-Z4VHYJ5U.js} +2 -2
  92. package/dist/chunk-ZFMPHDAT.js +4 -0
  93. package/dist/chunk-ZQLO2SCU.js +6 -0
  94. package/dist/chunk-ZSLT7NWQ.js +61 -0
  95. package/dist/cli.js +276 -271
  96. package/dist/{config-types-CGIeLEpY.d.ts → config-types-Bj4sh28g.d.ts} +37 -1
  97. package/dist/{db-DdTPetj5.d.ts → db-CTarohbZ.d.ts} +1 -1
  98. package/dist/git-history-Dao3_Pu9.d.ts +12 -0
  99. package/dist/{health-C6r2VgpA.d.ts → health-Bx0x1HAG.d.ts} +64 -4
  100. package/dist/index.d.ts +7 -6
  101. package/dist/index.js +1 -1
  102. package/dist/postinstall.js +2 -2
  103. package/dist/queries/affected.d.ts +2 -2
  104. package/dist/queries/affected.js +1 -1
  105. package/dist/queries/bottlenecks.d.ts +6 -2
  106. package/dist/queries/bottlenecks.js +1 -1
  107. package/dist/queries/by-kind.d.ts +2 -2
  108. package/dist/queries/by-kind.js +1 -1
  109. package/dist/queries/call-graph.d.ts +2 -2
  110. package/dist/queries/call-graph.js +1 -1
  111. package/dist/queries/change-surface.d.ts +2 -2
  112. package/dist/queries/change-surface.js +1 -1
  113. package/dist/queries/cleanup-plan.d.ts +2 -2
  114. package/dist/queries/cleanup-plan.js +1 -1
  115. package/dist/queries/co-change.d.ts +40 -5
  116. package/dist/queries/co-change.js +1 -1
  117. package/dist/queries/code.d.ts +2 -2
  118. package/dist/queries/code.js +1 -1
  119. package/dist/queries/complexity-hotspots.d.ts +2 -2
  120. package/dist/queries/complexity-hotspots.js +1 -1
  121. package/dist/queries/complexity.d.ts +2 -2
  122. package/dist/queries/complexity.js +1 -1
  123. package/dist/queries/convergence.d.ts +2 -2
  124. package/dist/queries/convergence.js +1 -1
  125. package/dist/queries/coupling.d.ts +6 -2
  126. package/dist/queries/coupling.js +1 -1
  127. package/dist/queries/cycles.d.ts +2 -2
  128. package/dist/queries/cycles.js +1 -1
  129. package/dist/queries/dataflow.d.ts +2 -2
  130. package/dist/queries/dataflow.js +1 -1
  131. package/dist/queries/dead.d.ts +10 -3
  132. package/dist/queries/dead.js +1 -1
  133. package/dist/queries/deep-chains.d.ts +6 -2
  134. package/dist/queries/deep-chains.js +1 -1
  135. package/dist/queries/deps.d.ts +2 -2
  136. package/dist/queries/deps.js +1 -1
  137. package/dist/queries/diff-gate.d.ts +66 -3
  138. package/dist/queries/diff-gate.js +1 -1
  139. package/dist/queries/diff-impact.d.ts +20 -4
  140. package/dist/queries/diff-impact.js +1 -1
  141. package/dist/queries/doc-drift.d.ts +20 -3
  142. package/dist/queries/doc-drift.js +1 -1
  143. package/dist/queries/drift.d.ts +10 -3
  144. package/dist/queries/drift.js +1 -1
  145. package/dist/queries/extract-candidates.d.ts +11 -3
  146. package/dist/queries/extract-candidates.js +1 -1
  147. package/dist/queries/fan.d.ts +2 -2
  148. package/dist/queries/fan.js +1 -1
  149. package/dist/queries/files.d.ts +2 -2
  150. package/dist/queries/files.js +1 -1
  151. package/dist/queries/health.d.ts +3 -3
  152. package/dist/queries/health.js +1 -1
  153. package/dist/queries/hierarchy.d.ts +2 -2
  154. package/dist/queries/hierarchy.js +1 -1
  155. package/dist/queries/hotspots.d.ts +2 -2
  156. package/dist/queries/hotspots.js +1 -1
  157. package/dist/queries/imports.d.ts +2 -2
  158. package/dist/queries/imports.js +1 -1
  159. package/dist/queries/incomplete-migration.d.ts +16 -3
  160. package/dist/queries/incomplete-migration.js +1 -1
  161. package/dist/queries/index.d.ts +20 -12
  162. package/dist/queries/index.js +1 -1
  163. package/dist/queries/isolated.d.ts +2 -2
  164. package/dist/queries/isolated.js +1 -1
  165. package/dist/queries/locality-candidates.d.ts +51 -0
  166. package/dist/queries/locality-candidates.js +2 -0
  167. package/dist/queries/members.d.ts +2 -2
  168. package/dist/queries/members.js +1 -1
  169. package/dist/queries/methods.d.ts +2 -2
  170. package/dist/queries/methods.js +1 -1
  171. package/dist/queries/outline.d.ts +2 -2
  172. package/dist/queries/outline.js +1 -1
  173. package/dist/queries/passthrough-candidates.d.ts +8 -3
  174. package/dist/queries/passthrough-candidates.js +1 -1
  175. package/dist/queries/plan-context.d.ts +4 -2
  176. package/dist/queries/plan-context.js +1 -1
  177. package/dist/queries/react-component-duplicates.d.ts +31 -0
  178. package/dist/queries/react-component-duplicates.js +2 -0
  179. package/dist/queries/react-hook-candidates.d.ts +40 -0
  180. package/dist/queries/react-hook-candidates.js +2 -0
  181. package/dist/queries/react-large-component-pressure.d.ts +34 -0
  182. package/dist/queries/react-large-component-pressure.js +2 -0
  183. package/dist/queries/recent-duplicates.d.ts +32 -3
  184. package/dist/queries/recent-duplicates.js +1 -1
  185. package/dist/queries/redundant-reexports.d.ts +7 -3
  186. package/dist/queries/redundant-reexports.js +1 -1
  187. package/dist/queries/refs.d.ts +2 -2
  188. package/dist/queries/refs.js +1 -1
  189. package/dist/queries/self-audit.d.ts +2 -2
  190. package/dist/queries/self-audit.js +1 -1
  191. package/dist/queries/similar-chains.d.ts +2 -2
  192. package/dist/queries/similar-chains.js +1 -1
  193. package/dist/queries/similar-files.d.ts +2 -2
  194. package/dist/queries/similar-files.js +1 -1
  195. package/dist/queries/similar-signatures.d.ts +2 -2
  196. package/dist/queries/similar-signatures.js +1 -1
  197. package/dist/queries/similar.d.ts +21 -3
  198. package/dist/queries/similar.js +1 -1
  199. package/dist/queries/slice.d.ts +2 -2
  200. package/dist/queries/slice.js +1 -1
  201. package/dist/queries/stale-abstractions.d.ts +10 -3
  202. package/dist/queries/stale-abstractions.js +1 -1
  203. package/dist/queries/stats.d.ts +2 -2
  204. package/dist/queries/stats.js +1 -1
  205. package/dist/queries/surface.d.ts +2 -2
  206. package/dist/queries/surface.js +1 -1
  207. package/dist/queries/symbols.d.ts +2 -2
  208. package/dist/queries/symbols.js +1 -1
  209. package/dist/queries/system.d.ts +2 -2
  210. package/dist/queries/system.js +1 -1
  211. package/dist/queries/trace.d.ts +2 -2
  212. package/dist/queries/trace.js +1 -1
  213. package/dist/queries/unused-imports.d.ts +4 -0
  214. package/dist/queries/unused-imports.js +2 -0
  215. package/dist/queries/unused-params.d.ts +2 -2
  216. package/dist/queries/unused-params.js +1 -1
  217. package/dist/queries/vue-component-duplicates.d.ts +35 -0
  218. package/dist/queries/vue-component-duplicates.js +2 -0
  219. package/dist/queries/vue-composable-candidates.d.ts +40 -0
  220. package/dist/queries/vue-composable-candidates.js +2 -0
  221. package/dist/queries/vue-large-view-pressure.d.ts +37 -0
  222. package/dist/queries/vue-large-view-pressure.js +2 -0
  223. package/dist/queries/wrapper-candidates.d.ts +6 -3
  224. package/dist/queries/wrapper-candidates.js +1 -1
  225. package/dist/reindex-worker.js +10 -10
  226. package/dist/reindex.d.ts +1 -1
  227. package/dist/reindex.js +22 -22
  228. package/dist/runtime.d.ts +1 -1
  229. package/dist/runtime.js +2 -2
  230. package/docs/AGENT_GUIDE.md +353 -0
  231. package/docs/AI_FAILURE_MODES.md +278 -0
  232. package/docs/API.md +40 -0
  233. package/docs/COMMAND_REFERENCE.md +131 -0
  234. package/docs/DETECTOR_GUIDE.md +119 -0
  235. package/docs/accuracy-hardening-goal.md +54 -0
  236. package/docs/analyzer-inventory.md +162 -0
  237. package/docs/analyzer-validation-ledger.md +262 -0
  238. package/docs/analyzer-validation-protocol.md +192 -0
  239. package/docs/assets/scip-query-logo-dark.svg +21 -0
  240. package/docs/assets/scip-query-logo.svg +24 -0
  241. package/docs/locality-analyzer-design.md +193 -0
  242. package/package.json +44 -5
  243. package/skills/scip-directory-architecture/SKILL.md +178 -0
  244. package/skills/scip-maintainability/SKILL.md +24 -3
  245. package/skills/scip-query/SKILL.md +4 -2
  246. package/skills/scip-query-setup/SKILL.md +118 -0
  247. package/skills/scip-react-maintainability/SKILL.md +114 -0
  248. package/skills/scip-vue-maintainability/SKILL.md +130 -0
  249. package/dist/chunk-4DAPXOWD.js +0 -2
  250. package/dist/chunk-4JQFTUKD.js +0 -2
  251. package/dist/chunk-4MHT7LKP.js +0 -3
  252. package/dist/chunk-5OHZEO3U.js +0 -3
  253. package/dist/chunk-5QJIEYFB.js +0 -34
  254. package/dist/chunk-6IGXZZQ4.js +0 -4
  255. package/dist/chunk-6K2JQ2VI.js +0 -61
  256. package/dist/chunk-6QVCPUK6.js +0 -2
  257. package/dist/chunk-6VL4AIEO.js +0 -8
  258. package/dist/chunk-A2VTV2QB.js +0 -7
  259. package/dist/chunk-AI2ECT7L.js +0 -2
  260. package/dist/chunk-BUAC4Q4G.js +0 -2
  261. package/dist/chunk-BZ6LCGE6.js +0 -2
  262. package/dist/chunk-CMXFASVD.js +0 -2
  263. package/dist/chunk-CO3AL7NZ.js +0 -2
  264. package/dist/chunk-FVVT7GV6.js +0 -4
  265. package/dist/chunk-HXXRN77A.js +0 -2
  266. package/dist/chunk-IC3RC3KJ.js +0 -4
  267. package/dist/chunk-ITHQJZTG.js +0 -2
  268. package/dist/chunk-IW7ASGVF.js +0 -2
  269. package/dist/chunk-JODYQDE4.js +0 -2
  270. package/dist/chunk-MCW36F2D.js +0 -2
  271. package/dist/chunk-MX6F756F.js +0 -2
  272. package/dist/chunk-NGI4V4AB.js +0 -18
  273. package/dist/chunk-O6KCZPJQ.js +0 -62
  274. package/dist/chunk-OAI5GEIN.js +0 -6
  275. package/dist/chunk-OH5HIAID.js +0 -4
  276. package/dist/chunk-OXKEUWMJ.js +0 -2
  277. package/dist/chunk-PBGTMPJ7.js +0 -2
  278. package/dist/chunk-PRVDXGSK.js +0 -2
  279. package/dist/chunk-QYKKTYBN.js +0 -6
  280. package/dist/chunk-R3G6ERW7.js +0 -7
  281. package/dist/chunk-R6XDPWJA.js +0 -10
  282. package/dist/chunk-SJR4SB7B.js +0 -2
  283. package/dist/chunk-SYKCO25G.js +0 -16
  284. package/dist/chunk-T22X7WT6.js +0 -2
  285. package/dist/chunk-TH4JVC34.js +0 -71
  286. package/dist/chunk-VDY4HYNK.js +0 -2
  287. package/dist/chunk-VDZIEDJB.js +0 -2
  288. package/dist/chunk-VDZL45XI.js +0 -2
  289. package/dist/chunk-WJIS6BNI.js +0 -3
  290. package/dist/chunk-WN5Z3UVT.js +0 -7
  291. package/dist/chunk-XCW7DYHM.js +0 -2
  292. package/dist/chunk-ZF6P2NAT.js +0 -63
  293. package/dist/chunk-ZGIK464P.js +0 -2
@@ -58,6 +58,12 @@ 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[];
65
+ /** Optional analyzer configuration. */
66
+ locality?: LocalityConfig;
61
67
  }
62
68
  interface ProjectConfig {
63
69
  /** Override which languages to index (default: auto-detect) */
@@ -72,6 +78,36 @@ interface ProjectConfig {
72
78
  entryRoots?: EntryRootsConfig;
73
79
  /** Optional semantic-provider configuration */
74
80
  semantic?: SemanticConfig;
81
+ /** Machine-readable accepted findings. */
82
+ suppressions?: FindingSuppression[];
83
+ /** Project-declared file groups that intentionally change together. */
84
+ declaredCouplings?: DeclaredCouplingConfig[];
85
+ /** Optional locality analyzer configuration. */
86
+ locality?: LocalityConfig;
87
+ }
88
+ interface LocalityConfig {
89
+ /** Folder names that should be treated as architectural ownership boundaries. */
90
+ architecturalBoundarySegments?: string[];
91
+ }
92
+ interface DeclaredCouplingConfig {
93
+ /** Human-readable name for the maintenance unit. */
94
+ name: string;
95
+ /** Exact relative file paths that form one intentional co-change group. */
96
+ files: string[];
97
+ /** Human reason for why these files should move together. */
98
+ reason?: string;
99
+ }
100
+ interface FindingSuppression {
101
+ /** Stable finding id, for example SQABC123DEF456. */
102
+ id?: string;
103
+ /** Detector/check name, for example diff-gate's "echo". */
104
+ check?: string;
105
+ /** Optional file path to narrow check-level suppressions. */
106
+ file?: string;
107
+ /** Human reason for accepting the finding. Required by config validation. */
108
+ reason: string;
109
+ /** ISO date after which the suppression no longer applies. */
110
+ expiresAt?: string;
75
111
  }
76
112
  interface SemanticConfig {
77
113
  typescript?: TypeScriptSemanticConfig;
@@ -105,4 +141,4 @@ interface IndexerOverrides {
105
141
  pnpmWorkspaces?: boolean;
106
142
  }
107
143
 
108
- export type { IndexerConfig as I, ProjectConfig as P, ScipQueryConfig as S, SupportedLanguage as a };
144
+ 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-Bj4sh28g.js';
3
3
 
4
4
  /**
5
5
  * Builds a gitignore-based path filter from .gitignore files found
@@ -0,0 +1,12 @@
1
+ type CoChangeCommitScope = 'focused' | 'mixed' | 'broad-sweep';
2
+ type CoChangeRecency = 'recent' | 'stale';
3
+ type CoChangeExternalIssueLabelStatus = 'unavailable';
4
+ interface CoChangeSubjectContext {
5
+ /** Locally inferred from commit subjects, not issue tracker metadata. */
6
+ subjectLabels: string[];
7
+ issueRefs: string[];
8
+ sampleSubjects: string[];
9
+ externalIssueLabelStatus: CoChangeExternalIssueLabelStatus;
10
+ }
11
+
12
+ export type { CoChangeCommitScope as C, CoChangeRecency as a, CoChangeSubjectContext as b };
@@ -1,4 +1,4 @@
1
- import { S as ScipDatabase } from './db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from './db-CTarohbZ.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[];
@@ -25,6 +28,8 @@ interface DriftSummary {
25
28
  count: number;
26
29
  unusedImports: number;
27
30
  layerViolations: number;
31
+ direct: number;
32
+ signal: number;
28
33
  }
29
34
  interface ComplexitySummary {
30
35
  top: Array<{
@@ -38,11 +43,26 @@ interface GitEvidenceSummary {
38
43
  amplification: ChangeAmplificationSummary | null;
39
44
  hiddenCoupling: {
40
45
  pairCount: number;
46
+ scoreCount: number;
41
47
  top: Array<{
42
48
  fileA: string;
43
49
  fileB: string;
44
50
  together: number;
45
51
  confidence: number;
52
+ focusedTogether: number;
53
+ broadTogether: number;
54
+ broadCommitRatio: number;
55
+ lastTogetherAt: number;
56
+ recentTogether: number;
57
+ commitScope: 'focused' | 'mixed' | 'broad-sweep';
58
+ recency: 'recent' | 'stale';
59
+ scoreWeight: number;
60
+ subjectContext: {
61
+ subjectLabels: string[];
62
+ issueRefs: string[];
63
+ sampleSubjects: string[];
64
+ externalIssueLabelStatus: 'unavailable';
65
+ };
46
66
  }>;
47
67
  };
48
68
  /** Per-file change counts over the analyzed window (tracked files only). */
@@ -75,6 +95,15 @@ interface ScoreDeduction {
75
95
  /** Risk deductions are empirically validated predictors; hygiene are tidiness signals. */
76
96
  kind: 'risk' | 'hygiene';
77
97
  }
98
+ interface HealthPressure {
99
+ axis: string;
100
+ category: string;
101
+ kind: ScoreDeduction['kind'];
102
+ count: number;
103
+ threshold: number;
104
+ ratio: number;
105
+ extraPenalty: number;
106
+ }
78
107
  interface HealthAxes {
79
108
  /** LOC provably removable with behavior preserved (dead + isolated). */
80
109
  deletable: {
@@ -86,14 +115,16 @@ interface HealthAxes {
86
115
  };
87
116
  /** Files touched per commit — the measured cost of one conceptual change. */
88
117
  changeAmplification: ChangeAmplificationSummary | null;
89
- /** File pairs that co-change without a dependency edge — concepts the reference graph can't see. */
118
+ /** File pairs that co-change without a structural link — concepts the visible graph can't see. */
90
119
  hiddenCoupling: {
91
120
  pairCount: number;
121
+ scoreCount: number;
92
122
  top: Array<{
93
123
  fileA: string;
94
124
  fileB: string;
95
125
  together: number;
96
126
  confidence: number;
127
+ scoreWeight?: number;
97
128
  }>;
98
129
  } | null;
99
130
  /** Complexity hotspots weighted by churn — complex code nobody touches costs nothing. */
@@ -145,13 +176,23 @@ interface HealthReport {
145
176
  isolatedLoc: number;
146
177
  cycles: number;
147
178
  similarPairs: number;
179
+ reactComponentDuplicatePairs: number;
180
+ reactHookCandidatePairs: number;
181
+ reactHookCandidateScoreCount: number;
182
+ reactLargeComponentPressureFiles: number;
183
+ vueComponentDuplicatePairs: number;
184
+ vueComposableCandidatePairs: number;
185
+ vueComposableCandidateScoreCount: number;
186
+ vueLargeViewPressureFiles: number;
148
187
  extractionCandidates: number;
149
188
  wrappers: number;
189
+ wrapperScoreCount: number;
150
190
  passthroughs: number;
151
191
  staleTypes: number;
152
192
  driftedFiles: number;
153
193
  complexityHotspotCount: number;
154
194
  hiddenCouplingPairs: number | null;
195
+ hiddenCouplingScoreCount: number | null;
155
196
  };
156
197
  axes: HealthAxes;
157
198
  validation: HealthValidation | null;
@@ -160,6 +201,7 @@ interface HealthReport {
160
201
  byCategory: Record<string, number>;
161
202
  } | null;
162
203
  actions: HealthAction[];
204
+ pressure: HealthPressure[];
163
205
  topComplexity: Array<{
164
206
  symbol: string;
165
207
  score: number;
@@ -168,8 +210,8 @@ interface HealthReport {
168
210
  warnings?: string[];
169
211
  }
170
212
 
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"];
172
- type HealthPhaseName = typeof HEALTH_PHASES[number];
213
+ 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"];
214
+ type HealthPhaseName = (typeof HEALTH_PHASES)[number];
173
215
  type HealthPhaseResult = {
174
216
  phase: 'overview';
175
217
  statsResult: ReturnType<typeof stats>;
@@ -186,6 +228,24 @@ type HealthPhaseResult = {
186
228
  } | {
187
229
  phase: 'similar';
188
230
  similarCount: number;
231
+ } | {
232
+ phase: 'react-component-duplicates';
233
+ reactComponentDuplicates: CountLocSummary;
234
+ } | {
235
+ phase: 'react-hook-candidates';
236
+ reactHookCandidates: CountLocSummary;
237
+ } | {
238
+ phase: 'react-large-component-pressure';
239
+ reactLargeComponentPressure: CountLocSummary;
240
+ } | {
241
+ phase: 'vue-component-duplicates';
242
+ vueComponentDuplicates: CountLocSummary;
243
+ } | {
244
+ phase: 'vue-composable-candidates';
245
+ vueComposableCandidates: CountLocSummary;
246
+ } | {
247
+ phase: 'vue-large-view-pressure';
248
+ vueLargeViewPressure: CountLocSummary;
189
249
  } | {
190
250
  phase: 'extract-candidates';
191
251
  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-CTarohbZ.js';
2
+ export { c as createGitignoreFilter } from './db-CTarohbZ.js';
3
+ export { S as ScipQueryConfig } from './config-types-Bj4sh28g.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-IW7ASGVF.js";import"./chunk-QYKKTYBN.js";import"./chunk-VDZIEDJB.js";import"./chunk-5QJIEYFB.js";import"./chunk-VGBSY6N7.js";import"./chunk-ZF6P2NAT.js";import"./chunk-4MHT7LKP.js";import"./chunk-IVAIPXNO.js";import"./chunk-FVVT7GV6.js";import"./chunk-WEJYUS5O.js";import"./chunk-PBGTMPJ7.js";import{a as i,c as n,d as l}from"./chunk-O6KCZPJQ.js";import"./chunk-OH5HIAID.js";import"./chunk-ISCKLDSS.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-UUBMFL3F.js";import{a as s}from"./chunk-3ZYF3ELZ.js";import"./chunk-ZQLO2SCU.js";import"./chunk-BGBBVSH4.js";import"./chunk-GZCQTZLK.js";import"./chunk-YTR4CO5S.js";import"./chunk-HVTYSC26.js";import"./chunk-FUPDW5AC.js";import"./chunk-MZ7APUFN.js";import"./chunk-AUVBR62P.js";import"./chunk-FOQHUKNZ.js";import"./chunk-CRU42NJU.js";import"./chunk-3UW7VM4H.js";import{a as i,c as n,d as l}from"./chunk-JM72FNGA.js";import"./chunk-QLNGUWR7.js";import"./chunk-ERHOS6AW.js";import"./chunk-EWC3UK4V.js";import"./chunk-D322LMSA.js";import"./chunk-A4L36SZS.js";import"./chunk-OBBDKQAG.js";import"./chunk-64MNV6AB.js";import"./chunk-7S5E7KWT.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-NXIAHE7F.js";import{existsSync as p,mkdirSync as L,symlinkSync as b,readlinkSync as v,unlinkSync as q}from"fs";import{join as l,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","scip-query-setup","concrete-plan","scip-ai-cleanup","scip-explore","scip-debloat","scip-doc-reconcile","scip-directory-architecture","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"),$=[l(u(),".claude","skills"),l(u(),".codex","skills"),l(u(),".agents","skills")],s={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=l(I,n),c=l(r,n);if(!p(a)){s.skipped.push(`${t}/${n}`);continue}if(p(c)){try{let x=v(c);if(d(x)===d(a)){s.alreadyLinked.push(`${t}/${n}`),e(` ok: ${n} \u2192 ${t} (already linked)`);continue}}catch{s.skipped.push(`${t}/${n}`),e(` skip: ${n} \u2192 ${t} (exists, not a symlink)`);continue}q(c)}b(a,c,R?"junction":"dir"),s.installed.push(`${t}/${n}`),e(` done: ${n} \u2192 ${t}`)}}return s}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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface AffectedResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-R6XDPWJA.js";import"../chunk-VDZIEDJB.js";import"../chunk-5QJIEYFB.js";import"../chunk-VGBSY6N7.js";import"../chunk-ZF6P2NAT.js";import"../chunk-4MHT7LKP.js";import"../chunk-IVAIPXNO.js";import"../chunk-FVVT7GV6.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as affected};
1
+ import{a}from"../chunk-CFL2CNIF.js";import"../chunk-GZCQTZLK.js";import"../chunk-YTR4CO5S.js";import"../chunk-HVTYSC26.js";import"../chunk-FUPDW5AC.js";import"../chunk-MZ7APUFN.js";import"../chunk-AUVBR62P.js";import"../chunk-FOQHUKNZ.js";import"../chunk-CRU42NJU.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface BottleneckResult {
6
6
  symbol: string;
@@ -10,6 +10,10 @@ interface BottleneckResult {
10
10
  /** fanIn * fanOut — higher = more central coupling hub */
11
11
  score: number;
12
12
  definedIn: string;
13
+ actionTier: 'signal';
14
+ riskKind: 'coordination-hotspot';
15
+ evidenceReasons: string[];
16
+ recommendation: string;
13
17
  }
14
18
  /**
15
19
  * Find coupling hubs: symbols with both high fan-in (many consumers)
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-CO3AL7NZ.js";import"../chunk-MX6F756F.js";import"../chunk-IW7ASGVF.js";import"../chunk-QYKKTYBN.js";import"../chunk-VDZIEDJB.js";import"../chunk-5QJIEYFB.js";import"../chunk-VGBSY6N7.js";import"../chunk-ZF6P2NAT.js";import"../chunk-4MHT7LKP.js";import"../chunk-IVAIPXNO.js";import"../chunk-FVVT7GV6.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as bottlenecks};
1
+ import{a}from"../chunk-MUULWXSJ.js";import"../chunk-B75HZHUP.js";import"../chunk-3ZYF3ELZ.js";import"../chunk-ZQLO2SCU.js";import"../chunk-BGBBVSH4.js";import"../chunk-GZCQTZLK.js";import"../chunk-YTR4CO5S.js";import"../chunk-HVTYSC26.js";import"../chunk-FUPDW5AC.js";import"../chunk-MZ7APUFN.js";import"../chunk-AUVBR62P.js";import"../chunk-FOQHUKNZ.js";import"../chunk-CRU42NJU.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface ByKindResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a,b}from"../chunk-4JQFTUKD.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as byKind,b as kindCounts};
1
+ import{a,b}from"../chunk-BKDXBJDQ.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface CallGraphResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-SCEMECW7.js";import"../chunk-MX6F756F.js";import"../chunk-VDZIEDJB.js";import"../chunk-5QJIEYFB.js";import"../chunk-VGBSY6N7.js";import"../chunk-ZF6P2NAT.js";import"../chunk-4MHT7LKP.js";import"../chunk-IVAIPXNO.js";import"../chunk-FVVT7GV6.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as callGraph};
1
+ import{a}from"../chunk-Z4VHYJ5U.js";import"../chunk-B75HZHUP.js";import"../chunk-BGBBVSH4.js";import"../chunk-GZCQTZLK.js";import"../chunk-YTR4CO5S.js";import"../chunk-HVTYSC26.js";import"../chunk-FUPDW5AC.js";import"../chunk-MZ7APUFN.js";import"../chunk-AUVBR62P.js";import"../chunk-FOQHUKNZ.js";import"../chunk-CRU42NJU.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface ChangeSurfaceEntry {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-FVIKFWUL.js";import"../chunk-ZOT3WUZW.js";import"../chunk-IW7ASGVF.js";import"../chunk-QYKKTYBN.js";import"../chunk-VDZIEDJB.js";import"../chunk-5QJIEYFB.js";import"../chunk-VGBSY6N7.js";import"../chunk-ZF6P2NAT.js";import"../chunk-4MHT7LKP.js";import"../chunk-IVAIPXNO.js";import"../chunk-FVVT7GV6.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as changeSurface};
1
+ import{a}from"../chunk-TM6GVHA6.js";import"../chunk-CTCAF3YA.js";import"../chunk-3ZYF3ELZ.js";import"../chunk-ZQLO2SCU.js";import"../chunk-BGBBVSH4.js";import"../chunk-GZCQTZLK.js";import"../chunk-YTR4CO5S.js";import"../chunk-HVTYSC26.js";import"../chunk-FUPDW5AC.js";import"../chunk-MZ7APUFN.js";import"../chunk-AUVBR62P.js";import"../chunk-FOQHUKNZ.js";import"../chunk-CRU42NJU.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface CleanupPlanEntry {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a,b}from"../chunk-A2VTV2QB.js";import"../chunk-6QVCPUK6.js";import"../chunk-MX6F756F.js";import"../chunk-IW7ASGVF.js";import"../chunk-QYKKTYBN.js";import"../chunk-VDZIEDJB.js";import"../chunk-5QJIEYFB.js";import"../chunk-VGBSY6N7.js";import"../chunk-ZF6P2NAT.js";import"../chunk-4MHT7LKP.js";import"../chunk-IVAIPXNO.js";import"../chunk-FVVT7GV6.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{b as RemovedRangeIndex,a as cleanupPlan};
1
+ import{a,b}from"../chunk-OLD6PBU6.js";import"../chunk-C3MZZ2ZN.js";import"../chunk-B75HZHUP.js";import"../chunk-3ZYF3ELZ.js";import"../chunk-ZQLO2SCU.js";import"../chunk-BGBBVSH4.js";import"../chunk-GZCQTZLK.js";import"../chunk-YTR4CO5S.js";import"../chunk-HVTYSC26.js";import"../chunk-FUPDW5AC.js";import"../chunk-MZ7APUFN.js";import"../chunk-AUVBR62P.js";import"../chunk-FOQHUKNZ.js";import"../chunk-CRU42NJU.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.js";export{b as RemovedRangeIndex,a as cleanupPlan};
2
2
  //# sourceMappingURL=cleanup-plan.js.map
@@ -1,7 +1,27 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-CTarohbZ.js';
2
+ import { C as CoChangeCommitScope, a as CoChangeRecency, b as CoChangeSubjectContext } from '../git-history-Dao3_Pu9.js';
2
3
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
4
+ import '../config-types-Bj4sh28g.js';
4
5
 
6
+ type CoChangePartnerClass = 'doc-code' | 'config-code' | 'schema-script' | 'model-view' | 'test-code' | 'same-feature' | 'unknown';
7
+ interface CoChangePartnerClassification {
8
+ partnerClass: CoChangePartnerClass;
9
+ reasons: string[];
10
+ }
11
+ interface DeclaredCouplingSuggestion {
12
+ name: string;
13
+ files: string[];
14
+ reason: string;
15
+ }
16
+ interface CoChangePairEvidence {
17
+ fileA: string;
18
+ fileB: string;
19
+ together: number;
20
+ confidence: number;
21
+ commitScope?: CoChangeCommitScope;
22
+ recency?: CoChangeRecency;
23
+ subjectContext?: CoChangeSubjectContext;
24
+ }
5
25
  interface CoChangeFinding {
6
26
  fileA: string;
7
27
  fileB: string;
@@ -11,8 +31,19 @@ interface CoChangeFinding {
11
31
  confidence: number;
12
32
  changesA: number;
13
33
  changesB: number;
14
- /** True when a dependency edge already explains the coupling. */
34
+ focusedTogether: number;
35
+ broadTogether: number;
36
+ broadCommitRatio: number;
37
+ lastTogetherAt: number;
38
+ recentTogether: number;
39
+ commitScope: CoChangeCommitScope;
40
+ recency: CoChangeRecency;
41
+ subjectContext: CoChangeSubjectContext;
42
+ /** True when a dependency edge or declared coupling already explains the pair. */
15
43
  structurallyLinked: boolean;
44
+ partnerClass: CoChangePartnerClass;
45
+ partnerClassReasons: string[];
46
+ declaredCouplingSuggestion?: DeclaredCouplingSuggestion;
16
47
  }
17
48
  interface CoChangeResult {
18
49
  /** False when git history is unavailable (not a repo, git missing). */
@@ -23,7 +54,7 @@ interface CoChangeResult {
23
54
  declare function isCoChangeNoiseFile(file: string): boolean;
24
55
  /**
25
56
  * Hidden coupling from the change graph: file pairs that repeatedly change
26
- * in the same commits but have NO dependency edge between them.
57
+ * in the same commits but have no structural link between them.
27
58
  *
28
59
  * The reference graph cannot see that two mechanisms implement one concept —
29
60
  * a config list and the test that checks it share no symbols. The commit
@@ -37,6 +68,10 @@ declare function coChange(db: ScipDatabase, file?: string, opts?: {
37
68
  minConfidence?: number;
38
69
  limit?: number;
39
70
  includeLinked?: boolean;
71
+ maxFilesPerCommit?: number;
40
72
  }): CoChangeResult;
73
+ declare function classifyCoChangePartner(fileA: string, fileB: string): CoChangePartnerClassification;
74
+ declare function declaredCouplingSuggestionForPair(pair: CoChangePairEvidence, classification: CoChangePartnerClassification, structurallyLinked: boolean): DeclaredCouplingSuggestion | undefined;
75
+ declare function coChangeStructuralLinkChecker(db: ScipDatabase, graph?: Map<string, Set<string>>, declaredCouplings?: ReadonlySet<string>[]): (fileA: string, fileB: string) => boolean;
41
76
 
42
- export { type CoChangeFinding, type CoChangeResult, coChange, isCoChangeNoiseFile };
77
+ export { type CoChangeFinding, type CoChangePairEvidence, type CoChangePartnerClass, type CoChangePartnerClassification, type CoChangeResult, type DeclaredCouplingSuggestion, classifyCoChangePartner, coChange, coChangeStructuralLinkChecker, declaredCouplingSuggestionForPair, isCoChangeNoiseFile };
@@ -1,2 +1,2 @@
1
- import{a,b}from"../chunk-JODYQDE4.js";import"../chunk-R3G6ERW7.js";import"../chunk-QYKKTYBN.js";import"../chunk-IVAIPXNO.js";import"../chunk-FVVT7GV6.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{b as coChange,a as isCoChangeNoiseFile};
1
+ import{a,b,c,d,e}from"../chunk-CNTEQMHA.js";import"../chunk-DRAZH77R.js";import"../chunk-ZQLO2SCU.js";import"../chunk-AUVBR62P.js";import"../chunk-FOQHUKNZ.js";import"../chunk-CRU42NJU.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.js";export{c as classifyCoChangePartner,b as coChange,e as coChangeStructuralLinkChecker,d as declaredCouplingSuggestionForPair,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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface CodeResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-6DEX3XP6.js";import"../chunk-ZOT3WUZW.js";import"../chunk-4MHT7LKP.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as code};
1
+ import{a}from"../chunk-LPLGJ4HO.js";import"../chunk-CTCAF3YA.js";import"../chunk-MZ7APUFN.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface ComplexityHotspot {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-772YYL6I.js";import"../chunk-V76FCF5F.js";import"../chunk-MX6F756F.js";import"../chunk-IW7ASGVF.js";import"../chunk-QYKKTYBN.js";import"../chunk-VDZIEDJB.js";import"../chunk-5QJIEYFB.js";import"../chunk-VGBSY6N7.js";import"../chunk-ZF6P2NAT.js";import"../chunk-4MHT7LKP.js";import"../chunk-IVAIPXNO.js";import"../chunk-FVVT7GV6.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as complexityHotspots};
1
+ import{a}from"../chunk-DAI74TJU.js";import"../chunk-PFOCOG57.js";import"../chunk-B75HZHUP.js";import"../chunk-3ZYF3ELZ.js";import"../chunk-ZQLO2SCU.js";import"../chunk-BGBBVSH4.js";import"../chunk-GZCQTZLK.js";import"../chunk-YTR4CO5S.js";import"../chunk-HVTYSC26.js";import"../chunk-FUPDW5AC.js";import"../chunk-MZ7APUFN.js";import"../chunk-AUVBR62P.js";import"../chunk-FOQHUKNZ.js";import"../chunk-CRU42NJU.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface ComplexityResult {
6
6
  symbol: string;
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-ADRYSISR.js";import"../chunk-IW7ASGVF.js";import"../chunk-QYKKTYBN.js";import"../chunk-VDZIEDJB.js";import"../chunk-5QJIEYFB.js";import"../chunk-VGBSY6N7.js";import"../chunk-ZF6P2NAT.js";import"../chunk-4MHT7LKP.js";import"../chunk-IVAIPXNO.js";import"../chunk-FVVT7GV6.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as complexity};
1
+ import{a}from"../chunk-ESG4HBEF.js";import"../chunk-3ZYF3ELZ.js";import"../chunk-ZQLO2SCU.js";import"../chunk-BGBBVSH4.js";import"../chunk-GZCQTZLK.js";import"../chunk-YTR4CO5S.js";import"../chunk-HVTYSC26.js";import"../chunk-FUPDW5AC.js";import"../chunk-MZ7APUFN.js";import"../chunk-AUVBR62P.js";import"../chunk-FOQHUKNZ.js";import"../chunk-CRU42NJU.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface ConvergenceResult {
6
6
  symbolA: {
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-YWZBKYLS.js";import"../chunk-5QJIEYFB.js";import"../chunk-VGBSY6N7.js";import"../chunk-ZF6P2NAT.js";import"../chunk-4MHT7LKP.js";import"../chunk-IVAIPXNO.js";import"../chunk-FVVT7GV6.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as convergence};
1
+ import{a}from"../chunk-YYD245WG.js";import"../chunk-YTR4CO5S.js";import"../chunk-HVTYSC26.js";import"../chunk-FUPDW5AC.js";import"../chunk-MZ7APUFN.js";import"../chunk-AUVBR62P.js";import"../chunk-FOQHUKNZ.js";import"../chunk-CRU42NJU.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.js";export{a as convergence};
2
2
  //# sourceMappingURL=convergence.js.map
@@ -1,11 +1,15 @@
1
- import { S as ScipDatabase } from '../db-DdTPetj5.js';
1
+ import { S as ScipDatabase } from '../db-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface CouplingResult {
6
6
  file1: string;
7
7
  file2: string;
8
8
  sharedSymbols: number;
9
+ actionTier: 'signal';
10
+ couplingKind: 'shared-symbol-coupling';
11
+ evidenceReasons: string[];
12
+ recommendation: string;
9
13
  }
10
14
  /**
11
15
  * Measure coupling between two files: how many symbols do they share
@@ -1,2 +1,2 @@
1
- import{a,b}from"../chunk-QJWN6LA5.js";import"../chunk-ZOT3WUZW.js";import"../chunk-4MHT7LKP.js";import"../chunk-O6KCZPJQ.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as coupling,b as topCoupling};
1
+ import{a,b}from"../chunk-5QJXH6ZL.js";import"../chunk-CTCAF3YA.js";import"../chunk-MZ7APUFN.js";import"../chunk-3UW7VM4H.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface CycleResult {
6
6
  /** Files forming a cycle, in order */
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-4HTJZC6G.js";import"../chunk-QYKKTYBN.js";import"../chunk-IVAIPXNO.js";import"../chunk-FVVT7GV6.js";import"../chunk-WEJYUS5O.js";import"../chunk-PBGTMPJ7.js";import"../chunk-OH5HIAID.js";import"../chunk-ISCKLDSS.js";import"../chunk-NN3O7TPH.js";import"../chunk-VDZL45XI.js";export{a as cycles};
1
+ import{a}from"../chunk-CJJP64OC.js";import"../chunk-ZQLO2SCU.js";import"../chunk-AUVBR62P.js";import"../chunk-FOQHUKNZ.js";import"../chunk-CRU42NJU.js";import"../chunk-JM72FNGA.js";import"../chunk-QLNGUWR7.js";import"../chunk-ERHOS6AW.js";import"../chunk-EWC3UK4V.js";import"../chunk-D322LMSA.js";import"../chunk-A4L36SZS.js";import"../chunk-OBBDKQAG.js";import"../chunk-64MNV6AB.js";import"../chunk-7S5E7KWT.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-CTarohbZ.js';
2
2
  import 'better-sqlite3';
3
- import '../config-types-CGIeLEpY.js';
3
+ import '../config-types-Bj4sh28g.js';
4
4
 
5
5
  interface DataflowResult {
6
6
  symbol: string;