@boshu2/vibe-check 1.8.0 → 2.0.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 (379) hide show
  1. package/.claude/settings.local.json +1 -1
  2. package/CHANGELOG.md +10 -0
  3. package/CLAUDE.md +58 -0
  4. package/Makefile +43 -6
  5. package/README.md +80 -27
  6. package/bin/vibe-check.js +1 -1
  7. package/claude-progress.json +18 -0
  8. package/dist/analysis/cross-session-analysis.d.ts +1 -1
  9. package/dist/analysis/cross-session-analysis.d.ts.map +1 -1
  10. package/dist/analysis/cross-session-analysis.js +9 -18
  11. package/dist/analysis/cross-session-analysis.js.map +1 -1
  12. package/dist/analysis/index.d.ts +1 -1
  13. package/dist/analysis/index.d.ts.map +1 -1
  14. package/dist/analysis/index.js +1 -11
  15. package/dist/analysis/index.js.map +1 -1
  16. package/dist/analyzers/audit.d.ts +28 -0
  17. package/dist/analyzers/audit.d.ts.map +1 -0
  18. package/dist/analyzers/audit.js +86 -0
  19. package/dist/analyzers/audit.js.map +1 -0
  20. package/dist/analyzers/patterns.d.ts +1 -1
  21. package/dist/analyzers/patterns.d.ts.map +1 -1
  22. package/dist/analyzers/patterns.js +4 -10
  23. package/dist/analyzers/patterns.js.map +1 -1
  24. package/dist/analyzers/quality.d.ts +1 -1
  25. package/dist/analyzers/quality.d.ts.map +1 -1
  26. package/dist/analyzers/quality.js +5 -12
  27. package/dist/analyzers/quality.js.map +1 -1
  28. package/dist/analyzers/sessions.d.ts +1 -1
  29. package/dist/analyzers/sessions.d.ts.map +1 -1
  30. package/dist/analyzers/sessions.js +1 -4
  31. package/dist/analyzers/sessions.js.map +1 -1
  32. package/dist/cli.js +20 -20
  33. package/dist/cli.js.map +1 -1
  34. package/dist/commands/analyze.d.ts.map +1 -1
  35. package/dist/commands/analyze.js +114 -149
  36. package/dist/commands/analyze.js.map +1 -1
  37. package/dist/commands/audit.d.ts +3 -0
  38. package/dist/commands/audit.d.ts.map +1 -0
  39. package/dist/commands/audit.js +77 -0
  40. package/dist/commands/audit.js.map +1 -0
  41. package/dist/commands/cache.js +31 -70
  42. package/dist/commands/cache.js.map +1 -1
  43. package/dist/commands/dashboard.d.ts.map +1 -1
  44. package/dist/commands/dashboard.js +22 -58
  45. package/dist/commands/dashboard.js.map +1 -1
  46. package/dist/commands/forensics.d.ts +2 -2
  47. package/dist/commands/forensics.d.ts.map +1 -1
  48. package/dist/commands/forensics.js +41 -48
  49. package/dist/commands/forensics.js.map +1 -1
  50. package/dist/commands/index.d.ts +14 -13
  51. package/dist/commands/index.d.ts.map +1 -1
  52. package/dist/commands/index.js +14 -33
  53. package/dist/commands/index.js.map +1 -1
  54. package/dist/commands/init-hook.js +26 -32
  55. package/dist/commands/init-hook.js.map +1 -1
  56. package/dist/commands/insights.js +39 -45
  57. package/dist/commands/insights.js.map +1 -1
  58. package/dist/commands/pipeline.js +39 -78
  59. package/dist/commands/pipeline.js.map +1 -1
  60. package/dist/commands/profile.js +68 -74
  61. package/dist/commands/profile.js.map +1 -1
  62. package/dist/commands/session.d.ts +9 -0
  63. package/dist/commands/session.d.ts.map +1 -1
  64. package/dist/commands/session.js +134 -118
  65. package/dist/commands/session.js.map +1 -1
  66. package/dist/commands/sessions.d.ts +1 -1
  67. package/dist/commands/sessions.d.ts.map +1 -1
  68. package/dist/commands/sessions.js +42 -49
  69. package/dist/commands/sessions.js.map +1 -1
  70. package/dist/commands/start.js +22 -67
  71. package/dist/commands/start.js.map +1 -1
  72. package/dist/commands/timeline.js +74 -81
  73. package/dist/commands/timeline.js.map +1 -1
  74. package/dist/commands/watch.d.ts.map +1 -1
  75. package/dist/commands/watch.js +117 -47
  76. package/dist/commands/watch.js.map +1 -1
  77. package/dist/gamification/achievements.d.ts +1 -1
  78. package/dist/gamification/achievements.d.ts.map +1 -1
  79. package/dist/gamification/achievements.js +7 -13
  80. package/dist/gamification/achievements.js.map +1 -1
  81. package/dist/gamification/index.d.ts +8 -8
  82. package/dist/gamification/index.d.ts.map +1 -1
  83. package/dist/gamification/index.js +8 -28
  84. package/dist/gamification/index.js.map +1 -1
  85. package/dist/gamification/profile.d.ts +2 -2
  86. package/dist/gamification/profile.d.ts.map +1 -1
  87. package/dist/gamification/profile.js +21 -64
  88. package/dist/gamification/profile.js.map +1 -1
  89. package/dist/gamification/stats.d.ts +1 -1
  90. package/dist/gamification/stats.d.ts.map +1 -1
  91. package/dist/gamification/stats.js +4 -10
  92. package/dist/gamification/stats.js.map +1 -1
  93. package/dist/gamification/streaks.d.ts +1 -1
  94. package/dist/gamification/streaks.d.ts.map +1 -1
  95. package/dist/gamification/streaks.js +8 -18
  96. package/dist/gamification/streaks.js.map +1 -1
  97. package/dist/gamification/types.js +3 -6
  98. package/dist/gamification/types.js.map +1 -1
  99. package/dist/gamification/xp.d.ts +1 -1
  100. package/dist/gamification/xp.d.ts.map +1 -1
  101. package/dist/gamification/xp.js +29 -38
  102. package/dist/gamification/xp.js.map +1 -1
  103. package/dist/git.d.ts +1 -1
  104. package/dist/git.d.ts.map +1 -1
  105. package/dist/git.js +15 -27
  106. package/dist/git.js.map +1 -1
  107. package/dist/inner-loop/context-amnesia.d.ts +20 -0
  108. package/dist/inner-loop/context-amnesia.d.ts.map +1 -0
  109. package/dist/inner-loop/context-amnesia.js +246 -0
  110. package/dist/inner-loop/context-amnesia.js.map +1 -0
  111. package/dist/inner-loop/index.d.ts +39 -0
  112. package/dist/inner-loop/index.d.ts.map +1 -0
  113. package/dist/inner-loop/index.js +181 -0
  114. package/dist/inner-loop/index.js.map +1 -0
  115. package/dist/inner-loop/instruction-drift.d.ts +28 -0
  116. package/dist/inner-loop/instruction-drift.d.ts.map +1 -0
  117. package/dist/inner-loop/instruction-drift.js +255 -0
  118. package/dist/inner-loop/instruction-drift.js.map +1 -0
  119. package/dist/inner-loop/logging-only.d.ts +30 -0
  120. package/dist/inner-loop/logging-only.d.ts.map +1 -0
  121. package/dist/inner-loop/logging-only.js +256 -0
  122. package/dist/inner-loop/logging-only.js.map +1 -0
  123. package/dist/inner-loop/tests-passing-lie.d.ts +34 -0
  124. package/dist/inner-loop/tests-passing-lie.d.ts.map +1 -0
  125. package/dist/inner-loop/tests-passing-lie.js +208 -0
  126. package/dist/inner-loop/tests-passing-lie.js.map +1 -0
  127. package/dist/inner-loop/types.d.ts +111 -0
  128. package/dist/inner-loop/types.d.ts.map +1 -0
  129. package/dist/inner-loop/types.js +26 -0
  130. package/dist/inner-loop/types.js.map +1 -0
  131. package/dist/insights/generators.d.ts +4 -4
  132. package/dist/insights/generators.d.ts.map +1 -1
  133. package/dist/insights/generators.js +9 -20
  134. package/dist/insights/generators.js.map +1 -1
  135. package/dist/insights/index.d.ts +4 -4
  136. package/dist/insights/index.d.ts.map +1 -1
  137. package/dist/insights/index.js +23 -27
  138. package/dist/insights/index.js.map +1 -1
  139. package/dist/insights/types.js +1 -2
  140. package/dist/insights/types.js.map +1 -1
  141. package/dist/metrics/code-stability.d.ts +1 -1
  142. package/dist/metrics/code-stability.d.ts.map +1 -1
  143. package/dist/metrics/code-stability.js +1 -4
  144. package/dist/metrics/code-stability.js.map +1 -1
  145. package/dist/metrics/file-churn.d.ts +1 -1
  146. package/dist/metrics/file-churn.d.ts.map +1 -1
  147. package/dist/metrics/file-churn.js +1 -4
  148. package/dist/metrics/file-churn.js.map +1 -1
  149. package/dist/metrics/flow.d.ts +1 -1
  150. package/dist/metrics/flow.d.ts.map +1 -1
  151. package/dist/metrics/flow.js +1 -4
  152. package/dist/metrics/flow.js.map +1 -1
  153. package/dist/metrics/index.d.ts +2 -2
  154. package/dist/metrics/index.d.ts.map +1 -1
  155. package/dist/metrics/index.js +15 -20
  156. package/dist/metrics/index.js.map +1 -1
  157. package/dist/metrics/rework.d.ts +1 -1
  158. package/dist/metrics/rework.d.ts.map +1 -1
  159. package/dist/metrics/rework.js +1 -4
  160. package/dist/metrics/rework.js.map +1 -1
  161. package/dist/metrics/spirals.d.ts +1 -1
  162. package/dist/metrics/spirals.d.ts.map +1 -1
  163. package/dist/metrics/spirals.js +5 -10
  164. package/dist/metrics/spirals.js.map +1 -1
  165. package/dist/metrics/time-spiral.d.ts +1 -1
  166. package/dist/metrics/time-spiral.d.ts.map +1 -1
  167. package/dist/metrics/time-spiral.js +1 -4
  168. package/dist/metrics/time-spiral.js.map +1 -1
  169. package/dist/metrics/trust.d.ts +1 -1
  170. package/dist/metrics/trust.d.ts.map +1 -1
  171. package/dist/metrics/trust.js +3 -6
  172. package/dist/metrics/trust.js.map +1 -1
  173. package/dist/metrics/velocity-anomaly.d.ts +1 -1
  174. package/dist/metrics/velocity-anomaly.d.ts.map +1 -1
  175. package/dist/metrics/velocity-anomaly.js +3 -6
  176. package/dist/metrics/velocity-anomaly.js.map +1 -1
  177. package/dist/metrics/velocity.d.ts +1 -1
  178. package/dist/metrics/velocity.d.ts.map +1 -1
  179. package/dist/metrics/velocity.js +6 -10
  180. package/dist/metrics/velocity.js.map +1 -1
  181. package/dist/output/index.d.ts +4 -4
  182. package/dist/output/index.d.ts.map +1 -1
  183. package/dist/output/index.js +10 -18
  184. package/dist/output/index.js.map +1 -1
  185. package/dist/output/json.d.ts +1 -1
  186. package/dist/output/json.d.ts.map +1 -1
  187. package/dist/output/json.js +1 -4
  188. package/dist/output/json.js.map +1 -1
  189. package/dist/output/markdown.d.ts +1 -1
  190. package/dist/output/markdown.d.ts.map +1 -1
  191. package/dist/output/markdown.js +5 -8
  192. package/dist/output/markdown.js.map +1 -1
  193. package/dist/output/terminal.d.ts +1 -1
  194. package/dist/output/terminal.d.ts.map +1 -1
  195. package/dist/output/terminal.js +55 -62
  196. package/dist/output/terminal.js.map +1 -1
  197. package/dist/output/timeline-html.d.ts +1 -1
  198. package/dist/output/timeline-html.d.ts.map +1 -1
  199. package/dist/output/timeline-html.js +5 -8
  200. package/dist/output/timeline-html.js.map +1 -1
  201. package/dist/output/timeline-markdown.d.ts +1 -1
  202. package/dist/output/timeline-markdown.d.ts.map +1 -1
  203. package/dist/output/timeline-markdown.js +5 -8
  204. package/dist/output/timeline-markdown.js.map +1 -1
  205. package/dist/output/timeline.d.ts +1 -1
  206. package/dist/output/timeline.d.ts.map +1 -1
  207. package/dist/output/timeline.js +46 -52
  208. package/dist/output/timeline.js.map +1 -1
  209. package/dist/patterns/detour.d.ts +1 -1
  210. package/dist/patterns/detour.d.ts.map +1 -1
  211. package/dist/patterns/detour.js +1 -4
  212. package/dist/patterns/detour.js.map +1 -1
  213. package/dist/patterns/flow-state.d.ts +1 -1
  214. package/dist/patterns/flow-state.d.ts.map +1 -1
  215. package/dist/patterns/flow-state.js +1 -4
  216. package/dist/patterns/flow-state.js.map +1 -1
  217. package/dist/patterns/index.d.ts +7 -7
  218. package/dist/patterns/index.d.ts.map +1 -1
  219. package/dist/patterns/index.js +7 -21
  220. package/dist/patterns/index.js.map +1 -1
  221. package/dist/patterns/intervention-effectiveness.d.ts +1 -1
  222. package/dist/patterns/intervention-effectiveness.d.ts.map +1 -1
  223. package/dist/patterns/intervention-effectiveness.js +3 -8
  224. package/dist/patterns/intervention-effectiveness.js.map +1 -1
  225. package/dist/patterns/late-night.d.ts +1 -1
  226. package/dist/patterns/late-night.d.ts.map +1 -1
  227. package/dist/patterns/late-night.js +1 -4
  228. package/dist/patterns/late-night.js.map +1 -1
  229. package/dist/patterns/post-delete-sprint.d.ts +1 -1
  230. package/dist/patterns/post-delete-sprint.d.ts.map +1 -1
  231. package/dist/patterns/post-delete-sprint.js +1 -4
  232. package/dist/patterns/post-delete-sprint.js.map +1 -1
  233. package/dist/patterns/spiral-regression.d.ts +1 -1
  234. package/dist/patterns/spiral-regression.d.ts.map +1 -1
  235. package/dist/patterns/spiral-regression.js +3 -8
  236. package/dist/patterns/spiral-regression.js.map +1 -1
  237. package/dist/patterns/thrashing.d.ts +1 -1
  238. package/dist/patterns/thrashing.d.ts.map +1 -1
  239. package/dist/patterns/thrashing.js +3 -6
  240. package/dist/patterns/thrashing.js.map +1 -1
  241. package/dist/score/index.d.ts +3 -3
  242. package/dist/score/index.d.ts.map +1 -1
  243. package/dist/score/index.js +4 -10
  244. package/dist/score/index.js.map +1 -1
  245. package/dist/score/weights.js +2 -6
  246. package/dist/score/weights.js.map +1 -1
  247. package/dist/sessions/index.js +9 -51
  248. package/dist/sessions/index.js.map +1 -1
  249. package/dist/storage/atomic.js +10 -51
  250. package/dist/storage/atomic.js.map +1 -1
  251. package/dist/storage/commit-log.d.ts +1 -1
  252. package/dist/storage/commit-log.d.ts.map +1 -1
  253. package/dist/storage/commit-log.js +11 -51
  254. package/dist/storage/commit-log.js.map +1 -1
  255. package/dist/storage/index.d.ts +5 -5
  256. package/dist/storage/index.d.ts.map +1 -1
  257. package/dist/storage/index.js +5 -37
  258. package/dist/storage/index.js.map +1 -1
  259. package/dist/storage/schema.js +4 -9
  260. package/dist/storage/schema.js.map +1 -1
  261. package/dist/storage/spiral-history.js +14 -57
  262. package/dist/storage/spiral-history.js.map +1 -1
  263. package/dist/storage/timeline-store.d.ts +2 -2
  264. package/dist/storage/timeline-store.d.ts.map +1 -1
  265. package/dist/storage/timeline-store.js +17 -61
  266. package/dist/storage/timeline-store.js.map +1 -1
  267. package/dist/types.js +1 -2
  268. package/docs/ENHANCEMENT-PLAN.md +361 -0
  269. package/docs/FEATURES.md +340 -0
  270. package/feature-list.json +6 -0
  271. package/package.json +8 -7
  272. package/dist/calibration/ece.d.ts +0 -26
  273. package/dist/calibration/ece.d.ts.map +0 -1
  274. package/dist/calibration/ece.js +0 -93
  275. package/dist/calibration/ece.js.map +0 -1
  276. package/dist/calibration/index.d.ts +0 -3
  277. package/dist/calibration/index.d.ts.map +0 -1
  278. package/dist/calibration/index.js +0 -15
  279. package/dist/calibration/index.js.map +0 -1
  280. package/dist/calibration/storage.d.ts +0 -34
  281. package/dist/calibration/storage.d.ts.map +0 -1
  282. package/dist/calibration/storage.js +0 -188
  283. package/dist/calibration/storage.js.map +0 -1
  284. package/dist/commands/intervene.d.ts +0 -15
  285. package/dist/commands/intervene.d.ts.map +0 -1
  286. package/dist/commands/intervene.js +0 -183
  287. package/dist/commands/intervene.js.map +0 -1
  288. package/dist/commands/learn.d.ts +0 -3
  289. package/dist/commands/learn.d.ts.map +0 -1
  290. package/dist/commands/learn.js +0 -161
  291. package/dist/commands/learn.js.map +0 -1
  292. package/dist/commands/lesson.d.ts +0 -8
  293. package/dist/commands/lesson.d.ts.map +0 -1
  294. package/dist/commands/lesson.js +0 -206
  295. package/dist/commands/lesson.js.map +0 -1
  296. package/dist/commands/level.d.ts +0 -3
  297. package/dist/commands/level.d.ts.map +0 -1
  298. package/dist/commands/level.js +0 -277
  299. package/dist/commands/level.js.map +0 -1
  300. package/dist/gamification/badges.d.ts +0 -29
  301. package/dist/gamification/badges.d.ts.map +0 -1
  302. package/dist/gamification/badges.js +0 -114
  303. package/dist/gamification/badges.js.map +0 -1
  304. package/dist/gamification/challenges.d.ts +0 -42
  305. package/dist/gamification/challenges.d.ts.map +0 -1
  306. package/dist/gamification/challenges.js +0 -184
  307. package/dist/gamification/challenges.js.map +0 -1
  308. package/dist/gamification/hall-of-fame.d.ts +0 -17
  309. package/dist/gamification/hall-of-fame.d.ts.map +0 -1
  310. package/dist/gamification/hall-of-fame.js +0 -64
  311. package/dist/gamification/hall-of-fame.js.map +0 -1
  312. package/dist/gamification/intervention-memory.d.ts +0 -61
  313. package/dist/gamification/intervention-memory.d.ts.map +0 -1
  314. package/dist/gamification/intervention-memory.js +0 -229
  315. package/dist/gamification/intervention-memory.js.map +0 -1
  316. package/dist/gamification/leaderboards.d.ts +0 -49
  317. package/dist/gamification/leaderboards.d.ts.map +0 -1
  318. package/dist/gamification/leaderboards.js +0 -179
  319. package/dist/gamification/leaderboards.js.map +0 -1
  320. package/dist/gamification/pattern-memory.d.ts +0 -45
  321. package/dist/gamification/pattern-memory.d.ts.map +0 -1
  322. package/dist/gamification/pattern-memory.js +0 -188
  323. package/dist/gamification/pattern-memory.js.map +0 -1
  324. package/dist/gamification/share.d.ts +0 -29
  325. package/dist/gamification/share.d.ts.map +0 -1
  326. package/dist/gamification/share.js +0 -57
  327. package/dist/gamification/share.js.map +0 -1
  328. package/dist/learning/cadence.d.ts +0 -15
  329. package/dist/learning/cadence.d.ts.map +0 -1
  330. package/dist/learning/cadence.js +0 -130
  331. package/dist/learning/cadence.js.map +0 -1
  332. package/dist/learning/index.d.ts +0 -19
  333. package/dist/learning/index.d.ts.map +0 -1
  334. package/dist/learning/index.js +0 -35
  335. package/dist/learning/index.js.map +0 -1
  336. package/dist/learning/lessons-storage.d.ts +0 -48
  337. package/dist/learning/lessons-storage.d.ts.map +0 -1
  338. package/dist/learning/lessons-storage.js +0 -266
  339. package/dist/learning/lessons-storage.js.map +0 -1
  340. package/dist/learning/lessons-types.d.ts +0 -83
  341. package/dist/learning/lessons-types.d.ts.map +0 -1
  342. package/dist/learning/lessons-types.js +0 -15
  343. package/dist/learning/lessons-types.js.map +0 -1
  344. package/dist/learning/nudges.d.ts +0 -20
  345. package/dist/learning/nudges.d.ts.map +0 -1
  346. package/dist/learning/nudges.js +0 -68
  347. package/dist/learning/nudges.js.map +0 -1
  348. package/dist/learning/retrospective.d.ts +0 -27
  349. package/dist/learning/retrospective.d.ts.map +0 -1
  350. package/dist/learning/retrospective.js +0 -184
  351. package/dist/learning/retrospective.js.map +0 -1
  352. package/dist/learning/storage.d.ts +0 -44
  353. package/dist/learning/storage.d.ts.map +0 -1
  354. package/dist/learning/storage.js +0 -194
  355. package/dist/learning/storage.js.map +0 -1
  356. package/dist/learning/surfacing.d.ts +0 -36
  357. package/dist/learning/surfacing.d.ts.map +0 -1
  358. package/dist/learning/surfacing.js +0 -255
  359. package/dist/learning/surfacing.js.map +0 -1
  360. package/dist/learning/synthesis.d.ts +0 -17
  361. package/dist/learning/synthesis.d.ts.map +0 -1
  362. package/dist/learning/synthesis.js +0 -293
  363. package/dist/learning/synthesis.js.map +0 -1
  364. package/dist/learning/types.d.ts +0 -60
  365. package/dist/learning/types.d.ts.map +0 -1
  366. package/dist/learning/types.js +0 -17
  367. package/dist/learning/types.js.map +0 -1
  368. package/dist/recommend/index.d.ts +0 -3
  369. package/dist/recommend/index.d.ts.map +0 -1
  370. package/dist/recommend/index.js +0 -14
  371. package/dist/recommend/index.js.map +0 -1
  372. package/dist/recommend/ordered-logistic.d.ts +0 -49
  373. package/dist/recommend/ordered-logistic.d.ts.map +0 -1
  374. package/dist/recommend/ordered-logistic.js +0 -153
  375. package/dist/recommend/ordered-logistic.js.map +0 -1
  376. package/dist/recommend/questions.d.ts +0 -19
  377. package/dist/recommend/questions.d.ts.map +0 -1
  378. package/dist/recommend/questions.js +0 -73
  379. package/dist/recommend/questions.js.map +0 -1
package/dist/git.js CHANGED
@@ -1,19 +1,7 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getCommits = getCommits;
7
- exports.isGitRepo = isGitRepo;
8
- exports.getLatestCommitHash = getLatestCommitHash;
9
- exports.getCommitsSince = getCommitsSince;
10
- exports.commitExists = commitExists;
11
- exports.getFileStats = getFileStats;
12
- exports.getCommitStats = getCommitStats;
13
- const simple_git_1 = __importDefault(require("simple-git"));
1
+ import { simpleGit } from 'simple-git';
14
2
  const COMMIT_TYPES = ['feat', 'fix', 'docs', 'chore', 'refactor', 'test', 'style'];
15
- async function getCommits(repoPath, since, until) {
16
- const git = (0, simple_git_1.default)(repoPath);
3
+ export async function getCommits(repoPath, since, until) {
4
+ const git = simpleGit(repoPath);
17
5
  // Build options for git log
18
6
  const options = {};
19
7
  if (since) {
@@ -56,8 +44,8 @@ function parseCommit(entry) {
56
44
  author: author_name,
57
45
  };
58
46
  }
59
- async function isGitRepo(repoPath) {
60
- const git = (0, simple_git_1.default)(repoPath);
47
+ export async function isGitRepo(repoPath) {
48
+ const git = simpleGit(repoPath);
61
49
  try {
62
50
  await git.status();
63
51
  return true;
@@ -69,8 +57,8 @@ async function isGitRepo(repoPath) {
69
57
  /**
70
58
  * Get the latest commit hash in the repo
71
59
  */
72
- async function getLatestCommitHash(repoPath) {
73
- const git = (0, simple_git_1.default)(repoPath);
60
+ export async function getLatestCommitHash(repoPath) {
61
+ const git = simpleGit(repoPath);
74
62
  try {
75
63
  const log = await git.log({ n: 1 });
76
64
  return log.latest?.hash.substring(0, 7) || '';
@@ -82,8 +70,8 @@ async function getLatestCommitHash(repoPath) {
82
70
  /**
83
71
  * Get commits since a specific commit hash (for incremental sync)
84
72
  */
85
- async function getCommitsSince(repoPath, sinceHash) {
86
- const git = (0, simple_git_1.default)(repoPath);
73
+ export async function getCommitsSince(repoPath, sinceHash) {
74
+ const git = simpleGit(repoPath);
87
75
  try {
88
76
  // Get commits after the given hash
89
77
  const log = await git.log({ from: sinceHash, to: 'HEAD' });
@@ -97,8 +85,8 @@ async function getCommitsSince(repoPath, sinceHash) {
97
85
  /**
98
86
  * Check if a commit hash exists in the repo
99
87
  */
100
- async function commitExists(repoPath, hash) {
101
- const git = (0, simple_git_1.default)(repoPath);
88
+ export async function commitExists(repoPath, hash) {
89
+ const git = simpleGit(repoPath);
102
90
  try {
103
91
  await git.raw(['cat-file', '-t', hash]);
104
92
  return true;
@@ -110,8 +98,8 @@ async function commitExists(repoPath, hash) {
110
98
  /**
111
99
  * Get file-level statistics for semantic-free metrics.
112
100
  */
113
- async function getFileStats(repoPath, since, until) {
114
- const git = (0, simple_git_1.default)(repoPath);
101
+ export async function getFileStats(repoPath, since, until) {
102
+ const git = simpleGit(repoPath);
115
103
  const filesPerCommit = new Map();
116
104
  const lineStats = [];
117
105
  // Build options for git log
@@ -162,8 +150,8 @@ async function getFileStats(repoPath, since, until) {
162
150
  * Get per-commit statistics for pattern detection.
163
151
  * Returns a map of commit hash -> stats
164
152
  */
165
- async function getCommitStats(repoPath, since, until) {
166
- const git = (0, simple_git_1.default)(repoPath);
153
+ export async function getCommitStats(repoPath, since, until) {
154
+ const git = simpleGit(repoPath);
167
155
  const filesPerCommit = new Map();
168
156
  const lineStatsPerCommit = new Map();
169
157
  // Build options for git log
package/dist/git.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Context Amnesia Detector
3
+ *
4
+ * Detects when AI forgets previous instructions and:
5
+ * - Reverts intentional changes
6
+ * - Re-implements code that was just deleted
7
+ * - Repeats the same fix multiple times
8
+ *
9
+ * This is a key "Inner Loop Disaster" in vibe coding.
10
+ */
11
+ import { TimelineEvent } from '../types.js';
12
+ import { ContextAmnesiaResult, InnerLoopConfig } from './types.js';
13
+ /**
14
+ * Detect context amnesia patterns in commit history.
15
+ */
16
+ export declare function detectContextAmnesia(events: TimelineEvent[], filesPerCommit: Map<string, string[]>, lineStatsPerCommit: Map<string, {
17
+ additions: number;
18
+ deletions: number;
19
+ }>, config?: Partial<InnerLoopConfig>): ContextAmnesiaResult;
20
+ //# sourceMappingURL=context-amnesia.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-amnesia.d.ts","sourceRoot":"","sources":["../../src/inner-loop/context-amnesia.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,oBAAoB,EAEpB,eAAe,EAEhB,MAAM,YAAY,CAAC;AAapB;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EAAE,EACvB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACrC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,EACzE,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,oBAAoB,CAuDtB"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Context Amnesia Detector
3
+ *
4
+ * Detects when AI forgets previous instructions and:
5
+ * - Reverts intentional changes
6
+ * - Re-implements code that was just deleted
7
+ * - Repeats the same fix multiple times
8
+ *
9
+ * This is a key "Inner Loop Disaster" in vibe coding.
10
+ */
11
+ import { differenceInMinutes } from 'date-fns';
12
+ import { DEFAULT_INNER_LOOP_CONFIG, } from './types.js';
13
+ /**
14
+ * Detect context amnesia patterns in commit history.
15
+ */
16
+ export function detectContextAmnesia(events, filesPerCommit, lineStatsPerCommit, config = {}) {
17
+ const cfg = { ...DEFAULT_INNER_LOOP_CONFIG, ...config };
18
+ const incidents = [];
19
+ if (events.length < 2) {
20
+ return {
21
+ detected: false,
22
+ incidents: [],
23
+ totalIncidents: 0,
24
+ totalTimeWasted: 0,
25
+ message: 'Not enough commits to detect context amnesia',
26
+ };
27
+ }
28
+ // Build enriched commit data
29
+ const commits = events.map((e) => ({
30
+ hash: e.hash,
31
+ message: e.subject,
32
+ timestamp: e.timestamp,
33
+ scope: e.scope,
34
+ files: filesPerCommit.get(e.hash) || [],
35
+ additions: lineStatsPerCommit.get(e.hash)?.additions || 0,
36
+ deletions: lineStatsPerCommit.get(e.hash)?.deletions || 0,
37
+ type: e.type,
38
+ }));
39
+ // Sort by timestamp ascending
40
+ commits.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
41
+ // Detection strategies
42
+ const revertIncidents = detectReverts(commits, cfg);
43
+ const reimplementIncidents = detectReimplementation(commits, cfg);
44
+ const repeatedFixIncidents = detectRepeatedFixes(commits, cfg);
45
+ incidents.push(...revertIncidents, ...reimplementIncidents, ...repeatedFixIncidents);
46
+ // Calculate total time wasted
47
+ const totalTimeWasted = incidents.reduce((sum, i) => sum + i.gapMinutes, 0);
48
+ // Generate message
49
+ const detected = incidents.length > 0;
50
+ let message = '';
51
+ if (detected) {
52
+ const types = new Set(incidents.map((i) => i.type));
53
+ const typeStr = Array.from(types).join(', ');
54
+ message = `🧠 Context amnesia detected: ${incidents.length} incident${incidents.length > 1 ? 's' : ''} (${typeStr}). ~${totalTimeWasted}m potentially wasted.`;
55
+ }
56
+ return {
57
+ detected,
58
+ incidents: incidents.slice(0, 10), // Top 10
59
+ totalIncidents: incidents.length,
60
+ totalTimeWasted,
61
+ message,
62
+ };
63
+ }
64
+ /**
65
+ * Detect explicit reverts or undo patterns.
66
+ */
67
+ function detectReverts(commits, config) {
68
+ const incidents = [];
69
+ // Patterns that indicate a revert
70
+ const revertPatterns = [
71
+ /revert/i,
72
+ /undo/i,
73
+ /rollback/i,
74
+ /back\s*out/i,
75
+ /restore\s+previous/i,
76
+ ];
77
+ for (let i = 1; i < commits.length; i++) {
78
+ const commit = commits[i];
79
+ const isRevert = revertPatterns.some((p) => p.test(commit.message));
80
+ if (isRevert) {
81
+ // Find what was reverted (look back within window)
82
+ const windowStart = new Date(commit.timestamp.getTime() - config.amnesiaWindowMinutes * 60 * 1000);
83
+ // Find commits in window that touch same files
84
+ for (let j = i - 1; j >= 0; j--) {
85
+ const original = commits[j];
86
+ if (original.timestamp < windowStart)
87
+ break;
88
+ const sharedFiles = commit.files.filter((f) => original.files.includes(f));
89
+ if (sharedFiles.length > 0) {
90
+ const gap = differenceInMinutes(commit.timestamp, original.timestamp);
91
+ incidents.push({
92
+ type: 'revert',
93
+ originalCommit: {
94
+ hash: original.hash,
95
+ message: original.message,
96
+ timestamp: original.timestamp,
97
+ },
98
+ repeatCommit: {
99
+ hash: commit.hash,
100
+ message: commit.message,
101
+ timestamp: commit.timestamp,
102
+ },
103
+ scope: commit.scope || original.scope,
104
+ filesAffected: sharedFiles,
105
+ gapMinutes: gap,
106
+ description: `Reverted changes from ${gap}m ago`,
107
+ });
108
+ break; // Only count once per revert
109
+ }
110
+ }
111
+ }
112
+ }
113
+ return incidents;
114
+ }
115
+ /**
116
+ * Detect reimplementation: code deleted then similar code re-added.
117
+ */
118
+ function detectReimplementation(commits, config) {
119
+ const incidents = [];
120
+ // Track significant deletions
121
+ const deletions = [];
122
+ for (const commit of commits) {
123
+ // Significant deletion: more deletions than additions
124
+ if (commit.deletions > commit.additions && commit.deletions > 10) {
125
+ deletions.push({
126
+ commit,
127
+ files: commit.files,
128
+ linesDeleted: commit.deletions,
129
+ });
130
+ }
131
+ }
132
+ // Look for later commits that re-add similar content to same files
133
+ for (const deletion of deletions) {
134
+ const windowEnd = new Date(deletion.commit.timestamp.getTime() + config.amnesiaWindowMinutes * 60 * 1000);
135
+ for (const commit of commits) {
136
+ // Must be after the deletion
137
+ if (commit.timestamp <= deletion.commit.timestamp)
138
+ continue;
139
+ if (commit.timestamp > windowEnd)
140
+ continue;
141
+ // Must touch same files with additions
142
+ const sharedFiles = commit.files.filter((f) => deletion.files.includes(f));
143
+ if (sharedFiles.length === 0)
144
+ continue;
145
+ // Must have significant additions (reimplementing)
146
+ if (commit.additions < deletion.linesDeleted * 0.5)
147
+ continue;
148
+ const gap = differenceInMinutes(commit.timestamp, deletion.commit.timestamp);
149
+ // Check if this looks like reimplementation vs intentional refactor
150
+ // Refactors usually have "refactor" in message
151
+ if (/refactor/i.test(commit.message))
152
+ continue;
153
+ incidents.push({
154
+ type: 'reimplementation',
155
+ originalCommit: {
156
+ hash: deletion.commit.hash,
157
+ message: deletion.commit.message,
158
+ timestamp: deletion.commit.timestamp,
159
+ },
160
+ repeatCommit: {
161
+ hash: commit.hash,
162
+ message: commit.message,
163
+ timestamp: commit.timestamp,
164
+ },
165
+ scope: commit.scope || deletion.commit.scope,
166
+ filesAffected: sharedFiles,
167
+ gapMinutes: gap,
168
+ description: `Deleted ${deletion.linesDeleted} lines, then re-added ${commit.additions} lines ${gap}m later`,
169
+ });
170
+ }
171
+ }
172
+ return incidents;
173
+ }
174
+ /**
175
+ * Detect repeated fixes: same area fixed multiple times in short window.
176
+ */
177
+ function detectRepeatedFixes(commits, config) {
178
+ const incidents = [];
179
+ // Group fix commits by scope/files
180
+ const fixCommits = commits.filter((c) => c.type === 'fix');
181
+ // Track fixes per scope within time window
182
+ const scopeFixes = new Map();
183
+ for (const fix of fixCommits) {
184
+ const scope = fix.scope || fix.files[0] || 'unknown';
185
+ if (!scopeFixes.has(scope)) {
186
+ scopeFixes.set(scope, []);
187
+ }
188
+ scopeFixes.get(scope).push(fix);
189
+ }
190
+ // Find scopes with 3+ fixes in window (beyond normal spiral detection)
191
+ for (const [scope, fixes] of scopeFixes) {
192
+ if (fixes.length < 3)
193
+ continue;
194
+ // Check if messages are similar (forgot what was tried)
195
+ for (let i = 0; i < fixes.length - 1; i++) {
196
+ const current = fixes[i];
197
+ const next = fixes[i + 1];
198
+ const gap = differenceInMinutes(next.timestamp, current.timestamp);
199
+ if (gap > config.amnesiaWindowMinutes)
200
+ continue;
201
+ // Check message similarity
202
+ const similarity = calculateSimilarity(current.message, next.message);
203
+ if (similarity > config.similarityThreshold) {
204
+ incidents.push({
205
+ type: 'forgotten_change',
206
+ originalCommit: {
207
+ hash: current.hash,
208
+ message: current.message,
209
+ timestamp: current.timestamp,
210
+ },
211
+ repeatCommit: {
212
+ hash: next.hash,
213
+ message: next.message,
214
+ timestamp: next.timestamp,
215
+ },
216
+ scope,
217
+ filesAffected: [...new Set([...current.files, ...next.files])],
218
+ gapMinutes: gap,
219
+ description: `Similar fix attempted ${gap}m later (${Math.round(similarity * 100)}% similar)`,
220
+ });
221
+ }
222
+ }
223
+ }
224
+ return incidents;
225
+ }
226
+ /**
227
+ * Calculate similarity between two commit messages (Jaccard index).
228
+ */
229
+ function calculateSimilarity(msg1, msg2) {
230
+ const words1 = new Set(msg1
231
+ .toLowerCase()
232
+ .replace(/[^a-z0-9\s]/g, '')
233
+ .split(/\s+/)
234
+ .filter((w) => w.length > 2));
235
+ const words2 = new Set(msg2
236
+ .toLowerCase()
237
+ .replace(/[^a-z0-9\s]/g, '')
238
+ .split(/\s+/)
239
+ .filter((w) => w.length > 2));
240
+ if (words1.size === 0 || words2.size === 0)
241
+ return 0;
242
+ const intersection = new Set([...words1].filter((w) => words2.has(w)));
243
+ const union = new Set([...words1, ...words2]);
244
+ return intersection.size / union.size;
245
+ }
246
+ //# sourceMappingURL=context-amnesia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-amnesia.js","sourceRoot":"","sources":["../../src/inner-loop/context-amnesia.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Inner Loop Failure Pattern Detection
3
+ *
4
+ * This module detects the 4 "Inner Loop Disasters" from vibe coding:
5
+ * 1. "Tests Passing" Lie - AI claims success but code doesn't work
6
+ * 2. Context Amnesia - Forgets instructions, re-does work
7
+ * 3. Instruction Drift - "Improves" things not asked for
8
+ * 4. Debug Loop Spiral - Adds logging instead of fixing
9
+ */
10
+ import { TimelineEvent } from '../types.js';
11
+ import { InnerLoopAnalysis, InnerLoopConfig } from './types.js';
12
+ export * from './types.js';
13
+ export { detectTestsPassingLie } from './tests-passing-lie.js';
14
+ export { detectContextAmnesia } from './context-amnesia.js';
15
+ export { detectInstructionDrift, createSessionScope, inferSessionScope } from './instruction-drift.js';
16
+ export { detectLoggingOnlyCommits, analyzeCommitsForLogging } from './logging-only.js';
17
+ /**
18
+ * Run all inner loop failure pattern detectors.
19
+ */
20
+ export declare function analyzeInnerLoop(events: TimelineEvent[], filesPerCommit: Map<string, string[]>, lineStatsPerCommit: Map<string, {
21
+ additions: number;
22
+ deletions: number;
23
+ }>, config?: Partial<InnerLoopConfig>): InnerLoopAnalysis;
24
+ /**
25
+ * Quick check for inner loop issues (fast, no diff analysis).
26
+ */
27
+ export declare function quickInnerLoopCheck(events: TimelineEvent[], filesPerCommit: Map<string, string[]>, lineStatsPerCommit: Map<string, {
28
+ additions: number;
29
+ deletions: number;
30
+ }>): {
31
+ hasIssues: boolean;
32
+ issueCount: number;
33
+ topIssue: string | null;
34
+ };
35
+ /**
36
+ * Format inner loop analysis for terminal output.
37
+ */
38
+ export declare function formatInnerLoopAnalysis(analysis: InnerLoopAnalysis): string;
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inner-loop/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,iBAAiB,EACjB,eAAe,EAOhB,MAAM,YAAY,CAAC;AAOpB,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAEvF;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EAAE,EACvB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACrC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,EACzE,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,iBAAiB,CAqDnB;AA2FD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EAAE,EACvB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACrC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GACxE;IACD,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAcA;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,CAgD3E"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Inner Loop Failure Pattern Detection
3
+ *
4
+ * This module detects the 4 "Inner Loop Disasters" from vibe coding:
5
+ * 1. "Tests Passing" Lie - AI claims success but code doesn't work
6
+ * 2. Context Amnesia - Forgets instructions, re-does work
7
+ * 3. Instruction Drift - "Improves" things not asked for
8
+ * 4. Debug Loop Spiral - Adds logging instead of fixing
9
+ */
10
+ import { DEFAULT_INNER_LOOP_CONFIG, } from './types.js';
11
+ import { detectTestsPassingLie } from './tests-passing-lie.js';
12
+ import { detectContextAmnesia } from './context-amnesia.js';
13
+ import { detectInstructionDrift } from './instruction-drift.js';
14
+ import { detectLoggingOnlyCommits } from './logging-only.js';
15
+ // Re-export types
16
+ export * from './types.js';
17
+ // Re-export individual detectors
18
+ export { detectTestsPassingLie } from './tests-passing-lie.js';
19
+ export { detectContextAmnesia } from './context-amnesia.js';
20
+ export { detectInstructionDrift, createSessionScope, inferSessionScope } from './instruction-drift.js';
21
+ export { detectLoggingOnlyCommits, analyzeCommitsForLogging } from './logging-only.js';
22
+ /**
23
+ * Run all inner loop failure pattern detectors.
24
+ */
25
+ export function analyzeInnerLoop(events, filesPerCommit, lineStatsPerCommit, config = {}) {
26
+ const cfg = { ...DEFAULT_INNER_LOOP_CONFIG, ...config };
27
+ // Run all detectors
28
+ const testsPassingLie = detectTestsPassingLie(events, filesPerCommit, cfg);
29
+ const contextAmnesia = detectContextAmnesia(events, filesPerCommit, lineStatsPerCommit, cfg);
30
+ const instructionDrift = detectInstructionDrift(events, filesPerCommit, cfg);
31
+ const loggingOnly = detectLoggingOnlyCommits(events, cfg);
32
+ // Calculate summary
33
+ const totalIssues = testsPassingLie.totalLies +
34
+ contextAmnesia.totalIncidents +
35
+ instructionDrift.totalDriftCommits +
36
+ (loggingOnly.detected ? 1 : 0);
37
+ // Critical: Tests Passing Lie, high Context Amnesia
38
+ const criticalIssues = testsPassingLie.totalLies + (contextAmnesia.totalIncidents >= 3 ? 1 : 0);
39
+ // Warning: Instruction Drift, Debug Loop
40
+ const warningIssues = (instructionDrift.detected ? 1 : 0) + (loggingOnly.detected ? 1 : 0);
41
+ // Determine overall health
42
+ let overallHealth = 'healthy';
43
+ if (criticalIssues > 0) {
44
+ overallHealth = 'critical';
45
+ }
46
+ else if (warningIssues > 0 || contextAmnesia.totalIncidents > 0) {
47
+ overallHealth = 'warning';
48
+ }
49
+ // Generate recommendations
50
+ const recommendations = generateRecommendations(testsPassingLie, contextAmnesia, instructionDrift, loggingOnly);
51
+ return {
52
+ testsPassingLie,
53
+ contextAmnesia,
54
+ instructionDrift,
55
+ loggingOnly,
56
+ summary: {
57
+ totalIssuesDetected: totalIssues,
58
+ criticalIssues,
59
+ warningIssues,
60
+ overallHealth,
61
+ },
62
+ recommendations,
63
+ };
64
+ }
65
+ /**
66
+ * Generate recommendations based on detected patterns.
67
+ */
68
+ function generateRecommendations(testsPassingLie, contextAmnesia, instructionDrift, loggingOnly) {
69
+ const recommendations = [];
70
+ // Tests Passing Lie recommendations
71
+ if (testsPassingLie.detected) {
72
+ recommendations.push('🤥 STOP: AI claimed success but code needed fixes. Verify builds/tests actually pass before proceeding.');
73
+ recommendations.push('Run `npm test` or your test command after each "fix" commit to verify.');
74
+ }
75
+ // Context Amnesia recommendations
76
+ if (contextAmnesia.detected) {
77
+ if (contextAmnesia.incidents.some((i) => i.type === 'revert')) {
78
+ recommendations.push('🧠 AI is reverting previous work. Check if changes were intentional before accepting reverts.');
79
+ }
80
+ if (contextAmnesia.incidents.some((i) => i.type === 'reimplementation')) {
81
+ recommendations.push('🧠 AI deleted then re-added code. This suggests context loss - try breaking task into smaller pieces.');
82
+ }
83
+ if (contextAmnesia.incidents.some((i) => i.type === 'forgotten_change')) {
84
+ recommendations.push('🧠 Similar fixes being attempted repeatedly. Consider restarting with clear instructions.');
85
+ }
86
+ }
87
+ // Instruction Drift recommendations
88
+ if (instructionDrift.detected) {
89
+ if (instructionDrift.drifts.some((d) => d.driftType === 'scope_creep')) {
90
+ recommendations.push('🎯 AI changed files outside your stated scope. Be explicit: "ONLY modify src/feature.ts"');
91
+ }
92
+ if (instructionDrift.drifts.some((d) => d.driftType === 'unrequested_refactor')) {
93
+ recommendations.push('🎯 AI did unrequested refactoring. Add: "Do NOT refactor or clean up other code"');
94
+ }
95
+ if (instructionDrift.drifts.some((d) => d.driftType === 'unrequested_improvement')) {
96
+ recommendations.push('🎯 AI made unrequested "improvements". Be explicit about what NOT to do.');
97
+ }
98
+ }
99
+ // Debug Loop recommendations
100
+ if (loggingOnly.detected) {
101
+ recommendations.push('🔍 Debug loop detected: Multiple logging commits without fixes. STOP and think about the root cause.');
102
+ recommendations.push('Try: 1) Read error messages carefully, 2) Check the docs, 3) Simplify to minimal reproduction');
103
+ if (loggingOnly.consecutiveLoggingCount >= 5) {
104
+ recommendations.push('⚠️ EMERGENCY: 5+ consecutive debug commits. Consider: git stash, take a break, start fresh.');
105
+ }
106
+ }
107
+ // General emergency recommendation
108
+ const totalCritical = testsPassingLie.totalLies +
109
+ contextAmnesia.totalIncidents +
110
+ (loggingOnly.consecutiveLoggingCount >= 3 ? 1 : 0);
111
+ if (totalCritical >= 3) {
112
+ recommendations.unshift('🚨 EMERGENCY PROTOCOL: Multiple inner loop failures detected. STOP → git status → backup → start simple');
113
+ }
114
+ return recommendations;
115
+ }
116
+ /**
117
+ * Quick check for inner loop issues (fast, no diff analysis).
118
+ */
119
+ export function quickInnerLoopCheck(events, filesPerCommit, lineStatsPerCommit) {
120
+ const analysis = analyzeInnerLoop(events, filesPerCommit, lineStatsPerCommit);
121
+ const issues = [];
122
+ if (analysis.testsPassingLie.detected)
123
+ issues.push('tests-passing-lie');
124
+ if (analysis.contextAmnesia.detected)
125
+ issues.push('context-amnesia');
126
+ if (analysis.instructionDrift.detected)
127
+ issues.push('instruction-drift');
128
+ if (analysis.loggingOnly.detected)
129
+ issues.push('debug-loop');
130
+ return {
131
+ hasIssues: issues.length > 0,
132
+ issueCount: issues.length,
133
+ topIssue: issues[0] || null,
134
+ };
135
+ }
136
+ /**
137
+ * Format inner loop analysis for terminal output.
138
+ */
139
+ export function formatInnerLoopAnalysis(analysis) {
140
+ const lines = [];
141
+ // Header
142
+ const healthEmoji = analysis.summary.overallHealth === 'critical'
143
+ ? '🚨'
144
+ : analysis.summary.overallHealth === 'warning'
145
+ ? '⚠️'
146
+ : '✅';
147
+ lines.push(`\n${healthEmoji} Inner Loop Health: ${analysis.summary.overallHealth.toUpperCase()}`);
148
+ lines.push('─'.repeat(50));
149
+ // Individual pattern results
150
+ if (analysis.testsPassingLie.detected) {
151
+ lines.push(`🤥 Tests Passing Lie: ${analysis.testsPassingLie.message}`);
152
+ }
153
+ if (analysis.contextAmnesia.detected) {
154
+ lines.push(`🧠 Context Amnesia: ${analysis.contextAmnesia.message}`);
155
+ }
156
+ if (analysis.instructionDrift.detected) {
157
+ lines.push(`🎯 Instruction Drift: ${analysis.instructionDrift.message}`);
158
+ }
159
+ if (analysis.loggingOnly.detected) {
160
+ lines.push(`🔍 Debug Loop: ${analysis.loggingOnly.message}`);
161
+ }
162
+ // Summary
163
+ if (analysis.summary.totalIssuesDetected > 0) {
164
+ lines.push('');
165
+ lines.push(`Total: ${analysis.summary.totalIssuesDetected} issue${analysis.summary.totalIssuesDetected > 1 ? 's' : ''} ` +
166
+ `(${analysis.summary.criticalIssues} critical, ${analysis.summary.warningIssues} warning)`);
167
+ }
168
+ else {
169
+ lines.push('No inner loop issues detected.');
170
+ }
171
+ // Recommendations
172
+ if (analysis.recommendations.length > 0) {
173
+ lines.push('');
174
+ lines.push('Recommendations:');
175
+ for (const rec of analysis.recommendations.slice(0, 5)) {
176
+ lines.push(` ${rec}`);
177
+ }
178
+ }
179
+ return lines.join('\n');
180
+ }
181
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/inner-loop/index.ts"],"names":[],"mappings":"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"}