clairo 1.2.0 → 1.2.1

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.
Files changed (3) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +286 -216
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -8,7 +8,7 @@ dashboard tui for github PRs, jira tickets, and daily logs.
8
8
  - claude code integration (requires claude code to be set up) for generating standup notes
9
9
  - link jira tickets and change ticket status from the terminal
10
10
  - auto jira ticket detection based on branch name
11
- - daily logs that update automatically with tui actions that can be used for generateStandupNotes
11
+ - daily logs that update automatically with tui actions that can be used to generate standup notes
12
12
 
13
13
  ## requirements
14
14
 
package/dist/cli.js CHANGED
@@ -5,12 +5,12 @@ import meow from "meow";
5
5
 
6
6
  // src/app.tsx
7
7
  import { useCallback as useCallback9, useMemo as useMemo2, useState as useState16 } from "react";
8
- import { Box as Box16, useApp, useInput as useInput13 } from "ink";
8
+ import { Box as Box17, useApp, useInput as useInput13 } from "ink";
9
9
 
10
10
  // src/components/github/GitHubView.tsx
11
11
  import { useCallback as useCallback8, useEffect as useEffect8, useRef as useRef5, useState as useState11 } from "react";
12
12
  import { TitledBox as TitledBox3 } from "@mishieck/ink-titled-box";
13
- import { Box as Box5, Text as Text5, useInput as useInput4 } from "ink";
13
+ import { Box as Box6, Text as Text5, useInput as useInput4 } from "ink";
14
14
  import { ScrollView as ScrollView4 } from "ink-scroll-view";
15
15
 
16
16
  // src/hooks/github/useGitRepo.ts
@@ -174,6 +174,22 @@ function findRemoteWithBranch(branch) {
174
174
  import { exec, execFile } from "child_process";
175
175
  import { promisify } from "util";
176
176
  var execAsync = promisify(exec);
177
+ function timeAgo(dateStr) {
178
+ const seconds = Math.floor((Date.now() - new Date(dateStr).getTime()) / 1e3);
179
+ const intervals = [
180
+ [86400 * 365, "year"],
181
+ [86400 * 30, "month"],
182
+ [86400 * 7, "week"],
183
+ [86400, "day"],
184
+ [3600, "hour"],
185
+ [60, "minute"]
186
+ ];
187
+ for (const [secs, label] of intervals) {
188
+ const count = Math.floor(seconds / secs);
189
+ if (count >= 1) return `${count} ${label}${count > 1 ? "s" : ""} ago`;
190
+ }
191
+ return "just now";
192
+ }
177
193
  function resolveCheckStatus(check) {
178
194
  const conclusion = check.conclusion ?? check.state;
179
195
  if (conclusion === "SUCCESS" || check.status === "COMPLETED") return "success";
@@ -201,6 +217,7 @@ function resolveMergeDisplay(pr) {
201
217
  if (!pr) return { text: "UNKNOWN", color: "yellow" };
202
218
  if (pr.state === "MERGED") return { text: "MERGED", color: "magenta" };
203
219
  if (pr.state === "CLOSED") return { text: "CLOSED", color: "red" };
220
+ if (pr.isDraft) return { text: "DRAFT", color: "yellow" };
204
221
  if (pr.mergeable === "MERGEABLE") return { text: "MERGEABLE", color: "green" };
205
222
  if (pr.mergeable === "CONFLICTING") return { text: "CONFLICTING", color: "red" };
206
223
  return { text: pr.mergeable ?? "UNKNOWN", color: "yellow" };
@@ -287,6 +304,11 @@ async function getPRDetails(prNumber, repo) {
287
304
  "updatedAt",
288
305
  "isDraft",
289
306
  "mergeable",
307
+ "baseRefName",
308
+ "headRefName",
309
+ "additions",
310
+ "deletions",
311
+ "labels",
290
312
  "reviewDecision",
291
313
  "commits",
292
314
  "assignees",
@@ -1100,24 +1122,43 @@ ${oldStatus} \u2192 ${newStatus}
1100
1122
  // src/components/github/PRDetailsBox.tsx
1101
1123
  import open from "open";
1102
1124
  import { useRef as useRef2 } from "react";
1103
- import { Box as Box2, Text as Text2, useInput, useStdout } from "ink";
1125
+ import { Box as Box3, Text as Text2, useInput, useStdout } from "ink";
1104
1126
  import { ScrollView } from "ink-scroll-view";
1105
1127
 
1128
+ // src/components/ui/Divider.tsx
1129
+ import { Box } from "ink";
1130
+ import { jsx } from "react/jsx-runtime";
1131
+ function Divider({ color }) {
1132
+ return /* @__PURE__ */ jsx(
1133
+ Box,
1134
+ {
1135
+ flexGrow: 1,
1136
+ height: 0,
1137
+ borderStyle: "round",
1138
+ borderBottom: false,
1139
+ borderLeft: false,
1140
+ borderRight: false,
1141
+ borderColor: color,
1142
+ borderDimColor: !color
1143
+ }
1144
+ );
1145
+ }
1146
+
1106
1147
  // src/components/ui/Markdown.tsx
1107
1148
  import Table from "cli-table3";
1108
1149
  import { marked } from "marked";
1109
- import { Box, Text } from "ink";
1150
+ import { Box as Box2, Text } from "ink";
1110
1151
  import Link from "ink-link";
1111
- import { jsx, jsxs } from "react/jsx-runtime";
1152
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
1112
1153
  function Markdown({ children }) {
1113
1154
  const tokens = marked.lexer(children);
1114
- return /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: tokens.map((token, idx) => /* @__PURE__ */ jsx(TokenRenderer, { token }, idx)) });
1155
+ return /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", children: tokens.map((token, idx) => /* @__PURE__ */ jsx2(TokenRenderer, { token }, idx)) });
1115
1156
  }
1116
1157
  function TokenRenderer({ token }) {
1117
1158
  var _a, _b;
1118
1159
  switch (token.type) {
1119
1160
  case "heading":
1120
- return /* @__PURE__ */ jsx(Box, { marginTop: token.depth === 1 ? 0 : 1, children: /* @__PURE__ */ jsx(Text, { bold: true, underline: token.depth === 1, children: renderInline(token.tokens) }) });
1161
+ return /* @__PURE__ */ jsx2(Box2, { marginTop: token.depth === 1 ? 0 : 1, children: /* @__PURE__ */ jsx2(Text, { bold: true, underline: token.depth === 1, children: renderInline(token.tokens) }) });
1121
1162
  case "paragraph": {
1122
1163
  const hasLinks = (_a = token.tokens) == null ? void 0 : _a.some(
1123
1164
  (t) => {
@@ -1126,31 +1167,31 @@ function TokenRenderer({ token }) {
1126
1167
  }
1127
1168
  );
1128
1169
  if (hasLinks) {
1129
- return /* @__PURE__ */ jsx(Box, { flexDirection: "row", flexWrap: "wrap", children: renderInline(token.tokens) });
1170
+ return /* @__PURE__ */ jsx2(Box2, { flexDirection: "row", flexWrap: "wrap", children: renderInline(token.tokens) });
1130
1171
  }
1131
- return /* @__PURE__ */ jsx(Text, { children: renderInline(token.tokens) });
1172
+ return /* @__PURE__ */ jsx2(Text, { children: renderInline(token.tokens) });
1132
1173
  }
1133
1174
  case "code":
1134
- return /* @__PURE__ */ jsx(Box, { marginY: 1, paddingX: 1, borderStyle: "single", borderColor: "gray", children: /* @__PURE__ */ jsx(Text, { dimColor: true, children: token.text }) });
1175
+ return /* @__PURE__ */ jsx2(Box2, { marginY: 1, paddingX: 1, borderStyle: "single", borderColor: "gray", children: /* @__PURE__ */ jsx2(Text, { dimColor: true, children: token.text }) });
1135
1176
  case "blockquote":
1136
- return /* @__PURE__ */ jsxs(Box, { marginLeft: 2, children: [
1137
- /* @__PURE__ */ jsx(Text, { color: "gray", children: "\u2502 " }),
1138
- /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: (_b = token.tokens) == null ? void 0 : _b.map((t, idx) => /* @__PURE__ */ jsx(TokenRenderer, { token: t }, idx)) })
1177
+ return /* @__PURE__ */ jsxs(Box2, { marginLeft: 2, children: [
1178
+ /* @__PURE__ */ jsx2(Text, { color: "gray", children: "\u2502 " }),
1179
+ /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", children: (_b = token.tokens) == null ? void 0 : _b.map((t, idx) => /* @__PURE__ */ jsx2(TokenRenderer, { token: t }, idx)) })
1139
1180
  ] });
1140
1181
  case "list":
1141
- return /* @__PURE__ */ jsx(Box, { flexDirection: "column", marginY: 1, children: token.items.map((item, idx) => /* @__PURE__ */ jsxs(Box, { children: [
1142
- /* @__PURE__ */ jsx(Text, { children: token.ordered ? `${idx + 1}. ` : "\u2022 " }),
1143
- /* @__PURE__ */ jsx(Box, { flexDirection: "column", children: item.tokens.map((t, i) => /* @__PURE__ */ jsx(TokenRenderer, { token: t }, i)) })
1182
+ return /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", marginY: 1, children: token.items.map((item, idx) => /* @__PURE__ */ jsxs(Box2, { children: [
1183
+ /* @__PURE__ */ jsx2(Text, { children: token.ordered ? `${idx + 1}. ` : "\u2022 " }),
1184
+ /* @__PURE__ */ jsx2(Box2, { flexDirection: "column", children: item.tokens.map((t, i) => /* @__PURE__ */ jsx2(TokenRenderer, { token: t }, i)) })
1144
1185
  ] }, idx)) });
1145
1186
  case "table":
1146
- return /* @__PURE__ */ jsx(TableRenderer, { token });
1187
+ return /* @__PURE__ */ jsx2(TableRenderer, { token });
1147
1188
  case "hr":
1148
- return /* @__PURE__ */ jsx(Text, { dimColor: true, children: "\u2500".repeat(40) });
1189
+ return /* @__PURE__ */ jsx2(Text, { dimColor: true, children: "\u2500".repeat(40) });
1149
1190
  case "space":
1150
1191
  return null;
1151
1192
  default:
1152
1193
  if ("text" in token && typeof token.text === "string") {
1153
- return /* @__PURE__ */ jsx(Text, { children: token.text });
1194
+ return /* @__PURE__ */ jsx2(Text, { children: token.text });
1154
1195
  }
1155
1196
  return null;
1156
1197
  }
@@ -1163,18 +1204,18 @@ function TableRenderer({ token }) {
1163
1204
  for (const row of token.rows) {
1164
1205
  table.push(row.map((cell) => renderInlineToString(cell.tokens)));
1165
1206
  }
1166
- return /* @__PURE__ */ jsx(Text, { children: table.toString() });
1207
+ return /* @__PURE__ */ jsx2(Text, { children: table.toString() });
1167
1208
  }
1168
1209
  function renderInline(tokens) {
1169
1210
  if (!tokens) return null;
1170
1211
  return tokens.map((token, idx) => {
1171
1212
  switch (token.type) {
1172
1213
  case "text":
1173
- return /* @__PURE__ */ jsx(Text, { children: token.text }, idx);
1214
+ return /* @__PURE__ */ jsx2(Text, { children: token.text }, idx);
1174
1215
  case "strong":
1175
- return /* @__PURE__ */ jsx(Text, { bold: true, children: renderInline(token.tokens) }, idx);
1216
+ return /* @__PURE__ */ jsx2(Text, { bold: true, children: renderInline(token.tokens) }, idx);
1176
1217
  case "em":
1177
- return /* @__PURE__ */ jsx(Text, { italic: true, children: renderInline(token.tokens) }, idx);
1218
+ return /* @__PURE__ */ jsx2(Text, { italic: true, children: renderInline(token.tokens) }, idx);
1178
1219
  case "codespan":
1179
1220
  return /* @__PURE__ */ jsxs(Text, { color: "yellow", children: [
1180
1221
  "`",
@@ -1182,7 +1223,7 @@ function renderInline(tokens) {
1182
1223
  "`"
1183
1224
  ] }, idx);
1184
1225
  case "link":
1185
- return /* @__PURE__ */ jsx(Link, { url: token.href, children: /* @__PURE__ */ jsx(Text, { color: "blue", children: renderInlineToString(token.tokens) }) }, idx);
1226
+ return /* @__PURE__ */ jsx2(Link, { url: token.href, children: /* @__PURE__ */ jsx2(Text, { color: "blue", children: renderInlineToString(token.tokens) }) }, idx);
1186
1227
  case "image":
1187
1228
  return /* @__PURE__ */ jsxs(Text, { color: "blue", children: [
1188
1229
  "[Image: ",
@@ -1190,12 +1231,12 @@ function renderInline(tokens) {
1190
1231
  "]"
1191
1232
  ] }, idx);
1192
1233
  case "br":
1193
- return /* @__PURE__ */ jsx(Text, { children: "\n" }, idx);
1234
+ return /* @__PURE__ */ jsx2(Text, { children: "\n" }, idx);
1194
1235
  case "del":
1195
- return /* @__PURE__ */ jsx(Text, { strikethrough: true, children: renderInline(token.tokens) }, idx);
1236
+ return /* @__PURE__ */ jsx2(Text, { strikethrough: true, children: renderInline(token.tokens) }, idx);
1196
1237
  default:
1197
1238
  if ("text" in token && typeof token.text === "string") {
1198
- return /* @__PURE__ */ jsx(Text, { children: token.text }, idx);
1239
+ return /* @__PURE__ */ jsx2(Text, { children: token.text }, idx);
1199
1240
  }
1200
1241
  return null;
1201
1242
  }
@@ -1215,9 +1256,9 @@ function renderInlineToString(tokens) {
1215
1256
  }
1216
1257
 
1217
1258
  // src/components/github/PRDetailsBox.tsx
1218
- import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
1259
+ import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
1219
1260
  function PRDetailsBox({ pr, loading, error, isActive }) {
1220
- var _a, _b, _c, _d, _e, _f, _g;
1261
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
1221
1262
  const scrollRef = useRef2(null);
1222
1263
  const title = "[3] PR Details";
1223
1264
  const borderColor = isActive ? "yellow" : void 0;
@@ -1243,13 +1284,13 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1243
1284
  const { stdout } = useStdout();
1244
1285
  const terminalWidth = (stdout == null ? void 0 : stdout.columns) ?? 80;
1245
1286
  const columnWidth = Math.floor(terminalWidth / 2);
1246
- const titlePart = `\u256D\u2500 ${displayTitle} `;
1287
+ const titlePart = `\u256D ${displayTitle} `;
1247
1288
  const dashCount = Math.max(0, columnWidth - titlePart.length - 1);
1248
1289
  const topBorder = `${titlePart}${"\u2500".repeat(dashCount)}\u256E`;
1249
- return /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", flexGrow: 1, children: [
1250
- /* @__PURE__ */ jsx2(Text2, { color: borderColor, children: topBorder }),
1251
- /* @__PURE__ */ jsx2(
1252
- Box2,
1290
+ return /* @__PURE__ */ jsxs2(Box3, { flexDirection: "column", flexGrow: 1, children: [
1291
+ /* @__PURE__ */ jsx3(Text2, { color: borderColor, children: topBorder }),
1292
+ /* @__PURE__ */ jsx3(
1293
+ Box3,
1253
1294
  {
1254
1295
  flexDirection: "column",
1255
1296
  flexGrow: 1,
@@ -1258,33 +1299,57 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1258
1299
  borderStyle: "round",
1259
1300
  borderTop: false,
1260
1301
  borderColor,
1261
- children: /* @__PURE__ */ jsx2(ScrollView, { ref: scrollRef, children: /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", paddingX: 1, children: [
1262
- loading && /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Loading details..." }),
1263
- error && /* @__PURE__ */ jsx2(Text2, { color: "red", children: error }),
1264
- !loading && !error && !pr && /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Select a PR to view details" }),
1302
+ children: /* @__PURE__ */ jsx3(ScrollView, { ref: scrollRef, children: /* @__PURE__ */ jsxs2(Box3, { flexDirection: "column", paddingX: 1, children: [
1303
+ loading && /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Loading details..." }),
1304
+ error && /* @__PURE__ */ jsx3(Text2, { color: "red", children: error }),
1305
+ !loading && !error && !pr && /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Select a PR to view details" }),
1265
1306
  !loading && !error && pr && /* @__PURE__ */ jsxs2(Fragment, { children: [
1266
- /* @__PURE__ */ jsx2(Text2, { bold: true, children: pr.title }),
1267
- /* @__PURE__ */ jsxs2(Text2, { dimColor: true, children: [
1268
- "by ",
1269
- ((_a = pr.author) == null ? void 0 : _a.login) ?? "unknown",
1270
- " | ",
1271
- ((_b = pr.commits) == null ? void 0 : _b.length) ?? 0,
1272
- " commits"
1307
+ /* @__PURE__ */ jsxs2(Box3, { children: [
1308
+ /* @__PURE__ */ jsxs2(Text2, { bold: true, children: [
1309
+ pr.title,
1310
+ " "
1311
+ ] }),
1312
+ /* @__PURE__ */ jsx3(Text2, { color: mergeDisplay.color, children: "\uE0B6" }),
1313
+ /* @__PURE__ */ jsx3(Text2, { color: "black", backgroundColor: mergeDisplay.color, bold: true, children: `${mergeDisplay.text}` }),
1314
+ /* @__PURE__ */ jsx3(Text2, { color: mergeDisplay.color, children: "\uE0B4" })
1273
1315
  ] }),
1274
- /* @__PURE__ */ jsxs2(Box2, { marginTop: 1, children: [
1275
- /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Review: " }),
1276
- /* @__PURE__ */ jsx2(Text2, { color: reviewDisplay.color, children: reviewDisplay.text }),
1277
- /* @__PURE__ */ jsx2(Text2, { children: " | " }),
1278
- /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Status: " }),
1279
- /* @__PURE__ */ jsx2(Text2, { color: mergeDisplay.color, children: mergeDisplay.text })
1316
+ /* @__PURE__ */ jsxs2(Box3, { children: [
1317
+ /* @__PURE__ */ jsxs2(Text2, { dimColor: true, children: [
1318
+ pr.baseRefName,
1319
+ " \u2190 ",
1320
+ pr.headRefName,
1321
+ " | by ",
1322
+ ((_a = pr.author) == null ? void 0 : _a.login) ?? "unknown",
1323
+ " | ",
1324
+ ((_b = pr.commits) == null ? void 0 : _b.length) ?? 0,
1325
+ " ",
1326
+ "commits",
1327
+ pr.createdAt && ` | opened ${timeAgo(pr.createdAt)}`,
1328
+ " |",
1329
+ " "
1330
+ ] }),
1331
+ /* @__PURE__ */ jsxs2(Text2, { color: "green", children: [
1332
+ "+",
1333
+ pr.additions
1334
+ ] }),
1335
+ /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: " " }),
1336
+ /* @__PURE__ */ jsxs2(Text2, { color: "red", children: [
1337
+ "-",
1338
+ pr.deletions
1339
+ ] })
1280
1340
  ] }),
1281
- (((_c = pr.assignees) == null ? void 0 : _c.length) ?? 0) > 0 && /* @__PURE__ */ jsxs2(Box2, { marginTop: 1, children: [
1282
- /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Assignees: " }),
1283
- /* @__PURE__ */ jsx2(Text2, { children: pr.assignees.map((a) => a.login).join(", ") })
1341
+ (((_c = pr.labels) == null ? void 0 : _c.length) ?? 0) > 0 && /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: pr.labels.map((l) => l.name).join(", ") }),
1342
+ /* @__PURE__ */ jsx3(Box3, { marginTop: 1, children: /* @__PURE__ */ jsx3(Divider, {}) }),
1343
+ (((_d = pr.assignees) == null ? void 0 : _d.length) ?? 0) > 0 && /* @__PURE__ */ jsxs2(Box3, { marginTop: 1, children: [
1344
+ /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Assignees: " }),
1345
+ /* @__PURE__ */ jsx3(Text2, { children: pr.assignees.map((a) => a.login).join(", ") })
1284
1346
  ] }),
1285
- (((_d = pr.reviews) == null ? void 0 : _d.length) ?? 0) > 0 && /* @__PURE__ */ jsxs2(Box2, { flexDirection: "column", children: [
1286
- /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Reviews:" }),
1287
- pr.reviews.map((review, idx) => {
1347
+ ((((_e = pr.reviews) == null ? void 0 : _e.length) ?? 0) > 0 || (((_f = pr.reviewRequests) == null ? void 0 : _f.length) ?? 0) > 0) && /* @__PURE__ */ jsxs2(Box3, { marginTop: 1, flexDirection: "column", children: [
1348
+ /* @__PURE__ */ jsxs2(Box3, { children: [
1349
+ /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Reviews: " }),
1350
+ /* @__PURE__ */ jsx3(Text2, { color: reviewDisplay.color, children: reviewDisplay.text })
1351
+ ] }),
1352
+ (_g = pr.reviews) == null ? void 0 : _g.map((review, idx) => {
1288
1353
  const color = review.state === "APPROVED" ? "green" : review.state === "CHANGES_REQUESTED" ? "red" : review.state === "COMMENTED" ? "blue" : "yellow";
1289
1354
  const icon = review.state === "APPROVED" ? "\u2713" : review.state === "CHANGES_REQUESTED" ? "\u2717" : review.state === "COMMENTED" ? "\u{1F4AC}" : "\u25CB";
1290
1355
  return /* @__PURE__ */ jsxs2(Text2, { color, children: [
@@ -1293,16 +1358,20 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1293
1358
  " ",
1294
1359
  review.author.login
1295
1360
  ] }, idx);
1296
- })
1297
- ] }),
1298
- (((_e = pr.reviewRequests) == null ? void 0 : _e.length) ?? 0) > 0 && /* @__PURE__ */ jsxs2(Box2, { children: [
1299
- /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Pending: " }),
1300
- /* @__PURE__ */ jsx2(Text2, { color: "yellow", children: pr.reviewRequests.map((r) => r.login ?? r.name ?? r.slug ?? "Team").join(", ") })
1361
+ }),
1362
+ (_h = pr.reviewRequests) == null ? void 0 : _h.map((r, idx) => /* @__PURE__ */ jsxs2(Text2, { color: "yellow", children: [
1363
+ " ",
1364
+ "\u25CB ",
1365
+ r.login ?? r.name ?? r.slug ?? "Team",
1366
+ " ",
1367
+ /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "(pending)" })
1368
+ ] }, `pending-${idx}`))
1301
1369
  ] }),
1302
- (((_f = pr.statusCheckRollup) == null ? void 0 : _f.length) ?? 0) > 0 && /* @__PURE__ */ jsxs2(Box2, { marginTop: 1, flexDirection: "column", children: [
1303
- /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Checks:" }),
1370
+ (((_i = pr.statusCheckRollup) == null ? void 0 : _i.length) ?? 0) > 0 && /* @__PURE__ */ jsxs2(Box3, { marginTop: 1, flexDirection: "column", children: [
1371
+ /* @__PURE__ */ jsx3(Divider, {}),
1372
+ /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Checks:" }),
1304
1373
  Array.from(
1305
- ((_g = pr.statusCheckRollup) == null ? void 0 : _g.reduce((acc, check) => {
1374
+ ((_j = pr.statusCheckRollup) == null ? void 0 : _j.reduce((acc, check) => {
1306
1375
  const key = check.name ?? check.context ?? "";
1307
1376
  const existing = acc.get(key);
1308
1377
  if (!existing || (check.startedAt ?? "") > (existing.startedAt ?? "")) {
@@ -1322,9 +1391,10 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1322
1391
  ] }, idx);
1323
1392
  })
1324
1393
  ] }),
1325
- pr.body && /* @__PURE__ */ jsxs2(Box2, { marginTop: 1, flexDirection: "column", children: [
1326
- /* @__PURE__ */ jsx2(Text2, { dimColor: true, children: "Description:" }),
1327
- /* @__PURE__ */ jsx2(Markdown, { children: pr.body })
1394
+ pr.body && /* @__PURE__ */ jsxs2(Box3, { marginTop: 1, flexDirection: "column", children: [
1395
+ /* @__PURE__ */ jsx3(Divider, {}),
1396
+ /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Description:" }),
1397
+ /* @__PURE__ */ jsx3(Markdown, { children: pr.body })
1328
1398
  ] })
1329
1399
  ] })
1330
1400
  ] }) })
@@ -1337,7 +1407,7 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
1337
1407
  import open2 from "open";
1338
1408
  import { useState as useState10 } from "react";
1339
1409
  import { TitledBox } from "@mishieck/ink-titled-box";
1340
- import { Box as Box3, Text as Text3, useInput as useInput3 } from "ink";
1410
+ import { Box as Box4, Text as Text3, useInput as useInput3 } from "ink";
1341
1411
  import { ScrollView as ScrollView2 } from "ink-scroll-view";
1342
1412
 
1343
1413
  // src/hooks/jira/useJiraTickets.ts
@@ -1765,7 +1835,7 @@ async function copyToClipboard(text) {
1765
1835
  }
1766
1836
 
1767
1837
  // src/components/github/PullRequestsBox.tsx
1768
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
1838
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
1769
1839
  function PullRequestsBox({
1770
1840
  prs,
1771
1841
  selectedPR,
@@ -1815,25 +1885,25 @@ function PullRequestsBox({
1815
1885
  const subtitle = branch ? ` (${branch})` : "";
1816
1886
  const copiedIndicator = copied ? " [Copied!]" : "";
1817
1887
  const borderColor = isActive ? "yellow" : void 0;
1818
- return /* @__PURE__ */ jsx3(
1888
+ return /* @__PURE__ */ jsx4(
1819
1889
  TitledBox,
1820
1890
  {
1821
1891
  borderStyle: "round",
1822
1892
  titles: [`${title}${subtitle}${copiedIndicator}`],
1823
1893
  borderColor,
1824
1894
  height: 5,
1825
- children: /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
1826
- loading && /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "Loading PRs..." }),
1827
- error && /* @__PURE__ */ jsx3(Text3, { color: "red", children: error }),
1828
- isGeneratingPR && /* @__PURE__ */ jsx3(Text3, { color: "yellow", children: "Generating PR with Claude... (Esc to cancel)" }),
1895
+ children: /* @__PURE__ */ jsxs3(Box4, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
1896
+ loading && /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Loading PRs..." }),
1897
+ error && /* @__PURE__ */ jsx4(Text3, { color: "red", children: error }),
1898
+ isGeneratingPR && /* @__PURE__ */ jsx4(Text3, { color: "yellow", children: "Generating PR with Claude... (Esc to cancel)" }),
1829
1899
  !loading && !error && /* @__PURE__ */ jsxs3(ScrollView2, { ref: scrollRef, children: [
1830
- prs.length === 0 && /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: "No PRs for this branch" }, "empty"),
1900
+ prs.length === 0 && /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "No PRs for this branch" }, "empty"),
1831
1901
  prs.map((pr, idx) => {
1832
1902
  const isHighlighted = isActive && idx === highlightedIndex;
1833
1903
  const isSelected = pr.number === (selectedPR == null ? void 0 : selectedPR.number);
1834
1904
  const cursor = isHighlighted ? ">" : " ";
1835
1905
  const indicator = isSelected ? " *" : "";
1836
- return /* @__PURE__ */ jsxs3(Box3, { children: [
1906
+ return /* @__PURE__ */ jsxs3(Box4, { children: [
1837
1907
  /* @__PURE__ */ jsxs3(Text3, { color: isHighlighted ? "yellow" : void 0, children: [
1838
1908
  cursor,
1839
1909
  " "
@@ -1845,7 +1915,7 @@ function PullRequestsBox({
1845
1915
  pr.isDraft ? "[Draft] " : "",
1846
1916
  pr.title
1847
1917
  ] }),
1848
- /* @__PURE__ */ jsx3(Text3, { dimColor: true, children: indicator })
1918
+ /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: indicator })
1849
1919
  ] }, pr.number);
1850
1920
  }),
1851
1921
  /* @__PURE__ */ jsxs3(Text3, { color: "blue", children: [
@@ -1860,9 +1930,9 @@ function PullRequestsBox({
1860
1930
 
1861
1931
  // src/components/github/RemotesBox.tsx
1862
1932
  import { TitledBox as TitledBox2 } from "@mishieck/ink-titled-box";
1863
- import { Box as Box4, Text as Text4 } from "ink";
1933
+ import { Box as Box5, Text as Text4 } from "ink";
1864
1934
  import { ScrollView as ScrollView3 } from "ink-scroll-view";
1865
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1935
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
1866
1936
  function RemotesBox({ remotes, selectedRemote, onSelect, loading, error, isActive }) {
1867
1937
  const selectedIndex = remotes.findIndex((r) => r.name === selectedRemote);
1868
1938
  const { highlightedIndex, scrollRef } = useListNavigation({
@@ -1873,16 +1943,16 @@ function RemotesBox({ remotes, selectedRemote, onSelect, loading, error, isActiv
1873
1943
  });
1874
1944
  const title = "[1] Remotes";
1875
1945
  const borderColor = isActive ? "yellow" : void 0;
1876
- return /* @__PURE__ */ jsx4(TitledBox2, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs4(Box4, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
1877
- loading && /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "Loading..." }),
1878
- error && /* @__PURE__ */ jsx4(Text4, { color: "red", children: error }),
1879
- !loading && !error && remotes.length === 0 && /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: "No remotes configured" }),
1880
- !loading && !error && remotes.length > 0 && /* @__PURE__ */ jsx4(ScrollView3, { ref: scrollRef, children: remotes.map((remote, idx) => {
1946
+ return /* @__PURE__ */ jsx5(TitledBox2, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs4(Box5, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
1947
+ loading && /* @__PURE__ */ jsx5(Text4, { dimColor: true, children: "Loading..." }),
1948
+ error && /* @__PURE__ */ jsx5(Text4, { color: "red", children: error }),
1949
+ !loading && !error && remotes.length === 0 && /* @__PURE__ */ jsx5(Text4, { dimColor: true, children: "No remotes configured" }),
1950
+ !loading && !error && remotes.length > 0 && /* @__PURE__ */ jsx5(ScrollView3, { ref: scrollRef, children: remotes.map((remote, idx) => {
1881
1951
  const isHighlighted = isActive && idx === highlightedIndex;
1882
1952
  const isSelected = remote.name === selectedRemote;
1883
1953
  const cursor = isHighlighted ? ">" : " ";
1884
1954
  const indicator = isSelected ? " *" : "";
1885
- return /* @__PURE__ */ jsxs4(Box4, { children: [
1955
+ return /* @__PURE__ */ jsxs4(Box5, { children: [
1886
1956
  /* @__PURE__ */ jsxs4(Text4, { color: isHighlighted ? "yellow" : void 0, children: [
1887
1957
  cursor,
1888
1958
  " "
@@ -1893,14 +1963,14 @@ function RemotesBox({ remotes, selectedRemote, onSelect, loading, error, isActiv
1893
1963
  remote.url,
1894
1964
  ")"
1895
1965
  ] }),
1896
- /* @__PURE__ */ jsx4(Text4, { dimColor: true, children: indicator })
1966
+ /* @__PURE__ */ jsx5(Text4, { dimColor: true, children: indicator })
1897
1967
  ] }, remote.name);
1898
1968
  }) })
1899
1969
  ] }) });
1900
1970
  }
1901
1971
 
1902
1972
  // src/components/github/GitHubView.tsx
1903
- import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
1973
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1904
1974
  function GitHubView({ isActive, onFocusedBoxChange, onLogUpdated }) {
1905
1975
  const repo = useGitRepo();
1906
1976
  const pullRequests = usePullRequests();
@@ -2116,10 +2186,10 @@ ${body}`;
2116
2186
  { isActive }
2117
2187
  );
2118
2188
  if (repo.isRepo === false) {
2119
- return /* @__PURE__ */ jsx5(TitledBox3, { borderStyle: "round", titles: ["Error"], flexGrow: 1, children: /* @__PURE__ */ jsx5(Text5, { color: "red", children: "Current directory is not a git repository" }) });
2189
+ return /* @__PURE__ */ jsx6(TitledBox3, { borderStyle: "round", titles: ["Error"], flexGrow: 1, children: /* @__PURE__ */ jsx6(Text5, { color: "red", children: "Current directory is not a git repository" }) });
2120
2190
  }
2121
- return /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", flexGrow: 1, children: [
2122
- /* @__PURE__ */ jsx5(
2191
+ return /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", flexGrow: 1, children: [
2192
+ /* @__PURE__ */ jsx6(
2123
2193
  RemotesBox,
2124
2194
  {
2125
2195
  remotes: repo.remotes,
@@ -2130,7 +2200,7 @@ ${body}`;
2130
2200
  isActive: isActive && !prPreview && focusedBox === "remotes"
2131
2201
  }
2132
2202
  ),
2133
- /* @__PURE__ */ jsx5(
2203
+ /* @__PURE__ */ jsx6(
2134
2204
  PullRequestsBox,
2135
2205
  {
2136
2206
  prs: pullRequests.prs,
@@ -2145,7 +2215,7 @@ ${body}`;
2145
2215
  isGeneratingPR
2146
2216
  }
2147
2217
  ),
2148
- /* @__PURE__ */ jsx5(
2218
+ /* @__PURE__ */ jsx6(
2149
2219
  PRDetailsBox,
2150
2220
  {
2151
2221
  pr: pullRequests.prDetails,
@@ -2154,13 +2224,13 @@ ${body}`;
2154
2224
  isActive: isActive && !prPreview && focusedBox === "details"
2155
2225
  }
2156
2226
  ),
2157
- prPreview && /* @__PURE__ */ jsx5(TitledBox3, { borderStyle: "round", titles: ["PR Preview"], borderColor: "yellow", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", paddingX: 1, flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
2158
- /* @__PURE__ */ jsx5(Box5, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: /* @__PURE__ */ jsx5(ScrollView4, { ref: previewScrollRef, children: /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", children: [
2159
- /* @__PURE__ */ jsx5(Text5, { bold: true, children: prPreview.title }),
2160
- /* @__PURE__ */ jsx5(Text5, { children: "" }),
2161
- /* @__PURE__ */ jsx5(Text5, { children: prPreview.body })
2227
+ prPreview && /* @__PURE__ */ jsx6(TitledBox3, { borderStyle: "round", titles: ["PR Preview"], borderColor: "yellow", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", paddingX: 1, flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
2228
+ /* @__PURE__ */ jsx6(Box6, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: /* @__PURE__ */ jsx6(ScrollView4, { ref: previewScrollRef, children: /* @__PURE__ */ jsxs5(Box6, { flexDirection: "column", children: [
2229
+ /* @__PURE__ */ jsx6(Text5, { bold: true, children: prPreview.title }),
2230
+ /* @__PURE__ */ jsx6(Text5, { children: "" }),
2231
+ /* @__PURE__ */ jsx6(Text5, { children: prPreview.body })
2162
2232
  ] }) }) }),
2163
- /* @__PURE__ */ jsx5(Text5, { dimColor: true, children: "Enter to apply, Esc to dismiss, j/k to scroll" })
2233
+ /* @__PURE__ */ jsx6(Text5, { dimColor: true, children: "Enter to apply, Esc to dismiss, j/k to scroll" })
2164
2234
  ] }) })
2165
2235
  ] });
2166
2236
  }
@@ -2171,11 +2241,11 @@ import { useEffect as useEffect10, useRef as useRef6 } from "react";
2171
2241
 
2172
2242
  // src/components/jira/LinkTicketModal.tsx
2173
2243
  import { useState as useState12 } from "react";
2174
- import { Box as Box7, Text as Text7, useInput as useInput6 } from "ink";
2244
+ import { Box as Box8, Text as Text7, useInput as useInput6 } from "ink";
2175
2245
 
2176
2246
  // src/components/ui/TextInput.tsx
2177
- import { Box as Box6, Text as Text6, useInput as useInput5 } from "ink";
2178
- import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
2247
+ import { Box as Box7, Text as Text6, useInput as useInput5 } from "ink";
2248
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
2179
2249
  function TextInput({ value, onChange, placeholder, isActive, mask }) {
2180
2250
  useInput5(
2181
2251
  (input, key) => {
@@ -2196,14 +2266,14 @@ function TextInput({ value, onChange, placeholder, isActive, mask }) {
2196
2266
  );
2197
2267
  const displayValue = mask ? "*".repeat(value.length) : value;
2198
2268
  const showPlaceholder = value.length === 0 && placeholder;
2199
- return /* @__PURE__ */ jsx6(Box6, { children: /* @__PURE__ */ jsxs6(Text6, { children: [
2200
- showPlaceholder ? /* @__PURE__ */ jsx6(Text6, { dimColor: true, children: placeholder }) : /* @__PURE__ */ jsx6(Text6, { children: displayValue }),
2201
- isActive && /* @__PURE__ */ jsx6(Text6, { backgroundColor: "yellow", children: " " })
2269
+ return /* @__PURE__ */ jsx7(Box7, { children: /* @__PURE__ */ jsxs6(Text6, { children: [
2270
+ showPlaceholder ? /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: placeholder }) : /* @__PURE__ */ jsx7(Text6, { children: displayValue }),
2271
+ isActive && /* @__PURE__ */ jsx7(Text6, { backgroundColor: "yellow", children: " " })
2202
2272
  ] }) });
2203
2273
  }
2204
2274
 
2205
2275
  // src/components/jira/LinkTicketModal.tsx
2206
- import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
2276
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
2207
2277
  function LinkTicketModal({ onSubmit, onCancel, loading, error }) {
2208
2278
  const [ticketInput, setTicketInput] = useState12("");
2209
2279
  const canSubmit = ticketInput.trim().length > 0;
@@ -2220,29 +2290,29 @@ function LinkTicketModal({ onSubmit, onCancel, loading, error }) {
2220
2290
  },
2221
2291
  { isActive: !loading }
2222
2292
  );
2223
- return /* @__PURE__ */ jsxs7(Box7, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
2224
- /* @__PURE__ */ jsx7(Text7, { bold: true, color: "yellow", children: "Link Jira Ticket" }),
2225
- /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "Type ticket ID, Enter to submit, Esc to cancel" }),
2226
- /* @__PURE__ */ jsx7(Box7, { marginTop: 1 }),
2227
- error && /* @__PURE__ */ jsx7(Box7, { marginBottom: 1, children: /* @__PURE__ */ jsx7(Text7, { color: "red", children: error }) }),
2228
- /* @__PURE__ */ jsxs7(Box7, { children: [
2229
- /* @__PURE__ */ jsx7(Text7, { color: "blue", children: "Ticket: " }),
2230
- /* @__PURE__ */ jsx7(TextInput, { value: ticketInput, onChange: setTicketInput, placeholder: "PROJ-123", isActive: !loading })
2293
+ return /* @__PURE__ */ jsxs7(Box8, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
2294
+ /* @__PURE__ */ jsx8(Text7, { bold: true, color: "yellow", children: "Link Jira Ticket" }),
2295
+ /* @__PURE__ */ jsx8(Text7, { dimColor: true, children: "Type ticket ID, Enter to submit, Esc to cancel" }),
2296
+ /* @__PURE__ */ jsx8(Box8, { marginTop: 1 }),
2297
+ error && /* @__PURE__ */ jsx8(Box8, { marginBottom: 1, children: /* @__PURE__ */ jsx8(Text7, { color: "red", children: error }) }),
2298
+ /* @__PURE__ */ jsxs7(Box8, { children: [
2299
+ /* @__PURE__ */ jsx8(Text7, { color: "blue", children: "Ticket: " }),
2300
+ /* @__PURE__ */ jsx8(TextInput, { value: ticketInput, onChange: setTicketInput, placeholder: "PROJ-123", isActive: !loading })
2231
2301
  ] }),
2232
- loading && /* @__PURE__ */ jsx7(Box7, { marginTop: 1, children: /* @__PURE__ */ jsx7(Text7, { color: "yellow", children: "Fetching ticket..." }) }),
2233
- /* @__PURE__ */ jsx7(Box7, { marginTop: 1, children: /* @__PURE__ */ jsx7(Text7, { dimColor: true, children: "Examples: PROJ-123 or https://company.atlassian.net/browse/PROJ-123" }) })
2302
+ loading && /* @__PURE__ */ jsx8(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx8(Text7, { color: "yellow", children: "Fetching ticket..." }) }),
2303
+ /* @__PURE__ */ jsx8(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx8(Text7, { dimColor: true, children: "Examples: PROJ-123 or https://company.atlassian.net/browse/PROJ-123" }) })
2234
2304
  ] });
2235
2305
  }
2236
2306
 
2237
2307
  // src/components/jira/JiraView.tsx
2238
2308
  import { TitledBox as TitledBox4 } from "@mishieck/ink-titled-box";
2239
- import { Box as Box11, Text as Text11, useInput as useInput9 } from "ink";
2309
+ import { Box as Box12, Text as Text11, useInput as useInput9 } from "ink";
2240
2310
 
2241
2311
  // src/components/jira/ChangeStatusModal.tsx
2242
2312
  import { useEffect as useEffect9, useState as useState13 } from "react";
2243
- import { Box as Box8, Text as Text8, useInput as useInput7 } from "ink";
2313
+ import { Box as Box9, Text as Text8, useInput as useInput7 } from "ink";
2244
2314
  import SelectInput from "ink-select-input";
2245
- import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
2315
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
2246
2316
  function ChangeStatusModal({ repoPath, ticketKey, currentStatus, onComplete, onCancel }) {
2247
2317
  const [transitions, setTransitions] = useState13([]);
2248
2318
  const [loading, setLoading] = useState13(true);
@@ -2310,23 +2380,23 @@ function ChangeStatusModal({ repoPath, ticketKey, currentStatus, onComplete, onC
2310
2380
  0,
2311
2381
  transitions.findIndex((t) => t.to.name === currentStatus)
2312
2382
  );
2313
- return /* @__PURE__ */ jsxs8(Box8, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
2383
+ return /* @__PURE__ */ jsxs8(Box9, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
2314
2384
  /* @__PURE__ */ jsxs8(Text8, { bold: true, color: "yellow", children: [
2315
2385
  "Change Status: ",
2316
2386
  ticketKey
2317
2387
  ] }),
2318
- loading && /* @__PURE__ */ jsx8(Text8, { dimColor: true, children: "Loading transitions..." }),
2319
- error && /* @__PURE__ */ jsx8(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx8(Text8, { color: "red", children: error }) }),
2320
- !loading && !error && transitions.length === 0 && /* @__PURE__ */ jsx8(Text8, { dimColor: true, children: "No available transitions" }),
2321
- !loading && !error && transitions.length > 0 && !applying && /* @__PURE__ */ jsx8(Box8, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx8(SelectInput, { items, initialIndex, onSelect: handleSelect }) }),
2322
- applying && /* @__PURE__ */ jsx8(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx8(Text8, { color: "yellow", children: "Updating status..." }) }),
2323
- /* @__PURE__ */ jsx8(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx8(Text8, { dimColor: true, children: "Esc to cancel" }) })
2388
+ loading && /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: "Loading transitions..." }),
2389
+ error && /* @__PURE__ */ jsx9(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx9(Text8, { color: "red", children: error }) }),
2390
+ !loading && !error && transitions.length === 0 && /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: "No available transitions" }),
2391
+ !loading && !error && transitions.length > 0 && !applying && /* @__PURE__ */ jsx9(Box9, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx9(SelectInput, { items, initialIndex, onSelect: handleSelect }) }),
2392
+ applying && /* @__PURE__ */ jsx9(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx9(Text8, { color: "yellow", children: "Updating status..." }) }),
2393
+ /* @__PURE__ */ jsx9(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: "Esc to cancel" }) })
2324
2394
  ] });
2325
2395
  }
2326
2396
 
2327
2397
  // src/components/jira/ConfigureJiraSiteModal.tsx
2328
2398
  import { useState as useState14 } from "react";
2329
- import { Box as Box9, Text as Text9, useInput as useInput8 } from "ink";
2399
+ import { Box as Box10, Text as Text9, useInput as useInput8 } from "ink";
2330
2400
  import { ScrollView as ScrollView5 } from "ink-scroll-view";
2331
2401
 
2332
2402
  // src/lib/editor.ts
@@ -2358,7 +2428,7 @@ function openInEditor(content, filename) {
2358
2428
  }
2359
2429
 
2360
2430
  // src/components/jira/ConfigureJiraSiteModal.tsx
2361
- import { jsx as jsx9, jsxs as jsxs9 } from "react/jsx-runtime";
2431
+ import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
2362
2432
  var MAX_VISIBLE_ITEMS = 4;
2363
2433
  function ConfigureJiraSiteModal({
2364
2434
  initialSiteUrl,
@@ -2452,26 +2522,26 @@ function ConfigureJiraSiteModal({
2452
2522
  const prefix = isSelected ? "> " : " ";
2453
2523
  const color = isSelected ? "yellow" : void 0;
2454
2524
  const displayValue = isSensitive && value ? "*".repeat(Math.min(value.length, 20)) : value;
2455
- return /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", children: [
2525
+ return /* @__PURE__ */ jsxs9(Box10, { flexDirection: "column", children: [
2456
2526
  /* @__PURE__ */ jsxs9(Text9, { color, bold: isSelected, children: [
2457
2527
  prefix,
2458
2528
  label
2459
2529
  ] }),
2460
- value !== void 0 && /* @__PURE__ */ jsx9(Box9, { marginLeft: 4, children: /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: displayValue || "(empty - press Enter to edit)" }) })
2530
+ value !== void 0 && /* @__PURE__ */ jsx10(Box10, { marginLeft: 4, children: /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: displayValue || "(empty - press Enter to edit)" }) })
2461
2531
  ] });
2462
2532
  };
2463
2533
  if (mode === "choose") {
2464
2534
  const totalItems = existingConfigs.length + 1;
2465
2535
  const listHeight = Math.min(totalItems * 2, MAX_VISIBLE_ITEMS * 2);
2466
- return /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, paddingY: 1, children: [
2467
- /* @__PURE__ */ jsx9(Text9, { bold: true, color: "cyan", children: "Configure Jira Site" }),
2468
- /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: "Select an existing configuration or enter new credentials" }),
2469
- /* @__PURE__ */ jsx9(Box9, { marginTop: 1 }),
2470
- error && /* @__PURE__ */ jsx9(Box9, { marginBottom: 1, children: /* @__PURE__ */ jsx9(Text9, { color: "red", children: error }) }),
2471
- /* @__PURE__ */ jsx9(Box9, { height: listHeight, overflow: "hidden", children: /* @__PURE__ */ jsxs9(ScrollView5, { ref: scrollRef, children: [
2536
+ return /* @__PURE__ */ jsxs9(Box10, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, paddingY: 1, children: [
2537
+ /* @__PURE__ */ jsx10(Text9, { bold: true, color: "cyan", children: "Configure Jira Site" }),
2538
+ /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: "Select an existing configuration or enter new credentials" }),
2539
+ /* @__PURE__ */ jsx10(Box10, { marginTop: 1 }),
2540
+ error && /* @__PURE__ */ jsx10(Box10, { marginBottom: 1, children: /* @__PURE__ */ jsx10(Text9, { color: "red", children: error }) }),
2541
+ /* @__PURE__ */ jsx10(Box10, { height: listHeight, overflow: "hidden", children: /* @__PURE__ */ jsxs9(ScrollView5, { ref: scrollRef, children: [
2472
2542
  existingConfigs.map((config, idx) => {
2473
2543
  const isSelected = selectedExisting === idx;
2474
- return /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", children: [
2544
+ return /* @__PURE__ */ jsxs9(Box10, { flexDirection: "column", children: [
2475
2545
  /* @__PURE__ */ jsxs9(Text9, { color: isSelected ? "yellow" : void 0, bold: isSelected, children: [
2476
2546
  isSelected ? "> " : " ",
2477
2547
  config.siteUrl
@@ -2482,7 +2552,7 @@ function ConfigureJiraSiteModal({
2482
2552
  ] })
2483
2553
  ] }, config.siteUrl + config.email);
2484
2554
  }),
2485
- /* @__PURE__ */ jsx9(Box9, { children: /* @__PURE__ */ jsxs9(
2555
+ /* @__PURE__ */ jsx10(Box10, { children: /* @__PURE__ */ jsxs9(
2486
2556
  Text9,
2487
2557
  {
2488
2558
  color: selectedExisting === existingConfigs.length ? "yellow" : void 0,
@@ -2494,41 +2564,41 @@ function ConfigureJiraSiteModal({
2494
2564
  }
2495
2565
  ) })
2496
2566
  ] }) }),
2497
- loading && /* @__PURE__ */ jsx9(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx9(Text9, { color: "yellow", children: "Validating credentials..." }) })
2567
+ loading && /* @__PURE__ */ jsx10(Box10, { marginTop: 1, children: /* @__PURE__ */ jsx10(Text9, { color: "yellow", children: "Validating credentials..." }) })
2498
2568
  ] });
2499
2569
  }
2500
- return /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, paddingY: 1, children: [
2501
- /* @__PURE__ */ jsx9(Text9, { bold: true, color: "cyan", children: "Configure Jira Site" }),
2570
+ return /* @__PURE__ */ jsxs9(Box10, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, paddingY: 1, children: [
2571
+ /* @__PURE__ */ jsx10(Text9, { bold: true, color: "cyan", children: "Configure Jira Site" }),
2502
2572
  /* @__PURE__ */ jsxs9(Text9, { dimColor: true, children: [
2503
2573
  "Up/Down to select, Enter to edit, Esc to ",
2504
2574
  hasExisting ? "go back" : "cancel"
2505
2575
  ] }),
2506
- /* @__PURE__ */ jsx9(Box9, { marginTop: 1 }),
2507
- error && /* @__PURE__ */ jsx9(Box9, { marginBottom: 1, children: /* @__PURE__ */ jsx9(Text9, { color: "red", children: error }) }),
2576
+ /* @__PURE__ */ jsx10(Box10, { marginTop: 1 }),
2577
+ error && /* @__PURE__ */ jsx10(Box10, { marginBottom: 1, children: /* @__PURE__ */ jsx10(Text9, { color: "red", children: error }) }),
2508
2578
  renderItem("siteUrl", "Site URL (e.g., https://company.atlassian.net)", siteUrl),
2509
- /* @__PURE__ */ jsx9(Box9, { marginTop: 1 }),
2579
+ /* @__PURE__ */ jsx10(Box10, { marginTop: 1 }),
2510
2580
  renderItem("email", "Email", email),
2511
- /* @__PURE__ */ jsx9(Box9, { marginTop: 1 }),
2581
+ /* @__PURE__ */ jsx10(Box10, { marginTop: 1 }),
2512
2582
  renderItem("apiToken", "API Token", apiToken, true),
2513
- /* @__PURE__ */ jsx9(Box9, { marginTop: 1 }),
2514
- /* @__PURE__ */ jsx9(Box9, { children: /* @__PURE__ */ jsxs9(Text9, { color: selectedItem === "submit" ? "green" : void 0, bold: selectedItem === "submit", children: [
2583
+ /* @__PURE__ */ jsx10(Box10, { marginTop: 1 }),
2584
+ /* @__PURE__ */ jsx10(Box10, { children: /* @__PURE__ */ jsxs9(Text9, { color: selectedItem === "submit" ? "green" : void 0, bold: selectedItem === "submit", children: [
2515
2585
  selectedItem === "submit" ? "> " : " ",
2516
2586
  canSubmit ? "[Save Configuration]" : "[Fill all fields first]"
2517
2587
  ] }) }),
2518
- loading && /* @__PURE__ */ jsx9(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx9(Text9, { color: "yellow", children: "Validating credentials..." }) }),
2519
- /* @__PURE__ */ jsx9(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx9(Text9, { dimColor: true, children: "Get your API token from: https://id.atlassian.com/manage-profile/security/api-tokens" }) })
2588
+ loading && /* @__PURE__ */ jsx10(Box10, { marginTop: 1, children: /* @__PURE__ */ jsx10(Text9, { color: "yellow", children: "Validating credentials..." }) }),
2589
+ /* @__PURE__ */ jsx10(Box10, { marginTop: 1, children: /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: "Get your API token from: https://id.atlassian.com/manage-profile/security/api-tokens" }) })
2520
2590
  ] });
2521
2591
  }
2522
2592
 
2523
2593
  // src/components/jira/TicketItem.tsx
2524
- import { Box as Box10, Text as Text10 } from "ink";
2525
- import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
2594
+ import { Box as Box11, Text as Text10 } from "ink";
2595
+ import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
2526
2596
  function TicketItem({ ticketKey, summary, status, isHighlighted, isSelected }) {
2527
2597
  const prefix = isHighlighted ? "> " : isSelected ? "\u25CF " : " ";
2528
2598
  const textColor = isSelected ? "green" : void 0;
2529
- return /* @__PURE__ */ jsx10(Box10, { children: /* @__PURE__ */ jsxs10(Text10, { color: textColor, children: [
2599
+ return /* @__PURE__ */ jsx11(Box11, { children: /* @__PURE__ */ jsxs10(Text10, { color: textColor, children: [
2530
2600
  prefix,
2531
- /* @__PURE__ */ jsx10(Text10, { bold: true, color: "blue", children: ticketKey }),
2601
+ /* @__PURE__ */ jsx11(Text10, { bold: true, color: "blue", children: ticketKey }),
2532
2602
  " ",
2533
2603
  summary,
2534
2604
  status && /* @__PURE__ */ jsxs10(Text10, { dimColor: true, children: [
@@ -2540,7 +2610,7 @@ function TicketItem({ ticketKey, summary, status, isHighlighted, isSelected }) {
2540
2610
  }
2541
2611
 
2542
2612
  // src/components/jira/JiraView.tsx
2543
- import { jsx as jsx11, jsxs as jsxs11 } from "react/jsx-runtime";
2613
+ import { jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
2544
2614
  function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated }) {
2545
2615
  const repo = useGitRepo();
2546
2616
  const jira = useJiraTickets();
@@ -2638,13 +2708,13 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
2638
2708
  { isActive: isActive && !modal.isOpen }
2639
2709
  );
2640
2710
  if (repo.isRepo === false) {
2641
- return /* @__PURE__ */ jsx11(TitledBox4, { borderStyle: "round", titles: ["Jira"], flexShrink: 0, children: /* @__PURE__ */ jsx11(Text11, { color: "red", children: "Not a git repository" }) });
2711
+ return /* @__PURE__ */ jsx12(TitledBox4, { borderStyle: "round", titles: ["Jira"], flexShrink: 0, children: /* @__PURE__ */ jsx12(Text11, { color: "red", children: "Not a git repository" }) });
2642
2712
  }
2643
2713
  if (modal.type === "configure") {
2644
2714
  const siteUrl = repo.repoPath ? getJiraSiteUrl(repo.repoPath) : void 0;
2645
2715
  const creds = repo.repoPath ? getJiraCredentials(repo.repoPath) : { email: null, apiToken: null };
2646
2716
  const existingConfigs = getExistingJiraConfigs(repo.repoPath ?? void 0);
2647
- return /* @__PURE__ */ jsx11(Box11, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx11(
2717
+ return /* @__PURE__ */ jsx12(Box12, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx12(
2648
2718
  ConfigureJiraSiteModal,
2649
2719
  {
2650
2720
  initialSiteUrl: siteUrl ?? void 0,
@@ -2661,7 +2731,7 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
2661
2731
  ) });
2662
2732
  }
2663
2733
  if (modal.type === "link") {
2664
- return /* @__PURE__ */ jsx11(Box11, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx11(
2734
+ return /* @__PURE__ */ jsx12(Box12, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx12(
2665
2735
  LinkTicketModal,
2666
2736
  {
2667
2737
  onSubmit: handleLinkSubmit,
@@ -2675,7 +2745,7 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
2675
2745
  ) });
2676
2746
  }
2677
2747
  if (modal.type === "status" && repo.repoPath && repo.currentBranch && currentTicket) {
2678
- return /* @__PURE__ */ jsx11(Box11, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx11(
2748
+ return /* @__PURE__ */ jsx12(Box12, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx12(
2679
2749
  ChangeStatusModal,
2680
2750
  {
2681
2751
  repoPath: repo.repoPath,
@@ -2688,10 +2758,10 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
2688
2758
  }
2689
2759
  const title = "[4] Jira";
2690
2760
  const borderColor = isActive ? "yellow" : void 0;
2691
- return /* @__PURE__ */ jsx11(TitledBox4, { borderStyle: "round", titles: [title], borderColor, flexShrink: 0, children: /* @__PURE__ */ jsxs11(Box11, { flexDirection: "column", paddingX: 1, children: [
2692
- jira.jiraState === "not_configured" && /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "No Jira site configured" }),
2693
- jira.jiraState === "no_tickets" && /* @__PURE__ */ jsx11(Text11, { dimColor: true, children: "No tickets linked to this branch" }),
2694
- jira.jiraState === "has_tickets" && jira.tickets.map((ticket, idx) => /* @__PURE__ */ jsx11(
2761
+ return /* @__PURE__ */ jsx12(TitledBox4, { borderStyle: "round", titles: [title], borderColor, flexShrink: 0, children: /* @__PURE__ */ jsxs11(Box12, { flexDirection: "column", paddingX: 1, children: [
2762
+ jira.jiraState === "not_configured" && /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: "No Jira site configured" }),
2763
+ jira.jiraState === "no_tickets" && /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: "No tickets linked to this branch" }),
2764
+ jira.jiraState === "has_tickets" && jira.tickets.map((ticket, idx) => /* @__PURE__ */ jsx12(
2695
2765
  TicketItem,
2696
2766
  {
2697
2767
  ticketKey: ticket.key,
@@ -2706,15 +2776,15 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
2706
2776
 
2707
2777
  // src/components/logs/LogsView.tsx
2708
2778
  import { useEffect as useEffect12 } from "react";
2709
- import { Box as Box14, useInput as useInput12 } from "ink";
2779
+ import { Box as Box15, useInput as useInput12 } from "ink";
2710
2780
 
2711
2781
  // src/components/logs/LogViewerBox.tsx
2712
2782
  import { useEffect as useEffect11, useRef as useRef7, useState as useState15 } from "react";
2713
2783
  import { TitledBox as TitledBox5 } from "@mishieck/ink-titled-box";
2714
- import { Box as Box12, Text as Text12, useInput as useInput10 } from "ink";
2784
+ import { Box as Box13, Text as Text12, useInput as useInput10 } from "ink";
2715
2785
  import { ScrollView as ScrollView6 } from "ink-scroll-view";
2716
2786
  import TextInput2 from "ink-text-input";
2717
- import { jsx as jsx12, jsxs as jsxs12 } from "react/jsx-runtime";
2787
+ import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
2718
2788
  function LogViewerBox({ date, content, isActive, onRefresh, onLogCreated }) {
2719
2789
  const scrollRef = useRef7(null);
2720
2790
  const [isInputMode, setIsInputMode] = useState15(false);
@@ -2810,14 +2880,14 @@ ${value.trim()}
2810
2880
  setIsInputMode(false);
2811
2881
  onRefresh();
2812
2882
  };
2813
- return /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", flexGrow: 1, children: [
2814
- /* @__PURE__ */ jsx12(TitledBox5, { borderStyle: "round", titles: [displayTitle], borderColor, flexGrow: 1, children: /* @__PURE__ */ jsx12(Box12, { flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx12(ScrollView6, { ref: scrollRef, children: /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", paddingX: 1, children: [
2815
- !date && /* @__PURE__ */ jsx12(Text12, { dimColor: true, children: "Select a log file to view" }),
2816
- date && content === null && /* @__PURE__ */ jsx12(Text12, { dimColor: true, children: "Log file not found" }),
2817
- date && content !== null && content.trim() === "" && /* @__PURE__ */ jsx12(Text12, { dimColor: true, children: "Empty log file" }),
2818
- date && content && content.trim() !== "" && /* @__PURE__ */ jsx12(Markdown, { children: content })
2883
+ return /* @__PURE__ */ jsxs12(Box13, { flexDirection: "column", flexGrow: 1, children: [
2884
+ /* @__PURE__ */ jsx13(TitledBox5, { borderStyle: "round", titles: [displayTitle], borderColor, flexGrow: 1, children: /* @__PURE__ */ jsx13(Box13, { flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx13(ScrollView6, { ref: scrollRef, children: /* @__PURE__ */ jsxs12(Box13, { flexDirection: "column", paddingX: 1, children: [
2885
+ !date && /* @__PURE__ */ jsx13(Text12, { dimColor: true, children: "Select a log file to view" }),
2886
+ date && content === null && /* @__PURE__ */ jsx13(Text12, { dimColor: true, children: "Log file not found" }),
2887
+ date && content !== null && content.trim() === "" && /* @__PURE__ */ jsx13(Text12, { dimColor: true, children: "Empty log file" }),
2888
+ date && content && content.trim() !== "" && /* @__PURE__ */ jsx13(Markdown, { children: content })
2819
2889
  ] }) }) }) }),
2820
- isInputMode && /* @__PURE__ */ jsx12(TitledBox5, { borderStyle: "round", titles: ["Add Entry"], borderColor: "yellow", children: /* @__PURE__ */ jsx12(Box12, { paddingX: 1, children: /* @__PURE__ */ jsx12(
2890
+ isInputMode && /* @__PURE__ */ jsx13(TitledBox5, { borderStyle: "round", titles: ["Add Entry"], borderColor: "yellow", children: /* @__PURE__ */ jsx13(Box13, { paddingX: 1, children: /* @__PURE__ */ jsx13(
2821
2891
  TextInput2,
2822
2892
  {
2823
2893
  value: inputValue,
@@ -2825,19 +2895,19 @@ ${value.trim()}
2825
2895
  onSubmit: handleInputSubmit
2826
2896
  }
2827
2897
  ) }) }),
2828
- isGeneratingStandup && /* @__PURE__ */ jsx12(TitledBox5, { borderStyle: "round", titles: ["Standup Notes"], borderColor: "yellow", children: /* @__PURE__ */ jsxs12(Box12, { paddingX: 1, flexDirection: "column", children: [
2829
- /* @__PURE__ */ jsx12(Text12, { color: "yellow", children: "Generating standup notes..." }),
2830
- /* @__PURE__ */ jsx12(Text12, { dimColor: true, children: "Press Esc to cancel" })
2898
+ isGeneratingStandup && /* @__PURE__ */ jsx13(TitledBox5, { borderStyle: "round", titles: ["Standup Notes"], borderColor: "yellow", children: /* @__PURE__ */ jsxs12(Box13, { paddingX: 1, flexDirection: "column", children: [
2899
+ /* @__PURE__ */ jsx13(Text12, { color: "yellow", children: "Generating standup notes..." }),
2900
+ /* @__PURE__ */ jsx13(Text12, { dimColor: true, children: "Press Esc to cancel" })
2831
2901
  ] }) }),
2832
- standupResult && /* @__PURE__ */ jsx12(
2902
+ standupResult && /* @__PURE__ */ jsx13(
2833
2903
  TitledBox5,
2834
2904
  {
2835
2905
  borderStyle: "round",
2836
2906
  titles: ["Standup Notes"],
2837
2907
  borderColor: standupResult.type === "error" ? "red" : "green",
2838
- children: /* @__PURE__ */ jsxs12(Box12, { paddingX: 1, flexDirection: "column", children: [
2839
- standupResult.type === "error" ? /* @__PURE__ */ jsx12(Text12, { color: "red", children: standupResult.message }) : /* @__PURE__ */ jsx12(Markdown, { children: standupResult.message }),
2840
- /* @__PURE__ */ jsx12(Text12, { dimColor: true, children: "Press Esc to dismiss" })
2908
+ children: /* @__PURE__ */ jsxs12(Box13, { paddingX: 1, flexDirection: "column", children: [
2909
+ standupResult.type === "error" ? /* @__PURE__ */ jsx13(Text12, { color: "red", children: standupResult.message }) : /* @__PURE__ */ jsx13(Markdown, { children: standupResult.message }),
2910
+ /* @__PURE__ */ jsx13(Text12, { dimColor: true, children: "Press Esc to dismiss" })
2841
2911
  ] })
2842
2912
  }
2843
2913
  )
@@ -2846,9 +2916,9 @@ ${value.trim()}
2846
2916
 
2847
2917
  // src/components/logs/LogsHistoryBox.tsx
2848
2918
  import { TitledBox as TitledBox6 } from "@mishieck/ink-titled-box";
2849
- import { Box as Box13, Text as Text13, useInput as useInput11 } from "ink";
2919
+ import { Box as Box14, Text as Text13, useInput as useInput11 } from "ink";
2850
2920
  import { ScrollView as ScrollView7 } from "ink-scroll-view";
2851
- import { jsx as jsx13, jsxs as jsxs13 } from "react/jsx-runtime";
2921
+ import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
2852
2922
  function LogsHistoryBox({
2853
2923
  logFiles,
2854
2924
  selectedDate,
@@ -2878,28 +2948,28 @@ function LogsHistoryBox({
2878
2948
  },
2879
2949
  { isActive }
2880
2950
  );
2881
- return /* @__PURE__ */ jsx13(TitledBox6, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs13(Box13, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
2882
- logFiles.length === 0 && /* @__PURE__ */ jsx13(Text13, { dimColor: true, children: "No logs yet" }),
2883
- logFiles.length > 0 && /* @__PURE__ */ jsx13(ScrollView7, { ref: scrollRef, children: logFiles.map((file, idx) => {
2951
+ return /* @__PURE__ */ jsx14(TitledBox6, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs13(Box14, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
2952
+ logFiles.length === 0 && /* @__PURE__ */ jsx14(Text13, { dimColor: true, children: "No logs yet" }),
2953
+ logFiles.length > 0 && /* @__PURE__ */ jsx14(ScrollView7, { ref: scrollRef, children: logFiles.map((file, idx) => {
2884
2954
  const isHighlighted = idx === highlightedIndex;
2885
2955
  const isSelected = file.date === selectedDate;
2886
2956
  const cursor = isHighlighted ? ">" : " ";
2887
2957
  const indicator = isSelected ? " *" : "";
2888
- return /* @__PURE__ */ jsxs13(Box13, { children: [
2958
+ return /* @__PURE__ */ jsxs13(Box14, { children: [
2889
2959
  /* @__PURE__ */ jsxs13(Text13, { color: isHighlighted ? "yellow" : void 0, children: [
2890
2960
  cursor,
2891
2961
  " "
2892
2962
  ] }),
2893
- /* @__PURE__ */ jsx13(Text13, { color: file.isToday ? "green" : void 0, bold: file.isToday, children: file.date }),
2894
- file.isToday && /* @__PURE__ */ jsx13(Text13, { color: "green", children: " (today)" }),
2895
- /* @__PURE__ */ jsx13(Text13, { dimColor: true, children: indicator })
2963
+ /* @__PURE__ */ jsx14(Text13, { color: file.isToday ? "green" : void 0, bold: file.isToday, children: file.date }),
2964
+ file.isToday && /* @__PURE__ */ jsx14(Text13, { color: "green", children: " (today)" }),
2965
+ /* @__PURE__ */ jsx14(Text13, { dimColor: true, children: indicator })
2896
2966
  ] }, file.date);
2897
2967
  }) })
2898
2968
  ] }) });
2899
2969
  }
2900
2970
 
2901
2971
  // src/components/logs/LogsView.tsx
2902
- import { jsx as jsx14, jsxs as jsxs14 } from "react/jsx-runtime";
2972
+ import { jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
2903
2973
  function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
2904
2974
  const logs = useLogs();
2905
2975
  useEffect12(() => {
@@ -2914,8 +2984,8 @@ function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
2914
2984
  },
2915
2985
  { isActive }
2916
2986
  );
2917
- return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", flexGrow: 1, children: [
2918
- /* @__PURE__ */ jsx14(
2987
+ return /* @__PURE__ */ jsxs14(Box15, { flexDirection: "column", flexGrow: 1, children: [
2988
+ /* @__PURE__ */ jsx15(
2919
2989
  LogsHistoryBox,
2920
2990
  {
2921
2991
  logFiles: logs.logFiles,
@@ -2926,7 +2996,7 @@ function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
2926
2996
  isActive: isActive && focusedBox === "history"
2927
2997
  }
2928
2998
  ),
2929
- /* @__PURE__ */ jsx14(
2999
+ /* @__PURE__ */ jsx15(
2930
3000
  LogViewerBox,
2931
3001
  {
2932
3002
  date: logs.selectedDate,
@@ -2940,8 +3010,8 @@ function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
2940
3010
  }
2941
3011
 
2942
3012
  // src/components/ui/KeybindingsBar.tsx
2943
- import { Box as Box15, Text as Text14 } from "ink";
2944
- import { jsx as jsx15, jsxs as jsxs15 } from "react/jsx-runtime";
3013
+ import { Box as Box16, Text as Text14 } from "ink";
3014
+ import { jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
2945
3015
  var globalBindings = [
2946
3016
  { key: "1-4", label: "Focus" },
2947
3017
  { key: "j/k", label: "Navigate" },
@@ -2951,14 +3021,14 @@ var modalBindings = [{ key: "Esc", label: "Cancel" }];
2951
3021
  var DUCK_ASCII = "<(')___";
2952
3022
  function KeybindingsBar({ contextBindings = [], modalOpen = false, duck }) {
2953
3023
  const allBindings = modalOpen ? [...contextBindings, ...modalBindings] : [...contextBindings, ...globalBindings];
2954
- return /* @__PURE__ */ jsxs15(Box15, { flexShrink: 0, paddingX: 1, gap: 2, children: [
2955
- allBindings.map((binding) => /* @__PURE__ */ jsxs15(Box15, { gap: 1, children: [
2956
- /* @__PURE__ */ jsx15(Text14, { bold: true, color: binding.color ?? "yellow", children: binding.key }),
2957
- /* @__PURE__ */ jsx15(Text14, { dimColor: true, children: binding.label })
3024
+ return /* @__PURE__ */ jsxs15(Box16, { flexShrink: 0, paddingX: 1, gap: 2, children: [
3025
+ allBindings.map((binding) => /* @__PURE__ */ jsxs15(Box16, { gap: 1, children: [
3026
+ /* @__PURE__ */ jsx16(Text14, { bold: true, color: binding.color ?? "yellow", children: binding.key }),
3027
+ /* @__PURE__ */ jsx16(Text14, { dimColor: true, children: binding.label })
2958
3028
  ] }, binding.key)),
2959
- (duck == null ? void 0 : duck.visible) && /* @__PURE__ */ jsxs15(Box15, { flexGrow: 1, justifyContent: "flex-end", gap: 1, children: [
2960
- /* @__PURE__ */ jsx15(Text14, { children: DUCK_ASCII }),
2961
- /* @__PURE__ */ jsx15(Text14, { dimColor: true, children: duck.message })
3029
+ (duck == null ? void 0 : duck.visible) && /* @__PURE__ */ jsxs15(Box16, { flexGrow: 1, justifyContent: "flex-end", gap: 1, children: [
3030
+ /* @__PURE__ */ jsx16(Text14, { children: DUCK_ASCII }),
3031
+ /* @__PURE__ */ jsx16(Text14, { dimColor: true, children: duck.message })
2962
3032
  ] })
2963
3033
  ] });
2964
3034
  }
@@ -3025,7 +3095,7 @@ function computeKeybindings(focusedView, state) {
3025
3095
  }
3026
3096
 
3027
3097
  // src/app.tsx
3028
- import { jsx as jsx16, jsxs as jsxs16 } from "react/jsx-runtime";
3098
+ import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
3029
3099
  function App() {
3030
3100
  const { exit } = useApp();
3031
3101
  const [focusedView, setFocusedView] = useState16("github");
@@ -3074,10 +3144,10 @@ function App() {
3074
3144
  },
3075
3145
  { isActive: !modalOpen }
3076
3146
  );
3077
- return /* @__PURE__ */ jsxs16(Box16, { flexGrow: 1, flexDirection: "column", overflow: "hidden", children: [
3078
- /* @__PURE__ */ jsxs16(Box16, { flexGrow: 1, flexDirection: "row", columnGap: 1, children: [
3079
- /* @__PURE__ */ jsxs16(Box16, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: [
3080
- /* @__PURE__ */ jsx16(
3147
+ return /* @__PURE__ */ jsxs16(Box17, { flexGrow: 1, flexDirection: "column", overflow: "hidden", children: [
3148
+ /* @__PURE__ */ jsxs16(Box17, { flexGrow: 1, flexDirection: "row", columnGap: 1, children: [
3149
+ /* @__PURE__ */ jsxs16(Box17, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: [
3150
+ /* @__PURE__ */ jsx17(
3081
3151
  GitHubView,
3082
3152
  {
3083
3153
  isActive: focusedView === "github",
@@ -3085,7 +3155,7 @@ function App() {
3085
3155
  onLogUpdated: handleLogUpdated
3086
3156
  }
3087
3157
  ),
3088
- /* @__PURE__ */ jsx16(
3158
+ /* @__PURE__ */ jsx17(
3089
3159
  JiraView,
3090
3160
  {
3091
3161
  isActive: focusedView === "jira",
@@ -3095,7 +3165,7 @@ function App() {
3095
3165
  }
3096
3166
  )
3097
3167
  ] }),
3098
- /* @__PURE__ */ jsx16(Box16, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx16(
3168
+ /* @__PURE__ */ jsx17(Box17, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsx17(
3099
3169
  LogsView,
3100
3170
  {
3101
3171
  isActive: focusedView === "logs",
@@ -3105,7 +3175,7 @@ function App() {
3105
3175
  }
3106
3176
  ) })
3107
3177
  ] }),
3108
- /* @__PURE__ */ jsx16(
3178
+ /* @__PURE__ */ jsx17(
3109
3179
  KeybindingsBar,
3110
3180
  {
3111
3181
  contextBindings: keybindings,
@@ -3121,8 +3191,8 @@ import { render as inkRender } from "ink";
3121
3191
 
3122
3192
  // src/lib/Screen.tsx
3123
3193
  import { useCallback as useCallback10, useEffect as useEffect13, useState as useState17 } from "react";
3124
- import { Box as Box17, useStdout as useStdout2 } from "ink";
3125
- import { jsx as jsx17 } from "react/jsx-runtime";
3194
+ import { Box as Box18, useStdout as useStdout2 } from "ink";
3195
+ import { jsx as jsx18 } from "react/jsx-runtime";
3126
3196
  function Screen({ children }) {
3127
3197
  const { stdout } = useStdout2();
3128
3198
  const getSize = useCallback10(() => ({ height: stdout.rows, width: stdout.columns }), [stdout]);
@@ -3134,17 +3204,17 @@ function Screen({ children }) {
3134
3204
  stdout.off("resize", onResize);
3135
3205
  };
3136
3206
  }, [stdout, getSize]);
3137
- return /* @__PURE__ */ jsx17(Box17, { height: size.height, width: size.width, children });
3207
+ return /* @__PURE__ */ jsx18(Box18, { height: size.height, width: size.width, children });
3138
3208
  }
3139
3209
 
3140
3210
  // src/lib/render.tsx
3141
- import { jsx as jsx18 } from "react/jsx-runtime";
3211
+ import { jsx as jsx19 } from "react/jsx-runtime";
3142
3212
  var ENTER_ALT_BUFFER = "\x1B[?1049h";
3143
3213
  var EXIT_ALT_BUFFER = "\x1B[?1049l";
3144
3214
  var CLEAR_SCREEN = "\x1B[2J\x1B[H";
3145
3215
  function render(node, options) {
3146
3216
  process.stdout.write(ENTER_ALT_BUFFER + CLEAR_SCREEN);
3147
- const element = /* @__PURE__ */ jsx18(Screen, { children: node });
3217
+ const element = /* @__PURE__ */ jsx19(Screen, { children: node });
3148
3218
  const instance = inkRender(element, options);
3149
3219
  setImmediate(() => instance.rerender(element));
3150
3220
  const cleanup = () => process.stdout.write(EXIT_ALT_BUFFER);
@@ -3165,7 +3235,7 @@ function render(node, options) {
3165
3235
  }
3166
3236
 
3167
3237
  // src/cli.tsx
3168
- import { jsx as jsx19 } from "react/jsx-runtime";
3238
+ import { jsx as jsx20 } from "react/jsx-runtime";
3169
3239
  var cli = meow(
3170
3240
  `
3171
3241
  Usage
@@ -3198,4 +3268,4 @@ if (cli.flags.cwd) {
3198
3268
  process.exit(1);
3199
3269
  }
3200
3270
  }
3201
- render(/* @__PURE__ */ jsx19(App, {}));
3271
+ render(/* @__PURE__ */ jsx20(App, {}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clairo",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",