limn-review 0.1.128 → 0.1.130

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 (671) hide show
  1. package/LICENSE +91 -74
  2. package/README.md +19 -7
  3. package/THIRD_PARTY_NOTICES.md +21 -0
  4. package/dist/ai/agent-isolation.js +45 -0
  5. package/dist/ai/credentials.js +113 -0
  6. package/dist/ai/runtime.js +114 -73
  7. package/dist/api/plugins/auth.js +17 -161
  8. package/dist/api/plugins/error-handler.js +12 -74
  9. package/dist/api/plugins/rate-limit.js +154 -99
  10. package/dist/api/plugins/security.js +19 -99
  11. package/dist/api/routes/activity.js +6 -17
  12. package/dist/api/routes/ai-runtime.js +3 -3
  13. package/dist/api/routes/bot-triage.js +22 -310
  14. package/dist/api/routes/conflicts.js +1 -1
  15. package/dist/api/routes/daily-brief.js +3 -3
  16. package/dist/api/routes/dependency-merge.js +96 -0
  17. package/dist/api/routes/flow.js +37 -42
  18. package/dist/api/routes/insights.js +65 -22
  19. package/dist/api/routes/me.js +19 -138
  20. package/dist/api/routes/ml-labels.js +4 -5
  21. package/dist/api/routes/ml-runtime.js +64 -0
  22. package/dist/api/routes/prs.js +118 -80
  23. package/dist/api/routes/search.js +6 -1
  24. package/dist/api/routes/sprint-stories.js +80 -0
  25. package/dist/api/routes/users.js +1 -1
  26. package/dist/api/routes/workspaces.js +8 -0
  27. package/dist/app.js +57 -119
  28. package/dist/auth/account.js +13 -143
  29. package/dist/auth/crypto.js +8 -9
  30. package/dist/bot-triage/resolve.js +3 -1
  31. package/dist/cli.js +77 -63
  32. package/dist/coding/agent.js +141 -28
  33. package/dist/coding/ai-fix/auto-fix.js +32 -9
  34. package/dist/coding/ai-fix/auto-push.js +56 -0
  35. package/dist/coding/ai-fix/manager.js +440 -38
  36. package/dist/coding/ai-fix/persist.js +186 -3
  37. package/dist/coding/ai-fix/plan.js +176 -0
  38. package/dist/coding/ai-fix/prompts.js +88 -1
  39. package/dist/coding/ai-fix/push.js +66 -0
  40. package/dist/coding/ai-fix/review-seed.js +431 -125
  41. package/dist/coding/ai-fix/routes.js +236 -161
  42. package/dist/coding/ai-fix/thread-candidates.js +77 -0
  43. package/dist/coding/ai-resolve/prompt.js +154 -0
  44. package/dist/coding/ai-resolve/routes.js +96 -0
  45. package/dist/coding/ai-resolve/run.js +298 -0
  46. package/dist/coding/ai-resolve/schema.js +26 -0
  47. package/dist/coding/ai-resolve/validate.js +136 -0
  48. package/dist/coding/partial-spend.js +19 -0
  49. package/dist/coding/schema.js +24 -0
  50. package/dist/config.js +103 -289
  51. package/dist/conflict/git.js +1 -1
  52. package/dist/conflict/session.js +10 -6
  53. package/dist/conflict/suggestion.js +1 -1
  54. package/dist/db/blast-radius-query.js +44 -0
  55. package/dist/db/blast-radius.js +1 -1
  56. package/dist/db/bot-window.js +1 -1
  57. package/dist/db/changepoint.js +4 -1
  58. package/dist/db/client.js +39 -79
  59. package/dist/db/daily-brief.js +3 -0
  60. package/dist/db/erase-account.js +101 -1
  61. package/dist/db/export-account.js +48 -0
  62. package/dist/db/flow-detail.js +39 -26
  63. package/dist/db/flow-pointers.js +12 -3
  64. package/dist/db/flow-settings.js +36 -1
  65. package/dist/db/flow-trend.js +576 -0
  66. package/dist/db/merge-queue.js +5 -1
  67. package/dist/db/merged-prs.js +50 -0
  68. package/dist/db/merged-reach.js +83 -0
  69. package/dist/db/migrate.js +0 -2
  70. package/dist/db/migrations/0091_auto_post_verdict_resolve_fix.sql +24 -0
  71. package/dist/db/migrations/0092_finding_pushback.sql +9 -0
  72. package/dist/db/migrations/0093_dependency_auto_merge.sql +25 -0
  73. package/dist/db/migrations/0094_repo_uses_github_issues.sql +26 -0
  74. package/dist/db/migrations/0095_review_chat_explain.sql +14 -0
  75. package/dist/db/migrations/0096_workspace_setting_events.sql +27 -0
  76. package/dist/db/migrations/0097_story_reports.sql +40 -0
  77. package/dist/db/migrations/0098_tracker_ticket_dates.sql +11 -0
  78. package/dist/db/migrations/0099_story_labels.sql +29 -0
  79. package/dist/db/migrations/0100_sprint_stories.sql +141 -0
  80. package/dist/db/migrations/0101_sprint_reads_api_root.sql +6 -0
  81. package/dist/db/migrations/0102_workspace_sprint_checks.sql +5 -0
  82. package/dist/db/migrations/0103_sprint_statuses_and_blockers.sql +26 -0
  83. package/dist/db/migrations/0104_sprint_ticket_repos_saved.sql +7 -0
  84. package/dist/db/migrations/0105_sprint_assessment_mode.sql +8 -0
  85. package/dist/db/migrations/0106_sprint_ref_tickets.sql +27 -0
  86. package/dist/db/migrations/0107_sprint_graph.sql +47 -0
  87. package/dist/db/migrations/0108_sprint_themes.sql +24 -0
  88. package/dist/db/migrations/0109_sprint_story.sql +23 -0
  89. package/dist/db/migrations/0110_finding_reminder.sql +7 -0
  90. package/dist/db/migrations/0111_sprint_dates_story_attempt.sql +19 -0
  91. package/dist/db/migrations/0112_sprint_view_snapshots.sql +20 -0
  92. package/dist/db/migrations/0113_ai_fix_plan.sql +27 -0
  93. package/dist/db/migrations/0114_sonarcloud.sql +42 -0
  94. package/dist/db/migrations/0115_sequence_diagrams.sql +40 -0
  95. package/dist/db/migrations/0116_reference_docs.sql +64 -0
  96. package/dist/db/migrations/0117_review_doc_references.sql +11 -0
  97. package/dist/db/migrations/0118_sequence_diagram_runs.sql +10 -0
  98. package/dist/db/migrations/0119_design_diagrams.sql +7 -0
  99. package/dist/db/migrations/0120_sprint_paths.sql +33 -0
  100. package/dist/db/migrations/0121_story_docs_alignments.sql +42 -0
  101. package/dist/db/migrations/0122_claude_thread_checks.sql +42 -0
  102. package/dist/db/migrations/0123_sprint_brief_one_liner.sql +5 -0
  103. package/dist/db/migrations/0124_reference_doc_crawl.sql +8 -0
  104. package/dist/db/migrations/meta/_journal.json +238 -0
  105. package/dist/db/my-turn-card-facts.js +48 -8
  106. package/dist/db/pending-tabs.js +18 -10
  107. package/dist/db/period-metrics.js +1 -2
  108. package/dist/db/pr-intervals.js +199 -124
  109. package/dist/db/pr-liveness.js +7 -0
  110. package/dist/db/queries.js +255 -912
  111. package/dist/db/repo-activity.js +19 -26
  112. package/dist/db/reporting-window.js +56 -0
  113. package/dist/db/retention.js +11 -0
  114. package/dist/db/review-threads-for-review.js +77 -14
  115. package/dist/db/run-migrations.js +5 -20
  116. package/dist/db/schema.sqlite.js +937 -21
  117. package/dist/db/search.js +105 -3
  118. package/dist/db/sequence-diagram-prune.js +54 -0
  119. package/dist/db/setting-event-write.js +29 -0
  120. package/dist/db/sprint-briefs.js +168 -0
  121. package/dist/db/sprint-graph-fold.js +199 -0
  122. package/dist/db/sprint-graph.js +474 -0
  123. package/dist/db/sprint-pass-flights.js +22 -0
  124. package/dist/db/sprint-paths.js +473 -0
  125. package/dist/db/sprint-signals.js +276 -0
  126. package/dist/db/sprint-status-layout.js +443 -0
  127. package/dist/db/sprint-status-settings.js +261 -0
  128. package/dist/db/sprint-store.js +106 -0
  129. package/dist/db/sprint-themes.js +120 -0
  130. package/dist/db/sprint-ticket-checks.js +117 -0
  131. package/dist/db/stories.js +309 -0
  132. package/dist/db/story-criteria.js +175 -0
  133. package/dist/db/story-health-fold.js +21 -0
  134. package/dist/db/story-health.js +219 -0
  135. package/dist/db/story-issue-input.js +155 -0
  136. package/dist/db/story-label-input.js +51 -0
  137. package/dist/db/synthesis-input.js +1 -347
  138. package/dist/db/work-plan.js +3 -0
  139. package/dist/db/working-hours.js +29 -0
  140. package/dist/db/workspace-setting-events.js +52 -0
  141. package/dist/github/client.js +2 -2
  142. package/dist/github/mutations.js +75 -0
  143. package/dist/github/queries.js +5 -0
  144. package/dist/index.js +13 -19
  145. package/dist/merge/arm-intent.js +76 -0
  146. package/dist/merge/auto-merge-runner.js +162 -19
  147. package/dist/merge/dependency-policy.js +381 -0
  148. package/dist/ml/blake2b.js +142 -0
  149. package/dist/ml/decode.js +121 -0
  150. package/dist/ml/local-scorer.js +182 -0
  151. package/dist/ml/markers.js +770 -0
  152. package/dist/ml/model.js +88 -0
  153. package/dist/ml/onnx-head.js +129 -0
  154. package/dist/ml/power.js +59 -0
  155. package/dist/ml/runtime.js +377 -0
  156. package/dist/ml/scorer-process.js +44 -0
  157. package/dist/ml/scorer.js +106 -0
  158. package/dist/ml/throttle.js +34 -0
  159. package/dist/platform/activity-digest/schema.sqlite.js +33 -0
  160. package/dist/platform/advisor/discovery/tier2.js +88 -0
  161. package/dist/platform/advisor/discovery/tier3.js +57 -0
  162. package/dist/platform/advisor/emitters/adapter.js +5 -0
  163. package/dist/platform/advisor/emitters/coderabbit.js +175 -0
  164. package/dist/platform/advisor/emitters/copilot-prose.js +118 -0
  165. package/dist/platform/advisor/emitters/greptile.js +176 -0
  166. package/dist/platform/advisor/emitters/lint.js +37 -0
  167. package/dist/platform/advisor/emitters/manifest.js +239 -0
  168. package/dist/platform/advisor/emitters/prose.js +183 -0
  169. package/dist/platform/advisor/emitters/registry.js +20 -0
  170. package/dist/platform/advisor/emitters/yaml-doc.js +95 -0
  171. package/dist/platform/advisor/evidence.js +79 -0
  172. package/dist/platform/advisor/findings.js +15 -0
  173. package/dist/platform/advisor/intents.js +269 -0
  174. package/dist/platform/advisor/measure/effect.js +18 -0
  175. package/dist/platform/advisor/outputs/brief.js +68 -0
  176. package/dist/platform/advisor/outputs/config-pr.js +156 -0
  177. package/dist/platform/advisor/refine/diff-guard.js +38 -0
  178. package/dist/platform/advisor/refine/refine.js +35 -0
  179. package/dist/platform/advisor/retro-check.js +98 -0
  180. package/dist/platform/advisor/routes.js +648 -0
  181. package/dist/platform/advisor/schema.sqlite.js +107 -0
  182. package/dist/platform/advisor/store.js +321 -0
  183. package/dist/platform/advisor/taxonomy.js +67 -0
  184. package/dist/platform/ai-fix/schema.sqlite.js +32 -0
  185. package/dist/platform/annotations/prompts.js +84 -0
  186. package/dist/platform/annotations/routes.js +86 -0
  187. package/dist/platform/annotations/runner.js +234 -0
  188. package/dist/platform/annotations/schema.sqlite.js +57 -0
  189. package/dist/platform/annotations/targets.js +203 -0
  190. package/dist/platform/bot-themes/build.js +222 -0
  191. package/dist/platform/bot-themes/prompt.js +218 -0
  192. package/dist/platform/bot-themes/routes.js +307 -0
  193. package/dist/platform/bot-themes/schema.sqlite.js +36 -0
  194. package/dist/platform/bots/behaviour-routes.js +65 -0
  195. package/dist/platform/bots/benchmark/anomalies.js +140 -0
  196. package/dist/platform/bots/benchmark/artifact.js +214 -0
  197. package/dist/platform/bots/benchmark/collect.js +571 -0
  198. package/dist/platform/bots/benchmark/cost.js +658 -0
  199. package/dist/platform/bots/benchmark/fold.js +513 -0
  200. package/dist/platform/bots/benchmark/map.js +374 -0
  201. package/dist/platform/bots/benchmark/percentile.js +101 -0
  202. package/dist/platform/bots/benchmark/place.js +184 -0
  203. package/dist/platform/bots/benchmark/placement-routes.js +742 -0
  204. package/dist/platform/bots/benchmark/rollup.js +670 -0
  205. package/dist/platform/bots/benchmark-routes.js +153 -0
  206. package/dist/{pro/bind.js → platform/context.js} +30 -103
  207. package/dist/platform/contract.js +2 -0
  208. package/dist/platform/data/benchmark/benchmark-fit.json +1 -0
  209. package/dist/platform/db.js +51 -0
  210. package/dist/platform/event-hooks.js +36 -0
  211. package/dist/platform/flow-pointers/hash.js +84 -0
  212. package/dist/platform/flow-pointers/prompt.js +244 -0
  213. package/dist/platform/flow-pointers/routes.js +277 -0
  214. package/dist/platform/flow-pointers/schema.sqlite.js +41 -0
  215. package/dist/platform/human-themes/schema.sqlite.js +32 -0
  216. package/dist/platform/index.js +84 -0
  217. package/dist/platform/insights/grounded-figures.js +162 -0
  218. package/dist/platform/insights/period-questions.js +235 -0
  219. package/dist/platform/insights/period-report.js +1871 -0
  220. package/dist/platform/insights/period-routes.js +237 -0
  221. package/dist/platform/insights/period-schema.sqlite.js +112 -0
  222. package/dist/platform/insights/pr-refs.js +107 -0
  223. package/dist/platform/insights/pr-token.js +22 -0
  224. package/dist/platform/insights/routes.js +71 -0
  225. package/dist/platform/insights/schema.sqlite.js +122 -0
  226. package/dist/platform/insights/sprint-report.js +605 -0
  227. package/dist/platform/insights/workspace-request.js +64 -0
  228. package/dist/platform/insights/workspace-scope.js +77 -0
  229. package/dist/platform/llm/gate.js +22 -0
  230. package/dist/platform/llm/seam.js +156 -0
  231. package/dist/platform/migrate.js +15 -0
  232. package/dist/platform/migration-files.js +36 -0
  233. package/dist/platform/migrations/0001_init.sql +23 -0
  234. package/dist/platform/migrations/0002_ai_fix.sql +25 -0
  235. package/dist/platform/migrations/0003_ai_fix_resolve.sql +19 -0
  236. package/dist/platform/migrations/0004_sprint_report.sql +19 -0
  237. package/dist/platform/migrations/0005_pro_settings.sql +26 -0
  238. package/dist/platform/migrations/0006_issue_project_keys.sql +7 -0
  239. package/dist/platform/migrations/0007_comparison_mode.sql +8 -0
  240. package/dist/platform/migrations/0008_retro_report.sql +19 -0
  241. package/dist/platform/migrations/0009_bot_settings.sql +17 -0
  242. package/dist/platform/migrations/0010_team_scope.sql +33 -0
  243. package/dist/platform/migrations/0011_comment_assess.sql +22 -0
  244. package/dist/platform/migrations/0012_resolution_check.sql +23 -0
  245. package/dist/platform/migrations/0013_pinned_prompts.sql +19 -0
  246. package/dist/platform/migrations/0014_bot_themes.sql +24 -0
  247. package/dist/platform/migrations/0015_human_themes.sql +23 -0
  248. package/dist/platform/migrations/0016_sprint_chat_history.sql +24 -0
  249. package/dist/platform/migrations/0017_pr_comment_annotations.sql +63 -0
  250. package/dist/platform/migrations/0018_drop_retro_reports.sql +19 -0
  251. package/dist/platform/migrations/0019_bot_cost_to_account_reviewers.sql +258 -0
  252. package/dist/platform/migrations/0020_workspace_scope_keys.sql +235 -0
  253. package/dist/platform/migrations/0021_bot_advisor.sql +82 -0
  254. package/dist/platform/migrations/0022_annotation_evidence.sql +32 -0
  255. package/dist/platform/migrations/0023_chat_answer_window.sql +30 -0
  256. package/dist/platform/migrations/0024_ai_fix_comment_seed.sql +44 -0
  257. package/dist/platform/migrations/0025_period_reports.sql +100 -0
  258. package/dist/platform/migrations/0026_period_lanes.sql +19 -0
  259. package/dist/platform/migrations/0027_synthesis.sql +57 -0
  260. package/dist/platform/migrations/0028_work_plan.sql +66 -0
  261. package/dist/platform/migrations/0029_workspace_sprint_cadence.sql +73 -0
  262. package/dist/platform/migrations/0030_workspace_slack_targets.sql +127 -0
  263. package/dist/platform/migrations/0031_workspace_issue_tracker.sql +116 -0
  264. package/dist/platform/migrations/0032_workspace_comparison_mode.sql +77 -0
  265. package/dist/platform/migrations/0033_slack_target_bot_digest.sql +47 -0
  266. package/dist/platform/migrations/0034_flow_pointers.sql +32 -0
  267. package/dist/platform/migrations/0035_workspace_jira_api.sql +28 -0
  268. package/dist/platform/migrations/0036_workspace_auto_review.sql +19 -0
  269. package/dist/platform/migrations/0037_auto_review_to_core.sql +31 -0
  270. package/dist/platform/migrations/0038_pr_jira_tickets.sql +13 -0
  271. package/dist/platform/migrations/0039_jira_ticket_peers.sql +8 -0
  272. package/dist/platform/migrations/0040_slack_event_signals.sql +24 -0
  273. package/dist/platform/resolution-check/schema.sqlite.js +35 -0
  274. package/dist/platform/retention.js +157 -0
  275. package/dist/platform/review-assess/schema.sqlite.js +32 -0
  276. package/dist/platform/settings/routes.js +172 -0
  277. package/dist/platform/settings/schema.sqlite.js +259 -0
  278. package/dist/platform/settings/store.js +505 -0
  279. package/dist/platform/slack/cron.js +190 -0
  280. package/dist/platform/slack/format.js +335 -0
  281. package/dist/platform/slack/links.js +124 -0
  282. package/dist/platform/slack/pending-blocks.js +212 -0
  283. package/dist/platform/slack/report.js +224 -0
  284. package/dist/platform/slack/routes.js +127 -0
  285. package/dist/platform/slack/schema.sqlite.js +24 -0
  286. package/dist/platform/slack/send.js +32 -0
  287. package/dist/platform/slack/signals.js +195 -0
  288. package/dist/platform/slack/targets.js +237 -0
  289. package/dist/platform/synthesis/hash.js +44 -0
  290. package/dist/platform/synthesis/prompt.js +110 -0
  291. package/dist/platform/synthesis/routes.js +299 -0
  292. package/dist/platform/synthesis/schema.sqlite.js +47 -0
  293. package/dist/platform/synthesis/scope.js +159 -0
  294. package/dist/platform/themes/resolve.js +90 -0
  295. package/dist/platform/work-plan/hash.js +99 -0
  296. package/dist/platform/work-plan/prompt.js +209 -0
  297. package/dist/platform/work-plan/routes.js +344 -0
  298. package/dist/platform/work-plan/schema.sqlite.js +74 -0
  299. package/dist/pr/detail-enricher.js +5 -3
  300. package/dist/reference-docs/agent.js +332 -0
  301. package/dist/reference-docs/assemble.js +62 -0
  302. package/dist/reference-docs/build-judge.js +130 -0
  303. package/dist/reference-docs/chat-quotes.js +229 -0
  304. package/dist/reference-docs/chat.js +133 -0
  305. package/dist/reference-docs/context.js +61 -0
  306. package/dist/reference-docs/convert.js +177 -0
  307. package/dist/reference-docs/crawl-rank.js +106 -0
  308. package/dist/reference-docs/crawl.js +639 -0
  309. package/dist/reference-docs/library.js +158 -0
  310. package/dist/reference-docs/manager.js +399 -0
  311. package/dist/reference-docs/paths.js +122 -0
  312. package/dist/reference-docs/prompts.js +126 -0
  313. package/dist/reference-docs/render.js +211 -0
  314. package/dist/reference-docs/review-refs.js +256 -0
  315. package/dist/reference-docs/robots.js +127 -0
  316. package/dist/reference-docs/routes.js +488 -0
  317. package/dist/reference-docs/schema.js +31 -0
  318. package/dist/reference-docs/split.js +397 -0
  319. package/dist/reference-docs/startup.js +14 -0
  320. package/dist/reference-docs/store.js +346 -0
  321. package/dist/reference-docs/url-fetch.js +177 -0
  322. package/dist/review/agent-context.js +6 -29
  323. package/dist/review/agent.js +42 -8
  324. package/dist/review/agentic.js +66 -12
  325. package/dist/review/auth.js +27 -59
  326. package/dist/review/chat-agent.js +47 -6
  327. package/dist/review/ci-review/agent.js +5 -1
  328. package/dist/review/ci-review/auto-post.js +221 -0
  329. package/dist/review/ci-review/manager.js +12 -1
  330. package/dist/review/ci-review/persist.js +27 -0
  331. package/dist/review/ci-review/prepare.js +1 -1
  332. package/dist/review/ci-review/prompts.js +5 -3
  333. package/dist/review/ci-review/routes.js +0 -4
  334. package/dist/review/ci-review/schema.js +6 -0
  335. package/dist/review/ci-review/sweep.js +0 -2
  336. package/dist/review/ci-review/with-review.js +37 -0
  337. package/dist/review/claude-review/auto-post.js +481 -71
  338. package/dist/review/claude-review/auto-pushback.js +131 -0
  339. package/dist/review/claude-review/auto-resolve.js +207 -0
  340. package/dist/review/claude-review/auto-settings.js +212 -17
  341. package/dist/review/claude-review/auto.js +104 -10
  342. package/dist/review/claude-review/chat-explain.js +222 -0
  343. package/dist/review/claude-review/chat.js +202 -32
  344. package/dist/review/claude-review/ci-failures.js +154 -34
  345. package/dist/review/claude-review/finding-replies.js +297 -0
  346. package/dist/review/claude-review/finding-thread.js +58 -0
  347. package/dist/review/claude-review/follow-up.js +143 -12
  348. package/dist/review/claude-review/manager.js +138 -24
  349. package/dist/review/claude-review/manual-reply.js +198 -0
  350. package/dist/review/claude-review/persist.js +520 -119
  351. package/dist/review/claude-review/posted-state.js +236 -0
  352. package/dist/review/claude-review/prompts.js +132 -10
  353. package/dist/review/claude-review/reply-text.js +16 -0
  354. package/dist/review/claude-review/routes.js +128 -17
  355. package/dist/review/claude-review/settled-by-reply.js +76 -84
  356. package/dist/review/claude-review/thread-check-agent.js +150 -0
  357. package/dist/review/claude-review/thread-check-persist.js +183 -0
  358. package/dist/review/claude-review/thread-check-routes.js +101 -0
  359. package/dist/review/claude-review/thread-check.js +416 -0
  360. package/dist/review/claude-review/thread-judgements.js +309 -0
  361. package/dist/review/claude-review/threads.js +28 -4
  362. package/dist/review/diagrams/agent.js +175 -0
  363. package/dist/review/diagrams/fingerprint.js +58 -0
  364. package/dist/review/diagrams/manager.js +344 -0
  365. package/dist/review/diagrams/persist.js +253 -0
  366. package/dist/review/diagrams/prompts.js +134 -0
  367. package/dist/review/diagrams/routes.js +192 -0
  368. package/dist/review/diagrams/schema.js +40 -0
  369. package/dist/review/diagrams/trigger.js +160 -0
  370. package/dist/review/diagrams/validate.js +236 -0
  371. package/dist/review/llm.js +64 -31
  372. package/dist/review/path-guard.js +34 -7
  373. package/dist/review/post-review.js +85 -0
  374. package/dist/review/post-seam.js +69 -11
  375. package/dist/review/schema.js +60 -17
  376. package/dist/review/sprint-ask/prompt.js +99 -0
  377. package/dist/review/sprint-ask/routes.js +91 -0
  378. package/dist/review/sprint-briefs/index.js +39 -0
  379. package/dist/review/sprint-briefs/manager.js +191 -0
  380. package/dist/review/sprint-briefs/prompt.js +55 -0
  381. package/dist/review/sprint-briefs/validate.js +96 -0
  382. package/dist/review/sprint-paths/agent.js +176 -0
  383. package/dist/review/sprint-paths/manager.js +113 -0
  384. package/dist/review/sprint-paths/prompt.js +24 -0
  385. package/dist/review/sprint-paths/validate.js +116 -0
  386. package/dist/review/sprint-themes/manager.js +91 -0
  387. package/dist/review/sprint-themes/prompt.js +31 -0
  388. package/dist/review/sprint-themes/validate.js +82 -0
  389. package/dist/review/story-docs/agent.js +159 -0
  390. package/dist/review/story-docs/fingerprint.js +33 -0
  391. package/dist/review/story-docs/inputs.js +100 -0
  392. package/dist/review/story-docs/manager.js +275 -0
  393. package/dist/review/story-docs/persist.js +162 -0
  394. package/dist/review/story-docs/prompts.js +80 -0
  395. package/dist/review/story-docs/routes.js +98 -0
  396. package/dist/review/story-docs/schema.js +46 -0
  397. package/dist/review/story-docs/shortlist.js +202 -0
  398. package/dist/review/story-docs/validate.js +266 -0
  399. package/dist/review/story-labels/manager.js +271 -0
  400. package/dist/review/story-labels/prompt.js +70 -0
  401. package/dist/review/story-labels/routes.js +70 -0
  402. package/dist/review/story-labels/validate.js +198 -0
  403. package/dist/review/submit-map.js +3 -0
  404. package/dist/review/ticket-review/agent.js +10 -4
  405. package/dist/review/ticket-review/auto-post.js +31 -38
  406. package/dist/review/ticket-review/manager.js +29 -2
  407. package/dist/review/ticket-review/post-item.js +187 -104
  408. package/dist/review/ticket-review/prepass.js +5 -1
  409. package/dist/review/ticket-review/prompts.js +9 -0
  410. package/dist/review/ticket-review/routes.js +25 -20
  411. package/dist/review/ticket-review/schema.js +10 -3
  412. package/dist/review/ticket-review/sprint-checks.js +131 -0
  413. package/dist/review/ticket-review/sweep.js +0 -2
  414. package/dist/shared/activity-windows.js +8 -0
  415. package/dist/shared/blast-radius.js +207 -0
  416. package/dist/shared/claude-review.js +17 -2
  417. package/dist/shared/conflict-ai.js +24 -0
  418. package/dist/shared/conflicts.js +3 -0
  419. package/dist/shared/dependency-merge.js +21 -0
  420. package/dist/shared/flow-settings.js +1 -1
  421. package/dist/shared/flow-trend.js +26 -0
  422. package/dist/shared/index.js +21 -0
  423. package/dist/shared/pending-rules.js +40 -5
  424. package/dist/shared/reference-docs-quote.js +144 -0
  425. package/dist/shared/reference-docs.js +124 -0
  426. package/dist/shared/reporting-window.js +30 -0
  427. package/dist/shared/sequence-diagrams.js +54 -0
  428. package/dist/shared/sonar.js +144 -0
  429. package/dist/shared/sprint-graph.js +193 -0
  430. package/dist/shared/sprint-lanes.js +36 -0
  431. package/dist/shared/sprint-members.js +87 -0
  432. package/dist/shared/sprint-stories.js +190 -0
  433. package/dist/shared/stories.js +10 -0
  434. package/dist/shared/story-docs-alignment.js +210 -0
  435. package/dist/shared/story-health.js +114 -0
  436. package/dist/shared/story-issues.js +358 -0
  437. package/dist/shared/story-rules.js +134 -0
  438. package/dist/shared/ticket-prs.js +21 -0
  439. package/dist/shared/ticket-refs.js +169 -0
  440. package/dist/shared/types.js +44 -34
  441. package/dist/sonar/client.js +68 -0
  442. package/dist/sonar/comment.js +245 -0
  443. package/dist/sonar/gather.js +571 -0
  444. package/dist/sonar/index.js +17 -0
  445. package/dist/sonar/post.js +195 -0
  446. package/dist/sonar/routes.js +209 -0
  447. package/dist/sonar/settings.js +161 -0
  448. package/dist/sonar/snapshot.js +127 -0
  449. package/dist/sonar/store.js +111 -0
  450. package/dist/sync/auth-notices.js +3 -5
  451. package/dist/sync/bot-detection.js +1 -1
  452. package/dist/sync/branch-status.js +5 -6
  453. package/dist/sync/hydrate-detail.js +3 -3
  454. package/dist/sync/mention-scan.js +2 -9
  455. package/dist/sync/merge-notice.js +56 -0
  456. package/dist/sync/ml-enrichment.js +23 -15
  457. package/dist/sync/reviewer-classify.js +1 -1
  458. package/dist/sync/scheduler.js +8 -17
  459. package/dist/sync/sync-manager.js +3 -17
  460. package/dist/sync/upsert.js +10 -0
  461. package/dist/tracker/calls.js +3 -1
  462. package/dist/tracker/dates-backfill.js +96 -0
  463. package/dist/tracker/dates.js +31 -0
  464. package/dist/tracker/enricher.js +79 -11
  465. package/dist/tracker/github/issues-usage.js +195 -0
  466. package/dist/tracker/github/reader.js +25 -0
  467. package/dist/tracker/index.js +28 -1
  468. package/dist/tracker/jira/client.js +66 -1
  469. package/dist/tracker/jira/fetch.js +35 -4
  470. package/dist/tracker/jira/text.js +6 -0
  471. package/dist/tracker/legacy-import.js +5 -25
  472. package/dist/tracker/linear/client.js +65 -11
  473. package/dist/tracker/links.js +3 -3
  474. package/dist/tracker/manual-links.js +340 -0
  475. package/dist/tracker/routes.js +19 -3
  476. package/dist/tracker/runtime.js +4 -6
  477. package/dist/tracker/settings.js +90 -8
  478. package/dist/tracker/sprint/github.js +201 -0
  479. package/dist/tracker/sprint/hooks.js +42 -0
  480. package/dist/tracker/sprint/index.js +33 -0
  481. package/dist/tracker/sprint/jira.js +378 -0
  482. package/dist/tracker/sprint/linear.js +217 -0
  483. package/dist/tracker/sprint/project-keys.js +49 -0
  484. package/dist/tracker/sprint/read.js +436 -0
  485. package/dist/tracker/sprint/ref-status.js +283 -0
  486. package/dist/tracker/sprint/routes.js +36 -0
  487. package/dist/tracker/sprint/types.js +29 -0
  488. package/dist/tracker/store.js +12 -1
  489. package/dist/tracker/stories.js +0 -1
  490. package/dist/tracker/ticket-prs.js +120 -0
  491. package/dist/tracker/worker.js +77 -11
  492. package/package.json +50 -10
  493. package/public/assets/AiFixTab-BRFh4rBA.js +3 -0
  494. package/public/assets/ClaudeReviewTab-D2GE3Lpe.js +20 -0
  495. package/public/assets/PrBotBehaviourTab-CEBLkCG5.js +1 -0
  496. package/public/assets/{highlight-CIIZLa6Z.js → highlight-DIEV0qGG.js} +1 -1
  497. package/public/assets/index-hgG9aujx.css +1 -0
  498. package/public/assets/index-jmnLc1R-.js +79 -0
  499. package/public/assets/{markdown-I_JLLVAZ.js → markdown-CcoLFczy.js} +1 -1
  500. package/public/assets/tanstack-BnbsafB1.js +17 -0
  501. package/public/index.html +5 -5
  502. package/dist/api/routes/auth.js +0 -194
  503. package/dist/api/routes/billing.js +0 -209
  504. package/dist/api/routes/contact.js +0 -318
  505. package/dist/api/routes/mentions.js +0 -22
  506. package/dist/api/routes/webhooks.js +0 -181
  507. package/dist/db/automation-output.js +0 -349
  508. package/dist/db/credits.js +0 -79
  509. package/dist/db/migrations-pg/0000_tired_alex_power.sql +0 -268
  510. package/dist/db/migrations-pg/0001_dizzy_mockingbird.sql +0 -3
  511. package/dist/db/migrations-pg/0002_glorious_ikaris.sql +0 -4
  512. package/dist/db/migrations-pg/0003_melted_secret_warriors.sql +0 -2
  513. package/dist/db/migrations-pg/0004_numerous_triton.sql +0 -1
  514. package/dist/db/migrations-pg/0005_thick_blockbuster.sql +0 -2
  515. package/dist/db/migrations-pg/0006_majestic_dracula.sql +0 -1
  516. package/dist/db/migrations-pg/0007_same_human_torch.sql +0 -2
  517. package/dist/db/migrations-pg/0008_slimy_toxin.sql +0 -1
  518. package/dist/db/migrations-pg/0009_fuzzy_jubilee.sql +0 -4
  519. package/dist/db/migrations-pg/0010_late_hammerhead.sql +0 -1
  520. package/dist/db/migrations-pg/0011_happy_leech.sql +0 -16
  521. package/dist/db/migrations-pg/0012_woozy_captain_midlands.sql +0 -16
  522. package/dist/db/migrations-pg/0013_yielding_nicolaos.sql +0 -1
  523. package/dist/db/migrations-pg/0014_wakeful_bill_hollister.sql +0 -2
  524. package/dist/db/migrations-pg/0015_aspiring_black_tom.sql +0 -1
  525. package/dist/db/migrations-pg/0016_cute_ghost_rider.sql +0 -30
  526. package/dist/db/migrations-pg/0017_far_changeling.sql +0 -24
  527. package/dist/db/migrations-pg/0018_fancy_miss_america.sql +0 -1
  528. package/dist/db/migrations-pg/0019_benchmark_contributions.sql +0 -22
  529. package/dist/db/migrations-pg/0020_majestic_edwin_jarvis.sql +0 -3
  530. package/dist/db/migrations-pg/0021_green_salo.sql +0 -1
  531. package/dist/db/migrations-pg/0022_wise_baron_strucker.sql +0 -1
  532. package/dist/db/migrations-pg/0023_search_index.sql +0 -19
  533. package/dist/db/migrations-pg/0024_author_indexes.sql +0 -9
  534. package/dist/db/migrations-pg/0025_auto_merge_requests.sql +0 -26
  535. package/dist/db/migrations-pg/0026_branch_status.sql +0 -32
  536. package/dist/db/migrations-pg/0027_pr_review_decision.sql +0 -5
  537. package/dist/db/migrations-pg/0028_branch_commit_detail.sql +0 -9
  538. package/dist/db/migrations-pg/0029_repo_reviewers.sql +0 -127
  539. package/dist/db/migrations-pg/0030_account_reviewers.sql +0 -77
  540. package/dist/db/migrations-pg/0031_workspaces.sql +0 -131
  541. package/dist/db/migrations-pg/0032_workspace_reviewers.sql +0 -165
  542. package/dist/db/migrations-pg/0033_drop_inbox_watch.sql +0 -14
  543. package/dist/db/migrations-pg/0034_ml_comment_labels.sql +0 -33
  544. package/dist/db/migrations-pg/0035_ml_vendor_severity.sql +0 -16
  545. package/dist/db/migrations-pg/0036_seat_pricing_repo_description.sql +0 -12
  546. package/dist/db/migrations-pg/0037_users_app_slug.sql +0 -9
  547. package/dist/db/migrations-pg/0038_auto_merge_queue.sql +0 -10
  548. package/dist/db/migrations-pg/0039_trunk_ci_status_events.sql +0 -27
  549. package/dist/db/migrations-pg/0040_automation_roles.sql +0 -63
  550. package/dist/db/migrations-pg/0041_automation_vendor_kinds.sql +0 -488
  551. package/dist/db/migrations-pg/0042_auto_merge_phase.sql +0 -8
  552. package/dist/db/migrations-pg/0043_pr_mentions.sql +0 -19
  553. package/dist/db/migrations-pg/0044_large_pr_threshold.sql +0 -6
  554. package/dist/db/migrations-pg/0045_pending_mute.sql +0 -26
  555. package/dist/db/migrations-pg/0046_merge_queue_state.sql +0 -18
  556. package/dist/db/migrations-pg/0047_drop_my_turn_dismissals.sql +0 -21
  557. package/dist/db/migrations-pg/0048_auto_merge_durable_anchors.sql +0 -27
  558. package/dist/db/migrations-pg/0049_blast_radius_config.sql +0 -8
  559. package/dist/db/migrations-pg/0050_repo_file_coupling.sql +0 -13
  560. package/dist/db/migrations-pg/0051_pr_content_kind.sql +0 -6
  561. package/dist/db/migrations-pg/0052_workspace_flow_settings.sql +0 -4
  562. package/dist/db/migrations-pg/0053_review_request_events.sql +0 -18
  563. package/dist/db/migrations-pg/0054_pr_security_signals.sql +0 -59
  564. package/dist/db/migrations-pg/0055_my_turn_settings.sql +0 -6
  565. package/dist/db/migrations-pg/0056_my_turn_dismissals.sql +0 -21
  566. package/dist/db/migrations-pg/0057_claude_review_follow_up_ticket.sql +0 -8
  567. package/dist/db/migrations-pg/0058_claude_review_trigger.sql +0 -4
  568. package/dist/db/migrations-pg/0059_commit_message_headline.sql +0 -3
  569. package/dist/db/migrations-pg/0060_claude_review_chat.sql +0 -24
  570. package/dist/db/migrations-pg/0061_adopt_agentic_tables.sql +0 -79
  571. package/dist/db/migrations-pg/0062_review_lens_drop_learnings.sql +0 -5
  572. package/dist/db/migrations-pg/0063_claude_review_threads.sql +0 -7
  573. package/dist/db/migrations-pg/0064_claude_review_ci_failures.sql +0 -4
  574. package/dist/db/migrations-pg/0065_ai_fix_change_report.sql +0 -9
  575. package/dist/db/migrations-pg/0066_claude_finding_story.sql +0 -7
  576. package/dist/db/migrations-pg/0067_ticket_reviews.sql +0 -79
  577. package/dist/db/migrations-pg/0068_review_request_requester.sql +0 -14
  578. package/dist/db/migrations-pg/0069_ci_reviews.sql +0 -65
  579. package/dist/db/migrations-pg/0070_workspace_auto_fix.sql +0 -3
  580. package/dist/db/migrations-pg/0071_auto_fix_off_by_default.sql +0 -5
  581. package/dist/db/migrations-pg/0072_auto_review_daily_cap.sql +0 -3
  582. package/dist/db/migrations-pg/0073_ticket_review_pr_cards.sql +0 -17
  583. package/dist/db/migrations-pg/0074_auto_post.sql +0 -14
  584. package/dist/db/migrations-pg/0075_issue_tracker.sql +0 -77
  585. package/dist/db/migrations-pg/0076_github_issue_links.sql +0 -6
  586. package/dist/db/migrations-pg/0077_linear_links.sql +0 -8
  587. package/dist/db/migrations-pg/meta/0000_snapshot.json +0 -2137
  588. package/dist/db/migrations-pg/meta/0001_snapshot.json +0 -2143
  589. package/dist/db/migrations-pg/meta/0002_snapshot.json +0 -2170
  590. package/dist/db/migrations-pg/meta/0003_snapshot.json +0 -2182
  591. package/dist/db/migrations-pg/meta/0004_snapshot.json +0 -2188
  592. package/dist/db/migrations-pg/meta/0005_snapshot.json +0 -2201
  593. package/dist/db/migrations-pg/meta/0006_snapshot.json +0 -2207
  594. package/dist/db/migrations-pg/meta/0007_snapshot.json +0 -2219
  595. package/dist/db/migrations-pg/meta/0008_snapshot.json +0 -2226
  596. package/dist/db/migrations-pg/meta/0009_snapshot.json +0 -2250
  597. package/dist/db/migrations-pg/meta/0010_snapshot.json +0 -2256
  598. package/dist/db/migrations-pg/meta/0011_snapshot.json +0 -2412
  599. package/dist/db/migrations-pg/meta/0012_snapshot.json +0 -2528
  600. package/dist/db/migrations-pg/meta/0013_snapshot.json +0 -2534
  601. package/dist/db/migrations-pg/meta/0014_snapshot.json +0 -2547
  602. package/dist/db/migrations-pg/meta/0015_snapshot.json +0 -2553
  603. package/dist/db/migrations-pg/meta/0016_snapshot.json +0 -2774
  604. package/dist/db/migrations-pg/meta/0017_snapshot.json +0 -2999
  605. package/dist/db/migrations-pg/meta/0018_snapshot.json +0 -3020
  606. package/dist/db/migrations-pg/meta/0020_snapshot.json +0 -3228
  607. package/dist/db/migrations-pg/meta/0021_snapshot.json +0 -3234
  608. package/dist/db/migrations-pg/meta/0022_snapshot.json +0 -3240
  609. package/dist/db/migrations-pg/meta/_journal.json +0 -552
  610. package/dist/db/schema.pg.js +0 -1549
  611. package/dist/pro/contract.js +0 -36
  612. package/dist/pro/migrate.js +0 -64
  613. package/dist/sync/benchmark-rollup.js +0 -50
  614. package/public/assets/AiFixTab-Cq2Wdm2l.js +0 -2
  615. package/public/assets/ClaudeReviewTab-C6WftwSM.js +0 -16
  616. package/public/assets/PrBotBehaviourTab-CY_iLmFp.js +0 -1
  617. package/public/assets/index-CB6bLAqG.js +0 -77
  618. package/public/assets/index-gwxOLty-.css +0 -1
  619. package/public/assets/tanstack-5qsxxaLe.js +0 -17
  620. package/public-landing/apple-touch-icon.png +0 -0
  621. package/public-landing/assets/archivo-latin-500-BWmvx2Mg.woff2 +0 -0
  622. package/public-landing/assets/archivo-latin-600-BN-JkNrl.woff2 +0 -0
  623. package/public-landing/assets/index-CA3eEGXO.js +0 -40
  624. package/public-landing/assets/index-naQrQ6Fe.css +0 -1
  625. package/public-landing/assets/jetbrains-mono-latin-400-RruCX7RW.woff2 +0 -0
  626. package/public-landing/assets/newsreader-latin-400-DExrRRrN.woff2 +0 -0
  627. package/public-landing/assets/newsreader-latin-400-italic-b0I-AwbV.woff2 +0 -0
  628. package/public-landing/bots/index.html +0 -156
  629. package/public-landing/contact/index.html +0 -156
  630. package/public-landing/cookies/index.html +0 -156
  631. package/public-landing/demo/limn-walkthrough-poster.jpg +0 -0
  632. package/public-landing/demo/limn-walkthrough.cues.json +0 -44
  633. package/public-landing/demo/limn-walkthrough.mp4 +0 -0
  634. package/public-landing/favicon-16.png +0 -0
  635. package/public-landing/favicon-32.png +0 -0
  636. package/public-landing/favicon-48.png +0 -0
  637. package/public-landing/favicon.svg +0 -5
  638. package/public-landing/features/index.html +0 -156
  639. package/public-landing/for-developers/index.html +0 -156
  640. package/public-landing/for-managers/index.html +0 -156
  641. package/public-landing/how-it-works/index.html +0 -156
  642. package/public-landing/how-we-measure/index.html +0 -156
  643. package/public-landing/icon-192.png +0 -0
  644. package/public-landing/icon-512.png +0 -0
  645. package/public-landing/index.html +0 -156
  646. package/public-landing/insights/index.html +0 -156
  647. package/public-landing/og-image.png +0 -0
  648. package/public-landing/pricing/index.html +0 -156
  649. package/public-landing/privacy/index.html +0 -156
  650. package/public-landing/pro/index.html +0 -156
  651. package/public-landing/reviews/index.html +0 -156
  652. package/public-landing/robots.txt +0 -8
  653. package/public-landing/shots/benchmark.png +0 -0
  654. package/public-landing/shots/bot-roi.png +0 -0
  655. package/public-landing/shots/bot-settings.png +0 -0
  656. package/public-landing/shots/chronology.png +0 -0
  657. package/public-landing/shots/feed.png +0 -0
  658. package/public-landing/shots/flow-metrics.png +0 -0
  659. package/public-landing/shots/free-reports.png +0 -0
  660. package/public-landing/shots/pending-board.png +0 -0
  661. package/public-landing/shots/pending-card.png +0 -0
  662. package/public-landing/shots/period-report.png +0 -0
  663. package/public-landing/shots/pr-detail.png +0 -0
  664. package/public-landing/shots/pr-threads.png +0 -0
  665. package/public-landing/shots/reach.png +0 -0
  666. package/public-landing/shots/repo-rows.png +0 -0
  667. package/public-landing/shots/severity-findings.png +0 -0
  668. package/public-landing/shots/severity-strip.png +0 -0
  669. package/public-landing/site.webmanifest +0 -14
  670. package/public-landing/sitemap.xml +0 -51
  671. package/public-landing/terms/index.html +0 -156
package/LICENSE CHANGED
@@ -1,110 +1,127 @@
1
- # Functional Source License, Version 1.1, MIT Future License
1
+ # Limn License 1.0
2
2
 
3
- ## Abbreviation
3
+ Copyright 2026 Alex Wakeman
4
4
 
5
- FSL-1.1-MIT
5
+ ## 1. Acceptance
6
6
 
7
- ## Notice
7
+ In order to get any license under these terms, you must agree to them as both
8
+ strict obligations and conditions to all your licenses.
8
9
 
9
- Copyright 2026 Alex Wakeman
10
+ ## 2. Copyright License
11
+
12
+ The licensor grants you a copyright license for the software to do everything
13
+ you might do with the software that would otherwise infringe the licensor's
14
+ copyright in it for any permitted purpose. However, you may only distribute the
15
+ software according to section 5 (Distribution License) and make changes or new
16
+ works based on the software according to section 6 (Changes and New Works
17
+ License).
18
+
19
+ ## 3. Permitted Purposes
10
20
 
11
- ## Terms and Conditions
21
+ Any purpose is a permitted purpose for:
12
22
 
13
- ### Licensor ("We")
23
+ (a) an individual using the software for themselves; and
14
24
 
15
- The party offering the Software under these Terms and Conditions.
25
+ (b) an organization in which no more than three (3) individuals use the
26
+ software, counting the organization together with all of its affiliates.
16
27
 
17
- ### The Software
28
+ Any other use, including use within an organization in which more than three
29
+ (3) individuals use the software, is not a permitted purpose. That use needs a
30
+ separate commercial license from the licensor, which you can ask for through
31
+ the contact form at https://limn-review.com/contact.
18
32
 
19
- The "Software" is each version of the software that we make available under
20
- these Terms and Conditions, as indicated by our inclusion of these Terms and
21
- Conditions with the Software.
33
+ ## 4. No Competing Use
22
34
 
23
- ### License Grant
35
+ No purpose is a permitted purpose if it is a competing use. A competing use is
36
+ making the software, or any product or service substantially similar to it or
37
+ built from it, available to others as a commercial product or service, whether
38
+ as installable software, a hosted service or any other form.
24
39
 
25
- Subject to your compliance with this License Grant and the Patents,
26
- Redistribution and Trademark clauses below, we hereby grant you the right to
27
- use, copy, modify, create derivative works, publicly perform, publicly display
28
- and redistribute the Software for any Permitted Purpose identified below.
40
+ ## 5. Distribution License
29
41
 
30
- ### Permitted Purpose
42
+ The licensor grants you an additional copyright license to distribute copies of
43
+ the software. Your license to distribute covers distributing the software with
44
+ changes and new works permitted by section 6 (Changes and New Works License).
31
45
 
32
- A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
33
- means making the Software available to others in a commercial product or
34
- service that:
46
+ ## 6. Changes and New Works License
35
47
 
36
- 1. substitutes for the Software;
48
+ The licensor grants you an additional copyright license to make changes and new
49
+ works based on the software for any permitted purpose.
37
50
 
38
- 2. substitutes for any other product or service we offer using the Software
39
- that exists as of the date we make the Software available; or
51
+ ## 7. Notices
40
52
 
41
- 3. offers the same or substantially similar functionality as the Software.
53
+ You must ensure that anyone who gets a copy of any part of the software from
54
+ you also gets a copy of these terms, together with the copyright notice above.
55
+ Anyone who gets a copy from you gets it under these terms only, and no other
56
+ terms. If you modify the software, you must include in any modified copies of
57
+ the software a prominent notice stating that you have modified the software.
42
58
 
43
- Permitted Purposes specifically include using the Software:
59
+ ## 8. Patent License
44
60
 
45
- 1. for your internal use and access;
61
+ The licensor grants you a patent license for the software that covers patent
62
+ claims the licensor can license, or becomes able to license, that you would
63
+ infringe by using the software for a permitted purpose.
46
64
 
47
- 2. for non-commercial education;
65
+ ## 9. Fair Use
48
66
 
49
- 3. for non-commercial research; and
67
+ You may have "fair use" rights for the software under the law. These terms do
68
+ not limit them.
50
69
 
51
- 4. in connection with professional services that you provide to a licensee
52
- using the Software in accordance with these Terms and Conditions.
70
+ ## 10. No Other Rights
53
71
 
54
- ### Patents
72
+ These terms do not allow you to sublicense or transfer any of your licenses to
73
+ anyone else, or prevent the licensor from granting licenses to anyone else.
74
+ These terms do not imply any other licenses. The licensor will not convert
75
+ these terms, or any version of the software released under them, to the MIT
76
+ License or to any other license by the passing of time.
55
77
 
56
- To the extent your use for a Permitted Purpose would necessarily infringe our
57
- patents, the license grant above includes a license under our patents. If you
58
- make a claim against any party that the Software infringes or contributes to
59
- the infringement of any patent, then your patent license to the Software ends
60
- immediately.
78
+ ## 11. Patent Defense
61
79
 
62
- ### Redistribution
80
+ If you make any written claim that the software infringes or contributes to
81
+ infringement of any patent, your patent license for the software granted under
82
+ these terms ends immediately. If your company makes such a claim, your patent
83
+ license ends immediately for work on behalf of your company.
63
84
 
64
- The Terms and Conditions apply to all copies, modifications and derivatives of
65
- the Software.
85
+ ## 12. Violations
66
86
 
67
- If you redistribute any copies, modifications or derivatives of the Software,
68
- you must include a copy of or a link to these Terms and Conditions and not
69
- remove any copyright notices provided in or with the Software.
87
+ The first time you are notified in writing that you have violated any of these
88
+ terms, or done anything with the software not covered by your licenses, your
89
+ licenses can nonetheless continue if you come into full compliance with these
90
+ terms, and take practical steps to correct past violations, within 32 days of
91
+ receiving notice. Otherwise, all your licenses end immediately.
70
92
 
71
- ### Disclaimer
93
+ ## 13. No Liability
72
94
 
73
- THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
74
- IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
75
- PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
95
+ ***As far as the law allows, the software comes as is, without any warranty or
96
+ condition, and the licensor will not be liable to you for any damages arising
97
+ out of these terms or the use or nature of the software, under any kind of
98
+ legal claim.***
76
99
 
77
- IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
78
- SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
79
- EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
100
+ ## 14. Definitions
80
101
 
81
- ### Trademarks
102
+ The **licensor** is Alex Wakeman, the individual offering these terms, and the
103
+ **software** is the software the licensor makes available under these terms,
104
+ including any version of it.
82
105
 
83
- Except for displaying the License Details and identifying us as the origin of
84
- the Software, you have no right under these Terms and Conditions to use our
85
- trademarks, trade names, service marks or product names.
106
+ **You** refers to the individual or entity agreeing to these terms.
86
107
 
87
- ## Grant of Future License
108
+ **Your company** is any legal entity, sole proprietorship, or other kind of
109
+ organization that you work for, plus all organizations that have control over,
110
+ are under the control of, or are under common control with that organization.
88
111
 
89
- We hereby irrevocably grant you an additional license to use the Software under
90
- the MIT license that is effective on the second anniversary of the date we make
91
- the Software available. On or after that date, you may use the Software under
92
- the MIT license, in which case the following will apply:
112
+ An **organization** includes any company, firm, partnership, government body,
113
+ charity, team or other group of people working together, and **affiliates** of
114
+ an organization are all organizations that have control over, are under the
115
+ control of, or are under common control with it. **Control** means ownership of
116
+ substantially all the assets of an entity, or the power to direct its
117
+ management and policies by vote, contract, or otherwise. Control can be direct
118
+ or indirect.
93
119
 
94
- Permission is hereby granted, free of charge, to any person obtaining a copy of
95
- this software and associated documentation files (the "Software"), to deal in
96
- the Software without restriction, including without limitation the rights to
97
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
98
- of the Software, and to permit persons to whom the Software is furnished to do
99
- so, subject to the following conditions:
120
+ An individual **uses** the software within an organization if they run it, or
121
+ work with it directly, in the course of their work for, or on behalf of, that
122
+ organization.
100
123
 
101
- The above copyright notice and this permission notice shall be included in all
102
- copies or substantial portions of the Software.
124
+ **Your licenses** are all the licenses granted to you for the software under
125
+ these terms.
103
126
 
104
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
105
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
106
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
107
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
108
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
109
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
110
- SOFTWARE.
127
+ **Use** means anything you do with the software requiring one of your licenses.
package/README.md CHANGED
@@ -9,6 +9,12 @@ There's no hosted backend, no database server, and no stored credentials. It
9
9
  authenticates by shelling out to your already-logged-in `gh` CLI, syncs activity
10
10
  into a local SQLite file, and serves the dashboard from a single local process.
11
11
 
12
+ **100% free.** Every feature, no paid tier, no sign-up (see [License](#license)
13
+ for the one limit, on large organisations).
14
+
15
+ **Try it first:** the [live demo](https://limn-review.com/demo/) is the real
16
+ app on sample data, in your browser. No install, no sign-in.
17
+
12
18
  > **Renamed.** This package used to be `pierre-review`. The command is now `limn`
13
19
  > (the `pierre-review` package now only forwards to this one, and says so). On first start, an existing
14
20
  > `~/.pierre-review` is moved to `~/.limn` — your database, settings and clones
@@ -32,9 +38,11 @@ limn
32
38
  ## Review and fix with Claude — free, on your own Claude
33
39
 
34
40
  Claude Review (a code review of any PR, follow-ups, a check against a user
35
- story you paste, and a chat about the review) and AI Fix are free. They run on
36
- your own Claude Code or Anthropic API key: sign in to Claude Code, or set
37
- `ANTHROPIC_API_KEY`. Limn stores no key and charges nothing for it.
41
+ story you paste, and a chat about the review) and AI Fix are free. By default
42
+ they use your local Claude Code login: if you are signed in to Claude Code,
43
+ there is nothing to set up. An Anthropic API key is the alternative: set
44
+ `ANTHROPIC_API_KEY`. Limn stores no key and charges nothing for it. Codex
45
+ support is coming soon.
38
46
 
39
47
  - **First use downloads the AI runtime, once (about 110 MB).** Press
40
48
  **Set up AI** in the app, or run `limn ai install`. It goes to
@@ -45,6 +53,8 @@ your own Claude Code or Anthropic API key: sign in to Claude Code, or set
45
53
  - The reviewer reads code. It cannot edit files, run commands or reach the web.
46
54
  - The fixer edits files. It has no shell, and builds and tests nothing.
47
55
  - Nothing is posted or pushed until you press the button.
56
+ - `LIMN_AI_USE_API_KEY=true` uses `ANTHROPIC_API_KEY` even when you are signed
57
+ in to Claude Code.
48
58
  - `LIMN_AI_DISABLED=true` turns every AI feature off.
49
59
 
50
60
  ## Prerequisites
@@ -125,9 +135,11 @@ locally instead — a larger database, but PR detail then works fully offline.
125
135
 
126
136
  ## License
127
137
 
128
- Source-available under the **Functional Source License (FSL-1.1-MIT)** — see
129
- [LICENSE](./LICENSE). You may use, self-host, and modify Limn freely; you may
130
- **not** offer it as a competing commercial or hosted product. Each release
131
- automatically converts to the **MIT License** two years after its publication.
138
+ Source-available under the **Limn License 1.0** — see [LICENSE](./LICENSE).
139
+ Limn is free for individuals, and for organisations where no more than 3 people
140
+ use it (affiliates count together). More users than that need a licence — ask
141
+ through the [contact form](https://limn-review.com/contact?topic=licence). You may
142
+ **not** offer Limn, or a product built from it, as a competing commercial
143
+ product or service.
132
144
  The AI runtime Limn downloads on first use is Anthropic's, under Anthropic's own
133
145
  terms; it is not part of this package.
@@ -0,0 +1,21 @@
1
+ # Third-party notices
2
+
3
+ Limn includes material from the projects below. Each is used under the licence shown.
4
+
5
+ ## Material Icon Theme
6
+
7
+ The file-type icons in the Changes tab (`apps/frontend/src/components/FileTypeIcons.tsx`) are
8
+ copied from Material Icon Theme by Material Extensions, npm `material-icon-theme@5.39.0`.
9
+
10
+ Source: https://github.com/material-extensions/vscode-material-icon-theme
11
+
12
+ ```
13
+ The MIT License (MIT)
14
+ Copyright (c) 2025 Material Extensions
15
+
16
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
19
+
20
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+ ```
@@ -0,0 +1,45 @@
1
+ // AGENT ISOLATION — every Agent SDK run in this app sees ONLY the tools it registered itself.
2
+ //
3
+ // ⚠ MEASURED (2026-10-10): a run on the reader's ambient Claude Code login, with `tools: []`,
4
+ // `settingSources: []` and `bypassPermissions`, still lists the ACCOUNT'S claude.ai CONNECTORS
5
+ // (`mcp__claude_ai_Claude_Docs__create/update/delete/export`, …) a few seconds after start — they
6
+ // connect after `system/init`, so the init message shows none. A trial agent wrote a report into the
7
+ // user's Claude Docs unprompted. Claude Review reads PR text strangers write, so a prompt injection
8
+ // could create, edit or delete documents in the reader's claude.ai account. `strictMcpConfig: true`
9
+ // removes them (measured: 8 connector tools → 0); the PreToolUse hook below is the backstop that
10
+ // refuses any `mcp__` tool whose server the run did not register, and its deny holds under
11
+ // bypassPermissions (the path guard relies on the same property).
12
+ //
13
+ // EVERY `query({ options })` spreads `ISOLATED_MCP` and adds `ownToolsOnlyHook(<its server names>)`
14
+ // to `PreToolUse` — pinned by agent-isolation.test.ts, which reads every call site.
15
+ export const ISOLATED_MCP = { strictMcpConfig: true };
16
+ /** The MCP server a tool name belongs to (`mcp__<server>__<tool>`), or null for a built-in tool. */
17
+ export function mcpServerOf(toolName) {
18
+ if (!toolName.startsWith('mcp__'))
19
+ return null;
20
+ const rest = toolName.slice('mcp__'.length);
21
+ const cut = rest.indexOf('__');
22
+ return cut < 0 ? rest : rest.slice(0, cut);
23
+ }
24
+ /** True when `toolName` is an MCP tool from a server this run did not register. */
25
+ export function isForeignMcpTool(toolName, ownServers) {
26
+ const server = mcpServerOf(toolName);
27
+ return server != null && !ownServers.includes(server);
28
+ }
29
+ /** One SDK PreToolUse matcher entry refusing every MCP tool outside `ownServers`. */
30
+ export function ownToolsOnlyHook(ownServers) {
31
+ return {
32
+ hooks: [
33
+ async (input) => input.hook_event_name === 'PreToolUse' && isForeignMcpTool(input.tool_name ?? '', ownServers)
34
+ ? {
35
+ hookSpecificOutput: {
36
+ hookEventName: 'PreToolUse',
37
+ permissionDecision: 'deny',
38
+ permissionDecisionReason: `${input.tool_name} is not available in this run.`,
39
+ },
40
+ }
41
+ : { continue: true },
42
+ ],
43
+ };
44
+ }
45
+ //# sourceMappingURL=agent-isolation.js.map
@@ -0,0 +1,113 @@
1
+ // THE ONE CREDENTIAL LADDER for every model call Limn makes — the agentic runs (Claude Review, AI
2
+ // Fix, the ticket / CI reviews, diagrams, sprint paths, the docs build and chat, resolve with
3
+ // Claude, every chat) AND the one-shot completions (review/llm.ts `cheapComplete`, which the
4
+ // sprint briefs/themes, story labels, docs ranking, sprint Ask Claude and every platform feature —
5
+ // reports, synthesis, work-plan wording, pointers, bot themes, the impact note, the advisor's
6
+ // refine, the Slack report — all go through).
7
+ //
8
+ // 1. THE LOCAL CLAUDE CODE LOGIN (default) — a `claude` session on disk or
9
+ // CLAUDE_CODE_OAUTH_TOKEN, used through the Agent SDK. Any ANTHROPIC_API_KEY in the
10
+ // environment is HIDDEN from that run, or the SDK would prefer it and silently meter it.
11
+ // 2. ANTHROPIC_API_KEY from the environment — the alternative when there is no login. Agent runs
12
+ // hand it to the Agent SDK; one-shot completions call the Anthropic API directly with it
13
+ // (the SDK loaded through ai/runtime.ts `loadAnthropicSdk`, never imported here).
14
+ //
15
+ // LIMN_AI_USE_API_KEY=true flips the order when a key is set: the key first, the login ignored.
16
+ // LIMN_AI_DISABLED=true (config.aiEnabled) turns every model call off; that switch is checked by
17
+ // the callers, not here, because this module answers only "which credential", never "may we".
18
+ //
19
+ // Nothing is stored. Detection of the login reads the disk (a credentials file, or `oauthAccount`
20
+ // recorded in the Claude config — see hasClaudeLogin); a wrong
21
+ // guess surfaces as the SDK's own auth error on the first real call.
22
+ import { existsSync, readFileSync } from 'node:fs';
23
+ import { homedir } from 'node:os';
24
+ import { join } from 'node:path';
25
+ /** The opt-in that makes ANTHROPIC_API_KEY win over a Claude Code login. */
26
+ export const USE_API_KEY_ENV = 'LIMN_AI_USE_API_KEY';
27
+ function envApiKey(env) {
28
+ const k = env.ANTHROPIC_API_KEY?.trim();
29
+ return k ? k : undefined;
30
+ }
31
+ /** Does the reader prefer the API key over the login (`LIMN_AI_USE_API_KEY=true`)? */
32
+ export function prefersApiKey(env = process.env) {
33
+ return env[USE_API_KEY_ENV]?.trim().toLowerCase() === 'true';
34
+ }
35
+ /**
36
+ * Does this Claude Code config file record a signed-in account? The CLI writes a non-empty
37
+ * `oauthAccount` object on sign-in and removes it on logout — on macOS, where the token itself is
38
+ * in the Keychain, it is the only on-disk signal. A missing, unreadable or unparseable file is no.
39
+ */
40
+ function configRecordsLogin(path) {
41
+ try {
42
+ if (!existsSync(path))
43
+ return false;
44
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
45
+ if (!parsed || typeof parsed !== 'object')
46
+ return false;
47
+ const account = parsed.oauthAccount;
48
+ return !!account && typeof account === 'object' && Object.keys(account).length > 0;
49
+ }
50
+ catch {
51
+ return false;
52
+ }
53
+ }
54
+ /**
55
+ * Is a Claude Code login available (an OAuth token, or a logged-in session on disk)? Deliberately
56
+ * ignores API keys: it answers "can this run on the reader's own Claude, not a meter?".
57
+ *
58
+ * ⚠ A BARE `~/.claude` DIRECTORY OR `~/.claude.json` IS NOT A LOGIN. Merely running Claude Code —
59
+ * including the Agent SDK on the API-key route — creates both, so counting them moved a key-only
60
+ * reader onto the login route after their first run and stripped their key from every later one.
61
+ * Only a credentials file, CLAUDE_CODE_OAUTH_TOKEN, or a config recording `oauthAccount` counts.
62
+ * CLAUDE_CONFIG_DIR (which the SDK subprocess inherits) is checked before the defaults.
63
+ */
64
+ export function hasClaudeLogin(env = process.env, home = homedir()) {
65
+ if (env.CLAUDE_CODE_OAUTH_TOKEN?.trim())
66
+ return true;
67
+ const cfg = env.CLAUDE_CONFIG_DIR?.trim();
68
+ const credentialFiles = [
69
+ ...(cfg ? [join(cfg, '.credentials.json')] : []),
70
+ join(home, '.claude', '.credentials.json'),
71
+ join(home, '.config', 'claude', '.credentials.json'),
72
+ ];
73
+ if (credentialFiles.some((path) => existsSync(path)))
74
+ return true;
75
+ const configFiles = [...(cfg ? [join(cfg, '.claude.json')] : []), join(home, '.claude.json')];
76
+ return configFiles.some(configRecordsLogin);
77
+ }
78
+ /** Which credential the next model call uses. Read at call time, so an env change takes effect. */
79
+ export function resolveAiCredential(env = process.env, loginAvailable = hasClaudeLogin) {
80
+ const apiKey = envApiKey(env);
81
+ if (apiKey && prefersApiKey(env))
82
+ return { route: 'api_key', method: 'api_key', apiKey };
83
+ if (env.CLAUDE_CODE_OAUTH_TOKEN)
84
+ return { route: 'login', method: 'oauth_token' };
85
+ if (loginAvailable(env))
86
+ return { route: 'login', method: 'ambient' };
87
+ if (apiKey)
88
+ return { route: 'api_key', method: 'api_key', apiKey };
89
+ return { route: 'none' };
90
+ }
91
+ /**
92
+ * The environment an Agent SDK subprocess runs with, per the ladder. Passed as the query's `env`
93
+ * option, so it never touches process.env and two concurrent runs cannot race.
94
+ *
95
+ * • login → the inherited environment WITHOUT ANTHROPIC_API_KEY (the login pays, not a meter).
96
+ * • API key → the inherited environment WITHOUT CLAUDE_CODE_OAUTH_TOKEN, so the key is used.
97
+ * • none → the inherited environment unchanged; the SDK reports the authoritative auth error.
98
+ */
99
+ export function agentSdkEnv(env = process.env, credential = resolveAiCredential(env)) {
100
+ const out = { ...env };
101
+ if (credential.route === 'login')
102
+ delete out.ANTHROPIC_API_KEY;
103
+ else if (credential.route === 'api_key') {
104
+ delete out.CLAUDE_CODE_OAUTH_TOKEN;
105
+ out.ANTHROPIC_API_KEY = credential.apiKey;
106
+ }
107
+ return out;
108
+ }
109
+ /** Spread into every Agent SDK `query({ options })`, beside `claudeExecutableOptions()`. */
110
+ export function agentAuthOptions() {
111
+ return { env: agentSdkEnv() };
112
+ }
113
+ //# sourceMappingURL=credentials.js.map