@boshu2/vibe-check 1.8.1 → 2.2.0

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 (402) hide show
  1. package/.agents/plans/2025-12-27-vibe-check-evolution-plan.md +383 -0
  2. package/.agents/research/2025-12-27-vibe-check-evolution.md +352 -0
  3. package/.claude/settings.local.json +9 -3
  4. package/CHANGELOG.md +43 -0
  5. package/CLAUDE.md +201 -26
  6. package/Makefile +4 -4
  7. package/README.md +95 -0
  8. package/bin/vibe-check.js +1 -1
  9. package/claude-progress.json +18 -0
  10. package/dist/analysis/cross-session-analysis.d.ts +1 -1
  11. package/dist/analysis/cross-session-analysis.d.ts.map +1 -1
  12. package/dist/analysis/cross-session-analysis.js +9 -18
  13. package/dist/analysis/cross-session-analysis.js.map +1 -1
  14. package/dist/analysis/index.d.ts +1 -1
  15. package/dist/analysis/index.d.ts.map +1 -1
  16. package/dist/analysis/index.js +1 -11
  17. package/dist/analysis/index.js.map +1 -1
  18. package/dist/analyzers/audit.d.ts +28 -0
  19. package/dist/analyzers/audit.d.ts.map +1 -0
  20. package/dist/analyzers/audit.js +86 -0
  21. package/dist/analyzers/audit.js.map +1 -0
  22. package/dist/analyzers/eldritch.d.ts +40 -0
  23. package/dist/analyzers/eldritch.d.ts.map +1 -0
  24. package/dist/analyzers/eldritch.js +202 -0
  25. package/dist/analyzers/eldritch.js.map +1 -0
  26. package/dist/analyzers/modularity.d.ts +67 -0
  27. package/dist/analyzers/modularity.d.ts.map +1 -0
  28. package/dist/analyzers/modularity.js +254 -0
  29. package/dist/analyzers/modularity.js.map +1 -0
  30. package/dist/analyzers/patterns.d.ts +1 -1
  31. package/dist/analyzers/patterns.d.ts.map +1 -1
  32. package/dist/analyzers/patterns.js +4 -10
  33. package/dist/analyzers/patterns.js.map +1 -1
  34. package/dist/analyzers/quality.d.ts +1 -1
  35. package/dist/analyzers/quality.d.ts.map +1 -1
  36. package/dist/analyzers/quality.js +5 -12
  37. package/dist/analyzers/quality.js.map +1 -1
  38. package/dist/analyzers/sessions.d.ts +1 -1
  39. package/dist/analyzers/sessions.d.ts.map +1 -1
  40. package/dist/analyzers/sessions.js +1 -4
  41. package/dist/analyzers/sessions.js.map +1 -1
  42. package/dist/cli.js +21 -20
  43. package/dist/cli.js.map +1 -1
  44. package/dist/commands/analyze.d.ts.map +1 -1
  45. package/dist/commands/analyze.js +124 -149
  46. package/dist/commands/analyze.js.map +1 -1
  47. package/dist/commands/audit.d.ts +3 -0
  48. package/dist/commands/audit.d.ts.map +1 -0
  49. package/dist/commands/audit.js +102 -0
  50. package/dist/commands/audit.js.map +1 -0
  51. package/dist/commands/cache.js +31 -70
  52. package/dist/commands/cache.js.map +1 -1
  53. package/dist/commands/dashboard.d.ts.map +1 -1
  54. package/dist/commands/dashboard.js +22 -58
  55. package/dist/commands/dashboard.js.map +1 -1
  56. package/dist/commands/forensics.d.ts +10 -2
  57. package/dist/commands/forensics.d.ts.map +1 -1
  58. package/dist/commands/forensics.js +91 -51
  59. package/dist/commands/forensics.js.map +1 -1
  60. package/dist/commands/index.d.ts +15 -13
  61. package/dist/commands/index.d.ts.map +1 -1
  62. package/dist/commands/index.js +15 -33
  63. package/dist/commands/index.js.map +1 -1
  64. package/dist/commands/init-hook.js +26 -32
  65. package/dist/commands/init-hook.js.map +1 -1
  66. package/dist/commands/insights.js +39 -45
  67. package/dist/commands/insights.js.map +1 -1
  68. package/dist/commands/modularity.d.ts +27 -0
  69. package/dist/commands/modularity.d.ts.map +1 -0
  70. package/dist/commands/modularity.js +182 -0
  71. package/dist/commands/modularity.js.map +1 -0
  72. package/dist/commands/pipeline.js +39 -78
  73. package/dist/commands/pipeline.js.map +1 -1
  74. package/dist/commands/profile.js +68 -74
  75. package/dist/commands/profile.js.map +1 -1
  76. package/dist/commands/session.js +88 -129
  77. package/dist/commands/session.js.map +1 -1
  78. package/dist/commands/sessions.d.ts +1 -1
  79. package/dist/commands/sessions.d.ts.map +1 -1
  80. package/dist/commands/sessions.js +42 -49
  81. package/dist/commands/sessions.js.map +1 -1
  82. package/dist/commands/start.js +22 -67
  83. package/dist/commands/start.js.map +1 -1
  84. package/dist/commands/timeline.js +74 -81
  85. package/dist/commands/timeline.js.map +1 -1
  86. package/dist/commands/watch.js +54 -60
  87. package/dist/commands/watch.js.map +1 -1
  88. package/dist/gamification/achievements.d.ts +1 -1
  89. package/dist/gamification/achievements.d.ts.map +1 -1
  90. package/dist/gamification/achievements.js +7 -13
  91. package/dist/gamification/achievements.js.map +1 -1
  92. package/dist/gamification/index.d.ts +8 -8
  93. package/dist/gamification/index.d.ts.map +1 -1
  94. package/dist/gamification/index.js +8 -28
  95. package/dist/gamification/index.js.map +1 -1
  96. package/dist/gamification/profile.d.ts +2 -2
  97. package/dist/gamification/profile.d.ts.map +1 -1
  98. package/dist/gamification/profile.js +21 -64
  99. package/dist/gamification/profile.js.map +1 -1
  100. package/dist/gamification/stats.d.ts +1 -1
  101. package/dist/gamification/stats.d.ts.map +1 -1
  102. package/dist/gamification/stats.js +4 -10
  103. package/dist/gamification/stats.js.map +1 -1
  104. package/dist/gamification/streaks.d.ts +1 -1
  105. package/dist/gamification/streaks.d.ts.map +1 -1
  106. package/dist/gamification/streaks.js +8 -18
  107. package/dist/gamification/streaks.js.map +1 -1
  108. package/dist/gamification/types.js +3 -6
  109. package/dist/gamification/types.js.map +1 -1
  110. package/dist/gamification/xp.d.ts +1 -1
  111. package/dist/gamification/xp.d.ts.map +1 -1
  112. package/dist/gamification/xp.js +29 -38
  113. package/dist/gamification/xp.js.map +1 -1
  114. package/dist/git.d.ts +1 -1
  115. package/dist/git.d.ts.map +1 -1
  116. package/dist/git.js +23 -29
  117. package/dist/git.js.map +1 -1
  118. package/dist/inner-loop/context-amnesia.d.ts +2 -2
  119. package/dist/inner-loop/context-amnesia.d.ts.map +1 -1
  120. package/dist/inner-loop/context-amnesia.js +7 -10
  121. package/dist/inner-loop/context-amnesia.js.map +1 -1
  122. package/dist/inner-loop/index.d.ts +7 -7
  123. package/dist/inner-loop/index.d.ts.map +1 -1
  124. package/dist/inner-loop/index.js +18 -45
  125. package/dist/inner-loop/index.js.map +1 -1
  126. package/dist/inner-loop/instruction-drift.d.ts +2 -2
  127. package/dist/inner-loop/instruction-drift.d.ts.map +1 -1
  128. package/dist/inner-loop/instruction-drift.js +5 -10
  129. package/dist/inner-loop/instruction-drift.js.map +1 -1
  130. package/dist/inner-loop/logging-only.d.ts +2 -2
  131. package/dist/inner-loop/logging-only.d.ts.map +1 -1
  132. package/dist/inner-loop/logging-only.js +9 -17
  133. package/dist/inner-loop/logging-only.js.map +1 -1
  134. package/dist/inner-loop/tests-passing-lie.d.ts +2 -2
  135. package/dist/inner-loop/tests-passing-lie.d.ts.map +1 -1
  136. package/dist/inner-loop/tests-passing-lie.js +12 -17
  137. package/dist/inner-loop/tests-passing-lie.js.map +1 -1
  138. package/dist/inner-loop/types.js +1 -4
  139. package/dist/inner-loop/types.js.map +1 -1
  140. package/dist/insights/generators.d.ts +4 -4
  141. package/dist/insights/generators.d.ts.map +1 -1
  142. package/dist/insights/generators.js +9 -20
  143. package/dist/insights/generators.js.map +1 -1
  144. package/dist/insights/index.d.ts +4 -4
  145. package/dist/insights/index.d.ts.map +1 -1
  146. package/dist/insights/index.js +23 -27
  147. package/dist/insights/index.js.map +1 -1
  148. package/dist/insights/types.js +1 -2
  149. package/dist/insights/types.js.map +1 -1
  150. package/dist/metrics/code-stability.d.ts +1 -1
  151. package/dist/metrics/code-stability.d.ts.map +1 -1
  152. package/dist/metrics/code-stability.js +1 -4
  153. package/dist/metrics/code-stability.js.map +1 -1
  154. package/dist/metrics/cohesion.d.ts +27 -0
  155. package/dist/metrics/cohesion.d.ts.map +1 -0
  156. package/dist/metrics/cohesion.js +134 -0
  157. package/dist/metrics/cohesion.js.map +1 -0
  158. package/dist/metrics/file-churn.d.ts +1 -1
  159. package/dist/metrics/file-churn.d.ts.map +1 -1
  160. package/dist/metrics/file-churn.js +1 -4
  161. package/dist/metrics/file-churn.js.map +1 -1
  162. package/dist/metrics/flow.d.ts +1 -1
  163. package/dist/metrics/flow.d.ts.map +1 -1
  164. package/dist/metrics/flow.js +1 -4
  165. package/dist/metrics/flow.js.map +1 -1
  166. package/dist/metrics/index.d.ts +10 -2
  167. package/dist/metrics/index.d.ts.map +1 -1
  168. package/dist/metrics/index.js +51 -20
  169. package/dist/metrics/index.js.map +1 -1
  170. package/dist/metrics/investigation.d.ts +25 -0
  171. package/dist/metrics/investigation.d.ts.map +1 -0
  172. package/dist/metrics/investigation.js +115 -0
  173. package/dist/metrics/investigation.js.map +1 -0
  174. package/dist/metrics/rework.d.ts +1 -1
  175. package/dist/metrics/rework.d.ts.map +1 -1
  176. package/dist/metrics/rework.js +1 -4
  177. package/dist/metrics/rework.js.map +1 -1
  178. package/dist/metrics/spirals.d.ts +1 -1
  179. package/dist/metrics/spirals.d.ts.map +1 -1
  180. package/dist/metrics/spirals.js +5 -10
  181. package/dist/metrics/spirals.js.map +1 -1
  182. package/dist/metrics/time-spiral.d.ts +1 -1
  183. package/dist/metrics/time-spiral.d.ts.map +1 -1
  184. package/dist/metrics/time-spiral.js +1 -4
  185. package/dist/metrics/time-spiral.js.map +1 -1
  186. package/dist/metrics/tracers.d.ts +28 -0
  187. package/dist/metrics/tracers.d.ts.map +1 -0
  188. package/dist/metrics/tracers.js +117 -0
  189. package/dist/metrics/tracers.js.map +1 -0
  190. package/dist/metrics/trust.d.ts +1 -1
  191. package/dist/metrics/trust.d.ts.map +1 -1
  192. package/dist/metrics/trust.js +3 -6
  193. package/dist/metrics/trust.js.map +1 -1
  194. package/dist/metrics/velocity-anomaly.d.ts +1 -1
  195. package/dist/metrics/velocity-anomaly.d.ts.map +1 -1
  196. package/dist/metrics/velocity-anomaly.js +3 -6
  197. package/dist/metrics/velocity-anomaly.js.map +1 -1
  198. package/dist/metrics/velocity.d.ts +1 -1
  199. package/dist/metrics/velocity.d.ts.map +1 -1
  200. package/dist/metrics/velocity.js +6 -10
  201. package/dist/metrics/velocity.js.map +1 -1
  202. package/dist/output/index.d.ts +4 -4
  203. package/dist/output/index.d.ts.map +1 -1
  204. package/dist/output/index.js +10 -18
  205. package/dist/output/index.js.map +1 -1
  206. package/dist/output/json.d.ts +1 -1
  207. package/dist/output/json.d.ts.map +1 -1
  208. package/dist/output/json.js +1 -4
  209. package/dist/output/json.js.map +1 -1
  210. package/dist/output/markdown.d.ts +1 -1
  211. package/dist/output/markdown.d.ts.map +1 -1
  212. package/dist/output/markdown.js +5 -8
  213. package/dist/output/markdown.js.map +1 -1
  214. package/dist/output/terminal.d.ts +1 -1
  215. package/dist/output/terminal.d.ts.map +1 -1
  216. package/dist/output/terminal.js +88 -62
  217. package/dist/output/terminal.js.map +1 -1
  218. package/dist/output/timeline-html.d.ts +1 -1
  219. package/dist/output/timeline-html.d.ts.map +1 -1
  220. package/dist/output/timeline-html.js +5 -8
  221. package/dist/output/timeline-html.js.map +1 -1
  222. package/dist/output/timeline-markdown.d.ts +1 -1
  223. package/dist/output/timeline-markdown.d.ts.map +1 -1
  224. package/dist/output/timeline-markdown.js +5 -8
  225. package/dist/output/timeline-markdown.js.map +1 -1
  226. package/dist/output/timeline.d.ts +1 -1
  227. package/dist/output/timeline.d.ts.map +1 -1
  228. package/dist/output/timeline.js +46 -52
  229. package/dist/output/timeline.js.map +1 -1
  230. package/dist/patterns/detour.d.ts +1 -1
  231. package/dist/patterns/detour.d.ts.map +1 -1
  232. package/dist/patterns/detour.js +1 -4
  233. package/dist/patterns/detour.js.map +1 -1
  234. package/dist/patterns/flow-state.d.ts +1 -1
  235. package/dist/patterns/flow-state.d.ts.map +1 -1
  236. package/dist/patterns/flow-state.js +1 -4
  237. package/dist/patterns/flow-state.js.map +1 -1
  238. package/dist/patterns/index.d.ts +7 -7
  239. package/dist/patterns/index.d.ts.map +1 -1
  240. package/dist/patterns/index.js +7 -21
  241. package/dist/patterns/index.js.map +1 -1
  242. package/dist/patterns/intervention-effectiveness.d.ts +1 -1
  243. package/dist/patterns/intervention-effectiveness.d.ts.map +1 -1
  244. package/dist/patterns/intervention-effectiveness.js +3 -8
  245. package/dist/patterns/intervention-effectiveness.js.map +1 -1
  246. package/dist/patterns/late-night.d.ts +1 -1
  247. package/dist/patterns/late-night.d.ts.map +1 -1
  248. package/dist/patterns/late-night.js +1 -4
  249. package/dist/patterns/late-night.js.map +1 -1
  250. package/dist/patterns/post-delete-sprint.d.ts +1 -1
  251. package/dist/patterns/post-delete-sprint.d.ts.map +1 -1
  252. package/dist/patterns/post-delete-sprint.js +1 -4
  253. package/dist/patterns/post-delete-sprint.js.map +1 -1
  254. package/dist/patterns/spiral-regression.d.ts +1 -1
  255. package/dist/patterns/spiral-regression.d.ts.map +1 -1
  256. package/dist/patterns/spiral-regression.js +3 -8
  257. package/dist/patterns/spiral-regression.js.map +1 -1
  258. package/dist/patterns/thrashing.d.ts +1 -1
  259. package/dist/patterns/thrashing.d.ts.map +1 -1
  260. package/dist/patterns/thrashing.js +3 -6
  261. package/dist/patterns/thrashing.js.map +1 -1
  262. package/dist/score/index.d.ts +3 -3
  263. package/dist/score/index.d.ts.map +1 -1
  264. package/dist/score/index.js +4 -10
  265. package/dist/score/index.js.map +1 -1
  266. package/dist/score/weights.js +2 -6
  267. package/dist/score/weights.js.map +1 -1
  268. package/dist/sessions/index.js +9 -51
  269. package/dist/sessions/index.js.map +1 -1
  270. package/dist/storage/atomic.js +10 -51
  271. package/dist/storage/atomic.js.map +1 -1
  272. package/dist/storage/commit-log.d.ts +1 -1
  273. package/dist/storage/commit-log.d.ts.map +1 -1
  274. package/dist/storage/commit-log.js +11 -51
  275. package/dist/storage/commit-log.js.map +1 -1
  276. package/dist/storage/index.d.ts +5 -5
  277. package/dist/storage/index.d.ts.map +1 -1
  278. package/dist/storage/index.js +5 -37
  279. package/dist/storage/index.js.map +1 -1
  280. package/dist/storage/schema.js +4 -9
  281. package/dist/storage/schema.js.map +1 -1
  282. package/dist/storage/spiral-history.js +14 -57
  283. package/dist/storage/spiral-history.js.map +1 -1
  284. package/dist/storage/timeline-store.d.ts +2 -2
  285. package/dist/storage/timeline-store.d.ts.map +1 -1
  286. package/dist/storage/timeline-store.js +17 -61
  287. package/dist/storage/timeline-store.js.map +1 -1
  288. package/dist/types.d.ts +36 -1
  289. package/dist/types.d.ts.map +1 -1
  290. package/dist/types.js +1 -2
  291. package/docs/ENHANCEMENT-PLAN.md +379 -0
  292. package/feature-list.json +6 -0
  293. package/package.json +8 -7
  294. package/.claude/skills/typescript-review.md +0 -152
  295. package/dist/calibration/ece.d.ts +0 -26
  296. package/dist/calibration/ece.d.ts.map +0 -1
  297. package/dist/calibration/ece.js +0 -93
  298. package/dist/calibration/ece.js.map +0 -1
  299. package/dist/calibration/index.d.ts +0 -3
  300. package/dist/calibration/index.d.ts.map +0 -1
  301. package/dist/calibration/index.js +0 -15
  302. package/dist/calibration/index.js.map +0 -1
  303. package/dist/calibration/storage.d.ts +0 -34
  304. package/dist/calibration/storage.d.ts.map +0 -1
  305. package/dist/calibration/storage.js +0 -188
  306. package/dist/calibration/storage.js.map +0 -1
  307. package/dist/commands/intervene.d.ts +0 -15
  308. package/dist/commands/intervene.d.ts.map +0 -1
  309. package/dist/commands/intervene.js +0 -183
  310. package/dist/commands/intervene.js.map +0 -1
  311. package/dist/commands/learn.d.ts +0 -3
  312. package/dist/commands/learn.d.ts.map +0 -1
  313. package/dist/commands/learn.js +0 -161
  314. package/dist/commands/learn.js.map +0 -1
  315. package/dist/commands/lesson.d.ts +0 -8
  316. package/dist/commands/lesson.d.ts.map +0 -1
  317. package/dist/commands/lesson.js +0 -206
  318. package/dist/commands/lesson.js.map +0 -1
  319. package/dist/commands/level.d.ts +0 -3
  320. package/dist/commands/level.d.ts.map +0 -1
  321. package/dist/commands/level.js +0 -277
  322. package/dist/commands/level.js.map +0 -1
  323. package/dist/gamification/badges.d.ts +0 -29
  324. package/dist/gamification/badges.d.ts.map +0 -1
  325. package/dist/gamification/badges.js +0 -114
  326. package/dist/gamification/badges.js.map +0 -1
  327. package/dist/gamification/challenges.d.ts +0 -42
  328. package/dist/gamification/challenges.d.ts.map +0 -1
  329. package/dist/gamification/challenges.js +0 -184
  330. package/dist/gamification/challenges.js.map +0 -1
  331. package/dist/gamification/hall-of-fame.d.ts +0 -17
  332. package/dist/gamification/hall-of-fame.d.ts.map +0 -1
  333. package/dist/gamification/hall-of-fame.js +0 -64
  334. package/dist/gamification/hall-of-fame.js.map +0 -1
  335. package/dist/gamification/intervention-memory.d.ts +0 -61
  336. package/dist/gamification/intervention-memory.d.ts.map +0 -1
  337. package/dist/gamification/intervention-memory.js +0 -229
  338. package/dist/gamification/intervention-memory.js.map +0 -1
  339. package/dist/gamification/leaderboards.d.ts +0 -49
  340. package/dist/gamification/leaderboards.d.ts.map +0 -1
  341. package/dist/gamification/leaderboards.js +0 -179
  342. package/dist/gamification/leaderboards.js.map +0 -1
  343. package/dist/gamification/pattern-memory.d.ts +0 -45
  344. package/dist/gamification/pattern-memory.d.ts.map +0 -1
  345. package/dist/gamification/pattern-memory.js +0 -188
  346. package/dist/gamification/pattern-memory.js.map +0 -1
  347. package/dist/gamification/share.d.ts +0 -29
  348. package/dist/gamification/share.d.ts.map +0 -1
  349. package/dist/gamification/share.js +0 -57
  350. package/dist/gamification/share.js.map +0 -1
  351. package/dist/learning/cadence.d.ts +0 -15
  352. package/dist/learning/cadence.d.ts.map +0 -1
  353. package/dist/learning/cadence.js +0 -130
  354. package/dist/learning/cadence.js.map +0 -1
  355. package/dist/learning/index.d.ts +0 -19
  356. package/dist/learning/index.d.ts.map +0 -1
  357. package/dist/learning/index.js +0 -35
  358. package/dist/learning/index.js.map +0 -1
  359. package/dist/learning/lessons-storage.d.ts +0 -48
  360. package/dist/learning/lessons-storage.d.ts.map +0 -1
  361. package/dist/learning/lessons-storage.js +0 -266
  362. package/dist/learning/lessons-storage.js.map +0 -1
  363. package/dist/learning/lessons-types.d.ts +0 -83
  364. package/dist/learning/lessons-types.d.ts.map +0 -1
  365. package/dist/learning/lessons-types.js +0 -15
  366. package/dist/learning/lessons-types.js.map +0 -1
  367. package/dist/learning/nudges.d.ts +0 -20
  368. package/dist/learning/nudges.d.ts.map +0 -1
  369. package/dist/learning/nudges.js +0 -68
  370. package/dist/learning/nudges.js.map +0 -1
  371. package/dist/learning/retrospective.d.ts +0 -27
  372. package/dist/learning/retrospective.d.ts.map +0 -1
  373. package/dist/learning/retrospective.js +0 -184
  374. package/dist/learning/retrospective.js.map +0 -1
  375. package/dist/learning/storage.d.ts +0 -44
  376. package/dist/learning/storage.d.ts.map +0 -1
  377. package/dist/learning/storage.js +0 -194
  378. package/dist/learning/storage.js.map +0 -1
  379. package/dist/learning/surfacing.d.ts +0 -36
  380. package/dist/learning/surfacing.d.ts.map +0 -1
  381. package/dist/learning/surfacing.js +0 -255
  382. package/dist/learning/surfacing.js.map +0 -1
  383. package/dist/learning/synthesis.d.ts +0 -17
  384. package/dist/learning/synthesis.d.ts.map +0 -1
  385. package/dist/learning/synthesis.js +0 -293
  386. package/dist/learning/synthesis.js.map +0 -1
  387. package/dist/learning/types.d.ts +0 -60
  388. package/dist/learning/types.d.ts.map +0 -1
  389. package/dist/learning/types.js +0 -17
  390. package/dist/learning/types.js.map +0 -1
  391. package/dist/recommend/index.d.ts +0 -3
  392. package/dist/recommend/index.d.ts.map +0 -1
  393. package/dist/recommend/index.js +0 -14
  394. package/dist/recommend/index.js.map +0 -1
  395. package/dist/recommend/ordered-logistic.d.ts +0 -49
  396. package/dist/recommend/ordered-logistic.d.ts.map +0 -1
  397. package/dist/recommend/ordered-logistic.js +0 -153
  398. package/dist/recommend/ordered-logistic.js.map +0 -1
  399. package/dist/recommend/questions.d.ts +0 -19
  400. package/dist/recommend/questions.d.ts.map +0 -1
  401. package/dist/recommend/questions.js +0 -73
  402. package/dist/recommend/questions.js.map +0 -1
@@ -1,152 +0,0 @@
1
- # TypeScript Code Review Skill
2
-
3
- **Trigger:** User asks for TypeScript review, type safety audit, or TS best practices check.
4
-
5
- **Purpose:** Systematic TypeScript code review focusing on type safety, patterns, and idiomatic usage.
6
-
7
- ---
8
-
9
- ## Review Checklist
10
-
11
- ### 1. Compiler Configuration (tsconfig.json)
12
-
13
- | Setting | Recommended | Why |
14
- |---------|-------------|-----|
15
- | `strict` | `true` | Enables all strict checks |
16
- | `noImplicitAny` | `true` (via strict) | No silent `any` types |
17
- | `strictNullChecks` | `true` (via strict) | Catch null/undefined errors |
18
- | `noUncheckedIndexedAccess` | `true` | Arrays return `T \| undefined` |
19
- | `exactOptionalPropertyTypes` | `true` | Distinguish `undefined` vs missing |
20
- | `noImplicitReturns` | `true` | All code paths must return |
21
- | `noFallthroughCasesInSwitch` | `true` | Prevent switch fallthrough bugs |
22
-
23
- ### 2. Type Safety Issues
24
-
25
- **Critical (fix immediately):**
26
- - [ ] Explicit `any` types
27
- - [ ] Type assertions without validation (`as Type`)
28
- - [ ] Non-null assertions (`!`) without checks
29
- - [ ] `@ts-ignore` or `@ts-expect-error` comments
30
- - [ ] Missing return types on exported functions
31
-
32
- **Warning (improve when possible):**
33
- - [ ] Implicit `any` in callbacks
34
- - [ ] Overly broad types (`object`, `{}`, `Function`)
35
- - [ ] Missing generics where reuse is possible
36
- - [ ] Type assertions that could be type guards
37
-
38
- ### 3. Type Design Patterns
39
-
40
- **Good patterns to look for:**
41
- ```typescript
42
- // Discriminated unions
43
- type Result<T> =
44
- | { success: true; data: T }
45
- | { success: false; error: string };
46
-
47
- // Branded types for IDs
48
- type UserId = string & { readonly brand: unique symbol };
49
-
50
- // Const assertions for literals
51
- const STATUSES = ['pending', 'active', 'done'] as const;
52
- type Status = typeof STATUSES[number];
53
-
54
- // Type guards
55
- function isUser(obj: unknown): obj is User {
56
- return typeof obj === 'object' && obj !== null && 'id' in obj;
57
- }
58
- ```
59
-
60
- **Anti-patterns to flag:**
61
- ```typescript
62
- // ❌ Stringly-typed
63
- function setStatus(status: string) { }
64
-
65
- // ✅ Union type
66
- function setStatus(status: 'pending' | 'active' | 'done') { }
67
-
68
- // ❌ Optional chaining hiding bugs
69
- const name = user?.profile?.name ?? 'Unknown';
70
-
71
- // ✅ Explicit null handling
72
- if (!user || !user.profile) {
73
- throw new Error('User profile required');
74
- }
75
- const name = user.profile.name;
76
- ```
77
-
78
- ### 4. Interface vs Type
79
-
80
- | Use Interface | Use Type |
81
- |---------------|----------|
82
- | Object shapes | Unions, intersections |
83
- | Extendable contracts | Computed types |
84
- | Class implementations | Mapped types |
85
- | Public API | Internal aliases |
86
-
87
- ### 5. Export Hygiene
88
-
89
- - [ ] Are internal types exported unnecessarily?
90
- - [ ] Is there a central `types.ts` for shared types?
91
- - [ ] Are re-exports organized (`index.ts` barrels)?
92
-
93
- ---
94
-
95
- ## Review Process
96
-
97
- 1. **Check tsconfig.json** - Verify strict settings
98
- 2. **Run `tsc --noEmit`** - Catch all compiler errors
99
- 3. **Search for anti-patterns:**
100
- ```bash
101
- grep -r ": any" src/
102
- grep -r "as " src/ | grep -v "import"
103
- grep -r "@ts-ignore" src/
104
- grep -r "!" src/ | grep -v "!=" | grep -v "!=="
105
- ```
106
- 4. **Review types.ts** - Check type design
107
- 5. **Sample 3-5 files** - Deep review patterns
108
-
109
- ---
110
-
111
- ## Output Format
112
-
113
- ```markdown
114
- ## TypeScript Review: [Project Name]
115
-
116
- ### Config Score: X/10
117
- [tsconfig.json findings]
118
-
119
- ### Type Safety Score: X/10
120
- [Anti-pattern counts and examples]
121
-
122
- ### Type Design Score: X/10
123
- [Pattern quality assessment]
124
-
125
- ### Top Issues
126
- 1. [Most critical issue]
127
- 2. [Second issue]
128
- 3. [Third issue]
129
-
130
- ### Recommendations
131
- - [ ] [Actionable fix 1]
132
- - [ ] [Actionable fix 2]
133
- - [ ] [Actionable fix 3]
134
- ```
135
-
136
- ---
137
-
138
- ## Quick Fixes
139
-
140
- ```bash
141
- # Find all `any` types
142
- grep -rn ": any" src/
143
-
144
- # Find type assertions
145
- grep -rn " as [A-Z]" src/
146
-
147
- # Find non-null assertions
148
- grep -rn "\![^=]" src/
149
-
150
- # Run strict type check
151
- npx tsc --noEmit --strict
152
- ```
@@ -1,26 +0,0 @@
1
- import { CalibrationSample } from '../types';
2
- /**
3
- * Expected Calibration Error (ECE).
4
- * Measures how well predicted levels match declared levels.
5
- *
6
- * ECE = Σᵢ (nᵢ/N) × |accuracy(binᵢ) - confidence(binᵢ)|
7
- */
8
- export declare function calculateECE(samples: CalibrationSample[]): number;
9
- /**
10
- * Assess if a score matches the expected range for a level.
11
- */
12
- export declare function assessOutcome(vibeScore: number, declaredLevel: number): 'correct' | 'too_high' | 'too_low';
13
- /**
14
- * Infer the "true" vibe level from an actual vibe score.
15
- * This is used to generate training labels for the model.
16
- *
17
- * Maps score ranges to levels:
18
- * - 0.90-1.00 → 5 (Elite flow)
19
- * - 0.80-0.90 → 4 (High flow)
20
- * - 0.65-0.80 → 3 (Balanced)
21
- * - 0.50-0.65 → 2 (AI-Augmented)
22
- * - 0.30-0.50 → 1 (Human-Led)
23
- * - 0.00-0.30 → 0 (Manual)
24
- */
25
- export declare function inferTrueLevel(vibeScore: number): 0 | 1 | 2 | 3 | 4 | 5;
26
- //# sourceMappingURL=ece.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ece.d.ts","sourceRoot":"","sources":["../../src/calibration/ece.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAoCjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,SAAS,GAAG,UAAU,GAAG,SAAS,CAmBpC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAOvE"}
@@ -1,93 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.calculateECE = calculateECE;
4
- exports.assessOutcome = assessOutcome;
5
- exports.inferTrueLevel = inferTrueLevel;
6
- /**
7
- * Expected Calibration Error (ECE).
8
- * Measures how well predicted levels match declared levels.
9
- *
10
- * ECE = Σᵢ (nᵢ/N) × |accuracy(binᵢ) - confidence(binᵢ)|
11
- */
12
- function calculateECE(samples) {
13
- if (samples.length === 0)
14
- return 0;
15
- // Group by declared level
16
- const bins = new Map();
17
- for (let level = 0; level <= 5; level++) {
18
- bins.set(level, []);
19
- }
20
- for (const sample of samples) {
21
- const levelSamples = bins.get(sample.declaredLevel) || [];
22
- levelSamples.push(sample);
23
- bins.set(sample.declaredLevel, levelSamples);
24
- }
25
- // Expected score range for each level
26
- const expectedRanges = {
27
- 5: { min: 0.90, max: 1.00 },
28
- 4: { min: 0.80, max: 0.90 },
29
- 3: { min: 0.65, max: 0.80 },
30
- 2: { min: 0.50, max: 0.70 },
31
- 1: { min: 0.30, max: 0.55 },
32
- 0: { min: 0.00, max: 0.40 },
33
- };
34
- let ece = 0;
35
- for (const [level, levelSamples] of bins) {
36
- if (levelSamples.length === 0)
37
- continue;
38
- const expected = expectedRanges[level];
39
- const expectedCenter = (expected.min + expected.max) / 2;
40
- const actualMean = levelSamples.reduce((sum, s) => sum + s.vibeScore, 0) / levelSamples.length;
41
- ece += (levelSamples.length / samples.length) * Math.abs(actualMean - expectedCenter);
42
- }
43
- return Math.round(ece * 1000) / 1000;
44
- }
45
- /**
46
- * Assess if a score matches the expected range for a level.
47
- */
48
- function assessOutcome(vibeScore, declaredLevel) {
49
- const expectedRanges = {
50
- 5: { min: 0.90, max: 1.00 },
51
- 4: { min: 0.80, max: 0.90 },
52
- 3: { min: 0.65, max: 0.80 },
53
- 2: { min: 0.50, max: 0.70 },
54
- 1: { min: 0.30, max: 0.55 },
55
- 0: { min: 0.00, max: 0.40 },
56
- };
57
- const expected = expectedRanges[declaredLevel];
58
- if (vibeScore >= expected.min && vibeScore <= expected.max) {
59
- return 'correct';
60
- }
61
- else if (vibeScore > expected.max) {
62
- return 'too_low'; // Level was too conservative
63
- }
64
- else {
65
- return 'too_high'; // Level was too aggressive
66
- }
67
- }
68
- /**
69
- * Infer the "true" vibe level from an actual vibe score.
70
- * This is used to generate training labels for the model.
71
- *
72
- * Maps score ranges to levels:
73
- * - 0.90-1.00 → 5 (Elite flow)
74
- * - 0.80-0.90 → 4 (High flow)
75
- * - 0.65-0.80 → 3 (Balanced)
76
- * - 0.50-0.65 → 2 (AI-Augmented)
77
- * - 0.30-0.50 → 1 (Human-Led)
78
- * - 0.00-0.30 → 0 (Manual)
79
- */
80
- function inferTrueLevel(vibeScore) {
81
- if (vibeScore >= 0.90)
82
- return 5;
83
- if (vibeScore >= 0.80)
84
- return 4;
85
- if (vibeScore >= 0.65)
86
- return 3;
87
- if (vibeScore >= 0.50)
88
- return 2;
89
- if (vibeScore >= 0.30)
90
- return 1;
91
- return 0;
92
- }
93
- //# sourceMappingURL=ece.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ece.js","sourceRoot":"","sources":["../../src/calibration/ece.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- export { loadCalibration, saveCalibration, addSample, getCalibrationPath, retrain, forceRetrain } from './storage';
2
- export { calculateECE, assessOutcome, inferTrueLevel } from './ece';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/calibration/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACnH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC"}
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.inferTrueLevel = exports.assessOutcome = exports.calculateECE = exports.forceRetrain = exports.retrain = exports.getCalibrationPath = exports.addSample = exports.saveCalibration = exports.loadCalibration = void 0;
4
- var storage_1 = require("./storage");
5
- Object.defineProperty(exports, "loadCalibration", { enumerable: true, get: function () { return storage_1.loadCalibration; } });
6
- Object.defineProperty(exports, "saveCalibration", { enumerable: true, get: function () { return storage_1.saveCalibration; } });
7
- Object.defineProperty(exports, "addSample", { enumerable: true, get: function () { return storage_1.addSample; } });
8
- Object.defineProperty(exports, "getCalibrationPath", { enumerable: true, get: function () { return storage_1.getCalibrationPath; } });
9
- Object.defineProperty(exports, "retrain", { enumerable: true, get: function () { return storage_1.retrain; } });
10
- Object.defineProperty(exports, "forceRetrain", { enumerable: true, get: function () { return storage_1.forceRetrain; } });
11
- var ece_1 = require("./ece");
12
- Object.defineProperty(exports, "calculateECE", { enumerable: true, get: function () { return ece_1.calculateECE; } });
13
- Object.defineProperty(exports, "assessOutcome", { enumerable: true, get: function () { return ece_1.assessOutcome; } });
14
- Object.defineProperty(exports, "inferTrueLevel", { enumerable: true, get: function () { return ece_1.inferTrueLevel; } });
15
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/calibration/index.ts"],"names":[],"mappings":";;;AAAA,qCAAmH;AAA1G,0GAAA,eAAe,OAAA;AAAE,0GAAA,eAAe,OAAA;AAAE,oGAAA,SAAS,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,kGAAA,OAAO,OAAA;AAAE,uGAAA,YAAY,OAAA;AAC/F,6BAAoE;AAA3D,mGAAA,YAAY,OAAA;AAAE,oGAAA,aAAa,OAAA;AAAE,qGAAA,cAAc,OAAA"}
@@ -1,34 +0,0 @@
1
- import { CalibrationState, CalibrationSample } from '../types';
2
- /**
3
- * Get calibration file path for a repository.
4
- */
5
- export declare function getCalibrationPath(repoPath: string): string;
6
- /**
7
- * Load calibration state from disk.
8
- */
9
- export declare function loadCalibration(repoPath: string): CalibrationState;
10
- /**
11
- * Save calibration state to disk.
12
- */
13
- export declare function saveCalibration(repoPath: string, state: CalibrationState): void;
14
- /**
15
- * Add a calibration sample and potentially trigger retraining.
16
- *
17
- * Retraining is triggered when:
18
- * 1. Sample count is a multiple of RETRAIN_SAMPLE_INTERVAL, OR
19
- * 2. ECE exceeds RETRAIN_ECE_THRESHOLD
20
- *
21
- * Returns updated state with potentially new weights.
22
- */
23
- export declare function addSample(repoPath: string, sample: CalibrationSample): CalibrationState;
24
- /**
25
- * Retrain the model using all accumulated samples.
26
- *
27
- * Uses batch partial fit with inferred true levels from vibe scores.
28
- */
29
- export declare function retrain(state: CalibrationState): CalibrationState;
30
- /**
31
- * Force retraining (manual trigger).
32
- */
33
- export declare function forceRetrain(repoPath: string): CalibrationState;
34
- //# sourceMappingURL=storage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/calibration/storage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAyB/D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAoBlE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAS/E;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,iBAAiB,GACxB,gBAAgB,CAmBlB;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAmCjE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAQ/D"}
@@ -1,188 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.getCalibrationPath = getCalibrationPath;
37
- exports.loadCalibration = loadCalibration;
38
- exports.saveCalibration = saveCalibration;
39
- exports.addSample = addSample;
40
- exports.retrain = retrain;
41
- exports.forceRetrain = forceRetrain;
42
- const fs = __importStar(require("fs"));
43
- const path = __importStar(require("path"));
44
- const ordered_logistic_1 = require("../recommend/ordered-logistic");
45
- const ece_1 = require("./ece");
46
- const CALIBRATION_DIR = '.vibe-check';
47
- const CALIBRATION_FILE = 'calibration.json';
48
- /**
49
- * Retraining triggers for the calibration model.
50
- *
51
- * RETRAIN_SAMPLE_INTERVAL (10): Retrain every 10 samples to incorporate
52
- * new data. Balances learning speed vs. computational cost.
53
- *
54
- * RETRAIN_ECE_THRESHOLD (0.15): If Expected Calibration Error exceeds 15%,
55
- * the model's predictions are poorly calibrated. 15% chosen as "noticeable
56
- * but not catastrophic" miscalibration.
57
- *
58
- * Note: With 14 parameters (9 weights + 5 thresholds), even 10 samples is
59
- * severely underfitting. 20+ samples recommended for reliability.
60
- *
61
- * These values are NOT empirically optimized.
62
- */
63
- const RETRAIN_SAMPLE_INTERVAL = 10;
64
- const RETRAIN_ECE_THRESHOLD = 0.15;
65
- /**
66
- * Get calibration file path for a repository.
67
- */
68
- function getCalibrationPath(repoPath) {
69
- return path.join(repoPath, CALIBRATION_DIR, CALIBRATION_FILE);
70
- }
71
- /**
72
- * Load calibration state from disk.
73
- */
74
- function loadCalibration(repoPath) {
75
- const filePath = getCalibrationPath(repoPath);
76
- if (fs.existsSync(filePath)) {
77
- try {
78
- const data = fs.readFileSync(filePath, 'utf-8');
79
- const state = JSON.parse(data);
80
- // Ensure dates are Date objects
81
- state.lastUpdated = new Date(state.lastUpdated);
82
- state.samples = state.samples.map((s) => ({
83
- ...s,
84
- timestamp: new Date(s.timestamp),
85
- }));
86
- return state;
87
- }
88
- catch {
89
- return defaultCalibrationState();
90
- }
91
- }
92
- return defaultCalibrationState();
93
- }
94
- /**
95
- * Save calibration state to disk.
96
- */
97
- function saveCalibration(repoPath, state) {
98
- const dirPath = path.join(repoPath, CALIBRATION_DIR);
99
- const filePath = getCalibrationPath(repoPath);
100
- if (!fs.existsSync(dirPath)) {
101
- fs.mkdirSync(dirPath, { recursive: true });
102
- }
103
- fs.writeFileSync(filePath, JSON.stringify(state, null, 2));
104
- }
105
- /**
106
- * Add a calibration sample and potentially trigger retraining.
107
- *
108
- * Retraining is triggered when:
109
- * 1. Sample count is a multiple of RETRAIN_SAMPLE_INTERVAL, OR
110
- * 2. ECE exceeds RETRAIN_ECE_THRESHOLD
111
- *
112
- * Returns updated state with potentially new weights.
113
- */
114
- function addSample(repoPath, sample) {
115
- const state = loadCalibration(repoPath);
116
- state.samples.push(sample);
117
- state.lastUpdated = new Date();
118
- // Check if retraining is needed
119
- const shouldRetrain = state.samples.length % RETRAIN_SAMPLE_INTERVAL === 0 ||
120
- state.ece > RETRAIN_ECE_THRESHOLD;
121
- if (shouldRetrain && state.samples.length >= 5) {
122
- const updatedState = retrain(state);
123
- saveCalibration(repoPath, updatedState);
124
- return updatedState;
125
- }
126
- // Just save without retraining
127
- saveCalibration(repoPath, state);
128
- return state;
129
- }
130
- /**
131
- * Retrain the model using all accumulated samples.
132
- *
133
- * Uses batch partial fit with inferred true levels from vibe scores.
134
- */
135
- function retrain(state) {
136
- if (state.samples.length < 5) {
137
- return state; // Not enough data
138
- }
139
- // Prepare training data: use vibeScore to infer "true" level
140
- const trainingData = state.samples.map((sample) => ({
141
- features: sample.features,
142
- trueLevel: (0, ece_1.inferTrueLevel)(sample.vibeScore),
143
- }));
144
- // Start from default model (or could start from current weights)
145
- const initialModel = {
146
- weights: [...ordered_logistic_1.DEFAULT_MODEL.weights],
147
- thresholds: [...ordered_logistic_1.DEFAULT_MODEL.thresholds],
148
- };
149
- // Train with multiple epochs for better convergence
150
- let model = initialModel;
151
- const epochs = Math.min(10, Math.ceil(50 / state.samples.length));
152
- for (let epoch = 0; epoch < epochs; epoch++) {
153
- model = (0, ordered_logistic_1.batchPartialFit)(model, trainingData, 0.05);
154
- }
155
- // Calculate new ECE
156
- const newEce = (0, ece_1.calculateECE)(state.samples);
157
- return {
158
- ...state,
159
- weights: model.weights,
160
- thresholds: model.thresholds,
161
- ece: newEce,
162
- lastUpdated: new Date(),
163
- version: '2.1.0', // Bump version to indicate ML-learned weights
164
- };
165
- }
166
- /**
167
- * Force retraining (manual trigger).
168
- */
169
- function forceRetrain(repoPath) {
170
- const state = loadCalibration(repoPath);
171
- if (state.samples.length < 5) {
172
- return state;
173
- }
174
- const updatedState = retrain(state);
175
- saveCalibration(repoPath, updatedState);
176
- return updatedState;
177
- }
178
- function defaultCalibrationState() {
179
- return {
180
- samples: [],
181
- weights: ordered_logistic_1.DEFAULT_MODEL.weights,
182
- thresholds: ordered_logistic_1.DEFAULT_MODEL.thresholds,
183
- ece: 0,
184
- lastUpdated: new Date(),
185
- version: '2.0.0',
186
- };
187
- }
188
- //# sourceMappingURL=storage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/calibration/storage.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Intervene Command - Record what broke your spiral
3
- *
4
- * Usage:
5
- * vibe-check intervene <type> [options]
6
- * vibe-check intervene --list
7
- *
8
- * Examples:
9
- * vibe-check intervene TRACER_TEST
10
- * vibe-check intervene BREAK --pattern SECRETS_AUTH --duration 45
11
- * vibe-check intervene --list
12
- */
13
- import { Command } from 'commander';
14
- export declare function createInterveneCommand(): Command;
15
- //# sourceMappingURL=intervene.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"intervene.d.ts","sourceRoot":"","sources":["../../src/commands/intervene.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,wBAAgB,sBAAsB,IAAI,OAAO,CAehD"}