limn-review 0.1.123

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 (474) hide show
  1. package/LICENSE +110 -0
  2. package/README.md +133 -0
  3. package/dist/ai/runtime.js +535 -0
  4. package/dist/api/plugins/auth.js +169 -0
  5. package/dist/api/plugins/error-handler.js +114 -0
  6. package/dist/api/plugins/rate-limit.js +855 -0
  7. package/dist/api/plugins/security.js +321 -0
  8. package/dist/api/routes/activity.js +103 -0
  9. package/dist/api/routes/ai-runtime.js +67 -0
  10. package/dist/api/routes/auth.js +194 -0
  11. package/dist/api/routes/billing.js +209 -0
  12. package/dist/api/routes/bot-triage.js +1289 -0
  13. package/dist/api/routes/conflicts.js +730 -0
  14. package/dist/api/routes/contact.js +318 -0
  15. package/dist/api/routes/daily-brief.js +58 -0
  16. package/dist/api/routes/flow.js +71 -0
  17. package/dist/api/routes/health.js +7 -0
  18. package/dist/api/routes/insights.js +200 -0
  19. package/dist/api/routes/me.js +458 -0
  20. package/dist/api/routes/mentions.js +22 -0
  21. package/dist/api/routes/mergers.js +8 -0
  22. package/dist/api/routes/ml-labels.js +109 -0
  23. package/dist/api/routes/open-prs.js +35 -0
  24. package/dist/api/routes/prs.js +1633 -0
  25. package/dist/api/routes/reactions.js +217 -0
  26. package/dist/api/routes/repos.js +563 -0
  27. package/dist/api/routes/search.js +41 -0
  28. package/dist/api/routes/threads.js +118 -0
  29. package/dist/api/routes/timeline.js +150 -0
  30. package/dist/api/routes/users.js +67 -0
  31. package/dist/api/routes/webhooks.js +181 -0
  32. package/dist/api/routes/workspaces.js +322 -0
  33. package/dist/app.js +274 -0
  34. package/dist/ascii.js +19 -0
  35. package/dist/auth/account.js +482 -0
  36. package/dist/auth/crypto.js +46 -0
  37. package/dist/bot-triage/resolve.js +59 -0
  38. package/dist/cli.js +388 -0
  39. package/dist/coding/activity.js +80 -0
  40. package/dist/coding/agent.js +288 -0
  41. package/dist/coding/ai-fix/auto-fix.js +212 -0
  42. package/dist/coding/ai-fix/manager.js +370 -0
  43. package/dist/coding/ai-fix/persist.js +213 -0
  44. package/dist/coding/ai-fix/pr-context.js +58 -0
  45. package/dist/coding/ai-fix/prompts.js +138 -0
  46. package/dist/coding/ai-fix/review-seed.js +357 -0
  47. package/dist/coding/ai-fix/routes.js +425 -0
  48. package/dist/coding/git-ops.js +321 -0
  49. package/dist/coding/git.js +184 -0
  50. package/dist/coding/merge.js +262 -0
  51. package/dist/coding/safe-path.js +75 -0
  52. package/dist/coding/schema.js +43 -0
  53. package/dist/config.js +648 -0
  54. package/dist/conflict/diff.js +304 -0
  55. package/dist/conflict/git.js +118 -0
  56. package/dist/conflict/hash.js +73 -0
  57. package/dist/conflict/janitor.js +218 -0
  58. package/dist/conflict/land.js +675 -0
  59. package/dist/conflict/model-types.js +2 -0
  60. package/dist/conflict/model.js +1081 -0
  61. package/dist/conflict/parse.js +142 -0
  62. package/dist/conflict/seam.js +136 -0
  63. package/dist/conflict/session.js +532 -0
  64. package/dist/conflict/suggestion.js +398 -0
  65. package/dist/conflict/tokens.js +72 -0
  66. package/dist/data-dir.js +112 -0
  67. package/dist/db/actor-lanes.js +213 -0
  68. package/dist/db/automation-ids.js +97 -0
  69. package/dist/db/automation-output.js +349 -0
  70. package/dist/db/blast-radius-query.js +36 -0
  71. package/dist/db/blast-radius.js +226 -0
  72. package/dist/db/bot-dormancy.js +115 -0
  73. package/dist/db/bot-overlap.js +579 -0
  74. package/dist/db/bot-volume.js +722 -0
  75. package/dist/db/bot-window.js +35 -0
  76. package/dist/db/branch-queries.js +310 -0
  77. package/dist/db/change-shape.js +243 -0
  78. package/dist/db/changepoint.js +75 -0
  79. package/dist/db/cleanup.js +36 -0
  80. package/dist/db/client.js +102 -0
  81. package/dist/db/code-loc.js +388 -0
  82. package/dist/db/credits.js +79 -0
  83. package/dist/db/daily-brief.js +406 -0
  84. package/dist/db/dependency-cards.js +145 -0
  85. package/dist/db/erase-account.js +255 -0
  86. package/dist/db/export-account.js +189 -0
  87. package/dist/db/failing-checks.js +124 -0
  88. package/dist/db/file-coupling.js +197 -0
  89. package/dist/db/flow-detail.js +661 -0
  90. package/dist/db/flow-pointers.js +197 -0
  91. package/dist/db/flow-settings.js +67 -0
  92. package/dist/db/forecast.js +114 -0
  93. package/dist/db/line-overlap.js +81 -0
  94. package/dist/db/merge-queue.js +189 -0
  95. package/dist/db/migrate.js +17 -0
  96. package/dist/db/migrations/0000_purple_ben_grimm.sql +155 -0
  97. package/dist/db/migrations/0001_colorful_ozymandias.sql +31 -0
  98. package/dist/db/migrations/0002_famous_sersi.sql +9 -0
  99. package/dist/db/migrations/0003_clever_shinobi_shaw.sql +3 -0
  100. package/dist/db/migrations/0004_pale_scalphunter.sql +1 -0
  101. package/dist/db/migrations/0005_daffy_guardian.sql +2 -0
  102. package/dist/db/migrations/0006_cute_violations.sql +45 -0
  103. package/dist/db/migrations/0007_dark_anthem.sql +2 -0
  104. package/dist/db/migrations/0008_multitenant_accounts.sql +44 -0
  105. package/dist/db/migrations/0009_lean_bodies.sql +13 -0
  106. package/dist/db/migrations/0010_lean_bodies_nullable.sql +56 -0
  107. package/dist/db/migrations/0011_pr_diff_size.sql +10 -0
  108. package/dist/db/migrations/0012_findings_included_default.sql +7 -0
  109. package/dist/db/migrations/0013_review_routing.sql +9 -0
  110. package/dist/db/migrations/0014_account_last_active.sql +6 -0
  111. package/dist/db/migrations/0015_repos_inbox_watch.sql +9 -0
  112. package/dist/db/migrations/0016_repo_viewer_permission.sql +7 -0
  113. package/dist/db/migrations/0017_account_display_name.sql +7 -0
  114. package/dist/db/migrations/0018_finding_comment_kind.sql +7 -0
  115. package/dist/db/migrations/0019_finding_file_in_diff.sql +7 -0
  116. package/dist/db/migrations/0020_claude_review_cost_telemetry.sql +11 -0
  117. package/dist/db/migrations/0021_account_feed_last_seen.sql +7 -0
  118. package/dist/db/migrations/0022_ci_status_events.sql +21 -0
  119. package/dist/db/migrations/0023_ai_usage.sql +21 -0
  120. package/dist/db/migrations/0024_pr_head_ref_name.sql +6 -0
  121. package/dist/db/migrations/0025_account_billing.sql +7 -0
  122. package/dist/db/migrations/0026_ai_credit_allowance.sql +5 -0
  123. package/dist/db/migrations/0027_user_github_type.sql +6 -0
  124. package/dist/db/migrations/0028_bot_review_classification.sql +21 -0
  125. package/dist/db/migrations/0029_bot_mute_rules.sql +19 -0
  126. package/dist/db/migrations/0030_teams.sql +32 -0
  127. package/dist/db/migrations/0031_events_pr_idx.sql +7 -0
  128. package/dist/db/migrations/0032_benchmark_contributions.sql +29 -0
  129. package/dist/db/migrations/0033_thread_addressed_confidence.sql +9 -0
  130. package/dist/db/migrations/0034_thread_resolved_at.sql +6 -0
  131. package/dist/db/migrations/0035_pr_first_review_requested_at.sql +5 -0
  132. package/dist/db/migrations/0036_search_index.sql +25 -0
  133. package/dist/db/migrations/0037_author_indexes.sql +15 -0
  134. package/dist/db/migrations/0038_auto_merge_requests.sql +37 -0
  135. package/dist/db/migrations/0039_branch_status.sql +44 -0
  136. package/dist/db/migrations/0040_pr_review_decision.sql +10 -0
  137. package/dist/db/migrations/0041_branch_commit_detail.sql +38 -0
  138. package/dist/db/migrations/0042_repo_reviewers.sql +176 -0
  139. package/dist/db/migrations/0043_account_reviewers.sql +131 -0
  140. package/dist/db/migrations/0044_workspaces.sql +138 -0
  141. package/dist/db/migrations/0045_workspace_reviewers.sql +180 -0
  142. package/dist/db/migrations/0046_drop_inbox_watch.sql +25 -0
  143. package/dist/db/migrations/0047_ml_comment_labels.sql +40 -0
  144. package/dist/db/migrations/0048_ml_vendor_severity.sql +31 -0
  145. package/dist/db/migrations/0049_seat_pricing_repo_description.sql +21 -0
  146. package/dist/db/migrations/0050_users_app_slug.sql +12 -0
  147. package/dist/db/migrations/0051_auto_merge_queue.sql +17 -0
  148. package/dist/db/migrations/0052_trunk_ci_status_events.sql +43 -0
  149. package/dist/db/migrations/0053_automation_roles.sql +79 -0
  150. package/dist/db/migrations/0054_automation_vendor_kinds.sql +514 -0
  151. package/dist/db/migrations/0055_auto_merge_phase.sql +12 -0
  152. package/dist/db/migrations/0056_pr_mentions.sql +22 -0
  153. package/dist/db/migrations/0057_large_pr_threshold.sql +14 -0
  154. package/dist/db/migrations/0058_pending_mute.sql +53 -0
  155. package/dist/db/migrations/0059_merge_queue_state.sql +33 -0
  156. package/dist/db/migrations/0060_drop_my_turn_dismissals.sql +33 -0
  157. package/dist/db/migrations/0061_auto_merge_durable_anchors.sql +27 -0
  158. package/dist/db/migrations/0062_blast_radius_config.sql +21 -0
  159. package/dist/db/migrations/0063_repo_file_coupling.sql +33 -0
  160. package/dist/db/migrations/0064_pr_content_kind.sql +21 -0
  161. package/dist/db/migrations/0065_workspace_flow_settings.sql +13 -0
  162. package/dist/db/migrations/0066_review_request_events.sql +31 -0
  163. package/dist/db/migrations/0067_pr_security_signals.sql +86 -0
  164. package/dist/db/migrations/0068_my_turn_settings.sql +18 -0
  165. package/dist/db/migrations/0069_my_turn_dismissals.sql +41 -0
  166. package/dist/db/migrations/0070_claude_review_follow_up_ticket.sql +22 -0
  167. package/dist/db/migrations/0071_claude_review_trigger.sql +11 -0
  168. package/dist/db/migrations/0072_commit_message_headline.sql +13 -0
  169. package/dist/db/migrations/0073_claude_review_chat.sql +31 -0
  170. package/dist/db/migrations/0074_adopt_agentic_tables.sql +98 -0
  171. package/dist/db/migrations/0075_review_lens_drop_learnings.sql +15 -0
  172. package/dist/db/migrations/0076_claude_review_threads.sql +17 -0
  173. package/dist/db/migrations/0077_claude_review_ci_failures.sql +10 -0
  174. package/dist/db/migrations/0078_ai_fix_change_report.sql +17 -0
  175. package/dist/db/migrations/0079_claude_finding_story.sql +16 -0
  176. package/dist/db/migrations/meta/0000_snapshot.json +1116 -0
  177. package/dist/db/migrations/meta/0001_snapshot.json +1321 -0
  178. package/dist/db/migrations/meta/0002_snapshot.json +1375 -0
  179. package/dist/db/migrations/meta/0003_snapshot.json +1396 -0
  180. package/dist/db/migrations/meta/0004_snapshot.json +1416 -0
  181. package/dist/db/migrations/meta/0005_snapshot.json +1430 -0
  182. package/dist/db/migrations/meta/0006_snapshot.json +1745 -0
  183. package/dist/db/migrations/meta/0007_snapshot.json +1759 -0
  184. package/dist/db/migrations/meta/_journal.json +566 -0
  185. package/dist/db/migrations-pg/0000_tired_alex_power.sql +268 -0
  186. package/dist/db/migrations-pg/0001_dizzy_mockingbird.sql +3 -0
  187. package/dist/db/migrations-pg/0002_glorious_ikaris.sql +4 -0
  188. package/dist/db/migrations-pg/0003_melted_secret_warriors.sql +2 -0
  189. package/dist/db/migrations-pg/0004_numerous_triton.sql +1 -0
  190. package/dist/db/migrations-pg/0005_thick_blockbuster.sql +2 -0
  191. package/dist/db/migrations-pg/0006_majestic_dracula.sql +1 -0
  192. package/dist/db/migrations-pg/0007_same_human_torch.sql +2 -0
  193. package/dist/db/migrations-pg/0008_slimy_toxin.sql +1 -0
  194. package/dist/db/migrations-pg/0009_fuzzy_jubilee.sql +4 -0
  195. package/dist/db/migrations-pg/0010_late_hammerhead.sql +1 -0
  196. package/dist/db/migrations-pg/0011_happy_leech.sql +16 -0
  197. package/dist/db/migrations-pg/0012_woozy_captain_midlands.sql +16 -0
  198. package/dist/db/migrations-pg/0013_yielding_nicolaos.sql +1 -0
  199. package/dist/db/migrations-pg/0014_wakeful_bill_hollister.sql +2 -0
  200. package/dist/db/migrations-pg/0015_aspiring_black_tom.sql +1 -0
  201. package/dist/db/migrations-pg/0016_cute_ghost_rider.sql +30 -0
  202. package/dist/db/migrations-pg/0017_far_changeling.sql +24 -0
  203. package/dist/db/migrations-pg/0018_fancy_miss_america.sql +1 -0
  204. package/dist/db/migrations-pg/0019_benchmark_contributions.sql +22 -0
  205. package/dist/db/migrations-pg/0020_majestic_edwin_jarvis.sql +3 -0
  206. package/dist/db/migrations-pg/0021_green_salo.sql +1 -0
  207. package/dist/db/migrations-pg/0022_wise_baron_strucker.sql +1 -0
  208. package/dist/db/migrations-pg/0023_search_index.sql +19 -0
  209. package/dist/db/migrations-pg/0024_author_indexes.sql +9 -0
  210. package/dist/db/migrations-pg/0025_auto_merge_requests.sql +26 -0
  211. package/dist/db/migrations-pg/0026_branch_status.sql +32 -0
  212. package/dist/db/migrations-pg/0027_pr_review_decision.sql +5 -0
  213. package/dist/db/migrations-pg/0028_branch_commit_detail.sql +9 -0
  214. package/dist/db/migrations-pg/0029_repo_reviewers.sql +127 -0
  215. package/dist/db/migrations-pg/0030_account_reviewers.sql +77 -0
  216. package/dist/db/migrations-pg/0031_workspaces.sql +131 -0
  217. package/dist/db/migrations-pg/0032_workspace_reviewers.sql +165 -0
  218. package/dist/db/migrations-pg/0033_drop_inbox_watch.sql +14 -0
  219. package/dist/db/migrations-pg/0034_ml_comment_labels.sql +33 -0
  220. package/dist/db/migrations-pg/0035_ml_vendor_severity.sql +16 -0
  221. package/dist/db/migrations-pg/0036_seat_pricing_repo_description.sql +12 -0
  222. package/dist/db/migrations-pg/0037_users_app_slug.sql +9 -0
  223. package/dist/db/migrations-pg/0038_auto_merge_queue.sql +10 -0
  224. package/dist/db/migrations-pg/0039_trunk_ci_status_events.sql +27 -0
  225. package/dist/db/migrations-pg/0040_automation_roles.sql +63 -0
  226. package/dist/db/migrations-pg/0041_automation_vendor_kinds.sql +488 -0
  227. package/dist/db/migrations-pg/0042_auto_merge_phase.sql +8 -0
  228. package/dist/db/migrations-pg/0043_pr_mentions.sql +19 -0
  229. package/dist/db/migrations-pg/0044_large_pr_threshold.sql +6 -0
  230. package/dist/db/migrations-pg/0045_pending_mute.sql +26 -0
  231. package/dist/db/migrations-pg/0046_merge_queue_state.sql +18 -0
  232. package/dist/db/migrations-pg/0047_drop_my_turn_dismissals.sql +21 -0
  233. package/dist/db/migrations-pg/0048_auto_merge_durable_anchors.sql +27 -0
  234. package/dist/db/migrations-pg/0049_blast_radius_config.sql +8 -0
  235. package/dist/db/migrations-pg/0050_repo_file_coupling.sql +13 -0
  236. package/dist/db/migrations-pg/0051_pr_content_kind.sql +6 -0
  237. package/dist/db/migrations-pg/0052_workspace_flow_settings.sql +4 -0
  238. package/dist/db/migrations-pg/0053_review_request_events.sql +18 -0
  239. package/dist/db/migrations-pg/0054_pr_security_signals.sql +59 -0
  240. package/dist/db/migrations-pg/0055_my_turn_settings.sql +6 -0
  241. package/dist/db/migrations-pg/0056_my_turn_dismissals.sql +21 -0
  242. package/dist/db/migrations-pg/0057_claude_review_follow_up_ticket.sql +8 -0
  243. package/dist/db/migrations-pg/0058_claude_review_trigger.sql +4 -0
  244. package/dist/db/migrations-pg/0059_commit_message_headline.sql +3 -0
  245. package/dist/db/migrations-pg/0060_claude_review_chat.sql +24 -0
  246. package/dist/db/migrations-pg/0061_adopt_agentic_tables.sql +79 -0
  247. package/dist/db/migrations-pg/0062_review_lens_drop_learnings.sql +5 -0
  248. package/dist/db/migrations-pg/0063_claude_review_threads.sql +7 -0
  249. package/dist/db/migrations-pg/0064_claude_review_ci_failures.sql +4 -0
  250. package/dist/db/migrations-pg/0065_ai_fix_change_report.sql +9 -0
  251. package/dist/db/migrations-pg/0066_claude_finding_story.sql +7 -0
  252. package/dist/db/migrations-pg/meta/0000_snapshot.json +2137 -0
  253. package/dist/db/migrations-pg/meta/0001_snapshot.json +2143 -0
  254. package/dist/db/migrations-pg/meta/0002_snapshot.json +2170 -0
  255. package/dist/db/migrations-pg/meta/0003_snapshot.json +2182 -0
  256. package/dist/db/migrations-pg/meta/0004_snapshot.json +2188 -0
  257. package/dist/db/migrations-pg/meta/0005_snapshot.json +2201 -0
  258. package/dist/db/migrations-pg/meta/0006_snapshot.json +2207 -0
  259. package/dist/db/migrations-pg/meta/0007_snapshot.json +2219 -0
  260. package/dist/db/migrations-pg/meta/0008_snapshot.json +2226 -0
  261. package/dist/db/migrations-pg/meta/0009_snapshot.json +2250 -0
  262. package/dist/db/migrations-pg/meta/0010_snapshot.json +2256 -0
  263. package/dist/db/migrations-pg/meta/0011_snapshot.json +2412 -0
  264. package/dist/db/migrations-pg/meta/0012_snapshot.json +2528 -0
  265. package/dist/db/migrations-pg/meta/0013_snapshot.json +2534 -0
  266. package/dist/db/migrations-pg/meta/0014_snapshot.json +2547 -0
  267. package/dist/db/migrations-pg/meta/0015_snapshot.json +2553 -0
  268. package/dist/db/migrations-pg/meta/0016_snapshot.json +2774 -0
  269. package/dist/db/migrations-pg/meta/0017_snapshot.json +2999 -0
  270. package/dist/db/migrations-pg/meta/0018_snapshot.json +3020 -0
  271. package/dist/db/migrations-pg/meta/0020_snapshot.json +3228 -0
  272. package/dist/db/migrations-pg/meta/0021_snapshot.json +3234 -0
  273. package/dist/db/migrations-pg/meta/0022_snapshot.json +3240 -0
  274. package/dist/db/migrations-pg/meta/_journal.json +475 -0
  275. package/dist/db/ml-labels.js +1666 -0
  276. package/dist/db/my-turn-dismissals.js +343 -0
  277. package/dist/db/my-turn-settings.js +34 -0
  278. package/dist/db/pending-classify.js +46 -0
  279. package/dist/db/pending-mute.js +171 -0
  280. package/dist/db/pending-tabs.js +238 -0
  281. package/dist/db/period-metrics.js +820 -0
  282. package/dist/db/person-period.js +763 -0
  283. package/dist/db/pr-intervals.js +930 -0
  284. package/dist/db/pr-liveness.js +240 -0
  285. package/dist/db/pr-mentions.js +279 -0
  286. package/dist/db/pr-merge-queue-stamp.js +91 -0
  287. package/dist/db/queries.js +14631 -0
  288. package/dist/db/reaction-targets.js +94 -0
  289. package/dist/db/repo-activity.js +171 -0
  290. package/dist/db/retention.js +138 -0
  291. package/dist/db/review-threads-for-review.js +240 -0
  292. package/dist/db/run-migrations.js +24 -0
  293. package/dist/db/schema.pg.js +1220 -0
  294. package/dist/db/schema.sqlite.js +1801 -0
  295. package/dist/db/search.js +317 -0
  296. package/dist/db/security-alerts.js +218 -0
  297. package/dist/db/synthesis-input.js +565 -0
  298. package/dist/db/triage.js +320 -0
  299. package/dist/db/usage.js +63 -0
  300. package/dist/db/work-plan.js +1086 -0
  301. package/dist/db/working-hours.js +161 -0
  302. package/dist/feed/my-turn.js +122 -0
  303. package/dist/github/actions-logs.js +397 -0
  304. package/dist/github/auth.js +86 -0
  305. package/dist/github/branch-queries.js +229 -0
  306. package/dist/github/client.js +454 -0
  307. package/dist/github/codeowners.js +221 -0
  308. package/dist/github/commit-checks.js +105 -0
  309. package/dist/github/compare.js +110 -0
  310. package/dist/github/diff-anchor.js +227 -0
  311. package/dist/github/mutations.js +706 -0
  312. package/dist/github/pr-file-content.js +254 -0
  313. package/dist/github/pr-liveness.js +161 -0
  314. package/dist/github/queries.js +875 -0
  315. package/dist/github/rate-budget.js +129 -0
  316. package/dist/github/reactions.js +161 -0
  317. package/dist/github/reviewer-suggest.js +104 -0
  318. package/dist/github/team-reviewers.js +96 -0
  319. package/dist/index.js +184 -0
  320. package/dist/merge/auto-merge-runner.js +960 -0
  321. package/dist/ml/severity-client.js +218 -0
  322. package/dist/pr/detail-enricher.js +26 -0
  323. package/dist/pro/bind.js +302 -0
  324. package/dist/pro/contract.js +37 -0
  325. package/dist/pro/migrate.js +64 -0
  326. package/dist/review/agent-context.js +127 -0
  327. package/dist/review/agent.js +385 -0
  328. package/dist/review/agentic.js +59 -0
  329. package/dist/review/auth.js +94 -0
  330. package/dist/review/chat-agent.js +179 -0
  331. package/dist/review/claude-review/ai-ready.js +16 -0
  332. package/dist/review/claude-review/auto-settings.js +139 -0
  333. package/dist/review/claude-review/auto.js +244 -0
  334. package/dist/review/claude-review/chat.js +489 -0
  335. package/dist/review/claude-review/ci-failures.js +350 -0
  336. package/dist/review/claude-review/follow-up.js +310 -0
  337. package/dist/review/claude-review/manager.js +686 -0
  338. package/dist/review/claude-review/persist.js +996 -0
  339. package/dist/review/claude-review/prompts.js +357 -0
  340. package/dist/review/claude-review/routes.js +518 -0
  341. package/dist/review/claude-review/routing.js +61 -0
  342. package/dist/review/claude-review/specialists.js +190 -0
  343. package/dist/review/claude-review/threads.js +265 -0
  344. package/dist/review/claude-review/ticket.js +282 -0
  345. package/dist/review/clone-hygiene.js +380 -0
  346. package/dist/review/clone-manager.js +367 -0
  347. package/dist/review/llm.js +113 -0
  348. package/dist/review/model-options.js +48 -0
  349. package/dist/review/plugin-providers.js +12 -0
  350. package/dist/review/post-review.js +216 -0
  351. package/dist/review/post-seam.js +161 -0
  352. package/dist/review/prepare.js +168 -0
  353. package/dist/review/pricing.js +17 -0
  354. package/dist/review/schema.js +156 -0
  355. package/dist/review/submit-map.js +41 -0
  356. package/dist/review/usage.js +90 -0
  357. package/dist/shared/claude-review.js +335 -0
  358. package/dist/shared/conflict-fold.js +151 -0
  359. package/dist/shared/conflicts.js +30 -0
  360. package/dist/shared/flow-settings.js +191 -0
  361. package/dist/shared/index.js +8 -0
  362. package/dist/shared/my-turn-settings.js +238 -0
  363. package/dist/shared/pending-rules.js +281 -0
  364. package/dist/shared/product.js +54 -0
  365. package/dist/shared/types.js +896 -0
  366. package/dist/status.js +386 -0
  367. package/dist/sync/adaptive.js +185 -0
  368. package/dist/sync/app-attribution.js +66 -0
  369. package/dist/sync/auth-notices.js +36 -0
  370. package/dist/sync/backfill-ci-history.js +315 -0
  371. package/dist/sync/backfill-commit-headlines.js +136 -0
  372. package/dist/sync/backfill-pr-security.js +175 -0
  373. package/dist/sync/backfill-review-requests.js +97 -0
  374. package/dist/sync/benchmark-rollup.js +50 -0
  375. package/dist/sync/bot-detection.js +309 -0
  376. package/dist/sync/bot-resolution-markers.js +30 -0
  377. package/dist/sync/branch-status.js +634 -0
  378. package/dist/sync/classify-change-shape.js +150 -0
  379. package/dist/sync/commit-files.js +74 -0
  380. package/dist/sync/derive-thread-state.js +99 -0
  381. package/dist/sync/drain-review-threads.js +212 -0
  382. package/dist/sync/hydrate-detail.js +482 -0
  383. package/dist/sync/mention-scan.js +89 -0
  384. package/dist/sync/ml-enrichment.js +478 -0
  385. package/dist/sync/pr-change-signal.js +96 -0
  386. package/dist/sync/pr-liveness-sweep.js +139 -0
  387. package/dist/sync/pr-settle.js +381 -0
  388. package/dist/sync/refresh-pr.js +163 -0
  389. package/dist/sync/reparse-vendor-badges.js +495 -0
  390. package/dist/sync/resync-after-write.js +280 -0
  391. package/dist/sync/review-fingerprint.js +117 -0
  392. package/dist/sync/reviewer-behavior.js +103 -0
  393. package/dist/sync/reviewer-classify.js +503 -0
  394. package/dist/sync/routing-files.js +97 -0
  395. package/dist/sync/scheduled-jobs.js +12 -0
  396. package/dist/sync/scheduler.js +159 -0
  397. package/dist/sync/security-detect.js +521 -0
  398. package/dist/sync/sync-manager.js +750 -0
  399. package/dist/sync/sync-one-pr.js +205 -0
  400. package/dist/sync/sync-repo.js +400 -0
  401. package/dist/sync/unsettled-prs.js +506 -0
  402. package/dist/sync/upsert.js +1190 -0
  403. package/package.json +56 -0
  404. package/public/apple-touch-icon.png +0 -0
  405. package/public/assets/AiFixTab-CQP6PT5u.js +2 -0
  406. package/public/assets/ClaudeReviewTab-DQJ-58ZA.js +8 -0
  407. package/public/assets/PrBotBehaviourTab-CCnFrWbC.js +1 -0
  408. package/public/assets/archivo-latin-600-BN-JkNrl.woff2 +0 -0
  409. package/public/assets/highlight-BEHUn5zE.css +10 -0
  410. package/public/assets/highlight-CIIZLa6Z.js +12 -0
  411. package/public/assets/index-BDnYs6zg.js +73 -0
  412. package/public/assets/index-mCuI--RC.css +1 -0
  413. package/public/assets/markdown-I_JLLVAZ.js +32 -0
  414. package/public/assets/perfProbe-Da13EhTE.js +1 -0
  415. package/public/assets/tanstack-5qsxxaLe.js +17 -0
  416. package/public/assets/vis-C3BCkP5U.js +1280 -0
  417. package/public/assets/vis-ziCVehMy.css +1 -0
  418. package/public/favicon-16.png +0 -0
  419. package/public/favicon-32.png +0 -0
  420. package/public/favicon-48.png +0 -0
  421. package/public/favicon.svg +5 -0
  422. package/public/index.html +41 -0
  423. package/public-landing/apple-touch-icon.png +0 -0
  424. package/public-landing/assets/archivo-latin-500-BWmvx2Mg.woff2 +0 -0
  425. package/public-landing/assets/archivo-latin-600-BN-JkNrl.woff2 +0 -0
  426. package/public-landing/assets/index-CA3eEGXO.js +40 -0
  427. package/public-landing/assets/index-naQrQ6Fe.css +1 -0
  428. package/public-landing/assets/jetbrains-mono-latin-400-RruCX7RW.woff2 +0 -0
  429. package/public-landing/assets/newsreader-latin-400-DExrRRrN.woff2 +0 -0
  430. package/public-landing/assets/newsreader-latin-400-italic-b0I-AwbV.woff2 +0 -0
  431. package/public-landing/bots/index.html +156 -0
  432. package/public-landing/contact/index.html +156 -0
  433. package/public-landing/cookies/index.html +156 -0
  434. package/public-landing/demo/limn-walkthrough-poster.jpg +0 -0
  435. package/public-landing/demo/limn-walkthrough.cues.json +44 -0
  436. package/public-landing/demo/limn-walkthrough.mp4 +0 -0
  437. package/public-landing/favicon-16.png +0 -0
  438. package/public-landing/favicon-32.png +0 -0
  439. package/public-landing/favicon-48.png +0 -0
  440. package/public-landing/favicon.svg +5 -0
  441. package/public-landing/features/index.html +156 -0
  442. package/public-landing/for-developers/index.html +156 -0
  443. package/public-landing/for-managers/index.html +156 -0
  444. package/public-landing/how-it-works/index.html +156 -0
  445. package/public-landing/how-we-measure/index.html +156 -0
  446. package/public-landing/icon-192.png +0 -0
  447. package/public-landing/icon-512.png +0 -0
  448. package/public-landing/index.html +156 -0
  449. package/public-landing/insights/index.html +156 -0
  450. package/public-landing/og-image.png +0 -0
  451. package/public-landing/pricing/index.html +156 -0
  452. package/public-landing/privacy/index.html +156 -0
  453. package/public-landing/pro/index.html +156 -0
  454. package/public-landing/reviews/index.html +156 -0
  455. package/public-landing/robots.txt +8 -0
  456. package/public-landing/shots/benchmark.png +0 -0
  457. package/public-landing/shots/bot-roi.png +0 -0
  458. package/public-landing/shots/bot-settings.png +0 -0
  459. package/public-landing/shots/chronology.png +0 -0
  460. package/public-landing/shots/feed.png +0 -0
  461. package/public-landing/shots/flow-metrics.png +0 -0
  462. package/public-landing/shots/free-reports.png +0 -0
  463. package/public-landing/shots/pending-board.png +0 -0
  464. package/public-landing/shots/pending-card.png +0 -0
  465. package/public-landing/shots/period-report.png +0 -0
  466. package/public-landing/shots/pr-detail.png +0 -0
  467. package/public-landing/shots/pr-threads.png +0 -0
  468. package/public-landing/shots/reach.png +0 -0
  469. package/public-landing/shots/repo-rows.png +0 -0
  470. package/public-landing/shots/severity-findings.png +0 -0
  471. package/public-landing/shots/severity-strip.png +0 -0
  472. package/public-landing/site.webmanifest +14 -0
  473. package/public-landing/sitemap.xml +51 -0
  474. package/public-landing/terms/index.html +156 -0
@@ -0,0 +1,18 @@
1
+ -- GitHub's native merge queue as a SYNCED, STORED fact — the Postgres twin of sqlite
2
+ -- 0059_merge_queue_state.sql. HAND-WRITTEN ADDITIVE, like every pg migration since 0023: never
3
+ -- regenerate the baseline with `pnpm db:generate:pg`, which squashes it.
4
+ --
5
+ -- Read the sqlite twin for the full argument. The two things that will otherwise be re-litigated:
6
+ -- • it is stored because MergeStateStatus has NO QUEUED member — a queued PR reports `blocked`,
7
+ -- indistinguishable from a protection-blocked one — and the Pending board may not fetch on
8
+ -- mount to find out (fifty cards would be ~150 GitHub calls to paint a screen);
9
+ -- • ⚠ NEITHER COLUMN TAKES A DEFAULT: null means "not observed", not "not queued". A DEFAULT
10
+ -- false would assert about every already-synced PR that GitHub had said it is out of the
11
+ -- queue, which it never did.
12
+ -- Position and estimatedTimeToMerge stay live-only in GET /api/prs/:id/merge-options — genuinely
13
+ -- volatile, and rendered only by the click-gated merge control.
14
+ ALTER TABLE "pull_requests" ADD COLUMN IF NOT EXISTS "in_merge_queue" boolean;--> statement-breakpoint
15
+ -- GitHub's MergeQueueEntryState, lowercased (awaiting_checks | locked | mergeable | queued |
16
+ -- unmergeable). Kept as `text` with a drizzle `enum:`, matching every other stored enum on this
17
+ -- table — no native pg enum, so there is nothing to CREATE TYPE here.
18
+ ALTER TABLE "pull_requests" ADD COLUMN IF NOT EXISTS "merge_queue_entry_state" text;
@@ -0,0 +1,21 @@
1
+ -- DROP `my_turn_dismissals` — the Postgres twin of sqlite 0060_drop_my_turn_dismissals.sql.
2
+ -- HAND-WRITTEN ADDITIVE, like every pg migration since 0023: never regenerate the baseline with
3
+ -- `pnpm db:generate:pg`, which squashes it.
4
+ --
5
+ -- ⚠ DESTRUCTIVE AND ONE-WAY. No down migration, no archive — the rows go when this runs. The
6
+ -- table has already been inert for a release (the ball rule landed in `getMyTurn` first), so
7
+ -- nothing breaks, but a restore is the only way back.
8
+ --
9
+ -- Read the sqlite twin for the full argument. In short: each row was a hand-written "I have seen
10
+ -- this", needed only because My Turn had no predicate for "you already acted on this PR". The ball
11
+ -- rule is that predicate — state-derived, recomputed on every read — so a card now leaves the
12
+ -- board when the user does the work rather than when they tell the app they did. And a dismissal
13
+ -- never expired, which made it a ticket queue kept true by grooming: exactly the thing this
14
+ -- product claims not to be.
15
+ --
16
+ -- IF-EXISTS because a fresh cloud database may or may not have replayed the 0000 baseline that
17
+ -- created it. The FK to `accounts` and both indexes (`mtd_kind_ref_ux`, `mtd_account_idx`) are
18
+ -- dropped with the table; nothing else references it, so no CASCADE is needed and none is given —
19
+ -- a CASCADE here could only ever mean something unexpected depends on this table, which is a
20
+ -- failure worth seeing rather than swallowing.
21
+ DROP TABLE IF EXISTS "my_turn_dismissals";
@@ -0,0 +1,27 @@
1
+ -- Two anchors the auto-merge watcher DISARMS on, moved out of process memory onto the row.
2
+ -- The SQLite twin is migrations/0061_auto_merge_durable_anchors.sql.
3
+ --
4
+ -- WHY. Both facts lived in module-level Maps in `merge/auto-merge-runner.ts` (`pendingUpdates`,
5
+ -- and the retarget guard's implicit reliance on a synced column read at run time). A Map is fine
6
+ -- for a hint. It is not fine for a fact the watcher ends an intent on, because losing it does not
7
+ -- read as "I forgot" — it reads as "something unexplained happened to this branch", and the safe
8
+ -- response to an unexplained head move is to disarm. Under `pnpm dev` that is every file save;
9
+ -- in cloud it is every deploy. Measured on the author's own account, 3 of 21 intents died and a
10
+ -- further 2 were at risk from exactly this class of bookkeeping loss.
11
+ --
12
+ -- ⚠ BOTH ARE NULLABLE WITH NO DEFAULT, AND NULL MEANS "NOT RECORDED", NEVER A VALUE.
13
+ -- "expected_base_ref" is null on every row armed before this migration; the retarget guard falls
14
+ -- back to the synced base ref for those, which is exactly what it did before, so no already-armed
15
+ -- intent changes behaviour. A DEFAULT here would assert the user consented to a branch nobody
16
+ -- asked them about.
17
+
18
+ -- The base branch the SPA was showing when the user armed. The head pin cannot see a retarget
19
+ -- (PATCH pulls/{n} with a new `base` leaves head.sha alone), so consent to "merge into main"
20
+ -- needs its own anchor. It was being approximated by reading `pull_requests.base_ref_name` at RUN
21
+ -- time — a value the sync owns and may correct at any moment, at which point the watcher reports
22
+ -- a retarget that never happened.
23
+ ALTER TABLE "auto_merge_requests" ADD COLUMN IF NOT EXISTS "expected_base_ref" text;--> statement-breakpoint
24
+ -- The head SHA an in-flight update-branch was issued AGAINST. GitHub's update-branch returns 202
25
+ -- with no handle to poll, so the head move it causes arrives on a later tick; without this the
26
+ -- watcher cannot tell its OWN merge commit from a human push and disarms with "the branch moved".
27
+ ALTER TABLE "auto_merge_requests" ADD COLUMN IF NOT EXISTS "update_issued_against_oid" text;
@@ -0,0 +1,8 @@
1
+ -- Postgres twin of migrations/0062_blast_radius_config.sql — the blast-radius reading settings
2
+ -- (CORE, free, no AI), one nullable JSON blob per account. See the sqlite original for why this
3
+ -- is account-grained, why it is one JSON column rather than six integers, and why it is nullable
4
+ -- with no backfill.
5
+ --
6
+ -- `jsonb` here against sqlite's `text` json mode: the standard divergence in this schema pair
7
+ -- (the header of schema.pg.ts records the mapping), and both read back as the same object.
8
+ ALTER TABLE "accounts" ADD COLUMN "blast_radius_config" jsonb;
@@ -0,0 +1,13 @@
1
+ -- Postgres twin of migrations/0063_repo_file_coupling.sql — the per-repo co-change index behind
2
+ -- the blast-radius hub arm. See the sqlite original for what it stores, why it stores only the
3
+ -- hubs, and why `hub_bar` is max(repo p90, an absolute floor) rather than either alone.
4
+ CREATE TABLE IF NOT EXISTS "repo_file_coupling" (
5
+ "id" serial PRIMARY KEY NOT NULL,
6
+ "account_id" integer NOT NULL REFERENCES "accounts"("id"),
7
+ "repo_id" integer NOT NULL REFERENCES "repos"("id"),
8
+ "hub_bar" integer NOT NULL,
9
+ "pr_count" integer NOT NULL,
10
+ "hubs" jsonb NOT NULL,
11
+ "built_at" timestamp with time zone DEFAULT now() NOT NULL
12
+ );
13
+ CREATE UNIQUE INDEX IF NOT EXISTS "rfc_account_repo" ON "repo_file_coupling" ("account_id","repo_id");
@@ -0,0 +1,6 @@
1
+ -- Postgres twin of migrations/0064_pr_content_kind.sql — what a pull request's code churn
2
+ -- consists of ('comments' | 'formatting' | 'code'), plus the head sha it was read at. See the
3
+ -- sqlite original for why NULL is the common case, why there is no backfill, and why the sha
4
+ -- column is load-bearing rather than bookkeeping.
5
+ ALTER TABLE "pull_requests" ADD COLUMN IF NOT EXISTS "content_kind" text;
6
+ ALTER TABLE "pull_requests" ADD COLUMN IF NOT EXISTS "content_kind_sha" text;
@@ -0,0 +1,4 @@
1
+ -- Postgres twin of migrations/0065_workspace_flow_settings.sql — a workspace's working hours,
2
+ -- time zone and wait budgets for Chronology, stored as OVERRIDES ONLY (NULL = every default).
3
+ -- See the sqlite original for why it is per workspace and why there is no backfill.
4
+ ALTER TABLE "workspaces" ADD COLUMN IF NOT EXISTS "flow_settings" jsonb;
@@ -0,0 +1,18 @@
1
+ -- Postgres twin of migrations/0066_review_request_events.sql — the review-request HISTORY (every
2
+ -- requested / removed event from a PR's timeline) plus the per-PR "history received" stamp. See
3
+ -- the sqlite original for why the table carries no account_id, why it is immutable, and why NULL
4
+ -- in the stamp means "not known" rather than "never requested".
5
+ CREATE TABLE IF NOT EXISTS "review_request_events" (
6
+ "id" serial PRIMARY KEY NOT NULL,
7
+ "pr_id" integer NOT NULL,
8
+ "github_node_id" text NOT NULL,
9
+ "kind" text NOT NULL,
10
+ "occurred_at" timestamp with time zone NOT NULL,
11
+ "reviewer_kind" text NOT NULL,
12
+ "reviewer_user_id" integer,
13
+ "team_slug" text,
14
+ CONSTRAINT "review_request_events_pr_id_pull_requests_id_fk" FOREIGN KEY ("pr_id") REFERENCES "pull_requests"("id"),
15
+ CONSTRAINT "review_request_events_reviewer_user_id_users_id_fk" FOREIGN KEY ("reviewer_user_id") REFERENCES "users"("id")
16
+ );
17
+ CREATE UNIQUE INDEX IF NOT EXISTS "review_request_events_pr_node" ON "review_request_events" ("pr_id","github_node_id");
18
+ ALTER TABLE "pull_requests" ADD COLUMN IF NOT EXISTS "review_requests_synced_at" timestamp with time zone;
@@ -0,0 +1,59 @@
1
+ -- Postgres twin of migrations/0067_pr_security_signals.sql. Read that file for the reasoning:
2
+ -- four small DERIVED columns on `pull_requests` (`dependency_vendor`, `security_fix`,
3
+ -- `advisory_ids`, `security_checked_at`) read at sync from the PR's title, branch, labels and FULL
4
+ -- `bodyText` — no bodies stored, a three-state write (a body that was not received writes
5
+ -- nothing), never `search_index` (its 4,000-character cap cuts Dependabot's footer off), and
6
+ -- `security_checked_at` NULL is the backfill's worklist.
7
+ --
8
+ -- The `workspace_reviewers` UPDATEs upgrade six newly-known automation logins (plus Semgrep's
9
+ -- per-org App) whose stored role/kind would otherwise beat the new login seed forever — the
10
+ -- 0040/0041 precedent, with the same three conditions.
11
+ --
12
+ -- Only spelling difference from the sqlite file: `regexp_replace(…, '\[bot\]$', '')` rather
13
+ -- than `replace(…, '[bot]', '')` (the documented divergence; each is idiomatic for its dialect).
14
+ ALTER TABLE "pull_requests" ADD COLUMN IF NOT EXISTS "dependency_vendor" text;
15
+ ALTER TABLE "pull_requests" ADD COLUMN IF NOT EXISTS "security_fix" text;
16
+ ALTER TABLE "pull_requests" ADD COLUMN IF NOT EXISTS "advisory_ids" jsonb;
17
+ ALTER TABLE "pull_requests" ADD COLUMN IF NOT EXISTS "security_checked_at" timestamp with time zone;
18
+ UPDATE "workspace_reviewers"
19
+ SET "role" = 'dependency'
20
+ WHERE "source" <> 'manual'
21
+ AND "author_user_id" IN (
22
+ SELECT "id" FROM "users" WHERE regexp_replace(lower("github_login"), '\[bot\]$', '') IN
23
+ ('snyk-io', 'aikido-autofix', 'mend-for-github-com')
24
+ );
25
+ UPDATE "workspace_reviewers"
26
+ SET "role" = 'quality_check'
27
+ WHERE "source" <> 'manual'
28
+ AND "author_user_id" IN (
29
+ SELECT "id" FROM "users" WHERE regexp_replace(lower("github_login"), '\[bot\]$', '') IN ('endor-labs-pro')
30
+ OR lower("github_login") LIKE 'semgrep-code-%' OR lower("github_login") LIKE 'semgrepcode-%'
31
+ );
32
+ UPDATE "workspace_reviewers"
33
+ SET "role" = 'code_agent'
34
+ WHERE "source" <> 'manual'
35
+ AND "author_user_id" IN (
36
+ SELECT "id" FROM "users" WHERE regexp_replace(lower("github_login"), '\[bot\]$', '') IN
37
+ ('step-security-bot', 'orbisai0security')
38
+ );
39
+ UPDATE "workspace_reviewers" SET "kind" = 'snyk', "label" = NULL
40
+ WHERE "identity_source" <> 'manual' AND "kind" IN ('in_house', 'vendor')
41
+ AND "author_user_id" IN (SELECT "id" FROM "users" WHERE regexp_replace(lower("github_login"), '\[bot\]$', '') IN ('snyk-io'));
42
+ UPDATE "workspace_reviewers" SET "kind" = 'aikido', "label" = NULL
43
+ WHERE "identity_source" <> 'manual' AND "kind" IN ('in_house', 'vendor')
44
+ AND "author_user_id" IN (SELECT "id" FROM "users" WHERE regexp_replace(lower("github_login"), '\[bot\]$', '') IN ('aikido-autofix'));
45
+ UPDATE "workspace_reviewers" SET "kind" = 'mend', "label" = NULL
46
+ WHERE "identity_source" <> 'manual' AND "kind" IN ('in_house', 'vendor')
47
+ AND "author_user_id" IN (SELECT "id" FROM "users" WHERE regexp_replace(lower("github_login"), '\[bot\]$', '') IN ('mend-for-github-com'));
48
+ UPDATE "workspace_reviewers" SET "kind" = 'endor', "label" = NULL
49
+ WHERE "identity_source" <> 'manual' AND "kind" IN ('in_house', 'vendor')
50
+ AND "author_user_id" IN (SELECT "id" FROM "users" WHERE regexp_replace(lower("github_login"), '\[bot\]$', '') IN ('endor-labs-pro'));
51
+ UPDATE "workspace_reviewers" SET "kind" = 'semgrep', "label" = NULL
52
+ WHERE "identity_source" <> 'manual' AND "kind" IN ('in_house', 'vendor')
53
+ AND "author_user_id" IN (SELECT "id" FROM "users" WHERE lower("github_login") LIKE 'semgrep-code-%' OR lower("github_login") LIKE 'semgrepcode-%');
54
+ UPDATE "workspace_reviewers" SET "kind" = 'step_security', "label" = NULL
55
+ WHERE "identity_source" <> 'manual' AND "kind" IN ('in_house', 'vendor')
56
+ AND "author_user_id" IN (SELECT "id" FROM "users" WHERE regexp_replace(lower("github_login"), '\[bot\]$', '') IN ('step-security-bot'));
57
+ UPDATE "workspace_reviewers" SET "kind" = 'orbisai', "label" = NULL
58
+ WHERE "identity_source" <> 'manual' AND "kind" IN ('in_house', 'vendor')
59
+ AND "author_user_id" IN (SELECT "id" FROM "users" WHERE regexp_replace(lower("github_login"), '\[bot\]$', '') IN ('orbisai0security'));
@@ -0,0 +1,6 @@
1
+ -- Postgres twin of migrations/0068_my_turn_settings.sql. See the sqlite original for why the
2
+ -- settings are overrides-only with no backfill, and why mentioned_at starts NULL. jsonb against
3
+ -- sqlite's text json mode is the standard divergence (schema.pg.ts header).
4
+ ALTER TABLE "accounts" ADD COLUMN IF NOT EXISTS "my_turn_settings" jsonb;
5
+ ALTER TABLE "pr_mentions" ADD COLUMN IF NOT EXISTS "mentioned_at" timestamp with time zone;
6
+ ALTER TABLE "pr_mentions" ADD COLUMN IF NOT EXISTS "mentioned_by_user_id" integer;
@@ -0,0 +1,21 @@
1
+ -- MY TURN DISMISSALS — the Postgres twin of migrations/0069_my_turn_dismissals.sql. Read that
2
+ -- header for the contract (and 0047/0060 for why the previous table of this name was dropped).
3
+ --
4
+ -- `pull_requests_id_account` is the parent key of the composite tenancy FK below, the
5
+ -- `repos_id_account` trick; Postgres accepts a plain unique index there.
6
+ CREATE UNIQUE INDEX IF NOT EXISTS "pull_requests_id_account" ON "pull_requests" USING btree ("id","account_id");
7
+ --> statement-breakpoint
8
+ CREATE TABLE IF NOT EXISTS "my_turn_dismissals" (
9
+ "id" serial PRIMARY KEY NOT NULL,
10
+ "account_id" integer NOT NULL,
11
+ "pr_id" integer,
12
+ "repo_id" integer,
13
+ "dismissed_at" timestamp with time zone NOT NULL,
14
+ CONSTRAINT "my_turn_dismissals_account_id_accounts_id_fk" FOREIGN KEY ("account_id") REFERENCES "accounts"("id") ON DELETE cascade,
15
+ CONSTRAINT "my_turn_dismissals_pr_account_fk" FOREIGN KEY ("pr_id","account_id") REFERENCES "pull_requests"("id","account_id") ON DELETE cascade,
16
+ CONSTRAINT "my_turn_dismissals_repo_account_fk" FOREIGN KEY ("repo_id","account_id") REFERENCES "repos"("id","account_id") ON DELETE cascade
17
+ );
18
+ --> statement-breakpoint
19
+ CREATE UNIQUE INDEX IF NOT EXISTS "my_turn_dismissals_account_pr" ON "my_turn_dismissals" USING btree ("account_id","pr_id");
20
+ --> statement-breakpoint
21
+ CREATE UNIQUE INDEX IF NOT EXISTS "my_turn_dismissals_account_repo" ON "my_turn_dismissals" USING btree ("account_id","repo_id");
@@ -0,0 +1,8 @@
1
+ -- Postgres twin of migrations/0070_claude_review_follow_up_ticket.sql. See the sqlite original for
2
+ -- the contracts and why prior_finding_id is a soft reference with no FK. Claude Review is
3
+ -- local-only, so these columns exist in Postgres for schema parity. jsonb against sqlite's text
4
+ -- json mode is the standard divergence (schema.pg.ts header).
5
+ ALTER TABLE "claude_reviews" ADD COLUMN IF NOT EXISTS "ticket" jsonb;
6
+ ALTER TABLE "claude_reviews" ADD COLUMN IF NOT EXISTS "ticket_assessment" jsonb;
7
+ ALTER TABLE "claude_reviews" ADD COLUMN IF NOT EXISTS "follow_up" jsonb;
8
+ ALTER TABLE "claude_review_findings" ADD COLUMN IF NOT EXISTS "prior_finding_id" integer;
@@ -0,0 +1,4 @@
1
+ -- Postgres twin of migrations/0071_claude_review_trigger.sql, where the contract lives.
2
+ -- 'manual' | 'auto'; existing rows read 'manual'. Claude Review is local-only, so the column exists
3
+ -- in Postgres for schema parity.
4
+ ALTER TABLE "claude_reviews" ADD COLUMN IF NOT EXISTS "trigger" text DEFAULT 'manual' NOT NULL;
@@ -0,0 +1,3 @@
1
+ -- Postgres twin of migrations/0072_commit_message_headline.sql, where the contract lives.
2
+ -- Nullable: NULL is "not synced yet", never an empty headline.
3
+ ALTER TABLE "commits" ADD COLUMN IF NOT EXISTS "message_headline" text;
@@ -0,0 +1,24 @@
1
+ -- Postgres twin of migrations/0073_claude_review_chat.sql, where the contract lives. Claude Review
2
+ -- is local-only, so the table exists in Postgres for schema parity.
3
+ CREATE UNIQUE INDEX IF NOT EXISTS "claude_reviews_id_account" ON "claude_reviews" USING btree ("id","account_id");
4
+ --> statement-breakpoint
5
+ CREATE TABLE IF NOT EXISTS "claude_review_chat_messages" (
6
+ "id" serial PRIMARY KEY NOT NULL,
7
+ "account_id" integer NOT NULL,
8
+ "review_id" integer NOT NULL,
9
+ "finding_id" integer,
10
+ "role" text NOT NULL,
11
+ "content" text NOT NULL,
12
+ "model" text,
13
+ "cost_usd" double precision,
14
+ "input_tokens" integer,
15
+ "output_tokens" integer,
16
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
17
+ CONSTRAINT "claude_review_chat_messages_account_id_accounts_id_fk" FOREIGN KEY ("account_id") REFERENCES "accounts"("id") ON DELETE cascade,
18
+ CONSTRAINT "claude_review_chat_messages_finding_id_claude_review_findings_id_fk" FOREIGN KEY ("finding_id") REFERENCES "claude_review_findings"("id") ON DELETE cascade,
19
+ CONSTRAINT "crcm_review_account_fk" FOREIGN KEY ("review_id","account_id") REFERENCES "claude_reviews"("id","account_id") ON DELETE cascade
20
+ );
21
+ --> statement-breakpoint
22
+ CREATE INDEX IF NOT EXISTS "crcm_thread_idx" ON "claude_review_chat_messages" USING btree ("review_id","finding_id","id");
23
+ --> statement-breakpoint
24
+ CREATE INDEX IF NOT EXISTS "crcm_account_idx" ON "claude_review_chat_messages" USING btree ("account_id");
@@ -0,0 +1,79 @@
1
+ -- ADOPT THE AGENTIC TABLES INTO CORE — the Postgres twin of
2
+ -- migrations/0074_adopt_agentic_tables.sql, where the contract lives. Every statement is
3
+ -- replay-safe (IF NOT EXISTS), so an install where the plugin already created the tables adopts
4
+ -- them in place. Unlike SQLite, Postgres can add the comments-seed columns idempotently, so an
5
+ -- adopted ai_fixes that predates plugin 0024 is brought up to shape here too.
6
+ CREATE TABLE IF NOT EXISTS "review_learnings" (
7
+ "id" serial PRIMARY KEY,
8
+ "account_id" integer NOT NULL,
9
+ "repo_id" integer NOT NULL,
10
+ "pr_id" integer NOT NULL,
11
+ "source_review_id" integer NOT NULL,
12
+ "finding_id" integer,
13
+ "head_sha" text NOT NULL,
14
+ "kind" text NOT NULL,
15
+ "path" text,
16
+ "dir_path" text,
17
+ "ext" text,
18
+ "category" text,
19
+ "claude_verdict" text,
20
+ "user_verdict" text,
21
+ "claude_title" text,
22
+ "claude_text" text,
23
+ "user_text" text,
24
+ "posted_comment_kind" text,
25
+ "dedupe_key" text NOT NULL,
26
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL
27
+ );
28
+ --> statement-breakpoint
29
+ CREATE UNIQUE INDEX IF NOT EXISTS "rl_account_dedupe" ON "review_learnings" ("account_id","dedupe_key");
30
+ --> statement-breakpoint
31
+ CREATE INDEX IF NOT EXISTS "rl_account_repo_category" ON "review_learnings" ("account_id","repo_id","category");
32
+ --> statement-breakpoint
33
+ CREATE INDEX IF NOT EXISTS "rl_account_repo_dir" ON "review_learnings" ("account_id","repo_id","dir_path");
34
+ --> statement-breakpoint
35
+ CREATE INDEX IF NOT EXISTS "rl_account_source_review" ON "review_learnings" ("account_id","source_review_id");
36
+ --> statement-breakpoint
37
+ CREATE INDEX IF NOT EXISTS "rl_account_repo_created" ON "review_learnings" ("account_id","repo_id","created_at");
38
+ --> statement-breakpoint
39
+ CREATE TABLE IF NOT EXISTS "ai_fixes" (
40
+ "id" serial PRIMARY KEY,
41
+ "account_id" integer NOT NULL,
42
+ "repo_id" integer NOT NULL,
43
+ "pr_id" integer NOT NULL,
44
+ "source_review_id" integer,
45
+ "base_sha" text NOT NULL,
46
+ "status" text NOT NULL,
47
+ "model" text NOT NULL,
48
+ "seed" text NOT NULL,
49
+ "prompt" text,
50
+ "summary" text,
51
+ "commit_message" text,
52
+ "patch" text,
53
+ "files_changed" text,
54
+ "cost_usd" double precision,
55
+ "input_tokens" integer,
56
+ "output_tokens" integer,
57
+ "num_turns" integer,
58
+ "error" text,
59
+ "pushed_branch" text,
60
+ "pushed_pr_number" integer,
61
+ "pushed_pr_url" text,
62
+ "pushed_at" timestamp with time zone,
63
+ "created_at" timestamp with time zone DEFAULT now() NOT NULL,
64
+ "finished_at" timestamp with time zone,
65
+ "comment_targets" text,
66
+ "comment_verdicts" text
67
+ );
68
+ --> statement-breakpoint
69
+ ALTER TABLE "ai_fixes" ADD COLUMN IF NOT EXISTS "comment_targets" text;
70
+ --> statement-breakpoint
71
+ ALTER TABLE "ai_fixes" ADD COLUMN IF NOT EXISTS "comment_verdicts" text;
72
+ --> statement-breakpoint
73
+ CREATE INDEX IF NOT EXISTS "af_account_pr_created" ON "ai_fixes" ("account_id","pr_id","created_at");
74
+ --> statement-breakpoint
75
+ CREATE INDEX IF NOT EXISTS "af_account_status" ON "ai_fixes" ("account_id","status");
76
+ --> statement-breakpoint
77
+ ALTER TABLE "workspaces" ADD COLUMN IF NOT EXISTS "auto_review_enabled" boolean;
78
+ --> statement-breakpoint
79
+ ALTER TABLE "workspaces" ADD COLUMN IF NOT EXISTS "auto_review_enabled_at" timestamp with time zone;
@@ -0,0 +1,5 @@
1
+ -- Postgres twin of migrations/0075_review_lens_drop_learnings.sql, where the contract lives:
2
+ -- claude_review_findings.lens (nullable, no backfill) and review memory's table dropped.
3
+ ALTER TABLE "claude_review_findings" ADD COLUMN IF NOT EXISTS "lens" text;
4
+ --> statement-breakpoint
5
+ DROP TABLE IF EXISTS "review_learnings";
@@ -0,0 +1,7 @@
1
+ -- Postgres twin of migrations/0076_claude_review_threads.sql, where the contract lives:
2
+ -- claude_reviews.thread_assessments (other reviewers' open threads, judged) and
3
+ -- claude_reviews.comments_through (the comment half of the auto re-review key). Both nullable, no
4
+ -- backfill.
5
+ ALTER TABLE "claude_reviews" ADD COLUMN IF NOT EXISTS "thread_assessments" jsonb;
6
+ --> statement-breakpoint
7
+ ALTER TABLE "claude_reviews" ADD COLUMN IF NOT EXISTS "comments_through" timestamp with time zone;
@@ -0,0 +1,4 @@
1
+ -- Postgres twin of migrations/0077_claude_review_ci_failures.sql, where the contract lives:
2
+ -- claude_reviews.ci_failures (the head's CI state at review time and Claude's diagnosis of each
3
+ -- failing check). Nullable, no backfill.
4
+ ALTER TABLE "claude_reviews" ADD COLUMN IF NOT EXISTS "ci_failures" jsonb;
@@ -0,0 +1,9 @@
1
+ -- Postgres twin of migrations/0078_ai_fix_change_report.sql, where the contract lives:
2
+ -- ai_fixes.trigger ('manual' | 'auto'), ai_fixes.review_items (the review items a 'review' run was
3
+ -- given, with refs) and ai_fixes.change_report (the validated per-change report). Text JSON like
4
+ -- the table's other JSON columns. All nullable, no backfill.
5
+ ALTER TABLE "ai_fixes" ADD COLUMN IF NOT EXISTS "trigger" text;
6
+ --> statement-breakpoint
7
+ ALTER TABLE "ai_fixes" ADD COLUMN IF NOT EXISTS "review_items" text;
8
+ --> statement-breakpoint
9
+ ALTER TABLE "ai_fixes" ADD COLUMN IF NOT EXISTS "change_report" text;
@@ -0,0 +1,7 @@
1
+ -- Postgres twin of migrations/0079_claude_finding_story.sql, where the contract lives:
2
+ -- claude_review_findings.story_index (the ticket's 0-based position on the run) and
3
+ -- claude_review_findings.story_ref ('AC2' / 'M1') mark a finding the server made from the run's
4
+ -- user-story assessment. Both NULL on an ordinary finding. Nullable, no backfill.
5
+ ALTER TABLE "claude_review_findings" ADD COLUMN IF NOT EXISTS "story_index" integer;
6
+ --> statement-breakpoint
7
+ ALTER TABLE "claude_review_findings" ADD COLUMN IF NOT EXISTS "story_ref" text;