@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 CHANGED
@@ -2848,61 +2848,88 @@ var init_action_log = __esm({
2848
2848
  }
2849
2849
  });
2850
2850
 
2851
- // src/board/components/activity-panel.tsx
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 ActivityPanel({ events, selectedIdx, isActive, height }) {
2855
- const borderColor = isActive ? "cyan" : "gray";
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__ */ jsxs2(
2859
- Box2,
2860
- {
2861
- borderStyle: "single",
2862
- borderColor,
2863
- flexDirection: "column",
2864
- height,
2865
- overflow: "hidden",
2866
- children: [
2867
- /* @__PURE__ */ jsx2(Text2, { bold: true, color: isActive ? "cyan" : "white", children: "[4] Activity" }),
2868
- visible.length === 0 ? /* @__PURE__ */ jsx2(Text2, { color: "gray", children: " No recent activity" }) : visible.map((event, i) => {
2869
- const isSel = isActive && i === selectedIdx;
2870
- const ago = timeAgo(event.timestamp);
2871
- return /* @__PURE__ */ jsxs2(Box2, { children: [
2872
- /* @__PURE__ */ jsxs2(Text2, { color: isSel ? "cyan" : "gray", bold: isSel, children: [
2873
- isSel ? "\u25B6 " : " ",
2874
- ago
2875
- ] }),
2876
- /* @__PURE__ */ jsxs2(Text2, { color: isSel ? "white" : "gray", children: [
2877
- " ",
2878
- "@",
2879
- event.actor,
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 Box3, Text as Text3 } from "ink";
2930
+ import { Box as Box4, Text as Text4 } from "ink";
2904
2931
  import { useEffect as useEffect3 } from "react";
2905
- import { Fragment, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
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__ */ jsxs3(Fragment, { children: [
2925
- /* @__PURE__ */ jsx3(Text3, { children: "" }),
2926
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "--- Description ---" }),
2927
- /* @__PURE__ */ jsx3(Text3, { wrap: "wrap", children: text }),
2928
- remaining > 0 ? /* @__PURE__ */ jsxs3(Text3, { dimColor: true, children: [
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__ */ jsxs3(
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__ */ jsxs3(
2978
- Box3,
2979
- {
2980
- width,
2981
- borderStyle: "single",
2982
- borderColor,
2983
- flexDirection: "column",
2984
- paddingX: 1,
2985
- children: [
2986
- /* @__PURE__ */ jsx3(Text3, { bold: true, color: isActive ? "cyan" : "white", children: "[0] Detail" }),
2987
- /* @__PURE__ */ jsxs3(Text3, { color: "cyan", bold: true, children: [
2988
- "#",
2989
- issue.number,
2990
- " ",
2991
- issue.title
2992
- ] }),
2993
- /* @__PURE__ */ jsx3(Text3, { children: "" }),
2994
- /* @__PURE__ */ jsxs3(Box3, { children: [
2995
- /* @__PURE__ */ jsx3(Text3, { color: "gray", children: "State: " }),
2996
- /* @__PURE__ */ jsx3(Text3, { color: issue.state === "open" ? "green" : "red", children: issue.state })
2997
- ] }),
2998
- (issue.assignees ?? []).length > 0 ? /* @__PURE__ */ jsxs3(Box3, { children: [
2999
- /* @__PURE__ */ jsx3(Text3, { color: "gray", children: "Assignees: " }),
3000
- /* @__PURE__ */ jsx3(Text3, { children: (issue.assignees ?? []).map((a) => a.login).join(", ") })
3001
- ] }) : null,
3002
- issue.labels.length > 0 ? /* @__PURE__ */ jsxs3(Box3, { children: [
3003
- /* @__PURE__ */ jsx3(Text3, { color: "gray", children: "Labels: " }),
3004
- /* @__PURE__ */ jsx3(Text3, { children: issue.labels.map((l) => l.name).join(", ") })
3005
- ] }) : null,
3006
- issue.projectStatus ? /* @__PURE__ */ jsxs3(Box3, { children: [
3007
- /* @__PURE__ */ jsx3(Text3, { color: "gray", children: "Status: " }),
3008
- /* @__PURE__ */ jsx3(Text3, { color: "magenta", children: issue.projectStatus })
3009
- ] }) : null,
3010
- issue.targetDate ? /* @__PURE__ */ jsxs3(Box3, { children: [
3011
- /* @__PURE__ */ jsx3(Text3, { color: "gray", children: "Target: " }),
3012
- /* @__PURE__ */ jsx3(Text3, { children: issue.targetDate })
3013
- ] }) : null,
3014
- /* @__PURE__ */ jsxs3(Box3, { children: [
3015
- /* @__PURE__ */ jsx3(Text3, { color: "gray", children: "Updated: " }),
3016
- /* @__PURE__ */ jsx3(Text3, { children: new Date(issue.updatedAt).toLocaleString() })
3017
- ] }),
3018
- issue.slackThreadUrl ? /* @__PURE__ */ jsxs3(Box3, { children: [
3019
- /* @__PURE__ */ jsx3(Text3, { color: "gray", children: "Slack: " }),
3020
- /* @__PURE__ */ jsx3(Text3, { color: "blue", children: countSlackLinks(issue.body) > 1 ? `${countSlackLinks(issue.body)} links (s opens first)` : "thread (s to open)" })
3021
- ] }) : null,
3022
- issue.body ? /* @__PURE__ */ jsx3(BodySection, { body: issue.body, issueNumber: issue.number }) : /* @__PURE__ */ jsxs3(Fragment, { children: [
3023
- /* @__PURE__ */ jsx3(Text3, { children: "" }),
3024
- /* @__PURE__ */ jsx3(Text3, { color: "gray", children: "(no description)" })
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__ */ jsx3(Text3, { children: "" }),
3027
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "--- Comments ---" }),
3028
- commentsState === "loading" ? /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "fetching comments..." }) : commentsState === "error" ? /* @__PURE__ */ jsx3(Text3, { color: "red", children: "could not load comments" }) : commentsState && commentsState.length === 0 ? /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "No comments yet." }) : commentsState && commentsState.length > 0 ? commentsState.slice(-5).map((comment, i) => (
3029
- // biome-ignore lint/suspicious/noArrayIndexKey: stable list
3030
- /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", marginBottom: 1, children: [
3031
- /* @__PURE__ */ jsxs3(Text3, { color: "cyan", children: [
3032
- "@",
3033
- comment.author.login,
3034
- " \xB7 ",
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 Box4, Text as Text4 } from "ink";
3059
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
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__ */ jsxs4(Box4, { children: [
3070
- /* @__PURE__ */ jsxs4(Text4, { color: "cyan", bold: true, children: [
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__ */ jsx4(Text4, { color: "gray", children: " Space:toggle Enter:actions Esc:cancel" })
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__ */ jsx4(Box4, { children: /* @__PURE__ */ jsx4(Text4, { color: "magenta", bold: true, children: "[FOCUS] Focus mode \u2014 Esc to exit" }) });
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__ */ jsxs4(Box4, { children: [
3083
- /* @__PURE__ */ jsx4(Text4, { color: "yellow", bold: true, children: "[SEARCH]" }),
3084
- /* @__PURE__ */ jsx4(Text4, { color: "gray", children: " type to filter Enter:confirm Esc:clear" }),
3085
- searchQuery ? /* @__PURE__ */ jsxs4(Text4, { color: "yellow", children: [
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__ */ jsx4(Box4, { children: /* @__PURE__ */ jsx4(Text4, { color: "gray", children: "\u2191\u2193/Ctrl-J/K:nav Enter:jump Esc:close" }) });
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__ */ jsx4(Box4, { children: /* @__PURE__ */ jsx4(Text4, { color: "gray", children: "j/k:nav Enter:select Esc:cancel" }) });
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__ */ jsxs4(Box4, { children: [
3106
- /* @__PURE__ */ jsx4(Text4, { color: "gray", children: panelHints[activePanelId] }),
3107
- mineOnly ? /* @__PURE__ */ jsx4(Text4, { color: "cyan", children: " filter:@me" }) : null,
3108
- searchQuery ? /* @__PURE__ */ jsxs4(Text4, { color: "yellow", children: [
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 Box5, Text as Text5, useInput as useInput2 } from "ink";
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 jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
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__ */ jsxs5(Box5, { flexDirection: "column", children: [
3160
- /* @__PURE__ */ jsx5(Text5, { color: "yellow", children: "No bulk actions for mixed selection types." }),
3161
- /* @__PURE__ */ jsx5(Text5, { dimColor: true, children: "Esc to cancel" })
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__ */ jsxs5(Box5, { flexDirection: "column", children: [
3165
- /* @__PURE__ */ jsxs5(Text5, { color: "cyan", bold: true, children: [
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__ */ jsxs5(Text5, { ...isSelected ? { color: "cyan" } : {}, children: [
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__ */ jsx5(Text5, { dimColor: true, children: "j/k:navigate Enter:select Esc:cancel" })
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 Box6, Text as Text6, useInput as useInput3, useStdin } from "ink";
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 jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
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__ */ jsx6(Box6, { children: /* @__PURE__ */ jsxs6(Text6, { color: "cyan", children: [
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__ */ jsxs6(Box6, { children: [
3284
- /* @__PURE__ */ jsxs6(Text6, { color: "cyan", children: [
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__ */ jsx6(
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 Box7, Text as Text7, useInput as useInput4 } from "ink";
3312
- import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
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__ */ jsxs7(Box7, { children: [
3319
- /* @__PURE__ */ jsx7(Text7, { color: "cyan", children: message }),
3320
- /* @__PURE__ */ jsx7(Text7, { color: "gray", children: " (y/n)" })
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 Box8, Text as Text8, useInput as useInput5 } from "ink";
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 jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
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__ */ jsx8(Box8, { children: /* @__PURE__ */ jsx8(Spinner, { label: "Fetching labels..." }) });
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__ */ jsxs8(Box8, { flexDirection: "column", children: [
3413
- /* @__PURE__ */ jsx8(Text8, { color: "cyan", bold: true, children: "Labels:" }),
3414
- /* @__PURE__ */ jsx8(Text8, { dimColor: true, children: "No labels in this repo" }),
3415
- /* @__PURE__ */ jsx8(Text8, { dimColor: true, children: "Esc:cancel" })
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__ */ jsxs8(Box8, { flexDirection: "column", children: [
3421
- /* @__PURE__ */ jsx8(Text8, { color: "cyan", bold: true, children: "Labels (Space:toggle Enter:confirm Esc:cancel):" }),
3422
- orphanedLabels.map((name) => /* @__PURE__ */ jsxs8(Text8, { dimColor: true, children: [
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__ */ jsxs8(Text8, { ...isSel ? { color: "cyan" } : {}, children: [
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 Box9, Text as Text9, useInput as useInput6 } from "ink";
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 jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
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__ */ jsxs9(Box9, { flexDirection: "column", children: [
3484
- /* @__PURE__ */ jsx9(Text9, { color: "cyan", bold: true, children: "Create Issue \u2014 Add Labels (optional)" }),
3485
- /* @__PURE__ */ jsxs9(Text9, { dimColor: true, children: [
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__ */ jsx9(
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__ */ jsxs9(Box9, { flexDirection: "column", children: [
3517
- /* @__PURE__ */ jsx9(Text9, { color: "cyan", bold: true, children: "Create Issue" }),
3518
- /* @__PURE__ */ jsxs9(Box9, { children: [
3519
- /* @__PURE__ */ jsx9(Text9, { dimColor: field !== "repo", children: "Repo: " }),
3520
- repos.map((r, i) => /* @__PURE__ */ jsx9(
3521
- Text9,
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__ */ jsx9(Text9, { dimColor: true, children: " j/k:select Tab:next" }) : null
3532
+ field === "repo" ? /* @__PURE__ */ jsx10(Text10, { dimColor: true, children: " j/k:select Tab:next" }) : null
3530
3533
  ] }),
3531
- /* @__PURE__ */ jsxs9(Box9, { children: [
3532
- /* @__PURE__ */ jsx9(Text9, { dimColor: field !== "title", children: "Title: " }),
3533
- field === "title" ? /* @__PURE__ */ jsx9(
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__ */ jsx9(Text9, { children: title || "(empty)" })
3553
+ ) : /* @__PURE__ */ jsx10(Text10, { children: title || "(empty)" })
3551
3554
  ] }),
3552
- /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: "Tab:switch fields Enter:next Esc:cancel" })
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 Box10, Text as Text10, useStdin as useStdin2 } from "ink";
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 jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
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__ */ jsx10(Box10, { children: /* @__PURE__ */ jsxs10(Text10, { color: "cyan", children: [
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 Box11, Text as Text11, useInput as useInput7 } from "ink";
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 jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
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__ */ jsxs11(Box11, { flexDirection: "column", children: [
3887
- /* @__PURE__ */ jsxs11(Box11, { children: [
3888
- /* @__PURE__ */ jsx11(Text11, { color: "green", bold: true, children: "Focus complete!" }),
3889
- /* @__PURE__ */ jsxs11(Text11, { color: "gray", children: [
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__ */ jsxs11(Box11, { marginTop: 1, children: [
3895
- /* @__PURE__ */ jsx11(Text11, { color: "cyan", children: "[c]" }),
3896
- /* @__PURE__ */ jsx11(Text11, { children: " Continue " }),
3897
- /* @__PURE__ */ jsx11(Text11, { color: "cyan", children: "[b]" }),
3898
- /* @__PURE__ */ jsx11(Text11, { children: " Break " }),
3899
- /* @__PURE__ */ jsx11(Text11, { color: "cyan", children: "[d]" }),
3900
- /* @__PURE__ */ jsx11(Text11, { children: " Done " }),
3901
- /* @__PURE__ */ jsx11(Text11, { color: "gray", children: "[Esc]" }),
3902
- /* @__PURE__ */ jsx11(Text11, { children: " Exit" })
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__ */ jsxs11(Box11, { flexDirection: "column", children: [
3911
- /* @__PURE__ */ jsxs11(Box11, { children: [
3912
- /* @__PURE__ */ jsxs11(Text11, { color: "magenta", bold: true, children: [
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__ */ jsx11(Text11, { children: label })
3919
+ /* @__PURE__ */ jsx12(Text12, { children: label })
3917
3920
  ] }),
3918
- /* @__PURE__ */ jsxs11(Box11, { children: [
3919
- /* @__PURE__ */ jsx11(Text11, { color: "magenta", children: bar }),
3920
- /* @__PURE__ */ jsx11(Text11, { children: " " }),
3921
- /* @__PURE__ */ jsx11(Text11, { bold: true, children: formatTime(remaining) }),
3922
- /* @__PURE__ */ jsx11(Text11, { color: "gray", children: " remaining" })
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__ */ jsx11(Text11, { color: "gray", dimColor: true, children: "Esc to exit focus" })
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 Box12, Text as Text12, useInput as useInput8 } from "ink";
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 jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
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__ */ jsxs12(Box12, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, children: [
4031
- /* @__PURE__ */ jsxs12(Box12, { children: [
4032
- /* @__PURE__ */ jsxs12(Text12, { color: "cyan", bold: true, children: [
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__ */ jsxs12(Text12, { color: "gray", children: [
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__ */ jsx12(Text12, { color: "gray", dimColor: true, children: "\u2191\u2193/Ctrl-J/K nav Enter:jump Esc:close" })
4047
+ /* @__PURE__ */ jsx13(Text13, { color: "gray", dimColor: true, children: "\u2191\u2193/Ctrl-J/K nav Enter:jump Esc:close" })
4045
4048
  ] }),
4046
- /* @__PURE__ */ jsxs12(Box12, { children: [
4047
- /* @__PURE__ */ jsxs12(Text12, { color: "yellow", children: [
4049
+ /* @__PURE__ */ jsxs13(Box13, { children: [
4050
+ /* @__PURE__ */ jsxs13(Text13, { color: "yellow", children: [
4048
4051
  ">",
4049
4052
  " "
4050
4053
  ] }),
4051
- /* @__PURE__ */ jsx12(
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__ */ jsxs12(Text12, { color: "gray", dimColor: true, children: [
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__ */ jsx12(Box12, { children: isSelected ? /* @__PURE__ */ jsxs12(Text12, { color: "cyan", bold: true, children: [
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__ */ jsxs12(Text12, { children: [
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__ */ jsxs12(Text12, { dimColor: true, children: [
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__ */ jsxs12(Text12, { color: "gray", dimColor: true, children: [
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 Box13, Text as Text13, useInput as useInput9 } from "ink";
4118
- import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
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__ */ jsxs13(Box13, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, children: [
4124
- /* @__PURE__ */ jsxs13(Box13, { justifyContent: "space-between", children: [
4125
- /* @__PURE__ */ jsx13(Text13, { color: "cyan", bold: true, children: "Keyboard Shortcuts" }),
4126
- /* @__PURE__ */ jsxs13(Text13, { dimColor: true, children: [
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__ */ jsx13(Text13, { children: " " }),
4132
- SHORTCUTS.map((group) => /* @__PURE__ */ jsxs13(Box13, { flexDirection: "column", marginBottom: 1, children: [
4133
- /* @__PURE__ */ jsx13(Text13, { color: "yellow", bold: true, children: group.category }),
4134
- group.items.map((item) => /* @__PURE__ */ jsxs13(Box13, { children: [
4135
- /* @__PURE__ */ jsx13(Box13, { width: 16, children: /* @__PURE__ */ jsx13(Text13, { color: "green", children: item.key }) }),
4136
- /* @__PURE__ */ jsx13(Text13, { children: item.desc })
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__ */ jsx13(Text13, { dimColor: true, children: "Press ? or Esc to close" })
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 Box14, Text as Text14, useInput as useInput10, useStdin as useStdin3 } from "ink";
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 jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
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__ */ jsxs14(Box14, { flexDirection: "column", children: [
4334
- /* @__PURE__ */ jsx14(Text14, { color: "cyan", bold: true, children: "\u2728 Creating Issue" }),
4335
- /* @__PURE__ */ jsx14(Spinner2, { label: "Parsing..." })
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__ */ jsxs14(Box14, { flexDirection: "column", children: [
4341
- /* @__PURE__ */ jsx14(Text14, { color: "cyan", bold: true, children: "\u2728 Creating Issue" }),
4342
- /* @__PURE__ */ jsx14(Text14, { color: "cyan", children: "Opening editor for body\u2026" })
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__ */ jsxs14(Box14, { flexDirection: "column", children: [
4346
- /* @__PURE__ */ jsx14(Text14, { color: "cyan", bold: true, children: "\u2728 Creating Issue" }),
4347
- /* @__PURE__ */ jsxs14(Box14, { children: [
4348
- /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: "Title: " }),
4349
- /* @__PURE__ */ jsx14(Text14, { children: parsed.title })
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__ */ jsxs14(Box14, { children: [
4352
- /* @__PURE__ */ jsx14(Text14, { color: "cyan", children: "body: " }),
4353
- /* @__PURE__ */ jsx14(
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__ */ jsx14(Text14, { dimColor: true, children: "Enter:create ctrl+e:editor Esc:back" })
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__ */ jsxs14(Box14, { flexDirection: "column", children: [
4381
- /* @__PURE__ */ jsx14(Text14, { color: "cyan", bold: true, children: "\u2728 Creating Issue" }),
4382
- /* @__PURE__ */ jsxs14(Box14, { children: [
4383
- /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: "Repo: " }),
4384
- /* @__PURE__ */ jsx14(Text14, { color: "cyan", children: selectedRepo?.shortName ?? "(none)" }),
4385
- repos.length > 1 ? /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: " r:cycle" }) : null
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__ */ jsxs14(Box14, { children: [
4388
- /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: "Title: " }),
4389
- /* @__PURE__ */ jsx14(Text14, { children: parsed.title })
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__ */ jsxs14(Box14, { children: [
4392
- /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: "Labels: " }),
4393
- /* @__PURE__ */ jsx14(Text14, { children: labels.join(", ") })
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__ */ jsxs14(Box14, { children: [
4396
- /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: "Assignee: " }),
4397
- /* @__PURE__ */ jsxs14(Text14, { children: [
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__ */ jsxs14(Box14, { children: [
4403
- /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: "Due: " }),
4404
- /* @__PURE__ */ jsx14(Text14, { children: formatDue(parsed.dueDate) })
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__ */ jsx14(Text14, { dimColor: true, children: "Enter:add body Esc:cancel" })
4409
+ /* @__PURE__ */ jsx15(Text15, { dimColor: true, children: "Enter:add body Esc:cancel" })
4407
4410
  ] });
4408
4411
  }
4409
- return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", children: [
4410
- /* @__PURE__ */ jsx14(Text14, { color: "cyan", bold: true, children: "\u2728 What do you need to do?" }),
4411
- /* @__PURE__ */ jsxs14(Box14, { children: [
4412
- /* @__PURE__ */ jsx14(Text14, { color: "cyan", children: "> " }),
4413
- /* @__PURE__ */ jsx14(
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__ */ jsx14(Text14, { color: "red", children: parseError }) : null,
4423
- /* @__PURE__ */ jsx14(Text14, { dimColor: true, children: "Tip: #label @user due <date> Enter:parse Esc:cancel" })
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 Box15, Text as Text15 } from "ink";
4444
- import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
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__ */ jsxs15(Box15, { children: [
4447
- /* @__PURE__ */ jsx15(Text15, { color: "yellow", children: "/" }),
4448
- /* @__PURE__ */ jsx15(
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 Box16, Text as Text16, useInput as useInput11 } from "ink";
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 jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
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__ */ jsxs16(Box16, { flexDirection: "column", children: [
4545
- /* @__PURE__ */ jsxs16(Text16, { color: "yellow", bold: true, children: [
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__ */ jsx16(Text16, { dimColor: true, children: "This will close the issue on GitHub." }),
4551
- /* @__PURE__ */ jsx16(Text16, { children: "Continue? [y/n]" })
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__ */ jsxs16(Box16, { flexDirection: "column", children: [
4555
- /* @__PURE__ */ jsx16(Text16, { color: "cyan", bold: true, children: "Move to status:" }),
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__ */ jsxs16(
4563
- Text16,
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__ */ jsx16(Text16, { dimColor: true, children: "j/k:navigate Enter:select Esc:cancel" })
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 jsx17, jsxs as jsxs17 } from "react/jsx-runtime";
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__ */ jsxs17(Fragment2, { children: [
4629
- helpVisible ? /* @__PURE__ */ jsx17(HelpOverlay, { currentMode: mode, onClose: onToggleHelp }) : null,
4630
- mode === "overlay:status" && selectedRepoStatusOptions.length > 0 ? /* @__PURE__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(
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__ */ jsx17(SearchBar, { defaultValue: searchQuery, onChange: onSearchChange, onSubmit: onSearchSubmit }) : null,
4688
- mode === "overlay:comment" && selectedIssue ? /* @__PURE__ */ jsx17(
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__ */ jsx17(FuzzyPicker, { repos, onSelect: onFuzzySelect, onClose: onFuzzyClose }) : null,
4699
- mode === "overlay:createNl" ? /* @__PURE__ */ jsx17(
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__ */ jsx17(
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 Box17 } from "ink";
4750
- import { jsx as jsx18, jsxs as jsxs18 } from "react/jsx-runtime";
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__ */ jsxs18(Box17, { flexDirection: "column", children: [
4772
- /* @__PURE__ */ jsxs18(Box17, { height: issuesPanelHeight, children: [
4773
- /* @__PURE__ */ jsxs18(Box17, { flexDirection: "column", width: LEFT_COL_WIDTH, children: [
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__ */ jsx18(Box17, { flexGrow: 1, flexDirection: "column", children: issuesPanel }),
4778
- /* @__PURE__ */ jsx18(Box17, { width: detailWidth, flexDirection: "column", children: detailPanel })
4780
+ /* @__PURE__ */ jsx19(Box18, { flexGrow: 1, flexDirection: "column", children: issuesPanel }),
4781
+ /* @__PURE__ */ jsx19(Box18, { width: detailWidth, flexDirection: "column", children: detailPanel })
4779
4782
  ] }),
4780
- /* @__PURE__ */ jsx18(Box17, { height: ACTIVITY_HEIGHT, children: activityPanel })
4783
+ /* @__PURE__ */ jsx19(Box18, { height: ACTIVITY_HEIGHT, children: activityPanel })
4781
4784
  ] });
4782
4785
  }
4783
4786
  if (mode === "medium") {
4784
- return /* @__PURE__ */ jsxs18(Box17, { flexDirection: "column", children: [
4785
- /* @__PURE__ */ jsxs18(Box17, { height: issuesPanelHeight, children: [
4786
- /* @__PURE__ */ jsxs18(Box17, { flexDirection: "column", width: LEFT_COL_WIDTH, children: [
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__ */ jsx18(Box17, { flexGrow: 1, flexDirection: "column", children: issuesPanel })
4793
+ /* @__PURE__ */ jsx19(Box18, { flexGrow: 1, flexDirection: "column", children: issuesPanel })
4791
4794
  ] }),
4792
- /* @__PURE__ */ jsx18(Box17, { height: ACTIVITY_HEIGHT, children: activityPanel })
4795
+ /* @__PURE__ */ jsx19(Box18, { height: ACTIVITY_HEIGHT, children: activityPanel })
4793
4796
  ] });
4794
4797
  }
4795
- return /* @__PURE__ */ jsxs18(Box17, { flexDirection: "column", children: [
4798
+ return /* @__PURE__ */ jsxs19(Box18, { flexDirection: "column", children: [
4796
4799
  reposPanel,
4797
4800
  statusesPanel,
4798
- /* @__PURE__ */ jsx18(Box17, { flexGrow: 1, flexDirection: "column", children: issuesPanel }),
4799
- /* @__PURE__ */ jsx18(Box17, { height: ACTIVITY_HEIGHT, children: activityPanel })
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 = 3;
4812
+ ACTIVITY_HEIGHT = 5;
4810
4813
  }
4811
4814
  });
4812
4815
 
4813
4816
  // src/board/components/repos-panel.tsx
4814
- import { Box as Box18, Text as Text17 } from "ink";
4815
- import { jsx as jsx19, jsxs as jsxs19 } from "react/jsx-runtime";
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 borderColor = isActive ? "cyan" : "gray";
4821
- return /* @__PURE__ */ jsxs19(Box18, { borderStyle: "single", borderColor, flexDirection: "column", flexGrow: 1, children: [
4822
- /* @__PURE__ */ jsx19(Text17, { bold: true, color: isActive ? "cyan" : "white", children: "[1] Repos" }),
4823
- repos.length === 0 ? /* @__PURE__ */ jsx19(Text17, { color: "gray", children: " \u2014" }) : repos.map((repo, i) => {
4824
- const isSel = i === selectedIdx;
4825
- const label = shortName(repo.name);
4826
- return /* @__PURE__ */ jsxs19(Box18, { children: [
4827
- /* @__PURE__ */ jsxs19(Text17, { color: isSel ? "cyan" : isActive ? "white" : "gray", bold: isSel, children: [
4828
- isSel ? "\u25B6 " : " ",
4829
- label
4830
- ] }),
4831
- /* @__PURE__ */ jsxs19(Text17, { color: "gray", children: [
4832
- " ",
4833
- repo.openCount
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 Box19, Text as Text18 } from "ink";
4847
- import { Fragment as Fragment3, jsx as jsx20, jsxs as jsxs20 } from "react/jsx-runtime";
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__ */ jsxs20(Box19, { children: [
4889
- isSelected ? /* @__PURE__ */ jsx20(Text18, { color: "cyan", bold: true, children: "\u25B6 " }) : /* @__PURE__ */ jsx20(Text18, { children: " " }),
4890
- /* @__PURE__ */ jsxs20(Text18, { color: "cyan", children: [
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__ */ jsx20(Text18, { children: " " }),
4895
- isSelected ? /* @__PURE__ */ jsx20(Text18, { color: "white", bold: true, children: titleStr }) : /* @__PURE__ */ jsx20(Text18, { children: titleStr }),
4896
- /* @__PURE__ */ jsx20(Text18, { children: " " }),
4897
- /* @__PURE__ */ jsx20(Box19, { width: LABEL_COL_WIDTH, children: labels.map((l, i) => /* @__PURE__ */ jsxs20(Text18, { children: [
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__ */ jsxs20(Text18, { color: labelColor(l.name), children: [
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__ */ jsx20(Text18, { children: " " }),
4906
- /* @__PURE__ */ jsx20(Text18, { color: assigneeColor, children: assigneeText.padEnd(14) }),
4907
- /* @__PURE__ */ jsx20(Text18, { children: " " }),
4908
- /* @__PURE__ */ jsx20(Text18, { color: "gray", children: timeAgo2(issue.updatedAt).padStart(4) }),
4909
- target.text ? /* @__PURE__ */ jsxs20(Fragment3, { children: [
4910
- /* @__PURE__ */ jsx20(Text18, { children: " " }),
4911
- /* @__PURE__ */ jsx20(Text18, { color: target.color, children: target.text })
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 Box20, Text as Text19 } from "ink";
4936
- import { jsx as jsx21, jsxs as jsxs21 } from "react/jsx-runtime";
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__ */ jsxs21(Box20, { children: [
4943
- /* @__PURE__ */ jsxs21(Text19, { color: isSel ? "cyan" : "white", bold: true, children: [
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__ */ jsxs21(Text19, { color: "gray", children: [
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__ */ jsxs21(Box20, { children: [
4963
- /* @__PURE__ */ jsxs21(Text19, { color: isSel ? "cyan" : "gray", children: [
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__ */ jsxs21(Text19, { color: "gray", children: [
4970
+ /* @__PURE__ */ jsxs22(Text20, { color: "gray", children: [
4970
4971
  " (",
4971
4972
  row.count,
4972
4973
  ")"
4973
4974
  ] })
4974
4975
  ] });
4975
4976
  }
4976
- return /* @__PURE__ */ jsxs21(Box20, { children: [
4977
- /* @__PURE__ */ jsxs21(Text19, { bold: true, color: "white", children: [
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__ */ jsxs21(Text19, { color: "gray", children: [
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__ */ jsxs21(Box20, { children: [
4991
- checkbox2 ? /* @__PURE__ */ jsx21(Text19, { color: isMultiSelected ? "cyan" : "gray", children: checkbox2 }) : null,
4992
- /* @__PURE__ */ jsx21(IssueRow, { issue: row.issue, selfLogin, isSelected: selectedId === row.navId })
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__ */ jsxs21(Text19, { dimColor: true, children: [
4998
+ return /* @__PURE__ */ jsxs22(Text20, { dimColor: true, children: [
4998
4999
  " ",
4999
5000
  ago,
5000
5001
  ": ",
5001
- /* @__PURE__ */ jsxs21(Text19, { color: "gray", children: [
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__ */ jsxs21(Text19, { dimColor: true, children: [
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__ */ jsxs21(Text19, { color: "red", children: [
5017
+ return /* @__PURE__ */ jsxs22(Text20, { color: "red", children: [
5017
5018
  " Error: ",
5018
5019
  row.text
5019
5020
  ] });
5020
5021
  case "gap":
5021
- return /* @__PURE__ */ jsx21(Text19, { children: "" });
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 Box21, Text as Text20 } from "ink";
5033
- import { jsx as jsx22, jsxs as jsxs22 } from "react/jsx-runtime";
5034
- function StatusesPanel({ groups, selectedIdx, isActive }) {
5035
- const borderColor = isActive ? "cyan" : "gray";
5036
- return /* @__PURE__ */ jsxs22(Box21, { borderStyle: "single", borderColor, flexDirection: "column", flexGrow: 1, children: [
5037
- /* @__PURE__ */ jsx22(Text20, { bold: true, color: isActive ? "cyan" : "white", children: "[2] Statuses" }),
5038
- groups.length === 0 ? /* @__PURE__ */ jsx22(Text20, { color: "gray", children: " \u2014" }) : groups.map((group, i) => {
5039
- const isSel = i === selectedIdx;
5040
- return /* @__PURE__ */ jsxs22(Box21, { children: [
5041
- /* @__PURE__ */ jsxs22(Text20, { color: isSel ? "cyan" : isActive ? "white" : "gray", bold: isSel, children: [
5042
- isSel ? "\u25B6 " : " ",
5043
- group.label
5044
- ] }),
5045
- /* @__PURE__ */ jsxs22(Text20, { color: "gray", children: [
5046
- " ",
5047
- group.count
5048
- ] })
5049
- ] }, group.id);
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 Box22, Text as Text21 } from "ink";
5062
- import { Fragment as Fragment4, jsx as jsx23, jsxs as jsxs23 } from "react/jsx-runtime";
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__ */ jsx23(Box22, { flexDirection: "column", children: toasts.map((t) => /* @__PURE__ */ jsx23(Box22, { children: t.type === "loading" ? /* @__PURE__ */ jsxs23(Fragment4, { children: [
5066
- /* @__PURE__ */ jsx23(Spinner3, { label: "" }),
5067
- /* @__PURE__ */ jsxs23(Text21, { color: "cyan", children: [
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__ */ jsxs23(Text21, { color: TYPE_COLORS[t.type], children: [
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__ */ jsx23(Text21, { color: "gray", children: t.retry ? " [r]etry [d]ismiss" : " [d]ismiss" }) : null
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 Box23, Text as Text22, useApp, useStdout } from "ink";
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 jsx24, jsxs as jsxs24 } from "react/jsx-runtime";
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__ */ jsxs24(Text22, { color: refreshAgeColor(lastRefresh), children: [
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__ */ jsx24(Box23, { flexDirection: "column", padding: 1, children: /* @__PURE__ */ jsx24(Spinner4, { label: "Loading dashboard..." }) });
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__ */ jsx24(
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__ */ jsx24(
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 issuesBorderColor = panelFocus.activePanelId === 3 ? "cyan" : "gray";
5768
- const issuesPanel = /* @__PURE__ */ jsxs24(
5769
- Box23,
5782
+ const issuesPanelTitle = `[3] Issues${selectedSection ? ` \u2014 ${selectedSection.repo.shortName}` : ""}${selectedStatusGroup ? ` / ${selectedStatusGroup.label}` : ""}`;
5783
+ const issuesPanel = /* @__PURE__ */ jsxs25(
5784
+ Panel,
5770
5785
  {
5771
- borderStyle: "single",
5772
- borderColor: issuesBorderColor,
5773
- flexDirection: "column",
5786
+ title: issuesPanelTitle,
5787
+ isActive: panelFocus.activePanelId === 3,
5788
+ width: issuesPanelWidth,
5774
5789
  flexGrow: 1,
5775
- overflow: "hidden",
5776
5790
  children: [
5777
- /* @__PURE__ */ jsxs24(Text22, { bold: true, color: panelFocus.activePanelId === 3 ? "cyan" : "white", children: [
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__ */ jsx24(
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__ */ jsxs24(Text22, { color: "gray", dimColor: true, children: [
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__ */ jsx24(
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__ */ jsx24(
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__ */ jsxs24(Box23, { flexDirection: "column", paddingX: 1, children: [
5830
- /* @__PURE__ */ jsxs24(Box23, { children: [
5831
- /* @__PURE__ */ jsx24(Text22, { color: "cyan", bold: true, children: "HOG BOARD" }),
5832
- activeProfile ? /* @__PURE__ */ jsxs24(Text22, { color: "yellow", children: [
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__ */ jsxs24(Text22, { color: "gray", children: [
5847
+ /* @__PURE__ */ jsxs25(Text23, { color: "gray", children: [
5838
5848
  " ",
5839
5849
  "\u2014",
5840
5850
  " ",
5841
5851
  dateStr
5842
5852
  ] }),
5843
- /* @__PURE__ */ jsx24(Text22, { children: " " }),
5844
- isRefreshing ? /* @__PURE__ */ jsxs24(Fragment5, { children: [
5845
- /* @__PURE__ */ jsx24(Spinner4, { label: "" }),
5846
- /* @__PURE__ */ jsx24(Text22, { color: "cyan", children: " Refreshing..." })
5847
- ] }) : /* @__PURE__ */ jsxs24(Fragment5, { children: [
5848
- /* @__PURE__ */ jsx24(RefreshAge, { lastRefresh }),
5849
- consecutiveFailures > 0 ? /* @__PURE__ */ jsx24(Text22, { color: "red", children: " (!)" }) : null
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__ */ jsx24(Text22, { color: "yellow", children: " Auto-refresh paused \u2014 press r to retry" }) : null
5861
+ autoRefreshPaused ? /* @__PURE__ */ jsx25(Text23, { color: "yellow", children: " Auto-refresh paused \u2014 press r to retry" }) : null
5852
5862
  ] }),
5853
- error ? /* @__PURE__ */ jsxs24(Text22, { color: "red", children: [
5863
+ error ? /* @__PURE__ */ jsxs25(Text23, { color: "red", children: [
5854
5864
  "Error: ",
5855
5865
  error
5856
5866
  ] }) : null,
5857
- /* @__PURE__ */ jsx24(
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__ */ jsx24(
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__ */ jsx24(ToastContainer, { toasts }),
5912
- logVisible ? /* @__PURE__ */ jsx24(ActionLog, { entries: logEntries }) : null,
5913
- /* @__PURE__ */ jsx24(
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 jsx25 } from "react/jsx-runtime";
5979
+ import { jsx as jsx26 } from "react/jsx-runtime";
5969
5980
  async function runLiveDashboard(config2, options, activeProfile) {
5970
5981
  const instance = render(
5971
- /* @__PURE__ */ jsx25(Dashboard, { config: config2, options, activeProfile: activeProfile ?? null })
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.11.0").option("--json", "Force JSON output").option("--human", "Force human-readable output").hook("preAction", (thisCommand) => {
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");