gh-manager-cli 1.19.2 → 1.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +15 -4
- package/dist/{chunk-FPJS7YJW.js → chunk-RI2B33OX.js} +50 -0
- package/dist/{github-7RR5WPCN.js → github-ERXQNAVD.js} +5 -1
- package/dist/index.js +762 -389
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -14,21 +14,23 @@ import {
|
|
|
14
14
|
logger,
|
|
15
15
|
makeClient,
|
|
16
16
|
purgeApolloCacheFiles,
|
|
17
|
+
renameRepositoryById,
|
|
17
18
|
searchRepositoriesUnified,
|
|
18
19
|
syncForkWithUpstream,
|
|
19
20
|
unarchiveRepositoryById,
|
|
20
21
|
updateCacheAfterArchive,
|
|
21
22
|
updateCacheAfterDelete,
|
|
23
|
+
updateCacheAfterRename,
|
|
22
24
|
updateCacheAfterVisibilityChange,
|
|
23
25
|
updateCacheWithRepository
|
|
24
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-RI2B33OX.js";
|
|
25
27
|
|
|
26
28
|
// package.json
|
|
27
29
|
var require_package = __commonJS({
|
|
28
30
|
"package.json"(exports, module) {
|
|
29
31
|
module.exports = {
|
|
30
32
|
name: "gh-manager-cli",
|
|
31
|
-
version: "1.
|
|
33
|
+
version: "1.21.0",
|
|
32
34
|
private: false,
|
|
33
35
|
description: "Interactive CLI to manage your GitHub repos (personal) with Ink",
|
|
34
36
|
license: "MIT",
|
|
@@ -74,6 +76,7 @@ var require_package = __commonJS({
|
|
|
74
76
|
"@octokit/graphql": "^9.0.1",
|
|
75
77
|
"apollo3-cache-persist": "^0.14.1",
|
|
76
78
|
chalk: "^5.6.0",
|
|
79
|
+
clipboardy: "^4.0.0",
|
|
77
80
|
dotenv: "^17.2.1",
|
|
78
81
|
"env-paths": "^3.0.0",
|
|
79
82
|
graphql: "^16.11.0",
|
|
@@ -153,13 +156,13 @@ var require_package = __commonJS({
|
|
|
153
156
|
|
|
154
157
|
// src/index.tsx
|
|
155
158
|
var import_package = __toESM(require_package(), 1);
|
|
156
|
-
import { render, Box as
|
|
159
|
+
import { render, Box as Box19, Text as Text20 } from "ink";
|
|
157
160
|
import "dotenv/config";
|
|
158
161
|
|
|
159
162
|
// src/ui/App.tsx
|
|
160
|
-
import { useEffect as
|
|
161
|
-
import { Box as
|
|
162
|
-
import
|
|
163
|
+
import { useEffect as useEffect9, useMemo as useMemo2, useState as useState14 } from "react";
|
|
164
|
+
import { Box as Box18, Text as Text19, useApp as useApp2, useStdout as useStdout2, useInput as useInput14 } from "ink";
|
|
165
|
+
import TextInput6 from "ink-text-input";
|
|
163
166
|
|
|
164
167
|
// src/config.ts
|
|
165
168
|
import fs from "fs";
|
|
@@ -404,10 +407,10 @@ async function openGitHubAuthorizationPage() {
|
|
|
404
407
|
}
|
|
405
408
|
|
|
406
409
|
// src/ui/RepoList.tsx
|
|
407
|
-
import
|
|
408
|
-
import { Box as
|
|
409
|
-
import
|
|
410
|
-
import
|
|
410
|
+
import React12, { useEffect as useEffect8, useMemo, useState as useState12, useRef, useCallback } from "react";
|
|
411
|
+
import { Box as Box15, Text as Text16, useApp, useInput as useInput12, useStdout } from "ink";
|
|
412
|
+
import TextInput5 from "ink-text-input";
|
|
413
|
+
import chalk12 from "chalk";
|
|
411
414
|
|
|
412
415
|
// src/apolloMeta.ts
|
|
413
416
|
import fs2 from "fs";
|
|
@@ -485,7 +488,7 @@ function OrgSwitcher({ token, currentContext, onSelect, onClose }) {
|
|
|
485
488
|
try {
|
|
486
489
|
setLoading(true);
|
|
487
490
|
setError(null);
|
|
488
|
-
const client = await import("./github-
|
|
491
|
+
const client = await import("./github-ERXQNAVD.js").then((m) => m.makeClient(token));
|
|
489
492
|
const orgs = await fetchViewerOrganizations(client);
|
|
490
493
|
setOrganizations(orgs);
|
|
491
494
|
const entOrgs = /* @__PURE__ */ new Set();
|
|
@@ -636,6 +639,51 @@ function formatDate(dateStr) {
|
|
|
636
639
|
if (diffDays < 365) return `${Math.floor(diffDays / 30)} months ago`;
|
|
637
640
|
return `${Math.floor(diffDays / 365)} years ago`;
|
|
638
641
|
}
|
|
642
|
+
async function copyToClipboard(text) {
|
|
643
|
+
try {
|
|
644
|
+
const clipboardy = await import("clipboardy");
|
|
645
|
+
await clipboardy.write(text);
|
|
646
|
+
return;
|
|
647
|
+
} catch (error) {
|
|
648
|
+
const { spawn } = await import("child_process");
|
|
649
|
+
const { promisify } = await import("util");
|
|
650
|
+
const spawnCommand = (command, args = []) => {
|
|
651
|
+
return new Promise((resolve, reject) => {
|
|
652
|
+
const child = spawn(command, args, { stdio: ["pipe", "pipe", "pipe"] });
|
|
653
|
+
child.stdin.write(text);
|
|
654
|
+
child.stdin.end();
|
|
655
|
+
child.on("close", (code) => {
|
|
656
|
+
if (code === 0) {
|
|
657
|
+
resolve();
|
|
658
|
+
} else {
|
|
659
|
+
reject(new Error(`Command failed with code ${code}`));
|
|
660
|
+
}
|
|
661
|
+
});
|
|
662
|
+
child.on("error", reject);
|
|
663
|
+
});
|
|
664
|
+
};
|
|
665
|
+
try {
|
|
666
|
+
const platform = process.platform;
|
|
667
|
+
if (platform === "darwin") {
|
|
668
|
+
await spawnCommand("pbcopy");
|
|
669
|
+
} else if (platform === "win32") {
|
|
670
|
+
await spawnCommand("clip");
|
|
671
|
+
} else {
|
|
672
|
+
try {
|
|
673
|
+
await spawnCommand("xclip", ["-selection", "clipboard"]);
|
|
674
|
+
} catch {
|
|
675
|
+
try {
|
|
676
|
+
await spawnCommand("xsel", ["--clipboard", "--input"]);
|
|
677
|
+
} catch {
|
|
678
|
+
await spawnCommand("wl-copy");
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
} catch (osError) {
|
|
683
|
+
throw new Error(`Failed to copy to clipboard. Please install a clipboard utility for your system.`);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
}
|
|
639
687
|
|
|
640
688
|
// src/ui/components/modals/InfoModal.tsx
|
|
641
689
|
import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
@@ -1099,10 +1147,228 @@ var ChangeVisibilityModal = ({
|
|
|
1099
1147
|
);
|
|
1100
1148
|
};
|
|
1101
1149
|
|
|
1102
|
-
// src/ui/components/
|
|
1103
|
-
import {
|
|
1150
|
+
// src/ui/components/modals/RenameModal.tsx
|
|
1151
|
+
import { useState as useState10, useEffect as useEffect7 } from "react";
|
|
1152
|
+
import { Box as Box10, Text as Text11, useInput as useInput10 } from "ink";
|
|
1153
|
+
import TextInput3 from "ink-text-input";
|
|
1154
|
+
import { Fragment as Fragment5, jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1155
|
+
function RenameModal({ repo, onRename, onCancel }) {
|
|
1156
|
+
const [newName, setNewName] = useState10("");
|
|
1157
|
+
const [renaming, setRenaming] = useState10(false);
|
|
1158
|
+
const [renameError, setRenameError] = useState10(null);
|
|
1159
|
+
useEffect7(() => {
|
|
1160
|
+
if (repo) {
|
|
1161
|
+
setNewName(repo.name);
|
|
1162
|
+
setRenameError(null);
|
|
1163
|
+
}
|
|
1164
|
+
}, [repo]);
|
|
1165
|
+
useInput10((input, key) => {
|
|
1166
|
+
if (renaming) return;
|
|
1167
|
+
if (key.escape) {
|
|
1168
|
+
onCancel();
|
|
1169
|
+
return;
|
|
1170
|
+
}
|
|
1171
|
+
if (key.return) {
|
|
1172
|
+
if (newName.trim() && newName !== repo?.name) {
|
|
1173
|
+
handleRenameConfirm();
|
|
1174
|
+
}
|
|
1175
|
+
return;
|
|
1176
|
+
}
|
|
1177
|
+
});
|
|
1178
|
+
const handleRenameConfirm = async () => {
|
|
1179
|
+
if (!repo || renaming || !newName.trim() || newName === repo.name) return;
|
|
1180
|
+
try {
|
|
1181
|
+
setRenaming(true);
|
|
1182
|
+
setRenameError(null);
|
|
1183
|
+
await onRename(repo, newName.trim());
|
|
1184
|
+
} catch (e) {
|
|
1185
|
+
setRenameError(e.message || "Failed to rename repository");
|
|
1186
|
+
setRenaming(false);
|
|
1187
|
+
}
|
|
1188
|
+
};
|
|
1189
|
+
const handleNameChange = (value) => {
|
|
1190
|
+
const filtered = value.replace(/[^a-zA-Z0-9\-_.]/g, "");
|
|
1191
|
+
setNewName(filtered);
|
|
1192
|
+
};
|
|
1193
|
+
if (!repo) return null;
|
|
1194
|
+
const owner = repo.nameWithOwner.split("/")[0];
|
|
1195
|
+
const isDisabled = !newName.trim() || newName === repo.name;
|
|
1196
|
+
return /* @__PURE__ */ jsxs10(
|
|
1197
|
+
Box10,
|
|
1198
|
+
{
|
|
1199
|
+
flexDirection: "column",
|
|
1200
|
+
borderStyle: "round",
|
|
1201
|
+
borderColor: "cyan",
|
|
1202
|
+
paddingX: 3,
|
|
1203
|
+
paddingY: 2,
|
|
1204
|
+
width: 80,
|
|
1205
|
+
children: [
|
|
1206
|
+
/* @__PURE__ */ jsx11(Text11, { bold: true, color: "cyan", children: "Rename Repository" }),
|
|
1207
|
+
/* @__PURE__ */ jsx11(Box10, { height: 1, children: /* @__PURE__ */ jsx11(Text11, { children: " " }) }),
|
|
1208
|
+
/* @__PURE__ */ jsxs10(Text11, { color: "gray", children: [
|
|
1209
|
+
"Current: ",
|
|
1210
|
+
repo.nameWithOwner
|
|
1211
|
+
] }),
|
|
1212
|
+
/* @__PURE__ */ jsx11(Box10, { height: 1, children: /* @__PURE__ */ jsx11(Text11, { children: " " }) }),
|
|
1213
|
+
/* @__PURE__ */ jsx11(Text11, { children: "New name:" }),
|
|
1214
|
+
/* @__PURE__ */ jsxs10(Box10, { flexDirection: "row", alignItems: "center", children: [
|
|
1215
|
+
/* @__PURE__ */ jsxs10(Text11, { children: [
|
|
1216
|
+
owner,
|
|
1217
|
+
"/"
|
|
1218
|
+
] }),
|
|
1219
|
+
/* @__PURE__ */ jsx11(
|
|
1220
|
+
TextInput3,
|
|
1221
|
+
{
|
|
1222
|
+
value: newName,
|
|
1223
|
+
onChange: handleNameChange,
|
|
1224
|
+
placeholder: repo.name,
|
|
1225
|
+
focus: !renaming
|
|
1226
|
+
}
|
|
1227
|
+
)
|
|
1228
|
+
] }),
|
|
1229
|
+
renaming ? /* @__PURE__ */ jsx11(Box10, { marginTop: 2, justifyContent: "center", children: /* @__PURE__ */ jsxs10(Box10, { flexDirection: "row", children: [
|
|
1230
|
+
/* @__PURE__ */ jsx11(Box10, { marginRight: 1, children: /* @__PURE__ */ jsx11(SlowSpinner, {}) }),
|
|
1231
|
+
/* @__PURE__ */ jsx11(Text11, { color: "cyan", children: "Renaming repository..." })
|
|
1232
|
+
] }) }) : /* @__PURE__ */ jsxs10(Fragment5, { children: [
|
|
1233
|
+
/* @__PURE__ */ jsx11(Box10, { marginTop: 2, children: /* @__PURE__ */ jsx11(Text11, { color: "gray", children: isDisabled ? "Enter a different name to rename" : `Press Enter to rename to "${newName}"` }) }),
|
|
1234
|
+
/* @__PURE__ */ jsx11(Box10, { marginTop: 1, children: /* @__PURE__ */ jsx11(Text11, { color: "gray", children: "Press Esc to cancel" }) })
|
|
1235
|
+
] }),
|
|
1236
|
+
renameError && /* @__PURE__ */ jsx11(Box10, { marginTop: 1, children: /* @__PURE__ */ jsx11(Text11, { color: "red", children: renameError }) })
|
|
1237
|
+
]
|
|
1238
|
+
}
|
|
1239
|
+
);
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
// src/ui/components/modals/CopyUrlModal.tsx
|
|
1243
|
+
import { useState as useState11 } from "react";
|
|
1244
|
+
import { Box as Box11, Text as Text12, useInput as useInput11 } from "ink";
|
|
1104
1245
|
import chalk10 from "chalk";
|
|
1105
|
-
import { jsx as
|
|
1246
|
+
import { Fragment as Fragment6, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1247
|
+
function CopyUrlModal({ repo, terminalWidth, onClose, onCopy }) {
|
|
1248
|
+
const [copyError, setCopyError] = useState11(null);
|
|
1249
|
+
const [selectedType, setSelectedType] = useState11("SSH");
|
|
1250
|
+
const urlTypes = ["SSH", "HTTPS"];
|
|
1251
|
+
useInput11((input, key) => {
|
|
1252
|
+
if (!repo) return;
|
|
1253
|
+
const ch = input?.toLowerCase();
|
|
1254
|
+
if (key.escape || ch === "c" || ch === "q") {
|
|
1255
|
+
onClose();
|
|
1256
|
+
return;
|
|
1257
|
+
}
|
|
1258
|
+
if (key.leftArrow || key.rightArrow) {
|
|
1259
|
+
const currentIndex = urlTypes.indexOf(selectedType);
|
|
1260
|
+
let newIndex;
|
|
1261
|
+
if (key.leftArrow) {
|
|
1262
|
+
newIndex = currentIndex === 0 ? urlTypes.length - 1 : currentIndex - 1;
|
|
1263
|
+
} else {
|
|
1264
|
+
newIndex = currentIndex === urlTypes.length - 1 ? 0 : currentIndex + 1;
|
|
1265
|
+
}
|
|
1266
|
+
setSelectedType(urlTypes[newIndex]);
|
|
1267
|
+
return;
|
|
1268
|
+
}
|
|
1269
|
+
if (key.upArrow) {
|
|
1270
|
+
setSelectedType("SSH");
|
|
1271
|
+
return;
|
|
1272
|
+
}
|
|
1273
|
+
if (key.downArrow) {
|
|
1274
|
+
setSelectedType("HTTPS");
|
|
1275
|
+
return;
|
|
1276
|
+
}
|
|
1277
|
+
if (key.return || ch === "y") {
|
|
1278
|
+
const sshUrl2 = `git@github.com:${repo.nameWithOwner}.git`;
|
|
1279
|
+
const httpsUrl2 = `https://github.com/${repo.nameWithOwner}.git`;
|
|
1280
|
+
const urlToCopy = selectedType === "SSH" ? sshUrl2 : httpsUrl2;
|
|
1281
|
+
handleCopy(urlToCopy, selectedType);
|
|
1282
|
+
return;
|
|
1283
|
+
}
|
|
1284
|
+
if (ch === "s") {
|
|
1285
|
+
const sshUrl2 = `git@github.com:${repo.nameWithOwner}.git`;
|
|
1286
|
+
handleCopy(sshUrl2, "SSH");
|
|
1287
|
+
return;
|
|
1288
|
+
}
|
|
1289
|
+
if (ch === "h") {
|
|
1290
|
+
const httpsUrl2 = `https://github.com/${repo.nameWithOwner}.git`;
|
|
1291
|
+
handleCopy(httpsUrl2, "HTTPS");
|
|
1292
|
+
return;
|
|
1293
|
+
}
|
|
1294
|
+
});
|
|
1295
|
+
if (!repo) {
|
|
1296
|
+
return /* @__PURE__ */ jsx12(Text12, { color: "red", children: "No repository selected." });
|
|
1297
|
+
}
|
|
1298
|
+
const sshUrl = `git@github.com:${repo.nameWithOwner}.git`;
|
|
1299
|
+
const httpsUrl = `https://github.com/${repo.nameWithOwner}.git`;
|
|
1300
|
+
const handleCopy = async (url, type) => {
|
|
1301
|
+
try {
|
|
1302
|
+
setCopyError(null);
|
|
1303
|
+
await onCopy(url, type);
|
|
1304
|
+
onClose();
|
|
1305
|
+
} catch (error) {
|
|
1306
|
+
const message = error instanceof Error ? error.message : String(error) || "Unknown error";
|
|
1307
|
+
setCopyError(`Failed to copy ${type} URL: ${message}`);
|
|
1308
|
+
}
|
|
1309
|
+
};
|
|
1310
|
+
return /* @__PURE__ */ jsxs11(
|
|
1311
|
+
Box11,
|
|
1312
|
+
{
|
|
1313
|
+
flexDirection: "column",
|
|
1314
|
+
borderStyle: "round",
|
|
1315
|
+
borderColor: "blue",
|
|
1316
|
+
paddingX: 3,
|
|
1317
|
+
paddingY: 2,
|
|
1318
|
+
width: Math.min(terminalWidth - 8, 80),
|
|
1319
|
+
children: [
|
|
1320
|
+
/* @__PURE__ */ jsx12(Text12, { bold: true, color: "blue", children: "Copy Repository URL" }),
|
|
1321
|
+
/* @__PURE__ */ jsx12(Box11, { height: 1, children: /* @__PURE__ */ jsx12(Text12, { children: " " }) }),
|
|
1322
|
+
/* @__PURE__ */ jsx12(Text12, { children: chalk10.bold(repo.nameWithOwner) }),
|
|
1323
|
+
/* @__PURE__ */ jsx12(Box11, { height: 1, children: /* @__PURE__ */ jsx12(Text12, { children: " " }) }),
|
|
1324
|
+
/* @__PURE__ */ jsx12(Text12, { color: "gray", children: "SSH URL:" }),
|
|
1325
|
+
/* @__PURE__ */ jsx12(
|
|
1326
|
+
Box11,
|
|
1327
|
+
{
|
|
1328
|
+
paddingX: 2,
|
|
1329
|
+
paddingY: 1,
|
|
1330
|
+
borderStyle: "single",
|
|
1331
|
+
borderColor: selectedType === "SSH" ? "blue" : "gray",
|
|
1332
|
+
children: /* @__PURE__ */ jsxs11(Text12, { color: selectedType === "SSH" ? "blue" : void 0, children: [
|
|
1333
|
+
selectedType === "SSH" ? "\u25B6 " : " ",
|
|
1334
|
+
sshUrl
|
|
1335
|
+
] })
|
|
1336
|
+
}
|
|
1337
|
+
),
|
|
1338
|
+
/* @__PURE__ */ jsx12(Box11, { height: 1, children: /* @__PURE__ */ jsx12(Text12, { children: " " }) }),
|
|
1339
|
+
/* @__PURE__ */ jsx12(Text12, { color: "gray", children: "HTTPS URL:" }),
|
|
1340
|
+
/* @__PURE__ */ jsx12(
|
|
1341
|
+
Box11,
|
|
1342
|
+
{
|
|
1343
|
+
paddingX: 2,
|
|
1344
|
+
paddingY: 1,
|
|
1345
|
+
borderStyle: "single",
|
|
1346
|
+
borderColor: selectedType === "HTTPS" ? "blue" : "gray",
|
|
1347
|
+
children: /* @__PURE__ */ jsxs11(Text12, { color: selectedType === "HTTPS" ? "blue" : void 0, children: [
|
|
1348
|
+
selectedType === "HTTPS" ? "\u25B6 " : " ",
|
|
1349
|
+
httpsUrl
|
|
1350
|
+
] })
|
|
1351
|
+
}
|
|
1352
|
+
),
|
|
1353
|
+
/* @__PURE__ */ jsx12(Box11, { height: 1, children: /* @__PURE__ */ jsx12(Text12, { children: " " }) }),
|
|
1354
|
+
/* @__PURE__ */ jsxs11(Text12, { color: "gray", children: [
|
|
1355
|
+
"\u2191\u2193 Select \u2022 Enter/Y to copy ",
|
|
1356
|
+
selectedType,
|
|
1357
|
+
" \u2022 S copy SSH \u2022 H copy HTTPS \u2022 Esc/Q/C to close"
|
|
1358
|
+
] }),
|
|
1359
|
+
copyError && /* @__PURE__ */ jsxs11(Fragment6, { children: [
|
|
1360
|
+
/* @__PURE__ */ jsx12(Box11, { height: 1, children: /* @__PURE__ */ jsx12(Text12, { children: " " }) }),
|
|
1361
|
+
/* @__PURE__ */ jsx12(Text12, { color: "red", children: copyError })
|
|
1362
|
+
] })
|
|
1363
|
+
]
|
|
1364
|
+
}
|
|
1365
|
+
);
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
// src/ui/components/repo/RepoRow.tsx
|
|
1369
|
+
import { Box as Box12, Text as Text13 } from "ink";
|
|
1370
|
+
import chalk11 from "chalk";
|
|
1371
|
+
import { jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1106
1372
|
function RepoRow({
|
|
1107
1373
|
repo,
|
|
1108
1374
|
selected,
|
|
@@ -1118,50 +1384,50 @@ function RepoRow({
|
|
|
1118
1384
|
const commitsBehind = hasCommitData ? repo.parent.defaultBranchRef.target.history.totalCount - repo.defaultBranchRef.target.history.totalCount : 0;
|
|
1119
1385
|
const showCommitsBehind = forkTracking && hasCommitData;
|
|
1120
1386
|
let line1 = "";
|
|
1121
|
-
const numColor = selected ?
|
|
1122
|
-
const nameColor = selected ?
|
|
1387
|
+
const numColor = selected ? chalk11.cyan : chalk11.gray;
|
|
1388
|
+
const nameColor = selected ? chalk11.cyan.bold : chalk11.white;
|
|
1123
1389
|
line1 += numColor(`${String(index).padStart(3, " ")}.`);
|
|
1124
1390
|
line1 += nameColor(` ${repo.nameWithOwner}`);
|
|
1125
1391
|
if (repo.visibility === "INTERNAL") {
|
|
1126
|
-
line1 +=
|
|
1392
|
+
line1 += chalk11.magenta(" Internal");
|
|
1127
1393
|
} else if (repo.visibility === "PRIVATE" || repo.isPrivate && !repo.visibility) {
|
|
1128
|
-
line1 +=
|
|
1394
|
+
line1 += chalk11.yellow(" Private");
|
|
1129
1395
|
}
|
|
1130
|
-
if (repo.isArchived) line1 += " " +
|
|
1396
|
+
if (repo.isArchived) line1 += " " + chalk11.bgGray.whiteBright(" Archived ") + " ";
|
|
1131
1397
|
if (repo.isFork && repo.parent) {
|
|
1132
|
-
line1 +=
|
|
1398
|
+
line1 += chalk11.blue(` Fork of ${repo.parent.nameWithOwner}`);
|
|
1133
1399
|
if (showCommitsBehind) {
|
|
1134
1400
|
if (commitsBehind > 0) {
|
|
1135
|
-
line1 +=
|
|
1401
|
+
line1 += chalk11.yellow(` (${commitsBehind} behind)`);
|
|
1136
1402
|
} else {
|
|
1137
|
-
line1 +=
|
|
1403
|
+
line1 += chalk11.green(` (0 behind)`);
|
|
1138
1404
|
}
|
|
1139
1405
|
}
|
|
1140
1406
|
}
|
|
1141
1407
|
let line2 = " ";
|
|
1142
|
-
const metaColor = selected ?
|
|
1143
|
-
if (langName) line2 +=
|
|
1408
|
+
const metaColor = selected ? chalk11.white : chalk11.gray;
|
|
1409
|
+
if (langName) line2 += chalk11.hex(langColor)("\u25CF ") + metaColor(`${langName} `);
|
|
1144
1410
|
line2 += metaColor(`\u2605 ${repo.stargazerCount} \u2442 ${repo.forkCount} Updated ${formatDate(repo.updatedAt)}`);
|
|
1145
1411
|
const line3 = repo.description ? ` ${truncate(repo.description, Math.max(30, maxWidth - 10))}` : null;
|
|
1146
1412
|
let fullText = line1 + "\n" + line2;
|
|
1147
1413
|
if (line3) fullText += "\n" + metaColor(line3);
|
|
1148
1414
|
const spacingAbove = Math.floor(spacingLines / 2);
|
|
1149
1415
|
const spacingBelow = spacingLines - spacingAbove;
|
|
1150
|
-
return /* @__PURE__ */
|
|
1151
|
-
spacingAbove > 0 && /* @__PURE__ */
|
|
1152
|
-
/* @__PURE__ */
|
|
1153
|
-
spacingBelow > 0 && /* @__PURE__ */
|
|
1416
|
+
return /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", backgroundColor: selected ? "gray" : void 0, children: [
|
|
1417
|
+
spacingAbove > 0 && /* @__PURE__ */ jsx13(Box12, { height: spacingAbove, children: /* @__PURE__ */ jsx13(Text13, { children: " " }) }),
|
|
1418
|
+
/* @__PURE__ */ jsx13(Text13, { children: dim ? chalk11.dim(fullText) : fullText }),
|
|
1419
|
+
spacingBelow > 0 && /* @__PURE__ */ jsx13(Box12, { height: spacingBelow, children: /* @__PURE__ */ jsx13(Text13, { children: " " }) })
|
|
1154
1420
|
] });
|
|
1155
1421
|
}
|
|
1156
1422
|
|
|
1157
1423
|
// src/ui/components/repo/FilterInput.tsx
|
|
1158
|
-
import { Box as
|
|
1159
|
-
import
|
|
1160
|
-
import { jsx as
|
|
1424
|
+
import { Box as Box13, Text as Text14 } from "ink";
|
|
1425
|
+
import TextInput4 from "ink-text-input";
|
|
1426
|
+
import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
1161
1427
|
|
|
1162
1428
|
// src/ui/components/repo/RepoListHeader.tsx
|
|
1163
|
-
import { Box as
|
|
1164
|
-
import { Fragment as
|
|
1429
|
+
import { Box as Box14, Text as Text15 } from "ink";
|
|
1430
|
+
import { Fragment as Fragment7, jsx as jsx15, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
1165
1431
|
function RepoListHeader({
|
|
1166
1432
|
ownerContext,
|
|
1167
1433
|
sortKey,
|
|
@@ -1175,35 +1441,35 @@ function RepoListHeader({
|
|
|
1175
1441
|
}) {
|
|
1176
1442
|
const contextLabel = ownerContext === "personal" ? "Personal Account" : ownerContext?.type === "organization" ? `Organization: ${ownerContext.name ?? ownerContext.login}` : "";
|
|
1177
1443
|
const visibilityLabel = visibilityFilter === "public" ? "Public" : visibilityFilter === "private" ? isEnterprise ? "Private/Internal" : "Private" : visibilityFilter === "internal" ? "Internal" : "";
|
|
1178
|
-
return /* @__PURE__ */
|
|
1179
|
-
contextLabel && /* @__PURE__ */
|
|
1180
|
-
/* @__PURE__ */
|
|
1444
|
+
return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "row", gap: 2, marginBottom: 1, children: [
|
|
1445
|
+
contextLabel && /* @__PURE__ */ jsx15(Text15, { children: contextLabel }),
|
|
1446
|
+
/* @__PURE__ */ jsxs14(Text15, { color: "gray", dimColor: true, children: [
|
|
1181
1447
|
"Sort: ",
|
|
1182
1448
|
sortKey,
|
|
1183
1449
|
" ",
|
|
1184
1450
|
sortDir === "asc" ? "\u2191" : "\u2193"
|
|
1185
1451
|
] }),
|
|
1186
|
-
/* @__PURE__ */
|
|
1452
|
+
/* @__PURE__ */ jsxs14(Text15, { color: "gray", dimColor: true, children: [
|
|
1187
1453
|
"Fork Status - Commits Behind: ",
|
|
1188
1454
|
forkTracking ? "ON" : "OFF"
|
|
1189
1455
|
] }),
|
|
1190
|
-
!!visibilityLabel && /* @__PURE__ */
|
|
1456
|
+
!!visibilityLabel && /* @__PURE__ */ jsxs14(Text15, { color: "yellow", children: [
|
|
1191
1457
|
"Visibility: ",
|
|
1192
1458
|
visibilityLabel
|
|
1193
1459
|
] }),
|
|
1194
|
-
filter && !searchActive && /* @__PURE__ */
|
|
1460
|
+
filter && !searchActive && /* @__PURE__ */ jsxs14(Text15, { color: "cyan", children: [
|
|
1195
1461
|
'Filter: "',
|
|
1196
1462
|
filter,
|
|
1197
1463
|
'"'
|
|
1198
1464
|
] }),
|
|
1199
|
-
searchActive && /* @__PURE__ */
|
|
1200
|
-
/* @__PURE__ */
|
|
1465
|
+
searchActive && /* @__PURE__ */ jsxs14(Fragment7, { children: [
|
|
1466
|
+
/* @__PURE__ */ jsxs14(Text15, { color: "cyan", children: [
|
|
1201
1467
|
'Search: "',
|
|
1202
1468
|
filter.trim(),
|
|
1203
1469
|
'"'
|
|
1204
1470
|
] }),
|
|
1205
|
-
searchLoading && /* @__PURE__ */
|
|
1206
|
-
/* @__PURE__ */
|
|
1471
|
+
searchLoading && /* @__PURE__ */ jsx15(Box14, { marginLeft: 1, children: /* @__PURE__ */ jsxs14(Text15, { color: "cyan", children: [
|
|
1472
|
+
/* @__PURE__ */ jsx15(SlowSpinner, {}),
|
|
1207
1473
|
" Searching\u2026"
|
|
1208
1474
|
] }) })
|
|
1209
1475
|
] })
|
|
@@ -1211,7 +1477,7 @@ function RepoListHeader({
|
|
|
1211
1477
|
}
|
|
1212
1478
|
|
|
1213
1479
|
// src/ui/RepoList.tsx
|
|
1214
|
-
import { Fragment as
|
|
1480
|
+
import { Fragment as Fragment8, jsx as jsx16, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
1215
1481
|
var getPageSize = () => {
|
|
1216
1482
|
const envValue = process.env.REPOS_PER_FETCH;
|
|
1217
1483
|
if (envValue) {
|
|
@@ -1227,17 +1493,17 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1227
1493
|
const { exit } = useApp();
|
|
1228
1494
|
const { stdout } = useStdout();
|
|
1229
1495
|
const client = useMemo(() => makeClient(token), [token]);
|
|
1230
|
-
const [debugMessages, setDebugMessages] =
|
|
1496
|
+
const [debugMessages, setDebugMessages] = useState12([]);
|
|
1231
1497
|
const addDebugMessage = useCallback((msg) => {
|
|
1232
1498
|
if (process.env.GH_MANAGER_DEBUG === "1") {
|
|
1233
1499
|
setDebugMessages((prev) => [...prev.slice(-9), msg]);
|
|
1234
1500
|
}
|
|
1235
1501
|
}, []);
|
|
1236
1502
|
const handleOrgContextChangeRef = useRef(onOrgContextChange);
|
|
1237
|
-
|
|
1503
|
+
useEffect8(() => {
|
|
1238
1504
|
handleOrgContextChangeRef.current = onOrgContextChange;
|
|
1239
1505
|
}, [onOrgContextChange]);
|
|
1240
|
-
|
|
1506
|
+
React12.useEffect(() => {
|
|
1241
1507
|
addDebugMessage(`[RepoList] Component mounted`);
|
|
1242
1508
|
logger.info("RepoList component mounted", {
|
|
1243
1509
|
token: token ? "present" : "missing",
|
|
@@ -1249,62 +1515,76 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1249
1515
|
}, []);
|
|
1250
1516
|
const terminalWidth = stdout?.columns ?? 80;
|
|
1251
1517
|
const availableHeight = maxVisibleRows ?? 20;
|
|
1252
|
-
const [items, setItems] =
|
|
1253
|
-
const [cursor, setCursor] =
|
|
1254
|
-
const [endCursor, setEndCursor] =
|
|
1255
|
-
const [hasNextPage, setHasNextPage] =
|
|
1256
|
-
const [totalCount, setTotalCount] =
|
|
1257
|
-
const [loading, setLoading] =
|
|
1258
|
-
const [sortingLoading, setSortingLoading] =
|
|
1259
|
-
const [refreshing, setRefreshing] =
|
|
1260
|
-
const [loadingMore, setLoadingMore] =
|
|
1261
|
-
const [error, setError] =
|
|
1262
|
-
const [rateLimit, setRateLimit] =
|
|
1263
|
-
const [prevRateLimit, setPrevRateLimit] =
|
|
1264
|
-
const [density, setDensity] =
|
|
1265
|
-
const [prefsLoaded, setPrefsLoaded] =
|
|
1266
|
-
const [ownerContext, setOwnerContext] =
|
|
1267
|
-
const [ownerAffiliations, setOwnerAffiliations] =
|
|
1268
|
-
const [orgSwitcherOpen, setOrgSwitcherOpen] =
|
|
1269
|
-
const [searchItems, setSearchItems] =
|
|
1270
|
-
const [searchEndCursor, setSearchEndCursor] =
|
|
1271
|
-
const [searchHasNextPage, setSearchHasNextPage] =
|
|
1272
|
-
const [searchTotalCount, setSearchTotalCount] =
|
|
1273
|
-
const [searchLoading, setSearchLoading] =
|
|
1274
|
-
const [deleteMode, setDeleteMode] =
|
|
1275
|
-
const [deleteTarget, setDeleteTarget] =
|
|
1276
|
-
const [deleteCode, setDeleteCode] =
|
|
1277
|
-
const [typedCode, setTypedCode] =
|
|
1278
|
-
const [deleting, setDeleting] =
|
|
1279
|
-
const [deleteError, setDeleteError] =
|
|
1280
|
-
const [deleteConfirmStage, setDeleteConfirmStage] =
|
|
1281
|
-
const [confirmFocus, setConfirmFocus] =
|
|
1282
|
-
const [archiveMode, setArchiveMode] =
|
|
1283
|
-
const [archiveTarget, setArchiveTarget] =
|
|
1284
|
-
const [archiving, setArchiving] =
|
|
1285
|
-
const [archiveError, setArchiveError] =
|
|
1286
|
-
const [archiveFocus, setArchiveFocus] =
|
|
1287
|
-
const [
|
|
1288
|
-
const [
|
|
1289
|
-
const [
|
|
1290
|
-
const [
|
|
1291
|
-
const [
|
|
1292
|
-
const [
|
|
1293
|
-
const [
|
|
1294
|
-
const [
|
|
1295
|
-
const [
|
|
1296
|
-
const [
|
|
1297
|
-
const [
|
|
1298
|
-
const [
|
|
1299
|
-
const [
|
|
1300
|
-
const [
|
|
1301
|
-
const [
|
|
1302
|
-
const [
|
|
1303
|
-
const [
|
|
1304
|
-
const [
|
|
1305
|
-
const [
|
|
1518
|
+
const [items, setItems] = useState12([]);
|
|
1519
|
+
const [cursor, setCursor] = useState12(0);
|
|
1520
|
+
const [endCursor, setEndCursor] = useState12(null);
|
|
1521
|
+
const [hasNextPage, setHasNextPage] = useState12(false);
|
|
1522
|
+
const [totalCount, setTotalCount] = useState12(0);
|
|
1523
|
+
const [loading, setLoading] = useState12(true);
|
|
1524
|
+
const [sortingLoading, setSortingLoading] = useState12(false);
|
|
1525
|
+
const [refreshing, setRefreshing] = useState12(false);
|
|
1526
|
+
const [loadingMore, setLoadingMore] = useState12(false);
|
|
1527
|
+
const [error, setError] = useState12(null);
|
|
1528
|
+
const [rateLimit, setRateLimit] = useState12(void 0);
|
|
1529
|
+
const [prevRateLimit, setPrevRateLimit] = useState12(void 0);
|
|
1530
|
+
const [density, setDensity] = useState12(2);
|
|
1531
|
+
const [prefsLoaded, setPrefsLoaded] = useState12(false);
|
|
1532
|
+
const [ownerContext, setOwnerContext] = useState12("personal");
|
|
1533
|
+
const [ownerAffiliations, setOwnerAffiliations] = useState12(["OWNER"]);
|
|
1534
|
+
const [orgSwitcherOpen, setOrgSwitcherOpen] = useState12(false);
|
|
1535
|
+
const [searchItems, setSearchItems] = useState12([]);
|
|
1536
|
+
const [searchEndCursor, setSearchEndCursor] = useState12(null);
|
|
1537
|
+
const [searchHasNextPage, setSearchHasNextPage] = useState12(false);
|
|
1538
|
+
const [searchTotalCount, setSearchTotalCount] = useState12(0);
|
|
1539
|
+
const [searchLoading, setSearchLoading] = useState12(false);
|
|
1540
|
+
const [deleteMode, setDeleteMode] = useState12(false);
|
|
1541
|
+
const [deleteTarget, setDeleteTarget] = useState12(null);
|
|
1542
|
+
const [deleteCode, setDeleteCode] = useState12("");
|
|
1543
|
+
const [typedCode, setTypedCode] = useState12("");
|
|
1544
|
+
const [deleting, setDeleting] = useState12(false);
|
|
1545
|
+
const [deleteError, setDeleteError] = useState12(null);
|
|
1546
|
+
const [deleteConfirmStage, setDeleteConfirmStage] = useState12(false);
|
|
1547
|
+
const [confirmFocus, setConfirmFocus] = useState12("delete");
|
|
1548
|
+
const [archiveMode, setArchiveMode] = useState12(false);
|
|
1549
|
+
const [archiveTarget, setArchiveTarget] = useState12(null);
|
|
1550
|
+
const [archiving, setArchiving] = useState12(false);
|
|
1551
|
+
const [archiveError, setArchiveError] = useState12(null);
|
|
1552
|
+
const [archiveFocus, setArchiveFocus] = useState12("confirm");
|
|
1553
|
+
const [renameMode, setRenameMode] = useState12(false);
|
|
1554
|
+
const [renameTarget, setRenameTarget] = useState12(null);
|
|
1555
|
+
const [syncMode, setSyncMode] = useState12(false);
|
|
1556
|
+
const [syncTarget, setSyncTarget] = useState12(null);
|
|
1557
|
+
const [syncing, setSyncing] = useState12(false);
|
|
1558
|
+
const [syncError, setSyncError] = useState12(null);
|
|
1559
|
+
const [syncFocus, setSyncFocus] = useState12("confirm");
|
|
1560
|
+
const [syncTrigger, setSyncTrigger] = useState12(false);
|
|
1561
|
+
const [infoMode, setInfoMode] = useState12(false);
|
|
1562
|
+
const [infoRepo, setInfoRepo] = useState12(null);
|
|
1563
|
+
const [logoutMode, setLogoutMode] = useState12(false);
|
|
1564
|
+
const [logoutFocus, setLogoutFocus] = useState12("confirm");
|
|
1565
|
+
const [logoutError, setLogoutError] = useState12(null);
|
|
1566
|
+
const [visibilityMode, setVisibilityMode] = useState12(false);
|
|
1567
|
+
const [isEnterpriseOrg, setIsEnterpriseOrg] = useState12(false);
|
|
1568
|
+
const [hasInternalRepos, setHasInternalRepos] = useState12(false);
|
|
1569
|
+
const [changeVisibilityMode, setChangeVisibilityMode] = useState12(false);
|
|
1570
|
+
const [changeVisibilityTarget, setChangeVisibilityTarget] = useState12(null);
|
|
1571
|
+
const [changingVisibility, setChangingVisibility] = useState12(false);
|
|
1572
|
+
const [changeVisibilityError, setChangeVisibilityError] = useState12(null);
|
|
1573
|
+
const [sortMode, setSortMode] = useState12(false);
|
|
1574
|
+
const [copyUrlMode, setCopyUrlMode] = useState12(false);
|
|
1575
|
+
const [copyUrlTarget, setCopyUrlTarget] = useState12(null);
|
|
1576
|
+
const [copyToast, setCopyToast] = useState12(null);
|
|
1577
|
+
const copyToastTimerRef = useRef(null);
|
|
1578
|
+
useEffect8(() => {
|
|
1579
|
+
return () => {
|
|
1580
|
+
if (copyToastTimerRef.current) {
|
|
1581
|
+
clearTimeout(copyToastTimerRef.current);
|
|
1582
|
+
copyToastTimerRef.current = null;
|
|
1583
|
+
}
|
|
1584
|
+
};
|
|
1585
|
+
}, []);
|
|
1306
1586
|
const appliedInitialOrg = useRef(false);
|
|
1307
|
-
|
|
1587
|
+
useEffect8(() => {
|
|
1308
1588
|
(async () => {
|
|
1309
1589
|
if (appliedInitialOrg.current) return;
|
|
1310
1590
|
if (!initialOrgSlug2) return;
|
|
@@ -1339,6 +1619,10 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1339
1619
|
setArchiveError(null);
|
|
1340
1620
|
setArchiveFocus("confirm");
|
|
1341
1621
|
}
|
|
1622
|
+
function closeRenameModal() {
|
|
1623
|
+
setRenameMode(false);
|
|
1624
|
+
setRenameTarget(null);
|
|
1625
|
+
}
|
|
1342
1626
|
function closeChangeVisibilityModal() {
|
|
1343
1627
|
setChangeVisibilityMode(false);
|
|
1344
1628
|
setChangeVisibilityTarget(null);
|
|
@@ -1353,6 +1637,42 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1353
1637
|
setSyncFocus("confirm");
|
|
1354
1638
|
setSyncTrigger(false);
|
|
1355
1639
|
}
|
|
1640
|
+
function openCopyUrlModal(repo) {
|
|
1641
|
+
setCopyUrlMode(true);
|
|
1642
|
+
setCopyUrlTarget(repo);
|
|
1643
|
+
setCopyToast(null);
|
|
1644
|
+
}
|
|
1645
|
+
function closeCopyUrlModal() {
|
|
1646
|
+
setCopyUrlMode(false);
|
|
1647
|
+
setCopyUrlTarget(null);
|
|
1648
|
+
setCopyToast(null);
|
|
1649
|
+
}
|
|
1650
|
+
async function handleCopyUrl(url, type) {
|
|
1651
|
+
try {
|
|
1652
|
+
if (copyToastTimerRef.current) {
|
|
1653
|
+
clearTimeout(copyToastTimerRef.current);
|
|
1654
|
+
copyToastTimerRef.current = null;
|
|
1655
|
+
}
|
|
1656
|
+
await copyToClipboard(url);
|
|
1657
|
+
setCopyToast(`Copied ${type} URL to clipboard`);
|
|
1658
|
+
copyToastTimerRef.current = setTimeout(() => {
|
|
1659
|
+
setCopyToast(null);
|
|
1660
|
+
copyToastTimerRef.current = null;
|
|
1661
|
+
}, 3e3);
|
|
1662
|
+
} catch (error2) {
|
|
1663
|
+
if (copyToastTimerRef.current) {
|
|
1664
|
+
clearTimeout(copyToastTimerRef.current);
|
|
1665
|
+
copyToastTimerRef.current = null;
|
|
1666
|
+
}
|
|
1667
|
+
const message = error2 instanceof Error ? error2.message : String(error2) || "Unknown error";
|
|
1668
|
+
setCopyToast(`Failed to copy ${type} URL: ${message}`);
|
|
1669
|
+
copyToastTimerRef.current = setTimeout(() => {
|
|
1670
|
+
setCopyToast(null);
|
|
1671
|
+
copyToastTimerRef.current = null;
|
|
1672
|
+
}, 5e3);
|
|
1673
|
+
throw error2;
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1356
1676
|
async function executeSync() {
|
|
1357
1677
|
if (!syncTarget || syncing) return;
|
|
1358
1678
|
try {
|
|
@@ -1413,6 +1733,22 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1413
1733
|
setArchiveError("Failed to update archive state. Check permissions.");
|
|
1414
1734
|
}
|
|
1415
1735
|
}
|
|
1736
|
+
async function executeRename(repo, newName) {
|
|
1737
|
+
if (!repo || !newName.trim()) return;
|
|
1738
|
+
try {
|
|
1739
|
+
const id = repo.id;
|
|
1740
|
+
const owner = repo.nameWithOwner.split("/")[0];
|
|
1741
|
+
const newNameWithOwner = `${owner}/${newName}`;
|
|
1742
|
+
await renameRepositoryById(client, id, newName);
|
|
1743
|
+
await updateCacheAfterRename(token, id, newName, newNameWithOwner);
|
|
1744
|
+
const updateRepo = (r) => r.id === id ? { ...r, name: newName, nameWithOwner: newNameWithOwner } : r;
|
|
1745
|
+
setItems((prev) => prev.map(updateRepo));
|
|
1746
|
+
setSearchItems((prev) => prev.map(updateRepo));
|
|
1747
|
+
closeRenameModal();
|
|
1748
|
+
} catch (error2) {
|
|
1749
|
+
throw error2;
|
|
1750
|
+
}
|
|
1751
|
+
}
|
|
1416
1752
|
async function handleVisibilityChange(newVisibility) {
|
|
1417
1753
|
if (!changeVisibilityTarget || changingVisibility) return;
|
|
1418
1754
|
try {
|
|
@@ -1506,12 +1842,12 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1506
1842
|
setDeleteError("Failed to delete repository. Ensure delete_repo scope and admin permissions.");
|
|
1507
1843
|
}
|
|
1508
1844
|
}
|
|
1509
|
-
const [filter, setFilter] =
|
|
1510
|
-
const [filterMode, setFilterMode] =
|
|
1511
|
-
const [sortKey, setSortKey] =
|
|
1512
|
-
const [sortDir, setSortDir] =
|
|
1513
|
-
const [forkTracking, setForkTracking] =
|
|
1514
|
-
const [visibilityFilter, setVisibilityFilter] =
|
|
1845
|
+
const [filter, setFilter] = useState12("");
|
|
1846
|
+
const [filterMode, setFilterMode] = useState12(false);
|
|
1847
|
+
const [sortKey, setSortKey] = useState12("updated");
|
|
1848
|
+
const [sortDir, setSortDir] = useState12("desc");
|
|
1849
|
+
const [forkTracking, setForkTracking] = useState12(true);
|
|
1850
|
+
const [visibilityFilter, setVisibilityFilter] = useState12("all");
|
|
1515
1851
|
const previousVisibilityFilter = useRef("all");
|
|
1516
1852
|
const sortFieldMap = {
|
|
1517
1853
|
"updated": "UPDATED_AT",
|
|
@@ -1664,7 +2000,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1664
2000
|
setSearchLoading(false);
|
|
1665
2001
|
}
|
|
1666
2002
|
};
|
|
1667
|
-
|
|
2003
|
+
useEffect8(() => {
|
|
1668
2004
|
const ui = getUIPrefs();
|
|
1669
2005
|
if (ui.density !== void 0) setDensity(ui.density);
|
|
1670
2006
|
if (ui.sortKey && ["updated", "pushed", "name", "stars"].includes(ui.sortKey)) {
|
|
@@ -1695,7 +2031,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1695
2031
|
}
|
|
1696
2032
|
setPrefsLoaded(true);
|
|
1697
2033
|
}, [onOrgContextChange]);
|
|
1698
|
-
|
|
2034
|
+
useEffect8(() => {
|
|
1699
2035
|
if (!prefsLoaded) return;
|
|
1700
2036
|
let policy = "cache-first";
|
|
1701
2037
|
const orgLogin = ownerContext !== "personal" ? ownerContext.login : void 0;
|
|
@@ -1715,7 +2051,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1715
2051
|
setCursor(0);
|
|
1716
2052
|
fetchPage(null, true, false, void 0, policy);
|
|
1717
2053
|
}, [client, prefsLoaded, ownerContext, ownerAffiliations]);
|
|
1718
|
-
|
|
2054
|
+
useEffect8(() => {
|
|
1719
2055
|
if (!searchActive) {
|
|
1720
2056
|
if (items.length > 0) {
|
|
1721
2057
|
let policy = "cache-first";
|
|
@@ -1754,7 +2090,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1754
2090
|
}
|
|
1755
2091
|
}
|
|
1756
2092
|
}, [sortKey, sortDir]);
|
|
1757
|
-
|
|
2093
|
+
useEffect8(() => {
|
|
1758
2094
|
if (visibilityFilter !== "all" || previousVisibilityFilter.current && previousVisibilityFilter.current !== visibilityFilter) {
|
|
1759
2095
|
if (!searchActive) {
|
|
1760
2096
|
if (items.length > 0) {
|
|
@@ -1771,7 +2107,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1771
2107
|
}
|
|
1772
2108
|
previousVisibilityFilter.current = visibilityFilter;
|
|
1773
2109
|
}, [visibilityFilter]);
|
|
1774
|
-
|
|
2110
|
+
useEffect8(() => {
|
|
1775
2111
|
if (viewerLogin && searchActive && !searchLoading && searchItems.length === 0) {
|
|
1776
2112
|
let policy = "cache-first";
|
|
1777
2113
|
try {
|
|
@@ -1792,7 +2128,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1792
2128
|
fetchSearchPage(null, true, policy);
|
|
1793
2129
|
}
|
|
1794
2130
|
}, [viewerLogin]);
|
|
1795
|
-
|
|
2131
|
+
useInput12((input, key) => {
|
|
1796
2132
|
if (error) {
|
|
1797
2133
|
if (input && input.toUpperCase() === "Q") {
|
|
1798
2134
|
try {
|
|
@@ -1804,7 +2140,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1804
2140
|
exit();
|
|
1805
2141
|
return;
|
|
1806
2142
|
}
|
|
1807
|
-
if (input && input.toUpperCase() === "R") {
|
|
2143
|
+
if (input && input.toUpperCase() === "R" && !key.ctrl) {
|
|
1808
2144
|
setCursor(0);
|
|
1809
2145
|
setRefreshing(true);
|
|
1810
2146
|
setSortingLoading(true);
|
|
@@ -1854,6 +2190,9 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1854
2190
|
}
|
|
1855
2191
|
return;
|
|
1856
2192
|
}
|
|
2193
|
+
if (renameMode) {
|
|
2194
|
+
return;
|
|
2195
|
+
}
|
|
1857
2196
|
if (archiveMode) {
|
|
1858
2197
|
if (key.escape || input && input.toUpperCase() === "C") {
|
|
1859
2198
|
closeArchiveModal();
|
|
@@ -1946,6 +2285,9 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
1946
2285
|
if (sortMode) {
|
|
1947
2286
|
return;
|
|
1948
2287
|
}
|
|
2288
|
+
if (copyUrlMode) {
|
|
2289
|
+
return;
|
|
2290
|
+
}
|
|
1949
2291
|
if (filterMode) {
|
|
1950
2292
|
if (key.escape) {
|
|
1951
2293
|
setFilterMode(false);
|
|
@@ -2017,7 +2359,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2017
2359
|
setCursor(visibleItems.length - 1);
|
|
2018
2360
|
return;
|
|
2019
2361
|
}
|
|
2020
|
-
if (input && input.toUpperCase() === "R") {
|
|
2362
|
+
if (input && input.toUpperCase() === "R" && !key.ctrl) {
|
|
2021
2363
|
setCursor(0);
|
|
2022
2364
|
setRefreshing(true);
|
|
2023
2365
|
setSortingLoading(true);
|
|
@@ -2045,6 +2387,14 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2045
2387
|
}
|
|
2046
2388
|
return;
|
|
2047
2389
|
}
|
|
2390
|
+
if (key.ctrl && (input === "r" || input === "R")) {
|
|
2391
|
+
const repo = visibleItems[cursor];
|
|
2392
|
+
if (repo) {
|
|
2393
|
+
setRenameTarget(repo);
|
|
2394
|
+
setRenameMode(true);
|
|
2395
|
+
}
|
|
2396
|
+
return;
|
|
2397
|
+
}
|
|
2048
2398
|
if (key.ctrl && (input === "v" || input === "V")) {
|
|
2049
2399
|
const repo = visibleItems[cursor];
|
|
2050
2400
|
if (repo) {
|
|
@@ -2102,6 +2452,13 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2102
2452
|
setInfoMode(true);
|
|
2103
2453
|
return;
|
|
2104
2454
|
}
|
|
2455
|
+
if (input && input.toUpperCase() === "C") {
|
|
2456
|
+
const repo = visibleItems[cursor];
|
|
2457
|
+
if (repo) {
|
|
2458
|
+
openCopyUrlModal(repo);
|
|
2459
|
+
}
|
|
2460
|
+
return;
|
|
2461
|
+
}
|
|
2105
2462
|
if (input && input.toUpperCase() === "W") {
|
|
2106
2463
|
setOrgSwitcherOpen(true);
|
|
2107
2464
|
return;
|
|
@@ -2196,12 +2553,12 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2196
2553
|
return result;
|
|
2197
2554
|
}, [searchItems, visibilityFilter]);
|
|
2198
2555
|
const visibleItems = searchActive ? filteredSearchItems : filteredAndSorted;
|
|
2199
|
-
|
|
2556
|
+
useEffect8(() => {
|
|
2200
2557
|
if (searchActive) {
|
|
2201
2558
|
addDebugMessage(`[State] searchActive=${searchActive}, searchItems=${searchItems.length}, visibleItems=${visibleItems.length}, filter="${filter}"`);
|
|
2202
2559
|
}
|
|
2203
2560
|
}, [searchActive, searchItems.length, visibleItems.length, filter]);
|
|
2204
|
-
|
|
2561
|
+
useEffect8(() => {
|
|
2205
2562
|
setCursor((c) => Math.min(c, Math.max(0, (searchActive ? searchItems.length : items.length) - 1)));
|
|
2206
2563
|
}, [searchActive, searchItems.length, items.length]);
|
|
2207
2564
|
const headerHeight = 2;
|
|
@@ -2222,7 +2579,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2222
2579
|
const end = Math.min(total, start + visibleRepos + buffer);
|
|
2223
2580
|
return { start, end };
|
|
2224
2581
|
}, [visibleItems.length, cursor, listHeight, spacingLines]);
|
|
2225
|
-
|
|
2582
|
+
useEffect8(() => {
|
|
2226
2583
|
const prefetchThreshold = Math.floor(visibleItems.length * 0.8);
|
|
2227
2584
|
const nearEnd = visibleItems.length > 0 && cursor >= prefetchThreshold;
|
|
2228
2585
|
if (searchActive) {
|
|
@@ -2243,95 +2600,95 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2243
2600
|
exec(cmd);
|
|
2244
2601
|
}
|
|
2245
2602
|
const lowRate = rateLimit && rateLimit.remaining <= Math.ceil(rateLimit.limit * 0.1);
|
|
2246
|
-
const modalOpen = deleteMode || archiveMode || syncMode || logoutMode || infoMode || visibilityMode;
|
|
2247
|
-
const headerBar = useMemo(() => /* @__PURE__ */
|
|
2248
|
-
/* @__PURE__ */
|
|
2249
|
-
/* @__PURE__ */
|
|
2603
|
+
const modalOpen = deleteMode || archiveMode || syncMode || logoutMode || infoMode || visibilityMode || renameMode || sortMode || changeVisibilityMode || copyUrlMode;
|
|
2604
|
+
const headerBar = useMemo(() => /* @__PURE__ */ jsxs15(Box15, { flexDirection: "row", justifyContent: "space-between", height: 1, marginBottom: 1, children: [
|
|
2605
|
+
/* @__PURE__ */ jsxs15(Box15, { flexDirection: "row", gap: 1, children: [
|
|
2606
|
+
/* @__PURE__ */ jsxs15(Text16, { color: "cyan", bold: !modalOpen, dimColor: modalOpen, children: [
|
|
2250
2607
|
" ",
|
|
2251
2608
|
ownerContext === "personal" ? "Personal" : ownerContext.name || ownerContext.login,
|
|
2252
2609
|
ownerContext !== "personal" && isEnterpriseOrg && " (ENT)"
|
|
2253
2610
|
] }),
|
|
2254
|
-
/* @__PURE__ */
|
|
2255
|
-
/* @__PURE__ */
|
|
2611
|
+
/* @__PURE__ */ jsx16(Text16, { bold: true, color: modalOpen ? "gray" : void 0, dimColor: modalOpen ? true : void 0, children: "Repositories" }),
|
|
2612
|
+
/* @__PURE__ */ jsxs15(Text16, { color: "gray", children: [
|
|
2256
2613
|
"(",
|
|
2257
2614
|
visibleItems.length,
|
|
2258
2615
|
"/",
|
|
2259
2616
|
searchActive ? searchTotalCount : totalCount,
|
|
2260
2617
|
")"
|
|
2261
2618
|
] }),
|
|
2262
|
-
(loading || searchLoading) && /* @__PURE__ */
|
|
2619
|
+
(loading || searchLoading) && /* @__PURE__ */ jsx16(Box15, { width: 2, flexShrink: 0, flexGrow: 0, marginLeft: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "yellow", children: /* @__PURE__ */ jsx16(SlowSpinner, {}) }) })
|
|
2263
2620
|
] }),
|
|
2264
|
-
rateLimit && /* @__PURE__ */
|
|
2621
|
+
rateLimit && /* @__PURE__ */ jsxs15(Text16, { color: lowRate ? "yellow" : "gray", children: [
|
|
2265
2622
|
"API: ",
|
|
2266
2623
|
rateLimit.remaining,
|
|
2267
2624
|
"/",
|
|
2268
2625
|
rateLimit.limit,
|
|
2269
|
-
prevRateLimit !== void 0 && prevRateLimit !== rateLimit.remaining && /* @__PURE__ */
|
|
2626
|
+
prevRateLimit !== void 0 && prevRateLimit !== rateLimit.remaining && /* @__PURE__ */ jsx16(Text16, { color: rateLimit.remaining < prevRateLimit ? "red" : "green", children: ` (${rateLimit.remaining - prevRateLimit > 0 ? "+" : ""}${rateLimit.remaining - prevRateLimit})` }),
|
|
2270
2627
|
" "
|
|
2271
2628
|
] })
|
|
2272
2629
|
] }), [visibleItems.length, searchActive, searchTotalCount, totalCount, loading, searchLoading, rateLimit, lowRate, modalOpen, prevRateLimit, ownerContext, isEnterpriseOrg]);
|
|
2273
2630
|
if (error) {
|
|
2274
|
-
return /* @__PURE__ */
|
|
2275
|
-
/* @__PURE__ */
|
|
2276
|
-
/* @__PURE__ */
|
|
2277
|
-
/* @__PURE__ */
|
|
2631
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", height: availableHeight, children: [
|
|
2632
|
+
/* @__PURE__ */ jsx16(Box15, { flexDirection: "row", justifyContent: "space-between", height: 1, marginBottom: 1, children: /* @__PURE__ */ jsxs15(Box15, { flexDirection: "row", gap: 1, children: [
|
|
2633
|
+
/* @__PURE__ */ jsx16(Text16, { bold: true, children: " Repositories" }),
|
|
2634
|
+
/* @__PURE__ */ jsx16(Text16, { color: "red", children: "(Error)" })
|
|
2278
2635
|
] }) }),
|
|
2279
|
-
/* @__PURE__ */
|
|
2280
|
-
/* @__PURE__ */
|
|
2281
|
-
/* @__PURE__ */
|
|
2636
|
+
/* @__PURE__ */ jsx16(Box15, { borderStyle: "single", borderColor: "red", paddingX: 1, paddingY: 1, marginX: 1, height: contentHeight + containerPadding + 2, flexDirection: "column", children: /* @__PURE__ */ jsx16(Box15, { height: contentHeight, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", alignItems: "center", children: [
|
|
2637
|
+
/* @__PURE__ */ jsx16(Text16, { color: "red", children: error }),
|
|
2638
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "gray", dimColor: true, children: "Press R to retry \u2022 Ctrl+L to logout \u2022 Q to quit" }) })
|
|
2282
2639
|
] }) }) }),
|
|
2283
|
-
/* @__PURE__ */
|
|
2640
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, paddingX: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "gray", children: "Press R to retry \u2022 Ctrl+L to logout \u2022 Q to quit" }) })
|
|
2284
2641
|
] });
|
|
2285
2642
|
}
|
|
2286
2643
|
if (loading && items.length === 0 || sortingLoading) {
|
|
2287
|
-
return /* @__PURE__ */
|
|
2288
|
-
/* @__PURE__ */
|
|
2289
|
-
/* @__PURE__ */
|
|
2290
|
-
/* @__PURE__ */
|
|
2644
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", height: availableHeight, children: [
|
|
2645
|
+
/* @__PURE__ */ jsx16(Box15, { flexDirection: "row", justifyContent: "space-between", height: 1, marginBottom: 1, children: /* @__PURE__ */ jsxs15(Box15, { flexDirection: "row", gap: 1, children: [
|
|
2646
|
+
/* @__PURE__ */ jsx16(Text16, { bold: true, children: " Repositories" }),
|
|
2647
|
+
/* @__PURE__ */ jsx16(Text16, { color: "gray", children: "(Loading...)" })
|
|
2291
2648
|
] }) }),
|
|
2292
|
-
/* @__PURE__ */
|
|
2293
|
-
/* @__PURE__ */
|
|
2294
|
-
/* @__PURE__ */
|
|
2295
|
-
/* @__PURE__ */
|
|
2649
|
+
/* @__PURE__ */ jsx16(Box15, { borderStyle: "single", borderColor: "yellow", paddingX: 1, paddingY: 1, marginX: 1, height: contentHeight + containerPadding + 2, flexDirection: "column", children: /* @__PURE__ */ jsx16(Box15, { height: contentHeight, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsx16(Box15, { flexDirection: "column", alignItems: "center", children: /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", alignItems: "center", children: [
|
|
2650
|
+
/* @__PURE__ */ jsxs15(Box15, { height: 1, flexDirection: "row", children: [
|
|
2651
|
+
/* @__PURE__ */ jsx16(Box15, { width: 2, flexShrink: 0, flexGrow: 0, children: /* @__PURE__ */ jsx16(Text16, { color: "cyan", children: /* @__PURE__ */ jsx16(SlowSpinner, {}) }) }),
|
|
2652
|
+
/* @__PURE__ */ jsx16(Text16, { color: "cyan", children: refreshing ? "Refreshing..." : sortingLoading ? "Applying sort..." : "Loading repositories..." })
|
|
2296
2653
|
] }),
|
|
2297
|
-
/* @__PURE__ */
|
|
2654
|
+
/* @__PURE__ */ jsx16(Box15, { height: 1, marginTop: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "gray", children: refreshing ? "Fetching latest repository data" : sortingLoading ? `Sorting by ${sortKey} (${sortDir === "asc" ? "ascending" : "descending"})` : "Fetching your GitHub repositories" }) })
|
|
2298
2655
|
] }) }) }) }),
|
|
2299
|
-
/* @__PURE__ */
|
|
2656
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, paddingX: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "gray", children: "Please wait..." }) })
|
|
2300
2657
|
] });
|
|
2301
2658
|
}
|
|
2302
|
-
return /* @__PURE__ */
|
|
2659
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", height: availableHeight, children: [
|
|
2303
2660
|
headerBar,
|
|
2304
|
-
/* @__PURE__ */
|
|
2661
|
+
/* @__PURE__ */ jsx16(Box15, { borderStyle: "single", borderColor: modalOpen ? "gray" : "yellow", paddingX: 1, paddingY: 1, marginX: 1, height: contentHeight + containerPadding + 2, flexDirection: "column", children: deleteMode && deleteTarget ? (
|
|
2305
2662
|
// Centered modal; hide list content while modal is open
|
|
2306
|
-
/* @__PURE__ */
|
|
2307
|
-
/* @__PURE__ */
|
|
2308
|
-
/* @__PURE__ */
|
|
2309
|
-
/* @__PURE__ */
|
|
2663
|
+
/* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", borderStyle: "round", borderColor: "red", paddingX: 3, paddingY: 2, width: Math.min(terminalWidth - 8, 80), children: [
|
|
2664
|
+
/* @__PURE__ */ jsx16(Text16, { bold: true, children: "Delete Confirmation" }),
|
|
2665
|
+
/* @__PURE__ */ jsx16(Text16, { color: "red", children: "\u26A0\uFE0F Delete repository?" }),
|
|
2666
|
+
/* @__PURE__ */ jsx16(Box15, { height: 2, children: /* @__PURE__ */ jsx16(Text16, { children: " " }) }),
|
|
2310
2667
|
(() => {
|
|
2311
2668
|
const langName = deleteTarget.primaryLanguage?.name || "";
|
|
2312
2669
|
const langColor = deleteTarget.primaryLanguage?.color || "#666666";
|
|
2313
2670
|
let line1 = "";
|
|
2314
|
-
line1 +=
|
|
2315
|
-
if (deleteTarget.isPrivate) line1 +=
|
|
2316
|
-
if (deleteTarget.isArchived) line1 +=
|
|
2317
|
-
if (deleteTarget.isFork && deleteTarget.parent) line1 +=
|
|
2671
|
+
line1 += chalk12.white(deleteTarget.nameWithOwner);
|
|
2672
|
+
if (deleteTarget.isPrivate) line1 += chalk12.yellow(" Private");
|
|
2673
|
+
if (deleteTarget.isArchived) line1 += chalk12.gray.dim(" Archived");
|
|
2674
|
+
if (deleteTarget.isFork && deleteTarget.parent) line1 += chalk12.blue(` Fork of ${deleteTarget.parent.nameWithOwner}`);
|
|
2318
2675
|
let line2 = "";
|
|
2319
|
-
if (langName) line2 +=
|
|
2320
|
-
line2 +=
|
|
2321
|
-
return /* @__PURE__ */
|
|
2322
|
-
/* @__PURE__ */
|
|
2323
|
-
/* @__PURE__ */
|
|
2676
|
+
if (langName) line2 += chalk12.hex(langColor)("\u25CF ") + chalk12.gray(`${langName} `);
|
|
2677
|
+
line2 += chalk12.gray(`\u2605 ${deleteTarget.stargazerCount} \u2442 ${deleteTarget.forkCount} Updated ${formatDate(deleteTarget.updatedAt)}`);
|
|
2678
|
+
return /* @__PURE__ */ jsxs15(Fragment8, { children: [
|
|
2679
|
+
/* @__PURE__ */ jsx16(Text16, { children: line1 }),
|
|
2680
|
+
/* @__PURE__ */ jsx16(Text16, { children: line2 })
|
|
2324
2681
|
] });
|
|
2325
2682
|
})(),
|
|
2326
|
-
/* @__PURE__ */
|
|
2683
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsxs15(Text16, { children: [
|
|
2327
2684
|
"Type ",
|
|
2328
|
-
/* @__PURE__ */
|
|
2685
|
+
/* @__PURE__ */ jsx16(Text16, { color: "yellow", bold: true, children: deleteCode }),
|
|
2329
2686
|
" to confirm."
|
|
2330
2687
|
] }) }),
|
|
2331
|
-
!deleteConfirmStage && /* @__PURE__ */
|
|
2332
|
-
/* @__PURE__ */
|
|
2333
|
-
/* @__PURE__ */
|
|
2334
|
-
|
|
2688
|
+
!deleteConfirmStage && /* @__PURE__ */ jsxs15(Box15, { marginTop: 1, children: [
|
|
2689
|
+
/* @__PURE__ */ jsx16(Text16, { children: "Confirm code: " }),
|
|
2690
|
+
/* @__PURE__ */ jsx16(
|
|
2691
|
+
TextInput5,
|
|
2335
2692
|
{
|
|
2336
2693
|
value: typedCode,
|
|
2337
2694
|
onChange: (v) => {
|
|
@@ -2357,11 +2714,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2357
2714
|
}
|
|
2358
2715
|
)
|
|
2359
2716
|
] }),
|
|
2360
|
-
deleteConfirmStage && /* @__PURE__ */
|
|
2361
|
-
/* @__PURE__ */
|
|
2362
|
-
/* @__PURE__ */
|
|
2363
|
-
/* @__PURE__ */
|
|
2364
|
-
|
|
2717
|
+
deleteConfirmStage && /* @__PURE__ */ jsxs15(Box15, { marginTop: 1, flexDirection: "column", children: [
|
|
2718
|
+
/* @__PURE__ */ jsx16(Text16, { color: "red", children: "This action will permanently delete the repository. This cannot be undone." }),
|
|
2719
|
+
/* @__PURE__ */ jsxs15(Box15, { marginTop: 1, flexDirection: "row", justifyContent: "center", gap: 6, children: [
|
|
2720
|
+
/* @__PURE__ */ jsx16(
|
|
2721
|
+
Box15,
|
|
2365
2722
|
{
|
|
2366
2723
|
borderStyle: "round",
|
|
2367
2724
|
borderColor: "red",
|
|
@@ -2370,11 +2727,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2370
2727
|
alignItems: "center",
|
|
2371
2728
|
justifyContent: "center",
|
|
2372
2729
|
flexDirection: "column",
|
|
2373
|
-
children: /* @__PURE__ */
|
|
2730
|
+
children: /* @__PURE__ */ jsx16(Text16, { children: confirmFocus === "delete" ? chalk12.bgRed.white.bold(" Delete ") : chalk12.red.bold("Delete") })
|
|
2374
2731
|
}
|
|
2375
2732
|
),
|
|
2376
|
-
/* @__PURE__ */
|
|
2377
|
-
|
|
2733
|
+
/* @__PURE__ */ jsx16(
|
|
2734
|
+
Box15,
|
|
2378
2735
|
{
|
|
2379
2736
|
borderStyle: "round",
|
|
2380
2737
|
borderColor: confirmFocus === "cancel" ? "white" : "gray",
|
|
@@ -2383,17 +2740,17 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2383
2740
|
alignItems: "center",
|
|
2384
2741
|
justifyContent: "center",
|
|
2385
2742
|
flexDirection: "column",
|
|
2386
|
-
children: /* @__PURE__ */
|
|
2743
|
+
children: /* @__PURE__ */ jsx16(Text16, { children: confirmFocus === "cancel" ? chalk12.bgGray.white.bold(" Cancel ") : chalk12.gray.bold("Cancel") })
|
|
2387
2744
|
}
|
|
2388
2745
|
)
|
|
2389
2746
|
] }),
|
|
2390
|
-
/* @__PURE__ */
|
|
2747
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs15(Text16, { color: "gray", children: [
|
|
2391
2748
|
"Press Enter to ",
|
|
2392
2749
|
confirmFocus === "delete" ? "Delete" : "Cancel",
|
|
2393
2750
|
" | Y to Delete | C to Cancel"
|
|
2394
2751
|
] }) }),
|
|
2395
|
-
/* @__PURE__ */
|
|
2396
|
-
|
|
2752
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(
|
|
2753
|
+
TextInput5,
|
|
2397
2754
|
{
|
|
2398
2755
|
value: "",
|
|
2399
2756
|
onChange: () => {
|
|
@@ -2406,18 +2763,18 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2406
2763
|
}
|
|
2407
2764
|
) })
|
|
2408
2765
|
] }),
|
|
2409
|
-
deleteError && /* @__PURE__ */
|
|
2410
|
-
deleting && /* @__PURE__ */
|
|
2766
|
+
deleteError && /* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "magenta", children: deleteError }) }),
|
|
2767
|
+
deleting && /* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "yellow", children: "Deleting..." }) })
|
|
2411
2768
|
] }) })
|
|
2412
|
-
) : archiveMode && archiveTarget ? /* @__PURE__ */
|
|
2413
|
-
/* @__PURE__ */
|
|
2414
|
-
/* @__PURE__ */
|
|
2415
|
-
/* @__PURE__ */
|
|
2416
|
-
/* @__PURE__ */
|
|
2417
|
-
/* @__PURE__ */
|
|
2418
|
-
/* @__PURE__ */
|
|
2419
|
-
/* @__PURE__ */
|
|
2420
|
-
|
|
2769
|
+
) : archiveMode && archiveTarget ? /* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", borderStyle: "round", borderColor: archiveTarget.isArchived ? "green" : "yellow", paddingX: 3, paddingY: 2, width: Math.min(terminalWidth - 8, 80), children: [
|
|
2770
|
+
/* @__PURE__ */ jsx16(Text16, { bold: true, children: archiveTarget.isArchived ? "Unarchive Confirmation" : "Archive Confirmation" }),
|
|
2771
|
+
/* @__PURE__ */ jsx16(Text16, { color: archiveTarget.isArchived ? "green" : "yellow", children: archiveTarget.isArchived ? "\u21BA Unarchive repository?" : "\u26A0\uFE0F Archive repository?" }),
|
|
2772
|
+
/* @__PURE__ */ jsx16(Box15, { height: 1, children: /* @__PURE__ */ jsx16(Text16, { children: " " }) }),
|
|
2773
|
+
/* @__PURE__ */ jsx16(Text16, { children: archiveTarget.nameWithOwner }),
|
|
2774
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text16, { children: archiveTarget.isArchived ? "This will make the repository active again." : "This will make the repository read-only." }) }),
|
|
2775
|
+
/* @__PURE__ */ jsxs15(Box15, { marginTop: 1, flexDirection: "row", justifyContent: "center", gap: 6, children: [
|
|
2776
|
+
/* @__PURE__ */ jsx16(
|
|
2777
|
+
Box15,
|
|
2421
2778
|
{
|
|
2422
2779
|
borderStyle: "round",
|
|
2423
2780
|
borderColor: archiveTarget.isArchived ? "green" : "yellow",
|
|
@@ -2426,11 +2783,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2426
2783
|
alignItems: "center",
|
|
2427
2784
|
justifyContent: "center",
|
|
2428
2785
|
flexDirection: "column",
|
|
2429
|
-
children: /* @__PURE__ */
|
|
2786
|
+
children: /* @__PURE__ */ jsx16(Text16, { children: archiveFocus === "confirm" ? chalk12.bgGreen.white.bold(` ${archiveTarget.isArchived ? "Unarchive" : "Archive"} `) : chalk12.bold[archiveTarget.isArchived ? "green" : "yellow"](archiveTarget.isArchived ? "Unarchive" : "Archive") })
|
|
2430
2787
|
}
|
|
2431
2788
|
),
|
|
2432
|
-
/* @__PURE__ */
|
|
2433
|
-
|
|
2789
|
+
/* @__PURE__ */ jsx16(
|
|
2790
|
+
Box15,
|
|
2434
2791
|
{
|
|
2435
2792
|
borderStyle: "round",
|
|
2436
2793
|
borderColor: archiveFocus === "cancel" ? "white" : "gray",
|
|
@@ -2439,19 +2796,19 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2439
2796
|
alignItems: "center",
|
|
2440
2797
|
justifyContent: "center",
|
|
2441
2798
|
flexDirection: "column",
|
|
2442
|
-
children: /* @__PURE__ */
|
|
2799
|
+
children: /* @__PURE__ */ jsx16(Text16, { children: archiveFocus === "cancel" ? chalk12.bgGray.white.bold(" Cancel ") : chalk12.gray.bold("Cancel") })
|
|
2443
2800
|
}
|
|
2444
2801
|
)
|
|
2445
2802
|
] }),
|
|
2446
|
-
/* @__PURE__ */
|
|
2803
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs15(Text16, { color: "gray", children: [
|
|
2447
2804
|
"Press Enter to ",
|
|
2448
2805
|
archiveFocus === "confirm" ? archiveTarget.isArchived ? "Unarchive" : "Archive" : "Cancel",
|
|
2449
2806
|
" | Y to ",
|
|
2450
2807
|
archiveTarget.isArchived ? "Unarchive" : "Archive",
|
|
2451
2808
|
" | C to Cancel"
|
|
2452
2809
|
] }) }),
|
|
2453
|
-
/* @__PURE__ */
|
|
2454
|
-
|
|
2810
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(
|
|
2811
|
+
TextInput5,
|
|
2455
2812
|
{
|
|
2456
2813
|
value: "",
|
|
2457
2814
|
onChange: () => {
|
|
@@ -2465,21 +2822,28 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2465
2822
|
}
|
|
2466
2823
|
}
|
|
2467
2824
|
) }),
|
|
2468
|
-
archiveError && /* @__PURE__ */
|
|
2469
|
-
archiving && /* @__PURE__ */
|
|
2470
|
-
] }) }) :
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2825
|
+
archiveError && /* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "magenta", children: archiveError }) }),
|
|
2826
|
+
archiving && /* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "yellow", children: archiveTarget.isArchived ? "Unarchiving..." : "Archiving..." }) })
|
|
2827
|
+
] }) }) : renameMode && renameTarget ? /* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx16(
|
|
2828
|
+
RenameModal,
|
|
2829
|
+
{
|
|
2830
|
+
repo: renameTarget,
|
|
2831
|
+
onRename: executeRename,
|
|
2832
|
+
onCancel: closeRenameModal
|
|
2833
|
+
}
|
|
2834
|
+
) }) : syncMode && syncTarget ? /* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", borderStyle: "round", borderColor: "blue", paddingX: 3, paddingY: 2, width: Math.min(terminalWidth - 8, 80), children: [
|
|
2835
|
+
/* @__PURE__ */ jsx16(Text16, { bold: true, children: "Sync Fork Confirmation" }),
|
|
2836
|
+
/* @__PURE__ */ jsx16(Text16, { color: "blue", children: "\u27F2 Sync fork with upstream?" }),
|
|
2837
|
+
/* @__PURE__ */ jsx16(Box15, { height: 1, children: /* @__PURE__ */ jsx16(Text16, { children: " " }) }),
|
|
2838
|
+
/* @__PURE__ */ jsx16(Text16, { children: syncTarget.nameWithOwner }),
|
|
2839
|
+
syncTarget.parent && /* @__PURE__ */ jsxs15(Text16, { color: "gray", children: [
|
|
2476
2840
|
"Upstream: ",
|
|
2477
2841
|
syncTarget.parent.nameWithOwner
|
|
2478
2842
|
] }),
|
|
2479
|
-
/* @__PURE__ */
|
|
2480
|
-
/* @__PURE__ */
|
|
2481
|
-
/* @__PURE__ */
|
|
2482
|
-
|
|
2843
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text16, { children: "This will merge upstream changes into your fork." }) }),
|
|
2844
|
+
/* @__PURE__ */ jsxs15(Box15, { marginTop: 1, flexDirection: "row", justifyContent: "center", gap: 6, children: [
|
|
2845
|
+
/* @__PURE__ */ jsx16(
|
|
2846
|
+
Box15,
|
|
2483
2847
|
{
|
|
2484
2848
|
borderStyle: "round",
|
|
2485
2849
|
borderColor: "blue",
|
|
@@ -2488,11 +2852,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2488
2852
|
alignItems: "center",
|
|
2489
2853
|
justifyContent: "center",
|
|
2490
2854
|
flexDirection: "column",
|
|
2491
|
-
children: /* @__PURE__ */
|
|
2855
|
+
children: /* @__PURE__ */ jsx16(Text16, { children: syncFocus === "confirm" ? chalk12.bgBlue.white.bold(" Sync ") : chalk12.blue.bold("Sync") })
|
|
2492
2856
|
}
|
|
2493
2857
|
),
|
|
2494
|
-
/* @__PURE__ */
|
|
2495
|
-
|
|
2858
|
+
/* @__PURE__ */ jsx16(
|
|
2859
|
+
Box15,
|
|
2496
2860
|
{
|
|
2497
2861
|
borderStyle: "round",
|
|
2498
2862
|
borderColor: syncFocus === "cancel" ? "white" : "gray",
|
|
@@ -2501,17 +2865,17 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2501
2865
|
alignItems: "center",
|
|
2502
2866
|
justifyContent: "center",
|
|
2503
2867
|
flexDirection: "column",
|
|
2504
|
-
children: /* @__PURE__ */
|
|
2868
|
+
children: /* @__PURE__ */ jsx16(Text16, { children: syncFocus === "cancel" ? chalk12.bgGray.white.bold(" Cancel ") : chalk12.gray.bold("Cancel") })
|
|
2505
2869
|
}
|
|
2506
2870
|
)
|
|
2507
2871
|
] }),
|
|
2508
|
-
/* @__PURE__ */
|
|
2872
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs15(Text16, { color: "gray", children: [
|
|
2509
2873
|
"Press Enter to ",
|
|
2510
2874
|
syncFocus === "confirm" ? "Sync" : "Cancel",
|
|
2511
2875
|
" | Y to Sync | C to Cancel"
|
|
2512
2876
|
] }) }),
|
|
2513
|
-
/* @__PURE__ */
|
|
2514
|
-
|
|
2877
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(
|
|
2878
|
+
TextInput5,
|
|
2515
2879
|
{
|
|
2516
2880
|
value: "",
|
|
2517
2881
|
onChange: () => {
|
|
@@ -2525,14 +2889,14 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2525
2889
|
}
|
|
2526
2890
|
}
|
|
2527
2891
|
) }),
|
|
2528
|
-
syncError && /* @__PURE__ */
|
|
2529
|
-
syncing && /* @__PURE__ */
|
|
2530
|
-
] }) }) : logoutMode ? /* @__PURE__ */
|
|
2531
|
-
/* @__PURE__ */
|
|
2532
|
-
/* @__PURE__ */
|
|
2533
|
-
/* @__PURE__ */
|
|
2534
|
-
/* @__PURE__ */
|
|
2535
|
-
|
|
2892
|
+
syncError && /* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "magenta", children: syncError }) }),
|
|
2893
|
+
syncing && /* @__PURE__ */ jsx16(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "yellow", children: "Syncing..." }) })
|
|
2894
|
+
] }) }) : logoutMode ? /* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 3, paddingY: 2, width: Math.min(terminalWidth - 8, 80), children: [
|
|
2895
|
+
/* @__PURE__ */ jsx16(Text16, { bold: true, children: "Logout Confirmation" }),
|
|
2896
|
+
/* @__PURE__ */ jsx16(Text16, { color: "cyan", children: "Are you sure you want to log out?" }),
|
|
2897
|
+
/* @__PURE__ */ jsxs15(Box15, { marginTop: 1, flexDirection: "row", justifyContent: "center", gap: 6, children: [
|
|
2898
|
+
/* @__PURE__ */ jsx16(
|
|
2899
|
+
Box15,
|
|
2536
2900
|
{
|
|
2537
2901
|
borderStyle: "round",
|
|
2538
2902
|
borderColor: "cyan",
|
|
@@ -2541,11 +2905,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2541
2905
|
alignItems: "center",
|
|
2542
2906
|
justifyContent: "center",
|
|
2543
2907
|
flexDirection: "column",
|
|
2544
|
-
children: /* @__PURE__ */
|
|
2908
|
+
children: /* @__PURE__ */ jsx16(Text16, { children: logoutFocus === "confirm" ? chalk12.bgCyan.white.bold(" Logout ") : chalk12.cyan.bold("Logout") })
|
|
2545
2909
|
}
|
|
2546
2910
|
),
|
|
2547
|
-
/* @__PURE__ */
|
|
2548
|
-
|
|
2911
|
+
/* @__PURE__ */ jsx16(
|
|
2912
|
+
Box15,
|
|
2549
2913
|
{
|
|
2550
2914
|
borderStyle: "round",
|
|
2551
2915
|
borderColor: logoutFocus === "cancel" ? "white" : "gray",
|
|
@@ -2554,16 +2918,16 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2554
2918
|
alignItems: "center",
|
|
2555
2919
|
justifyContent: "center",
|
|
2556
2920
|
flexDirection: "column",
|
|
2557
|
-
children: /* @__PURE__ */
|
|
2921
|
+
children: /* @__PURE__ */ jsx16(Text16, { children: logoutFocus === "cancel" ? chalk12.bgGray.white.bold(" Cancel ") : chalk12.gray.bold("Cancel") })
|
|
2558
2922
|
}
|
|
2559
2923
|
)
|
|
2560
2924
|
] }),
|
|
2561
|
-
/* @__PURE__ */
|
|
2925
|
+
/* @__PURE__ */ jsx16(Box15, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs15(Text16, { color: "gray", children: [
|
|
2562
2926
|
"Press Enter to ",
|
|
2563
2927
|
logoutFocus === "confirm" ? "Logout" : "Cancel",
|
|
2564
2928
|
" | Y to Logout | C to Cancel"
|
|
2565
2929
|
] }) })
|
|
2566
|
-
] }) }) : orgSwitcherOpen ? /* @__PURE__ */
|
|
2930
|
+
] }) }) : orgSwitcherOpen ? /* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx16(
|
|
2567
2931
|
OrgSwitcher,
|
|
2568
2932
|
{
|
|
2569
2933
|
token,
|
|
@@ -2571,45 +2935,45 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2571
2935
|
onSelect: handleOrgContextChange,
|
|
2572
2936
|
onClose: () => setOrgSwitcherOpen(false)
|
|
2573
2937
|
}
|
|
2574
|
-
) }) : infoMode ? /* @__PURE__ */
|
|
2938
|
+
) }) : infoMode ? /* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: (() => {
|
|
2575
2939
|
const repo = infoRepo || visibleItems[cursor];
|
|
2576
|
-
if (!repo) return /* @__PURE__ */
|
|
2940
|
+
if (!repo) return /* @__PURE__ */ jsx16(Text16, { color: "red", children: "No repository selected." });
|
|
2577
2941
|
const langName = repo.primaryLanguage?.name || "N/A";
|
|
2578
2942
|
const langColor = repo.primaryLanguage?.color || "#666666";
|
|
2579
|
-
return /* @__PURE__ */
|
|
2580
|
-
/* @__PURE__ */
|
|
2943
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", borderStyle: "round", borderColor: "magenta", paddingX: 3, paddingY: 2, width: Math.min(terminalWidth - 8, 90), children: [
|
|
2944
|
+
/* @__PURE__ */ jsxs15(Text16, { bold: true, children: [
|
|
2581
2945
|
"Repository Info ",
|
|
2582
|
-
infoRepo ?
|
|
2946
|
+
infoRepo ? chalk12.dim("(cached)") : ""
|
|
2583
2947
|
] }),
|
|
2584
|
-
/* @__PURE__ */
|
|
2585
|
-
/* @__PURE__ */
|
|
2586
|
-
repo.description && /* @__PURE__ */
|
|
2587
|
-
/* @__PURE__ */
|
|
2588
|
-
/* @__PURE__ */
|
|
2589
|
-
repo.visibility === "PRIVATE" ?
|
|
2590
|
-
repo.isArchived ?
|
|
2591
|
-
repo.isFork ?
|
|
2948
|
+
/* @__PURE__ */ jsx16(Box15, { height: 1, children: /* @__PURE__ */ jsx16(Text16, { children: " " }) }),
|
|
2949
|
+
/* @__PURE__ */ jsx16(Text16, { children: chalk12.bold(repo.nameWithOwner) }),
|
|
2950
|
+
repo.description && /* @__PURE__ */ jsx16(Text16, { color: "gray", children: repo.description }),
|
|
2951
|
+
/* @__PURE__ */ jsx16(Box15, { height: 1, children: /* @__PURE__ */ jsx16(Text16, { children: " " }) }),
|
|
2952
|
+
/* @__PURE__ */ jsxs15(Text16, { children: [
|
|
2953
|
+
repo.visibility === "PRIVATE" ? chalk12.yellow("Private") : repo.visibility === "INTERNAL" ? chalk12.magenta("Internal") : chalk12.green("Public"),
|
|
2954
|
+
repo.isArchived ? chalk12.gray(" Archived") : "",
|
|
2955
|
+
repo.isFork ? chalk12.blue(" Fork") : ""
|
|
2592
2956
|
] }),
|
|
2593
|
-
/* @__PURE__ */
|
|
2594
|
-
/* @__PURE__ */
|
|
2595
|
-
|
|
2596
|
-
|
|
2957
|
+
/* @__PURE__ */ jsx16(Text16, { children: chalk12.gray(`\u2605 ${repo.stargazerCount} \u2442 ${repo.forkCount}`) }),
|
|
2958
|
+
/* @__PURE__ */ jsxs15(Text16, { children: [
|
|
2959
|
+
chalk12.hex(langColor)(`\u25CF `),
|
|
2960
|
+
chalk12.gray(`${langName}`)
|
|
2597
2961
|
] }),
|
|
2598
|
-
/* @__PURE__ */
|
|
2962
|
+
/* @__PURE__ */ jsxs15(Text16, { color: "gray", children: [
|
|
2599
2963
|
"Updated: ",
|
|
2600
2964
|
formatDate(repo.updatedAt),
|
|
2601
2965
|
" \u2022 Pushed: ",
|
|
2602
2966
|
formatDate(repo.pushedAt)
|
|
2603
2967
|
] }),
|
|
2604
|
-
/* @__PURE__ */
|
|
2968
|
+
/* @__PURE__ */ jsxs15(Text16, { color: "gray", children: [
|
|
2605
2969
|
"Size: ",
|
|
2606
2970
|
repo.diskUsage,
|
|
2607
2971
|
" KB"
|
|
2608
2972
|
] }),
|
|
2609
|
-
/* @__PURE__ */
|
|
2610
|
-
/* @__PURE__ */
|
|
2973
|
+
/* @__PURE__ */ jsx16(Box15, { height: 1, children: /* @__PURE__ */ jsx16(Text16, { children: " " }) }),
|
|
2974
|
+
/* @__PURE__ */ jsx16(Text16, { color: "gray", children: "Press Esc or I to close" })
|
|
2611
2975
|
] });
|
|
2612
|
-
})() }) : visibilityMode ? /* @__PURE__ */
|
|
2976
|
+
})() }) : visibilityMode ? /* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx16(
|
|
2613
2977
|
VisibilityModal,
|
|
2614
2978
|
{
|
|
2615
2979
|
currentFilter: visibilityFilter,
|
|
@@ -2622,7 +2986,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2622
2986
|
},
|
|
2623
2987
|
onCancel: () => setVisibilityMode(false)
|
|
2624
2988
|
}
|
|
2625
|
-
) }) : sortMode ? /* @__PURE__ */
|
|
2989
|
+
) }) : sortMode ? /* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx16(
|
|
2626
2990
|
SortModal,
|
|
2627
2991
|
{
|
|
2628
2992
|
currentSort: sortKey,
|
|
@@ -2634,7 +2998,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2634
2998
|
},
|
|
2635
2999
|
onCancel: () => setSortMode(false)
|
|
2636
3000
|
}
|
|
2637
|
-
) }) : changeVisibilityMode && changeVisibilityTarget ? /* @__PURE__ */
|
|
3001
|
+
) }) : changeVisibilityMode && changeVisibilityTarget ? /* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx16(
|
|
2638
3002
|
ChangeVisibilityModal,
|
|
2639
3003
|
{
|
|
2640
3004
|
isOpen: changeVisibilityMode,
|
|
@@ -2647,8 +3011,16 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2647
3011
|
changing: changingVisibility,
|
|
2648
3012
|
error: changeVisibilityError
|
|
2649
3013
|
}
|
|
2650
|
-
) }) : /* @__PURE__ */
|
|
2651
|
-
|
|
3014
|
+
) }) : copyUrlMode ? /* @__PURE__ */ jsx16(Box15, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx16(
|
|
3015
|
+
CopyUrlModal,
|
|
3016
|
+
{
|
|
3017
|
+
repo: copyUrlTarget,
|
|
3018
|
+
terminalWidth,
|
|
3019
|
+
onClose: closeCopyUrlModal,
|
|
3020
|
+
onCopy: handleCopyUrl
|
|
3021
|
+
}
|
|
3022
|
+
) }) : /* @__PURE__ */ jsxs15(Fragment8, { children: [
|
|
3023
|
+
/* @__PURE__ */ jsx16(
|
|
2652
3024
|
RepoListHeader,
|
|
2653
3025
|
{
|
|
2654
3026
|
ownerContext,
|
|
@@ -2662,10 +3034,10 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2662
3034
|
isEnterprise: isEnterpriseOrg
|
|
2663
3035
|
}
|
|
2664
3036
|
),
|
|
2665
|
-
filterMode && /* @__PURE__ */
|
|
2666
|
-
/* @__PURE__ */
|
|
2667
|
-
/* @__PURE__ */
|
|
2668
|
-
|
|
3037
|
+
filterMode && /* @__PURE__ */ jsxs15(Box15, { marginBottom: 1, children: [
|
|
3038
|
+
/* @__PURE__ */ jsx16(Text16, { children: "Search: " }),
|
|
3039
|
+
/* @__PURE__ */ jsx16(
|
|
3040
|
+
TextInput5,
|
|
2669
3041
|
{
|
|
2670
3042
|
value: filter,
|
|
2671
3043
|
onChange: (val) => {
|
|
@@ -2704,10 +3076,10 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2704
3076
|
}
|
|
2705
3077
|
)
|
|
2706
3078
|
] }),
|
|
2707
|
-
/* @__PURE__ */
|
|
2708
|
-
filterMode && filter.trim().length > 0 && filter.trim().length < 3 ? /* @__PURE__ */
|
|
3079
|
+
/* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", height: listHeight, children: [
|
|
3080
|
+
filterMode && filter.trim().length > 0 && filter.trim().length < 3 ? /* @__PURE__ */ jsx16(Box15, { justifyContent: "center", alignItems: "center", flexGrow: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "gray", dimColor: true, children: "Type at least 3 characters to search" }) }) : visibleItems.slice(windowed.start, windowed.end).map((repo, i) => {
|
|
2709
3081
|
const idx = windowed.start + i;
|
|
2710
|
-
return /* @__PURE__ */
|
|
3082
|
+
return /* @__PURE__ */ jsx16(
|
|
2711
3083
|
RepoRow,
|
|
2712
3084
|
{
|
|
2713
3085
|
repo,
|
|
@@ -2720,32 +3092,33 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2720
3092
|
repo.nameWithOwner
|
|
2721
3093
|
);
|
|
2722
3094
|
}),
|
|
2723
|
-
loadingMore && hasNextPage && /* @__PURE__ */
|
|
2724
|
-
/* @__PURE__ */
|
|
2725
|
-
/* @__PURE__ */
|
|
3095
|
+
loadingMore && hasNextPage && /* @__PURE__ */ jsx16(Box15, { justifyContent: "center", alignItems: "center", marginTop: 1, children: /* @__PURE__ */ jsxs15(Box15, { flexDirection: "row", children: [
|
|
3096
|
+
/* @__PURE__ */ jsx16(Box15, { width: 2, flexShrink: 0, flexGrow: 0, marginRight: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "cyan", children: /* @__PURE__ */ jsx16(SlowSpinner, {}) }) }),
|
|
3097
|
+
/* @__PURE__ */ jsx16(Text16, { color: "cyan", children: "Loading more repositories..." })
|
|
2726
3098
|
] }) }),
|
|
2727
|
-
!loading && !searchLoading && visibleItems.length === 0 && /* @__PURE__ */
|
|
3099
|
+
!loading && !searchLoading && visibleItems.length === 0 && /* @__PURE__ */ jsx16(Box15, { justifyContent: "center", alignItems: "center", flexGrow: 1, children: /* @__PURE__ */ jsx16(Text16, { color: "gray", dimColor: true, children: searchActive ? "No repositories match your search" : filter ? "No repositories match your filter" : "No repositories found" }) })
|
|
2728
3100
|
] })
|
|
2729
3101
|
] }) }),
|
|
2730
|
-
/* @__PURE__ */
|
|
2731
|
-
/* @__PURE__ */
|
|
2732
|
-
/* @__PURE__ */
|
|
2733
|
-
/* @__PURE__ */
|
|
3102
|
+
/* @__PURE__ */ jsxs15(Box15, { marginTop: 1, paddingX: 1, flexDirection: "column", children: [
|
|
3103
|
+
/* @__PURE__ */ jsx16(Box15, { width: terminalWidth, justifyContent: "center", children: /* @__PURE__ */ jsx16(Text16, { color: "gray", dimColor: modalOpen ? true : void 0, children: "\u2191\u2193 Navigate \u2022 \u23CE/O Open \u2022 R Refresh \u2022 W Org Switch \u2022 Ctrl+L Logout \u2022 Q Quit" }) }),
|
|
3104
|
+
/* @__PURE__ */ jsx16(Box15, { width: terminalWidth, justifyContent: "center", children: /* @__PURE__ */ jsx16(Text16, { color: "gray", dimColor: modalOpen ? true : void 0, children: "Ctrl+G Top \u2022 G Bottom \u2022 / Search \u2022 S Sort \u2022 D Direction \u2022 T Density \u2022 F Fork Status \u2022 V Visibility" }) }),
|
|
3105
|
+
/* @__PURE__ */ jsx16(Box15, { width: terminalWidth, justifyContent: "center", children: /* @__PURE__ */ jsx16(Text16, { color: "gray", dimColor: modalOpen ? true : void 0, children: "I Info \u2022 C Copy URL \u2022 K Cache Info \u2022 Ctrl+R Rename \u2022 Ctrl+A Un/Archive \u2022 Ctrl+V Change Visibility \u2022 Del/Backspace Delete \u2022 Ctrl+S Sync Fork" }) })
|
|
2734
3106
|
] }),
|
|
2735
|
-
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */
|
|
2736
|
-
/* @__PURE__ */
|
|
2737
|
-
debugMessages.length === 0 ? /* @__PURE__ */
|
|
2738
|
-
] })
|
|
3107
|
+
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */ jsxs15(Box15, { marginTop: 1, borderStyle: "single", borderColor: "yellow", paddingX: 1, flexDirection: "column", children: [
|
|
3108
|
+
/* @__PURE__ */ jsx16(Text16, { bold: true, color: "yellow", children: "Debug Messages:" }),
|
|
3109
|
+
debugMessages.length === 0 ? /* @__PURE__ */ jsx16(Text16, { color: "gray", children: "No debug messages yet..." }) : debugMessages.map((msg, i) => /* @__PURE__ */ jsx16(Text16, { color: "gray", children: msg }, i))
|
|
3110
|
+
] }),
|
|
3111
|
+
copyToast && /* @__PURE__ */ jsx16(Box15, { marginTop: 1, justifyContent: "center", children: /* @__PURE__ */ jsx16(Box15, { borderStyle: "round", borderColor: copyToast.includes("Failed") ? "red" : "green", paddingX: 2, paddingY: 0, children: /* @__PURE__ */ jsx16(Text16, { color: copyToast.includes("Failed") ? "red" : "green", children: copyToast }) }) })
|
|
2739
3112
|
] });
|
|
2740
3113
|
}
|
|
2741
3114
|
|
|
2742
3115
|
// src/ui/components/auth/AuthMethodSelector.tsx
|
|
2743
|
-
import { useState as
|
|
2744
|
-
import { Box as
|
|
2745
|
-
import
|
|
2746
|
-
import { jsx as
|
|
3116
|
+
import { useState as useState13 } from "react";
|
|
3117
|
+
import { Box as Box16, Text as Text17, useInput as useInput13 } from "ink";
|
|
3118
|
+
import chalk13 from "chalk";
|
|
3119
|
+
import { jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
2747
3120
|
function AuthMethodSelector({ onSelect, onQuit }) {
|
|
2748
|
-
const [selectedIndex, setSelectedIndex] =
|
|
3121
|
+
const [selectedIndex, setSelectedIndex] = useState13(0);
|
|
2749
3122
|
const methods = [
|
|
2750
3123
|
{
|
|
2751
3124
|
key: "oauth",
|
|
@@ -2758,7 +3131,7 @@ function AuthMethodSelector({ onSelect, onQuit }) {
|
|
|
2758
3131
|
description: "Manually enter a GitHub Personal Access Token"
|
|
2759
3132
|
}
|
|
2760
3133
|
];
|
|
2761
|
-
|
|
3134
|
+
useInput13((input, key) => {
|
|
2762
3135
|
if (key.escape || input?.toLowerCase() === "q") {
|
|
2763
3136
|
if (onQuit) {
|
|
2764
3137
|
onQuit();
|
|
@@ -2777,34 +3150,34 @@ function AuthMethodSelector({ onSelect, onQuit }) {
|
|
|
2777
3150
|
onSelect("pat");
|
|
2778
3151
|
}
|
|
2779
3152
|
});
|
|
2780
|
-
return /* @__PURE__ */
|
|
2781
|
-
/* @__PURE__ */
|
|
2782
|
-
/* @__PURE__ */
|
|
3153
|
+
return /* @__PURE__ */ jsxs16(Box16, { flexDirection: "column", borderStyle: "single", borderColor: "cyan", paddingX: 2, paddingY: 1, children: [
|
|
3154
|
+
/* @__PURE__ */ jsx17(Text17, { bold: true, marginBottom: 1, children: "Choose Authentication Method" }),
|
|
3155
|
+
/* @__PURE__ */ jsx17(Box16, { flexDirection: "column", marginY: 1, children: methods.map((method, index) => {
|
|
2783
3156
|
const isSelected = index === selectedIndex;
|
|
2784
|
-
const prefix = isSelected ?
|
|
3157
|
+
const prefix = isSelected ? chalk13.cyan("\u203A") : " ";
|
|
2785
3158
|
const numberPrefix = `${index + 1}.`;
|
|
2786
|
-
return /* @__PURE__ */
|
|
2787
|
-
/* @__PURE__ */
|
|
3159
|
+
return /* @__PURE__ */ jsxs16(Box16, { flexDirection: "column", marginBottom: 1, children: [
|
|
3160
|
+
/* @__PURE__ */ jsx17(Text17, { children: /* @__PURE__ */ jsxs16(Text17, { color: isSelected ? "cyan" : void 0, bold: isSelected, children: [
|
|
2788
3161
|
prefix,
|
|
2789
3162
|
" ",
|
|
2790
3163
|
numberPrefix,
|
|
2791
3164
|
" ",
|
|
2792
3165
|
method.label
|
|
2793
3166
|
] }) }),
|
|
2794
|
-
/* @__PURE__ */
|
|
3167
|
+
/* @__PURE__ */ jsxs16(Text17, { color: "gray", dimColor: true, children: [
|
|
2795
3168
|
" ",
|
|
2796
3169
|
method.description
|
|
2797
3170
|
] })
|
|
2798
3171
|
] }, method.key);
|
|
2799
3172
|
}) }),
|
|
2800
|
-
/* @__PURE__ */
|
|
3173
|
+
/* @__PURE__ */ jsx17(Text17, { color: "gray", dimColor: true, marginTop: 1, children: "Use arrow keys to navigate, Enter to select, or press 1/2 \u2022 Q/Esc to quit" })
|
|
2801
3174
|
] });
|
|
2802
3175
|
}
|
|
2803
3176
|
|
|
2804
3177
|
// src/ui/components/auth/OAuthProgress.tsx
|
|
2805
|
-
import { Box as
|
|
3178
|
+
import { Box as Box17, Text as Text18 } from "ink";
|
|
2806
3179
|
import Spinner from "ink-spinner";
|
|
2807
|
-
import { jsx as
|
|
3180
|
+
import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
2808
3181
|
function OAuthProgress({ status, error, deviceCode }) {
|
|
2809
3182
|
const statusMessages = {
|
|
2810
3183
|
initializing: {
|
|
@@ -2841,69 +3214,69 @@ function OAuthProgress({ status, error, deviceCode }) {
|
|
|
2841
3214
|
}
|
|
2842
3215
|
};
|
|
2843
3216
|
const { message, showSpinner } = statusMessages[status];
|
|
2844
|
-
return /* @__PURE__ */
|
|
2845
|
-
/* @__PURE__ */
|
|
2846
|
-
/* @__PURE__ */
|
|
2847
|
-
/* @__PURE__ */
|
|
2848
|
-
/* @__PURE__ */
|
|
3217
|
+
return /* @__PURE__ */ jsxs17(Box17, { flexDirection: "column", borderStyle: "single", borderColor: status === "error" ? "red" : "cyan", paddingX: 2, paddingY: 1, children: [
|
|
3218
|
+
/* @__PURE__ */ jsx18(Text18, { bold: true, marginBottom: 1, children: "GitHub OAuth Authentication" }),
|
|
3219
|
+
/* @__PURE__ */ jsx18(Box17, { marginY: 1, children: showSpinner ? /* @__PURE__ */ jsxs17(Box17, { children: [
|
|
3220
|
+
/* @__PURE__ */ jsx18(Text18, { color: "green", children: /* @__PURE__ */ jsx18(Spinner, { type: "dots" }) }),
|
|
3221
|
+
/* @__PURE__ */ jsxs17(Text18, { children: [
|
|
2849
3222
|
" ",
|
|
2850
3223
|
message
|
|
2851
3224
|
] })
|
|
2852
|
-
] }) : /* @__PURE__ */
|
|
3225
|
+
] }) : /* @__PURE__ */ jsxs17(Text18, { color: status === "error" ? "red" : "green", children: [
|
|
2853
3226
|
status === "error" ? "\u2717" : "\u2713",
|
|
2854
3227
|
" ",
|
|
2855
3228
|
message
|
|
2856
3229
|
] }) }),
|
|
2857
|
-
(status === "waiting_for_authorization" || status === "polling_for_token") && deviceCode && /* @__PURE__ */
|
|
2858
|
-
/* @__PURE__ */
|
|
2859
|
-
/* @__PURE__ */
|
|
2860
|
-
/* @__PURE__ */
|
|
2861
|
-
/* @__PURE__ */
|
|
3230
|
+
(status === "waiting_for_authorization" || status === "polling_for_token") && deviceCode && /* @__PURE__ */ jsxs17(Box17, { marginY: 1, flexDirection: "column", children: [
|
|
3231
|
+
/* @__PURE__ */ jsx18(Text18, { bold: true, color: "cyan", marginBottom: 1, children: "\u{1F4CB} Please complete these steps:" }),
|
|
3232
|
+
/* @__PURE__ */ jsxs17(Box17, { marginBottom: 1, children: [
|
|
3233
|
+
/* @__PURE__ */ jsx18(Text18, { children: "1. Visit: " }),
|
|
3234
|
+
/* @__PURE__ */ jsx18(Text18, { bold: true, color: "blue", children: deviceCode.verification_uri })
|
|
2862
3235
|
] }),
|
|
2863
|
-
/* @__PURE__ */
|
|
2864
|
-
/* @__PURE__ */
|
|
2865
|
-
/* @__PURE__ */
|
|
3236
|
+
/* @__PURE__ */ jsxs17(Box17, { marginBottom: 1, flexDirection: "column", children: [
|
|
3237
|
+
/* @__PURE__ */ jsx18(Text18, { children: "2. Enter this code:" }),
|
|
3238
|
+
/* @__PURE__ */ jsx18(Box17, { borderStyle: "single", borderColor: "yellow", paddingX: 2, paddingY: 1, marginTop: 1, children: /* @__PURE__ */ jsx18(Text18, { bold: true, color: "yellow", children: deviceCode.user_code }) })
|
|
2866
3239
|
] }),
|
|
2867
|
-
status === "waiting_for_authorization" && /* @__PURE__ */
|
|
2868
|
-
status === "polling_for_token" && /* @__PURE__ */
|
|
2869
|
-
/* @__PURE__ */
|
|
2870
|
-
/* @__PURE__ */
|
|
3240
|
+
status === "waiting_for_authorization" && /* @__PURE__ */ jsx18(Text18, { color: "gray", marginTop: 1, children: "Your browser should open automatically." }),
|
|
3241
|
+
status === "polling_for_token" && /* @__PURE__ */ jsxs17(Box17, { flexDirection: "column", marginTop: 1, children: [
|
|
3242
|
+
/* @__PURE__ */ jsx18(Text18, { color: "gray", children: "Waiting for you to complete authorization in your browser..." }),
|
|
3243
|
+
/* @__PURE__ */ jsx18(Text18, { color: "gray", dimColor: true, marginTop: 1, children: "This will timeout in 15 minutes. Press Esc to cancel." })
|
|
2871
3244
|
] })
|
|
2872
3245
|
] }),
|
|
2873
|
-
status === "error" && error && /* @__PURE__ */
|
|
2874
|
-
/* @__PURE__ */
|
|
2875
|
-
/* @__PURE__ */
|
|
3246
|
+
status === "error" && error && /* @__PURE__ */ jsxs17(Box17, { marginY: 1, flexDirection: "column", children: [
|
|
3247
|
+
/* @__PURE__ */ jsx18(Text18, { color: "red", children: error }),
|
|
3248
|
+
/* @__PURE__ */ jsx18(Text18, { color: "gray", marginTop: 1, children: "Press Esc to go back and try again." })
|
|
2876
3249
|
] }),
|
|
2877
|
-
status === "success" && /* @__PURE__ */
|
|
3250
|
+
status === "success" && /* @__PURE__ */ jsx18(Text18, { color: "gray", marginTop: 1, children: "Returning to application..." })
|
|
2878
3251
|
] });
|
|
2879
3252
|
}
|
|
2880
3253
|
|
|
2881
3254
|
// src/ui/App.tsx
|
|
2882
|
-
import { jsx as
|
|
3255
|
+
import { jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
2883
3256
|
var packageJson = require_package();
|
|
2884
3257
|
function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlineTokenEphemeral }) {
|
|
2885
3258
|
const { exit } = useApp2();
|
|
2886
3259
|
const { stdout } = useStdout2();
|
|
2887
|
-
const [mode, setMode] =
|
|
2888
|
-
const [token, setToken] =
|
|
2889
|
-
const [input, setInput] =
|
|
2890
|
-
const [error, setError] =
|
|
2891
|
-
const [viewer, setViewer] =
|
|
2892
|
-
const [rateLimitReset, setRateLimitReset] =
|
|
2893
|
-
const [wasRateLimited, setWasRateLimited] =
|
|
2894
|
-
const [orgContext, setOrgContext] =
|
|
2895
|
-
const [authMethod, setAuthMethod] =
|
|
2896
|
-
const [oauthStatus, setOAuthStatus] =
|
|
2897
|
-
const [tokenSource, setTokenSource] =
|
|
2898
|
-
const [sessionTokenOrigin, setSessionTokenOrigin] =
|
|
2899
|
-
const [deviceCodeResponse, setDeviceCodeResponse] =
|
|
2900
|
-
const [oauthDeviceCode, setOauthDeviceCode] =
|
|
2901
|
-
const [dims, setDims] =
|
|
3260
|
+
const [mode, setMode] = useState14("checking");
|
|
3261
|
+
const [token, setToken] = useState14(null);
|
|
3262
|
+
const [input, setInput] = useState14("");
|
|
3263
|
+
const [error, setError] = useState14(null);
|
|
3264
|
+
const [viewer, setViewer] = useState14(null);
|
|
3265
|
+
const [rateLimitReset, setRateLimitReset] = useState14(null);
|
|
3266
|
+
const [wasRateLimited, setWasRateLimited] = useState14(false);
|
|
3267
|
+
const [orgContext, setOrgContext] = useState14("personal");
|
|
3268
|
+
const [authMethod, setAuthMethod] = useState14("pat");
|
|
3269
|
+
const [oauthStatus, setOAuthStatus] = useState14("initializing");
|
|
3270
|
+
const [tokenSource, setTokenSource] = useState14("pat");
|
|
3271
|
+
const [sessionTokenOrigin, setSessionTokenOrigin] = useState14("stored");
|
|
3272
|
+
const [deviceCodeResponse, setDeviceCodeResponse] = useState14(null);
|
|
3273
|
+
const [oauthDeviceCode, setOauthDeviceCode] = useState14(null);
|
|
3274
|
+
const [dims, setDims] = useState14(() => {
|
|
2902
3275
|
const cols = stdout?.columns ?? 100;
|
|
2903
3276
|
const rows = stdout?.rows ?? 30;
|
|
2904
3277
|
return { cols, rows };
|
|
2905
3278
|
});
|
|
2906
|
-
|
|
3279
|
+
useEffect9(() => {
|
|
2907
3280
|
if (!stdout) return;
|
|
2908
3281
|
const onResize = () => {
|
|
2909
3282
|
const cols = stdout.columns ?? 100;
|
|
@@ -2915,7 +3288,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
2915
3288
|
stdout.off?.("resize", onResize);
|
|
2916
3289
|
};
|
|
2917
3290
|
}, [stdout]);
|
|
2918
|
-
|
|
3291
|
+
useEffect9(() => {
|
|
2919
3292
|
const env = getTokenFromEnv();
|
|
2920
3293
|
const stored = getStoredToken();
|
|
2921
3294
|
const source = getTokenSource();
|
|
@@ -2939,7 +3312,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
2939
3312
|
setMode("auth_method_selection");
|
|
2940
3313
|
}
|
|
2941
3314
|
}, [inlineToken2]);
|
|
2942
|
-
|
|
3315
|
+
useEffect9(() => {
|
|
2943
3316
|
if (mode !== "oauth_flow") return;
|
|
2944
3317
|
(async () => {
|
|
2945
3318
|
try {
|
|
@@ -2991,7 +3364,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
2991
3364
|
setMode("oauth_flow");
|
|
2992
3365
|
}
|
|
2993
3366
|
};
|
|
2994
|
-
|
|
3367
|
+
useEffect9(() => {
|
|
2995
3368
|
(async () => {
|
|
2996
3369
|
if (mode !== "validating" || !token) return;
|
|
2997
3370
|
const timeoutId = setTimeout(() => {
|
|
@@ -3103,7 +3476,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
3103
3476
|
setTokenSource("pat");
|
|
3104
3477
|
setMode("auth_method_selection");
|
|
3105
3478
|
};
|
|
3106
|
-
|
|
3479
|
+
useInput14((input2, key) => {
|
|
3107
3480
|
if ((mode === "prompt" || mode === "auth_method_selection") && key.escape) {
|
|
3108
3481
|
exit();
|
|
3109
3482
|
}
|
|
@@ -3135,19 +3508,19 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
3135
3508
|
}
|
|
3136
3509
|
});
|
|
3137
3510
|
const verticalPadding = Math.floor(dims.rows * 0.15);
|
|
3138
|
-
const header = useMemo2(() => /* @__PURE__ */
|
|
3139
|
-
/* @__PURE__ */
|
|
3140
|
-
/* @__PURE__ */
|
|
3511
|
+
const header = useMemo2(() => /* @__PURE__ */ jsxs18(Box18, { flexDirection: "row", justifyContent: "space-between", marginBottom: 1, children: [
|
|
3512
|
+
/* @__PURE__ */ jsxs18(Box18, { flexDirection: "row", gap: 1, children: [
|
|
3513
|
+
/* @__PURE__ */ jsxs18(Text19, { bold: true, color: "cyan", children: [
|
|
3141
3514
|
" ",
|
|
3142
3515
|
"GitHub Repository Manager"
|
|
3143
3516
|
] }),
|
|
3144
|
-
/* @__PURE__ */
|
|
3517
|
+
/* @__PURE__ */ jsxs18(Text19, { color: "gray", dimColor: true, children: [
|
|
3145
3518
|
"v",
|
|
3146
3519
|
packageJson.version
|
|
3147
3520
|
] }),
|
|
3148
|
-
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */
|
|
3521
|
+
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */ jsx19(Text19, { backgroundColor: "blue", color: "white", children: " debug mode " })
|
|
3149
3522
|
] }),
|
|
3150
|
-
viewer && /* @__PURE__ */
|
|
3523
|
+
viewer && /* @__PURE__ */ jsx19(Text19, { color: "gray", children: orgContext !== "personal" && orgContext.login ? `${orgContext.login}/@${viewer} ` : `@${viewer} ` })
|
|
3151
3524
|
] }), [viewer, orgContext]);
|
|
3152
3525
|
if (mode === "rate_limited") {
|
|
3153
3526
|
const formatResetTime = (resetTime) => {
|
|
@@ -3170,71 +3543,71 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
3170
3543
|
return "Unknown";
|
|
3171
3544
|
}
|
|
3172
3545
|
};
|
|
3173
|
-
return /* @__PURE__ */
|
|
3546
|
+
return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
3174
3547
|
header,
|
|
3175
|
-
/* @__PURE__ */
|
|
3176
|
-
/* @__PURE__ */
|
|
3177
|
-
/* @__PURE__ */
|
|
3178
|
-
/* @__PURE__ */
|
|
3179
|
-
rateLimitReset && /* @__PURE__ */
|
|
3180
|
-
/* @__PURE__ */
|
|
3181
|
-
/* @__PURE__ */
|
|
3548
|
+
/* @__PURE__ */ jsx19(Box18, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsxs18(Box18, { borderStyle: "single", borderColor: "yellow", paddingX: 3, paddingY: 2, flexDirection: "column", width: Math.min(dims.cols - 8, 80), children: [
|
|
3549
|
+
/* @__PURE__ */ jsx19(Text19, { bold: true, color: "yellow", marginBottom: 1, children: "\u26A0\uFE0F Rate Limit Exceeded" }),
|
|
3550
|
+
/* @__PURE__ */ jsx19(Text19, { color: "gray", marginBottom: 1, children: "You've hit GitHub's API rate limit for your token." }),
|
|
3551
|
+
/* @__PURE__ */ jsx19(Text19, { color: "gray", marginBottom: 1, children: "This happens when you make too many requests in a short time." }),
|
|
3552
|
+
rateLimitReset && /* @__PURE__ */ jsxs18(Box18, { marginTop: 1, marginBottom: 1, children: [
|
|
3553
|
+
/* @__PURE__ */ jsxs18(Text19, { children: [
|
|
3554
|
+
/* @__PURE__ */ jsx19(Text19, { color: "cyan", children: "Reset in:" }),
|
|
3182
3555
|
" ",
|
|
3183
|
-
/* @__PURE__ */
|
|
3556
|
+
/* @__PURE__ */ jsx19(Text19, { bold: true, children: formatResetTime(rateLimitReset) })
|
|
3184
3557
|
] }),
|
|
3185
|
-
/* @__PURE__ */
|
|
3558
|
+
/* @__PURE__ */ jsxs18(Text19, { color: "gray", dimColor: true, children: [
|
|
3186
3559
|
"(",
|
|
3187
3560
|
new Date(rateLimitReset).toLocaleTimeString(),
|
|
3188
3561
|
")"
|
|
3189
3562
|
] })
|
|
3190
3563
|
] }),
|
|
3191
|
-
/* @__PURE__ */
|
|
3192
|
-
/* @__PURE__ */
|
|
3193
|
-
/* @__PURE__ */
|
|
3194
|
-
/* @__PURE__ */
|
|
3195
|
-
/* @__PURE__ */
|
|
3564
|
+
/* @__PURE__ */ jsxs18(Box18, { marginTop: 2, flexDirection: "column", gap: 1, children: [
|
|
3565
|
+
/* @__PURE__ */ jsx19(Text19, { bold: true, children: "What would you like to do?" }),
|
|
3566
|
+
/* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", paddingLeft: 2, children: [
|
|
3567
|
+
/* @__PURE__ */ jsxs18(Text19, { children: [
|
|
3568
|
+
/* @__PURE__ */ jsx19(Text19, { color: "cyan", bold: true, children: "R" }),
|
|
3196
3569
|
" - Retry now ",
|
|
3197
3570
|
rateLimitReset && formatResetTime(rateLimitReset) !== "Now (should be reset)" ? "(likely to fail until reset)" : "(should work now)"
|
|
3198
3571
|
] }),
|
|
3199
|
-
/* @__PURE__ */
|
|
3200
|
-
/* @__PURE__ */
|
|
3572
|
+
/* @__PURE__ */ jsxs18(Text19, { children: [
|
|
3573
|
+
/* @__PURE__ */ jsx19(Text19, { color: "cyan", bold: true, children: "L" }),
|
|
3201
3574
|
" - Logout and choose authentication method"
|
|
3202
3575
|
] }),
|
|
3203
|
-
/* @__PURE__ */
|
|
3204
|
-
/* @__PURE__ */
|
|
3576
|
+
/* @__PURE__ */ jsxs18(Text19, { children: [
|
|
3577
|
+
/* @__PURE__ */ jsx19(Text19, { color: "gray", bold: true, children: "Q/Esc" }),
|
|
3205
3578
|
" - Quit application"
|
|
3206
3579
|
] })
|
|
3207
3580
|
] })
|
|
3208
3581
|
] }),
|
|
3209
|
-
/* @__PURE__ */
|
|
3582
|
+
/* @__PURE__ */ jsx19(Text19, { color: "gray", dimColor: true, marginTop: 2, children: "Tip: Using multiple tokens or waiting between requests can help avoid rate limits." })
|
|
3210
3583
|
] }) })
|
|
3211
3584
|
] });
|
|
3212
3585
|
}
|
|
3213
3586
|
if (mode === "auth_method_selection") {
|
|
3214
|
-
return /* @__PURE__ */
|
|
3587
|
+
return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
3215
3588
|
header,
|
|
3216
|
-
/* @__PURE__ */
|
|
3217
|
-
/* @__PURE__ */
|
|
3218
|
-
error && /* @__PURE__ */
|
|
3589
|
+
/* @__PURE__ */ jsx19(Box18, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", alignItems: "center", children: [
|
|
3590
|
+
/* @__PURE__ */ jsx19(AuthMethodSelector, { onSelect: handleAuthMethodSelect }),
|
|
3591
|
+
error && /* @__PURE__ */ jsx19(Text19, { color: "red", marginTop: 1, children: error })
|
|
3219
3592
|
] }) })
|
|
3220
3593
|
] });
|
|
3221
3594
|
}
|
|
3222
3595
|
if (mode === "oauth_flow") {
|
|
3223
|
-
return /* @__PURE__ */
|
|
3596
|
+
return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
3224
3597
|
header,
|
|
3225
|
-
/* @__PURE__ */
|
|
3598
|
+
/* @__PURE__ */ jsx19(Box18, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsx19(OAuthProgress, { status: oauthStatus, error: error || void 0, deviceCode: oauthDeviceCode || void 0 }) })
|
|
3226
3599
|
] });
|
|
3227
3600
|
}
|
|
3228
3601
|
if (mode === "prompt") {
|
|
3229
|
-
return /* @__PURE__ */
|
|
3602
|
+
return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
3230
3603
|
header,
|
|
3231
|
-
/* @__PURE__ */
|
|
3232
|
-
/* @__PURE__ */
|
|
3233
|
-
/* @__PURE__ */
|
|
3234
|
-
/* @__PURE__ */
|
|
3235
|
-
/* @__PURE__ */
|
|
3236
|
-
/* @__PURE__ */
|
|
3237
|
-
|
|
3604
|
+
/* @__PURE__ */ jsx19(Box18, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsxs18(Box18, { borderStyle: "single", borderColor: "cyan", paddingX: 2, paddingY: 1, flexDirection: "column", children: [
|
|
3605
|
+
/* @__PURE__ */ jsx19(Text19, { bold: true, marginBottom: 1, children: "Authentication Required" }),
|
|
3606
|
+
/* @__PURE__ */ jsx19(Text19, { color: "gray", marginBottom: 1, children: "Enter your GitHub Personal Access Token" }),
|
|
3607
|
+
/* @__PURE__ */ jsxs18(Box18, { children: [
|
|
3608
|
+
/* @__PURE__ */ jsx19(Text19, { children: "Token: " }),
|
|
3609
|
+
/* @__PURE__ */ jsx19(
|
|
3610
|
+
TextInput6,
|
|
3238
3611
|
{
|
|
3239
3612
|
value: input,
|
|
3240
3613
|
onChange: setInput,
|
|
@@ -3243,30 +3616,30 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
3243
3616
|
}
|
|
3244
3617
|
)
|
|
3245
3618
|
] }),
|
|
3246
|
-
error && /* @__PURE__ */
|
|
3247
|
-
/* @__PURE__ */
|
|
3248
|
-
/* @__PURE__ */
|
|
3619
|
+
error && /* @__PURE__ */ jsx19(Text19, { color: "red", marginTop: 1, children: error }),
|
|
3620
|
+
/* @__PURE__ */ jsx19(Text19, { color: "gray", dimColor: true, marginTop: 1, children: "The token will be stored securely in your local config" }),
|
|
3621
|
+
/* @__PURE__ */ jsx19(Text19, { color: "gray", dimColor: true, marginTop: 1, children: "Press Esc to go back" })
|
|
3249
3622
|
] }) })
|
|
3250
3623
|
] });
|
|
3251
3624
|
}
|
|
3252
3625
|
if (mode === "validating" || mode === "checking") {
|
|
3253
|
-
return /* @__PURE__ */
|
|
3626
|
+
return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
3254
3627
|
header,
|
|
3255
|
-
/* @__PURE__ */
|
|
3256
|
-
/* @__PURE__ */
|
|
3257
|
-
mode === "validating" && /* @__PURE__ */
|
|
3628
|
+
/* @__PURE__ */ jsx19(Box18, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", alignItems: "center", children: [
|
|
3629
|
+
/* @__PURE__ */ jsx19(Text19, { color: "yellow", children: "Validating token..." }),
|
|
3630
|
+
mode === "validating" && /* @__PURE__ */ jsx19(Text19, { color: "gray", dimColor: true, marginTop: 1, children: "Press Esc to cancel" })
|
|
3258
3631
|
] }) })
|
|
3259
3632
|
] });
|
|
3260
3633
|
}
|
|
3261
3634
|
if (mode === "error") {
|
|
3262
|
-
return /* @__PURE__ */
|
|
3635
|
+
return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
3263
3636
|
header,
|
|
3264
|
-
/* @__PURE__ */
|
|
3637
|
+
/* @__PURE__ */ jsx19(Box18, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsx19(Text19, { color: "red", children: error ?? "Unexpected error" }) })
|
|
3265
3638
|
] });
|
|
3266
3639
|
}
|
|
3267
|
-
return /* @__PURE__ */
|
|
3640
|
+
return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
3268
3641
|
header,
|
|
3269
|
-
/* @__PURE__ */
|
|
3642
|
+
/* @__PURE__ */ jsx19(
|
|
3270
3643
|
RepoList,
|
|
3271
3644
|
{
|
|
3272
3645
|
token,
|
|
@@ -3281,7 +3654,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
3281
3654
|
}
|
|
3282
3655
|
|
|
3283
3656
|
// src/index.tsx
|
|
3284
|
-
import { jsx as
|
|
3657
|
+
import { jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
3285
3658
|
var argv = process.argv.slice(2);
|
|
3286
3659
|
var getFlagValue = (name) => {
|
|
3287
3660
|
const idx = argv.findIndex((a) => a === `--${name}` || a.startsWith(`--${name}=`));
|
|
@@ -3376,8 +3749,8 @@ var inlineToken = (() => {
|
|
|
3376
3749
|
})();
|
|
3377
3750
|
logger.debug("Rendering UI");
|
|
3378
3751
|
var { unmount } = render(
|
|
3379
|
-
/* @__PURE__ */
|
|
3380
|
-
/* @__PURE__ */
|
|
3381
|
-
/* @__PURE__ */
|
|
3752
|
+
/* @__PURE__ */ jsxs19(Box19, { flexDirection: "column", children: [
|
|
3753
|
+
/* @__PURE__ */ jsx20(App, { initialOrgSlug, inlineToken, inlineTokenEphemeral: Boolean(inlineToken) }),
|
|
3754
|
+
/* @__PURE__ */ jsx20(Text20, { color: "gray" })
|
|
3382
3755
|
] })
|
|
3383
3756
|
);
|