@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-
|
|
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-
|
|
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-
|
|
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.
|
|
1251
|
+
var version = "0.12.15";
|
|
1252
1252
|
|
|
1253
1253
|
//#endregion
|
|
1254
1254
|
//#region src/app.ts
|