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.
- package/LICENSE +110 -0
- package/README.md +133 -0
- package/dist/ai/runtime.js +535 -0
- package/dist/api/plugins/auth.js +169 -0
- package/dist/api/plugins/error-handler.js +114 -0
- package/dist/api/plugins/rate-limit.js +855 -0
- package/dist/api/plugins/security.js +321 -0
- package/dist/api/routes/activity.js +103 -0
- package/dist/api/routes/ai-runtime.js +67 -0
- package/dist/api/routes/auth.js +194 -0
- package/dist/api/routes/billing.js +209 -0
- package/dist/api/routes/bot-triage.js +1289 -0
- package/dist/api/routes/conflicts.js +730 -0
- package/dist/api/routes/contact.js +318 -0
- package/dist/api/routes/daily-brief.js +58 -0
- package/dist/api/routes/flow.js +71 -0
- package/dist/api/routes/health.js +7 -0
- package/dist/api/routes/insights.js +200 -0
- package/dist/api/routes/me.js +458 -0
- package/dist/api/routes/mentions.js +22 -0
- package/dist/api/routes/mergers.js +8 -0
- package/dist/api/routes/ml-labels.js +109 -0
- package/dist/api/routes/open-prs.js +35 -0
- package/dist/api/routes/prs.js +1633 -0
- package/dist/api/routes/reactions.js +217 -0
- package/dist/api/routes/repos.js +563 -0
- package/dist/api/routes/search.js +41 -0
- package/dist/api/routes/threads.js +118 -0
- package/dist/api/routes/timeline.js +150 -0
- package/dist/api/routes/users.js +67 -0
- package/dist/api/routes/webhooks.js +181 -0
- package/dist/api/routes/workspaces.js +322 -0
- package/dist/app.js +274 -0
- package/dist/ascii.js +19 -0
- package/dist/auth/account.js +482 -0
- package/dist/auth/crypto.js +46 -0
- package/dist/bot-triage/resolve.js +59 -0
- package/dist/cli.js +388 -0
- package/dist/coding/activity.js +80 -0
- package/dist/coding/agent.js +288 -0
- package/dist/coding/ai-fix/auto-fix.js +212 -0
- package/dist/coding/ai-fix/manager.js +370 -0
- package/dist/coding/ai-fix/persist.js +213 -0
- package/dist/coding/ai-fix/pr-context.js +58 -0
- package/dist/coding/ai-fix/prompts.js +138 -0
- package/dist/coding/ai-fix/review-seed.js +357 -0
- package/dist/coding/ai-fix/routes.js +425 -0
- package/dist/coding/git-ops.js +321 -0
- package/dist/coding/git.js +184 -0
- package/dist/coding/merge.js +262 -0
- package/dist/coding/safe-path.js +75 -0
- package/dist/coding/schema.js +43 -0
- package/dist/config.js +648 -0
- package/dist/conflict/diff.js +304 -0
- package/dist/conflict/git.js +118 -0
- package/dist/conflict/hash.js +73 -0
- package/dist/conflict/janitor.js +218 -0
- package/dist/conflict/land.js +675 -0
- package/dist/conflict/model-types.js +2 -0
- package/dist/conflict/model.js +1081 -0
- package/dist/conflict/parse.js +142 -0
- package/dist/conflict/seam.js +136 -0
- package/dist/conflict/session.js +532 -0
- package/dist/conflict/suggestion.js +398 -0
- package/dist/conflict/tokens.js +72 -0
- package/dist/data-dir.js +112 -0
- package/dist/db/actor-lanes.js +213 -0
- package/dist/db/automation-ids.js +97 -0
- package/dist/db/automation-output.js +349 -0
- package/dist/db/blast-radius-query.js +36 -0
- package/dist/db/blast-radius.js +226 -0
- package/dist/db/bot-dormancy.js +115 -0
- package/dist/db/bot-overlap.js +579 -0
- package/dist/db/bot-volume.js +722 -0
- package/dist/db/bot-window.js +35 -0
- package/dist/db/branch-queries.js +310 -0
- package/dist/db/change-shape.js +243 -0
- package/dist/db/changepoint.js +75 -0
- package/dist/db/cleanup.js +36 -0
- package/dist/db/client.js +102 -0
- package/dist/db/code-loc.js +388 -0
- package/dist/db/credits.js +79 -0
- package/dist/db/daily-brief.js +406 -0
- package/dist/db/dependency-cards.js +145 -0
- package/dist/db/erase-account.js +255 -0
- package/dist/db/export-account.js +189 -0
- package/dist/db/failing-checks.js +124 -0
- package/dist/db/file-coupling.js +197 -0
- package/dist/db/flow-detail.js +661 -0
- package/dist/db/flow-pointers.js +197 -0
- package/dist/db/flow-settings.js +67 -0
- package/dist/db/forecast.js +114 -0
- package/dist/db/line-overlap.js +81 -0
- package/dist/db/merge-queue.js +189 -0
- package/dist/db/migrate.js +17 -0
- package/dist/db/migrations/0000_purple_ben_grimm.sql +155 -0
- package/dist/db/migrations/0001_colorful_ozymandias.sql +31 -0
- package/dist/db/migrations/0002_famous_sersi.sql +9 -0
- package/dist/db/migrations/0003_clever_shinobi_shaw.sql +3 -0
- package/dist/db/migrations/0004_pale_scalphunter.sql +1 -0
- package/dist/db/migrations/0005_daffy_guardian.sql +2 -0
- package/dist/db/migrations/0006_cute_violations.sql +45 -0
- package/dist/db/migrations/0007_dark_anthem.sql +2 -0
- package/dist/db/migrations/0008_multitenant_accounts.sql +44 -0
- package/dist/db/migrations/0009_lean_bodies.sql +13 -0
- package/dist/db/migrations/0010_lean_bodies_nullable.sql +56 -0
- package/dist/db/migrations/0011_pr_diff_size.sql +10 -0
- package/dist/db/migrations/0012_findings_included_default.sql +7 -0
- package/dist/db/migrations/0013_review_routing.sql +9 -0
- package/dist/db/migrations/0014_account_last_active.sql +6 -0
- package/dist/db/migrations/0015_repos_inbox_watch.sql +9 -0
- package/dist/db/migrations/0016_repo_viewer_permission.sql +7 -0
- package/dist/db/migrations/0017_account_display_name.sql +7 -0
- package/dist/db/migrations/0018_finding_comment_kind.sql +7 -0
- package/dist/db/migrations/0019_finding_file_in_diff.sql +7 -0
- package/dist/db/migrations/0020_claude_review_cost_telemetry.sql +11 -0
- package/dist/db/migrations/0021_account_feed_last_seen.sql +7 -0
- package/dist/db/migrations/0022_ci_status_events.sql +21 -0
- package/dist/db/migrations/0023_ai_usage.sql +21 -0
- package/dist/db/migrations/0024_pr_head_ref_name.sql +6 -0
- package/dist/db/migrations/0025_account_billing.sql +7 -0
- package/dist/db/migrations/0026_ai_credit_allowance.sql +5 -0
- package/dist/db/migrations/0027_user_github_type.sql +6 -0
- package/dist/db/migrations/0028_bot_review_classification.sql +21 -0
- package/dist/db/migrations/0029_bot_mute_rules.sql +19 -0
- package/dist/db/migrations/0030_teams.sql +32 -0
- package/dist/db/migrations/0031_events_pr_idx.sql +7 -0
- package/dist/db/migrations/0032_benchmark_contributions.sql +29 -0
- package/dist/db/migrations/0033_thread_addressed_confidence.sql +9 -0
- package/dist/db/migrations/0034_thread_resolved_at.sql +6 -0
- package/dist/db/migrations/0035_pr_first_review_requested_at.sql +5 -0
- package/dist/db/migrations/0036_search_index.sql +25 -0
- package/dist/db/migrations/0037_author_indexes.sql +15 -0
- package/dist/db/migrations/0038_auto_merge_requests.sql +37 -0
- package/dist/db/migrations/0039_branch_status.sql +44 -0
- package/dist/db/migrations/0040_pr_review_decision.sql +10 -0
- package/dist/db/migrations/0041_branch_commit_detail.sql +38 -0
- package/dist/db/migrations/0042_repo_reviewers.sql +176 -0
- package/dist/db/migrations/0043_account_reviewers.sql +131 -0
- package/dist/db/migrations/0044_workspaces.sql +138 -0
- package/dist/db/migrations/0045_workspace_reviewers.sql +180 -0
- package/dist/db/migrations/0046_drop_inbox_watch.sql +25 -0
- package/dist/db/migrations/0047_ml_comment_labels.sql +40 -0
- package/dist/db/migrations/0048_ml_vendor_severity.sql +31 -0
- package/dist/db/migrations/0049_seat_pricing_repo_description.sql +21 -0
- package/dist/db/migrations/0050_users_app_slug.sql +12 -0
- package/dist/db/migrations/0051_auto_merge_queue.sql +17 -0
- package/dist/db/migrations/0052_trunk_ci_status_events.sql +43 -0
- package/dist/db/migrations/0053_automation_roles.sql +79 -0
- package/dist/db/migrations/0054_automation_vendor_kinds.sql +514 -0
- package/dist/db/migrations/0055_auto_merge_phase.sql +12 -0
- package/dist/db/migrations/0056_pr_mentions.sql +22 -0
- package/dist/db/migrations/0057_large_pr_threshold.sql +14 -0
- package/dist/db/migrations/0058_pending_mute.sql +53 -0
- package/dist/db/migrations/0059_merge_queue_state.sql +33 -0
- package/dist/db/migrations/0060_drop_my_turn_dismissals.sql +33 -0
- package/dist/db/migrations/0061_auto_merge_durable_anchors.sql +27 -0
- package/dist/db/migrations/0062_blast_radius_config.sql +21 -0
- package/dist/db/migrations/0063_repo_file_coupling.sql +33 -0
- package/dist/db/migrations/0064_pr_content_kind.sql +21 -0
- package/dist/db/migrations/0065_workspace_flow_settings.sql +13 -0
- package/dist/db/migrations/0066_review_request_events.sql +31 -0
- package/dist/db/migrations/0067_pr_security_signals.sql +86 -0
- package/dist/db/migrations/0068_my_turn_settings.sql +18 -0
- package/dist/db/migrations/0069_my_turn_dismissals.sql +41 -0
- package/dist/db/migrations/0070_claude_review_follow_up_ticket.sql +22 -0
- package/dist/db/migrations/0071_claude_review_trigger.sql +11 -0
- package/dist/db/migrations/0072_commit_message_headline.sql +13 -0
- package/dist/db/migrations/0073_claude_review_chat.sql +31 -0
- package/dist/db/migrations/0074_adopt_agentic_tables.sql +98 -0
- package/dist/db/migrations/0075_review_lens_drop_learnings.sql +15 -0
- package/dist/db/migrations/0076_claude_review_threads.sql +17 -0
- package/dist/db/migrations/0077_claude_review_ci_failures.sql +10 -0
- package/dist/db/migrations/0078_ai_fix_change_report.sql +17 -0
- package/dist/db/migrations/0079_claude_finding_story.sql +16 -0
- package/dist/db/migrations/meta/0000_snapshot.json +1116 -0
- package/dist/db/migrations/meta/0001_snapshot.json +1321 -0
- package/dist/db/migrations/meta/0002_snapshot.json +1375 -0
- package/dist/db/migrations/meta/0003_snapshot.json +1396 -0
- package/dist/db/migrations/meta/0004_snapshot.json +1416 -0
- package/dist/db/migrations/meta/0005_snapshot.json +1430 -0
- package/dist/db/migrations/meta/0006_snapshot.json +1745 -0
- package/dist/db/migrations/meta/0007_snapshot.json +1759 -0
- package/dist/db/migrations/meta/_journal.json +566 -0
- package/dist/db/migrations-pg/0000_tired_alex_power.sql +268 -0
- package/dist/db/migrations-pg/0001_dizzy_mockingbird.sql +3 -0
- package/dist/db/migrations-pg/0002_glorious_ikaris.sql +4 -0
- package/dist/db/migrations-pg/0003_melted_secret_warriors.sql +2 -0
- package/dist/db/migrations-pg/0004_numerous_triton.sql +1 -0
- package/dist/db/migrations-pg/0005_thick_blockbuster.sql +2 -0
- package/dist/db/migrations-pg/0006_majestic_dracula.sql +1 -0
- package/dist/db/migrations-pg/0007_same_human_torch.sql +2 -0
- package/dist/db/migrations-pg/0008_slimy_toxin.sql +1 -0
- package/dist/db/migrations-pg/0009_fuzzy_jubilee.sql +4 -0
- package/dist/db/migrations-pg/0010_late_hammerhead.sql +1 -0
- package/dist/db/migrations-pg/0011_happy_leech.sql +16 -0
- package/dist/db/migrations-pg/0012_woozy_captain_midlands.sql +16 -0
- package/dist/db/migrations-pg/0013_yielding_nicolaos.sql +1 -0
- package/dist/db/migrations-pg/0014_wakeful_bill_hollister.sql +2 -0
- package/dist/db/migrations-pg/0015_aspiring_black_tom.sql +1 -0
- package/dist/db/migrations-pg/0016_cute_ghost_rider.sql +30 -0
- package/dist/db/migrations-pg/0017_far_changeling.sql +24 -0
- package/dist/db/migrations-pg/0018_fancy_miss_america.sql +1 -0
- package/dist/db/migrations-pg/0019_benchmark_contributions.sql +22 -0
- package/dist/db/migrations-pg/0020_majestic_edwin_jarvis.sql +3 -0
- package/dist/db/migrations-pg/0021_green_salo.sql +1 -0
- package/dist/db/migrations-pg/0022_wise_baron_strucker.sql +1 -0
- package/dist/db/migrations-pg/0023_search_index.sql +19 -0
- package/dist/db/migrations-pg/0024_author_indexes.sql +9 -0
- package/dist/db/migrations-pg/0025_auto_merge_requests.sql +26 -0
- package/dist/db/migrations-pg/0026_branch_status.sql +32 -0
- package/dist/db/migrations-pg/0027_pr_review_decision.sql +5 -0
- package/dist/db/migrations-pg/0028_branch_commit_detail.sql +9 -0
- package/dist/db/migrations-pg/0029_repo_reviewers.sql +127 -0
- package/dist/db/migrations-pg/0030_account_reviewers.sql +77 -0
- package/dist/db/migrations-pg/0031_workspaces.sql +131 -0
- package/dist/db/migrations-pg/0032_workspace_reviewers.sql +165 -0
- package/dist/db/migrations-pg/0033_drop_inbox_watch.sql +14 -0
- package/dist/db/migrations-pg/0034_ml_comment_labels.sql +33 -0
- package/dist/db/migrations-pg/0035_ml_vendor_severity.sql +16 -0
- package/dist/db/migrations-pg/0036_seat_pricing_repo_description.sql +12 -0
- package/dist/db/migrations-pg/0037_users_app_slug.sql +9 -0
- package/dist/db/migrations-pg/0038_auto_merge_queue.sql +10 -0
- package/dist/db/migrations-pg/0039_trunk_ci_status_events.sql +27 -0
- package/dist/db/migrations-pg/0040_automation_roles.sql +63 -0
- package/dist/db/migrations-pg/0041_automation_vendor_kinds.sql +488 -0
- package/dist/db/migrations-pg/0042_auto_merge_phase.sql +8 -0
- package/dist/db/migrations-pg/0043_pr_mentions.sql +19 -0
- package/dist/db/migrations-pg/0044_large_pr_threshold.sql +6 -0
- package/dist/db/migrations-pg/0045_pending_mute.sql +26 -0
- package/dist/db/migrations-pg/0046_merge_queue_state.sql +18 -0
- package/dist/db/migrations-pg/0047_drop_my_turn_dismissals.sql +21 -0
- package/dist/db/migrations-pg/0048_auto_merge_durable_anchors.sql +27 -0
- package/dist/db/migrations-pg/0049_blast_radius_config.sql +8 -0
- package/dist/db/migrations-pg/0050_repo_file_coupling.sql +13 -0
- package/dist/db/migrations-pg/0051_pr_content_kind.sql +6 -0
- package/dist/db/migrations-pg/0052_workspace_flow_settings.sql +4 -0
- package/dist/db/migrations-pg/0053_review_request_events.sql +18 -0
- package/dist/db/migrations-pg/0054_pr_security_signals.sql +59 -0
- package/dist/db/migrations-pg/0055_my_turn_settings.sql +6 -0
- package/dist/db/migrations-pg/0056_my_turn_dismissals.sql +21 -0
- package/dist/db/migrations-pg/0057_claude_review_follow_up_ticket.sql +8 -0
- package/dist/db/migrations-pg/0058_claude_review_trigger.sql +4 -0
- package/dist/db/migrations-pg/0059_commit_message_headline.sql +3 -0
- package/dist/db/migrations-pg/0060_claude_review_chat.sql +24 -0
- package/dist/db/migrations-pg/0061_adopt_agentic_tables.sql +79 -0
- package/dist/db/migrations-pg/0062_review_lens_drop_learnings.sql +5 -0
- package/dist/db/migrations-pg/0063_claude_review_threads.sql +7 -0
- package/dist/db/migrations-pg/0064_claude_review_ci_failures.sql +4 -0
- package/dist/db/migrations-pg/0065_ai_fix_change_report.sql +9 -0
- package/dist/db/migrations-pg/0066_claude_finding_story.sql +7 -0
- package/dist/db/migrations-pg/meta/0000_snapshot.json +2137 -0
- package/dist/db/migrations-pg/meta/0001_snapshot.json +2143 -0
- package/dist/db/migrations-pg/meta/0002_snapshot.json +2170 -0
- package/dist/db/migrations-pg/meta/0003_snapshot.json +2182 -0
- package/dist/db/migrations-pg/meta/0004_snapshot.json +2188 -0
- package/dist/db/migrations-pg/meta/0005_snapshot.json +2201 -0
- package/dist/db/migrations-pg/meta/0006_snapshot.json +2207 -0
- package/dist/db/migrations-pg/meta/0007_snapshot.json +2219 -0
- package/dist/db/migrations-pg/meta/0008_snapshot.json +2226 -0
- package/dist/db/migrations-pg/meta/0009_snapshot.json +2250 -0
- package/dist/db/migrations-pg/meta/0010_snapshot.json +2256 -0
- package/dist/db/migrations-pg/meta/0011_snapshot.json +2412 -0
- package/dist/db/migrations-pg/meta/0012_snapshot.json +2528 -0
- package/dist/db/migrations-pg/meta/0013_snapshot.json +2534 -0
- package/dist/db/migrations-pg/meta/0014_snapshot.json +2547 -0
- package/dist/db/migrations-pg/meta/0015_snapshot.json +2553 -0
- package/dist/db/migrations-pg/meta/0016_snapshot.json +2774 -0
- package/dist/db/migrations-pg/meta/0017_snapshot.json +2999 -0
- package/dist/db/migrations-pg/meta/0018_snapshot.json +3020 -0
- package/dist/db/migrations-pg/meta/0020_snapshot.json +3228 -0
- package/dist/db/migrations-pg/meta/0021_snapshot.json +3234 -0
- package/dist/db/migrations-pg/meta/0022_snapshot.json +3240 -0
- package/dist/db/migrations-pg/meta/_journal.json +475 -0
- package/dist/db/ml-labels.js +1666 -0
- package/dist/db/my-turn-dismissals.js +343 -0
- package/dist/db/my-turn-settings.js +34 -0
- package/dist/db/pending-classify.js +46 -0
- package/dist/db/pending-mute.js +171 -0
- package/dist/db/pending-tabs.js +238 -0
- package/dist/db/period-metrics.js +820 -0
- package/dist/db/person-period.js +763 -0
- package/dist/db/pr-intervals.js +930 -0
- package/dist/db/pr-liveness.js +240 -0
- package/dist/db/pr-mentions.js +279 -0
- package/dist/db/pr-merge-queue-stamp.js +91 -0
- package/dist/db/queries.js +14631 -0
- package/dist/db/reaction-targets.js +94 -0
- package/dist/db/repo-activity.js +171 -0
- package/dist/db/retention.js +138 -0
- package/dist/db/review-threads-for-review.js +240 -0
- package/dist/db/run-migrations.js +24 -0
- package/dist/db/schema.pg.js +1220 -0
- package/dist/db/schema.sqlite.js +1801 -0
- package/dist/db/search.js +317 -0
- package/dist/db/security-alerts.js +218 -0
- package/dist/db/synthesis-input.js +565 -0
- package/dist/db/triage.js +320 -0
- package/dist/db/usage.js +63 -0
- package/dist/db/work-plan.js +1086 -0
- package/dist/db/working-hours.js +161 -0
- package/dist/feed/my-turn.js +122 -0
- package/dist/github/actions-logs.js +397 -0
- package/dist/github/auth.js +86 -0
- package/dist/github/branch-queries.js +229 -0
- package/dist/github/client.js +454 -0
- package/dist/github/codeowners.js +221 -0
- package/dist/github/commit-checks.js +105 -0
- package/dist/github/compare.js +110 -0
- package/dist/github/diff-anchor.js +227 -0
- package/dist/github/mutations.js +706 -0
- package/dist/github/pr-file-content.js +254 -0
- package/dist/github/pr-liveness.js +161 -0
- package/dist/github/queries.js +875 -0
- package/dist/github/rate-budget.js +129 -0
- package/dist/github/reactions.js +161 -0
- package/dist/github/reviewer-suggest.js +104 -0
- package/dist/github/team-reviewers.js +96 -0
- package/dist/index.js +184 -0
- package/dist/merge/auto-merge-runner.js +960 -0
- package/dist/ml/severity-client.js +218 -0
- package/dist/pr/detail-enricher.js +26 -0
- package/dist/pro/bind.js +302 -0
- package/dist/pro/contract.js +37 -0
- package/dist/pro/migrate.js +64 -0
- package/dist/review/agent-context.js +127 -0
- package/dist/review/agent.js +385 -0
- package/dist/review/agentic.js +59 -0
- package/dist/review/auth.js +94 -0
- package/dist/review/chat-agent.js +179 -0
- package/dist/review/claude-review/ai-ready.js +16 -0
- package/dist/review/claude-review/auto-settings.js +139 -0
- package/dist/review/claude-review/auto.js +244 -0
- package/dist/review/claude-review/chat.js +489 -0
- package/dist/review/claude-review/ci-failures.js +350 -0
- package/dist/review/claude-review/follow-up.js +310 -0
- package/dist/review/claude-review/manager.js +686 -0
- package/dist/review/claude-review/persist.js +996 -0
- package/dist/review/claude-review/prompts.js +357 -0
- package/dist/review/claude-review/routes.js +518 -0
- package/dist/review/claude-review/routing.js +61 -0
- package/dist/review/claude-review/specialists.js +190 -0
- package/dist/review/claude-review/threads.js +265 -0
- package/dist/review/claude-review/ticket.js +282 -0
- package/dist/review/clone-hygiene.js +380 -0
- package/dist/review/clone-manager.js +367 -0
- package/dist/review/llm.js +113 -0
- package/dist/review/model-options.js +48 -0
- package/dist/review/plugin-providers.js +12 -0
- package/dist/review/post-review.js +216 -0
- package/dist/review/post-seam.js +161 -0
- package/dist/review/prepare.js +168 -0
- package/dist/review/pricing.js +17 -0
- package/dist/review/schema.js +156 -0
- package/dist/review/submit-map.js +41 -0
- package/dist/review/usage.js +90 -0
- package/dist/shared/claude-review.js +335 -0
- package/dist/shared/conflict-fold.js +151 -0
- package/dist/shared/conflicts.js +30 -0
- package/dist/shared/flow-settings.js +191 -0
- package/dist/shared/index.js +8 -0
- package/dist/shared/my-turn-settings.js +238 -0
- package/dist/shared/pending-rules.js +281 -0
- package/dist/shared/product.js +54 -0
- package/dist/shared/types.js +896 -0
- package/dist/status.js +386 -0
- package/dist/sync/adaptive.js +185 -0
- package/dist/sync/app-attribution.js +66 -0
- package/dist/sync/auth-notices.js +36 -0
- package/dist/sync/backfill-ci-history.js +315 -0
- package/dist/sync/backfill-commit-headlines.js +136 -0
- package/dist/sync/backfill-pr-security.js +175 -0
- package/dist/sync/backfill-review-requests.js +97 -0
- package/dist/sync/benchmark-rollup.js +50 -0
- package/dist/sync/bot-detection.js +309 -0
- package/dist/sync/bot-resolution-markers.js +30 -0
- package/dist/sync/branch-status.js +634 -0
- package/dist/sync/classify-change-shape.js +150 -0
- package/dist/sync/commit-files.js +74 -0
- package/dist/sync/derive-thread-state.js +99 -0
- package/dist/sync/drain-review-threads.js +212 -0
- package/dist/sync/hydrate-detail.js +482 -0
- package/dist/sync/mention-scan.js +89 -0
- package/dist/sync/ml-enrichment.js +478 -0
- package/dist/sync/pr-change-signal.js +96 -0
- package/dist/sync/pr-liveness-sweep.js +139 -0
- package/dist/sync/pr-settle.js +381 -0
- package/dist/sync/refresh-pr.js +163 -0
- package/dist/sync/reparse-vendor-badges.js +495 -0
- package/dist/sync/resync-after-write.js +280 -0
- package/dist/sync/review-fingerprint.js +117 -0
- package/dist/sync/reviewer-behavior.js +103 -0
- package/dist/sync/reviewer-classify.js +503 -0
- package/dist/sync/routing-files.js +97 -0
- package/dist/sync/scheduled-jobs.js +12 -0
- package/dist/sync/scheduler.js +159 -0
- package/dist/sync/security-detect.js +521 -0
- package/dist/sync/sync-manager.js +750 -0
- package/dist/sync/sync-one-pr.js +205 -0
- package/dist/sync/sync-repo.js +400 -0
- package/dist/sync/unsettled-prs.js +506 -0
- package/dist/sync/upsert.js +1190 -0
- package/package.json +56 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/assets/AiFixTab-CQP6PT5u.js +2 -0
- package/public/assets/ClaudeReviewTab-DQJ-58ZA.js +8 -0
- package/public/assets/PrBotBehaviourTab-CCnFrWbC.js +1 -0
- package/public/assets/archivo-latin-600-BN-JkNrl.woff2 +0 -0
- package/public/assets/highlight-BEHUn5zE.css +10 -0
- package/public/assets/highlight-CIIZLa6Z.js +12 -0
- package/public/assets/index-BDnYs6zg.js +73 -0
- package/public/assets/index-mCuI--RC.css +1 -0
- package/public/assets/markdown-I_JLLVAZ.js +32 -0
- package/public/assets/perfProbe-Da13EhTE.js +1 -0
- package/public/assets/tanstack-5qsxxaLe.js +17 -0
- package/public/assets/vis-C3BCkP5U.js +1280 -0
- package/public/assets/vis-ziCVehMy.css +1 -0
- package/public/favicon-16.png +0 -0
- package/public/favicon-32.png +0 -0
- package/public/favicon-48.png +0 -0
- package/public/favicon.svg +5 -0
- package/public/index.html +41 -0
- package/public-landing/apple-touch-icon.png +0 -0
- package/public-landing/assets/archivo-latin-500-BWmvx2Mg.woff2 +0 -0
- package/public-landing/assets/archivo-latin-600-BN-JkNrl.woff2 +0 -0
- package/public-landing/assets/index-CA3eEGXO.js +40 -0
- package/public-landing/assets/index-naQrQ6Fe.css +1 -0
- package/public-landing/assets/jetbrains-mono-latin-400-RruCX7RW.woff2 +0 -0
- package/public-landing/assets/newsreader-latin-400-DExrRRrN.woff2 +0 -0
- package/public-landing/assets/newsreader-latin-400-italic-b0I-AwbV.woff2 +0 -0
- package/public-landing/bots/index.html +156 -0
- package/public-landing/contact/index.html +156 -0
- package/public-landing/cookies/index.html +156 -0
- package/public-landing/demo/limn-walkthrough-poster.jpg +0 -0
- package/public-landing/demo/limn-walkthrough.cues.json +44 -0
- package/public-landing/demo/limn-walkthrough.mp4 +0 -0
- package/public-landing/favicon-16.png +0 -0
- package/public-landing/favicon-32.png +0 -0
- package/public-landing/favicon-48.png +0 -0
- package/public-landing/favicon.svg +5 -0
- package/public-landing/features/index.html +156 -0
- package/public-landing/for-developers/index.html +156 -0
- package/public-landing/for-managers/index.html +156 -0
- package/public-landing/how-it-works/index.html +156 -0
- package/public-landing/how-we-measure/index.html +156 -0
- package/public-landing/icon-192.png +0 -0
- package/public-landing/icon-512.png +0 -0
- package/public-landing/index.html +156 -0
- package/public-landing/insights/index.html +156 -0
- package/public-landing/og-image.png +0 -0
- package/public-landing/pricing/index.html +156 -0
- package/public-landing/privacy/index.html +156 -0
- package/public-landing/pro/index.html +156 -0
- package/public-landing/reviews/index.html +156 -0
- package/public-landing/robots.txt +8 -0
- package/public-landing/shots/benchmark.png +0 -0
- package/public-landing/shots/bot-roi.png +0 -0
- package/public-landing/shots/bot-settings.png +0 -0
- package/public-landing/shots/chronology.png +0 -0
- package/public-landing/shots/feed.png +0 -0
- package/public-landing/shots/flow-metrics.png +0 -0
- package/public-landing/shots/free-reports.png +0 -0
- package/public-landing/shots/pending-board.png +0 -0
- package/public-landing/shots/pending-card.png +0 -0
- package/public-landing/shots/period-report.png +0 -0
- package/public-landing/shots/pr-detail.png +0 -0
- package/public-landing/shots/pr-threads.png +0 -0
- package/public-landing/shots/reach.png +0 -0
- package/public-landing/shots/repo-rows.png +0 -0
- package/public-landing/shots/severity-findings.png +0 -0
- package/public-landing/shots/severity-strip.png +0 -0
- package/public-landing/site.webmanifest +14 -0
- package/public-landing/sitemap.xml +51 -0
- package/public-landing/terms/index.html +156 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
// THE PENDING BOARD'S RULES, AS NUMBERS — the ONE spelling the server folds with and the SPA
|
|
2
|
+
// explains with.
|
|
3
|
+
//
|
|
4
|
+
// ⚠ THIS FILE EXISTS SO THE EXPLANATION CANNOT DRIFT FROM THE BEHAVIOUR. The board's "how is this
|
|
5
|
+
// ordered" copy (the header info popover, the "How Pending works" modal, every card's own info
|
|
6
|
+
// popover) prints these thresholds and weights. Were the copy to re-type them, the first retune of
|
|
7
|
+
// the ranker would leave the app confidently describing an order it no longer produces — a false
|
|
8
|
+
// statement on the one screen whose job is to be believed. So `db/queries.ts` (admission, colour,
|
|
9
|
+
// board order) and `db/work-plan.ts` (the "Do next" score) read their constants FROM HERE, and the
|
|
10
|
+
// SPA renders from here. Change a number here and both move together.
|
|
11
|
+
//
|
|
12
|
+
// ⚠ VALUES ONLY — nothing here decides anything, beyond two one-line lookups the server and the SPA
|
|
13
|
+
// must answer identically (`pendingTabOf`, `pendingAuthorSideOf`). The folds that apply these
|
|
14
|
+
// numbers stay in the backend; this module is the table they share.
|
|
15
|
+
/**
|
|
16
|
+
* WHO GETS ON THE BOARD, and how many of each kind — the admission floors and caps
|
|
17
|
+
* `getWorkspaceInsights` applies.
|
|
18
|
+
*/
|
|
19
|
+
export const PENDING_LIMITS = {
|
|
20
|
+
/** A requested review must have been open longer than this before it counts as stalled. */
|
|
21
|
+
stalledReviewMinHours: 24,
|
|
22
|
+
/** An untouched review thread must be older than this before it gets a card. */
|
|
23
|
+
untouchedThreadMinHours: 24,
|
|
24
|
+
/** A PR with nobody asked and nobody reviewing must be older than this ("ignore brand-new PRs"). */
|
|
25
|
+
routingMinAgeHours: 4,
|
|
26
|
+
/** A PR with no activity event in this many days is treated as abandoned and gets no survey card. */
|
|
27
|
+
maxQuietDays: 90,
|
|
28
|
+
/** Per-kind cap for every kind except `my_turn`, in the DEFAULT fold every other consumer reads
|
|
29
|
+
* (the daily brief, the Pro insights pane, chat, the sprint report, Slack). The Pending board
|
|
30
|
+
* asks for the uncapped fold instead and applies `boardListCap` AFTER ranking by score. */
|
|
31
|
+
cardCap: 15,
|
|
32
|
+
/** `my_turn`'s own, larger cap in the default fold. */
|
|
33
|
+
myTurnCardCap: 50,
|
|
34
|
+
/** How many reviewers the review-load cards name. */
|
|
35
|
+
reviewerLoadCap: 8,
|
|
36
|
+
/** The Pending board lists at most this many cards of each kind — the highest-scoring ones — and
|
|
37
|
+
* every tab says when it holds more. */
|
|
38
|
+
boardListCap: 50,
|
|
39
|
+
/** Suggested reviewers are looked up (CODEOWNERS + history, network-backed) for this many
|
|
40
|
+
* "Needs a reviewer" cards on the board — the highest-scoring ones. The rest show none. */
|
|
41
|
+
routingSuggestCap: 15,
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* How many failing check names a Pending card names beside its red CI label — "CI failing: build,
|
|
45
|
+
* lint and 2 more". The server slices to this and sends the count of every name STORED for that
|
|
46
|
+
* head (`failingCheckTotal`), so the "and N more" has a denominator of its own. ⚠ Storage has
|
|
47
|
+
* bounds of its own: a trunk commit keeps at most 20 (the writer's `MAX_FAILING_CHECKS_PER_COMMIT`)
|
|
48
|
+
* and a PR's sync reads at most 100 contexts, so a total AT a bound is a floor. MEASURED: three
|
|
49
|
+
* names cover 91% of red PR heads on real data.
|
|
50
|
+
*/
|
|
51
|
+
export const FAILING_CHECKS_SHOWN = 3;
|
|
52
|
+
/**
|
|
53
|
+
* How many commits a "Pushed since" My Turn card lists (`NewPrBall.commits`), newest first. The
|
|
54
|
+
* rest are "and N more", where N = `humanCommitsAfter` − the listed count — the same population,
|
|
55
|
+
* so the two cannot disagree. A PR with 30 commits pushed since would otherwise fill the board.
|
|
56
|
+
*/
|
|
57
|
+
export const PUSHED_COMMITS_SHOWN = 5;
|
|
58
|
+
/**
|
|
59
|
+
* The longest reply a reply-type My Turn card carries inline (`MyTurnCard.reply`), in characters.
|
|
60
|
+
* Longer bodies are cut and flagged `truncated`, and the card offers "Open thread". MEASURED on
|
|
61
|
+
* human review comments: average 262 characters, 44 of 13,200 over 2,000, longest 8,021.
|
|
62
|
+
*/
|
|
63
|
+
export const MY_TURN_REPLY_MAX_CHARS = 1500;
|
|
64
|
+
/**
|
|
65
|
+
* THE ONE SENTENCE a Pending card's detail says while GitHub's merge queue holds its PR — on a
|
|
66
|
+
* `merge` / `update_branch` card and your own ready PR in My turn (`mergeCardDetail`), on a
|
|
67
|
+
* Dependencies card (`dependencyStateDetail`), and as the Do next row's `reason`, which the same
|
|
68
|
+
* two functions build.
|
|
69
|
+
*
|
|
70
|
+
* ⚠ A QUEUED PR STAYS ON Ready to land AND Dependencies, and that is why it needs its own words.
|
|
71
|
+
* GitHub has no QUEUED merge state, so a queued PR reads like any other ('clean' and 'unknown' have
|
|
72
|
+
* both been seen here); a clean one is minted exactly as before and used to say "Nothing is
|
|
73
|
+
* blocking this — it can land now" beside the card's queue chip. Time-free, like every card
|
|
74
|
+
* sentence.
|
|
75
|
+
*
|
|
76
|
+
* ⚠ SHARED BECAUSE THE SPA DOES NOT PRINT IT. The card's queue chip (or, for a reader who can push,
|
|
77
|
+
* its merge row) already says the PR is queued, so the card leaves this sentence out and keeps it
|
|
78
|
+
* for the ranker (`pendingCardDetail`, Activity/pendingLabels.ts — the `ci_red` precedent). The
|
|
79
|
+
* SPA recognises it by value, so the value lives here, once.
|
|
80
|
+
*/
|
|
81
|
+
export const MERGE_QUEUE_CARD_DETAIL = 'In the merge queue. GitHub merges it from here.';
|
|
82
|
+
/**
|
|
83
|
+
* THE COLOUR RULES — where a kind's severity comes from a threshold rather than a fixed value.
|
|
84
|
+
* `high` renders red, `warn` amber, anything below `warn` blue.
|
|
85
|
+
*/
|
|
86
|
+
export const PENDING_SEVERITY = {
|
|
87
|
+
/** Hours the PR has been OPEN (not since the request) with a review still outstanding. */
|
|
88
|
+
stalledReviewHours: { high: 72, warn: 48 },
|
|
89
|
+
/** Hours since the untouched thread was started. */
|
|
90
|
+
untouchedThreadHours: { high: 96, warn: 48 },
|
|
91
|
+
/** Requested reviews a person has not yet done. */
|
|
92
|
+
reviewerLoadPending: { high: 4, warn: 2 },
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* THE COLOUR OF EACH MY TURN TYPE. Somebody waiting on you, or a failing build or a conflict on
|
|
96
|
+
* your own PR, is red; new code to re-read, a red default branch, your own PR's good news or
|
|
97
|
+
* unanswered threads, or findings you have not posted, is amber; a PR nobody asked you about is
|
|
98
|
+
* blue. A red default branch turns red when you merged the PR that landed its head (the card
|
|
99
|
+
* builder's rule, as on the ci_failing trunk card).
|
|
100
|
+
*/
|
|
101
|
+
export const MY_TURN_SEVERITY = {
|
|
102
|
+
review_request: 'high',
|
|
103
|
+
mention: 'high',
|
|
104
|
+
thread: 'high',
|
|
105
|
+
thread_reply: 'high',
|
|
106
|
+
comment_reply: 'high',
|
|
107
|
+
pushed_since: 'warn',
|
|
108
|
+
own_ci_red: 'high',
|
|
109
|
+
own_conflicts: 'high',
|
|
110
|
+
trunk_red: 'warn',
|
|
111
|
+
pr_approved: 'warn',
|
|
112
|
+
own_ready: 'warn',
|
|
113
|
+
your_pr: 'warn',
|
|
114
|
+
own_thread: 'warn',
|
|
115
|
+
claude_review: 'warn',
|
|
116
|
+
watched_repo_pr: 'info',
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* THE "EVERYTHING ELSE" ORDER WITHIN ONE COLOUR. The board sorts by severity first (red, amber,
|
|
120
|
+
* blue) and by this rank second; within one kind, each builder's own order stands (the sort is
|
|
121
|
+
* stable). The two bot kinds keep their slots because the fold still emits them — the Pending
|
|
122
|
+
* route filters them out, the Pro Insights pane does not.
|
|
123
|
+
*
|
|
124
|
+
* ⚠ The two FORWARD kinds (`merge`, `update_branch`) rank after the problems on purpose: they are
|
|
125
|
+
* opportunities, and every kind above them is a problem. The "Do next" head is where they get to
|
|
126
|
+
* lead. `security` is a problem, so it sits with the problems; a `dependency_bump` is housekeeping,
|
|
127
|
+
* so it sits after the forward kinds.
|
|
128
|
+
*/
|
|
129
|
+
export const PENDING_KIND_RANK = {
|
|
130
|
+
my_turn: 0,
|
|
131
|
+
ci_failing: 1,
|
|
132
|
+
conflicts: 2,
|
|
133
|
+
security: 3,
|
|
134
|
+
bot_signal: 4,
|
|
135
|
+
bot_only_review: 5,
|
|
136
|
+
stalled_review: 6,
|
|
137
|
+
untouched_thread: 7,
|
|
138
|
+
reviewer_load: 8,
|
|
139
|
+
reviewer_routing: 9,
|
|
140
|
+
merge: 10,
|
|
141
|
+
update_branch: 11,
|
|
142
|
+
dependency_bump: 12,
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* THE "DO NEXT" SCORE — `db/work-plan.ts`'s deterministic rank.
|
|
146
|
+
*
|
|
147
|
+
* score = weights.proximity × proximity + weights.stall × stallRisk + weights.relevance × relevanceWeight
|
|
148
|
+
*
|
|
149
|
+
* Every value is 0..1. `proximity` is "how few steps from a merged PR", `stallRisk` is "how long it
|
|
150
|
+
* has been waiting, bucketed", `relevanceWeight` is "how much it is the viewer's".
|
|
151
|
+
*/
|
|
152
|
+
export const DO_NEXT_RULES = {
|
|
153
|
+
/** How many rows the head seats. */
|
|
154
|
+
cap: 12,
|
|
155
|
+
/** The product default (= `DO_NEXT_PRESETS.balanced`). The ranker reads the ACCOUNT's resolved
|
|
156
|
+
* weights (`resolveMyTurnSettings`); nothing may read this field except the resolver and its
|
|
157
|
+
* test. */
|
|
158
|
+
weights: { proximity: 0.5, stall: 0.3, relevance: 0.2 },
|
|
159
|
+
/**
|
|
160
|
+
* Proximity by the row's next step. `merge` splits on approval: a clean PR nobody has approved is
|
|
161
|
+
* ready for GitHub, not for a human, so it scores BELOW a review or a reply. A red trunk sits
|
|
162
|
+
* above a red PR because it breaks every open PR in the repo at once.
|
|
163
|
+
*/
|
|
164
|
+
proximity: {
|
|
165
|
+
merge_approved: 0.95,
|
|
166
|
+
merge_unapproved: 0.45,
|
|
167
|
+
update_branch: 0.7,
|
|
168
|
+
red_trunk: 0.65,
|
|
169
|
+
unblock_ci: 0.6,
|
|
170
|
+
review: 0.55,
|
|
171
|
+
reply: 0.5,
|
|
172
|
+
thread: 0.4,
|
|
173
|
+
nudge: 0.25,
|
|
174
|
+
/** A merge conflict — board-only. Conflicts cards compete inside the "Needs fixing" tab and
|
|
175
|
+
* are NOT part of the Pro work plan's evidence (its kind vocabulary has no conflicts member).
|
|
176
|
+
* The `conflicts` adjustment below is NOT applied on top of this base: it IS the conflict. */
|
|
177
|
+
conflicts: 0.5,
|
|
178
|
+
/** A person's PR a security tool flagged for a known advisory — board-only (the Dependencies
|
|
179
|
+
* tab). There is no security bonus: the tab's strict group already lists every security card
|
|
180
|
+
* above every bump, so a bonus would change no order and be one more number to explain. */
|
|
181
|
+
security_alert: 0.55,
|
|
182
|
+
/** A dependency PR GitHub is holding for something other than review or red CI (checks still
|
|
183
|
+
* running, other protection), or whose merge state it has not worked out — board-only. */
|
|
184
|
+
waiting: 0.3,
|
|
185
|
+
},
|
|
186
|
+
/** Applied once each, then the sum is clamped to 0..1. */
|
|
187
|
+
adjustments: {
|
|
188
|
+
/** GitHub reports the PR as conflicting (`mergeStateStatus === 'dirty'`). */
|
|
189
|
+
conflicts: -0.15,
|
|
190
|
+
/** At least `manyUntouchedThreadsMin` review threads with no reply and no follow-up commit. */
|
|
191
|
+
many_untouched_threads: -0.1,
|
|
192
|
+
/** The PR touches at most `smallChangeMaxFiles` files. */
|
|
193
|
+
small_change: 0.05,
|
|
194
|
+
},
|
|
195
|
+
manyUntouchedThreadsMin: 3,
|
|
196
|
+
smallChangeMaxFiles: 3,
|
|
197
|
+
/** Hours on the row's OWN clock → stall risk. First match wins, checked top down. */
|
|
198
|
+
stallBuckets: [
|
|
199
|
+
{ minHours: 96, risk: 1.0 },
|
|
200
|
+
{ minHours: 48, risk: 0.7 },
|
|
201
|
+
{ minHours: 24, risk: 0.4 },
|
|
202
|
+
],
|
|
203
|
+
/** Under the lowest bucket, or no clock at all. An unknown age is never treated as urgent. */
|
|
204
|
+
stallBase: 0.15,
|
|
205
|
+
relevanceWeight: { direct: 1.0, maintained: 0.6, none: 0.25 },
|
|
206
|
+
};
|
|
207
|
+
/** The four named weightings Settings offers. A preset is DERIVED from the stored weights (an
|
|
208
|
+
* exact match on all three), never stored — Balanced stores nothing at all. */
|
|
209
|
+
export const DO_NEXT_PRESETS = {
|
|
210
|
+
balanced: { proximity: 50, stall: 30, relevance: 20 },
|
|
211
|
+
mine_first: { proximity: 30, stall: 10, relevance: 60 },
|
|
212
|
+
oldest_first: { proximity: 20, stall: 70, relevance: 10 },
|
|
213
|
+
quick_wins: { proximity: 80, stall: 10, relevance: 10 },
|
|
214
|
+
};
|
|
215
|
+
export const DO_NEXT_PRESET_ORDER = [
|
|
216
|
+
'balanced',
|
|
217
|
+
'mine_first',
|
|
218
|
+
'oldest_first',
|
|
219
|
+
'quick_wins',
|
|
220
|
+
];
|
|
221
|
+
/** Where a Dependencies-tab card starts on the Do next scale, by `DependencyPrState`. 'ready'
|
|
222
|
+
* splits on approval like a `merge` card (merge_approved / merge_unapproved); a flagged person's
|
|
223
|
+
* PR has no state and starts at `security_alert`. Read by db/work-plan.ts, printed by the guide. */
|
|
224
|
+
export const DEPENDENCY_STATE_BASE = {
|
|
225
|
+
behind: 'update_branch',
|
|
226
|
+
conflicts: 'conflicts',
|
|
227
|
+
ci_red: 'unblock_ci',
|
|
228
|
+
needs_review: 'nudge',
|
|
229
|
+
blocked: 'waiting',
|
|
230
|
+
unknown: 'waiting',
|
|
231
|
+
};
|
|
232
|
+
/** The card kinds that get no score. Review load is about PEOPLE, not pull requests, so it is
|
|
233
|
+
* listed beside the ranking rather than in it; the two bot cards never reach the Pending board. */
|
|
234
|
+
export const DO_NEXT_UNSCORED_KINDS = new Set([
|
|
235
|
+
'reviewer_load',
|
|
236
|
+
'bot_signal',
|
|
237
|
+
'bot_only_review',
|
|
238
|
+
]);
|
|
239
|
+
// ── THE PENDING TABS ──────────────────────────────────────────────────────────────────────────
|
|
240
|
+
/** How many of a tab's highest-scoring cards sit under "Do next". The rest are "Everything else". */
|
|
241
|
+
export const PENDING_DO_NEXT_SIZE = 5;
|
|
242
|
+
/**
|
|
243
|
+
* The six tabs, in display order, and the card kinds each holds. Every PR card kind on the board
|
|
244
|
+
* belongs to exactly ONE tab, so a card is listed once; a PR with two jobs (your approved PR is both
|
|
245
|
+
* "Approved" in My turn and "Ready to merge") appears once per job, in each job's tab.
|
|
246
|
+
*
|
|
247
|
+
* `reviewer_load` sits in 'review' but is not ranked with the PR cards — it is the "who has reviews
|
|
248
|
+
* waiting" strip at the top of that tab, and it is not in the tab's count.
|
|
249
|
+
*
|
|
250
|
+
* Every tab is one scored list, except the two STRICT-GROUP tabs, whose groups come first and are
|
|
251
|
+
* each scored within, whatever the scores:
|
|
252
|
+
* • `groupByReason` — My turn, grouped by card type (`MyTurnCard.reason`) in the READER'S order
|
|
253
|
+
* (Settings → My Turn; `PendingRankRules.myTurnOrder` on the response).
|
|
254
|
+
* • `groupByKind` — Dependencies, grouped by kind in the order listed: every security item before
|
|
255
|
+
* every bump.
|
|
256
|
+
* Both are read by the ONE group comparator (`tabGroupRank`, db/pending-tabs.ts), never a second
|
|
257
|
+
* sort chosen by tab key.
|
|
258
|
+
*/
|
|
259
|
+
export const PENDING_TABS = [
|
|
260
|
+
{ key: 'my_turn', kinds: ['my_turn'], groupByReason: true },
|
|
261
|
+
{ key: 'fixing', kinds: ['ci_failing', 'conflicts'] },
|
|
262
|
+
{ key: 'review', kinds: ['stalled_review', 'reviewer_routing', 'reviewer_load'] },
|
|
263
|
+
{ key: 'threads', kinds: ['untouched_thread'] },
|
|
264
|
+
{ key: 'land', kinds: ['merge', 'update_branch'] },
|
|
265
|
+
{ key: 'deps', kinds: ['security', 'dependency_bump'], groupByKind: true },
|
|
266
|
+
];
|
|
267
|
+
/** The tab a card kind lives in, or null for the two bot kinds (they never reach the board). */
|
|
268
|
+
export function pendingTabOf(kind) {
|
|
269
|
+
for (const t of PENDING_TABS)
|
|
270
|
+
if (t.kinds.includes(kind))
|
|
271
|
+
return t.key;
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
/** WHO OPENED IT, as the board's lens reads it: 'automation' iff the card names a PR whose
|
|
275
|
+
* `automation` is set (bots, coding agents, and a person's PR a tool's marker proves the tool made),
|
|
276
|
+
* else 'people'. ONE predicate for the server's caps and totals and the SPA's filter. A card that
|
|
277
|
+
* names no PR (review load, a trunk with no landing PR) is 'people', so every card falls on exactly
|
|
278
|
+
* one side and `people + automation === total` holds by construction. */
|
|
279
|
+
export function pendingAuthorSideOf(card) {
|
|
280
|
+
return 'automation' in card && card.automation != null ? 'automation' : 'people';
|
|
281
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// THE PRODUCT NAME, and the three labels that compose it.
|
|
3
|
+
//
|
|
4
|
+
// The app is called Limn. It used to be called Pierre, and the rename was staged:
|
|
5
|
+
// every user-visible string moved, while the published/runtime identifiers stayed
|
|
6
|
+
// on the old spelling because they are migrations rather than text edits.
|
|
7
|
+
// The npm package (`limn-review`, bin `limn`) and the data dir (`~/.limn`, moved once
|
|
8
|
+
// from `~/.pierre-review` on first boot) have since moved too. The
|
|
9
|
+
// canonical statement of that split lives at apps/landing/src/lib/site.ts (which
|
|
10
|
+
// has its own SITE_NAME and deliberately imports nothing from here — the landing
|
|
11
|
+
// bundle does not depend on this package). Short version of what is STILL
|
|
12
|
+
// `pierre` on purpose, and must never be swept:
|
|
13
|
+
//
|
|
14
|
+
// · the domain, the `pierre_session` / `pierre_oauth_state` cookies
|
|
15
|
+
// · the ~20 `pierre:*` localStorage keys
|
|
16
|
+
// · the AutomatedReviewerKind `'pierre'` — a persisted DB value AND a
|
|
17
|
+
// 400-validated API path segment
|
|
18
|
+
// · the `refs/pierre/conflict/` git namespace the janitor sweeps by prefix
|
|
19
|
+
// · `<!-- pierre:claude-review v=1 -->`, already stamped into GitHub review
|
|
20
|
+
// bodies we do not control
|
|
21
|
+
//
|
|
22
|
+
// So the name is a STRING, never an identifier. Use PRODUCT_NAME wherever the
|
|
23
|
+
// name is composed into a sentence or a label; the ~30 plain "Limn" literals
|
|
24
|
+
// already in the SPA are left alone on purpose (rewriting files nobody is
|
|
25
|
+
// otherwise touching buys churn, not safety).
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
/** The product name, as a reader sees it. */
|
|
28
|
+
export const PRODUCT_NAME = 'Limn';
|
|
29
|
+
/**
|
|
30
|
+
* Display labels for the three UNBRANDED automated-reviewer kinds.
|
|
31
|
+
*
|
|
32
|
+
* ⚠ SHARED IS OTHERWISE PRESENTATION-FREE AND THIS IS THE ONE EXCEPTION, narrowly. The ~80
|
|
33
|
+
* BRANDED vendor labels stay in the frontend's `BOT_VENDOR_META` beside their colours, which
|
|
34
|
+
* is what that rule is for. These three are different: `pierre` COMPOSES THE PRODUCT NAME, and
|
|
35
|
+
* `in_house` carries a judgement ("In-house / custom", not "In-house AI" — see below) that has
|
|
36
|
+
* to read the same everywhere. Three independent copies of these strings existed — the SPA's
|
|
37
|
+
* `BOT_VENDOR_META`, the backend's `labelFor`, and the Pro plugin's Slack `BOT_LABELS` — and
|
|
38
|
+
* they had drifted on BOTH counts: Slack was still emitting "Pierre · Claude" into digests
|
|
39
|
+
* months after the other two were renamed, and "In-house AI" after the other two had rejected
|
|
40
|
+
* that wording. Each of the three now reads these three keys from here.
|
|
41
|
+
*
|
|
42
|
+
* ⚠ "In-house / custom", NOT "In-house AI". The kind is the fallback for EVERY reviewer role,
|
|
43
|
+
* so an unbranded quality gate or a CLA bot lands here — and calling those "In-house AI" is how
|
|
44
|
+
* the bucket earned its reputation for being wrong. It is the role-neutral escape hatch.
|
|
45
|
+
*
|
|
46
|
+
* ⚠ `labelFor` in the backend WRITES these into `workspace_reviewers.label`, so they are
|
|
47
|
+
* persisted as well as rendered. Changing one is a copy change that shows up on already-stored
|
|
48
|
+
* rows only after the next classification pass.
|
|
49
|
+
*/
|
|
50
|
+
export const GENERIC_REVIEWER_LABELS = {
|
|
51
|
+
in_house: 'In-house / custom',
|
|
52
|
+
vendor: 'Vendor',
|
|
53
|
+
pierre: `${PRODUCT_NAME} · Claude`,
|
|
54
|
+
};
|