@levr-one/cli 0.12.13 → 0.12.15

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.
@@ -918,7 +918,8 @@ const LEVR_PREAPPROVED_TOOLS = [
918
918
  "report_gate_results",
919
919
  "get_gate_status",
920
920
  "transition_issue",
921
- "get_practice_app"
921
+ "get_practice_app",
922
+ "my_work"
922
923
  ];
923
924
  /**
924
925
  * A plain description of what each tool does, printed next to its entry in
@@ -939,7 +940,8 @@ const LEVR_PREAPPROVED_TOOL_DESCRIPTIONS = {
939
940
  verify_deliverable_gates: "runs the task's checklist",
940
941
  report_gate_results: "records the checklist results your agent ran",
941
942
  get_gate_status: "reads the task's checklist results",
942
- get_practice_app: "reads the sample practice app"
943
+ get_practice_app: "reads the sample practice app",
944
+ my_work: "reads your tasks, ranked, with what to pick up next"
943
945
  };
944
946
 
945
947
  //#endregion
@@ -362,6 +362,29 @@ const ORDERING_FIXTURES = [
362
362
  }
363
363
  ];
364
364
 
365
+ //#endregion
366
+ //#region ../shared/dist/runs/automation-retention.js
367
+ /** The newest runs of every source are always kept. Not configurable. */
368
+ const AUTOMATION_RETENTION_FLOOR = 10;
369
+ const AUTOMATION_RETENTION_MAX_RUNS_MIN = AUTOMATION_RETENTION_FLOOR;
370
+ const AUTOMATION_RETENTION_MAX_RUNS_MAX = 1e4;
371
+ /**
372
+ * The stored value of the retention setting. Strict: an unknown key is a
373
+ * malformed value, not something to carry along silently.
374
+ */
375
+ const AutomationRetentionSettingSchema = z.object({
376
+ days: z.union([
377
+ z.literal(30),
378
+ z.literal(90),
379
+ z.literal(180)
380
+ ]),
381
+ maxRunsPerSource: z.number().int().min(AUTOMATION_RETENTION_MAX_RUNS_MIN).max(AUTOMATION_RETENTION_MAX_RUNS_MAX)
382
+ }).strict();
383
+ const AUTOMATION_RETENTION_DEFAULTS = Object.freeze({
384
+ days: 90,
385
+ maxRunsPerSource: 100
386
+ });
387
+
365
388
  //#endregion
366
389
  //#region ../shared/dist/runs/gate-command-pattern.js
367
390
  /** Package managers, fetchers, interpreters, shells, and wrappers. */
@@ -2606,6 +2629,736 @@ const ReviewLoopPrMergedEventSchema = z.object({
2606
2629
  */
2607
2630
  const ReviewLoopEventSchema = z.discriminatedUnion("event", [ReviewLoopPushEventSchema, ReviewLoopPrMergedEventSchema]);
2608
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
+
2609
3362
  //#endregion
2610
3363
  //#region ../shared/dist/first-task/first-task-prompt.js
2611
3364
  /**
@@ -2735,7 +3488,7 @@ async function executeBindingsImport(flags, file, deps) {
2735
3488
  const out = [];
2736
3489
  if (flags["repo-root"]) {
2737
3490
  const root = flags["repo-root"];
2738
- const missing = missingFiles(payload, (rel) => deps.exists(root, rel));
3491
+ const missing = missingFiles(payload, (rel$1) => deps.exists(root, rel$1));
2739
3492
  for (const f of namedFiles(payload)) out.push(`${missing.includes(f) ? "MISSING" : "present"} ${f}`);
2740
3493
  if (missing.length > 0) return {
2741
3494
  exitCode: 1,
@@ -2797,7 +3550,7 @@ async function liveDeps(workspaceFlag) {
2797
3550
  })),
2798
3551
  readFile: (file) => fs.readFileSync(file, "utf8"),
2799
3552
  writeFile: (file, content) => fs.writeFileSync(file, content),
2800
- exists: (root, rel) => fs.existsSync(path$1.join(root, rel))
3553
+ exists: (root, rel$1) => fs.existsSync(path$1.join(root, rel$1))
2801
3554
  };
2802
3555
  }
2803
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-DG2flbF8.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-CT-rFFn9.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-CT-rFFn9.js");
764
+ const { gatesBindingsImportHandler } = await import("./bindingsHandler-DQHF9AqQ.js");
765
765
  return gatesBindingsImportHandler;
766
766
  }
767
767
  });
@@ -1248,7 +1248,7 @@ Examples:
1248
1248
 
1249
1249
  //#endregion
1250
1250
  //#region package.json
1251
- var version = "0.12.13";
1251
+ var version = "0.12.15";
1252
1252
 
1253
1253
  //#endregion
1254
1254
  //#region src/app.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@levr-one/cli",
3
- "version": "0.12.13",
3
+ "version": "0.12.15",
4
4
  "description": "The command-line interface for Levr",
5
5
  "type": "module",
6
6
  "license": "MIT",