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.
- package/README.md +1 -1
- package/dist/cli.js +286 -216
- 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
|
|
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
|
|
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
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1170
|
+
return /* @__PURE__ */ jsx2(Box2, { flexDirection: "row", flexWrap: "wrap", children: renderInline(token.tokens) });
|
|
1130
1171
|
}
|
|
1131
|
-
return /* @__PURE__ */
|
|
1172
|
+
return /* @__PURE__ */ jsx2(Text, { children: renderInline(token.tokens) });
|
|
1132
1173
|
}
|
|
1133
1174
|
case "code":
|
|
1134
|
-
return /* @__PURE__ */
|
|
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(
|
|
1137
|
-
/* @__PURE__ */
|
|
1138
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1142
|
-
/* @__PURE__ */
|
|
1143
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1187
|
+
return /* @__PURE__ */ jsx2(TableRenderer, { token });
|
|
1147
1188
|
case "hr":
|
|
1148
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1214
|
+
return /* @__PURE__ */ jsx2(Text, { children: token.text }, idx);
|
|
1174
1215
|
case "strong":
|
|
1175
|
-
return /* @__PURE__ */
|
|
1216
|
+
return /* @__PURE__ */ jsx2(Text, { bold: true, children: renderInline(token.tokens) }, idx);
|
|
1176
1217
|
case "em":
|
|
1177
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1234
|
+
return /* @__PURE__ */ jsx2(Text, { children: "\n" }, idx);
|
|
1194
1235
|
case "del":
|
|
1195
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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(
|
|
1250
|
-
/* @__PURE__ */
|
|
1251
|
-
/* @__PURE__ */
|
|
1252
|
-
|
|
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__ */
|
|
1262
|
-
loading && /* @__PURE__ */
|
|
1263
|
-
error && /* @__PURE__ */
|
|
1264
|
-
!loading && !error && !pr && /* @__PURE__ */
|
|
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__ */
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
"
|
|
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(
|
|
1275
|
-
/* @__PURE__ */
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
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.
|
|
1282
|
-
|
|
1283
|
-
|
|
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
|
-
(((
|
|
1286
|
-
/* @__PURE__ */
|
|
1287
|
-
|
|
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
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
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
|
-
(((
|
|
1303
|
-
/* @__PURE__ */
|
|
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
|
-
((
|
|
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(
|
|
1326
|
-
/* @__PURE__ */
|
|
1327
|
-
/* @__PURE__ */
|
|
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
|
|
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
|
|
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__ */
|
|
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(
|
|
1826
|
-
loading && /* @__PURE__ */
|
|
1827
|
-
error && /* @__PURE__ */
|
|
1828
|
-
isGeneratingPR && /* @__PURE__ */
|
|
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__ */
|
|
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(
|
|
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__ */
|
|
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
|
|
1933
|
+
import { Box as Box5, Text as Text4 } from "ink";
|
|
1864
1934
|
import { ScrollView as ScrollView3 } from "ink-scroll-view";
|
|
1865
|
-
import { jsx as
|
|
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__ */
|
|
1877
|
-
loading && /* @__PURE__ */
|
|
1878
|
-
error && /* @__PURE__ */
|
|
1879
|
-
!loading && !error && remotes.length === 0 && /* @__PURE__ */
|
|
1880
|
-
!loading && !error && remotes.length > 0 && /* @__PURE__ */
|
|
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(
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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(
|
|
2122
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2158
|
-
/* @__PURE__ */
|
|
2159
|
-
/* @__PURE__ */
|
|
2160
|
-
/* @__PURE__ */
|
|
2161
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
2178
|
-
import { jsx as
|
|
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__ */
|
|
2200
|
-
showPlaceholder ? /* @__PURE__ */
|
|
2201
|
-
isActive && /* @__PURE__ */
|
|
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
|
|
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(
|
|
2224
|
-
/* @__PURE__ */
|
|
2225
|
-
/* @__PURE__ */
|
|
2226
|
-
/* @__PURE__ */
|
|
2227
|
-
error && /* @__PURE__ */
|
|
2228
|
-
/* @__PURE__ */ jsxs7(
|
|
2229
|
-
/* @__PURE__ */
|
|
2230
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2233
|
-
/* @__PURE__ */
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
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__ */
|
|
2319
|
-
error && /* @__PURE__ */
|
|
2320
|
-
!loading && !error && transitions.length === 0 && /* @__PURE__ */
|
|
2321
|
-
!loading && !error && transitions.length > 0 && !applying && /* @__PURE__ */
|
|
2322
|
-
applying && /* @__PURE__ */
|
|
2323
|
-
/* @__PURE__ */
|
|
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
|
|
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
|
|
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(
|
|
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__ */
|
|
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(
|
|
2467
|
-
/* @__PURE__ */
|
|
2468
|
-
/* @__PURE__ */
|
|
2469
|
-
/* @__PURE__ */
|
|
2470
|
-
error && /* @__PURE__ */
|
|
2471
|
-
/* @__PURE__ */
|
|
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(
|
|
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__ */
|
|
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__ */
|
|
2567
|
+
loading && /* @__PURE__ */ jsx10(Box10, { marginTop: 1, children: /* @__PURE__ */ jsx10(Text9, { color: "yellow", children: "Validating credentials..." }) })
|
|
2498
2568
|
] });
|
|
2499
2569
|
}
|
|
2500
|
-
return /* @__PURE__ */ jsxs9(
|
|
2501
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2507
|
-
error && /* @__PURE__ */
|
|
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__ */
|
|
2579
|
+
/* @__PURE__ */ jsx10(Box10, { marginTop: 1 }),
|
|
2510
2580
|
renderItem("email", "Email", email),
|
|
2511
|
-
/* @__PURE__ */
|
|
2581
|
+
/* @__PURE__ */ jsx10(Box10, { marginTop: 1 }),
|
|
2512
2582
|
renderItem("apiToken", "API Token", apiToken, true),
|
|
2513
|
-
/* @__PURE__ */
|
|
2514
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2519
|
-
/* @__PURE__ */
|
|
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
|
|
2525
|
-
import { jsx as
|
|
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__ */
|
|
2599
|
+
return /* @__PURE__ */ jsx11(Box11, { children: /* @__PURE__ */ jsxs10(Text10, { color: textColor, children: [
|
|
2530
2600
|
prefix,
|
|
2531
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
2692
|
-
jira.jiraState === "not_configured" && /* @__PURE__ */
|
|
2693
|
-
jira.jiraState === "no_tickets" && /* @__PURE__ */
|
|
2694
|
-
jira.jiraState === "has_tickets" && jira.tickets.map((ticket, idx) => /* @__PURE__ */
|
|
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
|
|
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
|
|
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
|
|
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(
|
|
2814
|
-
/* @__PURE__ */
|
|
2815
|
-
!date && /* @__PURE__ */
|
|
2816
|
-
date && content === null && /* @__PURE__ */
|
|
2817
|
-
date && content !== null && content.trim() === "" && /* @__PURE__ */
|
|
2818
|
-
date && content && content.trim() !== "" && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2829
|
-
/* @__PURE__ */
|
|
2830
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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(
|
|
2839
|
-
standupResult.type === "error" ? /* @__PURE__ */
|
|
2840
|
-
/* @__PURE__ */
|
|
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
|
|
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
|
|
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__ */
|
|
2882
|
-
logFiles.length === 0 && /* @__PURE__ */
|
|
2883
|
-
logFiles.length > 0 && /* @__PURE__ */
|
|
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(
|
|
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__ */
|
|
2894
|
-
file.isToday && /* @__PURE__ */
|
|
2895
|
-
/* @__PURE__ */
|
|
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
|
|
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(
|
|
2918
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
2944
|
-
import { jsx as
|
|
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(
|
|
2955
|
-
allBindings.map((binding) => /* @__PURE__ */ jsxs15(
|
|
2956
|
-
/* @__PURE__ */
|
|
2957
|
-
/* @__PURE__ */
|
|
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(
|
|
2960
|
-
/* @__PURE__ */
|
|
2961
|
-
/* @__PURE__ */
|
|
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
|
|
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(
|
|
3078
|
-
/* @__PURE__ */ jsxs16(
|
|
3079
|
-
/* @__PURE__ */ jsxs16(
|
|
3080
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
3125
|
-
import { jsx as
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
3271
|
+
render(/* @__PURE__ */ jsx20(App, {}));
|