@ondrej-svec/hog 1.11.0 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +485 -474
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -2848,61 +2848,88 @@ var init_action_log = __esm({
|
|
|
2848
2848
|
}
|
|
2849
2849
|
});
|
|
2850
2850
|
|
|
2851
|
-
// src/board/components/
|
|
2851
|
+
// src/board/components/panel.tsx
|
|
2852
2852
|
import { Box as Box2, Text as Text2 } from "ink";
|
|
2853
2853
|
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
2854
|
-
function
|
|
2855
|
-
const
|
|
2854
|
+
function buildTopLine(title, width) {
|
|
2855
|
+
const titlePart = `\u2500 ${title} `;
|
|
2856
|
+
const dashCount = Math.max(0, width - 2 - titlePart.length);
|
|
2857
|
+
return `\u256D${titlePart}${"\u2500".repeat(dashCount)}\u256E`;
|
|
2858
|
+
}
|
|
2859
|
+
function Panel({ title, isActive, width, height, flexGrow, children }) {
|
|
2860
|
+
const color = isActive ? "cyan" : "gray";
|
|
2861
|
+
const topLine = buildTopLine(title, width);
|
|
2862
|
+
return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", width, height, flexGrow, overflow: "hidden", children: [
|
|
2863
|
+
/* @__PURE__ */ jsx2(Text2, { color, children: topLine }),
|
|
2864
|
+
/* @__PURE__ */ jsx2(
|
|
2865
|
+
Box2,
|
|
2866
|
+
{
|
|
2867
|
+
borderStyle: "round",
|
|
2868
|
+
borderTop: false,
|
|
2869
|
+
borderColor: color,
|
|
2870
|
+
flexDirection: "column",
|
|
2871
|
+
flexGrow: 1,
|
|
2872
|
+
overflow: "hidden",
|
|
2873
|
+
width,
|
|
2874
|
+
children
|
|
2875
|
+
}
|
|
2876
|
+
)
|
|
2877
|
+
] });
|
|
2878
|
+
}
|
|
2879
|
+
var init_panel = __esm({
|
|
2880
|
+
"src/board/components/panel.tsx"() {
|
|
2881
|
+
"use strict";
|
|
2882
|
+
}
|
|
2883
|
+
});
|
|
2884
|
+
|
|
2885
|
+
// src/board/components/activity-panel.tsx
|
|
2886
|
+
import { Box as Box3, Text as Text3 } from "ink";
|
|
2887
|
+
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
2888
|
+
function ActivityPanel({
|
|
2889
|
+
events,
|
|
2890
|
+
selectedIdx,
|
|
2891
|
+
isActive,
|
|
2892
|
+
height,
|
|
2893
|
+
width
|
|
2894
|
+
}) {
|
|
2856
2895
|
const maxRows = Math.max(1, height - 2);
|
|
2857
2896
|
const visible = events.slice(0, maxRows);
|
|
2858
|
-
return /* @__PURE__ */
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
children: [
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
|
|
2880
|
-
|
|
2881
|
-
event.summary,
|
|
2882
|
-
" "
|
|
2883
|
-
] }),
|
|
2884
|
-
/* @__PURE__ */ jsxs2(Text2, { dimColor: true, children: [
|
|
2885
|
-
"(",
|
|
2886
|
-
event.repoShortName,
|
|
2887
|
-
")"
|
|
2888
|
-
] })
|
|
2889
|
-
] }, `${event.repoShortName}:${event.issueNumber}:${i}`);
|
|
2890
|
-
})
|
|
2891
|
-
]
|
|
2892
|
-
}
|
|
2893
|
-
);
|
|
2897
|
+
return /* @__PURE__ */ jsx3(Panel, { title: "[4] Activity", isActive, width, height, children: visible.length === 0 ? /* @__PURE__ */ jsx3(Text3, { color: "gray", children: " No recent activity" }) : visible.map((event, i) => {
|
|
2898
|
+
const isSel = isActive && i === selectedIdx;
|
|
2899
|
+
const ago = timeAgo(event.timestamp);
|
|
2900
|
+
return /* @__PURE__ */ jsxs3(Box3, { children: [
|
|
2901
|
+
/* @__PURE__ */ jsxs3(Text3, { color: isSel ? "cyan" : "gray", bold: isSel, children: [
|
|
2902
|
+
isSel ? "\u25BA " : " ",
|
|
2903
|
+
ago
|
|
2904
|
+
] }),
|
|
2905
|
+
/* @__PURE__ */ jsxs3(Text3, { color: isSel ? "white" : "gray", children: [
|
|
2906
|
+
" ",
|
|
2907
|
+
"@",
|
|
2908
|
+
event.actor,
|
|
2909
|
+
" ",
|
|
2910
|
+
event.summary,
|
|
2911
|
+
" "
|
|
2912
|
+
] }),
|
|
2913
|
+
/* @__PURE__ */ jsxs3(Text3, { dimColor: true, children: [
|
|
2914
|
+
"(",
|
|
2915
|
+
event.repoShortName,
|
|
2916
|
+
")"
|
|
2917
|
+
] })
|
|
2918
|
+
] }, `${event.repoShortName}:${event.issueNumber}:${i}`);
|
|
2919
|
+
}) });
|
|
2894
2920
|
}
|
|
2895
2921
|
var init_activity_panel = __esm({
|
|
2896
2922
|
"src/board/components/activity-panel.tsx"() {
|
|
2897
2923
|
"use strict";
|
|
2898
2924
|
init_constants();
|
|
2925
|
+
init_panel();
|
|
2899
2926
|
}
|
|
2900
2927
|
});
|
|
2901
2928
|
|
|
2902
2929
|
// src/board/components/detail-panel.tsx
|
|
2903
|
-
import { Box as
|
|
2930
|
+
import { Box as Box4, Text as Text4 } from "ink";
|
|
2904
2931
|
import { useEffect as useEffect3 } from "react";
|
|
2905
|
-
import { Fragment, jsx as
|
|
2932
|
+
import { Fragment, jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
2906
2933
|
function stripMarkdown(text) {
|
|
2907
2934
|
return text.replace(/^#{1,6}\s+/gm, "").replace(/\*\*(.+?)\*\*/g, "$1").replace(/\*(.+?)\*/g, "$1").replace(/__(.+?)__/g, "$1").replace(/_(.+?)_/g, "$1").replace(/~~(.+?)~~/g, "$1").replace(/`{1,3}[^`]*`{1,3}/g, (m) => m.replace(/`/g, "")).replace(/^\s*[-*+]\s+/gm, " - ").replace(/^\s*\d+\.\s+/gm, " ").replace(/\[([^\]]+)\]\([^)]+\)/g, "$1").replace(/!\[([^\]]*)\]\([^)]+\)/g, "[$1]").replace(/^>\s+/gm, " ").replace(/---+/g, "").replace(/\n{3,}/g, "\n\n").trim();
|
|
2908
2935
|
}
|
|
@@ -2921,11 +2948,11 @@ function BodySection({
|
|
|
2921
2948
|
issueNumber
|
|
2922
2949
|
}) {
|
|
2923
2950
|
const { text, remaining } = formatBody(body, 15);
|
|
2924
|
-
return /* @__PURE__ */
|
|
2925
|
-
/* @__PURE__ */
|
|
2926
|
-
/* @__PURE__ */
|
|
2927
|
-
/* @__PURE__ */
|
|
2928
|
-
remaining > 0 ? /* @__PURE__ */
|
|
2951
|
+
return /* @__PURE__ */ jsxs4(Fragment, { children: [
|
|
2952
|
+
/* @__PURE__ */ jsx4(Text4, { children: "" }),
|
|
2953
|
+
/* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "--- Description ---" }),
|
|
2954
|
+
/* @__PURE__ */ jsx4(Text4, { wrap: "wrap", children: text }),
|
|
2955
|
+
remaining > 0 ? /* @__PURE__ */ jsxs4(Text4, { dimColor: true, children: [
|
|
2929
2956
|
"... (",
|
|
2930
2957
|
remaining,
|
|
2931
2958
|
" more lines \u2014 gh issue view ",
|
|
@@ -2952,111 +2979,87 @@ function DetailPanel({
|
|
|
2952
2979
|
fetchComments,
|
|
2953
2980
|
issueRepo
|
|
2954
2981
|
}) {
|
|
2955
|
-
const borderColor = isActive ? "cyan" : "gray";
|
|
2956
2982
|
useEffect3(() => {
|
|
2957
2983
|
if (!(issue && fetchComments && issueRepo)) return;
|
|
2958
2984
|
if (commentsState !== null && commentsState !== void 0) return;
|
|
2959
2985
|
fetchComments(issueRepo, issue.number);
|
|
2960
2986
|
}, [issue, issueRepo, fetchComments, commentsState]);
|
|
2961
2987
|
if (!issue) {
|
|
2962
|
-
return /* @__PURE__ */
|
|
2963
|
-
Box3,
|
|
2964
|
-
{
|
|
2965
|
-
width,
|
|
2966
|
-
borderStyle: "single",
|
|
2967
|
-
borderColor,
|
|
2968
|
-
flexDirection: "column",
|
|
2969
|
-
paddingX: 1,
|
|
2970
|
-
children: [
|
|
2971
|
-
/* @__PURE__ */ jsx3(Text3, { bold: true, color: isActive ? "cyan" : "white", children: "[0] Detail" }),
|
|
2972
|
-
/* @__PURE__ */ jsx3(Text3, { color: "gray", children: "No item selected" })
|
|
2973
|
-
]
|
|
2974
|
-
}
|
|
2975
|
-
);
|
|
2988
|
+
return /* @__PURE__ */ jsx4(Panel, { title: "[0] Detail", isActive, width, children: /* @__PURE__ */ jsx4(Text4, { color: "gray", children: "No item selected" }) });
|
|
2976
2989
|
}
|
|
2977
|
-
return /* @__PURE__ */
|
|
2978
|
-
|
|
2979
|
-
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
|
|
2998
|
-
|
|
2999
|
-
|
|
3000
|
-
|
|
3001
|
-
|
|
3002
|
-
|
|
3003
|
-
|
|
3004
|
-
|
|
3005
|
-
|
|
3006
|
-
|
|
3007
|
-
|
|
3008
|
-
|
|
3009
|
-
|
|
3010
|
-
|
|
3011
|
-
|
|
3012
|
-
|
|
3013
|
-
|
|
3014
|
-
|
|
3015
|
-
|
|
3016
|
-
|
|
3017
|
-
|
|
3018
|
-
|
|
3019
|
-
|
|
3020
|
-
|
|
3021
|
-
|
|
3022
|
-
|
|
3023
|
-
|
|
3024
|
-
|
|
2990
|
+
return /* @__PURE__ */ jsxs4(Panel, { title: "[0] Detail", isActive, width, children: [
|
|
2991
|
+
/* @__PURE__ */ jsxs4(Text4, { color: "cyan", bold: true, children: [
|
|
2992
|
+
"#",
|
|
2993
|
+
issue.number,
|
|
2994
|
+
" ",
|
|
2995
|
+
issue.title
|
|
2996
|
+
] }),
|
|
2997
|
+
/* @__PURE__ */ jsx4(Text4, { children: "" }),
|
|
2998
|
+
/* @__PURE__ */ jsxs4(Box4, { children: [
|
|
2999
|
+
/* @__PURE__ */ jsx4(Text4, { color: "gray", children: "State: " }),
|
|
3000
|
+
/* @__PURE__ */ jsx4(Text4, { color: issue.state === "open" ? "green" : "red", children: issue.state })
|
|
3001
|
+
] }),
|
|
3002
|
+
(issue.assignees ?? []).length > 0 ? /* @__PURE__ */ jsxs4(Box4, { children: [
|
|
3003
|
+
/* @__PURE__ */ jsx4(Text4, { color: "gray", children: "Assignees: " }),
|
|
3004
|
+
/* @__PURE__ */ jsx4(Text4, { children: (issue.assignees ?? []).map((a) => a.login).join(", ") })
|
|
3005
|
+
] }) : null,
|
|
3006
|
+
issue.labels.length > 0 ? /* @__PURE__ */ jsxs4(Box4, { children: [
|
|
3007
|
+
/* @__PURE__ */ jsx4(Text4, { color: "gray", children: "Labels: " }),
|
|
3008
|
+
/* @__PURE__ */ jsx4(Text4, { children: issue.labels.map((l) => l.name).join(", ") })
|
|
3009
|
+
] }) : null,
|
|
3010
|
+
issue.projectStatus ? /* @__PURE__ */ jsxs4(Box4, { children: [
|
|
3011
|
+
/* @__PURE__ */ jsx4(Text4, { color: "gray", children: "Status: " }),
|
|
3012
|
+
/* @__PURE__ */ jsx4(Text4, { color: "magenta", children: issue.projectStatus })
|
|
3013
|
+
] }) : null,
|
|
3014
|
+
issue.targetDate ? /* @__PURE__ */ jsxs4(Box4, { children: [
|
|
3015
|
+
/* @__PURE__ */ jsx4(Text4, { color: "gray", children: "Target: " }),
|
|
3016
|
+
/* @__PURE__ */ jsx4(Text4, { children: issue.targetDate })
|
|
3017
|
+
] }) : null,
|
|
3018
|
+
/* @__PURE__ */ jsxs4(Box4, { children: [
|
|
3019
|
+
/* @__PURE__ */ jsx4(Text4, { color: "gray", children: "Updated: " }),
|
|
3020
|
+
/* @__PURE__ */ jsx4(Text4, { children: new Date(issue.updatedAt).toLocaleString() })
|
|
3021
|
+
] }),
|
|
3022
|
+
issue.slackThreadUrl ? /* @__PURE__ */ jsxs4(Box4, { children: [
|
|
3023
|
+
/* @__PURE__ */ jsx4(Text4, { color: "gray", children: "Slack: " }),
|
|
3024
|
+
/* @__PURE__ */ jsx4(Text4, { color: "blue", children: countSlackLinks(issue.body) > 1 ? `${countSlackLinks(issue.body)} links (s opens first)` : "thread (s to open)" })
|
|
3025
|
+
] }) : null,
|
|
3026
|
+
issue.body ? /* @__PURE__ */ jsx4(BodySection, { body: issue.body, issueNumber: issue.number }) : /* @__PURE__ */ jsxs4(Fragment, { children: [
|
|
3027
|
+
/* @__PURE__ */ jsx4(Text4, { children: "" }),
|
|
3028
|
+
/* @__PURE__ */ jsx4(Text4, { color: "gray", children: "(no description)" })
|
|
3029
|
+
] }),
|
|
3030
|
+
/* @__PURE__ */ jsx4(Text4, { children: "" }),
|
|
3031
|
+
/* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "--- Comments ---" }),
|
|
3032
|
+
commentsState === "loading" ? /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "fetching comments..." }) : commentsState === "error" ? /* @__PURE__ */ jsx4(Text4, { color: "red", children: "could not load comments" }) : commentsState && commentsState.length === 0 ? /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "No comments yet." }) : commentsState && commentsState.length > 0 ? commentsState.slice(-5).map((comment, i) => (
|
|
3033
|
+
// biome-ignore lint/suspicious/noArrayIndexKey: stable list
|
|
3034
|
+
/* @__PURE__ */ jsxs4(Box4, { flexDirection: "column", marginBottom: 1, children: [
|
|
3035
|
+
/* @__PURE__ */ jsxs4(Text4, { color: "cyan", children: [
|
|
3036
|
+
"@",
|
|
3037
|
+
comment.author.login,
|
|
3038
|
+
" \xB7 ",
|
|
3039
|
+
formatCommentAge(comment.createdAt)
|
|
3025
3040
|
] }),
|
|
3026
|
-
/* @__PURE__ */
|
|
3027
|
-
|
|
3028
|
-
|
|
3029
|
-
|
|
3030
|
-
|
|
3031
|
-
|
|
3032
|
-
|
|
3033
|
-
|
|
3034
|
-
|
|
3035
|
-
formatCommentAge(comment.createdAt)
|
|
3036
|
-
] }),
|
|
3037
|
-
/* @__PURE__ */ jsxs3(Text3, { wrap: "wrap", children: [
|
|
3038
|
-
" ",
|
|
3039
|
-
comment.body.split("\n")[0]
|
|
3040
|
-
] })
|
|
3041
|
-
] }, i)
|
|
3042
|
-
)) : /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "fetching comments..." }),
|
|
3043
|
-
/* @__PURE__ */ jsx3(Text3, { children: "" }),
|
|
3044
|
-
/* @__PURE__ */ jsx3(Text3, { color: "gray", dimColor: true, children: issue.url })
|
|
3045
|
-
]
|
|
3046
|
-
}
|
|
3047
|
-
);
|
|
3041
|
+
/* @__PURE__ */ jsxs4(Text4, { wrap: "wrap", children: [
|
|
3042
|
+
" ",
|
|
3043
|
+
comment.body.split("\n")[0]
|
|
3044
|
+
] })
|
|
3045
|
+
] }, i)
|
|
3046
|
+
)) : /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "fetching comments..." }),
|
|
3047
|
+
/* @__PURE__ */ jsx4(Text4, { children: "" }),
|
|
3048
|
+
/* @__PURE__ */ jsx4(Text4, { color: "gray", dimColor: true, children: issue.url })
|
|
3049
|
+
] });
|
|
3048
3050
|
}
|
|
3049
3051
|
var SLACK_URL_RE;
|
|
3050
3052
|
var init_detail_panel = __esm({
|
|
3051
3053
|
"src/board/components/detail-panel.tsx"() {
|
|
3052
3054
|
"use strict";
|
|
3055
|
+
init_panel();
|
|
3053
3056
|
SLACK_URL_RE = /https:\/\/[^/]+\.slack\.com\/archives\/[A-Z0-9]+\/p[0-9]+/gi;
|
|
3054
3057
|
}
|
|
3055
3058
|
});
|
|
3056
3059
|
|
|
3057
3060
|
// src/board/components/hint-bar.tsx
|
|
3058
|
-
import { Box as
|
|
3059
|
-
import { jsx as
|
|
3061
|
+
import { Box as Box5, Text as Text5 } from "ink";
|
|
3062
|
+
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
3060
3063
|
function HintBar({
|
|
3061
3064
|
uiMode,
|
|
3062
3065
|
activePanelId,
|
|
@@ -3066,23 +3069,23 @@ function HintBar({
|
|
|
3066
3069
|
hasUndoable
|
|
3067
3070
|
}) {
|
|
3068
3071
|
if (uiMode === "multiSelect") {
|
|
3069
|
-
return /* @__PURE__ */
|
|
3070
|
-
/* @__PURE__ */
|
|
3072
|
+
return /* @__PURE__ */ jsxs5(Box5, { children: [
|
|
3073
|
+
/* @__PURE__ */ jsxs5(Text5, { color: "cyan", bold: true, children: [
|
|
3071
3074
|
"[MULTI-SELECT] ",
|
|
3072
3075
|
multiSelectCount,
|
|
3073
3076
|
" selected"
|
|
3074
3077
|
] }),
|
|
3075
|
-
/* @__PURE__ */
|
|
3078
|
+
/* @__PURE__ */ jsx5(Text5, { color: "gray", children: " Space:toggle Enter:actions Esc:cancel" })
|
|
3076
3079
|
] });
|
|
3077
3080
|
}
|
|
3078
3081
|
if (uiMode === "focus") {
|
|
3079
|
-
return /* @__PURE__ */
|
|
3082
|
+
return /* @__PURE__ */ jsx5(Box5, { children: /* @__PURE__ */ jsx5(Text5, { color: "magenta", bold: true, children: "[FOCUS] Focus mode \u2014 Esc to exit" }) });
|
|
3080
3083
|
}
|
|
3081
3084
|
if (uiMode === "search") {
|
|
3082
|
-
return /* @__PURE__ */
|
|
3083
|
-
/* @__PURE__ */
|
|
3084
|
-
/* @__PURE__ */
|
|
3085
|
-
searchQuery ? /* @__PURE__ */
|
|
3085
|
+
return /* @__PURE__ */ jsxs5(Box5, { children: [
|
|
3086
|
+
/* @__PURE__ */ jsx5(Text5, { color: "yellow", bold: true, children: "[SEARCH]" }),
|
|
3087
|
+
/* @__PURE__ */ jsx5(Text5, { color: "gray", children: " type to filter Enter:confirm Esc:clear" }),
|
|
3088
|
+
searchQuery ? /* @__PURE__ */ jsxs5(Text5, { color: "yellow", children: [
|
|
3086
3089
|
' "',
|
|
3087
3090
|
searchQuery,
|
|
3088
3091
|
'"'
|
|
@@ -3090,10 +3093,10 @@ function HintBar({
|
|
|
3090
3093
|
] });
|
|
3091
3094
|
}
|
|
3092
3095
|
if (uiMode === "overlay:fuzzyPicker") {
|
|
3093
|
-
return /* @__PURE__ */
|
|
3096
|
+
return /* @__PURE__ */ jsx5(Box5, { children: /* @__PURE__ */ jsx5(Text5, { color: "gray", children: "\u2191\u2193/Ctrl-J/K:nav Enter:jump Esc:close" }) });
|
|
3094
3097
|
}
|
|
3095
3098
|
if (uiMode.startsWith("overlay:")) {
|
|
3096
|
-
return /* @__PURE__ */
|
|
3099
|
+
return /* @__PURE__ */ jsx5(Box5, { children: /* @__PURE__ */ jsx5(Text5, { color: "gray", children: "j/k:nav Enter:select Esc:cancel" }) });
|
|
3097
3100
|
}
|
|
3098
3101
|
const panelHints = {
|
|
3099
3102
|
0: "j/k:scroll Esc:close ? help",
|
|
@@ -3102,10 +3105,10 @@ function HintBar({
|
|
|
3102
3105
|
3: `j/k:move p:pick m:status c:comment /:search n:new 0-4:panel${hasUndoable ? " u:undo" : ""} ? help q:quit`,
|
|
3103
3106
|
4: "j/k:scroll Enter:jump r:refresh 0-4:panel ? help"
|
|
3104
3107
|
};
|
|
3105
|
-
return /* @__PURE__ */
|
|
3106
|
-
/* @__PURE__ */
|
|
3107
|
-
mineOnly ? /* @__PURE__ */
|
|
3108
|
-
searchQuery ? /* @__PURE__ */
|
|
3108
|
+
return /* @__PURE__ */ jsxs5(Box5, { children: [
|
|
3109
|
+
/* @__PURE__ */ jsx5(Text5, { color: "gray", children: panelHints[activePanelId] }),
|
|
3110
|
+
mineOnly ? /* @__PURE__ */ jsx5(Text5, { color: "cyan", children: " filter:@me" }) : null,
|
|
3111
|
+
searchQuery ? /* @__PURE__ */ jsxs5(Text5, { color: "yellow", children: [
|
|
3109
3112
|
' filter:"',
|
|
3110
3113
|
searchQuery,
|
|
3111
3114
|
'"'
|
|
@@ -3119,9 +3122,9 @@ var init_hint_bar = __esm({
|
|
|
3119
3122
|
});
|
|
3120
3123
|
|
|
3121
3124
|
// src/board/components/bulk-action-menu.tsx
|
|
3122
|
-
import { Box as
|
|
3125
|
+
import { Box as Box6, Text as Text6, useInput as useInput2 } from "ink";
|
|
3123
3126
|
import { useState as useState7 } from "react";
|
|
3124
|
-
import { jsx as
|
|
3127
|
+
import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
3125
3128
|
function getMenuItems(selectionType) {
|
|
3126
3129
|
if (selectionType === "github") {
|
|
3127
3130
|
return [
|
|
@@ -3156,13 +3159,13 @@ function BulkActionMenu({ count, selectionType, onSelect, onCancel }) {
|
|
|
3156
3159
|
}
|
|
3157
3160
|
});
|
|
3158
3161
|
if (items.length === 0) {
|
|
3159
|
-
return /* @__PURE__ */
|
|
3160
|
-
/* @__PURE__ */
|
|
3161
|
-
/* @__PURE__ */
|
|
3162
|
+
return /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", children: [
|
|
3163
|
+
/* @__PURE__ */ jsx6(Text6, { color: "yellow", children: "No bulk actions for mixed selection types." }),
|
|
3164
|
+
/* @__PURE__ */ jsx6(Text6, { dimColor: true, children: "Esc to cancel" })
|
|
3162
3165
|
] });
|
|
3163
3166
|
}
|
|
3164
|
-
return /* @__PURE__ */
|
|
3165
|
-
/* @__PURE__ */
|
|
3167
|
+
return /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", children: [
|
|
3168
|
+
/* @__PURE__ */ jsxs6(Text6, { color: "cyan", bold: true, children: [
|
|
3166
3169
|
"Bulk action (",
|
|
3167
3170
|
count,
|
|
3168
3171
|
" selected):"
|
|
@@ -3170,12 +3173,12 @@ function BulkActionMenu({ count, selectionType, onSelect, onCancel }) {
|
|
|
3170
3173
|
items.map((item, i) => {
|
|
3171
3174
|
const isSelected = i === selectedIdx;
|
|
3172
3175
|
const prefix = isSelected ? "> " : " ";
|
|
3173
|
-
return /* @__PURE__ */
|
|
3176
|
+
return /* @__PURE__ */ jsxs6(Text6, { ...isSelected ? { color: "cyan" } : {}, children: [
|
|
3174
3177
|
prefix,
|
|
3175
3178
|
item.label
|
|
3176
3179
|
] }, item.action.type);
|
|
3177
3180
|
}),
|
|
3178
|
-
/* @__PURE__ */
|
|
3181
|
+
/* @__PURE__ */ jsx6(Text6, { dimColor: true, children: "j/k:navigate Enter:select Esc:cancel" })
|
|
3179
3182
|
] });
|
|
3180
3183
|
}
|
|
3181
3184
|
var init_bulk_action_menu = __esm({
|
|
@@ -3205,9 +3208,9 @@ import { mkdtempSync, readFileSync as readFileSync4, rmSync, writeFileSync as wr
|
|
|
3205
3208
|
import { tmpdir } from "os";
|
|
3206
3209
|
import { join as join4 } from "path";
|
|
3207
3210
|
import { TextInput } from "@inkjs/ui";
|
|
3208
|
-
import { Box as
|
|
3211
|
+
import { Box as Box7, Text as Text7, useInput as useInput3, useStdin } from "ink";
|
|
3209
3212
|
import { useEffect as useEffect4, useRef as useRef7, useState as useState8 } from "react";
|
|
3210
|
-
import { jsx as
|
|
3213
|
+
import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
3211
3214
|
function CommentInput({
|
|
3212
3215
|
issueNumber,
|
|
3213
3216
|
onSubmit,
|
|
@@ -3274,19 +3277,19 @@ function CommentInput({
|
|
|
3274
3277
|
}
|
|
3275
3278
|
}, [editing, value, setRawMode]);
|
|
3276
3279
|
if (editing) {
|
|
3277
|
-
return /* @__PURE__ */
|
|
3280
|
+
return /* @__PURE__ */ jsx7(Box7, { children: /* @__PURE__ */ jsxs7(Text7, { color: "cyan", children: [
|
|
3278
3281
|
"Opening editor for #",
|
|
3279
3282
|
issueNumber,
|
|
3280
3283
|
"\u2026"
|
|
3281
3284
|
] }) });
|
|
3282
3285
|
}
|
|
3283
|
-
return /* @__PURE__ */
|
|
3284
|
-
/* @__PURE__ */
|
|
3286
|
+
return /* @__PURE__ */ jsxs7(Box7, { children: [
|
|
3287
|
+
/* @__PURE__ */ jsxs7(Text7, { color: "cyan", children: [
|
|
3285
3288
|
"comment #",
|
|
3286
3289
|
issueNumber,
|
|
3287
3290
|
": "
|
|
3288
3291
|
] }),
|
|
3289
|
-
/* @__PURE__ */
|
|
3292
|
+
/* @__PURE__ */ jsx7(
|
|
3290
3293
|
TextInput,
|
|
3291
3294
|
{
|
|
3292
3295
|
defaultValue: value,
|
|
@@ -3308,16 +3311,16 @@ var init_comment_input = __esm({
|
|
|
3308
3311
|
});
|
|
3309
3312
|
|
|
3310
3313
|
// src/board/components/confirm-prompt.tsx
|
|
3311
|
-
import { Box as
|
|
3312
|
-
import { jsx as
|
|
3314
|
+
import { Box as Box8, Text as Text8, useInput as useInput4 } from "ink";
|
|
3315
|
+
import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
3313
3316
|
function ConfirmPrompt({ message, onConfirm, onCancel }) {
|
|
3314
3317
|
useInput4((input2, key) => {
|
|
3315
3318
|
if (input2 === "y" || input2 === "Y") return onConfirm();
|
|
3316
3319
|
if (input2 === "n" || input2 === "N" || key.escape) return onCancel();
|
|
3317
3320
|
});
|
|
3318
|
-
return /* @__PURE__ */
|
|
3319
|
-
/* @__PURE__ */
|
|
3320
|
-
/* @__PURE__ */
|
|
3321
|
+
return /* @__PURE__ */ jsxs8(Box8, { children: [
|
|
3322
|
+
/* @__PURE__ */ jsx8(Text8, { color: "cyan", children: message }),
|
|
3323
|
+
/* @__PURE__ */ jsx8(Text8, { color: "gray", children: " (y/n)" })
|
|
3321
3324
|
] });
|
|
3322
3325
|
}
|
|
3323
3326
|
var init_confirm_prompt = __esm({
|
|
@@ -3328,9 +3331,9 @@ var init_confirm_prompt = __esm({
|
|
|
3328
3331
|
|
|
3329
3332
|
// src/board/components/label-picker.tsx
|
|
3330
3333
|
import { Spinner } from "@inkjs/ui";
|
|
3331
|
-
import { Box as
|
|
3334
|
+
import { Box as Box9, Text as Text9, useInput as useInput5 } from "ink";
|
|
3332
3335
|
import { useEffect as useEffect5, useRef as useRef8, useState as useState9 } from "react";
|
|
3333
|
-
import { jsx as
|
|
3336
|
+
import { jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
3334
3337
|
function LabelPicker({
|
|
3335
3338
|
repo,
|
|
3336
3339
|
currentLabels,
|
|
@@ -3405,21 +3408,21 @@ function LabelPicker({
|
|
|
3405
3408
|
}
|
|
3406
3409
|
});
|
|
3407
3410
|
if (loading) {
|
|
3408
|
-
return /* @__PURE__ */
|
|
3411
|
+
return /* @__PURE__ */ jsx9(Box9, { children: /* @__PURE__ */ jsx9(Spinner, { label: "Fetching labels..." }) });
|
|
3409
3412
|
}
|
|
3410
3413
|
const allLabels = labels ?? [];
|
|
3411
3414
|
if (allLabels.length === 0) {
|
|
3412
|
-
return /* @__PURE__ */
|
|
3413
|
-
/* @__PURE__ */
|
|
3414
|
-
/* @__PURE__ */
|
|
3415
|
-
/* @__PURE__ */
|
|
3415
|
+
return /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", children: [
|
|
3416
|
+
/* @__PURE__ */ jsx9(Text9, { color: "cyan", bold: true, children: "Labels:" }),
|
|
3417
|
+
/* @__PURE__ */ jsx9(Text9, { dimColor: true, children: "No labels in this repo" }),
|
|
3418
|
+
/* @__PURE__ */ jsx9(Text9, { dimColor: true, children: "Esc:cancel" })
|
|
3416
3419
|
] });
|
|
3417
3420
|
}
|
|
3418
3421
|
const repoLabelNames = new Set(allLabels.map((l) => l.name));
|
|
3419
3422
|
const orphanedLabels = currentLabels.filter((l) => !repoLabelNames.has(l));
|
|
3420
|
-
return /* @__PURE__ */
|
|
3421
|
-
/* @__PURE__ */
|
|
3422
|
-
orphanedLabels.map((name) => /* @__PURE__ */
|
|
3423
|
+
return /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", children: [
|
|
3424
|
+
/* @__PURE__ */ jsx9(Text9, { color: "cyan", bold: true, children: "Labels (Space:toggle Enter:confirm Esc:cancel):" }),
|
|
3425
|
+
orphanedLabels.map((name) => /* @__PURE__ */ jsxs9(Text9, { dimColor: true, children: [
|
|
3423
3426
|
selected.has(name) ? "[x]" : "[ ]",
|
|
3424
3427
|
" ",
|
|
3425
3428
|
name,
|
|
@@ -3428,7 +3431,7 @@ function LabelPicker({
|
|
|
3428
3431
|
allLabels.map((label, i) => {
|
|
3429
3432
|
const isSel = i === cursor;
|
|
3430
3433
|
const isChecked = selected.has(label.name);
|
|
3431
|
-
return /* @__PURE__ */
|
|
3434
|
+
return /* @__PURE__ */ jsxs9(Text9, { ...isSel ? { color: "cyan" } : {}, children: [
|
|
3432
3435
|
isSel ? ">" : " ",
|
|
3433
3436
|
" ",
|
|
3434
3437
|
isChecked ? "[x]" : "[ ]",
|
|
@@ -3447,9 +3450,9 @@ var init_label_picker = __esm({
|
|
|
3447
3450
|
|
|
3448
3451
|
// src/board/components/create-issue-form.tsx
|
|
3449
3452
|
import { TextInput as TextInput2 } from "@inkjs/ui";
|
|
3450
|
-
import { Box as
|
|
3453
|
+
import { Box as Box10, Text as Text10, useInput as useInput6 } from "ink";
|
|
3451
3454
|
import { useState as useState10 } from "react";
|
|
3452
|
-
import { jsx as
|
|
3455
|
+
import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
3453
3456
|
function CreateIssueForm({
|
|
3454
3457
|
repos,
|
|
3455
3458
|
defaultRepo,
|
|
@@ -3480,15 +3483,15 @@ function CreateIssueForm({
|
|
|
3480
3483
|
});
|
|
3481
3484
|
const selectedRepo = repos[repoIdx];
|
|
3482
3485
|
if (field === "labels" && selectedRepo) {
|
|
3483
|
-
return /* @__PURE__ */
|
|
3484
|
-
/* @__PURE__ */
|
|
3485
|
-
/* @__PURE__ */
|
|
3486
|
+
return /* @__PURE__ */ jsxs10(Box10, { flexDirection: "column", children: [
|
|
3487
|
+
/* @__PURE__ */ jsx10(Text10, { color: "cyan", bold: true, children: "Create Issue \u2014 Add Labels (optional)" }),
|
|
3488
|
+
/* @__PURE__ */ jsxs10(Text10, { dimColor: true, children: [
|
|
3486
3489
|
"Repo: ",
|
|
3487
3490
|
selectedRepo.shortName,
|
|
3488
3491
|
" Title: ",
|
|
3489
3492
|
title
|
|
3490
3493
|
] }),
|
|
3491
|
-
/* @__PURE__ */
|
|
3494
|
+
/* @__PURE__ */ jsx10(
|
|
3492
3495
|
LabelPicker,
|
|
3493
3496
|
{
|
|
3494
3497
|
repo: selectedRepo.name,
|
|
@@ -3513,12 +3516,12 @@ function CreateIssueForm({
|
|
|
3513
3516
|
)
|
|
3514
3517
|
] });
|
|
3515
3518
|
}
|
|
3516
|
-
return /* @__PURE__ */
|
|
3517
|
-
/* @__PURE__ */
|
|
3518
|
-
/* @__PURE__ */
|
|
3519
|
-
/* @__PURE__ */
|
|
3520
|
-
repos.map((r, i) => /* @__PURE__ */
|
|
3521
|
-
|
|
3519
|
+
return /* @__PURE__ */ jsxs10(Box10, { flexDirection: "column", children: [
|
|
3520
|
+
/* @__PURE__ */ jsx10(Text10, { color: "cyan", bold: true, children: "Create Issue" }),
|
|
3521
|
+
/* @__PURE__ */ jsxs10(Box10, { children: [
|
|
3522
|
+
/* @__PURE__ */ jsx10(Text10, { dimColor: field !== "repo", children: "Repo: " }),
|
|
3523
|
+
repos.map((r, i) => /* @__PURE__ */ jsx10(
|
|
3524
|
+
Text10,
|
|
3522
3525
|
{
|
|
3523
3526
|
...i === repoIdx ? { color: "cyan", bold: true } : {},
|
|
3524
3527
|
dimColor: field !== "repo",
|
|
@@ -3526,11 +3529,11 @@ function CreateIssueForm({
|
|
|
3526
3529
|
},
|
|
3527
3530
|
r.name
|
|
3528
3531
|
)),
|
|
3529
|
-
field === "repo" ? /* @__PURE__ */
|
|
3532
|
+
field === "repo" ? /* @__PURE__ */ jsx10(Text10, { dimColor: true, children: " j/k:select Tab:next" }) : null
|
|
3530
3533
|
] }),
|
|
3531
|
-
/* @__PURE__ */
|
|
3532
|
-
/* @__PURE__ */
|
|
3533
|
-
field === "title" ? /* @__PURE__ */
|
|
3534
|
+
/* @__PURE__ */ jsxs10(Box10, { children: [
|
|
3535
|
+
/* @__PURE__ */ jsx10(Text10, { dimColor: field !== "title", children: "Title: " }),
|
|
3536
|
+
field === "title" ? /* @__PURE__ */ jsx10(
|
|
3534
3537
|
TextInput2,
|
|
3535
3538
|
{
|
|
3536
3539
|
defaultValue: title,
|
|
@@ -3547,9 +3550,9 @@ function CreateIssueForm({
|
|
|
3547
3550
|
}
|
|
3548
3551
|
}
|
|
3549
3552
|
}
|
|
3550
|
-
) : /* @__PURE__ */
|
|
3553
|
+
) : /* @__PURE__ */ jsx10(Text10, { children: title || "(empty)" })
|
|
3551
3554
|
] }),
|
|
3552
|
-
/* @__PURE__ */
|
|
3555
|
+
/* @__PURE__ */ jsx10(Text10, { dimColor: true, children: "Tab:switch fields Enter:next Esc:cancel" })
|
|
3553
3556
|
] });
|
|
3554
3557
|
}
|
|
3555
3558
|
var init_create_issue_form = __esm({
|
|
@@ -3564,9 +3567,9 @@ import { spawnSync as spawnSync2 } from "child_process";
|
|
|
3564
3567
|
import { mkdtempSync as mkdtempSync2, readFileSync as readFileSync5, rmSync as rmSync2, writeFileSync as writeFileSync5 } from "fs";
|
|
3565
3568
|
import { tmpdir as tmpdir2 } from "os";
|
|
3566
3569
|
import { join as join5 } from "path";
|
|
3567
|
-
import { Box as
|
|
3570
|
+
import { Box as Box11, Text as Text11, useStdin as useStdin2 } from "ink";
|
|
3568
3571
|
import { useEffect as useEffect6, useRef as useRef9, useState as useState11 } from "react";
|
|
3569
|
-
import { jsx as
|
|
3572
|
+
import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3570
3573
|
function buildEditorFile(issue, repoName, statusOptions, repoLabels) {
|
|
3571
3574
|
const statusNames = statusOptions.map((o) => o.name).join(", ");
|
|
3572
3575
|
const labelNames = repoLabels.map((l) => l.name).join(", ");
|
|
@@ -3808,7 +3811,7 @@ function EditIssueOverlay({
|
|
|
3808
3811
|
onPushEntry
|
|
3809
3812
|
]);
|
|
3810
3813
|
if (!editing) return null;
|
|
3811
|
-
return /* @__PURE__ */
|
|
3814
|
+
return /* @__PURE__ */ jsx11(Box11, { children: /* @__PURE__ */ jsxs11(Text11, { color: "cyan", children: [
|
|
3812
3815
|
"Opening editor for #",
|
|
3813
3816
|
issue.number,
|
|
3814
3817
|
"\u2026"
|
|
@@ -3824,9 +3827,9 @@ var init_edit_issue_overlay = __esm({
|
|
|
3824
3827
|
});
|
|
3825
3828
|
|
|
3826
3829
|
// src/board/components/focus-mode.tsx
|
|
3827
|
-
import { Box as
|
|
3830
|
+
import { Box as Box12, Text as Text12, useInput as useInput7 } from "ink";
|
|
3828
3831
|
import { useCallback as useCallback10, useEffect as useEffect7, useRef as useRef10, useState as useState12 } from "react";
|
|
3829
|
-
import { jsx as
|
|
3832
|
+
import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
3830
3833
|
function formatTime(secs) {
|
|
3831
3834
|
const m = Math.floor(secs / 60);
|
|
3832
3835
|
const s = secs % 60;
|
|
@@ -3883,23 +3886,23 @@ function FocusMode({ label, durationSec, onExit, onEndAction }) {
|
|
|
3883
3886
|
);
|
|
3884
3887
|
useInput7(handleInput);
|
|
3885
3888
|
if (timerDone) {
|
|
3886
|
-
return /* @__PURE__ */
|
|
3887
|
-
/* @__PURE__ */
|
|
3888
|
-
/* @__PURE__ */
|
|
3889
|
-
/* @__PURE__ */
|
|
3889
|
+
return /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", children: [
|
|
3890
|
+
/* @__PURE__ */ jsxs12(Box12, { children: [
|
|
3891
|
+
/* @__PURE__ */ jsx12(Text12, { color: "green", bold: true, children: "Focus complete!" }),
|
|
3892
|
+
/* @__PURE__ */ jsxs12(Text12, { color: "gray", children: [
|
|
3890
3893
|
" ",
|
|
3891
3894
|
label
|
|
3892
3895
|
] })
|
|
3893
3896
|
] }),
|
|
3894
|
-
/* @__PURE__ */
|
|
3895
|
-
/* @__PURE__ */
|
|
3896
|
-
/* @__PURE__ */
|
|
3897
|
-
/* @__PURE__ */
|
|
3898
|
-
/* @__PURE__ */
|
|
3899
|
-
/* @__PURE__ */
|
|
3900
|
-
/* @__PURE__ */
|
|
3901
|
-
/* @__PURE__ */
|
|
3902
|
-
/* @__PURE__ */
|
|
3897
|
+
/* @__PURE__ */ jsxs12(Box12, { marginTop: 1, children: [
|
|
3898
|
+
/* @__PURE__ */ jsx12(Text12, { color: "cyan", children: "[c]" }),
|
|
3899
|
+
/* @__PURE__ */ jsx12(Text12, { children: " Continue " }),
|
|
3900
|
+
/* @__PURE__ */ jsx12(Text12, { color: "cyan", children: "[b]" }),
|
|
3901
|
+
/* @__PURE__ */ jsx12(Text12, { children: " Break " }),
|
|
3902
|
+
/* @__PURE__ */ jsx12(Text12, { color: "cyan", children: "[d]" }),
|
|
3903
|
+
/* @__PURE__ */ jsx12(Text12, { children: " Done " }),
|
|
3904
|
+
/* @__PURE__ */ jsx12(Text12, { color: "gray", children: "[Esc]" }),
|
|
3905
|
+
/* @__PURE__ */ jsx12(Text12, { children: " Exit" })
|
|
3903
3906
|
] })
|
|
3904
3907
|
] });
|
|
3905
3908
|
}
|
|
@@ -3907,21 +3910,21 @@ function FocusMode({ label, durationSec, onExit, onEndAction }) {
|
|
|
3907
3910
|
const barWidth = 20;
|
|
3908
3911
|
const filled = Math.round(progress * barWidth);
|
|
3909
3912
|
const bar = "\u2588".repeat(filled) + "\u2591".repeat(barWidth - filled);
|
|
3910
|
-
return /* @__PURE__ */
|
|
3911
|
-
/* @__PURE__ */
|
|
3912
|
-
/* @__PURE__ */
|
|
3913
|
+
return /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", children: [
|
|
3914
|
+
/* @__PURE__ */ jsxs12(Box12, { children: [
|
|
3915
|
+
/* @__PURE__ */ jsxs12(Text12, { color: "magenta", bold: true, children: [
|
|
3913
3916
|
"Focus:",
|
|
3914
3917
|
" "
|
|
3915
3918
|
] }),
|
|
3916
|
-
/* @__PURE__ */
|
|
3919
|
+
/* @__PURE__ */ jsx12(Text12, { children: label })
|
|
3917
3920
|
] }),
|
|
3918
|
-
/* @__PURE__ */
|
|
3919
|
-
/* @__PURE__ */
|
|
3920
|
-
/* @__PURE__ */
|
|
3921
|
-
/* @__PURE__ */
|
|
3922
|
-
/* @__PURE__ */
|
|
3921
|
+
/* @__PURE__ */ jsxs12(Box12, { children: [
|
|
3922
|
+
/* @__PURE__ */ jsx12(Text12, { color: "magenta", children: bar }),
|
|
3923
|
+
/* @__PURE__ */ jsx12(Text12, { children: " " }),
|
|
3924
|
+
/* @__PURE__ */ jsx12(Text12, { bold: true, children: formatTime(remaining) }),
|
|
3925
|
+
/* @__PURE__ */ jsx12(Text12, { color: "gray", children: " remaining" })
|
|
3923
3926
|
] }),
|
|
3924
|
-
/* @__PURE__ */
|
|
3927
|
+
/* @__PURE__ */ jsx12(Text12, { color: "gray", dimColor: true, children: "Esc to exit focus" })
|
|
3925
3928
|
] });
|
|
3926
3929
|
}
|
|
3927
3930
|
var init_focus_mode = __esm({
|
|
@@ -3933,9 +3936,9 @@ var init_focus_mode = __esm({
|
|
|
3933
3936
|
// src/board/components/fuzzy-picker.tsx
|
|
3934
3937
|
import { TextInput as TextInput3 } from "@inkjs/ui";
|
|
3935
3938
|
import { Fzf } from "fzf";
|
|
3936
|
-
import { Box as
|
|
3939
|
+
import { Box as Box13, Text as Text13, useInput as useInput8 } from "ink";
|
|
3937
3940
|
import { useMemo as useMemo2, useState as useState13 } from "react";
|
|
3938
|
-
import { jsx as
|
|
3941
|
+
import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
3939
3942
|
function keepCursorVisible(cursor, offset, visible) {
|
|
3940
3943
|
if (cursor < offset) return cursor;
|
|
3941
3944
|
if (cursor >= offset + visible) return cursor - visible + 1;
|
|
@@ -4027,13 +4030,13 @@ function FuzzyPicker({ repos, onSelect, onClose }) {
|
|
|
4027
4030
|
});
|
|
4028
4031
|
const visibleResults = results.slice(scrollOffset, scrollOffset + VISIBLE);
|
|
4029
4032
|
const totalCount = results.length;
|
|
4030
|
-
return /* @__PURE__ */
|
|
4031
|
-
/* @__PURE__ */
|
|
4032
|
-
/* @__PURE__ */
|
|
4033
|
+
return /* @__PURE__ */ jsxs13(Box13, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, children: [
|
|
4034
|
+
/* @__PURE__ */ jsxs13(Box13, { children: [
|
|
4035
|
+
/* @__PURE__ */ jsxs13(Text13, { color: "cyan", bold: true, children: [
|
|
4033
4036
|
"Find issue",
|
|
4034
4037
|
" "
|
|
4035
4038
|
] }),
|
|
4036
|
-
/* @__PURE__ */
|
|
4039
|
+
/* @__PURE__ */ jsxs13(Text13, { color: "gray", children: [
|
|
4037
4040
|
"(",
|
|
4038
4041
|
totalCount,
|
|
4039
4042
|
" match",
|
|
@@ -4041,14 +4044,14 @@ function FuzzyPicker({ repos, onSelect, onClose }) {
|
|
|
4041
4044
|
")",
|
|
4042
4045
|
" "
|
|
4043
4046
|
] }),
|
|
4044
|
-
/* @__PURE__ */
|
|
4047
|
+
/* @__PURE__ */ jsx13(Text13, { color: "gray", dimColor: true, children: "\u2191\u2193/Ctrl-J/K nav Enter:jump Esc:close" })
|
|
4045
4048
|
] }),
|
|
4046
|
-
/* @__PURE__ */
|
|
4047
|
-
/* @__PURE__ */
|
|
4049
|
+
/* @__PURE__ */ jsxs13(Box13, { children: [
|
|
4050
|
+
/* @__PURE__ */ jsxs13(Text13, { color: "yellow", children: [
|
|
4048
4051
|
">",
|
|
4049
4052
|
" "
|
|
4050
4053
|
] }),
|
|
4051
|
-
/* @__PURE__ */
|
|
4054
|
+
/* @__PURE__ */ jsx13(
|
|
4052
4055
|
TextInput3,
|
|
4053
4056
|
{
|
|
4054
4057
|
defaultValue: query,
|
|
@@ -4065,7 +4068,7 @@ function FuzzyPicker({ repos, onSelect, onClose }) {
|
|
|
4065
4068
|
}
|
|
4066
4069
|
)
|
|
4067
4070
|
] }),
|
|
4068
|
-
scrollOffset > 0 ? /* @__PURE__ */
|
|
4071
|
+
scrollOffset > 0 ? /* @__PURE__ */ jsxs13(Text13, { color: "gray", dimColor: true, children: [
|
|
4069
4072
|
"\u25B2 ",
|
|
4070
4073
|
scrollOffset,
|
|
4071
4074
|
" more above"
|
|
@@ -4074,7 +4077,7 @@ function FuzzyPicker({ repos, onSelect, onClose }) {
|
|
|
4074
4077
|
const isSelected = scrollOffset + idx === cursor;
|
|
4075
4078
|
const labelStr = issue.labels ? ` [${issue.labels.split(" ").slice(0, 2).join("] [")}]` : "";
|
|
4076
4079
|
const assigneeStr = issue.assignee ? ` @${issue.assignee.split(" ")[0]}` : "";
|
|
4077
|
-
return /* @__PURE__ */
|
|
4080
|
+
return /* @__PURE__ */ jsx13(Box13, { children: isSelected ? /* @__PURE__ */ jsxs13(Text13, { color: "cyan", bold: true, children: [
|
|
4078
4081
|
">",
|
|
4079
4082
|
" ",
|
|
4080
4083
|
issue.repoShortName,
|
|
@@ -4084,7 +4087,7 @@ function FuzzyPicker({ repos, onSelect, onClose }) {
|
|
|
4084
4087
|
issue.title,
|
|
4085
4088
|
labelStr,
|
|
4086
4089
|
assigneeStr
|
|
4087
|
-
] }) : /* @__PURE__ */
|
|
4090
|
+
] }) : /* @__PURE__ */ jsxs13(Text13, { children: [
|
|
4088
4091
|
" ",
|
|
4089
4092
|
issue.repoShortName,
|
|
4090
4093
|
"#",
|
|
@@ -4095,12 +4098,12 @@ function FuzzyPicker({ repos, onSelect, onClose }) {
|
|
|
4095
4098
|
assigneeStr
|
|
4096
4099
|
] }) }, issue.navId);
|
|
4097
4100
|
}),
|
|
4098
|
-
totalCount === 0 ? /* @__PURE__ */
|
|
4101
|
+
totalCount === 0 ? /* @__PURE__ */ jsxs13(Text13, { dimColor: true, children: [
|
|
4099
4102
|
'No issues match "',
|
|
4100
4103
|
query,
|
|
4101
4104
|
'"'
|
|
4102
4105
|
] }) : null,
|
|
4103
|
-
results.length > scrollOffset + VISIBLE ? /* @__PURE__ */
|
|
4106
|
+
results.length > scrollOffset + VISIBLE ? /* @__PURE__ */ jsxs13(Text13, { color: "gray", dimColor: true, children: [
|
|
4104
4107
|
"\u25BC ",
|
|
4105
4108
|
results.length - scrollOffset - VISIBLE,
|
|
4106
4109
|
" more below"
|
|
@@ -4114,29 +4117,29 @@ var init_fuzzy_picker = __esm({
|
|
|
4114
4117
|
});
|
|
4115
4118
|
|
|
4116
4119
|
// src/board/components/help-overlay.tsx
|
|
4117
|
-
import { Box as
|
|
4118
|
-
import { jsx as
|
|
4120
|
+
import { Box as Box14, Text as Text14, useInput as useInput9 } from "ink";
|
|
4121
|
+
import { jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
4119
4122
|
function HelpOverlay({ currentMode, onClose }) {
|
|
4120
4123
|
useInput9((_input, key) => {
|
|
4121
4124
|
if (key.escape) onClose();
|
|
4122
4125
|
});
|
|
4123
|
-
return /* @__PURE__ */
|
|
4124
|
-
/* @__PURE__ */
|
|
4125
|
-
/* @__PURE__ */
|
|
4126
|
-
/* @__PURE__ */
|
|
4126
|
+
return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, children: [
|
|
4127
|
+
/* @__PURE__ */ jsxs14(Box14, { justifyContent: "space-between", children: [
|
|
4128
|
+
/* @__PURE__ */ jsx14(Text14, { color: "cyan", bold: true, children: "Keyboard Shortcuts" }),
|
|
4129
|
+
/* @__PURE__ */ jsxs14(Text14, { dimColor: true, children: [
|
|
4127
4130
|
"mode: ",
|
|
4128
4131
|
currentMode
|
|
4129
4132
|
] })
|
|
4130
4133
|
] }),
|
|
4131
|
-
/* @__PURE__ */
|
|
4132
|
-
SHORTCUTS.map((group) => /* @__PURE__ */
|
|
4133
|
-
/* @__PURE__ */
|
|
4134
|
-
group.items.map((item) => /* @__PURE__ */
|
|
4135
|
-
/* @__PURE__ */
|
|
4136
|
-
/* @__PURE__ */
|
|
4134
|
+
/* @__PURE__ */ jsx14(Text14, { children: " " }),
|
|
4135
|
+
SHORTCUTS.map((group) => /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", marginBottom: 1, children: [
|
|
4136
|
+
/* @__PURE__ */ jsx14(Text14, { color: "yellow", bold: true, children: group.category }),
|
|
4137
|
+
group.items.map((item) => /* @__PURE__ */ jsxs14(Box14, { children: [
|
|
4138
|
+
/* @__PURE__ */ jsx14(Box14, { width: 16, children: /* @__PURE__ */ jsx14(Text14, { color: "green", children: item.key }) }),
|
|
4139
|
+
/* @__PURE__ */ jsx14(Text14, { children: item.desc })
|
|
4137
4140
|
] }, item.key))
|
|
4138
4141
|
] }, group.category)),
|
|
4139
|
-
/* @__PURE__ */
|
|
4142
|
+
/* @__PURE__ */ jsx14(Text14, { dimColor: true, children: "Press ? or Esc to close" })
|
|
4140
4143
|
] });
|
|
4141
4144
|
}
|
|
4142
4145
|
var SHORTCUTS;
|
|
@@ -4202,9 +4205,9 @@ import { mkdtempSync as mkdtempSync3, readFileSync as readFileSync6, rmSync as r
|
|
|
4202
4205
|
import { tmpdir as tmpdir3 } from "os";
|
|
4203
4206
|
import { join as join6 } from "path";
|
|
4204
4207
|
import { Spinner as Spinner2, TextInput as TextInput4 } from "@inkjs/ui";
|
|
4205
|
-
import { Box as
|
|
4208
|
+
import { Box as Box15, Text as Text15, useInput as useInput10, useStdin as useStdin3 } from "ink";
|
|
4206
4209
|
import { useCallback as useCallback11, useEffect as useEffect8, useRef as useRef11, useState as useState14 } from "react";
|
|
4207
|
-
import { jsx as
|
|
4210
|
+
import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
4208
4211
|
function NlCreateOverlay({
|
|
4209
4212
|
repos,
|
|
4210
4213
|
defaultRepoName,
|
|
@@ -4330,27 +4333,27 @@ function NlCreateOverlay({
|
|
|
4330
4333
|
});
|
|
4331
4334
|
}, [isParsing, onLlmFallback]);
|
|
4332
4335
|
if (isParsing) {
|
|
4333
|
-
return /* @__PURE__ */
|
|
4334
|
-
/* @__PURE__ */
|
|
4335
|
-
/* @__PURE__ */
|
|
4336
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", children: [
|
|
4337
|
+
/* @__PURE__ */ jsx15(Text15, { color: "cyan", bold: true, children: "\u2728 Creating Issue" }),
|
|
4338
|
+
/* @__PURE__ */ jsx15(Spinner2, { label: "Parsing..." })
|
|
4336
4339
|
] });
|
|
4337
4340
|
}
|
|
4338
4341
|
if (parsed && step === "body") {
|
|
4339
4342
|
if (editingBody) {
|
|
4340
|
-
return /* @__PURE__ */
|
|
4341
|
-
/* @__PURE__ */
|
|
4342
|
-
/* @__PURE__ */
|
|
4343
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", children: [
|
|
4344
|
+
/* @__PURE__ */ jsx15(Text15, { color: "cyan", bold: true, children: "\u2728 Creating Issue" }),
|
|
4345
|
+
/* @__PURE__ */ jsx15(Text15, { color: "cyan", children: "Opening editor for body\u2026" })
|
|
4343
4346
|
] });
|
|
4344
4347
|
}
|
|
4345
|
-
return /* @__PURE__ */
|
|
4346
|
-
/* @__PURE__ */
|
|
4347
|
-
/* @__PURE__ */
|
|
4348
|
-
/* @__PURE__ */
|
|
4349
|
-
/* @__PURE__ */
|
|
4348
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", children: [
|
|
4349
|
+
/* @__PURE__ */ jsx15(Text15, { color: "cyan", bold: true, children: "\u2728 Creating Issue" }),
|
|
4350
|
+
/* @__PURE__ */ jsxs15(Box15, { children: [
|
|
4351
|
+
/* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "Title: " }),
|
|
4352
|
+
/* @__PURE__ */ jsx15(Text15, { children: parsed.title })
|
|
4350
4353
|
] }),
|
|
4351
|
-
/* @__PURE__ */
|
|
4352
|
-
/* @__PURE__ */
|
|
4353
|
-
/* @__PURE__ */
|
|
4354
|
+
/* @__PURE__ */ jsxs15(Box15, { children: [
|
|
4355
|
+
/* @__PURE__ */ jsx15(Text15, { color: "cyan", children: "body: " }),
|
|
4356
|
+
/* @__PURE__ */ jsx15(
|
|
4354
4357
|
TextInput4,
|
|
4355
4358
|
{
|
|
4356
4359
|
defaultValue: body,
|
|
@@ -4372,45 +4375,45 @@ function NlCreateOverlay({
|
|
|
4372
4375
|
}
|
|
4373
4376
|
)
|
|
4374
4377
|
] }),
|
|
4375
|
-
/* @__PURE__ */
|
|
4378
|
+
/* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "Enter:create ctrl+e:editor Esc:back" })
|
|
4376
4379
|
] });
|
|
4377
4380
|
}
|
|
4378
4381
|
if (parsed) {
|
|
4379
4382
|
const labels = [...parsed.labels];
|
|
4380
|
-
return /* @__PURE__ */
|
|
4381
|
-
/* @__PURE__ */
|
|
4382
|
-
/* @__PURE__ */
|
|
4383
|
-
/* @__PURE__ */
|
|
4384
|
-
/* @__PURE__ */
|
|
4385
|
-
repos.length > 1 ? /* @__PURE__ */
|
|
4383
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", children: [
|
|
4384
|
+
/* @__PURE__ */ jsx15(Text15, { color: "cyan", bold: true, children: "\u2728 Creating Issue" }),
|
|
4385
|
+
/* @__PURE__ */ jsxs15(Box15, { children: [
|
|
4386
|
+
/* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "Repo: " }),
|
|
4387
|
+
/* @__PURE__ */ jsx15(Text15, { color: "cyan", children: selectedRepo?.shortName ?? "(none)" }),
|
|
4388
|
+
repos.length > 1 ? /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: " r:cycle" }) : null
|
|
4386
4389
|
] }),
|
|
4387
|
-
/* @__PURE__ */
|
|
4388
|
-
/* @__PURE__ */
|
|
4389
|
-
/* @__PURE__ */
|
|
4390
|
+
/* @__PURE__ */ jsxs15(Box15, { children: [
|
|
4391
|
+
/* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "Title: " }),
|
|
4392
|
+
/* @__PURE__ */ jsx15(Text15, { children: parsed.title })
|
|
4390
4393
|
] }),
|
|
4391
|
-
labels.length > 0 ? /* @__PURE__ */
|
|
4392
|
-
/* @__PURE__ */
|
|
4393
|
-
/* @__PURE__ */
|
|
4394
|
+
labels.length > 0 ? /* @__PURE__ */ jsxs15(Box15, { children: [
|
|
4395
|
+
/* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "Labels: " }),
|
|
4396
|
+
/* @__PURE__ */ jsx15(Text15, { children: labels.join(", ") })
|
|
4394
4397
|
] }) : null,
|
|
4395
|
-
parsed.assignee ? /* @__PURE__ */
|
|
4396
|
-
/* @__PURE__ */
|
|
4397
|
-
/* @__PURE__ */
|
|
4398
|
+
parsed.assignee ? /* @__PURE__ */ jsxs15(Box15, { children: [
|
|
4399
|
+
/* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "Assignee: " }),
|
|
4400
|
+
/* @__PURE__ */ jsxs15(Text15, { children: [
|
|
4398
4401
|
"@",
|
|
4399
4402
|
parsed.assignee
|
|
4400
4403
|
] })
|
|
4401
4404
|
] }) : null,
|
|
4402
|
-
parsed.dueDate ? /* @__PURE__ */
|
|
4403
|
-
/* @__PURE__ */
|
|
4404
|
-
/* @__PURE__ */
|
|
4405
|
+
parsed.dueDate ? /* @__PURE__ */ jsxs15(Box15, { children: [
|
|
4406
|
+
/* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "Due: " }),
|
|
4407
|
+
/* @__PURE__ */ jsx15(Text15, { children: formatDue(parsed.dueDate) })
|
|
4405
4408
|
] }) : null,
|
|
4406
|
-
/* @__PURE__ */
|
|
4409
|
+
/* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "Enter:add body Esc:cancel" })
|
|
4407
4410
|
] });
|
|
4408
4411
|
}
|
|
4409
|
-
return /* @__PURE__ */
|
|
4410
|
-
/* @__PURE__ */
|
|
4411
|
-
/* @__PURE__ */
|
|
4412
|
-
/* @__PURE__ */
|
|
4413
|
-
/* @__PURE__ */
|
|
4412
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", children: [
|
|
4413
|
+
/* @__PURE__ */ jsx15(Text15, { color: "cyan", bold: true, children: "\u2728 What do you need to do?" }),
|
|
4414
|
+
/* @__PURE__ */ jsxs15(Box15, { children: [
|
|
4415
|
+
/* @__PURE__ */ jsx15(Text15, { color: "cyan", children: "> " }),
|
|
4416
|
+
/* @__PURE__ */ jsx15(
|
|
4414
4417
|
TextInput4,
|
|
4415
4418
|
{
|
|
4416
4419
|
placeholder: "fix login bug #bug #priority:high @me due friday",
|
|
@@ -4419,8 +4422,8 @@ function NlCreateOverlay({
|
|
|
4419
4422
|
}
|
|
4420
4423
|
)
|
|
4421
4424
|
] }),
|
|
4422
|
-
parseError ? /* @__PURE__ */
|
|
4423
|
-
/* @__PURE__ */
|
|
4425
|
+
parseError ? /* @__PURE__ */ jsx15(Text15, { color: "red", children: parseError }) : null,
|
|
4426
|
+
/* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "Tip: #label @user due <date> Enter:parse Esc:cancel" })
|
|
4424
4427
|
] });
|
|
4425
4428
|
}
|
|
4426
4429
|
function buildLabelList(parsed) {
|
|
@@ -4440,12 +4443,12 @@ var init_nl_create_overlay = __esm({
|
|
|
4440
4443
|
|
|
4441
4444
|
// src/board/components/search-bar.tsx
|
|
4442
4445
|
import { TextInput as TextInput5 } from "@inkjs/ui";
|
|
4443
|
-
import { Box as
|
|
4444
|
-
import { jsx as
|
|
4446
|
+
import { Box as Box16, Text as Text16 } from "ink";
|
|
4447
|
+
import { jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
4445
4448
|
function SearchBar({ defaultValue, onChange, onSubmit }) {
|
|
4446
|
-
return /* @__PURE__ */
|
|
4447
|
-
/* @__PURE__ */
|
|
4448
|
-
/* @__PURE__ */
|
|
4449
|
+
return /* @__PURE__ */ jsxs16(Box16, { children: [
|
|
4450
|
+
/* @__PURE__ */ jsx16(Text16, { color: "yellow", children: "/" }),
|
|
4451
|
+
/* @__PURE__ */ jsx16(
|
|
4449
4452
|
TextInput5,
|
|
4450
4453
|
{
|
|
4451
4454
|
defaultValue,
|
|
@@ -4463,9 +4466,9 @@ var init_search_bar = __esm({
|
|
|
4463
4466
|
});
|
|
4464
4467
|
|
|
4465
4468
|
// src/board/components/status-picker.tsx
|
|
4466
|
-
import { Box as
|
|
4469
|
+
import { Box as Box17, Text as Text17, useInput as useInput11 } from "ink";
|
|
4467
4470
|
import { useRef as useRef12, useState as useState15 } from "react";
|
|
4468
|
-
import { jsx as
|
|
4471
|
+
import { jsx as jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
4469
4472
|
function isTerminal(name) {
|
|
4470
4473
|
return TERMINAL_STATUS_RE.test(name);
|
|
4471
4474
|
}
|
|
@@ -4541,26 +4544,26 @@ function StatusPicker({
|
|
|
4541
4544
|
});
|
|
4542
4545
|
if (confirmingTerminal) {
|
|
4543
4546
|
const opt = options[selectedIdx];
|
|
4544
|
-
return /* @__PURE__ */
|
|
4545
|
-
/* @__PURE__ */
|
|
4547
|
+
return /* @__PURE__ */ jsxs17(Box17, { flexDirection: "column", children: [
|
|
4548
|
+
/* @__PURE__ */ jsxs17(Text17, { color: "yellow", bold: true, children: [
|
|
4546
4549
|
"Mark as ",
|
|
4547
4550
|
opt?.name,
|
|
4548
4551
|
"?"
|
|
4549
4552
|
] }),
|
|
4550
|
-
/* @__PURE__ */
|
|
4551
|
-
/* @__PURE__ */
|
|
4553
|
+
/* @__PURE__ */ jsx17(Text17, { dimColor: true, children: "This will close the issue on GitHub." }),
|
|
4554
|
+
/* @__PURE__ */ jsx17(Text17, { children: "Continue? [y/n]" })
|
|
4552
4555
|
] });
|
|
4553
4556
|
}
|
|
4554
|
-
return /* @__PURE__ */
|
|
4555
|
-
/* @__PURE__ */
|
|
4557
|
+
return /* @__PURE__ */ jsxs17(Box17, { flexDirection: "column", children: [
|
|
4558
|
+
/* @__PURE__ */ jsx17(Text17, { color: "cyan", bold: true, children: "Move to status:" }),
|
|
4556
4559
|
options.map((opt, i) => {
|
|
4557
4560
|
const isCurrent = opt.name === currentStatus;
|
|
4558
4561
|
const isSelected = i === selectedIdx;
|
|
4559
4562
|
const terminal = isTerminal(opt.name) && showTerminalStatuses;
|
|
4560
4563
|
const prefix = isSelected ? "> " : " ";
|
|
4561
4564
|
const suffix = isCurrent ? " (current)" : terminal ? " (Done)" : "";
|
|
4562
|
-
return /* @__PURE__ */
|
|
4563
|
-
|
|
4565
|
+
return /* @__PURE__ */ jsxs17(
|
|
4566
|
+
Text17,
|
|
4564
4567
|
{
|
|
4565
4568
|
...isSelected ? { color: "cyan" } : terminal ? { color: "yellow" } : {},
|
|
4566
4569
|
dimColor: isCurrent,
|
|
@@ -4573,7 +4576,7 @@ function StatusPicker({
|
|
|
4573
4576
|
opt.id
|
|
4574
4577
|
);
|
|
4575
4578
|
}),
|
|
4576
|
-
/* @__PURE__ */
|
|
4579
|
+
/* @__PURE__ */ jsx17(Text17, { dimColor: true, children: "j/k:navigate Enter:select Esc:cancel" })
|
|
4577
4580
|
] });
|
|
4578
4581
|
}
|
|
4579
4582
|
var init_status_picker = __esm({
|
|
@@ -4584,7 +4587,7 @@ var init_status_picker = __esm({
|
|
|
4584
4587
|
});
|
|
4585
4588
|
|
|
4586
4589
|
// src/board/components/overlay-renderer.tsx
|
|
4587
|
-
import { Fragment as Fragment2, jsx as
|
|
4590
|
+
import { Fragment as Fragment2, jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
4588
4591
|
function OverlayRenderer({
|
|
4589
4592
|
uiState,
|
|
4590
4593
|
config: config2,
|
|
@@ -4625,9 +4628,9 @@ function OverlayRenderer({
|
|
|
4625
4628
|
onPushEntry
|
|
4626
4629
|
}) {
|
|
4627
4630
|
const { mode, helpVisible } = uiState;
|
|
4628
|
-
return /* @__PURE__ */
|
|
4629
|
-
helpVisible ? /* @__PURE__ */
|
|
4630
|
-
mode === "overlay:status" && selectedRepoStatusOptions.length > 0 ? /* @__PURE__ */
|
|
4631
|
+
return /* @__PURE__ */ jsxs18(Fragment2, { children: [
|
|
4632
|
+
helpVisible ? /* @__PURE__ */ jsx18(HelpOverlay, { currentMode: mode, onClose: onToggleHelp }) : null,
|
|
4633
|
+
mode === "overlay:status" && selectedRepoStatusOptions.length > 0 ? /* @__PURE__ */ jsx18(
|
|
4631
4634
|
StatusPicker,
|
|
4632
4635
|
{
|
|
4633
4636
|
options: selectedRepoStatusOptions,
|
|
@@ -4636,7 +4639,7 @@ function OverlayRenderer({
|
|
|
4636
4639
|
onCancel: onExitOverlay
|
|
4637
4640
|
}
|
|
4638
4641
|
) : null,
|
|
4639
|
-
mode === "overlay:create" ? /* @__PURE__ */
|
|
4642
|
+
mode === "overlay:create" ? /* @__PURE__ */ jsx18(
|
|
4640
4643
|
CreateIssueForm,
|
|
4641
4644
|
{
|
|
4642
4645
|
repos: config2.repos,
|
|
@@ -4646,7 +4649,7 @@ function OverlayRenderer({
|
|
|
4646
4649
|
labelCache
|
|
4647
4650
|
}
|
|
4648
4651
|
) : null,
|
|
4649
|
-
mode === "overlay:confirmPick" ? /* @__PURE__ */
|
|
4652
|
+
mode === "overlay:confirmPick" ? /* @__PURE__ */ jsx18(
|
|
4650
4653
|
ConfirmPrompt,
|
|
4651
4654
|
{
|
|
4652
4655
|
message: "Pick this issue?",
|
|
@@ -4654,7 +4657,7 @@ function OverlayRenderer({
|
|
|
4654
4657
|
onCancel: onCancelPick
|
|
4655
4658
|
}
|
|
4656
4659
|
) : null,
|
|
4657
|
-
mode === "overlay:bulkAction" ? /* @__PURE__ */
|
|
4660
|
+
mode === "overlay:bulkAction" ? /* @__PURE__ */ jsx18(
|
|
4658
4661
|
BulkActionMenu,
|
|
4659
4662
|
{
|
|
4660
4663
|
count: multiSelectCount,
|
|
@@ -4663,7 +4666,7 @@ function OverlayRenderer({
|
|
|
4663
4666
|
onCancel: onExitOverlay
|
|
4664
4667
|
}
|
|
4665
4668
|
) : null,
|
|
4666
|
-
mode === "focus" && focusLabel ? /* @__PURE__ */
|
|
4669
|
+
mode === "focus" && focusLabel ? /* @__PURE__ */ jsx18(
|
|
4667
4670
|
FocusMode,
|
|
4668
4671
|
{
|
|
4669
4672
|
label: focusLabel,
|
|
@@ -4673,7 +4676,7 @@ function OverlayRenderer({
|
|
|
4673
4676
|
},
|
|
4674
4677
|
focusKey
|
|
4675
4678
|
) : null,
|
|
4676
|
-
mode === "overlay:label" && selectedIssue && defaultRepo ? /* @__PURE__ */
|
|
4679
|
+
mode === "overlay:label" && selectedIssue && defaultRepo ? /* @__PURE__ */ jsx18(
|
|
4677
4680
|
LabelPicker,
|
|
4678
4681
|
{
|
|
4679
4682
|
repo: defaultRepo,
|
|
@@ -4684,8 +4687,8 @@ function OverlayRenderer({
|
|
|
4684
4687
|
onError: onLabelError
|
|
4685
4688
|
}
|
|
4686
4689
|
) : null,
|
|
4687
|
-
mode === "search" ? /* @__PURE__ */
|
|
4688
|
-
mode === "overlay:comment" && selectedIssue ? /* @__PURE__ */
|
|
4690
|
+
mode === "search" ? /* @__PURE__ */ jsx18(SearchBar, { defaultValue: searchQuery, onChange: onSearchChange, onSubmit: onSearchSubmit }) : null,
|
|
4691
|
+
mode === "overlay:comment" && selectedIssue ? /* @__PURE__ */ jsx18(
|
|
4689
4692
|
CommentInput,
|
|
4690
4693
|
{
|
|
4691
4694
|
issueNumber: selectedIssue.number,
|
|
@@ -4695,8 +4698,8 @@ function OverlayRenderer({
|
|
|
4695
4698
|
onResumeRefresh
|
|
4696
4699
|
}
|
|
4697
4700
|
) : null,
|
|
4698
|
-
mode === "overlay:fuzzyPicker" ? /* @__PURE__ */
|
|
4699
|
-
mode === "overlay:createNl" ? /* @__PURE__ */
|
|
4701
|
+
mode === "overlay:fuzzyPicker" ? /* @__PURE__ */ jsx18(FuzzyPicker, { repos, onSelect: onFuzzySelect, onClose: onFuzzyClose }) : null,
|
|
4702
|
+
mode === "overlay:createNl" ? /* @__PURE__ */ jsx18(
|
|
4700
4703
|
NlCreateOverlay,
|
|
4701
4704
|
{
|
|
4702
4705
|
repos: config2.repos,
|
|
@@ -4709,7 +4712,7 @@ function OverlayRenderer({
|
|
|
4709
4712
|
onLlmFallback
|
|
4710
4713
|
}
|
|
4711
4714
|
) : null,
|
|
4712
|
-
mode === "overlay:editIssue" && selectedIssue && selectedRepoName ? /* @__PURE__ */
|
|
4715
|
+
mode === "overlay:editIssue" && selectedIssue && selectedRepoName ? /* @__PURE__ */ jsx18(
|
|
4713
4716
|
EditIssueOverlay,
|
|
4714
4717
|
{
|
|
4715
4718
|
issue: selectedIssue,
|
|
@@ -4746,8 +4749,8 @@ var init_overlay_renderer = __esm({
|
|
|
4746
4749
|
});
|
|
4747
4750
|
|
|
4748
4751
|
// src/board/components/panel-layout.tsx
|
|
4749
|
-
import { Box as
|
|
4750
|
-
import { jsx as
|
|
4752
|
+
import { Box as Box18 } from "ink";
|
|
4753
|
+
import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
4751
4754
|
function getLayoutMode(cols) {
|
|
4752
4755
|
if (cols >= WIDE_THRESHOLD) return "wide";
|
|
4753
4756
|
if (cols >= MEDIUM_THRESHOLD) return "medium";
|
|
@@ -4768,35 +4771,35 @@ function PanelLayout({
|
|
|
4768
4771
|
const mode = getLayoutMode(cols);
|
|
4769
4772
|
if (mode === "wide") {
|
|
4770
4773
|
const detailWidth = getDetailWidth(cols);
|
|
4771
|
-
return /* @__PURE__ */
|
|
4772
|
-
/* @__PURE__ */
|
|
4773
|
-
/* @__PURE__ */
|
|
4774
|
+
return /* @__PURE__ */ jsxs19(Box18, { flexDirection: "column", children: [
|
|
4775
|
+
/* @__PURE__ */ jsxs19(Box18, { height: issuesPanelHeight, children: [
|
|
4776
|
+
/* @__PURE__ */ jsxs19(Box18, { flexDirection: "column", width: LEFT_COL_WIDTH, children: [
|
|
4774
4777
|
reposPanel,
|
|
4775
4778
|
statusesPanel
|
|
4776
4779
|
] }),
|
|
4777
|
-
/* @__PURE__ */
|
|
4778
|
-
/* @__PURE__ */
|
|
4780
|
+
/* @__PURE__ */ jsx19(Box18, { flexGrow: 1, flexDirection: "column", children: issuesPanel }),
|
|
4781
|
+
/* @__PURE__ */ jsx19(Box18, { width: detailWidth, flexDirection: "column", children: detailPanel })
|
|
4779
4782
|
] }),
|
|
4780
|
-
/* @__PURE__ */
|
|
4783
|
+
/* @__PURE__ */ jsx19(Box18, { height: ACTIVITY_HEIGHT, children: activityPanel })
|
|
4781
4784
|
] });
|
|
4782
4785
|
}
|
|
4783
4786
|
if (mode === "medium") {
|
|
4784
|
-
return /* @__PURE__ */
|
|
4785
|
-
/* @__PURE__ */
|
|
4786
|
-
/* @__PURE__ */
|
|
4787
|
+
return /* @__PURE__ */ jsxs19(Box18, { flexDirection: "column", children: [
|
|
4788
|
+
/* @__PURE__ */ jsxs19(Box18, { height: issuesPanelHeight, children: [
|
|
4789
|
+
/* @__PURE__ */ jsxs19(Box18, { flexDirection: "column", width: LEFT_COL_WIDTH, children: [
|
|
4787
4790
|
reposPanel,
|
|
4788
4791
|
statusesPanel
|
|
4789
4792
|
] }),
|
|
4790
|
-
/* @__PURE__ */
|
|
4793
|
+
/* @__PURE__ */ jsx19(Box18, { flexGrow: 1, flexDirection: "column", children: issuesPanel })
|
|
4791
4794
|
] }),
|
|
4792
|
-
/* @__PURE__ */
|
|
4795
|
+
/* @__PURE__ */ jsx19(Box18, { height: ACTIVITY_HEIGHT, children: activityPanel })
|
|
4793
4796
|
] });
|
|
4794
4797
|
}
|
|
4795
|
-
return /* @__PURE__ */
|
|
4798
|
+
return /* @__PURE__ */ jsxs19(Box18, { flexDirection: "column", children: [
|
|
4796
4799
|
reposPanel,
|
|
4797
4800
|
statusesPanel,
|
|
4798
|
-
/* @__PURE__ */
|
|
4799
|
-
/* @__PURE__ */
|
|
4801
|
+
/* @__PURE__ */ jsx19(Box18, { flexGrow: 1, flexDirection: "column", children: issuesPanel }),
|
|
4802
|
+
/* @__PURE__ */ jsx19(Box18, { height: ACTIVITY_HEIGHT, children: activityPanel })
|
|
4800
4803
|
] });
|
|
4801
4804
|
}
|
|
4802
4805
|
var WIDE_THRESHOLD, MEDIUM_THRESHOLD, LEFT_COL_WIDTH, ACTIVITY_HEIGHT;
|
|
@@ -4806,45 +4809,43 @@ var init_panel_layout = __esm({
|
|
|
4806
4809
|
WIDE_THRESHOLD = 160;
|
|
4807
4810
|
MEDIUM_THRESHOLD = 100;
|
|
4808
4811
|
LEFT_COL_WIDTH = 24;
|
|
4809
|
-
ACTIVITY_HEIGHT =
|
|
4812
|
+
ACTIVITY_HEIGHT = 5;
|
|
4810
4813
|
}
|
|
4811
4814
|
});
|
|
4812
4815
|
|
|
4813
4816
|
// src/board/components/repos-panel.tsx
|
|
4814
|
-
import { Box as
|
|
4815
|
-
import { jsx as
|
|
4817
|
+
import { Box as Box19, Text as Text18 } from "ink";
|
|
4818
|
+
import { jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
4816
4819
|
function shortName(fullName) {
|
|
4817
4820
|
return fullName.includes("/") ? fullName.split("/")[1] ?? fullName : fullName;
|
|
4818
4821
|
}
|
|
4819
|
-
function ReposPanel({ repos, selectedIdx, isActive }) {
|
|
4820
|
-
const
|
|
4821
|
-
return /* @__PURE__ */
|
|
4822
|
-
|
|
4823
|
-
|
|
4824
|
-
|
|
4825
|
-
|
|
4826
|
-
|
|
4827
|
-
|
|
4828
|
-
|
|
4829
|
-
|
|
4830
|
-
|
|
4831
|
-
|
|
4832
|
-
|
|
4833
|
-
|
|
4834
|
-
|
|
4835
|
-
] }, repo.name);
|
|
4836
|
-
})
|
|
4837
|
-
] });
|
|
4822
|
+
function ReposPanel({ repos, selectedIdx, isActive, width, flexGrow }) {
|
|
4823
|
+
const maxLabel = Math.max(4, width - 8);
|
|
4824
|
+
return /* @__PURE__ */ jsx20(Panel, { title: "[1] Repos", isActive, width, flexGrow, children: repos.length === 0 ? /* @__PURE__ */ jsx20(Text18, { color: "gray", children: "\u2014" }) : repos.map((repo, i) => {
|
|
4825
|
+
const isSel = i === selectedIdx;
|
|
4826
|
+
const label = shortName(repo.name).slice(0, maxLabel);
|
|
4827
|
+
return /* @__PURE__ */ jsxs20(Box19, { children: [
|
|
4828
|
+
/* @__PURE__ */ jsxs20(Text18, { color: isSel ? "cyan" : isActive ? "white" : "gray", bold: isSel, children: [
|
|
4829
|
+
isSel ? "\u25BA " : " ",
|
|
4830
|
+
label
|
|
4831
|
+
] }),
|
|
4832
|
+
/* @__PURE__ */ jsxs20(Text18, { color: "gray", children: [
|
|
4833
|
+
" ",
|
|
4834
|
+
repo.openCount
|
|
4835
|
+
] })
|
|
4836
|
+
] }, repo.name);
|
|
4837
|
+
}) });
|
|
4838
4838
|
}
|
|
4839
4839
|
var init_repos_panel = __esm({
|
|
4840
4840
|
"src/board/components/repos-panel.tsx"() {
|
|
4841
4841
|
"use strict";
|
|
4842
|
+
init_panel();
|
|
4842
4843
|
}
|
|
4843
4844
|
});
|
|
4844
4845
|
|
|
4845
4846
|
// src/board/components/issue-row.tsx
|
|
4846
|
-
import { Box as
|
|
4847
|
-
import { Fragment as Fragment3, jsx as
|
|
4847
|
+
import { Box as Box20, Text as Text19 } from "ink";
|
|
4848
|
+
import { Fragment as Fragment3, jsx as jsx21, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
4848
4849
|
function truncate(s, max) {
|
|
4849
4850
|
return s.length > max ? `${s.slice(0, max - 1)}\u2026` : s;
|
|
4850
4851
|
}
|
|
@@ -4885,30 +4886,30 @@ function IssueRow({ issue, selfLogin, isSelected }) {
|
|
|
4885
4886
|
const labels = (issue.labels ?? []).slice(0, 2);
|
|
4886
4887
|
const target = formatTargetDate(issue.targetDate);
|
|
4887
4888
|
const titleStr = truncate(issue.title, 42).padEnd(42);
|
|
4888
|
-
return /* @__PURE__ */
|
|
4889
|
-
isSelected ? /* @__PURE__ */
|
|
4890
|
-
/* @__PURE__ */
|
|
4889
|
+
return /* @__PURE__ */ jsxs21(Box20, { children: [
|
|
4890
|
+
isSelected ? /* @__PURE__ */ jsx21(Text19, { color: "cyan", bold: true, children: "\u25B6 " }) : /* @__PURE__ */ jsx21(Text19, { children: " " }),
|
|
4891
|
+
/* @__PURE__ */ jsxs21(Text19, { color: "cyan", children: [
|
|
4891
4892
|
"#",
|
|
4892
4893
|
String(issue.number).padEnd(5)
|
|
4893
4894
|
] }),
|
|
4894
|
-
/* @__PURE__ */
|
|
4895
|
-
isSelected ? /* @__PURE__ */
|
|
4896
|
-
/* @__PURE__ */
|
|
4897
|
-
/* @__PURE__ */
|
|
4895
|
+
/* @__PURE__ */ jsx21(Text19, { children: " " }),
|
|
4896
|
+
isSelected ? /* @__PURE__ */ jsx21(Text19, { color: "white", bold: true, children: titleStr }) : /* @__PURE__ */ jsx21(Text19, { children: titleStr }),
|
|
4897
|
+
/* @__PURE__ */ jsx21(Text19, { children: " " }),
|
|
4898
|
+
/* @__PURE__ */ jsx21(Box20, { width: LABEL_COL_WIDTH, children: labels.map((l, i) => /* @__PURE__ */ jsxs21(Text19, { children: [
|
|
4898
4899
|
i > 0 ? " " : "",
|
|
4899
|
-
/* @__PURE__ */
|
|
4900
|
+
/* @__PURE__ */ jsxs21(Text19, { color: labelColor(l.name), children: [
|
|
4900
4901
|
"[",
|
|
4901
4902
|
truncate(l.name, 12),
|
|
4902
4903
|
"]"
|
|
4903
4904
|
] })
|
|
4904
4905
|
] }, l.name)) }),
|
|
4905
|
-
/* @__PURE__ */
|
|
4906
|
-
/* @__PURE__ */
|
|
4907
|
-
/* @__PURE__ */
|
|
4908
|
-
/* @__PURE__ */
|
|
4909
|
-
target.text ? /* @__PURE__ */
|
|
4910
|
-
/* @__PURE__ */
|
|
4911
|
-
/* @__PURE__ */
|
|
4906
|
+
/* @__PURE__ */ jsx21(Text19, { children: " " }),
|
|
4907
|
+
/* @__PURE__ */ jsx21(Text19, { color: assigneeColor, children: assigneeText.padEnd(14) }),
|
|
4908
|
+
/* @__PURE__ */ jsx21(Text19, { children: " " }),
|
|
4909
|
+
/* @__PURE__ */ jsx21(Text19, { color: "gray", children: timeAgo2(issue.updatedAt).padStart(4) }),
|
|
4910
|
+
target.text ? /* @__PURE__ */ jsxs21(Fragment3, { children: [
|
|
4911
|
+
/* @__PURE__ */ jsx21(Text19, { children: " " }),
|
|
4912
|
+
/* @__PURE__ */ jsx21(Text19, { color: target.color, children: target.text })
|
|
4912
4913
|
] }) : null
|
|
4913
4914
|
] });
|
|
4914
4915
|
}
|
|
@@ -4932,20 +4933,20 @@ var init_issue_row = __esm({
|
|
|
4932
4933
|
});
|
|
4933
4934
|
|
|
4934
4935
|
// src/board/components/row-renderer.tsx
|
|
4935
|
-
import { Box as
|
|
4936
|
-
import { jsx as
|
|
4936
|
+
import { Box as Box21, Text as Text20 } from "ink";
|
|
4937
|
+
import { jsx as jsx22, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
4937
4938
|
function RowRenderer({ row, selectedId, selfLogin, isMultiSelected }) {
|
|
4938
4939
|
switch (row.type) {
|
|
4939
4940
|
case "sectionHeader": {
|
|
4940
4941
|
const arrow = row.isCollapsed ? "\u25B6" : "\u25BC";
|
|
4941
4942
|
const isSel = selectedId === row.navId;
|
|
4942
|
-
return /* @__PURE__ */
|
|
4943
|
-
/* @__PURE__ */
|
|
4943
|
+
return /* @__PURE__ */ jsxs22(Box21, { children: [
|
|
4944
|
+
/* @__PURE__ */ jsxs22(Text20, { color: isSel ? "cyan" : "white", bold: true, children: [
|
|
4944
4945
|
arrow,
|
|
4945
4946
|
" ",
|
|
4946
4947
|
row.label
|
|
4947
4948
|
] }),
|
|
4948
|
-
/* @__PURE__ */
|
|
4949
|
+
/* @__PURE__ */ jsxs22(Text20, { color: "gray", children: [
|
|
4949
4950
|
" ",
|
|
4950
4951
|
"(",
|
|
4951
4952
|
row.count,
|
|
@@ -4959,26 +4960,26 @@ function RowRenderer({ row, selectedId, selfLogin, isMultiSelected }) {
|
|
|
4959
4960
|
if (row.navId) {
|
|
4960
4961
|
const arrow = row.isCollapsed ? "\u25B6" : "\u25BC";
|
|
4961
4962
|
const isSel = selectedId === row.navId;
|
|
4962
|
-
return /* @__PURE__ */
|
|
4963
|
-
/* @__PURE__ */
|
|
4963
|
+
return /* @__PURE__ */ jsxs22(Box21, { children: [
|
|
4964
|
+
/* @__PURE__ */ jsxs22(Text20, { color: isSel ? "cyan" : "gray", children: [
|
|
4964
4965
|
" ",
|
|
4965
4966
|
arrow,
|
|
4966
4967
|
" ",
|
|
4967
4968
|
row.text
|
|
4968
4969
|
] }),
|
|
4969
|
-
/* @__PURE__ */
|
|
4970
|
+
/* @__PURE__ */ jsxs22(Text20, { color: "gray", children: [
|
|
4970
4971
|
" (",
|
|
4971
4972
|
row.count,
|
|
4972
4973
|
")"
|
|
4973
4974
|
] })
|
|
4974
4975
|
] });
|
|
4975
4976
|
}
|
|
4976
|
-
return /* @__PURE__ */
|
|
4977
|
-
/* @__PURE__ */
|
|
4977
|
+
return /* @__PURE__ */ jsxs22(Box21, { children: [
|
|
4978
|
+
/* @__PURE__ */ jsxs22(Text20, { bold: true, color: "white", children: [
|
|
4978
4979
|
" ",
|
|
4979
4980
|
row.text
|
|
4980
4981
|
] }),
|
|
4981
|
-
row.count != null ? /* @__PURE__ */
|
|
4982
|
+
row.count != null ? /* @__PURE__ */ jsxs22(Text20, { color: "gray", children: [
|
|
4982
4983
|
" (",
|
|
4983
4984
|
row.count,
|
|
4984
4985
|
")"
|
|
@@ -4987,25 +4988,25 @@ function RowRenderer({ row, selectedId, selfLogin, isMultiSelected }) {
|
|
|
4987
4988
|
}
|
|
4988
4989
|
case "issue": {
|
|
4989
4990
|
const checkbox2 = isMultiSelected != null ? isMultiSelected ? "\u2611 " : "\u2610 " : "";
|
|
4990
|
-
return /* @__PURE__ */
|
|
4991
|
-
checkbox2 ? /* @__PURE__ */
|
|
4992
|
-
/* @__PURE__ */
|
|
4991
|
+
return /* @__PURE__ */ jsxs22(Box21, { children: [
|
|
4992
|
+
checkbox2 ? /* @__PURE__ */ jsx22(Text20, { color: isMultiSelected ? "cyan" : "gray", children: checkbox2 }) : null,
|
|
4993
|
+
/* @__PURE__ */ jsx22(IssueRow, { issue: row.issue, selfLogin, isSelected: selectedId === row.navId })
|
|
4993
4994
|
] });
|
|
4994
4995
|
}
|
|
4995
4996
|
case "activity": {
|
|
4996
4997
|
const ago = new Date(row.event.timestamp).toLocaleTimeString();
|
|
4997
|
-
return /* @__PURE__ */
|
|
4998
|
+
return /* @__PURE__ */ jsxs22(Text20, { dimColor: true, children: [
|
|
4998
4999
|
" ",
|
|
4999
5000
|
ago,
|
|
5000
5001
|
": ",
|
|
5001
|
-
/* @__PURE__ */
|
|
5002
|
+
/* @__PURE__ */ jsxs22(Text20, { color: "gray", children: [
|
|
5002
5003
|
"@",
|
|
5003
5004
|
row.event.actor
|
|
5004
5005
|
] }),
|
|
5005
5006
|
" ",
|
|
5006
5007
|
row.event.summary,
|
|
5007
5008
|
" ",
|
|
5008
|
-
/* @__PURE__ */
|
|
5009
|
+
/* @__PURE__ */ jsxs22(Text20, { dimColor: true, children: [
|
|
5009
5010
|
"(",
|
|
5010
5011
|
row.event.repoShortName,
|
|
5011
5012
|
")"
|
|
@@ -5013,12 +5014,12 @@ function RowRenderer({ row, selectedId, selfLogin, isMultiSelected }) {
|
|
|
5013
5014
|
] });
|
|
5014
5015
|
}
|
|
5015
5016
|
case "error":
|
|
5016
|
-
return /* @__PURE__ */
|
|
5017
|
+
return /* @__PURE__ */ jsxs22(Text20, { color: "red", children: [
|
|
5017
5018
|
" Error: ",
|
|
5018
5019
|
row.text
|
|
5019
5020
|
] });
|
|
5020
5021
|
case "gap":
|
|
5021
|
-
return /* @__PURE__ */
|
|
5022
|
+
return /* @__PURE__ */ jsx22(Text20, { children: "" });
|
|
5022
5023
|
}
|
|
5023
5024
|
}
|
|
5024
5025
|
var init_row_renderer = __esm({
|
|
@@ -5029,50 +5030,55 @@ var init_row_renderer = __esm({
|
|
|
5029
5030
|
});
|
|
5030
5031
|
|
|
5031
5032
|
// src/board/components/statuses-panel.tsx
|
|
5032
|
-
import { Box as
|
|
5033
|
-
import { jsx as
|
|
5034
|
-
function StatusesPanel({
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
|
|
5038
|
-
|
|
5039
|
-
|
|
5040
|
-
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
|
|
5045
|
-
|
|
5046
|
-
|
|
5047
|
-
|
|
5048
|
-
|
|
5049
|
-
] },
|
|
5050
|
-
|
|
5051
|
-
|
|
5033
|
+
import { Box as Box22, Text as Text21 } from "ink";
|
|
5034
|
+
import { jsx as jsx23, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
5035
|
+
function StatusesPanel({
|
|
5036
|
+
groups,
|
|
5037
|
+
selectedIdx,
|
|
5038
|
+
isActive,
|
|
5039
|
+
width,
|
|
5040
|
+
flexGrow
|
|
5041
|
+
}) {
|
|
5042
|
+
const maxLabel = Math.max(4, width - 8);
|
|
5043
|
+
return /* @__PURE__ */ jsx23(Panel, { title: "[2] Statuses", isActive, width, flexGrow, children: groups.length === 0 ? /* @__PURE__ */ jsx23(Text21, { color: "gray", children: "\u2014" }) : groups.map((group, i) => {
|
|
5044
|
+
const isSel = i === selectedIdx;
|
|
5045
|
+
const label = group.label.slice(0, maxLabel);
|
|
5046
|
+
return /* @__PURE__ */ jsxs23(Box22, { children: [
|
|
5047
|
+
/* @__PURE__ */ jsxs23(Text21, { color: isSel ? "cyan" : isActive ? "white" : "gray", bold: isSel, children: [
|
|
5048
|
+
isSel ? "\u25BA " : " ",
|
|
5049
|
+
label
|
|
5050
|
+
] }),
|
|
5051
|
+
/* @__PURE__ */ jsxs23(Text21, { color: "gray", children: [
|
|
5052
|
+
" ",
|
|
5053
|
+
group.count
|
|
5054
|
+
] })
|
|
5055
|
+
] }, group.id);
|
|
5056
|
+
}) });
|
|
5052
5057
|
}
|
|
5053
5058
|
var init_statuses_panel = __esm({
|
|
5054
5059
|
"src/board/components/statuses-panel.tsx"() {
|
|
5055
5060
|
"use strict";
|
|
5061
|
+
init_panel();
|
|
5056
5062
|
}
|
|
5057
5063
|
});
|
|
5058
5064
|
|
|
5059
5065
|
// src/board/components/toast-container.tsx
|
|
5060
5066
|
import { Spinner as Spinner3 } from "@inkjs/ui";
|
|
5061
|
-
import { Box as
|
|
5062
|
-
import { Fragment as Fragment4, jsx as
|
|
5067
|
+
import { Box as Box23, Text as Text22 } from "ink";
|
|
5068
|
+
import { Fragment as Fragment4, jsx as jsx24, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
5063
5069
|
function ToastContainer({ toasts }) {
|
|
5064
5070
|
if (toasts.length === 0) return null;
|
|
5065
|
-
return /* @__PURE__ */
|
|
5066
|
-
/* @__PURE__ */
|
|
5067
|
-
/* @__PURE__ */
|
|
5071
|
+
return /* @__PURE__ */ jsx24(Box23, { flexDirection: "column", children: toasts.map((t) => /* @__PURE__ */ jsx24(Box23, { children: t.type === "loading" ? /* @__PURE__ */ jsxs24(Fragment4, { children: [
|
|
5072
|
+
/* @__PURE__ */ jsx24(Spinner3, { label: "" }),
|
|
5073
|
+
/* @__PURE__ */ jsxs24(Text22, { color: "cyan", children: [
|
|
5068
5074
|
" ",
|
|
5069
5075
|
t.message
|
|
5070
5076
|
] })
|
|
5071
|
-
] }) : /* @__PURE__ */
|
|
5077
|
+
] }) : /* @__PURE__ */ jsxs24(Text22, { color: TYPE_COLORS[t.type], children: [
|
|
5072
5078
|
TYPE_PREFIXES[t.type],
|
|
5073
5079
|
" ",
|
|
5074
5080
|
t.message,
|
|
5075
|
-
t.type === "error" ? /* @__PURE__ */
|
|
5081
|
+
t.type === "error" ? /* @__PURE__ */ jsx24(Text22, { color: "gray", children: t.retry ? " [r]etry [d]ismiss" : " [d]ismiss" }) : null
|
|
5076
5082
|
] }) }, t.id)) });
|
|
5077
5083
|
}
|
|
5078
5084
|
var TYPE_COLORS, TYPE_PREFIXES;
|
|
@@ -5096,9 +5102,9 @@ var init_toast_container = __esm({
|
|
|
5096
5102
|
// src/board/components/dashboard.tsx
|
|
5097
5103
|
import { execFileSync as execFileSync3, spawnSync as spawnSync4 } from "child_process";
|
|
5098
5104
|
import { Spinner as Spinner4 } from "@inkjs/ui";
|
|
5099
|
-
import { Box as
|
|
5105
|
+
import { Box as Box24, Text as Text23, useApp, useStdout } from "ink";
|
|
5100
5106
|
import { useCallback as useCallback12, useEffect as useEffect9, useMemo as useMemo3, useRef as useRef13, useState as useState16 } from "react";
|
|
5101
|
-
import { Fragment as Fragment5, jsx as
|
|
5107
|
+
import { Fragment as Fragment5, jsx as jsx25, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
5102
5108
|
function resolveStatusGroups(statusOptions, configuredGroups) {
|
|
5103
5109
|
if (configuredGroups && configuredGroups.length > 0) {
|
|
5104
5110
|
return configuredGroups.map((entry) => {
|
|
@@ -5249,7 +5255,7 @@ function RefreshAge({ lastRefresh }) {
|
|
|
5249
5255
|
return () => clearInterval(id);
|
|
5250
5256
|
}, []);
|
|
5251
5257
|
if (!lastRefresh) return null;
|
|
5252
|
-
return /* @__PURE__ */
|
|
5258
|
+
return /* @__PURE__ */ jsxs25(Text23, { color: refreshAgeColor(lastRefresh), children: [
|
|
5253
5259
|
"Updated ",
|
|
5254
5260
|
timeAgo(lastRefresh)
|
|
5255
5261
|
] });
|
|
@@ -5508,6 +5514,12 @@ function Dashboard({ config: config2, options, activeProfile }) {
|
|
|
5508
5514
|
const layoutMode = getLayoutMode(termSize.cols);
|
|
5509
5515
|
const detailPanelWidth = layoutMode === "wide" ? getDetailWidth(termSize.cols) : Math.floor(termSize.cols * 0.35);
|
|
5510
5516
|
const showDetailPanel = layoutMode === "wide";
|
|
5517
|
+
const usableWidth = termSize.cols - 2;
|
|
5518
|
+
const issuesPanelWidth = Math.max(
|
|
5519
|
+
20,
|
|
5520
|
+
layoutMode === "wide" ? usableWidth - LEFT_COL_WIDTH - getDetailWidth(termSize.cols) : layoutMode === "medium" ? usableWidth - LEFT_COL_WIDTH : usableWidth
|
|
5521
|
+
);
|
|
5522
|
+
const activityPanelWidth = usableWidth;
|
|
5511
5523
|
const overlayBarRows = ui.state.mode === "search" || ui.state.mode === "overlay:comment" ? 1 : 0;
|
|
5512
5524
|
const toastRows = toasts.length;
|
|
5513
5525
|
const logPaneRows = logVisible ? 4 : 0;
|
|
@@ -5731,7 +5743,7 @@ function Dashboard({ config: config2, options, activeProfile }) {
|
|
|
5731
5743
|
onActivityEnter
|
|
5732
5744
|
});
|
|
5733
5745
|
if (status === "loading" && !data) {
|
|
5734
|
-
return /* @__PURE__ */
|
|
5746
|
+
return /* @__PURE__ */ jsx25(Box24, { flexDirection: "column", padding: 1, children: /* @__PURE__ */ jsx25(Spinner4, { label: "Loading dashboard..." }) });
|
|
5735
5747
|
}
|
|
5736
5748
|
const now = data?.fetchedAt ?? /* @__PURE__ */ new Date();
|
|
5737
5749
|
const dateStr = now.toLocaleDateString("en-US", {
|
|
@@ -5748,45 +5760,42 @@ function Dashboard({ config: config2, options, activeProfile }) {
|
|
|
5748
5760
|
label,
|
|
5749
5761
|
count: issues.length
|
|
5750
5762
|
}));
|
|
5751
|
-
const reposPanel = /* @__PURE__ */
|
|
5763
|
+
const reposPanel = /* @__PURE__ */ jsx25(
|
|
5752
5764
|
ReposPanel,
|
|
5753
5765
|
{
|
|
5754
5766
|
repos: reposData,
|
|
5755
5767
|
selectedIdx: clampedRepoIdx,
|
|
5756
|
-
isActive: panelFocus.activePanelId === 1
|
|
5768
|
+
isActive: panelFocus.activePanelId === 1,
|
|
5769
|
+
width: LEFT_COL_WIDTH
|
|
5757
5770
|
}
|
|
5758
5771
|
);
|
|
5759
|
-
const statusesPanel = /* @__PURE__ */
|
|
5772
|
+
const statusesPanel = /* @__PURE__ */ jsx25(
|
|
5760
5773
|
StatusesPanel,
|
|
5761
5774
|
{
|
|
5762
5775
|
groups: statusesData,
|
|
5763
5776
|
selectedIdx: clampedStatusIdx,
|
|
5764
|
-
isActive: panelFocus.activePanelId === 2
|
|
5777
|
+
isActive: panelFocus.activePanelId === 2,
|
|
5778
|
+
width: LEFT_COL_WIDTH,
|
|
5779
|
+
flexGrow: 1
|
|
5765
5780
|
}
|
|
5766
5781
|
);
|
|
5767
|
-
const
|
|
5768
|
-
const issuesPanel = /* @__PURE__ */
|
|
5769
|
-
|
|
5782
|
+
const issuesPanelTitle = `[3] Issues${selectedSection ? ` \u2014 ${selectedSection.repo.shortName}` : ""}${selectedStatusGroup ? ` / ${selectedStatusGroup.label}` : ""}`;
|
|
5783
|
+
const issuesPanel = /* @__PURE__ */ jsxs25(
|
|
5784
|
+
Panel,
|
|
5770
5785
|
{
|
|
5771
|
-
|
|
5772
|
-
|
|
5773
|
-
|
|
5786
|
+
title: issuesPanelTitle,
|
|
5787
|
+
isActive: panelFocus.activePanelId === 3,
|
|
5788
|
+
width: issuesPanelWidth,
|
|
5774
5789
|
flexGrow: 1,
|
|
5775
|
-
overflow: "hidden",
|
|
5776
5790
|
children: [
|
|
5777
|
-
/* @__PURE__ */
|
|
5778
|
-
"[3] Issues",
|
|
5779
|
-
selectedSection ? ` \u2014 ${selectedSection.repo.shortName}` : "",
|
|
5780
|
-
selectedStatusGroup ? ` / ${selectedStatusGroup.label}` : ""
|
|
5781
|
-
] }),
|
|
5782
|
-
hasMoreAbove ? /* @__PURE__ */ jsxs24(Text22, { color: "gray", dimColor: true, children: [
|
|
5791
|
+
hasMoreAbove ? /* @__PURE__ */ jsxs25(Text23, { color: "gray", dimColor: true, children: [
|
|
5783
5792
|
" ",
|
|
5784
5793
|
"\u25B2",
|
|
5785
5794
|
" ",
|
|
5786
5795
|
aboveCount,
|
|
5787
5796
|
" more above"
|
|
5788
5797
|
] }) : null,
|
|
5789
|
-
visibleRows.map((row) => /* @__PURE__ */
|
|
5798
|
+
visibleRows.map((row) => /* @__PURE__ */ jsx25(
|
|
5790
5799
|
RowRenderer,
|
|
5791
5800
|
{
|
|
5792
5801
|
row,
|
|
@@ -5796,7 +5805,7 @@ function Dashboard({ config: config2, options, activeProfile }) {
|
|
|
5796
5805
|
},
|
|
5797
5806
|
row.key
|
|
5798
5807
|
)),
|
|
5799
|
-
hasMoreBelow ? /* @__PURE__ */
|
|
5808
|
+
hasMoreBelow ? /* @__PURE__ */ jsxs25(Text23, { color: "gray", dimColor: true, children: [
|
|
5800
5809
|
" ",
|
|
5801
5810
|
"\u25BC",
|
|
5802
5811
|
" ",
|
|
@@ -5806,7 +5815,7 @@ function Dashboard({ config: config2, options, activeProfile }) {
|
|
|
5806
5815
|
]
|
|
5807
5816
|
}
|
|
5808
5817
|
);
|
|
5809
|
-
const detailPanel = showDetailPanel ? /* @__PURE__ */
|
|
5818
|
+
const detailPanel = showDetailPanel ? /* @__PURE__ */ jsx25(
|
|
5810
5819
|
DetailPanel,
|
|
5811
5820
|
{
|
|
5812
5821
|
issue: selectedItem.issue,
|
|
@@ -5817,44 +5826,45 @@ function Dashboard({ config: config2, options, activeProfile }) {
|
|
|
5817
5826
|
commentsState: currentCommentsState
|
|
5818
5827
|
}
|
|
5819
5828
|
) : null;
|
|
5820
|
-
const activityPanel = /* @__PURE__ */
|
|
5829
|
+
const activityPanel = /* @__PURE__ */ jsx25(
|
|
5821
5830
|
ActivityPanel,
|
|
5822
5831
|
{
|
|
5823
5832
|
events: boardTree.activity,
|
|
5824
5833
|
selectedIdx: clampedActivityIdx,
|
|
5825
5834
|
isActive: panelFocus.activePanelId === 4,
|
|
5826
|
-
height: ACTIVITY_HEIGHT
|
|
5835
|
+
height: ACTIVITY_HEIGHT,
|
|
5836
|
+
width: activityPanelWidth
|
|
5827
5837
|
}
|
|
5828
5838
|
);
|
|
5829
|
-
return /* @__PURE__ */
|
|
5830
|
-
/* @__PURE__ */
|
|
5831
|
-
/* @__PURE__ */
|
|
5832
|
-
activeProfile ? /* @__PURE__ */
|
|
5839
|
+
return /* @__PURE__ */ jsxs25(Box24, { flexDirection: "column", paddingX: 1, children: [
|
|
5840
|
+
/* @__PURE__ */ jsxs25(Box24, { children: [
|
|
5841
|
+
/* @__PURE__ */ jsx25(Text23, { color: "cyan", bold: true, children: "HOG BOARD" }),
|
|
5842
|
+
activeProfile ? /* @__PURE__ */ jsxs25(Text23, { color: "yellow", children: [
|
|
5833
5843
|
" [",
|
|
5834
5844
|
activeProfile,
|
|
5835
5845
|
"]"
|
|
5836
5846
|
] }) : null,
|
|
5837
|
-
/* @__PURE__ */
|
|
5847
|
+
/* @__PURE__ */ jsxs25(Text23, { color: "gray", children: [
|
|
5838
5848
|
" ",
|
|
5839
5849
|
"\u2014",
|
|
5840
5850
|
" ",
|
|
5841
5851
|
dateStr
|
|
5842
5852
|
] }),
|
|
5843
|
-
/* @__PURE__ */
|
|
5844
|
-
isRefreshing ? /* @__PURE__ */
|
|
5845
|
-
/* @__PURE__ */
|
|
5846
|
-
/* @__PURE__ */
|
|
5847
|
-
] }) : /* @__PURE__ */
|
|
5848
|
-
/* @__PURE__ */
|
|
5849
|
-
consecutiveFailures > 0 ? /* @__PURE__ */
|
|
5853
|
+
/* @__PURE__ */ jsx25(Text23, { children: " " }),
|
|
5854
|
+
isRefreshing ? /* @__PURE__ */ jsxs25(Fragment5, { children: [
|
|
5855
|
+
/* @__PURE__ */ jsx25(Spinner4, { label: "" }),
|
|
5856
|
+
/* @__PURE__ */ jsx25(Text23, { color: "cyan", children: " Refreshing..." })
|
|
5857
|
+
] }) : /* @__PURE__ */ jsxs25(Fragment5, { children: [
|
|
5858
|
+
/* @__PURE__ */ jsx25(RefreshAge, { lastRefresh }),
|
|
5859
|
+
consecutiveFailures > 0 ? /* @__PURE__ */ jsx25(Text23, { color: "red", children: " (!)" }) : null
|
|
5850
5860
|
] }),
|
|
5851
|
-
autoRefreshPaused ? /* @__PURE__ */
|
|
5861
|
+
autoRefreshPaused ? /* @__PURE__ */ jsx25(Text23, { color: "yellow", children: " Auto-refresh paused \u2014 press r to retry" }) : null
|
|
5852
5862
|
] }),
|
|
5853
|
-
error ? /* @__PURE__ */
|
|
5863
|
+
error ? /* @__PURE__ */ jsxs25(Text23, { color: "red", children: [
|
|
5854
5864
|
"Error: ",
|
|
5855
5865
|
error
|
|
5856
5866
|
] }) : null,
|
|
5857
|
-
/* @__PURE__ */
|
|
5867
|
+
/* @__PURE__ */ jsx25(
|
|
5858
5868
|
OverlayRenderer,
|
|
5859
5869
|
{
|
|
5860
5870
|
uiState: ui.state,
|
|
@@ -5896,7 +5906,7 @@ function Dashboard({ config: config2, options, activeProfile }) {
|
|
|
5896
5906
|
onPushEntry: pushEntry
|
|
5897
5907
|
}
|
|
5898
5908
|
),
|
|
5899
|
-
!ui.state.helpVisible && ui.state.mode !== "overlay:status" && ui.state.mode !== "overlay:create" && ui.state.mode !== "overlay:createNl" && ui.state.mode !== "overlay:bulkAction" && ui.state.mode !== "overlay:confirmPick" && ui.state.mode !== "focus" ? /* @__PURE__ */
|
|
5909
|
+
!ui.state.helpVisible && ui.state.mode !== "overlay:status" && ui.state.mode !== "overlay:create" && ui.state.mode !== "overlay:createNl" && ui.state.mode !== "overlay:bulkAction" && ui.state.mode !== "overlay:confirmPick" && ui.state.mode !== "focus" ? /* @__PURE__ */ jsx25(
|
|
5900
5910
|
PanelLayout,
|
|
5901
5911
|
{
|
|
5902
5912
|
cols: termSize.cols,
|
|
@@ -5908,9 +5918,9 @@ function Dashboard({ config: config2, options, activeProfile }) {
|
|
|
5908
5918
|
activityPanel
|
|
5909
5919
|
}
|
|
5910
5920
|
) : null,
|
|
5911
|
-
/* @__PURE__ */
|
|
5912
|
-
logVisible ? /* @__PURE__ */
|
|
5913
|
-
/* @__PURE__ */
|
|
5921
|
+
/* @__PURE__ */ jsx25(ToastContainer, { toasts }),
|
|
5922
|
+
logVisible ? /* @__PURE__ */ jsx25(ActionLog, { entries: logEntries }) : null,
|
|
5923
|
+
/* @__PURE__ */ jsx25(
|
|
5914
5924
|
HintBar,
|
|
5915
5925
|
{
|
|
5916
5926
|
uiMode: ui.state.mode,
|
|
@@ -5944,6 +5954,7 @@ var init_dashboard = __esm({
|
|
|
5944
5954
|
init_detail_panel();
|
|
5945
5955
|
init_hint_bar();
|
|
5946
5956
|
init_overlay_renderer();
|
|
5957
|
+
init_panel();
|
|
5947
5958
|
init_panel_layout();
|
|
5948
5959
|
init_repos_panel();
|
|
5949
5960
|
init_row_renderer();
|
|
@@ -5965,10 +5976,10 @@ __export(live_exports, {
|
|
|
5965
5976
|
runLiveDashboard: () => runLiveDashboard
|
|
5966
5977
|
});
|
|
5967
5978
|
import { render } from "ink";
|
|
5968
|
-
import { jsx as
|
|
5979
|
+
import { jsx as jsx26 } from "react/jsx-runtime";
|
|
5969
5980
|
async function runLiveDashboard(config2, options, activeProfile) {
|
|
5970
5981
|
const instance = render(
|
|
5971
|
-
/* @__PURE__ */
|
|
5982
|
+
/* @__PURE__ */ jsx26(Dashboard, { config: config2, options, activeProfile: activeProfile ?? null })
|
|
5972
5983
|
);
|
|
5973
5984
|
setInkInstance(instance);
|
|
5974
5985
|
await instance.waitUntilExit();
|
|
@@ -7131,7 +7142,7 @@ function resolveProjectId(projectId) {
|
|
|
7131
7142
|
process.exit(1);
|
|
7132
7143
|
}
|
|
7133
7144
|
var program = new Command();
|
|
7134
|
-
program.name("hog").description("Personal command deck \u2014 unified task dashboard for GitHub Projects + TickTick").version("1.
|
|
7145
|
+
program.name("hog").description("Personal command deck \u2014 unified task dashboard for GitHub Projects + TickTick").version("1.12.0").option("--json", "Force JSON output").option("--human", "Force human-readable output").hook("preAction", (thisCommand) => {
|
|
7135
7146
|
const opts = thisCommand.opts();
|
|
7136
7147
|
if (opts.json) setFormat("json");
|
|
7137
7148
|
if (opts.human) setFormat("human");
|