@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
|
|
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
|
-
"
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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
|
});
|
|
@@ -980,8 +980,8 @@ Examples:
|
|
|
980
980
|
//#region src/commands/gates/run.ts
|
|
981
981
|
const gatesRunCommand = buildCommand({
|
|
982
982
|
docs: {
|
|
983
|
-
brief: "Run
|
|
984
|
-
fullDescription: `Verify
|
|
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: "
|
|
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.
|
|
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
|
|
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 },
|