gh-manager-cli 1.43.0 → 1.45.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 +7 -0
- package/README.md +12 -2
- package/dist/{chunk-MKIUBPVD.js → chunk-WHX6IOTW.js} +81 -0
- package/dist/{github-6HD7I2UI.js → github-72MPRF5W.js} +5 -1
- package/dist/index.js +899 -441
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
archiveRepositoryById,
|
|
6
6
|
changeRepositoryVisibility,
|
|
7
7
|
checkOrganizationIsEnterprise,
|
|
8
|
+
createRepositoryRest,
|
|
8
9
|
deleteRepositoryRest,
|
|
9
10
|
enrichForksWithAheadBehind,
|
|
10
11
|
fetchRepositoryByOwnerAndName,
|
|
@@ -21,6 +22,7 @@ import {
|
|
|
21
22
|
renameRepositoryById,
|
|
22
23
|
starRepository,
|
|
23
24
|
syncForkWithUpstream,
|
|
25
|
+
transferRepositoryRest,
|
|
24
26
|
unarchiveRepositoryById,
|
|
25
27
|
unstarRepository,
|
|
26
28
|
updateCacheAfterArchive,
|
|
@@ -28,14 +30,14 @@ import {
|
|
|
28
30
|
updateCacheAfterRename,
|
|
29
31
|
updateCacheAfterVisibilityChange,
|
|
30
32
|
updateCacheWithRepository
|
|
31
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-WHX6IOTW.js";
|
|
32
34
|
|
|
33
35
|
// package.json
|
|
34
36
|
var require_package = __commonJS({
|
|
35
37
|
"package.json"(exports, module) {
|
|
36
38
|
module.exports = {
|
|
37
39
|
name: "gh-manager-cli",
|
|
38
|
-
version: "1.
|
|
40
|
+
version: "1.45.0",
|
|
39
41
|
private: false,
|
|
40
42
|
description: "TUI terminal app to manage GitHub repos. Clean up your account in 5 minutes. Archive, delete, rename repos with keyboard shortcuts. Alternative to clicking through github.com",
|
|
41
43
|
license: "MIT",
|
|
@@ -155,13 +157,13 @@ var require_package = __commonJS({
|
|
|
155
157
|
|
|
156
158
|
// src/index.tsx
|
|
157
159
|
var import_package = __toESM(require_package(), 1);
|
|
158
|
-
import { render, Box as
|
|
160
|
+
import { render, Box as Box26, Text as Text27 } from "ink";
|
|
159
161
|
import "dotenv/config";
|
|
160
162
|
|
|
161
163
|
// src/ui/App.tsx
|
|
162
|
-
import { useEffect as
|
|
163
|
-
import { Box as
|
|
164
|
-
import
|
|
164
|
+
import { useEffect as useEffect14, useMemo as useMemo3, useState as useState21 } from "react";
|
|
165
|
+
import { Box as Box25, Text as Text26, useApp as useApp2, useStdout as useStdout2, useInput as useInput21 } from "ink";
|
|
166
|
+
import TextInput8 from "ink-text-input";
|
|
165
167
|
|
|
166
168
|
// src/config/config.ts
|
|
167
169
|
import fs from "fs";
|
|
@@ -409,9 +411,9 @@ async function openGitHubAuthorizationPage() {
|
|
|
409
411
|
}
|
|
410
412
|
|
|
411
413
|
// src/ui/views/RepoList.tsx
|
|
412
|
-
import
|
|
413
|
-
import { Box as
|
|
414
|
-
import
|
|
414
|
+
import React19, { useEffect as useEffect13, useMemo as useMemo2, useState as useState19, useRef as useRef3, useCallback } from "react";
|
|
415
|
+
import { Box as Box22, Text as Text23, useApp, useInput as useInput19, useStdout } from "ink";
|
|
416
|
+
import TextInput7 from "ink-text-input";
|
|
415
417
|
import chalk15 from "chalk";
|
|
416
418
|
|
|
417
419
|
// src/config/themes.ts
|
|
@@ -427,6 +429,8 @@ var THEMES = {
|
|
|
427
429
|
muted: "gray",
|
|
428
430
|
text: "white",
|
|
429
431
|
selected: "cyan",
|
|
432
|
+
selectedBg: "#1f4a57",
|
|
433
|
+
// dark teal — contrasts the cyan/white selected text
|
|
430
434
|
private: "yellow",
|
|
431
435
|
archived: "gray",
|
|
432
436
|
internal: "magenta",
|
|
@@ -444,6 +448,8 @@ var THEMES = {
|
|
|
444
448
|
muted: "blue",
|
|
445
449
|
text: "whiteBright",
|
|
446
450
|
selected: "blueBright",
|
|
451
|
+
selectedBg: "#11294d",
|
|
452
|
+
// deep blue — sits behind the bright blue/white text
|
|
447
453
|
private: "cyan",
|
|
448
454
|
archived: "blue",
|
|
449
455
|
internal: "magenta",
|
|
@@ -461,6 +467,8 @@ var THEMES = {
|
|
|
461
467
|
muted: "gray",
|
|
462
468
|
text: "white",
|
|
463
469
|
selected: "green",
|
|
470
|
+
selectedBg: "#14391f",
|
|
471
|
+
// deep forest green behind the green/white text
|
|
464
472
|
private: "yellow",
|
|
465
473
|
archived: "gray",
|
|
466
474
|
internal: "magenta",
|
|
@@ -478,6 +486,8 @@ var THEMES = {
|
|
|
478
486
|
muted: "gray",
|
|
479
487
|
text: "white",
|
|
480
488
|
selected: "whiteBright",
|
|
489
|
+
selectedBg: "#333333",
|
|
490
|
+
// neutral dark grey — darker than the old bright grey
|
|
481
491
|
private: "white",
|
|
482
492
|
archived: "gray",
|
|
483
493
|
internal: "white",
|
|
@@ -621,7 +631,7 @@ function OrgSwitcher({ token, currentContext, onSelect, onClose }) {
|
|
|
621
631
|
try {
|
|
622
632
|
setLoading(true);
|
|
623
633
|
setError(null);
|
|
624
|
-
const client = await import("./github-
|
|
634
|
+
const client = await import("./github-72MPRF5W.js").then((m) => m.makeClient(token));
|
|
625
635
|
const orgs = await fetchViewerOrganizations(client);
|
|
626
636
|
setOrganizations(orgs);
|
|
627
637
|
const entOrgs = /* @__PURE__ */ new Set();
|
|
@@ -1937,11 +1947,345 @@ function OpenInBrowserModal({ repo, onOpen, onCancel, theme: themeProp }) {
|
|
|
1937
1947
|
);
|
|
1938
1948
|
}
|
|
1939
1949
|
|
|
1940
|
-
// src/ui/components/modals/
|
|
1941
|
-
import {
|
|
1942
|
-
import { Box as Box16, Text as Text17 } from "ink";
|
|
1943
|
-
import
|
|
1950
|
+
// src/ui/components/modals/CreateRepoModal.tsx
|
|
1951
|
+
import { useState as useState16, useRef } from "react";
|
|
1952
|
+
import { Box as Box16, Text as Text17, useInput as useInput16 } from "ink";
|
|
1953
|
+
import TextInput4 from "ink-text-input";
|
|
1944
1954
|
import { Fragment as Fragment8, jsx as jsx17, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
1955
|
+
function CreateRepoModal({ ownerSlug, isOrg, isEnterprise, onCreate, onCancel, theme: themeProp }) {
|
|
1956
|
+
const { theme, c } = useTheme(themeProp?.name ?? "default");
|
|
1957
|
+
const [name, setName] = useState16("");
|
|
1958
|
+
const [visibility, setVisibility] = useState16("PRIVATE");
|
|
1959
|
+
const [creating, setCreating] = useState16(false);
|
|
1960
|
+
const [error, setError] = useState16(null);
|
|
1961
|
+
const submittingRef = useRef(false);
|
|
1962
|
+
const visibilities = isOrg && isEnterprise ? ["PRIVATE", "PUBLIC", "INTERNAL"] : ["PRIVATE", "PUBLIC"];
|
|
1963
|
+
useInput16((input, key) => {
|
|
1964
|
+
if (creating) return;
|
|
1965
|
+
if (key.escape) {
|
|
1966
|
+
onCancel();
|
|
1967
|
+
return;
|
|
1968
|
+
}
|
|
1969
|
+
if (key.tab) {
|
|
1970
|
+
setVisibility((v) => {
|
|
1971
|
+
const idx = visibilities.indexOf(v);
|
|
1972
|
+
return visibilities[(idx + 1) % visibilities.length];
|
|
1973
|
+
});
|
|
1974
|
+
return;
|
|
1975
|
+
}
|
|
1976
|
+
if (key.return) {
|
|
1977
|
+
if (name.trim()) handleCreateConfirm();
|
|
1978
|
+
return;
|
|
1979
|
+
}
|
|
1980
|
+
});
|
|
1981
|
+
const handleCreateConfirm = async () => {
|
|
1982
|
+
if (!name.trim() || creating || submittingRef.current) return;
|
|
1983
|
+
submittingRef.current = true;
|
|
1984
|
+
try {
|
|
1985
|
+
setCreating(true);
|
|
1986
|
+
setError(null);
|
|
1987
|
+
await onCreate(name.trim(), visibility);
|
|
1988
|
+
} catch (e) {
|
|
1989
|
+
setError(e instanceof Error ? e.message : "Failed to create repository");
|
|
1990
|
+
} finally {
|
|
1991
|
+
setCreating(false);
|
|
1992
|
+
submittingRef.current = false;
|
|
1993
|
+
}
|
|
1994
|
+
};
|
|
1995
|
+
const handleNameChange = (value) => {
|
|
1996
|
+
setName(value.replace(/[^a-zA-Z0-9\-_.]/g, "").replace(/^\.+/, ""));
|
|
1997
|
+
};
|
|
1998
|
+
const visLabel = (v) => v === "PUBLIC" ? "Public" : v === "PRIVATE" ? "Private" : "Internal";
|
|
1999
|
+
const isDisabled = !name.trim();
|
|
2000
|
+
return /* @__PURE__ */ jsxs16(
|
|
2001
|
+
Box16,
|
|
2002
|
+
{
|
|
2003
|
+
flexDirection: "column",
|
|
2004
|
+
borderStyle: "round",
|
|
2005
|
+
borderColor: theme.primary,
|
|
2006
|
+
paddingX: 3,
|
|
2007
|
+
paddingY: 2,
|
|
2008
|
+
width: 80,
|
|
2009
|
+
children: [
|
|
2010
|
+
/* @__PURE__ */ jsx17(Text17, { bold: true, color: theme.primary, children: "Create New Repository" }),
|
|
2011
|
+
/* @__PURE__ */ jsx17(Box16, { height: 1, children: /* @__PURE__ */ jsx17(Text17, { children: " " }) }),
|
|
2012
|
+
/* @__PURE__ */ jsxs16(Text17, { color: theme.muted, children: [
|
|
2013
|
+
"Owner: ",
|
|
2014
|
+
ownerSlug,
|
|
2015
|
+
" ",
|
|
2016
|
+
isOrg ? "(organisation)" : "(personal)"
|
|
2017
|
+
] }),
|
|
2018
|
+
/* @__PURE__ */ jsx17(Box16, { height: 1, children: /* @__PURE__ */ jsx17(Text17, { children: " " }) }),
|
|
2019
|
+
/* @__PURE__ */ jsx17(Text17, { children: "Repository name:" }),
|
|
2020
|
+
/* @__PURE__ */ jsxs16(Box16, { flexDirection: "row", alignItems: "center", children: [
|
|
2021
|
+
/* @__PURE__ */ jsxs16(Text17, { children: [
|
|
2022
|
+
ownerSlug,
|
|
2023
|
+
"/"
|
|
2024
|
+
] }),
|
|
2025
|
+
/* @__PURE__ */ jsx17(
|
|
2026
|
+
TextInput4,
|
|
2027
|
+
{
|
|
2028
|
+
value: name,
|
|
2029
|
+
onChange: handleNameChange,
|
|
2030
|
+
placeholder: "my-new-repo",
|
|
2031
|
+
focus: !creating
|
|
2032
|
+
}
|
|
2033
|
+
)
|
|
2034
|
+
] }),
|
|
2035
|
+
/* @__PURE__ */ jsx17(Box16, { height: 1, children: /* @__PURE__ */ jsx17(Text17, { children: " " }) }),
|
|
2036
|
+
/* @__PURE__ */ jsxs16(Box16, { flexDirection: "row", children: [
|
|
2037
|
+
/* @__PURE__ */ jsx17(Text17, { children: "Visibility: " }),
|
|
2038
|
+
visibilities.map((v, i) => /* @__PURE__ */ jsxs16(Text17, { children: [
|
|
2039
|
+
v === visibility ? c.btnPrimary(` ${visLabel(v)} `) : c.muted(visLabel(v)),
|
|
2040
|
+
i < visibilities.length - 1 ? " " : ""
|
|
2041
|
+
] }, v))
|
|
2042
|
+
] }),
|
|
2043
|
+
creating ? /* @__PURE__ */ jsx17(Box16, { marginTop: 2, justifyContent: "center", children: /* @__PURE__ */ jsxs16(Box16, { flexDirection: "row", children: [
|
|
2044
|
+
/* @__PURE__ */ jsx17(Box16, { marginRight: 1, children: /* @__PURE__ */ jsx17(SlowSpinner, {}) }),
|
|
2045
|
+
/* @__PURE__ */ jsx17(Text17, { color: theme.primary, children: "Creating repository..." })
|
|
2046
|
+
] }) }) : /* @__PURE__ */ jsxs16(Fragment8, { children: [
|
|
2047
|
+
/* @__PURE__ */ jsx17(Box16, { marginTop: 2, children: /* @__PURE__ */ jsx17(Text17, { color: theme.muted, children: isDisabled ? "Enter a name to create the repository" : `Press Enter to create "${ownerSlug}/${name}"` }) }),
|
|
2048
|
+
/* @__PURE__ */ jsx17(Box16, { marginTop: 1, children: /* @__PURE__ */ jsx17(Text17, { color: theme.muted, children: "Tab to change visibility \u2022 Esc to cancel" }) })
|
|
2049
|
+
] }),
|
|
2050
|
+
error && /* @__PURE__ */ jsx17(Box16, { marginTop: 1, children: /* @__PURE__ */ jsx17(Text17, { color: theme.error, children: error }) })
|
|
2051
|
+
]
|
|
2052
|
+
}
|
|
2053
|
+
);
|
|
2054
|
+
}
|
|
2055
|
+
|
|
2056
|
+
// src/ui/components/modals/TransferModal.tsx
|
|
2057
|
+
import { useState as useState17, useRef as useRef2, useEffect as useEffect11 } from "react";
|
|
2058
|
+
import { Box as Box17, Text as Text18, useInput as useInput17 } from "ink";
|
|
2059
|
+
import TextInput5 from "ink-text-input";
|
|
2060
|
+
import { Fragment as Fragment9, jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
2061
|
+
function TransferModal({ repo, onTransfer, onCancel, theme: themeProp }) {
|
|
2062
|
+
const { theme, c } = useTheme(themeProp?.name ?? "default");
|
|
2063
|
+
const [newOwner, setNewOwner] = useState17("");
|
|
2064
|
+
const [stage, setStage] = useState17("input");
|
|
2065
|
+
const [focus, setFocus] = useState17("cancel");
|
|
2066
|
+
const [transferring, setTransferring] = useState17(false);
|
|
2067
|
+
const [error, setError] = useState17(null);
|
|
2068
|
+
const [transferCode, setTransferCode] = useState17("");
|
|
2069
|
+
const [typedCode, setTypedCode] = useState17("");
|
|
2070
|
+
const submittingRef = useRef2(false);
|
|
2071
|
+
const owner = repo ? repo.nameWithOwner.split("/")[0] : "";
|
|
2072
|
+
useEffect11(() => {
|
|
2073
|
+
if (repo) {
|
|
2074
|
+
const chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
|
|
2075
|
+
let code = "";
|
|
2076
|
+
for (let i = 0; i < 4; i++) {
|
|
2077
|
+
code += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
2078
|
+
}
|
|
2079
|
+
setTransferCode(code);
|
|
2080
|
+
setTypedCode("");
|
|
2081
|
+
setStage("input");
|
|
2082
|
+
setFocus("cancel");
|
|
2083
|
+
setError(null);
|
|
2084
|
+
}
|
|
2085
|
+
}, [repo]);
|
|
2086
|
+
useInput17((input, key) => {
|
|
2087
|
+
if (transferring || !repo) return;
|
|
2088
|
+
if (key.escape) {
|
|
2089
|
+
onCancel();
|
|
2090
|
+
return;
|
|
2091
|
+
}
|
|
2092
|
+
if (stage === "input") {
|
|
2093
|
+
if (key.return) {
|
|
2094
|
+
const target = newOwner.trim();
|
|
2095
|
+
if (target && target.toLowerCase() !== owner.toLowerCase()) {
|
|
2096
|
+
setError(null);
|
|
2097
|
+
setTypedCode("");
|
|
2098
|
+
setStage("code");
|
|
2099
|
+
}
|
|
2100
|
+
}
|
|
2101
|
+
return;
|
|
2102
|
+
}
|
|
2103
|
+
if (stage === "code") {
|
|
2104
|
+
return;
|
|
2105
|
+
}
|
|
2106
|
+
if (key.leftArrow || key.rightArrow || key.tab) {
|
|
2107
|
+
setFocus((f) => f === "transfer" ? "cancel" : "transfer");
|
|
2108
|
+
return;
|
|
2109
|
+
}
|
|
2110
|
+
if (input === "y" || input === "Y") {
|
|
2111
|
+
handleTransferConfirm();
|
|
2112
|
+
return;
|
|
2113
|
+
}
|
|
2114
|
+
if (input === "c" || input === "C") {
|
|
2115
|
+
onCancel();
|
|
2116
|
+
return;
|
|
2117
|
+
}
|
|
2118
|
+
if (key.return) {
|
|
2119
|
+
if (focus === "transfer") handleTransferConfirm();
|
|
2120
|
+
else onCancel();
|
|
2121
|
+
return;
|
|
2122
|
+
}
|
|
2123
|
+
});
|
|
2124
|
+
const advanceToConfirm = () => {
|
|
2125
|
+
setError(null);
|
|
2126
|
+
setStage("confirm");
|
|
2127
|
+
setFocus("cancel");
|
|
2128
|
+
};
|
|
2129
|
+
const handleCodeChange = (value) => {
|
|
2130
|
+
const up = value.toUpperCase();
|
|
2131
|
+
setTypedCode(up);
|
|
2132
|
+
if (up === transferCode) advanceToConfirm();
|
|
2133
|
+
};
|
|
2134
|
+
const handleCodeSubmit = () => {
|
|
2135
|
+
if (typedCode.toUpperCase() === transferCode) {
|
|
2136
|
+
advanceToConfirm();
|
|
2137
|
+
} else {
|
|
2138
|
+
setError("Incorrect verification code. Please try again.");
|
|
2139
|
+
setTypedCode("");
|
|
2140
|
+
}
|
|
2141
|
+
};
|
|
2142
|
+
const handleTransferConfirm = async () => {
|
|
2143
|
+
if (transferring || submittingRef.current || !repo || !newOwner.trim()) return;
|
|
2144
|
+
submittingRef.current = true;
|
|
2145
|
+
try {
|
|
2146
|
+
setTransferring(true);
|
|
2147
|
+
setError(null);
|
|
2148
|
+
await onTransfer(repo, newOwner.trim());
|
|
2149
|
+
} catch (e) {
|
|
2150
|
+
setError(e instanceof Error ? e.message : "Failed to transfer repository");
|
|
2151
|
+
} finally {
|
|
2152
|
+
setTransferring(false);
|
|
2153
|
+
submittingRef.current = false;
|
|
2154
|
+
}
|
|
2155
|
+
};
|
|
2156
|
+
const handleOwnerChange = (value) => {
|
|
2157
|
+
setNewOwner(value.replace(/[^a-zA-Z0-9-]/g, "").replace(/^-+/, ""));
|
|
2158
|
+
};
|
|
2159
|
+
const isInputDisabled = !newOwner.trim() || newOwner.trim().toLowerCase() === owner.toLowerCase();
|
|
2160
|
+
if (!repo) return null;
|
|
2161
|
+
return /* @__PURE__ */ jsxs17(
|
|
2162
|
+
Box17,
|
|
2163
|
+
{
|
|
2164
|
+
flexDirection: "column",
|
|
2165
|
+
borderStyle: "round",
|
|
2166
|
+
borderColor: theme.warning,
|
|
2167
|
+
paddingX: 3,
|
|
2168
|
+
paddingY: 2,
|
|
2169
|
+
width: 80,
|
|
2170
|
+
children: [
|
|
2171
|
+
/* @__PURE__ */ jsx18(Text18, { bold: true, color: theme.warning, children: "Transfer Repository" }),
|
|
2172
|
+
/* @__PURE__ */ jsx18(Box17, { height: 1, children: /* @__PURE__ */ jsx18(Text18, { children: " " }) }),
|
|
2173
|
+
/* @__PURE__ */ jsxs17(Text18, { color: theme.muted, children: [
|
|
2174
|
+
"Repository: ",
|
|
2175
|
+
repo.nameWithOwner
|
|
2176
|
+
] }),
|
|
2177
|
+
stage === "input" && /* @__PURE__ */ jsxs17(Fragment9, { children: [
|
|
2178
|
+
/* @__PURE__ */ jsx18(Box17, { height: 1, children: /* @__PURE__ */ jsx18(Text18, { children: " " }) }),
|
|
2179
|
+
/* @__PURE__ */ jsx18(Text18, { children: "New owner (username or organisation):" }),
|
|
2180
|
+
/* @__PURE__ */ jsxs17(Box17, { flexDirection: "row", alignItems: "center", children: [
|
|
2181
|
+
/* @__PURE__ */ jsx18(
|
|
2182
|
+
TextInput5,
|
|
2183
|
+
{
|
|
2184
|
+
value: newOwner,
|
|
2185
|
+
onChange: handleOwnerChange,
|
|
2186
|
+
placeholder: "new-owner",
|
|
2187
|
+
focus: !transferring
|
|
2188
|
+
}
|
|
2189
|
+
),
|
|
2190
|
+
/* @__PURE__ */ jsxs17(Text18, { children: [
|
|
2191
|
+
"/",
|
|
2192
|
+
repo.name
|
|
2193
|
+
] })
|
|
2194
|
+
] }),
|
|
2195
|
+
/* @__PURE__ */ jsx18(Box17, { marginTop: 2, children: /* @__PURE__ */ jsx18(Text18, { color: theme.muted, children: isInputDisabled ? "Enter a different owner to continue" : `Press Enter to review the transfer to "${newOwner}/${repo.name}"` }) }),
|
|
2196
|
+
/* @__PURE__ */ jsx18(Box17, { marginTop: 1, children: /* @__PURE__ */ jsx18(Text18, { color: theme.muted, children: "Press Esc to cancel" }) })
|
|
2197
|
+
] }),
|
|
2198
|
+
stage === "code" && /* @__PURE__ */ jsxs17(Fragment9, { children: [
|
|
2199
|
+
/* @__PURE__ */ jsx18(Box17, { height: 1, children: /* @__PURE__ */ jsx18(Text18, { children: " " }) }),
|
|
2200
|
+
/* @__PURE__ */ jsxs17(Text18, { children: [
|
|
2201
|
+
"Transfer ",
|
|
2202
|
+
c.text.bold(repo.nameWithOwner),
|
|
2203
|
+
" ",
|
|
2204
|
+
"\u2192",
|
|
2205
|
+
" ",
|
|
2206
|
+
c.warning.bold(`${newOwner}/${repo.name}`)
|
|
2207
|
+
] }),
|
|
2208
|
+
/* @__PURE__ */ jsx18(Box17, { height: 1, children: /* @__PURE__ */ jsx18(Text18, { children: " " }) }),
|
|
2209
|
+
/* @__PURE__ */ jsx18(Text18, { children: `To confirm, please type ${c.warning.bold(transferCode)} below:` }),
|
|
2210
|
+
/* @__PURE__ */ jsxs17(Box17, { marginTop: 1, flexDirection: "row", alignItems: "center", children: [
|
|
2211
|
+
/* @__PURE__ */ jsx18(Text18, { children: "Verification code: " }),
|
|
2212
|
+
/* @__PURE__ */ jsx18(
|
|
2213
|
+
TextInput5,
|
|
2214
|
+
{
|
|
2215
|
+
value: typedCode,
|
|
2216
|
+
onChange: handleCodeChange,
|
|
2217
|
+
onSubmit: handleCodeSubmit,
|
|
2218
|
+
focus: !transferring
|
|
2219
|
+
}
|
|
2220
|
+
)
|
|
2221
|
+
] }),
|
|
2222
|
+
/* @__PURE__ */ jsx18(Box17, { marginTop: 1, children: /* @__PURE__ */ jsx18(Text18, { color: theme.muted, children: "Type the code to continue \u2022 Esc to cancel" }) })
|
|
2223
|
+
] }),
|
|
2224
|
+
stage === "confirm" && /* @__PURE__ */ jsxs17(Fragment9, { children: [
|
|
2225
|
+
/* @__PURE__ */ jsx18(Box17, { height: 1, children: /* @__PURE__ */ jsx18(Text18, { children: " " }) }),
|
|
2226
|
+
/* @__PURE__ */ jsxs17(Text18, { children: [
|
|
2227
|
+
"Transfer ",
|
|
2228
|
+
c.text.bold(repo.nameWithOwner),
|
|
2229
|
+
" ",
|
|
2230
|
+
"\u2192",
|
|
2231
|
+
" ",
|
|
2232
|
+
c.warning.bold(`${newOwner}/${repo.name}`)
|
|
2233
|
+
] }),
|
|
2234
|
+
/* @__PURE__ */ jsx18(Box17, { marginTop: 1, children: /* @__PURE__ */ jsxs17(Text18, { color: theme.warning, children: [
|
|
2235
|
+
"\u26A0\uFE0F This hands ownership to ",
|
|
2236
|
+
newOwner,
|
|
2237
|
+
". You may lose admin access, and only the new owner can transfer it back."
|
|
2238
|
+
] }) }),
|
|
2239
|
+
transferring ? /* @__PURE__ */ jsx18(Box17, { marginTop: 2, justifyContent: "center", children: /* @__PURE__ */ jsxs17(Box17, { flexDirection: "row", children: [
|
|
2240
|
+
/* @__PURE__ */ jsx18(Box17, { marginRight: 1, children: /* @__PURE__ */ jsx18(SlowSpinner, {}) }),
|
|
2241
|
+
/* @__PURE__ */ jsx18(Text18, { color: theme.warning, children: "Transferring repository..." })
|
|
2242
|
+
] }) }) : /* @__PURE__ */ jsxs17(Fragment9, { children: [
|
|
2243
|
+
/* @__PURE__ */ jsxs17(Box17, { marginTop: 1, flexDirection: "row", justifyContent: "center", gap: 6, children: [
|
|
2244
|
+
/* @__PURE__ */ jsx18(
|
|
2245
|
+
Box17,
|
|
2246
|
+
{
|
|
2247
|
+
borderStyle: "round",
|
|
2248
|
+
borderColor: focus === "transfer" ? theme.warning : theme.muted,
|
|
2249
|
+
height: 3,
|
|
2250
|
+
width: 20,
|
|
2251
|
+
alignItems: "center",
|
|
2252
|
+
justifyContent: "center",
|
|
2253
|
+
flexDirection: "column",
|
|
2254
|
+
children: /* @__PURE__ */ jsx18(Text18, { children: focus === "transfer" ? c.btnPrimary(" Transfer ") : c.warning.bold("Transfer") })
|
|
2255
|
+
}
|
|
2256
|
+
),
|
|
2257
|
+
/* @__PURE__ */ jsx18(
|
|
2258
|
+
Box17,
|
|
2259
|
+
{
|
|
2260
|
+
borderStyle: "round",
|
|
2261
|
+
borderColor: focus === "cancel" ? "white" : theme.muted,
|
|
2262
|
+
height: 3,
|
|
2263
|
+
width: 20,
|
|
2264
|
+
alignItems: "center",
|
|
2265
|
+
justifyContent: "center",
|
|
2266
|
+
flexDirection: "column",
|
|
2267
|
+
children: /* @__PURE__ */ jsx18(Text18, { children: focus === "cancel" ? c.btnMuted(" Cancel ") : c.muted.bold("Cancel") })
|
|
2268
|
+
}
|
|
2269
|
+
)
|
|
2270
|
+
] }),
|
|
2271
|
+
/* @__PURE__ */ jsx18(Box17, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs17(Text18, { color: theme.muted, children: [
|
|
2272
|
+
"\u2190/\u2192 Focus \u2022 Enter to ",
|
|
2273
|
+
focus === "transfer" ? "Transfer" : "Cancel",
|
|
2274
|
+
" \u2022 Y Transfer \u2022 C/Esc Cancel"
|
|
2275
|
+
] }) })
|
|
2276
|
+
] })
|
|
2277
|
+
] }),
|
|
2278
|
+
error && /* @__PURE__ */ jsx18(Box17, { marginTop: 1, children: /* @__PURE__ */ jsx18(Text18, { color: theme.error, children: error }) })
|
|
2279
|
+
]
|
|
2280
|
+
}
|
|
2281
|
+
);
|
|
2282
|
+
}
|
|
2283
|
+
|
|
2284
|
+
// src/ui/components/modals/UnstarModal.tsx
|
|
2285
|
+
import { useEffect as useEffect12, useState as useState18 } from "react";
|
|
2286
|
+
import { Box as Box18, Text as Text19 } from "ink";
|
|
2287
|
+
import { useInput as useInput18 } from "ink";
|
|
2288
|
+
import { Fragment as Fragment10, jsx as jsx19, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
1945
2289
|
function UnstarModal({
|
|
1946
2290
|
visible,
|
|
1947
2291
|
repo,
|
|
@@ -1952,8 +2296,8 @@ function UnstarModal({
|
|
|
1952
2296
|
theme: themeProp
|
|
1953
2297
|
}) {
|
|
1954
2298
|
const { theme } = useTheme(themeProp?.name ?? "default");
|
|
1955
|
-
const [focusedButton, setFocusedButton] =
|
|
1956
|
-
|
|
2299
|
+
const [focusedButton, setFocusedButton] = useState18("cancel");
|
|
2300
|
+
useInput18((input, key) => {
|
|
1957
2301
|
if (!visible) return;
|
|
1958
2302
|
if (key.escape || input === "c" || input === "C") {
|
|
1959
2303
|
onCancel();
|
|
@@ -1971,12 +2315,12 @@ function UnstarModal({
|
|
|
1971
2315
|
if (input === "n" || input === "N") onCancel();
|
|
1972
2316
|
if (input === "u" || input === "U") onConfirm();
|
|
1973
2317
|
});
|
|
1974
|
-
|
|
2318
|
+
useEffect12(() => {
|
|
1975
2319
|
if (visible) setFocusedButton("cancel");
|
|
1976
2320
|
}, [visible]);
|
|
1977
2321
|
if (!visible || !repo) return null;
|
|
1978
|
-
return /* @__PURE__ */
|
|
1979
|
-
|
|
2322
|
+
return /* @__PURE__ */ jsxs18(
|
|
2323
|
+
Box18,
|
|
1980
2324
|
{
|
|
1981
2325
|
flexDirection: "column",
|
|
1982
2326
|
borderStyle: "round",
|
|
@@ -1985,28 +2329,28 @@ function UnstarModal({
|
|
|
1985
2329
|
paddingY: 1,
|
|
1986
2330
|
marginTop: 1,
|
|
1987
2331
|
children: [
|
|
1988
|
-
/* @__PURE__ */
|
|
1989
|
-
/* @__PURE__ */
|
|
2332
|
+
/* @__PURE__ */ jsx19(Box18, { marginBottom: 1, children: /* @__PURE__ */ jsx19(Text19, { bold: true, color: theme.warning, children: "\u2B50 Unstar Repository" }) }),
|
|
2333
|
+
/* @__PURE__ */ jsx19(Box18, { marginBottom: 1, children: /* @__PURE__ */ jsxs18(Text19, { children: [
|
|
1990
2334
|
"Are you sure you want to unstar",
|
|
1991
2335
|
" ",
|
|
1992
|
-
/* @__PURE__ */
|
|
2336
|
+
/* @__PURE__ */ jsx19(Text19, { bold: true, color: theme.primary, children: repo.nameWithOwner }),
|
|
1993
2337
|
"?"
|
|
1994
2338
|
] }) }),
|
|
1995
|
-
repo.description && /* @__PURE__ */
|
|
1996
|
-
/* @__PURE__ */
|
|
2339
|
+
repo.description && /* @__PURE__ */ jsx19(Box18, { marginBottom: 1, children: /* @__PURE__ */ jsx19(Text19, { dimColor: true, wrap: "wrap", children: repo.description }) }),
|
|
2340
|
+
/* @__PURE__ */ jsx19(Box18, { marginBottom: 1, children: /* @__PURE__ */ jsxs18(Text19, { dimColor: true, children: [
|
|
1997
2341
|
"Stars: ",
|
|
1998
2342
|
repo.stargazerCount,
|
|
1999
2343
|
" \u2022 Forks: ",
|
|
2000
2344
|
repo.forkCount
|
|
2001
2345
|
] }) }),
|
|
2002
|
-
error && /* @__PURE__ */
|
|
2346
|
+
error && /* @__PURE__ */ jsx19(Box18, { marginBottom: 1, flexDirection: "column", children: /* @__PURE__ */ jsxs18(Text19, { color: theme.error, wrap: "wrap", children: [
|
|
2003
2347
|
error.includes("OAuth access restrictions") ? "\u26A0\uFE0F " : "Error: ",
|
|
2004
2348
|
error
|
|
2005
2349
|
] }) }),
|
|
2006
|
-
isUnstarring ? /* @__PURE__ */
|
|
2007
|
-
/* @__PURE__ */
|
|
2008
|
-
/* @__PURE__ */
|
|
2009
|
-
|
|
2350
|
+
isUnstarring ? /* @__PURE__ */ jsx19(Box18, { children: /* @__PURE__ */ jsx19(Text19, { color: theme.warning, children: "Unstarring..." }) }) : /* @__PURE__ */ jsxs18(Fragment10, { children: [
|
|
2351
|
+
/* @__PURE__ */ jsxs18(Box18, { gap: 2, children: [
|
|
2352
|
+
/* @__PURE__ */ jsx19(Box18, { children: /* @__PURE__ */ jsxs18(
|
|
2353
|
+
Text19,
|
|
2010
2354
|
{
|
|
2011
2355
|
backgroundColor: focusedButton === "cancel" ? "white" : void 0,
|
|
2012
2356
|
color: focusedButton === "cancel" ? "black" : "white",
|
|
@@ -2018,8 +2362,8 @@ function UnstarModal({
|
|
|
2018
2362
|
]
|
|
2019
2363
|
}
|
|
2020
2364
|
) }),
|
|
2021
|
-
/* @__PURE__ */
|
|
2022
|
-
|
|
2365
|
+
/* @__PURE__ */ jsx19(Box18, { children: /* @__PURE__ */ jsxs18(
|
|
2366
|
+
Text19,
|
|
2023
2367
|
{
|
|
2024
2368
|
backgroundColor: focusedButton === "unstar" ? "yellow" : void 0,
|
|
2025
2369
|
color: focusedButton === "unstar" ? "black" : theme.warning,
|
|
@@ -2032,7 +2376,7 @@ function UnstarModal({
|
|
|
2032
2376
|
}
|
|
2033
2377
|
) })
|
|
2034
2378
|
] }),
|
|
2035
|
-
/* @__PURE__ */
|
|
2379
|
+
/* @__PURE__ */ jsx19(Box18, { marginTop: 1, children: /* @__PURE__ */ jsx19(Text19, { dimColor: true, children: "Use \u2190 \u2192 to navigate, Enter to select" }) })
|
|
2036
2380
|
] })
|
|
2037
2381
|
]
|
|
2038
2382
|
}
|
|
@@ -2040,9 +2384,9 @@ function UnstarModal({
|
|
|
2040
2384
|
}
|
|
2041
2385
|
|
|
2042
2386
|
// src/ui/components/repo/RepoRow.tsx
|
|
2043
|
-
import { Box as
|
|
2387
|
+
import { Box as Box19, Text as Text20 } from "ink";
|
|
2044
2388
|
import chalk14 from "chalk";
|
|
2045
|
-
import { jsx as
|
|
2389
|
+
import { jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
2046
2390
|
function RepoRow({
|
|
2047
2391
|
repo,
|
|
2048
2392
|
selected,
|
|
@@ -2102,21 +2446,21 @@ function RepoRow({
|
|
|
2102
2446
|
if (line3) fullText += "\n" + metaColor(line3);
|
|
2103
2447
|
const spacingAbove = Math.floor(spacingLines / 2);
|
|
2104
2448
|
const spacingBelow = spacingLines - spacingAbove;
|
|
2105
|
-
return /* @__PURE__ */
|
|
2106
|
-
spacingAbove > 0 && /* @__PURE__ */
|
|
2107
|
-
/* @__PURE__ */
|
|
2108
|
-
spacingBelow > 0 && /* @__PURE__ */
|
|
2449
|
+
return /* @__PURE__ */ jsxs19(Box19, { flexDirection: "column", backgroundColor: selected ? theme.selectedBg : void 0, children: [
|
|
2450
|
+
spacingAbove > 0 && /* @__PURE__ */ jsx20(Box19, { height: spacingAbove, children: /* @__PURE__ */ jsx20(Text20, { children: " " }) }),
|
|
2451
|
+
/* @__PURE__ */ jsx20(Text20, { children: dim ? chalk14.dim(fullText) : fullText }),
|
|
2452
|
+
spacingBelow > 0 && /* @__PURE__ */ jsx20(Box19, { height: spacingBelow, children: /* @__PURE__ */ jsx20(Text20, { children: " " }) })
|
|
2109
2453
|
] });
|
|
2110
2454
|
}
|
|
2111
2455
|
|
|
2112
2456
|
// src/ui/components/repo/FilterInput.tsx
|
|
2113
|
-
import { Box as
|
|
2114
|
-
import
|
|
2115
|
-
import { jsx as
|
|
2457
|
+
import { Box as Box20, Text as Text21 } from "ink";
|
|
2458
|
+
import TextInput6 from "ink-text-input";
|
|
2459
|
+
import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
2116
2460
|
|
|
2117
2461
|
// src/ui/components/repo/RepoListHeader.tsx
|
|
2118
|
-
import { Box as
|
|
2119
|
-
import { jsx as
|
|
2462
|
+
import { Box as Box21, Text as Text22 } from "ink";
|
|
2463
|
+
import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
2120
2464
|
function RepoListHeader({
|
|
2121
2465
|
ownerContext,
|
|
2122
2466
|
sortKey,
|
|
@@ -2133,26 +2477,26 @@ function RepoListHeader({
|
|
|
2133
2477
|
const { theme } = useTheme(themeProp?.name ?? "default");
|
|
2134
2478
|
const contextLabel = ownerContext === "personal" ? "Personal Account" : ownerContext?.type === "organization" ? `Organisation: ${ownerContext.name ?? ownerContext.login}` : "";
|
|
2135
2479
|
const visibilityLabel = visibilityFilter === "public" ? "Public" : visibilityFilter === "private" ? isEnterprise ? "Private/Internal" : "Private" : visibilityFilter === "internal" ? "Internal" : "";
|
|
2136
|
-
return /* @__PURE__ */
|
|
2137
|
-
contextLabel && /* @__PURE__ */
|
|
2138
|
-
starsMode && /* @__PURE__ */
|
|
2139
|
-
/* @__PURE__ */
|
|
2480
|
+
return /* @__PURE__ */ jsxs21(Box21, { flexDirection: "row", gap: 2, marginBottom: 1, children: [
|
|
2481
|
+
contextLabel && /* @__PURE__ */ jsx22(Text22, { children: contextLabel }),
|
|
2482
|
+
starsMode && /* @__PURE__ */ jsx22(Text22, { color: theme.warning, bold: true, children: "\u2B50 Stars Mode" }),
|
|
2483
|
+
/* @__PURE__ */ jsxs21(Text22, { color: theme.muted, dimColor: true, children: [
|
|
2140
2484
|
"Sort: ",
|
|
2141
2485
|
filterActive ? "relevance" : `${sortKey} ${sortDir === "asc" ? "\u2191" : "\u2193"}`
|
|
2142
2486
|
] }),
|
|
2143
|
-
/* @__PURE__ */
|
|
2487
|
+
/* @__PURE__ */ jsxs21(Text22, { color: theme.muted, dimColor: true, children: [
|
|
2144
2488
|
"Fork Status - Commits Behind: ",
|
|
2145
2489
|
forkTracking ? "ON" : "OFF"
|
|
2146
2490
|
] }),
|
|
2147
|
-
!!visibilityLabel && !starsMode && /* @__PURE__ */
|
|
2491
|
+
!!visibilityLabel && !starsMode && /* @__PURE__ */ jsxs21(Text22, { color: theme.warning, children: [
|
|
2148
2492
|
"Visibility: ",
|
|
2149
2493
|
visibilityLabel
|
|
2150
2494
|
] }),
|
|
2151
|
-
archiveFilter !== "all" && /* @__PURE__ */
|
|
2495
|
+
archiveFilter !== "all" && /* @__PURE__ */ jsxs21(Text22, { color: theme.primary, children: [
|
|
2152
2496
|
"Archive: ",
|
|
2153
2497
|
archiveFilter === "archived" ? "Archived" : "Unarchived"
|
|
2154
2498
|
] }),
|
|
2155
|
-
(filterActive || starsMode && filter.trim().length > 0) && /* @__PURE__ */
|
|
2499
|
+
(filterActive || starsMode && filter.trim().length > 0) && /* @__PURE__ */ jsxs21(Text22, { color: theme.primary, children: [
|
|
2156
2500
|
starsMode ? "Filter" : "Search",
|
|
2157
2501
|
': "',
|
|
2158
2502
|
filter.trim(),
|
|
@@ -2162,7 +2506,7 @@ function RepoListHeader({
|
|
|
2162
2506
|
}
|
|
2163
2507
|
|
|
2164
2508
|
// src/ui/views/RepoList.tsx
|
|
2165
|
-
import { Fragment as
|
|
2509
|
+
import { Fragment as Fragment11, jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
2166
2510
|
var getPageSize = () => {
|
|
2167
2511
|
const envValue = process.env.REPOS_PER_FETCH;
|
|
2168
2512
|
if (envValue) {
|
|
@@ -2178,17 +2522,17 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2178
2522
|
const { exit } = useApp();
|
|
2179
2523
|
const { stdout } = useStdout();
|
|
2180
2524
|
const client = useMemo2(() => makeClient(token), [token]);
|
|
2181
|
-
const [debugMessages, setDebugMessages] =
|
|
2525
|
+
const [debugMessages, setDebugMessages] = useState19([]);
|
|
2182
2526
|
const addDebugMessage = useCallback((msg) => {
|
|
2183
2527
|
if (process.env.GH_MANAGER_DEBUG === "1") {
|
|
2184
2528
|
setDebugMessages((prev) => [...prev.slice(-9), msg]);
|
|
2185
2529
|
}
|
|
2186
2530
|
}, []);
|
|
2187
|
-
const handleOrgContextChangeRef =
|
|
2188
|
-
|
|
2531
|
+
const handleOrgContextChangeRef = useRef3(onOrgContextChange);
|
|
2532
|
+
useEffect13(() => {
|
|
2189
2533
|
handleOrgContextChangeRef.current = onOrgContextChange;
|
|
2190
2534
|
}, [onOrgContextChange]);
|
|
2191
|
-
|
|
2535
|
+
React19.useEffect(() => {
|
|
2192
2536
|
addDebugMessage(`[RepoList] Component mounted`);
|
|
2193
2537
|
logger.info("RepoList component mounted", {
|
|
2194
2538
|
token: token ? "present" : "missing",
|
|
@@ -2200,90 +2544,93 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2200
2544
|
}, []);
|
|
2201
2545
|
const terminalWidth = stdout?.columns ?? 80;
|
|
2202
2546
|
const availableHeight = maxVisibleRows ?? 20;
|
|
2203
|
-
const [items, setItems] =
|
|
2204
|
-
const [cursor, setCursor] =
|
|
2205
|
-
const [endCursor, setEndCursor] =
|
|
2206
|
-
const [hasNextPage, setHasNextPage] =
|
|
2207
|
-
const [totalCount, setTotalCount] =
|
|
2208
|
-
const [loading, setLoading] =
|
|
2209
|
-
const [sortingLoading, setSortingLoading] =
|
|
2210
|
-
const [refreshing, setRefreshing] =
|
|
2211
|
-
const [loadingMore, setLoadingMore] =
|
|
2212
|
-
const [error, setError] =
|
|
2213
|
-
const [rateLimit, setRateLimit] =
|
|
2214
|
-
const [prevRateLimit, setPrevRateLimit] =
|
|
2215
|
-
const [restRateLimit, setRestRateLimit] =
|
|
2216
|
-
const [prevRestRateLimit, setPrevRestRateLimit] =
|
|
2217
|
-
const [density, setDensity] =
|
|
2218
|
-
const [prefsLoaded, setPrefsLoaded] =
|
|
2219
|
-
const [themeName, setThemeName] =
|
|
2220
|
-
const [themeToast, setThemeToast] =
|
|
2221
|
-
const themeToastTimerRef =
|
|
2547
|
+
const [items, setItems] = useState19([]);
|
|
2548
|
+
const [cursor, setCursor] = useState19(0);
|
|
2549
|
+
const [endCursor, setEndCursor] = useState19(null);
|
|
2550
|
+
const [hasNextPage, setHasNextPage] = useState19(false);
|
|
2551
|
+
const [totalCount, setTotalCount] = useState19(0);
|
|
2552
|
+
const [loading, setLoading] = useState19(true);
|
|
2553
|
+
const [sortingLoading, setSortingLoading] = useState19(false);
|
|
2554
|
+
const [refreshing, setRefreshing] = useState19(false);
|
|
2555
|
+
const [loadingMore, setLoadingMore] = useState19(false);
|
|
2556
|
+
const [error, setError] = useState19(null);
|
|
2557
|
+
const [rateLimit, setRateLimit] = useState19(void 0);
|
|
2558
|
+
const [prevRateLimit, setPrevRateLimit] = useState19(void 0);
|
|
2559
|
+
const [restRateLimit, setRestRateLimit] = useState19(void 0);
|
|
2560
|
+
const [prevRestRateLimit, setPrevRestRateLimit] = useState19(void 0);
|
|
2561
|
+
const [density, setDensity] = useState19(2);
|
|
2562
|
+
const [prefsLoaded, setPrefsLoaded] = useState19(false);
|
|
2563
|
+
const [themeName, setThemeName] = useState19("default");
|
|
2564
|
+
const [themeToast, setThemeToast] = useState19(null);
|
|
2565
|
+
const themeToastTimerRef = useRef3(null);
|
|
2222
2566
|
const { theme, c: tc } = useTheme(themeName);
|
|
2223
|
-
const [ownerContext, setOwnerContext] =
|
|
2224
|
-
const [ownerAffiliations, setOwnerAffiliations] =
|
|
2225
|
-
const [orgSwitcherOpen, setOrgSwitcherOpen] =
|
|
2226
|
-
const [operationCount, setOperationCount] =
|
|
2227
|
-
const [showSponsorReminder, setShowSponsorReminder] =
|
|
2228
|
-
const [deleteMode, setDeleteMode] =
|
|
2229
|
-
const [deleteTarget, setDeleteTarget] =
|
|
2230
|
-
const [deleteCode, setDeleteCode] =
|
|
2231
|
-
const [typedCode, setTypedCode] =
|
|
2232
|
-
const [deleting, setDeleting] =
|
|
2233
|
-
const [deleteError, setDeleteError] =
|
|
2234
|
-
const [deleteConfirmStage, setDeleteConfirmStage] =
|
|
2235
|
-
const [confirmFocus, setConfirmFocus] =
|
|
2236
|
-
const [archiveMode, setArchiveMode] =
|
|
2237
|
-
const [archiveTarget, setArchiveTarget] =
|
|
2238
|
-
const [archiving, setArchiving] =
|
|
2239
|
-
const [archiveError, setArchiveError] =
|
|
2240
|
-
const [archiveFocus, setArchiveFocus] =
|
|
2241
|
-
const [syncMode, setSyncMode] =
|
|
2242
|
-
const [syncTarget, setSyncTarget] =
|
|
2243
|
-
const [syncing, setSyncing] =
|
|
2244
|
-
const [syncError, setSyncError] =
|
|
2245
|
-
const [syncFocus, setSyncFocus] =
|
|
2246
|
-
const [renameMode, setRenameMode] =
|
|
2247
|
-
const [renameTarget, setRenameTarget] =
|
|
2248
|
-
const [
|
|
2249
|
-
const [
|
|
2250
|
-
const [
|
|
2251
|
-
const [
|
|
2252
|
-
const [
|
|
2253
|
-
const [
|
|
2254
|
-
const [
|
|
2255
|
-
const [
|
|
2256
|
-
const [
|
|
2257
|
-
const [
|
|
2258
|
-
const [
|
|
2259
|
-
const [
|
|
2260
|
-
const [
|
|
2261
|
-
const [
|
|
2262
|
-
const [
|
|
2263
|
-
const [
|
|
2264
|
-
const [
|
|
2265
|
-
const [
|
|
2266
|
-
const [
|
|
2267
|
-
const [
|
|
2268
|
-
const [
|
|
2269
|
-
const [
|
|
2270
|
-
const [
|
|
2271
|
-
const [
|
|
2272
|
-
const [
|
|
2273
|
-
const [
|
|
2274
|
-
const [
|
|
2275
|
-
const [
|
|
2276
|
-
const [
|
|
2277
|
-
const [
|
|
2278
|
-
const [
|
|
2279
|
-
const [
|
|
2280
|
-
const [
|
|
2281
|
-
const [
|
|
2282
|
-
const [
|
|
2283
|
-
const [
|
|
2284
|
-
const
|
|
2285
|
-
const
|
|
2286
|
-
|
|
2567
|
+
const [ownerContext, setOwnerContext] = useState19("personal");
|
|
2568
|
+
const [ownerAffiliations, setOwnerAffiliations] = useState19(["OWNER"]);
|
|
2569
|
+
const [orgSwitcherOpen, setOrgSwitcherOpen] = useState19(false);
|
|
2570
|
+
const [operationCount, setOperationCount] = useState19(0);
|
|
2571
|
+
const [showSponsorReminder, setShowSponsorReminder] = useState19(false);
|
|
2572
|
+
const [deleteMode, setDeleteMode] = useState19(false);
|
|
2573
|
+
const [deleteTarget, setDeleteTarget] = useState19(null);
|
|
2574
|
+
const [deleteCode, setDeleteCode] = useState19("");
|
|
2575
|
+
const [typedCode, setTypedCode] = useState19("");
|
|
2576
|
+
const [deleting, setDeleting] = useState19(false);
|
|
2577
|
+
const [deleteError, setDeleteError] = useState19(null);
|
|
2578
|
+
const [deleteConfirmStage, setDeleteConfirmStage] = useState19(false);
|
|
2579
|
+
const [confirmFocus, setConfirmFocus] = useState19("delete");
|
|
2580
|
+
const [archiveMode, setArchiveMode] = useState19(false);
|
|
2581
|
+
const [archiveTarget, setArchiveTarget] = useState19(null);
|
|
2582
|
+
const [archiving, setArchiving] = useState19(false);
|
|
2583
|
+
const [archiveError, setArchiveError] = useState19(null);
|
|
2584
|
+
const [archiveFocus, setArchiveFocus] = useState19("confirm");
|
|
2585
|
+
const [syncMode, setSyncMode] = useState19(false);
|
|
2586
|
+
const [syncTarget, setSyncTarget] = useState19(null);
|
|
2587
|
+
const [syncing, setSyncing] = useState19(false);
|
|
2588
|
+
const [syncError, setSyncError] = useState19(null);
|
|
2589
|
+
const [syncFocus, setSyncFocus] = useState19("confirm");
|
|
2590
|
+
const [renameMode, setRenameMode] = useState19(false);
|
|
2591
|
+
const [renameTarget, setRenameTarget] = useState19(null);
|
|
2592
|
+
const [createMode, setCreateMode] = useState19(false);
|
|
2593
|
+
const [transferMode, setTransferMode] = useState19(false);
|
|
2594
|
+
const [transferTarget, setTransferTarget] = useState19(null);
|
|
2595
|
+
const [copyUrlMode, setCopyUrlMode] = useState19(false);
|
|
2596
|
+
const [copyUrlTarget, setCopyUrlTarget] = useState19(null);
|
|
2597
|
+
const [copyToast, setCopyToast] = useState19(null);
|
|
2598
|
+
const [syncTrigger, setSyncTrigger] = useState19(false);
|
|
2599
|
+
const [infoMode, setInfoMode] = useState19(false);
|
|
2600
|
+
const [infoRepo, setInfoRepo] = useState19(null);
|
|
2601
|
+
const [logoutMode, setLogoutMode] = useState19(false);
|
|
2602
|
+
const [logoutFocus, setLogoutFocus] = useState19("confirm");
|
|
2603
|
+
const [logoutError, setLogoutError] = useState19(null);
|
|
2604
|
+
const [archiveFilterMode, setArchiveFilterMode] = useState19(false);
|
|
2605
|
+
const [visibilityMode, setVisibilityMode] = useState19(false);
|
|
2606
|
+
const [isEnterpriseOrg, setIsEnterpriseOrg] = useState19(false);
|
|
2607
|
+
const [hasInternalRepos, setHasInternalRepos] = useState19(false);
|
|
2608
|
+
const [changeVisibilityMode, setChangeVisibilityMode] = useState19(false);
|
|
2609
|
+
const [changeVisibilityTarget, setChangeVisibilityTarget] = useState19(null);
|
|
2610
|
+
const [changingVisibility, setChangingVisibility] = useState19(false);
|
|
2611
|
+
const [changeVisibilityError, setChangeVisibilityError] = useState19(null);
|
|
2612
|
+
const [sortMode, setSortMode] = useState19(false);
|
|
2613
|
+
const [sortDirectionMode, setSortDirectionMode] = useState19(false);
|
|
2614
|
+
const [starsMode, setStarsMode] = useState19(false);
|
|
2615
|
+
const [starredItems, setStarredItems] = useState19([]);
|
|
2616
|
+
const [starredEndCursor, setStarredEndCursor] = useState19(null);
|
|
2617
|
+
const [starredHasNextPage, setStarredHasNextPage] = useState19(false);
|
|
2618
|
+
const [starredTotalCount, setStarredTotalCount] = useState19(0);
|
|
2619
|
+
const [starredLoading, setStarredLoading] = useState19(false);
|
|
2620
|
+
const [unstarMode, setUnstarMode] = useState19(false);
|
|
2621
|
+
const [unstarTarget, setUnstarTarget] = useState19(null);
|
|
2622
|
+
const [unstarring, setUnstarring] = useState19(false);
|
|
2623
|
+
const [unstarError, setUnstarError] = useState19(null);
|
|
2624
|
+
const [starMode, setStarMode] = useState19(false);
|
|
2625
|
+
const [starTarget, setStarTarget] = useState19(null);
|
|
2626
|
+
const [starring, setStarring] = useState19(false);
|
|
2627
|
+
const [starError, setStarError] = useState19(null);
|
|
2628
|
+
const [openInBrowserMode, setOpenInBrowserMode] = useState19(false);
|
|
2629
|
+
const [openInBrowserTarget, setOpenInBrowserTarget] = useState19(null);
|
|
2630
|
+
const [enrichingForks, setEnrichingForks] = useState19(false);
|
|
2631
|
+
const enrichmentDoneRef = useRef3(/* @__PURE__ */ new Set());
|
|
2632
|
+
const appliedInitialOrg = useRef3(false);
|
|
2633
|
+
useEffect13(() => {
|
|
2287
2634
|
(async () => {
|
|
2288
2635
|
if (appliedInitialOrg.current) return;
|
|
2289
2636
|
if (!initialOrgSlug2) return;
|
|
@@ -2521,7 +2868,62 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2521
2868
|
throw error2;
|
|
2522
2869
|
}
|
|
2523
2870
|
}
|
|
2524
|
-
|
|
2871
|
+
async function executeCreate(name, visibility) {
|
|
2872
|
+
if (!name.trim()) return;
|
|
2873
|
+
const org = ownerContext !== "personal" ? ownerContext.login : void 0;
|
|
2874
|
+
const { nameWithOwner } = await createRepositoryRest(token, { name: name.trim(), visibility, org });
|
|
2875
|
+
setFilter("");
|
|
2876
|
+
setFilterMode(false);
|
|
2877
|
+
if (archiveFilter === "archived") {
|
|
2878
|
+
storeUIPrefs({ archiveFilter: "all" });
|
|
2879
|
+
setArchiveFilter("all");
|
|
2880
|
+
}
|
|
2881
|
+
const passesVisibilityFilter = visibilityFilter === "all" || visibilityFilter === "public" && visibility === "PUBLIC" || visibilityFilter === "private" && (visibility === "PRIVATE" || visibility === "INTERNAL");
|
|
2882
|
+
if (!passesVisibilityFilter) {
|
|
2883
|
+
previousVisibilityFilter.current = "all";
|
|
2884
|
+
storeUIPrefs({ visibilityFilter: "all" });
|
|
2885
|
+
setVisibilityFilter("all");
|
|
2886
|
+
}
|
|
2887
|
+
const [owner, repoName] = (nameWithOwner || "").split("/");
|
|
2888
|
+
let created = await fetchRepositoryByOwnerAndName(client, owner, repoName);
|
|
2889
|
+
if (!created) {
|
|
2890
|
+
await new Promise((resolve) => setTimeout(resolve, 600));
|
|
2891
|
+
created = await fetchRepositoryByOwnerAndName(client, owner, repoName);
|
|
2892
|
+
}
|
|
2893
|
+
setCreateMode(false);
|
|
2894
|
+
pendingFocusRef.current = nameWithOwner;
|
|
2895
|
+
if (created) {
|
|
2896
|
+
await updateCacheWithRepository(token, created);
|
|
2897
|
+
const createdId = created.id;
|
|
2898
|
+
setItems((prev) => prev.some((r) => r.id === createdId) ? prev : [created, ...prev]);
|
|
2899
|
+
setTotalCount((c) => c + 1);
|
|
2900
|
+
} else {
|
|
2901
|
+
setRefreshing(true);
|
|
2902
|
+
setSortingLoading(true);
|
|
2903
|
+
try {
|
|
2904
|
+
await purgeApolloCacheFiles();
|
|
2905
|
+
} catch {
|
|
2906
|
+
}
|
|
2907
|
+
fetchPage(null, true, true, void 0, "network-only", passesVisibilityFilter ? void 0 : "all");
|
|
2908
|
+
}
|
|
2909
|
+
}
|
|
2910
|
+
function closeTransferModal() {
|
|
2911
|
+
setTransferMode(false);
|
|
2912
|
+
setTransferTarget(null);
|
|
2913
|
+
}
|
|
2914
|
+
async function executeTransfer(repo, newOwner) {
|
|
2915
|
+
if (!repo || !newOwner.trim()) return;
|
|
2916
|
+
const [owner, name] = (repo.nameWithOwner || "").split("/");
|
|
2917
|
+
const targetId = repo.id;
|
|
2918
|
+
await transferRepositoryRest(token, owner, name, newOwner.trim());
|
|
2919
|
+
await updateCacheAfterDelete(token, targetId);
|
|
2920
|
+
setItems((prev) => prev.filter((r) => r.id !== targetId));
|
|
2921
|
+
setTotalCount((c) => Math.max(0, c - 1));
|
|
2922
|
+
setCursor((c) => Math.max(0, Math.min(c, visibleItems.length - 2)));
|
|
2923
|
+
trackSuccessfulOperation();
|
|
2924
|
+
closeTransferModal();
|
|
2925
|
+
}
|
|
2926
|
+
const copyToastTimerRef = useRef3(null);
|
|
2525
2927
|
async function handleCopyUrl(url, type) {
|
|
2526
2928
|
try {
|
|
2527
2929
|
if (copyToastTimerRef.current) {
|
|
@@ -2548,7 +2950,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2548
2950
|
throw error2;
|
|
2549
2951
|
}
|
|
2550
2952
|
}
|
|
2551
|
-
|
|
2953
|
+
useEffect13(() => {
|
|
2552
2954
|
return () => {
|
|
2553
2955
|
if (copyToastTimerRef.current) clearTimeout(copyToastTimerRef.current);
|
|
2554
2956
|
if (themeToastTimerRef.current) clearTimeout(themeToastTimerRef.current);
|
|
@@ -2643,12 +3045,12 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2643
3045
|
setDeleteError("Failed to delete repository. Ensure delete_repo scope and admin permissions.");
|
|
2644
3046
|
}
|
|
2645
3047
|
}
|
|
2646
|
-
const [filter, setFilter] =
|
|
2647
|
-
const [filterMode, setFilterMode] =
|
|
2648
|
-
const [sortKey, setSortKey] =
|
|
2649
|
-
const [sortDir, setSortDir] =
|
|
2650
|
-
const [forkTracking, setForkTracking] =
|
|
2651
|
-
|
|
3048
|
+
const [filter, setFilter] = useState19("");
|
|
3049
|
+
const [filterMode, setFilterMode] = useState19(false);
|
|
3050
|
+
const [sortKey, setSortKey] = useState19("updated");
|
|
3051
|
+
const [sortDir, setSortDir] = useState19("desc");
|
|
3052
|
+
const [forkTracking, setForkTracking] = useState19(true);
|
|
3053
|
+
useEffect13(() => {
|
|
2652
3054
|
if (loading || loadingMore || hasNextPage || items.length === 0) return;
|
|
2653
3055
|
if (!forkTracking) return;
|
|
2654
3056
|
const unenriched = items.filter(
|
|
@@ -2714,22 +3116,27 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2714
3116
|
async function jumpToUpstreamRepo(parentNameWithOwner) {
|
|
2715
3117
|
const [parentOwner, parentName] = parentNameWithOwner.split("/");
|
|
2716
3118
|
if (!parentOwner || !parentName) return;
|
|
2717
|
-
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
|
|
3119
|
+
try {
|
|
3120
|
+
const repo = await fetchRepositoryByOwnerAndName(client, parentOwner, parentName);
|
|
3121
|
+
if (repo) {
|
|
3122
|
+
setInfoRepo(repo);
|
|
3123
|
+
setInfoMode(true);
|
|
3124
|
+
}
|
|
3125
|
+
} catch (err) {
|
|
3126
|
+
logger.error("Failed to fetch upstream repository", { error: err?.message, parentNameWithOwner });
|
|
2721
3127
|
}
|
|
2722
3128
|
}
|
|
2723
|
-
const [visibilityFilter, setVisibilityFilter] =
|
|
2724
|
-
const previousVisibilityFilter =
|
|
2725
|
-
const
|
|
3129
|
+
const [visibilityFilter, setVisibilityFilter] = useState19("all");
|
|
3130
|
+
const previousVisibilityFilter = useRef3("all");
|
|
3131
|
+
const pendingFocusRef = useRef3(null);
|
|
3132
|
+
const [archiveFilter, setArchiveFilter] = useState19("all");
|
|
2726
3133
|
const sortFieldMap = {
|
|
2727
3134
|
"updated": "UPDATED_AT",
|
|
2728
3135
|
"pushed": "PUSHED_AT",
|
|
2729
3136
|
"name": "NAME",
|
|
2730
3137
|
"stars": "STARGAZERS"
|
|
2731
3138
|
};
|
|
2732
|
-
const fetchPage = async (after, reset = false, isSortChange = false, overrideForkTracking, policy) => {
|
|
3139
|
+
const fetchPage = async (after, reset = false, isSortChange = false, overrideForkTracking, policy, privacyOverride) => {
|
|
2733
3140
|
logger.info("fetchPage called", {
|
|
2734
3141
|
after,
|
|
2735
3142
|
reset,
|
|
@@ -2753,7 +3160,9 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2753
3160
|
};
|
|
2754
3161
|
const orgLogin = ownerContext !== "personal" ? ownerContext.login : void 0;
|
|
2755
3162
|
let privacy;
|
|
2756
|
-
if (
|
|
3163
|
+
if (privacyOverride !== void 0) {
|
|
3164
|
+
privacy = privacyOverride === "all" ? void 0 : privacyOverride;
|
|
3165
|
+
} else if (visibilityFilter === "public") privacy = "PUBLIC";
|
|
2757
3166
|
else if (visibilityFilter === "private") privacy = "PRIVATE";
|
|
2758
3167
|
const page = await fetchViewerReposPageUnified(
|
|
2759
3168
|
token,
|
|
@@ -2827,7 +3236,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2827
3236
|
setLoadingMore(false);
|
|
2828
3237
|
}
|
|
2829
3238
|
};
|
|
2830
|
-
|
|
3239
|
+
useEffect13(() => {
|
|
2831
3240
|
const ui = getUIPrefs();
|
|
2832
3241
|
if (ui.density !== void 0) setDensity(ui.density);
|
|
2833
3242
|
if (ui.sortKey && ["updated", "pushed", "name", "stars"].includes(ui.sortKey)) {
|
|
@@ -2863,7 +3272,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2863
3272
|
}
|
|
2864
3273
|
setPrefsLoaded(true);
|
|
2865
3274
|
}, [onOrgContextChange]);
|
|
2866
|
-
|
|
3275
|
+
useEffect13(() => {
|
|
2867
3276
|
if (!prefsLoaded) return;
|
|
2868
3277
|
let policy = "cache-first";
|
|
2869
3278
|
const orgLogin = ownerContext !== "personal" ? ownerContext.login : void 0;
|
|
@@ -2883,7 +3292,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2883
3292
|
setCursor(0);
|
|
2884
3293
|
fetchPage(null, true, false, void 0, policy);
|
|
2885
3294
|
}, [client, prefsLoaded, ownerContext, ownerAffiliations]);
|
|
2886
|
-
|
|
3295
|
+
useEffect13(() => {
|
|
2887
3296
|
if (visibilityFilter !== "all" || previousVisibilityFilter.current && previousVisibilityFilter.current !== visibilityFilter) {
|
|
2888
3297
|
if (items.length > 0) {
|
|
2889
3298
|
fetchPage(null, true, true, void 0, "network-only");
|
|
@@ -2891,7 +3300,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2891
3300
|
}
|
|
2892
3301
|
previousVisibilityFilter.current = visibilityFilter;
|
|
2893
3302
|
}, [visibilityFilter]);
|
|
2894
|
-
|
|
3303
|
+
useInput19((input, key) => {
|
|
2895
3304
|
if (error) {
|
|
2896
3305
|
if (input && input.toUpperCase() === "Q") {
|
|
2897
3306
|
try {
|
|
@@ -3053,6 +3462,12 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3053
3462
|
if (renameMode) {
|
|
3054
3463
|
return;
|
|
3055
3464
|
}
|
|
3465
|
+
if (createMode) {
|
|
3466
|
+
return;
|
|
3467
|
+
}
|
|
3468
|
+
if (transferMode) {
|
|
3469
|
+
return;
|
|
3470
|
+
}
|
|
3056
3471
|
if (openInBrowserMode) {
|
|
3057
3472
|
return;
|
|
3058
3473
|
}
|
|
@@ -3244,8 +3659,20 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3244
3659
|
}
|
|
3245
3660
|
return;
|
|
3246
3661
|
}
|
|
3247
|
-
if (
|
|
3248
|
-
|
|
3662
|
+
if (key.ctrl && (input === "n" || input === "N")) {
|
|
3663
|
+
if (!starsMode) {
|
|
3664
|
+
setCreateMode(true);
|
|
3665
|
+
}
|
|
3666
|
+
return;
|
|
3667
|
+
}
|
|
3668
|
+
if (key.shift && input === "M") {
|
|
3669
|
+
if (!starsMode) {
|
|
3670
|
+
const repo = visibleItems[cursor];
|
|
3671
|
+
if (repo) {
|
|
3672
|
+
setTransferTarget(repo);
|
|
3673
|
+
setTransferMode(true);
|
|
3674
|
+
}
|
|
3675
|
+
}
|
|
3249
3676
|
return;
|
|
3250
3677
|
}
|
|
3251
3678
|
if (input && input.toUpperCase() === "S" && !key.shift && !key.ctrl && !filterActive) {
|
|
@@ -3408,9 +3835,18 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3408
3835
|
return result;
|
|
3409
3836
|
}, [starredItems, filter, archiveFilter]);
|
|
3410
3837
|
const visibleItems = starsMode ? filteredStarredItems : filterActive ? fuzzyItems : filteredAndSorted;
|
|
3411
|
-
|
|
3838
|
+
useEffect13(() => {
|
|
3412
3839
|
setCursor((c) => Math.min(c, Math.max(0, visibleItems.length - 1)));
|
|
3413
3840
|
}, [filterActive, items.length, visibleItems.length]);
|
|
3841
|
+
useEffect13(() => {
|
|
3842
|
+
const target = pendingFocusRef.current;
|
|
3843
|
+
if (!target) return;
|
|
3844
|
+
const idx = visibleItems.findIndex((r) => r.nameWithOwner === target);
|
|
3845
|
+
if (idx >= 0) {
|
|
3846
|
+
setCursor(idx);
|
|
3847
|
+
pendingFocusRef.current = null;
|
|
3848
|
+
}
|
|
3849
|
+
}, [visibleItems]);
|
|
3414
3850
|
const headerHeight = 2;
|
|
3415
3851
|
const footerHeight = 4;
|
|
3416
3852
|
const containerPadding = 2;
|
|
@@ -3421,7 +3857,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3421
3857
|
() => computeWindow(visibleItems, cursor, listHeight, spacingLines),
|
|
3422
3858
|
[visibleItems, cursor, listHeight, spacingLines]
|
|
3423
3859
|
);
|
|
3424
|
-
|
|
3860
|
+
useEffect13(() => {
|
|
3425
3861
|
const rawItemsLength = starsMode ? starredItems.length : items.length;
|
|
3426
3862
|
const filterDrainedPage = visibleItems.length === 0 && archiveFilter !== "all" && rawItemsLength > 0;
|
|
3427
3863
|
if (starsMode) {
|
|
@@ -3440,79 +3876,79 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3440
3876
|
exec(cmd);
|
|
3441
3877
|
}
|
|
3442
3878
|
const lowRate = rateLimit && rateLimit.remaining <= Math.ceil(rateLimit.limit * 0.1) || restRateLimit && restRateLimit.core.remaining <= Math.ceil(restRateLimit.core.limit * 0.1);
|
|
3443
|
-
const modalOpen = deleteMode || archiveMode || syncMode || logoutMode || infoMode || visibilityMode || archiveFilterMode || sortMode || sortDirectionMode || changeVisibilityMode || copyUrlMode || renameMode || openInBrowserMode;
|
|
3444
|
-
const headerBar = useMemo2(() => /* @__PURE__ */
|
|
3445
|
-
/* @__PURE__ */
|
|
3446
|
-
/* @__PURE__ */
|
|
3879
|
+
const modalOpen = deleteMode || archiveMode || syncMode || logoutMode || infoMode || visibilityMode || archiveFilterMode || sortMode || sortDirectionMode || changeVisibilityMode || copyUrlMode || renameMode || openInBrowserMode || createMode || transferMode;
|
|
3880
|
+
const headerBar = useMemo2(() => /* @__PURE__ */ jsxs22(Box22, { flexDirection: "row", justifyContent: "space-between", height: 1, marginBottom: 1, children: [
|
|
3881
|
+
/* @__PURE__ */ jsxs22(Box22, { flexDirection: "row", gap: 1, children: [
|
|
3882
|
+
/* @__PURE__ */ jsxs22(Text23, { color: theme.primary, bold: !modalOpen, dimColor: modalOpen, children: [
|
|
3447
3883
|
" ",
|
|
3448
3884
|
ownerContext === "personal" ? "Personal" : ownerContext.name || ownerContext.login,
|
|
3449
3885
|
ownerContext !== "personal" && isEnterpriseOrg && " (ENT)"
|
|
3450
3886
|
] }),
|
|
3451
|
-
/* @__PURE__ */
|
|
3452
|
-
/* @__PURE__ */
|
|
3887
|
+
/* @__PURE__ */ jsx23(Text23, { bold: true, color: modalOpen ? theme.muted : void 0, dimColor: modalOpen ? true : void 0, children: "Repositories" }),
|
|
3888
|
+
/* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3453
3889
|
"(",
|
|
3454
3890
|
visibleItems.length,
|
|
3455
3891
|
"/",
|
|
3456
3892
|
totalCount,
|
|
3457
3893
|
")"
|
|
3458
3894
|
] }),
|
|
3459
|
-
loadingMore && hasNextPage && !starsMode && totalCount > 0 && /* @__PURE__ */
|
|
3460
|
-
enrichingForks && /* @__PURE__ */
|
|
3461
|
-
(loading || loadingMore) && /* @__PURE__ */
|
|
3895
|
+
loadingMore && hasNextPage && !starsMode && totalCount > 0 && /* @__PURE__ */ jsx23(Text23, { color: theme.primary, children: ` \xB7 loading ${items.length}/${totalCount}` }),
|
|
3896
|
+
enrichingForks && /* @__PURE__ */ jsx23(Text23, { color: theme.muted, children: ` \xB7 enriching forks\u2026` }),
|
|
3897
|
+
(loading || loadingMore) && /* @__PURE__ */ jsx23(Box22, { width: 2, flexShrink: 0, flexGrow: 0, marginLeft: 1, children: /* @__PURE__ */ jsx23(Text23, { color: theme.warning, children: /* @__PURE__ */ jsx23(SlowSpinner, {}) }) })
|
|
3462
3898
|
] }),
|
|
3463
|
-
(rateLimit || restRateLimit) && /* @__PURE__ */
|
|
3899
|
+
(rateLimit || restRateLimit) && /* @__PURE__ */ jsxs22(Text23, { color: lowRate ? theme.warning : theme.muted, children: [
|
|
3464
3900
|
"GraphQL: ",
|
|
3465
3901
|
rateLimit ? `${rateLimit.remaining}/${rateLimit.limit}` : "---/---",
|
|
3466
|
-
prevRateLimit !== void 0 && rateLimit && prevRateLimit !== rateLimit.remaining && /* @__PURE__ */
|
|
3902
|
+
prevRateLimit !== void 0 && rateLimit && prevRateLimit !== rateLimit.remaining && /* @__PURE__ */ jsx23(Text23, { color: rateLimit.remaining < prevRateLimit ? theme.error : theme.success, children: ` (${rateLimit.remaining - prevRateLimit > 0 ? "+" : ""}${rateLimit.remaining - prevRateLimit})` }),
|
|
3467
3903
|
" | ",
|
|
3468
3904
|
"REST: ",
|
|
3469
3905
|
restRateLimit ? `${restRateLimit.core.remaining}/${restRateLimit.core.limit}` : "---/---",
|
|
3470
|
-
prevRestRateLimit !== void 0 && restRateLimit && prevRestRateLimit !== restRateLimit.core.remaining && /* @__PURE__ */
|
|
3906
|
+
prevRestRateLimit !== void 0 && restRateLimit && prevRestRateLimit !== restRateLimit.core.remaining && /* @__PURE__ */ jsx23(Text23, { color: restRateLimit.core.remaining < prevRestRateLimit ? theme.error : theme.success, children: ` (${restRateLimit.core.remaining - prevRestRateLimit > 0 ? "+" : ""}${restRateLimit.core.remaining - prevRestRateLimit})` }),
|
|
3471
3907
|
" "
|
|
3472
3908
|
] })
|
|
3473
3909
|
] }), [visibleItems.length, totalCount, loading, loadingMore, rateLimit, lowRate, modalOpen, prevRateLimit, ownerContext, isEnterpriseOrg, restRateLimit, prevRestRateLimit, enrichingForks, starsMode, hasNextPage, items.length, theme]);
|
|
3474
3910
|
if (error) {
|
|
3475
|
-
return /* @__PURE__ */
|
|
3476
|
-
/* @__PURE__ */
|
|
3477
|
-
/* @__PURE__ */
|
|
3478
|
-
/* @__PURE__ */
|
|
3911
|
+
return /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", height: availableHeight, children: [
|
|
3912
|
+
/* @__PURE__ */ jsx23(Box22, { flexDirection: "row", justifyContent: "space-between", height: 1, marginBottom: 1, children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "row", gap: 1, children: [
|
|
3913
|
+
/* @__PURE__ */ jsx23(Text23, { bold: true, children: " Repositories" }),
|
|
3914
|
+
/* @__PURE__ */ jsx23(Text23, { color: "red", children: "(Error)" })
|
|
3479
3915
|
] }) }),
|
|
3480
|
-
/* @__PURE__ */
|
|
3481
|
-
/* @__PURE__ */
|
|
3482
|
-
/* @__PURE__ */
|
|
3916
|
+
/* @__PURE__ */ jsx23(Box22, { borderStyle: "single", borderColor: "red", paddingX: 1, paddingY: 1, marginX: 1, height: contentHeight + containerPadding + 2, flexDirection: "column", children: /* @__PURE__ */ jsx23(Box22, { height: contentHeight, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", alignItems: "center", children: [
|
|
3917
|
+
/* @__PURE__ */ jsx23(Text23, { color: "red", children: error }),
|
|
3918
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "gray", dimColor: true, children: "Press R to retry \u2022 Ctrl+L to logout \u2022 Q to quit" }) })
|
|
3483
3919
|
] }) }) }),
|
|
3484
|
-
/* @__PURE__ */
|
|
3920
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, paddingX: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "gray", children: "Press R to retry \u2022 Ctrl+L to logout \u2022 Q to quit" }) })
|
|
3485
3921
|
] });
|
|
3486
3922
|
}
|
|
3487
3923
|
if (loading && items.length === 0 || sortingLoading) {
|
|
3488
|
-
return /* @__PURE__ */
|
|
3489
|
-
/* @__PURE__ */
|
|
3490
|
-
/* @__PURE__ */
|
|
3491
|
-
/* @__PURE__ */
|
|
3924
|
+
return /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", height: availableHeight, children: [
|
|
3925
|
+
/* @__PURE__ */ jsx23(Box22, { flexDirection: "row", justifyContent: "space-between", height: 1, marginBottom: 1, children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "row", gap: 1, children: [
|
|
3926
|
+
/* @__PURE__ */ jsx23(Text23, { bold: true, children: " Repositories" }),
|
|
3927
|
+
/* @__PURE__ */ jsx23(Text23, { color: "gray", children: "(Loading...)" })
|
|
3492
3928
|
] }) }),
|
|
3493
|
-
/* @__PURE__ */
|
|
3494
|
-
/* @__PURE__ */
|
|
3495
|
-
/* @__PURE__ */
|
|
3496
|
-
/* @__PURE__ */
|
|
3929
|
+
/* @__PURE__ */ jsx23(Box22, { borderStyle: "single", borderColor: "yellow", paddingX: 1, paddingY: 1, marginX: 1, height: contentHeight + containerPadding + 2, flexDirection: "column", children: /* @__PURE__ */ jsx23(Box22, { height: contentHeight, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsx23(Box22, { flexDirection: "column", alignItems: "center", children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", alignItems: "center", children: [
|
|
3930
|
+
/* @__PURE__ */ jsxs22(Box22, { height: 1, flexDirection: "row", children: [
|
|
3931
|
+
/* @__PURE__ */ jsx23(Box22, { width: 2, flexShrink: 0, flexGrow: 0, children: /* @__PURE__ */ jsx23(Text23, { color: "cyan", children: /* @__PURE__ */ jsx23(SlowSpinner, {}) }) }),
|
|
3932
|
+
/* @__PURE__ */ jsx23(Text23, { color: "cyan", children: refreshing ? "Refreshing..." : sortingLoading ? "Applying sort..." : "Loading repositories..." })
|
|
3497
3933
|
] }),
|
|
3498
|
-
/* @__PURE__ */
|
|
3934
|
+
/* @__PURE__ */ jsx23(Box22, { height: 1, marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "gray", children: refreshing ? "Fetching latest repository data" : sortingLoading ? `Sorting by ${sortKey} (${sortDir === "asc" ? "ascending" : "descending"})` : "Fetching your GitHub repositories" }) })
|
|
3499
3935
|
] }) }) }) }),
|
|
3500
|
-
/* @__PURE__ */
|
|
3936
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, paddingX: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "gray", children: "Please wait..." }) })
|
|
3501
3937
|
] });
|
|
3502
3938
|
}
|
|
3503
|
-
return /* @__PURE__ */
|
|
3939
|
+
return /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", height: availableHeight, children: [
|
|
3504
3940
|
headerBar,
|
|
3505
|
-
showSponsorReminder && /* @__PURE__ */
|
|
3506
|
-
/* @__PURE__ */
|
|
3507
|
-
/* @__PURE__ */
|
|
3508
|
-
/* @__PURE__ */
|
|
3941
|
+
showSponsorReminder && /* @__PURE__ */ jsx23(Box22, { marginX: 1, marginBottom: 1, children: /* @__PURE__ */ jsx23(Box22, { borderStyle: "single", borderColor: "yellow", paddingX: 2, paddingY: 1, children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", alignItems: "center", children: [
|
|
3942
|
+
/* @__PURE__ */ jsx23(Text23, { color: "yellow", children: "\u{1F49A} Thanks for using gh-manager-cli!" }),
|
|
3943
|
+
/* @__PURE__ */ jsx23(Text23, { color: "gray", children: "Your support helps craft more open-source tools" }),
|
|
3944
|
+
/* @__PURE__ */ jsx23(Text23, { color: "cyan", children: "\u{1F496} github.com/sponsors/wiiiimm" })
|
|
3509
3945
|
] }) }) }),
|
|
3510
|
-
/* @__PURE__ */
|
|
3946
|
+
/* @__PURE__ */ jsx23(Box22, { borderStyle: "single", borderColor: modalOpen ? theme.muted : theme.warning, paddingX: 1, paddingY: 1, marginX: 1, height: contentHeight + containerPadding + 2, flexDirection: "column", children: deleteMode && deleteTarget ? (
|
|
3511
3947
|
// Centered modal; hide list content while modal is open
|
|
3512
|
-
/* @__PURE__ */
|
|
3513
|
-
/* @__PURE__ */
|
|
3514
|
-
/* @__PURE__ */
|
|
3515
|
-
/* @__PURE__ */
|
|
3948
|
+
/* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", borderStyle: "round", borderColor: "red", paddingX: 3, paddingY: 2, width: Math.min(terminalWidth - 8, 80), children: [
|
|
3949
|
+
/* @__PURE__ */ jsx23(Text23, { bold: true, children: "Delete Confirmation" }),
|
|
3950
|
+
/* @__PURE__ */ jsx23(Text23, { color: "red", children: "\u26A0\uFE0F Delete repository?" }),
|
|
3951
|
+
/* @__PURE__ */ jsx23(Box22, { height: 2, children: /* @__PURE__ */ jsx23(Text23, { children: " " }) }),
|
|
3516
3952
|
(() => {
|
|
3517
3953
|
const langName = deleteTarget.primaryLanguage?.name || "";
|
|
3518
3954
|
const langColor = deleteTarget.primaryLanguage?.color || "#666666";
|
|
@@ -3524,20 +3960,20 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3524
3960
|
let line2 = "";
|
|
3525
3961
|
if (langName) line2 += chalk15.hex(langColor)("\u25CF ") + tc.muted(`${langName} `);
|
|
3526
3962
|
line2 += tc.muted(`\u2605 ${deleteTarget.stargazerCount} \u2442 ${deleteTarget.forkCount} Updated ${formatDate(deleteTarget.updatedAt)}`);
|
|
3527
|
-
return /* @__PURE__ */
|
|
3528
|
-
/* @__PURE__ */
|
|
3529
|
-
/* @__PURE__ */
|
|
3963
|
+
return /* @__PURE__ */ jsxs22(Fragment11, { children: [
|
|
3964
|
+
/* @__PURE__ */ jsx23(Text23, { children: line1 }),
|
|
3965
|
+
/* @__PURE__ */ jsx23(Text23, { children: line2 })
|
|
3530
3966
|
] });
|
|
3531
3967
|
})(),
|
|
3532
|
-
/* @__PURE__ */
|
|
3968
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsxs22(Text23, { children: [
|
|
3533
3969
|
"Type ",
|
|
3534
|
-
/* @__PURE__ */
|
|
3970
|
+
/* @__PURE__ */ jsx23(Text23, { color: "yellow", bold: true, children: deleteCode }),
|
|
3535
3971
|
" to confirm."
|
|
3536
3972
|
] }) }),
|
|
3537
|
-
!deleteConfirmStage && /* @__PURE__ */
|
|
3538
|
-
/* @__PURE__ */
|
|
3539
|
-
/* @__PURE__ */
|
|
3540
|
-
|
|
3973
|
+
!deleteConfirmStage && /* @__PURE__ */ jsxs22(Box22, { marginTop: 1, children: [
|
|
3974
|
+
/* @__PURE__ */ jsx23(Text23, { children: "Confirm code: " }),
|
|
3975
|
+
/* @__PURE__ */ jsx23(
|
|
3976
|
+
TextInput7,
|
|
3541
3977
|
{
|
|
3542
3978
|
value: typedCode,
|
|
3543
3979
|
onChange: (v) => {
|
|
@@ -3563,11 +3999,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3563
3999
|
}
|
|
3564
4000
|
)
|
|
3565
4001
|
] }),
|
|
3566
|
-
deleteConfirmStage && /* @__PURE__ */
|
|
3567
|
-
/* @__PURE__ */
|
|
3568
|
-
/* @__PURE__ */
|
|
3569
|
-
/* @__PURE__ */
|
|
3570
|
-
|
|
4002
|
+
deleteConfirmStage && /* @__PURE__ */ jsxs22(Box22, { marginTop: 1, flexDirection: "column", children: [
|
|
4003
|
+
/* @__PURE__ */ jsx23(Text23, { color: "red", children: "This action will permanently delete the repository. This cannot be undone." }),
|
|
4004
|
+
/* @__PURE__ */ jsxs22(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", gap: 6, children: [
|
|
4005
|
+
/* @__PURE__ */ jsx23(
|
|
4006
|
+
Box22,
|
|
3571
4007
|
{
|
|
3572
4008
|
borderStyle: "round",
|
|
3573
4009
|
borderColor: "red",
|
|
@@ -3576,11 +4012,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3576
4012
|
alignItems: "center",
|
|
3577
4013
|
justifyContent: "center",
|
|
3578
4014
|
flexDirection: "column",
|
|
3579
|
-
children: /* @__PURE__ */
|
|
4015
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: confirmFocus === "delete" ? chalk15.bgRed.white.bold(" Delete ") : tc.error.bold("Delete") })
|
|
3580
4016
|
}
|
|
3581
4017
|
),
|
|
3582
|
-
/* @__PURE__ */
|
|
3583
|
-
|
|
4018
|
+
/* @__PURE__ */ jsx23(
|
|
4019
|
+
Box22,
|
|
3584
4020
|
{
|
|
3585
4021
|
borderStyle: "round",
|
|
3586
4022
|
borderColor: confirmFocus === "cancel" ? "white" : "gray",
|
|
@@ -3589,17 +4025,17 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3589
4025
|
alignItems: "center",
|
|
3590
4026
|
justifyContent: "center",
|
|
3591
4027
|
flexDirection: "column",
|
|
3592
|
-
children: /* @__PURE__ */
|
|
4028
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: confirmFocus === "cancel" ? tc.btnMuted(" Cancel ") : tc.muted.bold("Cancel") })
|
|
3593
4029
|
}
|
|
3594
4030
|
)
|
|
3595
4031
|
] }),
|
|
3596
|
-
/* @__PURE__ */
|
|
4032
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Text23, { color: "gray", children: [
|
|
3597
4033
|
"Press Enter to ",
|
|
3598
4034
|
confirmFocus === "delete" ? "Delete" : "Cancel",
|
|
3599
4035
|
" | Y to Delete | C to Cancel"
|
|
3600
4036
|
] }) }),
|
|
3601
|
-
/* @__PURE__ */
|
|
3602
|
-
|
|
4037
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(
|
|
4038
|
+
TextInput7,
|
|
3603
4039
|
{
|
|
3604
4040
|
value: "",
|
|
3605
4041
|
onChange: () => {
|
|
@@ -3612,18 +4048,18 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3612
4048
|
}
|
|
3613
4049
|
) })
|
|
3614
4050
|
] }),
|
|
3615
|
-
deleteError && /* @__PURE__ */
|
|
3616
|
-
deleting && /* @__PURE__ */
|
|
4051
|
+
deleteError && /* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "magenta", children: deleteError }) }),
|
|
4052
|
+
deleting && /* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "yellow", children: "Deleting..." }) })
|
|
3617
4053
|
] }) })
|
|
3618
|
-
) : archiveMode && archiveTarget ? /* @__PURE__ */
|
|
3619
|
-
/* @__PURE__ */
|
|
3620
|
-
/* @__PURE__ */
|
|
3621
|
-
/* @__PURE__ */
|
|
3622
|
-
/* @__PURE__ */
|
|
3623
|
-
/* @__PURE__ */
|
|
3624
|
-
/* @__PURE__ */
|
|
3625
|
-
/* @__PURE__ */
|
|
3626
|
-
|
|
4054
|
+
) : archiveMode && archiveTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", borderStyle: "round", borderColor: archiveTarget.isArchived ? "green" : "yellow", paddingX: 3, paddingY: 2, width: Math.min(terminalWidth - 8, 80), children: [
|
|
4055
|
+
/* @__PURE__ */ jsx23(Text23, { bold: true, children: archiveTarget.isArchived ? "Unarchive Confirmation" : "Archive Confirmation" }),
|
|
4056
|
+
/* @__PURE__ */ jsx23(Text23, { color: archiveTarget.isArchived ? "green" : "yellow", children: archiveTarget.isArchived ? "\u21BA Unarchive repository?" : "\u26A0\uFE0F Archive repository?" }),
|
|
4057
|
+
/* @__PURE__ */ jsx23(Box22, { height: 1, children: /* @__PURE__ */ jsx23(Text23, { children: " " }) }),
|
|
4058
|
+
/* @__PURE__ */ jsx23(Text23, { children: archiveTarget.nameWithOwner }),
|
|
4059
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { children: archiveTarget.isArchived ? "This will make the repository active again." : "This will make the repository read-only." }) }),
|
|
4060
|
+
/* @__PURE__ */ jsxs22(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", gap: 6, children: [
|
|
4061
|
+
/* @__PURE__ */ jsx23(
|
|
4062
|
+
Box22,
|
|
3627
4063
|
{
|
|
3628
4064
|
borderStyle: "round",
|
|
3629
4065
|
borderColor: archiveTarget.isArchived ? "green" : "yellow",
|
|
@@ -3632,11 +4068,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3632
4068
|
alignItems: "center",
|
|
3633
4069
|
justifyContent: "center",
|
|
3634
4070
|
flexDirection: "column",
|
|
3635
|
-
children: /* @__PURE__ */
|
|
4071
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: archiveFocus === "confirm" ? chalk15.bgGreen.white.bold(` ${archiveTarget.isArchived ? "Unarchive" : "Archive"} `) : (archiveTarget.isArchived ? tc.success : tc.warning).bold(archiveTarget.isArchived ? "Unarchive" : "Archive") })
|
|
3636
4072
|
}
|
|
3637
4073
|
),
|
|
3638
|
-
/* @__PURE__ */
|
|
3639
|
-
|
|
4074
|
+
/* @__PURE__ */ jsx23(
|
|
4075
|
+
Box22,
|
|
3640
4076
|
{
|
|
3641
4077
|
borderStyle: "round",
|
|
3642
4078
|
borderColor: archiveFocus === "cancel" ? "white" : "gray",
|
|
@@ -3645,19 +4081,19 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3645
4081
|
alignItems: "center",
|
|
3646
4082
|
justifyContent: "center",
|
|
3647
4083
|
flexDirection: "column",
|
|
3648
|
-
children: /* @__PURE__ */
|
|
4084
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: archiveFocus === "cancel" ? tc.btnMuted(" Cancel ") : tc.muted.bold("Cancel") })
|
|
3649
4085
|
}
|
|
3650
4086
|
)
|
|
3651
4087
|
] }),
|
|
3652
|
-
/* @__PURE__ */
|
|
4088
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3653
4089
|
"Press Enter to ",
|
|
3654
4090
|
archiveFocus === "confirm" ? archiveTarget.isArchived ? "Unarchive" : "Archive" : "Cancel",
|
|
3655
4091
|
" | Y to ",
|
|
3656
4092
|
archiveTarget.isArchived ? "Unarchive" : "Archive",
|
|
3657
4093
|
" | C to Cancel"
|
|
3658
4094
|
] }) }),
|
|
3659
|
-
/* @__PURE__ */
|
|
3660
|
-
|
|
4095
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(
|
|
4096
|
+
TextInput7,
|
|
3661
4097
|
{
|
|
3662
4098
|
value: "",
|
|
3663
4099
|
onChange: () => {
|
|
@@ -3671,14 +4107,14 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3671
4107
|
}
|
|
3672
4108
|
}
|
|
3673
4109
|
) }),
|
|
3674
|
-
archiveError && /* @__PURE__ */
|
|
3675
|
-
archiving && /* @__PURE__ */
|
|
3676
|
-
] }) }) : syncMode && syncTarget ? /* @__PURE__ */
|
|
3677
|
-
/* @__PURE__ */
|
|
3678
|
-
/* @__PURE__ */
|
|
3679
|
-
/* @__PURE__ */
|
|
3680
|
-
/* @__PURE__ */
|
|
3681
|
-
syncTarget.parent && /* @__PURE__ */
|
|
4110
|
+
archiveError && /* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "magenta", children: archiveError }) }),
|
|
4111
|
+
archiving && /* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "yellow", children: archiveTarget.isArchived ? "Unarchiving..." : "Archiving..." }) })
|
|
4112
|
+
] }) }) : syncMode && syncTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", borderStyle: "round", borderColor: "blue", paddingX: 3, paddingY: 2, width: Math.min(terminalWidth - 8, 80), children: [
|
|
4113
|
+
/* @__PURE__ */ jsx23(Text23, { bold: true, children: "Sync Fork Confirmation" }),
|
|
4114
|
+
/* @__PURE__ */ jsx23(Text23, { color: "blue", children: "\u27F2 Sync fork with upstream?" }),
|
|
4115
|
+
/* @__PURE__ */ jsx23(Box22, { height: 1, children: /* @__PURE__ */ jsx23(Text23, { children: " " }) }),
|
|
4116
|
+
/* @__PURE__ */ jsx23(Text23, { children: syncTarget.nameWithOwner }),
|
|
4117
|
+
syncTarget.parent && /* @__PURE__ */ jsxs22(Text23, { color: "gray", children: [
|
|
3682
4118
|
"Upstream: ",
|
|
3683
4119
|
syncTarget.parent.nameWithOwner
|
|
3684
4120
|
] }),
|
|
@@ -3693,12 +4129,12 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3693
4129
|
if (ahead > 0) parts.push(chalk15.green(`${ahead} ahead`));
|
|
3694
4130
|
if (behind > 0) parts.push(chalk15.yellow(`${behind} behind`));
|
|
3695
4131
|
const statusText = parts.length === 0 ? chalk15.green("Your fork is up to date with upstream.") : `This fork is ${parts.join(", ")} of upstream.`;
|
|
3696
|
-
return /* @__PURE__ */
|
|
4132
|
+
return /* @__PURE__ */ jsx23(Text23, { children: statusText });
|
|
3697
4133
|
})(),
|
|
3698
|
-
/* @__PURE__ */
|
|
3699
|
-
/* @__PURE__ */
|
|
3700
|
-
/* @__PURE__ */
|
|
3701
|
-
|
|
4134
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { children: "This will merge upstream changes into your fork." }) }),
|
|
4135
|
+
/* @__PURE__ */ jsxs22(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", gap: 6, children: [
|
|
4136
|
+
/* @__PURE__ */ jsx23(
|
|
4137
|
+
Box22,
|
|
3702
4138
|
{
|
|
3703
4139
|
borderStyle: "round",
|
|
3704
4140
|
borderColor: "blue",
|
|
@@ -3707,11 +4143,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3707
4143
|
alignItems: "center",
|
|
3708
4144
|
justifyContent: "center",
|
|
3709
4145
|
flexDirection: "column",
|
|
3710
|
-
children: /* @__PURE__ */
|
|
4146
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: syncFocus === "confirm" ? tc.btnPrimary(" Sync ") : tc.primary.bold("Sync") })
|
|
3711
4147
|
}
|
|
3712
4148
|
),
|
|
3713
|
-
/* @__PURE__ */
|
|
3714
|
-
|
|
4149
|
+
/* @__PURE__ */ jsx23(
|
|
4150
|
+
Box22,
|
|
3715
4151
|
{
|
|
3716
4152
|
borderStyle: "round",
|
|
3717
4153
|
borderColor: syncFocus === "cancel" ? "white" : "gray",
|
|
@@ -3720,17 +4156,17 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3720
4156
|
alignItems: "center",
|
|
3721
4157
|
justifyContent: "center",
|
|
3722
4158
|
flexDirection: "column",
|
|
3723
|
-
children: /* @__PURE__ */
|
|
4159
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: syncFocus === "cancel" ? tc.btnMuted(" Cancel ") : tc.muted.bold("Cancel") })
|
|
3724
4160
|
}
|
|
3725
4161
|
)
|
|
3726
4162
|
] }),
|
|
3727
|
-
/* @__PURE__ */
|
|
4163
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3728
4164
|
"Press Enter to ",
|
|
3729
4165
|
syncFocus === "confirm" ? "Sync" : "Cancel",
|
|
3730
4166
|
" | Y to Sync | C to Cancel"
|
|
3731
4167
|
] }) }),
|
|
3732
|
-
/* @__PURE__ */
|
|
3733
|
-
|
|
4168
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(
|
|
4169
|
+
TextInput7,
|
|
3734
4170
|
{
|
|
3735
4171
|
value: "",
|
|
3736
4172
|
onChange: () => {
|
|
@@ -3744,14 +4180,14 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3744
4180
|
}
|
|
3745
4181
|
}
|
|
3746
4182
|
) }),
|
|
3747
|
-
syncError && /* @__PURE__ */
|
|
3748
|
-
syncing && /* @__PURE__ */
|
|
3749
|
-
] }) }) : logoutMode ? /* @__PURE__ */
|
|
3750
|
-
/* @__PURE__ */
|
|
3751
|
-
/* @__PURE__ */
|
|
3752
|
-
/* @__PURE__ */
|
|
3753
|
-
/* @__PURE__ */
|
|
3754
|
-
|
|
4183
|
+
syncError && /* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { color: theme.error, children: syncError }) }),
|
|
4184
|
+
syncing && /* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { color: theme.warning, children: "Syncing..." }) })
|
|
4185
|
+
] }) }) : logoutMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", borderStyle: "round", borderColor: theme.primary, paddingX: 3, paddingY: 2, width: Math.min(terminalWidth - 8, 80), children: [
|
|
4186
|
+
/* @__PURE__ */ jsx23(Text23, { bold: true, children: "Logout Confirmation" }),
|
|
4187
|
+
/* @__PURE__ */ jsx23(Text23, { color: theme.primary, children: "Are you sure you want to log out?" }),
|
|
4188
|
+
/* @__PURE__ */ jsxs22(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", gap: 6, children: [
|
|
4189
|
+
/* @__PURE__ */ jsx23(
|
|
4190
|
+
Box22,
|
|
3755
4191
|
{
|
|
3756
4192
|
borderStyle: "round",
|
|
3757
4193
|
borderColor: theme.primary,
|
|
@@ -3760,11 +4196,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3760
4196
|
alignItems: "center",
|
|
3761
4197
|
justifyContent: "center",
|
|
3762
4198
|
flexDirection: "column",
|
|
3763
|
-
children: /* @__PURE__ */
|
|
4199
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: logoutFocus === "confirm" ? tc.btnPrimary(" Logout ") : tc.primary.bold("Logout") })
|
|
3764
4200
|
}
|
|
3765
4201
|
),
|
|
3766
|
-
/* @__PURE__ */
|
|
3767
|
-
|
|
4202
|
+
/* @__PURE__ */ jsx23(
|
|
4203
|
+
Box22,
|
|
3768
4204
|
{
|
|
3769
4205
|
borderStyle: "round",
|
|
3770
4206
|
borderColor: logoutFocus === "cancel" ? "white" : theme.muted,
|
|
@@ -3773,16 +4209,16 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3773
4209
|
alignItems: "center",
|
|
3774
4210
|
justifyContent: "center",
|
|
3775
4211
|
flexDirection: "column",
|
|
3776
|
-
children: /* @__PURE__ */
|
|
4212
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: logoutFocus === "cancel" ? tc.btnMuted(" Cancel ") : tc.muted.bold("Cancel") })
|
|
3777
4213
|
}
|
|
3778
4214
|
)
|
|
3779
4215
|
] }),
|
|
3780
|
-
/* @__PURE__ */
|
|
4216
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3781
4217
|
"Press Enter to ",
|
|
3782
4218
|
logoutFocus === "confirm" ? "Logout" : "Cancel",
|
|
3783
4219
|
" | Y to Logout | C to Cancel"
|
|
3784
4220
|
] }) })
|
|
3785
|
-
] }) }) : orgSwitcherOpen ? /* @__PURE__ */
|
|
4221
|
+
] }) }) : orgSwitcherOpen ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3786
4222
|
OrgSwitcher,
|
|
3787
4223
|
{
|
|
3788
4224
|
token,
|
|
@@ -3790,45 +4226,45 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3790
4226
|
onSelect: handleOrgContextChange,
|
|
3791
4227
|
onClose: () => setOrgSwitcherOpen(false)
|
|
3792
4228
|
}
|
|
3793
|
-
) }) : infoMode ? /* @__PURE__ */
|
|
4229
|
+
) }) : infoMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: (() => {
|
|
3794
4230
|
const repo = infoRepo || visibleItems[cursor];
|
|
3795
|
-
if (!repo) return /* @__PURE__ */
|
|
4231
|
+
if (!repo) return /* @__PURE__ */ jsx23(Text23, { color: theme.error, children: "No repository selected." });
|
|
3796
4232
|
const langName = repo.primaryLanguage?.name || "N/A";
|
|
3797
4233
|
const langColor = repo.primaryLanguage?.color || "#666666";
|
|
3798
|
-
return /* @__PURE__ */
|
|
3799
|
-
/* @__PURE__ */
|
|
4234
|
+
return /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", borderStyle: "round", borderColor: theme.internal, paddingX: 3, paddingY: 2, width: Math.min(terminalWidth - 8, 90), children: [
|
|
4235
|
+
/* @__PURE__ */ jsxs22(Text23, { bold: true, children: [
|
|
3800
4236
|
"Repository Info ",
|
|
3801
4237
|
infoRepo ? tc.muted("(cached)") : ""
|
|
3802
4238
|
] }),
|
|
3803
|
-
/* @__PURE__ */
|
|
3804
|
-
/* @__PURE__ */
|
|
3805
|
-
repo.description && /* @__PURE__ */
|
|
3806
|
-
/* @__PURE__ */
|
|
3807
|
-
/* @__PURE__ */
|
|
4239
|
+
/* @__PURE__ */ jsx23(Box22, { height: 1, children: /* @__PURE__ */ jsx23(Text23, { children: " " }) }),
|
|
4240
|
+
/* @__PURE__ */ jsx23(Text23, { children: tc.text.bold(repo.nameWithOwner) }),
|
|
4241
|
+
repo.description && /* @__PURE__ */ jsx23(Text23, { color: theme.muted, children: repo.description }),
|
|
4242
|
+
/* @__PURE__ */ jsx23(Box22, { height: 1, children: /* @__PURE__ */ jsx23(Text23, { children: " " }) }),
|
|
4243
|
+
/* @__PURE__ */ jsxs22(Text23, { children: [
|
|
3808
4244
|
repo.visibility === "PRIVATE" ? tc.private("Private") : repo.visibility === "INTERNAL" ? tc.internal("Internal") : tc.success("Public"),
|
|
3809
4245
|
repo.isArchived ? tc.archived(" Archived") : "",
|
|
3810
4246
|
repo.isFork ? tc.fork(" Fork") : ""
|
|
3811
4247
|
] }),
|
|
3812
|
-
/* @__PURE__ */
|
|
3813
|
-
/* @__PURE__ */
|
|
4248
|
+
/* @__PURE__ */ jsx23(Text23, { children: tc.muted(`\u2605 ${repo.stargazerCount} \u2442 ${repo.forkCount}`) }),
|
|
4249
|
+
/* @__PURE__ */ jsxs22(Text23, { children: [
|
|
3814
4250
|
chalk15.hex(langColor)(`\u25CF `),
|
|
3815
4251
|
tc.muted(`${langName}`)
|
|
3816
4252
|
] }),
|
|
3817
|
-
/* @__PURE__ */
|
|
4253
|
+
/* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3818
4254
|
"Updated: ",
|
|
3819
4255
|
formatDate(repo.updatedAt),
|
|
3820
4256
|
" \u2022 Pushed: ",
|
|
3821
4257
|
formatDate(repo.pushedAt)
|
|
3822
4258
|
] }),
|
|
3823
|
-
/* @__PURE__ */
|
|
4259
|
+
/* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3824
4260
|
"Size: ",
|
|
3825
4261
|
repo.diskUsage,
|
|
3826
4262
|
" KB"
|
|
3827
4263
|
] }),
|
|
3828
|
-
/* @__PURE__ */
|
|
3829
|
-
/* @__PURE__ */
|
|
4264
|
+
/* @__PURE__ */ jsx23(Box22, { height: 1, children: /* @__PURE__ */ jsx23(Text23, { children: " " }) }),
|
|
4265
|
+
/* @__PURE__ */ jsx23(Text23, { color: theme.muted, children: "Press Esc or I to close" })
|
|
3830
4266
|
] });
|
|
3831
|
-
})() }) : archiveFilterMode ? /* @__PURE__ */
|
|
4267
|
+
})() }) : archiveFilterMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3832
4268
|
ArchiveFilterModal,
|
|
3833
4269
|
{
|
|
3834
4270
|
currentFilter: archiveFilter,
|
|
@@ -3841,7 +4277,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3841
4277
|
onCancel: () => setArchiveFilterMode(false),
|
|
3842
4278
|
theme
|
|
3843
4279
|
}
|
|
3844
|
-
) }) : visibilityMode ? /* @__PURE__ */
|
|
4280
|
+
) }) : visibilityMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3845
4281
|
VisibilityModal,
|
|
3846
4282
|
{
|
|
3847
4283
|
currentFilter: visibilityFilter,
|
|
@@ -3855,7 +4291,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3855
4291
|
onCancel: () => setVisibilityMode(false),
|
|
3856
4292
|
theme
|
|
3857
4293
|
}
|
|
3858
|
-
) }) : sortMode ? /* @__PURE__ */
|
|
4294
|
+
) }) : sortMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3859
4295
|
SortModal,
|
|
3860
4296
|
{
|
|
3861
4297
|
currentSort: sortKey,
|
|
@@ -3868,7 +4304,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3868
4304
|
onCancel: () => setSortMode(false),
|
|
3869
4305
|
theme
|
|
3870
4306
|
}
|
|
3871
|
-
) }) : sortDirectionMode ? /* @__PURE__ */
|
|
4307
|
+
) }) : sortDirectionMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3872
4308
|
SortDirectionModal,
|
|
3873
4309
|
{
|
|
3874
4310
|
currentDirection: sortDir,
|
|
@@ -3882,7 +4318,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3882
4318
|
onCancel: () => setSortDirectionMode(false),
|
|
3883
4319
|
theme
|
|
3884
4320
|
}
|
|
3885
|
-
) }) : changeVisibilityMode && changeVisibilityTarget ? /* @__PURE__ */
|
|
4321
|
+
) }) : changeVisibilityMode && changeVisibilityTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3886
4322
|
ChangeVisibilityModal,
|
|
3887
4323
|
{
|
|
3888
4324
|
isOpen: changeVisibilityMode,
|
|
@@ -3896,7 +4332,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3896
4332
|
error: changeVisibilityError,
|
|
3897
4333
|
theme
|
|
3898
4334
|
}
|
|
3899
|
-
) }) : renameMode && renameTarget ? /* @__PURE__ */
|
|
4335
|
+
) }) : renameMode && renameTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3900
4336
|
RenameModal,
|
|
3901
4337
|
{
|
|
3902
4338
|
repo: renameTarget,
|
|
@@ -3904,7 +4340,25 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3904
4340
|
onCancel: closeRenameModal,
|
|
3905
4341
|
theme
|
|
3906
4342
|
}
|
|
3907
|
-
) }) :
|
|
4343
|
+
) }) : createMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
4344
|
+
CreateRepoModal,
|
|
4345
|
+
{
|
|
4346
|
+
ownerSlug: ownerContext === "personal" ? viewerLogin || "me" : ownerContext.login,
|
|
4347
|
+
isOrg: ownerContext !== "personal",
|
|
4348
|
+
isEnterprise: isEnterpriseOrg,
|
|
4349
|
+
onCreate: executeCreate,
|
|
4350
|
+
onCancel: () => setCreateMode(false),
|
|
4351
|
+
theme
|
|
4352
|
+
}
|
|
4353
|
+
) }) : transferMode && transferTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
4354
|
+
TransferModal,
|
|
4355
|
+
{
|
|
4356
|
+
repo: transferTarget,
|
|
4357
|
+
onTransfer: executeTransfer,
|
|
4358
|
+
onCancel: closeTransferModal,
|
|
4359
|
+
theme
|
|
4360
|
+
}
|
|
4361
|
+
) }) : copyUrlMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3908
4362
|
CopyUrlModal,
|
|
3909
4363
|
{
|
|
3910
4364
|
repo: copyUrlTarget,
|
|
@@ -3913,7 +4367,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3913
4367
|
onCopy: handleCopyUrl,
|
|
3914
4368
|
theme
|
|
3915
4369
|
}
|
|
3916
|
-
) }) : unstarMode && unstarTarget ? /* @__PURE__ */
|
|
4370
|
+
) }) : unstarMode && unstarTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3917
4371
|
UnstarModal,
|
|
3918
4372
|
{
|
|
3919
4373
|
visible: unstarMode,
|
|
@@ -3924,7 +4378,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3924
4378
|
error: unstarError,
|
|
3925
4379
|
theme
|
|
3926
4380
|
}
|
|
3927
|
-
) }) : starMode && starTarget ? /* @__PURE__ */
|
|
4381
|
+
) }) : starMode && starTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3928
4382
|
StarModal,
|
|
3929
4383
|
{
|
|
3930
4384
|
visible: starMode,
|
|
@@ -3936,7 +4390,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3936
4390
|
error: starError,
|
|
3937
4391
|
theme
|
|
3938
4392
|
}
|
|
3939
|
-
) }) : openInBrowserMode && openInBrowserTarget ? /* @__PURE__ */
|
|
4393
|
+
) }) : openInBrowserMode && openInBrowserTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3940
4394
|
OpenInBrowserModal,
|
|
3941
4395
|
{
|
|
3942
4396
|
repo: openInBrowserTarget,
|
|
@@ -3951,8 +4405,8 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3951
4405
|
},
|
|
3952
4406
|
theme
|
|
3953
4407
|
}
|
|
3954
|
-
) }) : /* @__PURE__ */
|
|
3955
|
-
/* @__PURE__ */
|
|
4408
|
+
) }) : /* @__PURE__ */ jsxs22(Fragment11, { children: [
|
|
4409
|
+
/* @__PURE__ */ jsx23(
|
|
3956
4410
|
RepoListHeader,
|
|
3957
4411
|
{
|
|
3958
4412
|
ownerContext,
|
|
@@ -3968,10 +4422,10 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3968
4422
|
theme
|
|
3969
4423
|
}
|
|
3970
4424
|
),
|
|
3971
|
-
filterMode && /* @__PURE__ */
|
|
3972
|
-
/* @__PURE__ */
|
|
3973
|
-
/* @__PURE__ */
|
|
3974
|
-
|
|
4425
|
+
filterMode && /* @__PURE__ */ jsxs22(Box22, { marginBottom: 1, children: [
|
|
4426
|
+
/* @__PURE__ */ jsx23(Text23, { children: "Search: " }),
|
|
4427
|
+
/* @__PURE__ */ jsx23(
|
|
4428
|
+
TextInput7,
|
|
3975
4429
|
{
|
|
3976
4430
|
value: filter,
|
|
3977
4431
|
onChange: (val) => {
|
|
@@ -3984,10 +4438,10 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3984
4438
|
}
|
|
3985
4439
|
)
|
|
3986
4440
|
] }),
|
|
3987
|
-
/* @__PURE__ */
|
|
4441
|
+
/* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", height: listHeight, children: [
|
|
3988
4442
|
visibleItems.slice(windowed.start, windowed.end).map((repo, i) => {
|
|
3989
4443
|
const idx = windowed.start + i;
|
|
3990
|
-
return /* @__PURE__ */
|
|
4444
|
+
return /* @__PURE__ */ jsx23(
|
|
3991
4445
|
RepoRow,
|
|
3992
4446
|
{
|
|
3993
4447
|
repo,
|
|
@@ -4002,55 +4456,59 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
4002
4456
|
repo.nameWithOwner
|
|
4003
4457
|
);
|
|
4004
4458
|
}),
|
|
4005
|
-
loadingMore && hasNextPage && !starsMode && /* @__PURE__ */
|
|
4006
|
-
/* @__PURE__ */
|
|
4007
|
-
/* @__PURE__ */
|
|
4459
|
+
loadingMore && hasNextPage && !starsMode && /* @__PURE__ */ jsx23(Box22, { justifyContent: "center", alignItems: "center", marginTop: 1, children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "row", children: [
|
|
4460
|
+
/* @__PURE__ */ jsx23(Box22, { width: 2, flexShrink: 0, flexGrow: 0, marginRight: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "cyan", children: /* @__PURE__ */ jsx23(SlowSpinner, {}) }) }),
|
|
4461
|
+
/* @__PURE__ */ jsxs22(Text23, { color: "cyan", children: [
|
|
4008
4462
|
"Loading repositories\u2026 ",
|
|
4009
4463
|
totalCount > 0 ? `(${items.length}/${totalCount})` : `(${items.length})`
|
|
4010
4464
|
] })
|
|
4011
4465
|
] }) }),
|
|
4012
|
-
loadingMore && hasNextPage && starsMode && /* @__PURE__ */
|
|
4013
|
-
/* @__PURE__ */
|
|
4014
|
-
/* @__PURE__ */
|
|
4466
|
+
loadingMore && hasNextPage && starsMode && /* @__PURE__ */ jsx23(Box22, { justifyContent: "center", alignItems: "center", marginTop: 1, children: /* @__PURE__ */ jsxs22(Box22, { flexDirection: "row", children: [
|
|
4467
|
+
/* @__PURE__ */ jsx23(Box22, { width: 2, flexShrink: 0, flexGrow: 0, marginRight: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "cyan", children: /* @__PURE__ */ jsx23(SlowSpinner, {}) }) }),
|
|
4468
|
+
/* @__PURE__ */ jsx23(Text23, { color: "cyan", children: "Loading more repositories..." })
|
|
4015
4469
|
] }) }),
|
|
4016
|
-
filterActive && hasNextPage && !starsMode && /* @__PURE__ */
|
|
4470
|
+
filterActive && hasNextPage && !starsMode && /* @__PURE__ */ jsx23(Box22, { justifyContent: "center", alignItems: "center", marginTop: 1, children: /* @__PURE__ */ jsxs22(Text23, { color: "yellow", dimColor: true, children: [
|
|
4017
4471
|
"Still loading repos (",
|
|
4018
4472
|
items.length,
|
|
4019
4473
|
"/",
|
|
4020
4474
|
totalCount > 0 ? totalCount : "?",
|
|
4021
4475
|
") \u2014 fuzzy results may be incomplete"
|
|
4022
4476
|
] }) }),
|
|
4023
|
-
!loading && visibleItems.length === 0 && !(filterActive && hasNextPage && !starsMode) && /* @__PURE__ */
|
|
4477
|
+
!loading && visibleItems.length === 0 && !(filterActive && hasNextPage && !starsMode) && /* @__PURE__ */ jsx23(Box22, { justifyContent: "center", alignItems: "center", flexGrow: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "gray", dimColor: true, children: filter ? "No repositories match your search" : "No repositories found" }) })
|
|
4024
4478
|
] })
|
|
4025
4479
|
] }) }),
|
|
4026
|
-
/* @__PURE__ */
|
|
4027
|
-
/* @__PURE__ */
|
|
4028
|
-
/* @__PURE__ */
|
|
4480
|
+
/* @__PURE__ */ jsxs22(Box22, { marginTop: 1, paddingX: 1, flexDirection: "column", children: [
|
|
4481
|
+
/* @__PURE__ */ jsx23(Box22, { width: terminalWidth, justifyContent: "center", children: /* @__PURE__ */ jsx23(Text23, { color: theme.muted, dimColor: modalOpen ? true : void 0, children: "\u2191\u2193 Navigate \u2022 Ctrl+G Top \u2022 G Bottom \u2022 \u23CE/O Open \u2022 R Refresh" }) }),
|
|
4482
|
+
/* @__PURE__ */ jsx23(Box22, { width: terminalWidth, justifyContent: "center", children: /* @__PURE__ */ jsxs22(Text23, { color: theme.muted, dimColor: modalOpen ? true : void 0, children: [
|
|
4029
4483
|
"/ Search",
|
|
4030
4484
|
!filterActive && " \u2022 S Sort \u2022 D Direction",
|
|
4031
4485
|
" \u2022 T Density \u2022 Shift+T Theme \u2022 A Archive Filter",
|
|
4032
4486
|
!starsMode && " \u2022 V Visibility Filter"
|
|
4033
4487
|
] }) }),
|
|
4034
|
-
/* @__PURE__ */
|
|
4035
|
-
/* @__PURE__ */
|
|
4036
|
-
|
|
4488
|
+
/* @__PURE__ */ jsx23(Box22, { width: terminalWidth, justifyContent: "center", children: /* @__PURE__ */ jsx23(Text23, { color: theme.muted, dimColor: modalOpen ? true : void 0, children: starsMode ? "Shift+S My Repos \u2022 I Info \u2022 C Copy URL \u2022 U Unstar Repository" : `${ownerContext === "personal" ? "Shift+S Starred \u2022 " : ""}I Info \u2022 C Copy URL \u2022 Ctrl+S Un/Star \u2022 Ctrl+R Rename \u2022 Shift+M Transfer \u2022 Ctrl+A Un/Archive \u2022 Ctrl+V Change Visibility \u2022 Ctrl+F Sync Fork \u2022 P Jump to upstream` }) }),
|
|
4489
|
+
/* @__PURE__ */ jsx23(Box22, { width: terminalWidth, justifyContent: "center", children: /* @__PURE__ */ jsxs22(Text23, { color: theme.muted, dimColor: modalOpen ? true : void 0, children: [
|
|
4490
|
+
"K Cache Info \u2022 W Org Switch",
|
|
4491
|
+
!starsMode ? " \u2022 Ctrl+N New Repo" : "",
|
|
4492
|
+
" \u2022 Del/Backspace Delete \u2022 Ctrl+L Logout \u2022 Q Quit"
|
|
4493
|
+
] }) }),
|
|
4494
|
+
/* @__PURE__ */ jsx23(Box22, { width: terminalWidth, justifyContent: "center", marginTop: 1, children: /* @__PURE__ */ jsx23(Text23, { color: theme.warning, dimColor: modalOpen ? true : void 0, children: "\u{1F496} Sponsor on GitHub: github.com/sponsors/wiiiimm" }) })
|
|
4037
4495
|
] }),
|
|
4038
|
-
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */
|
|
4039
|
-
/* @__PURE__ */
|
|
4040
|
-
debugMessages.length === 0 ? /* @__PURE__ */
|
|
4496
|
+
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */ jsxs22(Box22, { marginTop: 1, borderStyle: "single", borderColor: "yellow", paddingX: 1, flexDirection: "column", children: [
|
|
4497
|
+
/* @__PURE__ */ jsx23(Text23, { bold: true, color: "yellow", children: "Debug Messages:" }),
|
|
4498
|
+
debugMessages.length === 0 ? /* @__PURE__ */ jsx23(Text23, { color: "gray", children: "No debug messages yet..." }) : debugMessages.map((msg, i) => /* @__PURE__ */ jsx23(Text23, { color: "gray", children: msg }, i))
|
|
4041
4499
|
] }),
|
|
4042
|
-
themeToast && /* @__PURE__ */
|
|
4043
|
-
copyToast && /* @__PURE__ */
|
|
4500
|
+
themeToast && /* @__PURE__ */ jsx23(Box22, { marginTop: 1, justifyContent: "center", children: /* @__PURE__ */ jsx23(Box22, { borderStyle: "round", borderColor: theme.primary, paddingX: 2, paddingY: 0, children: /* @__PURE__ */ jsx23(Text23, { color: theme.primary, children: themeToast }) }) }),
|
|
4501
|
+
copyToast && /* @__PURE__ */ jsx23(Box22, { marginTop: 1, justifyContent: "center", children: /* @__PURE__ */ jsx23(Box22, { borderStyle: "round", borderColor: copyToast.includes("Failed") ? "red" : "green", paddingX: 2, paddingY: 0, children: /* @__PURE__ */ jsx23(Text23, { color: copyToast.includes("Failed") ? "red" : "green", children: copyToast }) }) })
|
|
4044
4502
|
] });
|
|
4045
4503
|
}
|
|
4046
4504
|
|
|
4047
4505
|
// src/ui/components/auth/AuthMethodSelector.tsx
|
|
4048
|
-
import { useState as
|
|
4049
|
-
import { Box as
|
|
4506
|
+
import { useState as useState20 } from "react";
|
|
4507
|
+
import { Box as Box23, Text as Text24, useInput as useInput20 } from "ink";
|
|
4050
4508
|
import chalk16 from "chalk";
|
|
4051
|
-
import { jsx as
|
|
4509
|
+
import { jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
4052
4510
|
function AuthMethodSelector({ onSelect, onQuit }) {
|
|
4053
|
-
const [selectedIndex, setSelectedIndex] =
|
|
4511
|
+
const [selectedIndex, setSelectedIndex] = useState20(0);
|
|
4054
4512
|
const methods = [
|
|
4055
4513
|
{
|
|
4056
4514
|
key: "oauth",
|
|
@@ -4063,7 +4521,7 @@ function AuthMethodSelector({ onSelect, onQuit }) {
|
|
|
4063
4521
|
description: "Manually enter a GitHub Personal Access Token"
|
|
4064
4522
|
}
|
|
4065
4523
|
];
|
|
4066
|
-
|
|
4524
|
+
useInput20((input, key) => {
|
|
4067
4525
|
if (key.escape || input?.toLowerCase() === "q") {
|
|
4068
4526
|
if (onQuit) {
|
|
4069
4527
|
onQuit();
|
|
@@ -4082,33 +4540,33 @@ function AuthMethodSelector({ onSelect, onQuit }) {
|
|
|
4082
4540
|
onSelect("pat");
|
|
4083
4541
|
}
|
|
4084
4542
|
});
|
|
4085
|
-
return /* @__PURE__ */
|
|
4086
|
-
/* @__PURE__ */
|
|
4087
|
-
/* @__PURE__ */
|
|
4543
|
+
return /* @__PURE__ */ jsxs23(Box23, { flexDirection: "column", borderStyle: "single", borderColor: "cyan", paddingX: 2, paddingY: 1, children: [
|
|
4544
|
+
/* @__PURE__ */ jsx24(Text24, { bold: true, marginBottom: 1, children: "Choose Authentication Method" }),
|
|
4545
|
+
/* @__PURE__ */ jsx24(Box23, { flexDirection: "column", marginY: 1, children: methods.map((method, index) => {
|
|
4088
4546
|
const isSelected = index === selectedIndex;
|
|
4089
4547
|
const prefix = isSelected ? chalk16.cyan("\u203A") : " ";
|
|
4090
4548
|
const numberPrefix = `${index + 1}.`;
|
|
4091
|
-
return /* @__PURE__ */
|
|
4092
|
-
/* @__PURE__ */
|
|
4549
|
+
return /* @__PURE__ */ jsxs23(Box23, { flexDirection: "column", marginBottom: 1, children: [
|
|
4550
|
+
/* @__PURE__ */ jsx24(Text24, { children: /* @__PURE__ */ jsxs23(Text24, { color: isSelected ? "cyan" : void 0, bold: isSelected, children: [
|
|
4093
4551
|
prefix,
|
|
4094
4552
|
" ",
|
|
4095
4553
|
numberPrefix,
|
|
4096
4554
|
" ",
|
|
4097
4555
|
method.label
|
|
4098
4556
|
] }) }),
|
|
4099
|
-
/* @__PURE__ */
|
|
4557
|
+
/* @__PURE__ */ jsxs23(Text24, { color: "gray", dimColor: true, children: [
|
|
4100
4558
|
" ",
|
|
4101
4559
|
method.description
|
|
4102
4560
|
] })
|
|
4103
4561
|
] }, method.key);
|
|
4104
4562
|
}) }),
|
|
4105
|
-
/* @__PURE__ */
|
|
4563
|
+
/* @__PURE__ */ jsx24(Text24, { color: "gray", dimColor: true, marginTop: 1, children: "Use arrow keys to navigate, Enter to select, or press 1/2 \u2022 Q/Esc to quit" })
|
|
4106
4564
|
] });
|
|
4107
4565
|
}
|
|
4108
4566
|
|
|
4109
4567
|
// src/ui/components/auth/OAuthProgress.tsx
|
|
4110
|
-
import { Box as
|
|
4111
|
-
import { jsx as
|
|
4568
|
+
import { Box as Box24, Text as Text25 } from "ink";
|
|
4569
|
+
import { jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
4112
4570
|
function OAuthProgress({ status, error, deviceCode }) {
|
|
4113
4571
|
const statusMessages = {
|
|
4114
4572
|
initializing: {
|
|
@@ -4145,69 +4603,69 @@ function OAuthProgress({ status, error, deviceCode }) {
|
|
|
4145
4603
|
}
|
|
4146
4604
|
};
|
|
4147
4605
|
const { message, showSpinner } = statusMessages[status];
|
|
4148
|
-
return /* @__PURE__ */
|
|
4149
|
-
/* @__PURE__ */
|
|
4150
|
-
/* @__PURE__ */
|
|
4151
|
-
/* @__PURE__ */
|
|
4152
|
-
/* @__PURE__ */
|
|
4606
|
+
return /* @__PURE__ */ jsxs24(Box24, { flexDirection: "column", borderStyle: "single", borderColor: status === "error" ? "red" : "cyan", paddingX: 2, paddingY: 1, children: [
|
|
4607
|
+
/* @__PURE__ */ jsx25(Text25, { bold: true, marginBottom: 1, children: "GitHub OAuth Authentication" }),
|
|
4608
|
+
/* @__PURE__ */ jsx25(Box24, { marginY: 1, children: showSpinner ? /* @__PURE__ */ jsxs24(Box24, { children: [
|
|
4609
|
+
/* @__PURE__ */ jsx25(Text25, { color: "green", children: /* @__PURE__ */ jsx25(SlowSpinner, { interval: 2e3 }) }),
|
|
4610
|
+
/* @__PURE__ */ jsxs24(Text25, { children: [
|
|
4153
4611
|
" ",
|
|
4154
4612
|
message
|
|
4155
4613
|
] })
|
|
4156
|
-
] }) : /* @__PURE__ */
|
|
4614
|
+
] }) : /* @__PURE__ */ jsxs24(Text25, { color: status === "error" ? "red" : "green", children: [
|
|
4157
4615
|
status === "error" ? "\u2717" : "\u2713",
|
|
4158
4616
|
" ",
|
|
4159
4617
|
message
|
|
4160
4618
|
] }) }),
|
|
4161
|
-
(status === "waiting_for_authorization" || status === "polling_for_token") && deviceCode && /* @__PURE__ */
|
|
4162
|
-
/* @__PURE__ */
|
|
4163
|
-
/* @__PURE__ */
|
|
4164
|
-
/* @__PURE__ */
|
|
4165
|
-
/* @__PURE__ */
|
|
4619
|
+
(status === "waiting_for_authorization" || status === "polling_for_token") && deviceCode && /* @__PURE__ */ jsxs24(Box24, { marginY: 1, flexDirection: "column", children: [
|
|
4620
|
+
/* @__PURE__ */ jsx25(Text25, { bold: true, color: "cyan", marginBottom: 1, children: "\u{1F4CB} Please complete these steps:" }),
|
|
4621
|
+
/* @__PURE__ */ jsxs24(Box24, { marginBottom: 1, children: [
|
|
4622
|
+
/* @__PURE__ */ jsx25(Text25, { children: "1. Visit: " }),
|
|
4623
|
+
/* @__PURE__ */ jsx25(Text25, { bold: true, color: "blue", children: deviceCode.verification_uri })
|
|
4166
4624
|
] }),
|
|
4167
|
-
/* @__PURE__ */
|
|
4168
|
-
/* @__PURE__ */
|
|
4169
|
-
/* @__PURE__ */
|
|
4625
|
+
/* @__PURE__ */ jsxs24(Box24, { marginBottom: 1, flexDirection: "column", children: [
|
|
4626
|
+
/* @__PURE__ */ jsx25(Text25, { children: "2. Enter this code:" }),
|
|
4627
|
+
/* @__PURE__ */ jsx25(Box24, { borderStyle: "single", borderColor: "yellow", paddingX: 2, paddingY: 1, marginTop: 1, children: /* @__PURE__ */ jsx25(Text25, { bold: true, color: "yellow", children: deviceCode.user_code }) })
|
|
4170
4628
|
] }),
|
|
4171
|
-
status === "waiting_for_authorization" && /* @__PURE__ */
|
|
4172
|
-
status === "polling_for_token" && /* @__PURE__ */
|
|
4173
|
-
/* @__PURE__ */
|
|
4174
|
-
/* @__PURE__ */
|
|
4629
|
+
status === "waiting_for_authorization" && /* @__PURE__ */ jsx25(Text25, { color: "gray", marginTop: 1, children: "Your browser should open automatically." }),
|
|
4630
|
+
status === "polling_for_token" && /* @__PURE__ */ jsxs24(Box24, { flexDirection: "column", marginTop: 1, children: [
|
|
4631
|
+
/* @__PURE__ */ jsx25(Text25, { color: "gray", children: "Waiting for you to complete authorization in your browser..." }),
|
|
4632
|
+
/* @__PURE__ */ jsx25(Text25, { color: "gray", dimColor: true, marginTop: 1, children: "This will timeout in 15 minutes. Press Esc to cancel." })
|
|
4175
4633
|
] })
|
|
4176
4634
|
] }),
|
|
4177
|
-
status === "error" && error && /* @__PURE__ */
|
|
4178
|
-
/* @__PURE__ */
|
|
4179
|
-
/* @__PURE__ */
|
|
4635
|
+
status === "error" && error && /* @__PURE__ */ jsxs24(Box24, { marginY: 1, flexDirection: "column", children: [
|
|
4636
|
+
/* @__PURE__ */ jsx25(Text25, { color: "red", children: error }),
|
|
4637
|
+
/* @__PURE__ */ jsx25(Text25, { color: "gray", marginTop: 1, children: "Press Esc to go back and try again." })
|
|
4180
4638
|
] }),
|
|
4181
|
-
status === "success" && /* @__PURE__ */
|
|
4639
|
+
status === "success" && /* @__PURE__ */ jsx25(Text25, { color: "gray", marginTop: 1, children: "Returning to application..." })
|
|
4182
4640
|
] });
|
|
4183
4641
|
}
|
|
4184
4642
|
|
|
4185
4643
|
// src/ui/App.tsx
|
|
4186
|
-
import { jsx as
|
|
4644
|
+
import { jsx as jsx26, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
4187
4645
|
var packageJson = require_package();
|
|
4188
4646
|
function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlineTokenEphemeral }) {
|
|
4189
4647
|
const { exit } = useApp2();
|
|
4190
4648
|
const { stdout } = useStdout2();
|
|
4191
|
-
const [mode, setMode] =
|
|
4192
|
-
const [token, setToken] =
|
|
4193
|
-
const [input, setInput] =
|
|
4194
|
-
const [error, setError] =
|
|
4195
|
-
const [viewer, setViewer] =
|
|
4196
|
-
const [rateLimitReset, setRateLimitReset] =
|
|
4197
|
-
const [wasRateLimited, setWasRateLimited] =
|
|
4198
|
-
const [orgContext, setOrgContext] =
|
|
4199
|
-
const [authMethod, setAuthMethod] =
|
|
4200
|
-
const [oauthStatus, setOAuthStatus] =
|
|
4201
|
-
const [tokenSource, setTokenSource] =
|
|
4202
|
-
const [sessionTokenOrigin, setSessionTokenOrigin] =
|
|
4203
|
-
const [deviceCodeResponse, setDeviceCodeResponse] =
|
|
4204
|
-
const [oauthDeviceCode, setOauthDeviceCode] =
|
|
4205
|
-
const [dims, setDims] =
|
|
4649
|
+
const [mode, setMode] = useState21("checking");
|
|
4650
|
+
const [token, setToken] = useState21(null);
|
|
4651
|
+
const [input, setInput] = useState21("");
|
|
4652
|
+
const [error, setError] = useState21(null);
|
|
4653
|
+
const [viewer, setViewer] = useState21(null);
|
|
4654
|
+
const [rateLimitReset, setRateLimitReset] = useState21(null);
|
|
4655
|
+
const [wasRateLimited, setWasRateLimited] = useState21(false);
|
|
4656
|
+
const [orgContext, setOrgContext] = useState21("personal");
|
|
4657
|
+
const [authMethod, setAuthMethod] = useState21("pat");
|
|
4658
|
+
const [oauthStatus, setOAuthStatus] = useState21("initializing");
|
|
4659
|
+
const [tokenSource, setTokenSource] = useState21("pat");
|
|
4660
|
+
const [sessionTokenOrigin, setSessionTokenOrigin] = useState21("stored");
|
|
4661
|
+
const [deviceCodeResponse, setDeviceCodeResponse] = useState21(null);
|
|
4662
|
+
const [oauthDeviceCode, setOauthDeviceCode] = useState21(null);
|
|
4663
|
+
const [dims, setDims] = useState21(() => {
|
|
4206
4664
|
const cols = stdout?.columns ?? 100;
|
|
4207
4665
|
const rows = stdout?.rows ?? 30;
|
|
4208
4666
|
return { cols, rows };
|
|
4209
4667
|
});
|
|
4210
|
-
|
|
4668
|
+
useEffect14(() => {
|
|
4211
4669
|
if (!stdout) return;
|
|
4212
4670
|
const onResize = () => {
|
|
4213
4671
|
const cols = stdout.columns ?? 100;
|
|
@@ -4219,7 +4677,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4219
4677
|
stdout.off?.("resize", onResize);
|
|
4220
4678
|
};
|
|
4221
4679
|
}, [stdout]);
|
|
4222
|
-
|
|
4680
|
+
useEffect14(() => {
|
|
4223
4681
|
const env = getTokenFromEnv();
|
|
4224
4682
|
const stored = getStoredToken();
|
|
4225
4683
|
const source = getTokenSource();
|
|
@@ -4243,7 +4701,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4243
4701
|
setMode("auth_method_selection");
|
|
4244
4702
|
}
|
|
4245
4703
|
}, [inlineToken2]);
|
|
4246
|
-
|
|
4704
|
+
useEffect14(() => {
|
|
4247
4705
|
if (mode !== "oauth_flow") return;
|
|
4248
4706
|
(async () => {
|
|
4249
4707
|
try {
|
|
@@ -4295,7 +4753,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4295
4753
|
setMode("oauth_flow");
|
|
4296
4754
|
}
|
|
4297
4755
|
};
|
|
4298
|
-
|
|
4756
|
+
useEffect14(() => {
|
|
4299
4757
|
(async () => {
|
|
4300
4758
|
if (mode !== "validating" || !token) return;
|
|
4301
4759
|
const timeoutId = setTimeout(() => {
|
|
@@ -4407,7 +4865,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4407
4865
|
setTokenSource("pat");
|
|
4408
4866
|
setMode("auth_method_selection");
|
|
4409
4867
|
};
|
|
4410
|
-
|
|
4868
|
+
useInput21((input2, key) => {
|
|
4411
4869
|
if ((mode === "prompt" || mode === "auth_method_selection") && key.escape) {
|
|
4412
4870
|
exit();
|
|
4413
4871
|
}
|
|
@@ -4439,19 +4897,19 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4439
4897
|
}
|
|
4440
4898
|
});
|
|
4441
4899
|
const verticalPadding = Math.floor(dims.rows * 0.05);
|
|
4442
|
-
const header = useMemo3(() => /* @__PURE__ */
|
|
4443
|
-
/* @__PURE__ */
|
|
4444
|
-
/* @__PURE__ */
|
|
4900
|
+
const header = useMemo3(() => /* @__PURE__ */ jsxs25(Box25, { flexDirection: "row", justifyContent: "space-between", marginBottom: 1, children: [
|
|
4901
|
+
/* @__PURE__ */ jsxs25(Box25, { flexDirection: "row", gap: 1, children: [
|
|
4902
|
+
/* @__PURE__ */ jsxs25(Text26, { bold: true, color: "cyan", children: [
|
|
4445
4903
|
" ",
|
|
4446
4904
|
"GitHub Repository Manager"
|
|
4447
4905
|
] }),
|
|
4448
|
-
/* @__PURE__ */
|
|
4906
|
+
/* @__PURE__ */ jsxs25(Text26, { color: "gray", dimColor: true, children: [
|
|
4449
4907
|
"v",
|
|
4450
4908
|
packageJson.version
|
|
4451
4909
|
] }),
|
|
4452
|
-
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */
|
|
4910
|
+
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */ jsx26(Text26, { backgroundColor: "blue", color: "white", children: " debug mode " })
|
|
4453
4911
|
] }),
|
|
4454
|
-
viewer && /* @__PURE__ */
|
|
4912
|
+
viewer && /* @__PURE__ */ jsx26(Text26, { color: "gray", children: orgContext !== "personal" && orgContext.login ? `${orgContext.login}/@${viewer} ` : `@${viewer} ` })
|
|
4455
4913
|
] }), [viewer, orgContext]);
|
|
4456
4914
|
if (mode === "rate_limited") {
|
|
4457
4915
|
const formatResetTime = (resetTime) => {
|
|
@@ -4474,71 +4932,71 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4474
4932
|
return "Unknown";
|
|
4475
4933
|
}
|
|
4476
4934
|
};
|
|
4477
|
-
return /* @__PURE__ */
|
|
4935
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4478
4936
|
header,
|
|
4479
|
-
/* @__PURE__ */
|
|
4480
|
-
/* @__PURE__ */
|
|
4481
|
-
/* @__PURE__ */
|
|
4482
|
-
/* @__PURE__ */
|
|
4483
|
-
rateLimitReset && /* @__PURE__ */
|
|
4484
|
-
/* @__PURE__ */
|
|
4485
|
-
/* @__PURE__ */
|
|
4937
|
+
/* @__PURE__ */ jsx26(Box25, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsxs25(Box25, { borderStyle: "single", borderColor: "yellow", paddingX: 3, paddingY: 2, flexDirection: "column", width: Math.min(dims.cols - 8, 80), children: [
|
|
4938
|
+
/* @__PURE__ */ jsx26(Text26, { bold: true, color: "yellow", marginBottom: 1, children: "\u26A0\uFE0F Rate Limit Exceeded" }),
|
|
4939
|
+
/* @__PURE__ */ jsx26(Text26, { color: "gray", marginBottom: 1, children: "You've hit GitHub's API rate limit for your token." }),
|
|
4940
|
+
/* @__PURE__ */ jsx26(Text26, { color: "gray", marginBottom: 1, children: "This happens when you make too many requests in a short time." }),
|
|
4941
|
+
rateLimitReset && /* @__PURE__ */ jsxs25(Box25, { marginTop: 1, marginBottom: 1, children: [
|
|
4942
|
+
/* @__PURE__ */ jsxs25(Text26, { children: [
|
|
4943
|
+
/* @__PURE__ */ jsx26(Text26, { color: "cyan", children: "Reset in:" }),
|
|
4486
4944
|
" ",
|
|
4487
|
-
/* @__PURE__ */
|
|
4945
|
+
/* @__PURE__ */ jsx26(Text26, { bold: true, children: formatResetTime(rateLimitReset) })
|
|
4488
4946
|
] }),
|
|
4489
|
-
/* @__PURE__ */
|
|
4947
|
+
/* @__PURE__ */ jsxs25(Text26, { color: "gray", dimColor: true, children: [
|
|
4490
4948
|
"(",
|
|
4491
4949
|
new Date(rateLimitReset).toLocaleTimeString(),
|
|
4492
4950
|
")"
|
|
4493
4951
|
] })
|
|
4494
4952
|
] }),
|
|
4495
|
-
/* @__PURE__ */
|
|
4496
|
-
/* @__PURE__ */
|
|
4497
|
-
/* @__PURE__ */
|
|
4498
|
-
/* @__PURE__ */
|
|
4499
|
-
/* @__PURE__ */
|
|
4953
|
+
/* @__PURE__ */ jsxs25(Box25, { marginTop: 2, flexDirection: "column", gap: 1, children: [
|
|
4954
|
+
/* @__PURE__ */ jsx26(Text26, { bold: true, children: "What would you like to do?" }),
|
|
4955
|
+
/* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", paddingLeft: 2, children: [
|
|
4956
|
+
/* @__PURE__ */ jsxs25(Text26, { children: [
|
|
4957
|
+
/* @__PURE__ */ jsx26(Text26, { color: "cyan", bold: true, children: "R" }),
|
|
4500
4958
|
" - Retry now ",
|
|
4501
4959
|
rateLimitReset && formatResetTime(rateLimitReset) !== "Now (should be reset)" ? "(likely to fail until reset)" : "(should work now)"
|
|
4502
4960
|
] }),
|
|
4503
|
-
/* @__PURE__ */
|
|
4504
|
-
/* @__PURE__ */
|
|
4961
|
+
/* @__PURE__ */ jsxs25(Text26, { children: [
|
|
4962
|
+
/* @__PURE__ */ jsx26(Text26, { color: "cyan", bold: true, children: "L" }),
|
|
4505
4963
|
" - Logout and choose authentication method"
|
|
4506
4964
|
] }),
|
|
4507
|
-
/* @__PURE__ */
|
|
4508
|
-
/* @__PURE__ */
|
|
4965
|
+
/* @__PURE__ */ jsxs25(Text26, { children: [
|
|
4966
|
+
/* @__PURE__ */ jsx26(Text26, { color: "gray", bold: true, children: "Q/Esc" }),
|
|
4509
4967
|
" - Quit application"
|
|
4510
4968
|
] })
|
|
4511
4969
|
] })
|
|
4512
4970
|
] }),
|
|
4513
|
-
/* @__PURE__ */
|
|
4971
|
+
/* @__PURE__ */ jsx26(Text26, { color: "gray", dimColor: true, marginTop: 2, children: "Tip: Using multiple tokens or waiting between requests can help avoid rate limits." })
|
|
4514
4972
|
] }) })
|
|
4515
4973
|
] });
|
|
4516
4974
|
}
|
|
4517
4975
|
if (mode === "auth_method_selection") {
|
|
4518
|
-
return /* @__PURE__ */
|
|
4976
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4519
4977
|
header,
|
|
4520
|
-
/* @__PURE__ */
|
|
4521
|
-
/* @__PURE__ */
|
|
4522
|
-
error && /* @__PURE__ */
|
|
4978
|
+
/* @__PURE__ */ jsx26(Box25, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", alignItems: "center", children: [
|
|
4979
|
+
/* @__PURE__ */ jsx26(AuthMethodSelector, { onSelect: handleAuthMethodSelect }),
|
|
4980
|
+
error && /* @__PURE__ */ jsx26(Text26, { color: "red", marginTop: 1, children: error })
|
|
4523
4981
|
] }) })
|
|
4524
4982
|
] });
|
|
4525
4983
|
}
|
|
4526
4984
|
if (mode === "oauth_flow") {
|
|
4527
|
-
return /* @__PURE__ */
|
|
4985
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4528
4986
|
header,
|
|
4529
|
-
/* @__PURE__ */
|
|
4987
|
+
/* @__PURE__ */ jsx26(Box25, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsx26(OAuthProgress, { status: oauthStatus, error: error || void 0, deviceCode: oauthDeviceCode || void 0 }) })
|
|
4530
4988
|
] });
|
|
4531
4989
|
}
|
|
4532
4990
|
if (mode === "prompt") {
|
|
4533
|
-
return /* @__PURE__ */
|
|
4991
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4534
4992
|
header,
|
|
4535
|
-
/* @__PURE__ */
|
|
4536
|
-
/* @__PURE__ */
|
|
4537
|
-
/* @__PURE__ */
|
|
4538
|
-
/* @__PURE__ */
|
|
4539
|
-
/* @__PURE__ */
|
|
4540
|
-
/* @__PURE__ */
|
|
4541
|
-
|
|
4993
|
+
/* @__PURE__ */ jsx26(Box25, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsxs25(Box25, { borderStyle: "single", borderColor: "cyan", paddingX: 2, paddingY: 1, flexDirection: "column", children: [
|
|
4994
|
+
/* @__PURE__ */ jsx26(Text26, { bold: true, marginBottom: 1, children: "Authentication Required" }),
|
|
4995
|
+
/* @__PURE__ */ jsx26(Text26, { color: "gray", marginBottom: 1, children: "Enter your GitHub Personal Access Token" }),
|
|
4996
|
+
/* @__PURE__ */ jsxs25(Box25, { children: [
|
|
4997
|
+
/* @__PURE__ */ jsx26(Text26, { children: "Token: " }),
|
|
4998
|
+
/* @__PURE__ */ jsx26(
|
|
4999
|
+
TextInput8,
|
|
4542
5000
|
{
|
|
4543
5001
|
value: input,
|
|
4544
5002
|
onChange: setInput,
|
|
@@ -4547,30 +5005,30 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4547
5005
|
}
|
|
4548
5006
|
)
|
|
4549
5007
|
] }),
|
|
4550
|
-
error && /* @__PURE__ */
|
|
4551
|
-
/* @__PURE__ */
|
|
4552
|
-
/* @__PURE__ */
|
|
5008
|
+
error && /* @__PURE__ */ jsx26(Text26, { color: "red", marginTop: 1, children: error }),
|
|
5009
|
+
/* @__PURE__ */ jsx26(Text26, { color: "gray", dimColor: true, marginTop: 1, children: "The token will be stored securely in your local config" }),
|
|
5010
|
+
/* @__PURE__ */ jsx26(Text26, { color: "gray", dimColor: true, marginTop: 1, children: "Press Esc to go back" })
|
|
4553
5011
|
] }) })
|
|
4554
5012
|
] });
|
|
4555
5013
|
}
|
|
4556
5014
|
if (mode === "validating" || mode === "checking") {
|
|
4557
|
-
return /* @__PURE__ */
|
|
5015
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4558
5016
|
header,
|
|
4559
|
-
/* @__PURE__ */
|
|
4560
|
-
/* @__PURE__ */
|
|
4561
|
-
mode === "validating" && /* @__PURE__ */
|
|
5017
|
+
/* @__PURE__ */ jsx26(Box25, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", alignItems: "center", children: [
|
|
5018
|
+
/* @__PURE__ */ jsx26(Text26, { color: "yellow", children: "Validating token..." }),
|
|
5019
|
+
mode === "validating" && /* @__PURE__ */ jsx26(Text26, { color: "gray", dimColor: true, marginTop: 1, children: "Press Esc to cancel" })
|
|
4562
5020
|
] }) })
|
|
4563
5021
|
] });
|
|
4564
5022
|
}
|
|
4565
5023
|
if (mode === "error") {
|
|
4566
|
-
return /* @__PURE__ */
|
|
5024
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4567
5025
|
header,
|
|
4568
|
-
/* @__PURE__ */
|
|
5026
|
+
/* @__PURE__ */ jsx26(Box25, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsx26(Text26, { color: "red", children: error ?? "Unexpected error" }) })
|
|
4569
5027
|
] });
|
|
4570
5028
|
}
|
|
4571
|
-
return /* @__PURE__ */
|
|
5029
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4572
5030
|
header,
|
|
4573
|
-
/* @__PURE__ */
|
|
5031
|
+
/* @__PURE__ */ jsx26(
|
|
4574
5032
|
RepoList,
|
|
4575
5033
|
{
|
|
4576
5034
|
token,
|
|
@@ -4585,7 +5043,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4585
5043
|
}
|
|
4586
5044
|
|
|
4587
5045
|
// src/index.tsx
|
|
4588
|
-
import { jsx as
|
|
5046
|
+
import { jsx as jsx27, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
4589
5047
|
var argv = process.argv.slice(2);
|
|
4590
5048
|
var getFlagValue = (name) => {
|
|
4591
5049
|
const idx = argv.findIndex((a) => a === `--${name}` || a.startsWith(`--${name}=`));
|
|
@@ -4698,8 +5156,8 @@ var inlineToken = (() => {
|
|
|
4698
5156
|
})();
|
|
4699
5157
|
logger.debug("Rendering UI");
|
|
4700
5158
|
var { unmount } = render(
|
|
4701
|
-
/* @__PURE__ */
|
|
4702
|
-
/* @__PURE__ */
|
|
4703
|
-
/* @__PURE__ */
|
|
5159
|
+
/* @__PURE__ */ jsxs26(Box26, { flexDirection: "column", children: [
|
|
5160
|
+
/* @__PURE__ */ jsx27(App, { initialOrgSlug, inlineToken, inlineTokenEphemeral: Boolean(inlineToken) }),
|
|
5161
|
+
/* @__PURE__ */ jsx27(Text27, { color: "gray" })
|
|
4704
5162
|
] })
|
|
4705
5163
|
);
|