@levr-one/cli 0.12.14 → 0.12.16

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.
@@ -885,7 +885,9 @@ function besideName(serverName, url) {
885
885
  * `McpToolAdapterService.DESTRUCTIVE_TOOL_NAMES`.
886
886
  *
887
887
  * Rules for this list:
888
- * - Only the non-destructive tools a first task actually calls. A tool that
888
+ * - Only the non-destructive tools a first task or an ordinary gated issue
889
+ * actually calls (`batch_verify_gates`: agents used it in the real-agent
890
+ * trial, user decision 2026-11-04). A tool that
889
891
  * can delete, merge away or permanently unlink anything never belongs here.
890
892
  * - Nor does a tool whose PURPOSE is to waive a check (waive_gate): see
891
893
  * {@link LEVR_NEVER_PREAPPROVED_TOOLS}.
@@ -914,11 +916,13 @@ const LEVR_PREAPPROVED_TOOLS = [
914
916
  "get_issue_comments",
915
917
  "add_issue_comment",
916
918
  "deploy_gates",
917
- "verify_deliverable_gates",
919
+ "verify_gates",
920
+ "batch_verify_gates",
918
921
  "report_gate_results",
919
922
  "get_gate_status",
920
923
  "transition_issue",
921
- "get_practice_app"
924
+ "get_practice_app",
925
+ "my_work"
922
926
  ];
923
927
  /**
924
928
  * A plain description of what each tool does, printed next to its entry in
@@ -936,10 +940,12 @@ const LEVR_PREAPPROVED_TOOL_DESCRIPTIONS = {
936
940
  add_issue_comment: "adds a comment to a task",
937
941
  deploy_gates: "writes the task's gates; it can also change or withdraw a gate (recorded)",
938
942
  transition_issue: "moves a task to another status; Done is refused while a required check fails, unless your agent waives that check (the waiver is recorded)",
939
- verify_deliverable_gates: "runs the task's checklist",
943
+ verify_gates: "runs the task's checklist",
944
+ batch_verify_gates: "runs the checklists of several tasks in one call",
940
945
  report_gate_results: "records the checklist results your agent ran",
941
946
  get_gate_status: "reads the task's checklist results",
942
- get_practice_app: "reads the sample practice app"
947
+ get_practice_app: "reads the sample practice app",
948
+ my_work: "reads your tasks, ranked, with what to pick up next"
943
949
  };
944
950
 
945
951
  //#endregion
@@ -2629,6 +2629,736 @@ const ReviewLoopPrMergedEventSchema = z.object({
2629
2629
  */
2630
2630
  const ReviewLoopEventSchema = z.discriminatedUnion("event", [ReviewLoopPushEventSchema, ReviewLoopPrMergedEventSchema]);
2631
2631
 
2632
+ //#endregion
2633
+ //#region ../shared/dist/issues/next-issue/job-profiles.js
2634
+ /** States where a deliverable waits for verification (QA's lead tier). */
2635
+ const VERIFICATION_STATE_NAMES = ["In Review", "Gates Pending"];
2636
+ /**
2637
+ * The state named Review that PM's lead tier admits Proposals and Plans from
2638
+ * (a Plan's own `Review` state). A Proposal's `In Review` is a verification
2639
+ * name, declared once in VERIFICATION_STATE_NAMES, and is NOT part of this
2640
+ * tier; Proposals reach PM through the triage clause instead.
2641
+ */
2642
+ const PM_REVIEW_STATE_NAMES = ["Review"];
2643
+ /** The dev type order. An untyped or unknown type sorts after the last tier. */
2644
+ const DEV_TYPE_TIERS = [
2645
+ ["Incident"],
2646
+ ["Bug", "Security"],
2647
+ ["Deliverable", "Finding"],
2648
+ [
2649
+ "Task",
2650
+ "Feature",
2651
+ "Improvement",
2652
+ "Story",
2653
+ "Chore"
2654
+ ],
2655
+ ["Doc", "Test"]
2656
+ ];
2657
+ /** Case-insensitive, whitespace-trimmed name match. */
2658
+ function nameMatches(name, names) {
2659
+ if (!name) return false;
2660
+ const needle = name.trim().toLowerCase();
2661
+ return names.some((candidate) => candidate.toLowerCase() === needle);
2662
+ }
2663
+ const DEV_PROFILE = {
2664
+ job: "dev",
2665
+ typeTiers: DEV_TYPE_TIERS,
2666
+ leadTier: null,
2667
+ admittedContainerTypes: [],
2668
+ affinity: null
2669
+ };
2670
+ /** Move `promoted` types into a new first tier, keeping the rest in dev order. */
2671
+ function promoteTypes(tiers, promoted) {
2672
+ const promotedLower = new Set(promoted.map((t) => t.toLowerCase()));
2673
+ return [promoted, ...tiers.map((tier) => tier.filter((t) => !promotedLower.has(t.toLowerCase()))).filter((tier) => tier.length > 0)];
2674
+ }
2675
+ const QA_VERIFICATION_TIER = {
2676
+ name: "verification",
2677
+ matches: (issue$1) => nameMatches(issue$1.stateName, VERIFICATION_STATE_NAMES),
2678
+ reason: () => "waiting in verification"
2679
+ };
2680
+ /**
2681
+ * PM's lead tier: every triage-type issue (a Decision awaiting an answer is
2682
+ * one), plus Proposals and Plans in a state named Review
2683
+ * (PM_REVIEW_STATE_NAMES). A Proposal in Triage matches the first clause; a
2684
+ * Proposal, Plan or Decision in any other state does not.
2685
+ */
2686
+ const PM_TRIAGE_TIER = {
2687
+ name: "triage",
2688
+ matches: (issue$1) => issue$1.stateType === "triage" || nameMatches(issue$1.typeName, ["Proposal", "Plan"]) && nameMatches(issue$1.stateName, PM_REVIEW_STATE_NAMES),
2689
+ reason: (issue$1) => {
2690
+ if (nameMatches(issue$1.typeName, ["Proposal"])) return "proposal awaiting review";
2691
+ if (nameMatches(issue$1.typeName, ["Plan"])) return "plan in review";
2692
+ if (nameMatches(issue$1.typeName, ["Decision"])) return "decision awaiting an answer";
2693
+ return "waiting in triage";
2694
+ }
2695
+ };
2696
+ const JOB_PROFILES = {
2697
+ dev: DEV_PROFILE,
2698
+ qa: {
2699
+ ...DEV_PROFILE,
2700
+ job: "qa",
2701
+ typeTiers: promoteTypes(DEV_PROFILE.typeTiers, [
2702
+ "Bug",
2703
+ "Incident",
2704
+ "Test",
2705
+ "Finding"
2706
+ ]),
2707
+ leadTier: QA_VERIFICATION_TIER
2708
+ },
2709
+ pm: {
2710
+ ...DEV_PROFILE,
2711
+ job: "pm",
2712
+ leadTier: PM_TRIAGE_TIER,
2713
+ admittedContainerTypes: [
2714
+ "Proposal",
2715
+ "Plan",
2716
+ "Decision"
2717
+ ]
2718
+ }
2719
+ };
2720
+
2721
+ //#endregion
2722
+ //#region ../shared/dist/issues/next-issue/rank-next-issues.js
2723
+ const DUE_SOON_WINDOW_MS = 10080 * 60 * 1e3;
2724
+
2725
+ //#endregion
2726
+ //#region ../shared/dist/issues/next-issue/conformance-fixture.js
2727
+ /**
2728
+ * The conformance fixture for the next-issue ranker (Plan ENG-7779, D1 sub-req 7).
2729
+ *
2730
+ * Raw `SnapshotRows` plus the EXPECTED full order for each job. The same
2731
+ * fixture is asserted by the shared unit tests (D1), by the backend adapter's
2732
+ * conformance spec once the rows are round-tripped through Postgres (D2) and by
2733
+ * the client mapper (D4): if the two sides ever disagree on the order, this is
2734
+ * what they disagree against.
2735
+ *
2736
+ * The actor is `user-me`, on team `team-1`. The completed issue is ENG-100,
2737
+ * a child of plan ENG-90; it was blocking ENG-101 (now free) and ENG-102 (still
2738
+ * blocked by ENG-300). `now` is 2026-10-23T12:00:00Z.
2739
+ *
2740
+ * Coverage checklist (one row per bullet, at least):
2741
+ * - every dev tier: parked, ownership, momentum (unblocked AND sibling), each
2742
+ * state type, each priority value including 0, each deadline bucket, each
2743
+ * type tier, recency and identifier tiebreaks
2744
+ * - a mirrored relation pair (ENG-129 ⇄ ENG-300) counted once
2745
+ * - a hidden blocker (ENG-116 → X-999, absent everywhere)
2746
+ * - an open blocker that exists only in `relationEndStates` (ENG-117 → out-1)
2747
+ * - a closed blocker in the pool (ENG-118 → ENG-119, done) and a closed
2748
+ * `depends_on` (ENG-130 → ENG-119)
2749
+ * - a past snooze (ENG-114) and a future snooze (ENG-113)
2750
+ * - an unassigned in_progress issue (ENG-107) treated as to_do
2751
+ * - excluded rows present for every exclusion: finished (ENG-100, ENG-119,
2752
+ * ENG-128), containers (ENG-90, ENG-123, ENG-124, ENG-126), someone else's
2753
+ * (ENG-120, ENG-121, ENG-127, ENG-300) — the job tests slice the pool down
2754
+ * to fewer survivors than `limit` and assert none of these fill the gap
2755
+ */
2756
+ const ME = "user-me";
2757
+ const OTHER = "user-other";
2758
+ const TEAM = "team-1";
2759
+ const S = {
2760
+ triage: "st-triage",
2761
+ backlog: "st-backlog",
2762
+ todo: "st-todo",
2763
+ inProgress: "st-in-progress",
2764
+ inReview: "st-in-review",
2765
+ gatesPending: "st-gates-pending",
2766
+ blocked: "st-blocked",
2767
+ planReview: "st-plan-review",
2768
+ done: "st-done",
2769
+ canceled: "st-canceled"
2770
+ };
2771
+ const T = {
2772
+ incident: "tl-incident",
2773
+ bug: "tl-bug",
2774
+ security: "tl-security",
2775
+ deliverable: "tl-deliverable",
2776
+ finding: "tl-finding",
2777
+ task: "tl-task",
2778
+ feature: "tl-feature",
2779
+ doc: "tl-doc",
2780
+ test: "tl-test",
2781
+ epic: "tl-epic",
2782
+ plan: "tl-plan",
2783
+ proposal: "tl-proposal",
2784
+ decision: "tl-decision"
2785
+ };
2786
+ const CYCLE_ACTIVE = "cycle-active";
2787
+ const CYCLE_UPCOMING = "cycle-upcoming";
2788
+ const day = (d) => `2026-10-${d}T00:00:00.000Z`;
2789
+ const issue = (s) => ({
2790
+ id: `i-${s.n}`,
2791
+ identifier: `ENG-${s.n}`,
2792
+ title: s.title ?? `Issue ${s.n}`,
2793
+ team_id: TEAM,
2794
+ project_id: "project-1",
2795
+ parent_id: s.parent ?? null,
2796
+ assignee_id: s.assignee,
2797
+ priority: s.priority,
2798
+ workflow_state_id: s.state,
2799
+ type_label_id: s.type,
2800
+ due_date: s.due ?? null,
2801
+ snoozed_until: s.snoozed ?? null,
2802
+ sla_status: s.sla ?? null,
2803
+ cycle_id: s.cycle ?? null,
2804
+ updated_at: day(s.updated)
2805
+ });
2806
+ const rel = (issueN, relation_type, relatedN) => ({
2807
+ issue_id: typeof issueN === "number" ? `i-${issueN}` : issueN,
2808
+ related_issue_id: typeof relatedN === "number" ? `i-${relatedN}` : relatedN,
2809
+ relation_type
2810
+ });
2811
+ const NEXT_ISSUE_CONFORMANCE_FIXTURE = {
2812
+ actorId: ME,
2813
+ teamIds: [TEAM],
2814
+ completedIssueId: "i-100",
2815
+ now: "2026-10-23T12:00:00.000Z",
2816
+ rows: {
2817
+ workflowStates: [
2818
+ {
2819
+ id: S.triage,
2820
+ name: "Triage",
2821
+ type: "triage"
2822
+ },
2823
+ {
2824
+ id: S.backlog,
2825
+ name: "Backlog",
2826
+ type: "backlog"
2827
+ },
2828
+ {
2829
+ id: S.todo,
2830
+ name: "To Do",
2831
+ type: "to_do"
2832
+ },
2833
+ {
2834
+ id: S.inProgress,
2835
+ name: "In Progress",
2836
+ type: "in_progress"
2837
+ },
2838
+ {
2839
+ id: S.inReview,
2840
+ name: "In Review",
2841
+ type: "in_progress"
2842
+ },
2843
+ {
2844
+ id: S.gatesPending,
2845
+ name: "Gates Pending",
2846
+ type: "in_progress"
2847
+ },
2848
+ {
2849
+ id: S.blocked,
2850
+ name: "Blocked",
2851
+ type: "in_progress"
2852
+ },
2853
+ {
2854
+ id: S.planReview,
2855
+ name: "Review",
2856
+ type: "in_progress"
2857
+ },
2858
+ {
2859
+ id: S.done,
2860
+ name: "Done",
2861
+ type: "done"
2862
+ },
2863
+ {
2864
+ id: S.canceled,
2865
+ name: "Canceled",
2866
+ type: "canceled"
2867
+ }
2868
+ ],
2869
+ typeLabels: [
2870
+ {
2871
+ id: T.incident,
2872
+ name: "Incident"
2873
+ },
2874
+ {
2875
+ id: T.bug,
2876
+ name: "Bug"
2877
+ },
2878
+ {
2879
+ id: T.security,
2880
+ name: "Security"
2881
+ },
2882
+ {
2883
+ id: T.deliverable,
2884
+ name: "Deliverable"
2885
+ },
2886
+ {
2887
+ id: T.finding,
2888
+ name: "Finding"
2889
+ },
2890
+ {
2891
+ id: T.task,
2892
+ name: "Task"
2893
+ },
2894
+ {
2895
+ id: T.feature,
2896
+ name: "Feature"
2897
+ },
2898
+ {
2899
+ id: T.doc,
2900
+ name: "Doc"
2901
+ },
2902
+ {
2903
+ id: T.test,
2904
+ name: "Test"
2905
+ },
2906
+ {
2907
+ id: T.epic,
2908
+ name: "Epic"
2909
+ },
2910
+ {
2911
+ id: T.plan,
2912
+ name: "Plan"
2913
+ },
2914
+ {
2915
+ id: T.proposal,
2916
+ name: "Proposal"
2917
+ },
2918
+ {
2919
+ id: T.decision,
2920
+ name: "Decision"
2921
+ }
2922
+ ],
2923
+ cycles: [{
2924
+ id: CYCLE_ACTIVE,
2925
+ status: "active",
2926
+ starts_at: day("20"),
2927
+ ends_at: day("26")
2928
+ }, {
2929
+ id: CYCLE_UPCOMING,
2930
+ status: "upcoming",
2931
+ starts_at: day("27"),
2932
+ ends_at: "2026-11-02T00:00:00.000Z"
2933
+ }],
2934
+ issues: [
2935
+ issue({
2936
+ n: 90,
2937
+ state: S.inProgress,
2938
+ priority: 2,
2939
+ type: T.plan,
2940
+ assignee: ME,
2941
+ updated: "23",
2942
+ title: "Plan ENG-90"
2943
+ }),
2944
+ issue({
2945
+ n: 100,
2946
+ state: S.done,
2947
+ priority: 3,
2948
+ type: T.task,
2949
+ assignee: ME,
2950
+ updated: "23",
2951
+ parent: "i-90",
2952
+ title: "Completed"
2953
+ }),
2954
+ issue({
2955
+ n: 101,
2956
+ state: S.todo,
2957
+ priority: 3,
2958
+ type: T.task,
2959
+ assignee: null,
2960
+ updated: "20",
2961
+ title: "Unblocked by 100"
2962
+ }),
2963
+ issue({
2964
+ n: 102,
2965
+ state: S.todo,
2966
+ priority: 1,
2967
+ type: T.bug,
2968
+ assignee: ME,
2969
+ updated: "14",
2970
+ title: "Still blocked"
2971
+ }),
2972
+ issue({
2973
+ n: 103,
2974
+ state: S.todo,
2975
+ priority: 2,
2976
+ type: T.feature,
2977
+ assignee: null,
2978
+ updated: "20",
2979
+ parent: "i-90",
2980
+ title: "Sibling"
2981
+ }),
2982
+ issue({
2983
+ n: 104,
2984
+ state: S.inProgress,
2985
+ priority: 3,
2986
+ type: T.task,
2987
+ assignee: ME,
2988
+ updated: "22",
2989
+ title: "Mine in progress"
2990
+ }),
2991
+ issue({
2992
+ n: 105,
2993
+ state: S.todo,
2994
+ priority: 1,
2995
+ type: T.bug,
2996
+ assignee: ME,
2997
+ updated: "22",
2998
+ title: "Mine urgent"
2999
+ }),
3000
+ issue({
3001
+ n: 106,
3002
+ state: S.backlog,
3003
+ priority: 2,
3004
+ type: T.task,
3005
+ assignee: ME,
3006
+ updated: "12",
3007
+ due: day("20"),
3008
+ title: "Mine backlog overdue"
3009
+ }),
3010
+ issue({
3011
+ n: 107,
3012
+ state: S.inProgress,
3013
+ priority: 1,
3014
+ type: T.task,
3015
+ assignee: null,
3016
+ updated: "21",
3017
+ title: "Unowned in progress"
3018
+ }),
3019
+ issue({
3020
+ n: 108,
3021
+ state: S.todo,
3022
+ priority: 0,
3023
+ type: T.task,
3024
+ assignee: null,
3025
+ updated: "22",
3026
+ title: "No priority"
3027
+ }),
3028
+ issue({
3029
+ n: 109,
3030
+ state: S.todo,
3031
+ priority: 4,
3032
+ type: T.incident,
3033
+ assignee: null,
3034
+ updated: "21",
3035
+ title: "Low incident"
3036
+ }),
3037
+ issue({
3038
+ n: 110,
3039
+ state: S.todo,
3040
+ priority: 3,
3041
+ type: T.bug,
3042
+ assignee: null,
3043
+ updated: "20",
3044
+ cycle: CYCLE_ACTIVE,
3045
+ title: "In active cycle"
3046
+ }),
3047
+ issue({
3048
+ n: 111,
3049
+ state: S.todo,
3050
+ priority: 3,
3051
+ type: T.doc,
3052
+ assignee: null,
3053
+ updated: "10",
3054
+ title: "Doc"
3055
+ }),
3056
+ issue({
3057
+ n: 112,
3058
+ state: S.todo,
3059
+ priority: 3,
3060
+ type: null,
3061
+ assignee: null,
3062
+ updated: "21",
3063
+ title: "Untyped"
3064
+ }),
3065
+ issue({
3066
+ n: 113,
3067
+ state: S.todo,
3068
+ priority: 1,
3069
+ type: T.bug,
3070
+ assignee: ME,
3071
+ updated: "14",
3072
+ snoozed: "2026-11-01T00:00:00.000Z",
3073
+ title: "Snoozed"
3074
+ }),
3075
+ issue({
3076
+ n: 114,
3077
+ state: S.todo,
3078
+ priority: 3,
3079
+ type: T.task,
3080
+ assignee: ME,
3081
+ updated: "16",
3082
+ snoozed: day("01"),
3083
+ title: "Snooze expired"
3084
+ }),
3085
+ issue({
3086
+ n: 115,
3087
+ state: S.blocked,
3088
+ priority: 1,
3089
+ type: T.bug,
3090
+ assignee: ME,
3091
+ updated: "19",
3092
+ title: "Blocked state"
3093
+ }),
3094
+ issue({
3095
+ n: 116,
3096
+ state: S.todo,
3097
+ priority: 1,
3098
+ type: T.bug,
3099
+ assignee: ME,
3100
+ updated: "14",
3101
+ title: "Hidden blocker"
3102
+ }),
3103
+ issue({
3104
+ n: 117,
3105
+ state: S.todo,
3106
+ priority: 1,
3107
+ type: T.bug,
3108
+ assignee: ME,
3109
+ updated: "14",
3110
+ title: "Outside-pool blocker"
3111
+ }),
3112
+ issue({
3113
+ n: 118,
3114
+ state: S.todo,
3115
+ priority: 3,
3116
+ type: T.task,
3117
+ assignee: ME,
3118
+ updated: "18",
3119
+ title: "Closed blocker"
3120
+ }),
3121
+ issue({
3122
+ n: 119,
3123
+ state: S.done,
3124
+ priority: 3,
3125
+ type: T.task,
3126
+ assignee: ME,
3127
+ updated: "01",
3128
+ title: "Done blocker"
3129
+ }),
3130
+ issue({
3131
+ n: 120,
3132
+ state: S.inReview,
3133
+ priority: 2,
3134
+ type: T.deliverable,
3135
+ assignee: OTHER,
3136
+ updated: "21",
3137
+ title: "Other in review"
3138
+ }),
3139
+ issue({
3140
+ n: 121,
3141
+ state: S.gatesPending,
3142
+ priority: 3,
3143
+ type: T.deliverable,
3144
+ assignee: OTHER,
3145
+ updated: "21",
3146
+ title: "Other gates pending"
3147
+ }),
3148
+ issue({
3149
+ n: 122,
3150
+ state: S.triage,
3151
+ priority: 2,
3152
+ type: T.bug,
3153
+ assignee: null,
3154
+ updated: "21",
3155
+ title: "Triage bug"
3156
+ }),
3157
+ issue({
3158
+ n: 123,
3159
+ state: S.triage,
3160
+ priority: 3,
3161
+ type: T.proposal,
3162
+ assignee: null,
3163
+ updated: "20",
3164
+ title: "Proposal"
3165
+ }),
3166
+ issue({
3167
+ n: 124,
3168
+ state: S.planReview,
3169
+ priority: 2,
3170
+ type: T.plan,
3171
+ assignee: OTHER,
3172
+ updated: "20",
3173
+ title: "Plan in review"
3174
+ }),
3175
+ issue({
3176
+ n: 125,
3177
+ state: S.triage,
3178
+ priority: 0,
3179
+ type: T.decision,
3180
+ assignee: null,
3181
+ updated: "20",
3182
+ title: "Decision"
3183
+ }),
3184
+ issue({
3185
+ n: 126,
3186
+ state: S.todo,
3187
+ priority: 1,
3188
+ type: T.epic,
3189
+ assignee: ME,
3190
+ updated: "20",
3191
+ title: "Epic"
3192
+ }),
3193
+ issue({
3194
+ n: 127,
3195
+ state: S.todo,
3196
+ priority: 1,
3197
+ type: T.task,
3198
+ assignee: OTHER,
3199
+ updated: "20",
3200
+ title: "Other task"
3201
+ }),
3202
+ issue({
3203
+ n: 128,
3204
+ state: S.canceled,
3205
+ priority: 1,
3206
+ type: T.bug,
3207
+ assignee: ME,
3208
+ updated: "01",
3209
+ title: "Canceled"
3210
+ }),
3211
+ issue({
3212
+ n: 129,
3213
+ state: S.todo,
3214
+ priority: 3,
3215
+ type: T.task,
3216
+ assignee: ME,
3217
+ updated: "13",
3218
+ title: "Mirrored pair"
3219
+ }),
3220
+ issue({
3221
+ n: 130,
3222
+ state: S.todo,
3223
+ priority: 3,
3224
+ type: T.test,
3225
+ assignee: ME,
3226
+ updated: "17",
3227
+ title: "Depends on done"
3228
+ }),
3229
+ issue({
3230
+ n: 131,
3231
+ state: S.todo,
3232
+ priority: 2,
3233
+ type: T.task,
3234
+ assignee: ME,
3235
+ updated: "21",
3236
+ due: day("27"),
3237
+ title: "Due soon"
3238
+ }),
3239
+ issue({
3240
+ n: 132,
3241
+ state: S.todo,
3242
+ priority: 2,
3243
+ type: T.task,
3244
+ assignee: ME,
3245
+ updated: "19",
3246
+ sla: "at_risk",
3247
+ title: "SLA at risk"
3248
+ }),
3249
+ issue({
3250
+ n: 300,
3251
+ state: S.todo,
3252
+ priority: 2,
3253
+ type: T.task,
3254
+ assignee: OTHER,
3255
+ updated: "20",
3256
+ title: "Open blocker"
3257
+ })
3258
+ ],
3259
+ relations: [
3260
+ rel(100, "blocks", 101),
3261
+ rel(101, "blocked_by", 100),
3262
+ rel(100, "blocks", 102),
3263
+ rel(102, "blocked_by", 300),
3264
+ rel(116, "blocked_by", "x-999"),
3265
+ rel(117, "blocked_by", "out-1"),
3266
+ rel(118, "blocked_by", 119),
3267
+ rel(129, "blocked_by", 300),
3268
+ rel(300, "blocks", 129),
3269
+ rel(130, "depends_on", 119),
3270
+ rel(119, "is_dependency_of", 130),
3271
+ rel(104, "relates_to", 105)
3272
+ ],
3273
+ relationEndStates: {
3274
+ "out-1": "open",
3275
+ "out-2": "closed"
3276
+ }
3277
+ },
3278
+ expected: {
3279
+ dev: [
3280
+ "ENG-104",
3281
+ "ENG-105",
3282
+ "ENG-131",
3283
+ "ENG-132",
3284
+ "ENG-118",
3285
+ "ENG-114",
3286
+ "ENG-130",
3287
+ "ENG-106",
3288
+ "ENG-101",
3289
+ "ENG-103",
3290
+ "ENG-107",
3291
+ "ENG-110",
3292
+ "ENG-111",
3293
+ "ENG-112",
3294
+ "ENG-108",
3295
+ "ENG-109",
3296
+ "ENG-122",
3297
+ "ENG-115",
3298
+ "ENG-102",
3299
+ "ENG-113",
3300
+ "ENG-116",
3301
+ "ENG-117",
3302
+ "ENG-129"
3303
+ ],
3304
+ qa: [
3305
+ "ENG-120",
3306
+ "ENG-121",
3307
+ "ENG-104",
3308
+ "ENG-105",
3309
+ "ENG-131",
3310
+ "ENG-132",
3311
+ "ENG-130",
3312
+ "ENG-118",
3313
+ "ENG-114",
3314
+ "ENG-106",
3315
+ "ENG-101",
3316
+ "ENG-103",
3317
+ "ENG-107",
3318
+ "ENG-110",
3319
+ "ENG-111",
3320
+ "ENG-112",
3321
+ "ENG-108",
3322
+ "ENG-109",
3323
+ "ENG-122",
3324
+ "ENG-115",
3325
+ "ENG-102",
3326
+ "ENG-113",
3327
+ "ENG-116",
3328
+ "ENG-117",
3329
+ "ENG-129"
3330
+ ],
3331
+ pm: [
3332
+ "ENG-122",
3333
+ "ENG-123",
3334
+ "ENG-125",
3335
+ "ENG-124",
3336
+ "ENG-104",
3337
+ "ENG-105",
3338
+ "ENG-131",
3339
+ "ENG-132",
3340
+ "ENG-118",
3341
+ "ENG-114",
3342
+ "ENG-130",
3343
+ "ENG-106",
3344
+ "ENG-101",
3345
+ "ENG-103",
3346
+ "ENG-107",
3347
+ "ENG-110",
3348
+ "ENG-111",
3349
+ "ENG-112",
3350
+ "ENG-108",
3351
+ "ENG-109",
3352
+ "ENG-115",
3353
+ "ENG-102",
3354
+ "ENG-113",
3355
+ "ENG-116",
3356
+ "ENG-117",
3357
+ "ENG-129"
3358
+ ]
3359
+ }
3360
+ };
3361
+
2632
3362
  //#endregion
2633
3363
  //#region ../shared/dist/first-task/first-task-prompt.js
2634
3364
  /**
@@ -2758,7 +3488,7 @@ async function executeBindingsImport(flags, file, deps) {
2758
3488
  const out = [];
2759
3489
  if (flags["repo-root"]) {
2760
3490
  const root = flags["repo-root"];
2761
- const missing = missingFiles(payload, (rel) => deps.exists(root, rel));
3491
+ const missing = missingFiles(payload, (rel$1) => deps.exists(root, rel$1));
2762
3492
  for (const f of namedFiles(payload)) out.push(`${missing.includes(f) ? "MISSING" : "present"} ${f}`);
2763
3493
  if (missing.length > 0) return {
2764
3494
  exitCode: 1,
@@ -2820,7 +3550,7 @@ async function liveDeps(workspaceFlag) {
2820
3550
  })),
2821
3551
  readFile: (file) => fs.readFileSync(file, "utf8"),
2822
3552
  writeFile: (file, content) => fs.writeFileSync(file, content),
2823
- exists: (root, rel) => fs.existsSync(path$1.join(root, rel))
3553
+ exists: (root, rel$1) => fs.existsSync(path$1.join(root, rel$1))
2824
3554
  };
2825
3555
  }
2826
3556
  function emit(ctx, outcome) {
package/dist/cli.js CHANGED
@@ -226,7 +226,7 @@ Examples:
226
226
  aliases: { y: "yes" }
227
227
  },
228
228
  loader: async () => {
229
- const { mcpAddHandler } = await import("./addHandler-Dafsu41N.js");
229
+ const { mcpAddHandler } = await import("./addHandler-CefzsA_l.js");
230
230
  return mcpAddHandler;
231
231
  }
232
232
  });
@@ -688,7 +688,7 @@ Examples:
688
688
  }
689
689
  },
690
690
  loader: async () => {
691
- const { gatesBindingsExportHandler } = await import("./bindingsHandler-8XKyaTyq.js");
691
+ const { gatesBindingsExportHandler } = await import("./bindingsHandler-DQHF9AqQ.js");
692
692
  return gatesBindingsExportHandler;
693
693
  }
694
694
  });
@@ -761,7 +761,7 @@ Examples:
761
761
  aliases: { w: "workspace-id" }
762
762
  },
763
763
  loader: async () => {
764
- const { gatesBindingsImportHandler } = await import("./bindingsHandler-8XKyaTyq.js");
764
+ const { gatesBindingsImportHandler } = await import("./bindingsHandler-DQHF9AqQ.js");
765
765
  return gatesBindingsImportHandler;
766
766
  }
767
767
  });
@@ -980,8 +980,8 @@ Examples:
980
980
  //#region src/commands/gates/run.ts
981
981
  const gatesRunCommand = buildCommand({
982
982
  docs: {
983
- brief: "Run a deliverable's gate commands and report the raw results",
984
- fullDescription: `Verify a deliverable's gates, run every local command from the current
983
+ brief: "Run an issue's gate commands and report the raw results",
984
+ fullDescription: `Verify an issue's gates, run every local command from the current
985
985
  directory (run it from the repo root), and report the raw exit code and output
986
986
  tails so the server can derive each verdict.
987
987
 
@@ -1012,7 +1012,7 @@ Examples:
1012
1012
  kind: "tuple",
1013
1013
  parameters: [{
1014
1014
  parse: String,
1015
- brief: "Deliverable issue identifier (ENG-50) or UUID",
1015
+ brief: "Issue identifier (ENG-50) or UUID",
1016
1016
  placeholder: "issue",
1017
1017
  optional: false
1018
1018
  }]
@@ -1248,7 +1248,7 @@ Examples:
1248
1248
 
1249
1249
  //#endregion
1250
1250
  //#region package.json
1251
- var version = "0.12.14";
1251
+ var version = "0.12.16";
1252
1252
 
1253
1253
  //#endregion
1254
1254
  //#region src/app.ts
@@ -1283,7 +1283,7 @@ const gatesRoutes = buildRouteMap({
1283
1283
  refs: gatesRefsCommand,
1284
1284
  run: gatesRunCommand
1285
1285
  },
1286
- docs: { brief: "Run a deliverable's gates and report the raw results" }
1286
+ docs: { brief: "Run an issue's gates and report the raw results" }
1287
1287
  });
1288
1288
  const resultRoutes = buildRouteMap({
1289
1289
  routes: { append: resultAppendCommand },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@levr-one/cli",
3
- "version": "0.12.14",
3
+ "version": "0.12.16",
4
4
  "description": "The command-line interface for Levr",
5
5
  "type": "module",
6
6
  "license": "MIT",