gh-manager-cli 1.44.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 +2 -2
- package/README.md +10 -0
- package/dist/{chunk-MKIUBPVD.js → chunk-WHX6IOTW.js} +81 -0
- package/dist/{github-6HD7I2UI.js → github-72MPRF5W.js} +5 -1
- package/dist/index.js +891 -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
|
|
@@ -629,7 +631,7 @@ function OrgSwitcher({ token, currentContext, onSelect, onClose }) {
|
|
|
629
631
|
try {
|
|
630
632
|
setLoading(true);
|
|
631
633
|
setError(null);
|
|
632
|
-
const client = await import("./github-
|
|
634
|
+
const client = await import("./github-72MPRF5W.js").then((m) => m.makeClient(token));
|
|
633
635
|
const orgs = await fetchViewerOrganizations(client);
|
|
634
636
|
setOrganizations(orgs);
|
|
635
637
|
const entOrgs = /* @__PURE__ */ new Set();
|
|
@@ -1945,11 +1947,345 @@ function OpenInBrowserModal({ repo, onOpen, onCancel, theme: themeProp }) {
|
|
|
1945
1947
|
);
|
|
1946
1948
|
}
|
|
1947
1949
|
|
|
1948
|
-
// src/ui/components/modals/
|
|
1949
|
-
import {
|
|
1950
|
-
import { Box as Box16, Text as Text17 } from "ink";
|
|
1951
|
-
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";
|
|
1952
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";
|
|
1953
2289
|
function UnstarModal({
|
|
1954
2290
|
visible,
|
|
1955
2291
|
repo,
|
|
@@ -1960,8 +2296,8 @@ function UnstarModal({
|
|
|
1960
2296
|
theme: themeProp
|
|
1961
2297
|
}) {
|
|
1962
2298
|
const { theme } = useTheme(themeProp?.name ?? "default");
|
|
1963
|
-
const [focusedButton, setFocusedButton] =
|
|
1964
|
-
|
|
2299
|
+
const [focusedButton, setFocusedButton] = useState18("cancel");
|
|
2300
|
+
useInput18((input, key) => {
|
|
1965
2301
|
if (!visible) return;
|
|
1966
2302
|
if (key.escape || input === "c" || input === "C") {
|
|
1967
2303
|
onCancel();
|
|
@@ -1979,12 +2315,12 @@ function UnstarModal({
|
|
|
1979
2315
|
if (input === "n" || input === "N") onCancel();
|
|
1980
2316
|
if (input === "u" || input === "U") onConfirm();
|
|
1981
2317
|
});
|
|
1982
|
-
|
|
2318
|
+
useEffect12(() => {
|
|
1983
2319
|
if (visible) setFocusedButton("cancel");
|
|
1984
2320
|
}, [visible]);
|
|
1985
2321
|
if (!visible || !repo) return null;
|
|
1986
|
-
return /* @__PURE__ */
|
|
1987
|
-
|
|
2322
|
+
return /* @__PURE__ */ jsxs18(
|
|
2323
|
+
Box18,
|
|
1988
2324
|
{
|
|
1989
2325
|
flexDirection: "column",
|
|
1990
2326
|
borderStyle: "round",
|
|
@@ -1993,28 +2329,28 @@ function UnstarModal({
|
|
|
1993
2329
|
paddingY: 1,
|
|
1994
2330
|
marginTop: 1,
|
|
1995
2331
|
children: [
|
|
1996
|
-
/* @__PURE__ */
|
|
1997
|
-
/* @__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: [
|
|
1998
2334
|
"Are you sure you want to unstar",
|
|
1999
2335
|
" ",
|
|
2000
|
-
/* @__PURE__ */
|
|
2336
|
+
/* @__PURE__ */ jsx19(Text19, { bold: true, color: theme.primary, children: repo.nameWithOwner }),
|
|
2001
2337
|
"?"
|
|
2002
2338
|
] }) }),
|
|
2003
|
-
repo.description && /* @__PURE__ */
|
|
2004
|
-
/* @__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: [
|
|
2005
2341
|
"Stars: ",
|
|
2006
2342
|
repo.stargazerCount,
|
|
2007
2343
|
" \u2022 Forks: ",
|
|
2008
2344
|
repo.forkCount
|
|
2009
2345
|
] }) }),
|
|
2010
|
-
error && /* @__PURE__ */
|
|
2346
|
+
error && /* @__PURE__ */ jsx19(Box18, { marginBottom: 1, flexDirection: "column", children: /* @__PURE__ */ jsxs18(Text19, { color: theme.error, wrap: "wrap", children: [
|
|
2011
2347
|
error.includes("OAuth access restrictions") ? "\u26A0\uFE0F " : "Error: ",
|
|
2012
2348
|
error
|
|
2013
2349
|
] }) }),
|
|
2014
|
-
isUnstarring ? /* @__PURE__ */
|
|
2015
|
-
/* @__PURE__ */
|
|
2016
|
-
/* @__PURE__ */
|
|
2017
|
-
|
|
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,
|
|
2018
2354
|
{
|
|
2019
2355
|
backgroundColor: focusedButton === "cancel" ? "white" : void 0,
|
|
2020
2356
|
color: focusedButton === "cancel" ? "black" : "white",
|
|
@@ -2026,8 +2362,8 @@ function UnstarModal({
|
|
|
2026
2362
|
]
|
|
2027
2363
|
}
|
|
2028
2364
|
) }),
|
|
2029
|
-
/* @__PURE__ */
|
|
2030
|
-
|
|
2365
|
+
/* @__PURE__ */ jsx19(Box18, { children: /* @__PURE__ */ jsxs18(
|
|
2366
|
+
Text19,
|
|
2031
2367
|
{
|
|
2032
2368
|
backgroundColor: focusedButton === "unstar" ? "yellow" : void 0,
|
|
2033
2369
|
color: focusedButton === "unstar" ? "black" : theme.warning,
|
|
@@ -2040,7 +2376,7 @@ function UnstarModal({
|
|
|
2040
2376
|
}
|
|
2041
2377
|
) })
|
|
2042
2378
|
] }),
|
|
2043
|
-
/* @__PURE__ */
|
|
2379
|
+
/* @__PURE__ */ jsx19(Box18, { marginTop: 1, children: /* @__PURE__ */ jsx19(Text19, { dimColor: true, children: "Use \u2190 \u2192 to navigate, Enter to select" }) })
|
|
2044
2380
|
] })
|
|
2045
2381
|
]
|
|
2046
2382
|
}
|
|
@@ -2048,9 +2384,9 @@ function UnstarModal({
|
|
|
2048
2384
|
}
|
|
2049
2385
|
|
|
2050
2386
|
// src/ui/components/repo/RepoRow.tsx
|
|
2051
|
-
import { Box as
|
|
2387
|
+
import { Box as Box19, Text as Text20 } from "ink";
|
|
2052
2388
|
import chalk14 from "chalk";
|
|
2053
|
-
import { jsx as
|
|
2389
|
+
import { jsx as jsx20, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
2054
2390
|
function RepoRow({
|
|
2055
2391
|
repo,
|
|
2056
2392
|
selected,
|
|
@@ -2110,21 +2446,21 @@ function RepoRow({
|
|
|
2110
2446
|
if (line3) fullText += "\n" + metaColor(line3);
|
|
2111
2447
|
const spacingAbove = Math.floor(spacingLines / 2);
|
|
2112
2448
|
const spacingBelow = spacingLines - spacingAbove;
|
|
2113
|
-
return /* @__PURE__ */
|
|
2114
|
-
spacingAbove > 0 && /* @__PURE__ */
|
|
2115
|
-
/* @__PURE__ */
|
|
2116
|
-
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: " " }) })
|
|
2117
2453
|
] });
|
|
2118
2454
|
}
|
|
2119
2455
|
|
|
2120
2456
|
// src/ui/components/repo/FilterInput.tsx
|
|
2121
|
-
import { Box as
|
|
2122
|
-
import
|
|
2123
|
-
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";
|
|
2124
2460
|
|
|
2125
2461
|
// src/ui/components/repo/RepoListHeader.tsx
|
|
2126
|
-
import { Box as
|
|
2127
|
-
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";
|
|
2128
2464
|
function RepoListHeader({
|
|
2129
2465
|
ownerContext,
|
|
2130
2466
|
sortKey,
|
|
@@ -2141,26 +2477,26 @@ function RepoListHeader({
|
|
|
2141
2477
|
const { theme } = useTheme(themeProp?.name ?? "default");
|
|
2142
2478
|
const contextLabel = ownerContext === "personal" ? "Personal Account" : ownerContext?.type === "organization" ? `Organisation: ${ownerContext.name ?? ownerContext.login}` : "";
|
|
2143
2479
|
const visibilityLabel = visibilityFilter === "public" ? "Public" : visibilityFilter === "private" ? isEnterprise ? "Private/Internal" : "Private" : visibilityFilter === "internal" ? "Internal" : "";
|
|
2144
|
-
return /* @__PURE__ */
|
|
2145
|
-
contextLabel && /* @__PURE__ */
|
|
2146
|
-
starsMode && /* @__PURE__ */
|
|
2147
|
-
/* @__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: [
|
|
2148
2484
|
"Sort: ",
|
|
2149
2485
|
filterActive ? "relevance" : `${sortKey} ${sortDir === "asc" ? "\u2191" : "\u2193"}`
|
|
2150
2486
|
] }),
|
|
2151
|
-
/* @__PURE__ */
|
|
2487
|
+
/* @__PURE__ */ jsxs21(Text22, { color: theme.muted, dimColor: true, children: [
|
|
2152
2488
|
"Fork Status - Commits Behind: ",
|
|
2153
2489
|
forkTracking ? "ON" : "OFF"
|
|
2154
2490
|
] }),
|
|
2155
|
-
!!visibilityLabel && !starsMode && /* @__PURE__ */
|
|
2491
|
+
!!visibilityLabel && !starsMode && /* @__PURE__ */ jsxs21(Text22, { color: theme.warning, children: [
|
|
2156
2492
|
"Visibility: ",
|
|
2157
2493
|
visibilityLabel
|
|
2158
2494
|
] }),
|
|
2159
|
-
archiveFilter !== "all" && /* @__PURE__ */
|
|
2495
|
+
archiveFilter !== "all" && /* @__PURE__ */ jsxs21(Text22, { color: theme.primary, children: [
|
|
2160
2496
|
"Archive: ",
|
|
2161
2497
|
archiveFilter === "archived" ? "Archived" : "Unarchived"
|
|
2162
2498
|
] }),
|
|
2163
|
-
(filterActive || starsMode && filter.trim().length > 0) && /* @__PURE__ */
|
|
2499
|
+
(filterActive || starsMode && filter.trim().length > 0) && /* @__PURE__ */ jsxs21(Text22, { color: theme.primary, children: [
|
|
2164
2500
|
starsMode ? "Filter" : "Search",
|
|
2165
2501
|
': "',
|
|
2166
2502
|
filter.trim(),
|
|
@@ -2170,7 +2506,7 @@ function RepoListHeader({
|
|
|
2170
2506
|
}
|
|
2171
2507
|
|
|
2172
2508
|
// src/ui/views/RepoList.tsx
|
|
2173
|
-
import { Fragment as
|
|
2509
|
+
import { Fragment as Fragment11, jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
2174
2510
|
var getPageSize = () => {
|
|
2175
2511
|
const envValue = process.env.REPOS_PER_FETCH;
|
|
2176
2512
|
if (envValue) {
|
|
@@ -2186,17 +2522,17 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2186
2522
|
const { exit } = useApp();
|
|
2187
2523
|
const { stdout } = useStdout();
|
|
2188
2524
|
const client = useMemo2(() => makeClient(token), [token]);
|
|
2189
|
-
const [debugMessages, setDebugMessages] =
|
|
2525
|
+
const [debugMessages, setDebugMessages] = useState19([]);
|
|
2190
2526
|
const addDebugMessage = useCallback((msg) => {
|
|
2191
2527
|
if (process.env.GH_MANAGER_DEBUG === "1") {
|
|
2192
2528
|
setDebugMessages((prev) => [...prev.slice(-9), msg]);
|
|
2193
2529
|
}
|
|
2194
2530
|
}, []);
|
|
2195
|
-
const handleOrgContextChangeRef =
|
|
2196
|
-
|
|
2531
|
+
const handleOrgContextChangeRef = useRef3(onOrgContextChange);
|
|
2532
|
+
useEffect13(() => {
|
|
2197
2533
|
handleOrgContextChangeRef.current = onOrgContextChange;
|
|
2198
2534
|
}, [onOrgContextChange]);
|
|
2199
|
-
|
|
2535
|
+
React19.useEffect(() => {
|
|
2200
2536
|
addDebugMessage(`[RepoList] Component mounted`);
|
|
2201
2537
|
logger.info("RepoList component mounted", {
|
|
2202
2538
|
token: token ? "present" : "missing",
|
|
@@ -2208,90 +2544,93 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2208
2544
|
}, []);
|
|
2209
2545
|
const terminalWidth = stdout?.columns ?? 80;
|
|
2210
2546
|
const availableHeight = maxVisibleRows ?? 20;
|
|
2211
|
-
const [items, setItems] =
|
|
2212
|
-
const [cursor, setCursor] =
|
|
2213
|
-
const [endCursor, setEndCursor] =
|
|
2214
|
-
const [hasNextPage, setHasNextPage] =
|
|
2215
|
-
const [totalCount, setTotalCount] =
|
|
2216
|
-
const [loading, setLoading] =
|
|
2217
|
-
const [sortingLoading, setSortingLoading] =
|
|
2218
|
-
const [refreshing, setRefreshing] =
|
|
2219
|
-
const [loadingMore, setLoadingMore] =
|
|
2220
|
-
const [error, setError] =
|
|
2221
|
-
const [rateLimit, setRateLimit] =
|
|
2222
|
-
const [prevRateLimit, setPrevRateLimit] =
|
|
2223
|
-
const [restRateLimit, setRestRateLimit] =
|
|
2224
|
-
const [prevRestRateLimit, setPrevRestRateLimit] =
|
|
2225
|
-
const [density, setDensity] =
|
|
2226
|
-
const [prefsLoaded, setPrefsLoaded] =
|
|
2227
|
-
const [themeName, setThemeName] =
|
|
2228
|
-
const [themeToast, setThemeToast] =
|
|
2229
|
-
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);
|
|
2230
2566
|
const { theme, c: tc } = useTheme(themeName);
|
|
2231
|
-
const [ownerContext, setOwnerContext] =
|
|
2232
|
-
const [ownerAffiliations, setOwnerAffiliations] =
|
|
2233
|
-
const [orgSwitcherOpen, setOrgSwitcherOpen] =
|
|
2234
|
-
const [operationCount, setOperationCount] =
|
|
2235
|
-
const [showSponsorReminder, setShowSponsorReminder] =
|
|
2236
|
-
const [deleteMode, setDeleteMode] =
|
|
2237
|
-
const [deleteTarget, setDeleteTarget] =
|
|
2238
|
-
const [deleteCode, setDeleteCode] =
|
|
2239
|
-
const [typedCode, setTypedCode] =
|
|
2240
|
-
const [deleting, setDeleting] =
|
|
2241
|
-
const [deleteError, setDeleteError] =
|
|
2242
|
-
const [deleteConfirmStage, setDeleteConfirmStage] =
|
|
2243
|
-
const [confirmFocus, setConfirmFocus] =
|
|
2244
|
-
const [archiveMode, setArchiveMode] =
|
|
2245
|
-
const [archiveTarget, setArchiveTarget] =
|
|
2246
|
-
const [archiving, setArchiving] =
|
|
2247
|
-
const [archiveError, setArchiveError] =
|
|
2248
|
-
const [archiveFocus, setArchiveFocus] =
|
|
2249
|
-
const [syncMode, setSyncMode] =
|
|
2250
|
-
const [syncTarget, setSyncTarget] =
|
|
2251
|
-
const [syncing, setSyncing] =
|
|
2252
|
-
const [syncError, setSyncError] =
|
|
2253
|
-
const [syncFocus, setSyncFocus] =
|
|
2254
|
-
const [renameMode, setRenameMode] =
|
|
2255
|
-
const [renameTarget, setRenameTarget] =
|
|
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
|
-
const [
|
|
2287
|
-
const [
|
|
2288
|
-
const [
|
|
2289
|
-
const [
|
|
2290
|
-
const [
|
|
2291
|
-
const [
|
|
2292
|
-
const
|
|
2293
|
-
const
|
|
2294
|
-
|
|
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(() => {
|
|
2295
2634
|
(async () => {
|
|
2296
2635
|
if (appliedInitialOrg.current) return;
|
|
2297
2636
|
if (!initialOrgSlug2) return;
|
|
@@ -2529,7 +2868,62 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2529
2868
|
throw error2;
|
|
2530
2869
|
}
|
|
2531
2870
|
}
|
|
2532
|
-
|
|
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);
|
|
2533
2927
|
async function handleCopyUrl(url, type) {
|
|
2534
2928
|
try {
|
|
2535
2929
|
if (copyToastTimerRef.current) {
|
|
@@ -2556,7 +2950,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2556
2950
|
throw error2;
|
|
2557
2951
|
}
|
|
2558
2952
|
}
|
|
2559
|
-
|
|
2953
|
+
useEffect13(() => {
|
|
2560
2954
|
return () => {
|
|
2561
2955
|
if (copyToastTimerRef.current) clearTimeout(copyToastTimerRef.current);
|
|
2562
2956
|
if (themeToastTimerRef.current) clearTimeout(themeToastTimerRef.current);
|
|
@@ -2651,12 +3045,12 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2651
3045
|
setDeleteError("Failed to delete repository. Ensure delete_repo scope and admin permissions.");
|
|
2652
3046
|
}
|
|
2653
3047
|
}
|
|
2654
|
-
const [filter, setFilter] =
|
|
2655
|
-
const [filterMode, setFilterMode] =
|
|
2656
|
-
const [sortKey, setSortKey] =
|
|
2657
|
-
const [sortDir, setSortDir] =
|
|
2658
|
-
const [forkTracking, setForkTracking] =
|
|
2659
|
-
|
|
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(() => {
|
|
2660
3054
|
if (loading || loadingMore || hasNextPage || items.length === 0) return;
|
|
2661
3055
|
if (!forkTracking) return;
|
|
2662
3056
|
const unenriched = items.filter(
|
|
@@ -2722,22 +3116,27 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2722
3116
|
async function jumpToUpstreamRepo(parentNameWithOwner) {
|
|
2723
3117
|
const [parentOwner, parentName] = parentNameWithOwner.split("/");
|
|
2724
3118
|
if (!parentOwner || !parentName) return;
|
|
2725
|
-
|
|
2726
|
-
|
|
2727
|
-
|
|
2728
|
-
|
|
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 });
|
|
2729
3127
|
}
|
|
2730
3128
|
}
|
|
2731
|
-
const [visibilityFilter, setVisibilityFilter] =
|
|
2732
|
-
const previousVisibilityFilter =
|
|
2733
|
-
const
|
|
3129
|
+
const [visibilityFilter, setVisibilityFilter] = useState19("all");
|
|
3130
|
+
const previousVisibilityFilter = useRef3("all");
|
|
3131
|
+
const pendingFocusRef = useRef3(null);
|
|
3132
|
+
const [archiveFilter, setArchiveFilter] = useState19("all");
|
|
2734
3133
|
const sortFieldMap = {
|
|
2735
3134
|
"updated": "UPDATED_AT",
|
|
2736
3135
|
"pushed": "PUSHED_AT",
|
|
2737
3136
|
"name": "NAME",
|
|
2738
3137
|
"stars": "STARGAZERS"
|
|
2739
3138
|
};
|
|
2740
|
-
const fetchPage = async (after, reset = false, isSortChange = false, overrideForkTracking, policy) => {
|
|
3139
|
+
const fetchPage = async (after, reset = false, isSortChange = false, overrideForkTracking, policy, privacyOverride) => {
|
|
2741
3140
|
logger.info("fetchPage called", {
|
|
2742
3141
|
after,
|
|
2743
3142
|
reset,
|
|
@@ -2761,7 +3160,9 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2761
3160
|
};
|
|
2762
3161
|
const orgLogin = ownerContext !== "personal" ? ownerContext.login : void 0;
|
|
2763
3162
|
let privacy;
|
|
2764
|
-
if (
|
|
3163
|
+
if (privacyOverride !== void 0) {
|
|
3164
|
+
privacy = privacyOverride === "all" ? void 0 : privacyOverride;
|
|
3165
|
+
} else if (visibilityFilter === "public") privacy = "PUBLIC";
|
|
2765
3166
|
else if (visibilityFilter === "private") privacy = "PRIVATE";
|
|
2766
3167
|
const page = await fetchViewerReposPageUnified(
|
|
2767
3168
|
token,
|
|
@@ -2835,7 +3236,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2835
3236
|
setLoadingMore(false);
|
|
2836
3237
|
}
|
|
2837
3238
|
};
|
|
2838
|
-
|
|
3239
|
+
useEffect13(() => {
|
|
2839
3240
|
const ui = getUIPrefs();
|
|
2840
3241
|
if (ui.density !== void 0) setDensity(ui.density);
|
|
2841
3242
|
if (ui.sortKey && ["updated", "pushed", "name", "stars"].includes(ui.sortKey)) {
|
|
@@ -2871,7 +3272,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2871
3272
|
}
|
|
2872
3273
|
setPrefsLoaded(true);
|
|
2873
3274
|
}, [onOrgContextChange]);
|
|
2874
|
-
|
|
3275
|
+
useEffect13(() => {
|
|
2875
3276
|
if (!prefsLoaded) return;
|
|
2876
3277
|
let policy = "cache-first";
|
|
2877
3278
|
const orgLogin = ownerContext !== "personal" ? ownerContext.login : void 0;
|
|
@@ -2891,7 +3292,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2891
3292
|
setCursor(0);
|
|
2892
3293
|
fetchPage(null, true, false, void 0, policy);
|
|
2893
3294
|
}, [client, prefsLoaded, ownerContext, ownerAffiliations]);
|
|
2894
|
-
|
|
3295
|
+
useEffect13(() => {
|
|
2895
3296
|
if (visibilityFilter !== "all" || previousVisibilityFilter.current && previousVisibilityFilter.current !== visibilityFilter) {
|
|
2896
3297
|
if (items.length > 0) {
|
|
2897
3298
|
fetchPage(null, true, true, void 0, "network-only");
|
|
@@ -2899,7 +3300,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
2899
3300
|
}
|
|
2900
3301
|
previousVisibilityFilter.current = visibilityFilter;
|
|
2901
3302
|
}, [visibilityFilter]);
|
|
2902
|
-
|
|
3303
|
+
useInput19((input, key) => {
|
|
2903
3304
|
if (error) {
|
|
2904
3305
|
if (input && input.toUpperCase() === "Q") {
|
|
2905
3306
|
try {
|
|
@@ -3061,6 +3462,12 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3061
3462
|
if (renameMode) {
|
|
3062
3463
|
return;
|
|
3063
3464
|
}
|
|
3465
|
+
if (createMode) {
|
|
3466
|
+
return;
|
|
3467
|
+
}
|
|
3468
|
+
if (transferMode) {
|
|
3469
|
+
return;
|
|
3470
|
+
}
|
|
3064
3471
|
if (openInBrowserMode) {
|
|
3065
3472
|
return;
|
|
3066
3473
|
}
|
|
@@ -3252,8 +3659,20 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3252
3659
|
}
|
|
3253
3660
|
return;
|
|
3254
3661
|
}
|
|
3255
|
-
if (
|
|
3256
|
-
|
|
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
|
+
}
|
|
3257
3676
|
return;
|
|
3258
3677
|
}
|
|
3259
3678
|
if (input && input.toUpperCase() === "S" && !key.shift && !key.ctrl && !filterActive) {
|
|
@@ -3416,9 +3835,18 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3416
3835
|
return result;
|
|
3417
3836
|
}, [starredItems, filter, archiveFilter]);
|
|
3418
3837
|
const visibleItems = starsMode ? filteredStarredItems : filterActive ? fuzzyItems : filteredAndSorted;
|
|
3419
|
-
|
|
3838
|
+
useEffect13(() => {
|
|
3420
3839
|
setCursor((c) => Math.min(c, Math.max(0, visibleItems.length - 1)));
|
|
3421
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]);
|
|
3422
3850
|
const headerHeight = 2;
|
|
3423
3851
|
const footerHeight = 4;
|
|
3424
3852
|
const containerPadding = 2;
|
|
@@ -3429,7 +3857,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3429
3857
|
() => computeWindow(visibleItems, cursor, listHeight, spacingLines),
|
|
3430
3858
|
[visibleItems, cursor, listHeight, spacingLines]
|
|
3431
3859
|
);
|
|
3432
|
-
|
|
3860
|
+
useEffect13(() => {
|
|
3433
3861
|
const rawItemsLength = starsMode ? starredItems.length : items.length;
|
|
3434
3862
|
const filterDrainedPage = visibleItems.length === 0 && archiveFilter !== "all" && rawItemsLength > 0;
|
|
3435
3863
|
if (starsMode) {
|
|
@@ -3448,79 +3876,79 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3448
3876
|
exec(cmd);
|
|
3449
3877
|
}
|
|
3450
3878
|
const lowRate = rateLimit && rateLimit.remaining <= Math.ceil(rateLimit.limit * 0.1) || restRateLimit && restRateLimit.core.remaining <= Math.ceil(restRateLimit.core.limit * 0.1);
|
|
3451
|
-
const modalOpen = deleteMode || archiveMode || syncMode || logoutMode || infoMode || visibilityMode || archiveFilterMode || sortMode || sortDirectionMode || changeVisibilityMode || copyUrlMode || renameMode || openInBrowserMode;
|
|
3452
|
-
const headerBar = useMemo2(() => /* @__PURE__ */
|
|
3453
|
-
/* @__PURE__ */
|
|
3454
|
-
/* @__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: [
|
|
3455
3883
|
" ",
|
|
3456
3884
|
ownerContext === "personal" ? "Personal" : ownerContext.name || ownerContext.login,
|
|
3457
3885
|
ownerContext !== "personal" && isEnterpriseOrg && " (ENT)"
|
|
3458
3886
|
] }),
|
|
3459
|
-
/* @__PURE__ */
|
|
3460
|
-
/* @__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: [
|
|
3461
3889
|
"(",
|
|
3462
3890
|
visibleItems.length,
|
|
3463
3891
|
"/",
|
|
3464
3892
|
totalCount,
|
|
3465
3893
|
")"
|
|
3466
3894
|
] }),
|
|
3467
|
-
loadingMore && hasNextPage && !starsMode && totalCount > 0 && /* @__PURE__ */
|
|
3468
|
-
enrichingForks && /* @__PURE__ */
|
|
3469
|
-
(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, {}) }) })
|
|
3470
3898
|
] }),
|
|
3471
|
-
(rateLimit || restRateLimit) && /* @__PURE__ */
|
|
3899
|
+
(rateLimit || restRateLimit) && /* @__PURE__ */ jsxs22(Text23, { color: lowRate ? theme.warning : theme.muted, children: [
|
|
3472
3900
|
"GraphQL: ",
|
|
3473
3901
|
rateLimit ? `${rateLimit.remaining}/${rateLimit.limit}` : "---/---",
|
|
3474
|
-
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})` }),
|
|
3475
3903
|
" | ",
|
|
3476
3904
|
"REST: ",
|
|
3477
3905
|
restRateLimit ? `${restRateLimit.core.remaining}/${restRateLimit.core.limit}` : "---/---",
|
|
3478
|
-
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})` }),
|
|
3479
3907
|
" "
|
|
3480
3908
|
] })
|
|
3481
3909
|
] }), [visibleItems.length, totalCount, loading, loadingMore, rateLimit, lowRate, modalOpen, prevRateLimit, ownerContext, isEnterpriseOrg, restRateLimit, prevRestRateLimit, enrichingForks, starsMode, hasNextPage, items.length, theme]);
|
|
3482
3910
|
if (error) {
|
|
3483
|
-
return /* @__PURE__ */
|
|
3484
|
-
/* @__PURE__ */
|
|
3485
|
-
/* @__PURE__ */
|
|
3486
|
-
/* @__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)" })
|
|
3487
3915
|
] }) }),
|
|
3488
|
-
/* @__PURE__ */
|
|
3489
|
-
/* @__PURE__ */
|
|
3490
|
-
/* @__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" }) })
|
|
3491
3919
|
] }) }) }),
|
|
3492
|
-
/* @__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" }) })
|
|
3493
3921
|
] });
|
|
3494
3922
|
}
|
|
3495
3923
|
if (loading && items.length === 0 || sortingLoading) {
|
|
3496
|
-
return /* @__PURE__ */
|
|
3497
|
-
/* @__PURE__ */
|
|
3498
|
-
/* @__PURE__ */
|
|
3499
|
-
/* @__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...)" })
|
|
3500
3928
|
] }) }),
|
|
3501
|
-
/* @__PURE__ */
|
|
3502
|
-
/* @__PURE__ */
|
|
3503
|
-
/* @__PURE__ */
|
|
3504
|
-
/* @__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..." })
|
|
3505
3933
|
] }),
|
|
3506
|
-
/* @__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" }) })
|
|
3507
3935
|
] }) }) }) }),
|
|
3508
|
-
/* @__PURE__ */
|
|
3936
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, paddingX: 1, children: /* @__PURE__ */ jsx23(Text23, { color: "gray", children: "Please wait..." }) })
|
|
3509
3937
|
] });
|
|
3510
3938
|
}
|
|
3511
|
-
return /* @__PURE__ */
|
|
3939
|
+
return /* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", height: availableHeight, children: [
|
|
3512
3940
|
headerBar,
|
|
3513
|
-
showSponsorReminder && /* @__PURE__ */
|
|
3514
|
-
/* @__PURE__ */
|
|
3515
|
-
/* @__PURE__ */
|
|
3516
|
-
/* @__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" })
|
|
3517
3945
|
] }) }) }),
|
|
3518
|
-
/* @__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 ? (
|
|
3519
3947
|
// Centered modal; hide list content while modal is open
|
|
3520
|
-
/* @__PURE__ */
|
|
3521
|
-
/* @__PURE__ */
|
|
3522
|
-
/* @__PURE__ */
|
|
3523
|
-
/* @__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: " " }) }),
|
|
3524
3952
|
(() => {
|
|
3525
3953
|
const langName = deleteTarget.primaryLanguage?.name || "";
|
|
3526
3954
|
const langColor = deleteTarget.primaryLanguage?.color || "#666666";
|
|
@@ -3532,20 +3960,20 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3532
3960
|
let line2 = "";
|
|
3533
3961
|
if (langName) line2 += chalk15.hex(langColor)("\u25CF ") + tc.muted(`${langName} `);
|
|
3534
3962
|
line2 += tc.muted(`\u2605 ${deleteTarget.stargazerCount} \u2442 ${deleteTarget.forkCount} Updated ${formatDate(deleteTarget.updatedAt)}`);
|
|
3535
|
-
return /* @__PURE__ */
|
|
3536
|
-
/* @__PURE__ */
|
|
3537
|
-
/* @__PURE__ */
|
|
3963
|
+
return /* @__PURE__ */ jsxs22(Fragment11, { children: [
|
|
3964
|
+
/* @__PURE__ */ jsx23(Text23, { children: line1 }),
|
|
3965
|
+
/* @__PURE__ */ jsx23(Text23, { children: line2 })
|
|
3538
3966
|
] });
|
|
3539
3967
|
})(),
|
|
3540
|
-
/* @__PURE__ */
|
|
3968
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsxs22(Text23, { children: [
|
|
3541
3969
|
"Type ",
|
|
3542
|
-
/* @__PURE__ */
|
|
3970
|
+
/* @__PURE__ */ jsx23(Text23, { color: "yellow", bold: true, children: deleteCode }),
|
|
3543
3971
|
" to confirm."
|
|
3544
3972
|
] }) }),
|
|
3545
|
-
!deleteConfirmStage && /* @__PURE__ */
|
|
3546
|
-
/* @__PURE__ */
|
|
3547
|
-
/* @__PURE__ */
|
|
3548
|
-
|
|
3973
|
+
!deleteConfirmStage && /* @__PURE__ */ jsxs22(Box22, { marginTop: 1, children: [
|
|
3974
|
+
/* @__PURE__ */ jsx23(Text23, { children: "Confirm code: " }),
|
|
3975
|
+
/* @__PURE__ */ jsx23(
|
|
3976
|
+
TextInput7,
|
|
3549
3977
|
{
|
|
3550
3978
|
value: typedCode,
|
|
3551
3979
|
onChange: (v) => {
|
|
@@ -3571,11 +3999,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3571
3999
|
}
|
|
3572
4000
|
)
|
|
3573
4001
|
] }),
|
|
3574
|
-
deleteConfirmStage && /* @__PURE__ */
|
|
3575
|
-
/* @__PURE__ */
|
|
3576
|
-
/* @__PURE__ */
|
|
3577
|
-
/* @__PURE__ */
|
|
3578
|
-
|
|
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,
|
|
3579
4007
|
{
|
|
3580
4008
|
borderStyle: "round",
|
|
3581
4009
|
borderColor: "red",
|
|
@@ -3584,11 +4012,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3584
4012
|
alignItems: "center",
|
|
3585
4013
|
justifyContent: "center",
|
|
3586
4014
|
flexDirection: "column",
|
|
3587
|
-
children: /* @__PURE__ */
|
|
4015
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: confirmFocus === "delete" ? chalk15.bgRed.white.bold(" Delete ") : tc.error.bold("Delete") })
|
|
3588
4016
|
}
|
|
3589
4017
|
),
|
|
3590
|
-
/* @__PURE__ */
|
|
3591
|
-
|
|
4018
|
+
/* @__PURE__ */ jsx23(
|
|
4019
|
+
Box22,
|
|
3592
4020
|
{
|
|
3593
4021
|
borderStyle: "round",
|
|
3594
4022
|
borderColor: confirmFocus === "cancel" ? "white" : "gray",
|
|
@@ -3597,17 +4025,17 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3597
4025
|
alignItems: "center",
|
|
3598
4026
|
justifyContent: "center",
|
|
3599
4027
|
flexDirection: "column",
|
|
3600
|
-
children: /* @__PURE__ */
|
|
4028
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: confirmFocus === "cancel" ? tc.btnMuted(" Cancel ") : tc.muted.bold("Cancel") })
|
|
3601
4029
|
}
|
|
3602
4030
|
)
|
|
3603
4031
|
] }),
|
|
3604
|
-
/* @__PURE__ */
|
|
4032
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Text23, { color: "gray", children: [
|
|
3605
4033
|
"Press Enter to ",
|
|
3606
4034
|
confirmFocus === "delete" ? "Delete" : "Cancel",
|
|
3607
4035
|
" | Y to Delete | C to Cancel"
|
|
3608
4036
|
] }) }),
|
|
3609
|
-
/* @__PURE__ */
|
|
3610
|
-
|
|
4037
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(
|
|
4038
|
+
TextInput7,
|
|
3611
4039
|
{
|
|
3612
4040
|
value: "",
|
|
3613
4041
|
onChange: () => {
|
|
@@ -3620,18 +4048,18 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3620
4048
|
}
|
|
3621
4049
|
) })
|
|
3622
4050
|
] }),
|
|
3623
|
-
deleteError && /* @__PURE__ */
|
|
3624
|
-
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..." }) })
|
|
3625
4053
|
] }) })
|
|
3626
|
-
) : archiveMode && archiveTarget ? /* @__PURE__ */
|
|
3627
|
-
/* @__PURE__ */
|
|
3628
|
-
/* @__PURE__ */
|
|
3629
|
-
/* @__PURE__ */
|
|
3630
|
-
/* @__PURE__ */
|
|
3631
|
-
/* @__PURE__ */
|
|
3632
|
-
/* @__PURE__ */
|
|
3633
|
-
/* @__PURE__ */
|
|
3634
|
-
|
|
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,
|
|
3635
4063
|
{
|
|
3636
4064
|
borderStyle: "round",
|
|
3637
4065
|
borderColor: archiveTarget.isArchived ? "green" : "yellow",
|
|
@@ -3640,11 +4068,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3640
4068
|
alignItems: "center",
|
|
3641
4069
|
justifyContent: "center",
|
|
3642
4070
|
flexDirection: "column",
|
|
3643
|
-
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") })
|
|
3644
4072
|
}
|
|
3645
4073
|
),
|
|
3646
|
-
/* @__PURE__ */
|
|
3647
|
-
|
|
4074
|
+
/* @__PURE__ */ jsx23(
|
|
4075
|
+
Box22,
|
|
3648
4076
|
{
|
|
3649
4077
|
borderStyle: "round",
|
|
3650
4078
|
borderColor: archiveFocus === "cancel" ? "white" : "gray",
|
|
@@ -3653,19 +4081,19 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3653
4081
|
alignItems: "center",
|
|
3654
4082
|
justifyContent: "center",
|
|
3655
4083
|
flexDirection: "column",
|
|
3656
|
-
children: /* @__PURE__ */
|
|
4084
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: archiveFocus === "cancel" ? tc.btnMuted(" Cancel ") : tc.muted.bold("Cancel") })
|
|
3657
4085
|
}
|
|
3658
4086
|
)
|
|
3659
4087
|
] }),
|
|
3660
|
-
/* @__PURE__ */
|
|
4088
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3661
4089
|
"Press Enter to ",
|
|
3662
4090
|
archiveFocus === "confirm" ? archiveTarget.isArchived ? "Unarchive" : "Archive" : "Cancel",
|
|
3663
4091
|
" | Y to ",
|
|
3664
4092
|
archiveTarget.isArchived ? "Unarchive" : "Archive",
|
|
3665
4093
|
" | C to Cancel"
|
|
3666
4094
|
] }) }),
|
|
3667
|
-
/* @__PURE__ */
|
|
3668
|
-
|
|
4095
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(
|
|
4096
|
+
TextInput7,
|
|
3669
4097
|
{
|
|
3670
4098
|
value: "",
|
|
3671
4099
|
onChange: () => {
|
|
@@ -3679,14 +4107,14 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3679
4107
|
}
|
|
3680
4108
|
}
|
|
3681
4109
|
) }),
|
|
3682
|
-
archiveError && /* @__PURE__ */
|
|
3683
|
-
archiving && /* @__PURE__ */
|
|
3684
|
-
] }) }) : syncMode && syncTarget ? /* @__PURE__ */
|
|
3685
|
-
/* @__PURE__ */
|
|
3686
|
-
/* @__PURE__ */
|
|
3687
|
-
/* @__PURE__ */
|
|
3688
|
-
/* @__PURE__ */
|
|
3689
|
-
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: [
|
|
3690
4118
|
"Upstream: ",
|
|
3691
4119
|
syncTarget.parent.nameWithOwner
|
|
3692
4120
|
] }),
|
|
@@ -3701,12 +4129,12 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3701
4129
|
if (ahead > 0) parts.push(chalk15.green(`${ahead} ahead`));
|
|
3702
4130
|
if (behind > 0) parts.push(chalk15.yellow(`${behind} behind`));
|
|
3703
4131
|
const statusText = parts.length === 0 ? chalk15.green("Your fork is up to date with upstream.") : `This fork is ${parts.join(", ")} of upstream.`;
|
|
3704
|
-
return /* @__PURE__ */
|
|
4132
|
+
return /* @__PURE__ */ jsx23(Text23, { children: statusText });
|
|
3705
4133
|
})(),
|
|
3706
|
-
/* @__PURE__ */
|
|
3707
|
-
/* @__PURE__ */
|
|
3708
|
-
/* @__PURE__ */
|
|
3709
|
-
|
|
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,
|
|
3710
4138
|
{
|
|
3711
4139
|
borderStyle: "round",
|
|
3712
4140
|
borderColor: "blue",
|
|
@@ -3715,11 +4143,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3715
4143
|
alignItems: "center",
|
|
3716
4144
|
justifyContent: "center",
|
|
3717
4145
|
flexDirection: "column",
|
|
3718
|
-
children: /* @__PURE__ */
|
|
4146
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: syncFocus === "confirm" ? tc.btnPrimary(" Sync ") : tc.primary.bold("Sync") })
|
|
3719
4147
|
}
|
|
3720
4148
|
),
|
|
3721
|
-
/* @__PURE__ */
|
|
3722
|
-
|
|
4149
|
+
/* @__PURE__ */ jsx23(
|
|
4150
|
+
Box22,
|
|
3723
4151
|
{
|
|
3724
4152
|
borderStyle: "round",
|
|
3725
4153
|
borderColor: syncFocus === "cancel" ? "white" : "gray",
|
|
@@ -3728,17 +4156,17 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3728
4156
|
alignItems: "center",
|
|
3729
4157
|
justifyContent: "center",
|
|
3730
4158
|
flexDirection: "column",
|
|
3731
|
-
children: /* @__PURE__ */
|
|
4159
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: syncFocus === "cancel" ? tc.btnMuted(" Cancel ") : tc.muted.bold("Cancel") })
|
|
3732
4160
|
}
|
|
3733
4161
|
)
|
|
3734
4162
|
] }),
|
|
3735
|
-
/* @__PURE__ */
|
|
4163
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3736
4164
|
"Press Enter to ",
|
|
3737
4165
|
syncFocus === "confirm" ? "Sync" : "Cancel",
|
|
3738
4166
|
" | Y to Sync | C to Cancel"
|
|
3739
4167
|
] }) }),
|
|
3740
|
-
/* @__PURE__ */
|
|
3741
|
-
|
|
4168
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, children: /* @__PURE__ */ jsx23(
|
|
4169
|
+
TextInput7,
|
|
3742
4170
|
{
|
|
3743
4171
|
value: "",
|
|
3744
4172
|
onChange: () => {
|
|
@@ -3752,14 +4180,14 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3752
4180
|
}
|
|
3753
4181
|
}
|
|
3754
4182
|
) }),
|
|
3755
|
-
syncError && /* @__PURE__ */
|
|
3756
|
-
syncing && /* @__PURE__ */
|
|
3757
|
-
] }) }) : logoutMode ? /* @__PURE__ */
|
|
3758
|
-
/* @__PURE__ */
|
|
3759
|
-
/* @__PURE__ */
|
|
3760
|
-
/* @__PURE__ */
|
|
3761
|
-
/* @__PURE__ */
|
|
3762
|
-
|
|
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,
|
|
3763
4191
|
{
|
|
3764
4192
|
borderStyle: "round",
|
|
3765
4193
|
borderColor: theme.primary,
|
|
@@ -3768,11 +4196,11 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3768
4196
|
alignItems: "center",
|
|
3769
4197
|
justifyContent: "center",
|
|
3770
4198
|
flexDirection: "column",
|
|
3771
|
-
children: /* @__PURE__ */
|
|
4199
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: logoutFocus === "confirm" ? tc.btnPrimary(" Logout ") : tc.primary.bold("Logout") })
|
|
3772
4200
|
}
|
|
3773
4201
|
),
|
|
3774
|
-
/* @__PURE__ */
|
|
3775
|
-
|
|
4202
|
+
/* @__PURE__ */ jsx23(
|
|
4203
|
+
Box22,
|
|
3776
4204
|
{
|
|
3777
4205
|
borderStyle: "round",
|
|
3778
4206
|
borderColor: logoutFocus === "cancel" ? "white" : theme.muted,
|
|
@@ -3781,16 +4209,16 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3781
4209
|
alignItems: "center",
|
|
3782
4210
|
justifyContent: "center",
|
|
3783
4211
|
flexDirection: "column",
|
|
3784
|
-
children: /* @__PURE__ */
|
|
4212
|
+
children: /* @__PURE__ */ jsx23(Text23, { children: logoutFocus === "cancel" ? tc.btnMuted(" Cancel ") : tc.muted.bold("Cancel") })
|
|
3785
4213
|
}
|
|
3786
4214
|
)
|
|
3787
4215
|
] }),
|
|
3788
|
-
/* @__PURE__ */
|
|
4216
|
+
/* @__PURE__ */ jsx23(Box22, { marginTop: 1, flexDirection: "row", justifyContent: "center", children: /* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3789
4217
|
"Press Enter to ",
|
|
3790
4218
|
logoutFocus === "confirm" ? "Logout" : "Cancel",
|
|
3791
4219
|
" | Y to Logout | C to Cancel"
|
|
3792
4220
|
] }) })
|
|
3793
|
-
] }) }) : orgSwitcherOpen ? /* @__PURE__ */
|
|
4221
|
+
] }) }) : orgSwitcherOpen ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3794
4222
|
OrgSwitcher,
|
|
3795
4223
|
{
|
|
3796
4224
|
token,
|
|
@@ -3798,45 +4226,45 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3798
4226
|
onSelect: handleOrgContextChange,
|
|
3799
4227
|
onClose: () => setOrgSwitcherOpen(false)
|
|
3800
4228
|
}
|
|
3801
|
-
) }) : infoMode ? /* @__PURE__ */
|
|
4229
|
+
) }) : infoMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: (() => {
|
|
3802
4230
|
const repo = infoRepo || visibleItems[cursor];
|
|
3803
|
-
if (!repo) return /* @__PURE__ */
|
|
4231
|
+
if (!repo) return /* @__PURE__ */ jsx23(Text23, { color: theme.error, children: "No repository selected." });
|
|
3804
4232
|
const langName = repo.primaryLanguage?.name || "N/A";
|
|
3805
4233
|
const langColor = repo.primaryLanguage?.color || "#666666";
|
|
3806
|
-
return /* @__PURE__ */
|
|
3807
|
-
/* @__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: [
|
|
3808
4236
|
"Repository Info ",
|
|
3809
4237
|
infoRepo ? tc.muted("(cached)") : ""
|
|
3810
4238
|
] }),
|
|
3811
|
-
/* @__PURE__ */
|
|
3812
|
-
/* @__PURE__ */
|
|
3813
|
-
repo.description && /* @__PURE__ */
|
|
3814
|
-
/* @__PURE__ */
|
|
3815
|
-
/* @__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: [
|
|
3816
4244
|
repo.visibility === "PRIVATE" ? tc.private("Private") : repo.visibility === "INTERNAL" ? tc.internal("Internal") : tc.success("Public"),
|
|
3817
4245
|
repo.isArchived ? tc.archived(" Archived") : "",
|
|
3818
4246
|
repo.isFork ? tc.fork(" Fork") : ""
|
|
3819
4247
|
] }),
|
|
3820
|
-
/* @__PURE__ */
|
|
3821
|
-
/* @__PURE__ */
|
|
4248
|
+
/* @__PURE__ */ jsx23(Text23, { children: tc.muted(`\u2605 ${repo.stargazerCount} \u2442 ${repo.forkCount}`) }),
|
|
4249
|
+
/* @__PURE__ */ jsxs22(Text23, { children: [
|
|
3822
4250
|
chalk15.hex(langColor)(`\u25CF `),
|
|
3823
4251
|
tc.muted(`${langName}`)
|
|
3824
4252
|
] }),
|
|
3825
|
-
/* @__PURE__ */
|
|
4253
|
+
/* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3826
4254
|
"Updated: ",
|
|
3827
4255
|
formatDate(repo.updatedAt),
|
|
3828
4256
|
" \u2022 Pushed: ",
|
|
3829
4257
|
formatDate(repo.pushedAt)
|
|
3830
4258
|
] }),
|
|
3831
|
-
/* @__PURE__ */
|
|
4259
|
+
/* @__PURE__ */ jsxs22(Text23, { color: theme.muted, children: [
|
|
3832
4260
|
"Size: ",
|
|
3833
4261
|
repo.diskUsage,
|
|
3834
4262
|
" KB"
|
|
3835
4263
|
] }),
|
|
3836
|
-
/* @__PURE__ */
|
|
3837
|
-
/* @__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" })
|
|
3838
4266
|
] });
|
|
3839
|
-
})() }) : archiveFilterMode ? /* @__PURE__ */
|
|
4267
|
+
})() }) : archiveFilterMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3840
4268
|
ArchiveFilterModal,
|
|
3841
4269
|
{
|
|
3842
4270
|
currentFilter: archiveFilter,
|
|
@@ -3849,7 +4277,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3849
4277
|
onCancel: () => setArchiveFilterMode(false),
|
|
3850
4278
|
theme
|
|
3851
4279
|
}
|
|
3852
|
-
) }) : visibilityMode ? /* @__PURE__ */
|
|
4280
|
+
) }) : visibilityMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3853
4281
|
VisibilityModal,
|
|
3854
4282
|
{
|
|
3855
4283
|
currentFilter: visibilityFilter,
|
|
@@ -3863,7 +4291,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3863
4291
|
onCancel: () => setVisibilityMode(false),
|
|
3864
4292
|
theme
|
|
3865
4293
|
}
|
|
3866
|
-
) }) : sortMode ? /* @__PURE__ */
|
|
4294
|
+
) }) : sortMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3867
4295
|
SortModal,
|
|
3868
4296
|
{
|
|
3869
4297
|
currentSort: sortKey,
|
|
@@ -3876,7 +4304,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3876
4304
|
onCancel: () => setSortMode(false),
|
|
3877
4305
|
theme
|
|
3878
4306
|
}
|
|
3879
|
-
) }) : sortDirectionMode ? /* @__PURE__ */
|
|
4307
|
+
) }) : sortDirectionMode ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3880
4308
|
SortDirectionModal,
|
|
3881
4309
|
{
|
|
3882
4310
|
currentDirection: sortDir,
|
|
@@ -3890,7 +4318,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3890
4318
|
onCancel: () => setSortDirectionMode(false),
|
|
3891
4319
|
theme
|
|
3892
4320
|
}
|
|
3893
|
-
) }) : changeVisibilityMode && changeVisibilityTarget ? /* @__PURE__ */
|
|
4321
|
+
) }) : changeVisibilityMode && changeVisibilityTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3894
4322
|
ChangeVisibilityModal,
|
|
3895
4323
|
{
|
|
3896
4324
|
isOpen: changeVisibilityMode,
|
|
@@ -3904,7 +4332,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3904
4332
|
error: changeVisibilityError,
|
|
3905
4333
|
theme
|
|
3906
4334
|
}
|
|
3907
|
-
) }) : renameMode && renameTarget ? /* @__PURE__ */
|
|
4335
|
+
) }) : renameMode && renameTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3908
4336
|
RenameModal,
|
|
3909
4337
|
{
|
|
3910
4338
|
repo: renameTarget,
|
|
@@ -3912,7 +4340,25 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3912
4340
|
onCancel: closeRenameModal,
|
|
3913
4341
|
theme
|
|
3914
4342
|
}
|
|
3915
|
-
) }) :
|
|
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(
|
|
3916
4362
|
CopyUrlModal,
|
|
3917
4363
|
{
|
|
3918
4364
|
repo: copyUrlTarget,
|
|
@@ -3921,7 +4367,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3921
4367
|
onCopy: handleCopyUrl,
|
|
3922
4368
|
theme
|
|
3923
4369
|
}
|
|
3924
|
-
) }) : unstarMode && unstarTarget ? /* @__PURE__ */
|
|
4370
|
+
) }) : unstarMode && unstarTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3925
4371
|
UnstarModal,
|
|
3926
4372
|
{
|
|
3927
4373
|
visible: unstarMode,
|
|
@@ -3932,7 +4378,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3932
4378
|
error: unstarError,
|
|
3933
4379
|
theme
|
|
3934
4380
|
}
|
|
3935
|
-
) }) : starMode && starTarget ? /* @__PURE__ */
|
|
4381
|
+
) }) : starMode && starTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3936
4382
|
StarModal,
|
|
3937
4383
|
{
|
|
3938
4384
|
visible: starMode,
|
|
@@ -3944,7 +4390,7 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3944
4390
|
error: starError,
|
|
3945
4391
|
theme
|
|
3946
4392
|
}
|
|
3947
|
-
) }) : openInBrowserMode && openInBrowserTarget ? /* @__PURE__ */
|
|
4393
|
+
) }) : openInBrowserMode && openInBrowserTarget ? /* @__PURE__ */ jsx23(Box22, { height: contentHeight, alignItems: "center", justifyContent: "center", children: /* @__PURE__ */ jsx23(
|
|
3948
4394
|
OpenInBrowserModal,
|
|
3949
4395
|
{
|
|
3950
4396
|
repo: openInBrowserTarget,
|
|
@@ -3959,8 +4405,8 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3959
4405
|
},
|
|
3960
4406
|
theme
|
|
3961
4407
|
}
|
|
3962
|
-
) }) : /* @__PURE__ */
|
|
3963
|
-
/* @__PURE__ */
|
|
4408
|
+
) }) : /* @__PURE__ */ jsxs22(Fragment11, { children: [
|
|
4409
|
+
/* @__PURE__ */ jsx23(
|
|
3964
4410
|
RepoListHeader,
|
|
3965
4411
|
{
|
|
3966
4412
|
ownerContext,
|
|
@@ -3976,10 +4422,10 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3976
4422
|
theme
|
|
3977
4423
|
}
|
|
3978
4424
|
),
|
|
3979
|
-
filterMode && /* @__PURE__ */
|
|
3980
|
-
/* @__PURE__ */
|
|
3981
|
-
/* @__PURE__ */
|
|
3982
|
-
|
|
4425
|
+
filterMode && /* @__PURE__ */ jsxs22(Box22, { marginBottom: 1, children: [
|
|
4426
|
+
/* @__PURE__ */ jsx23(Text23, { children: "Search: " }),
|
|
4427
|
+
/* @__PURE__ */ jsx23(
|
|
4428
|
+
TextInput7,
|
|
3983
4429
|
{
|
|
3984
4430
|
value: filter,
|
|
3985
4431
|
onChange: (val) => {
|
|
@@ -3992,10 +4438,10 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
3992
4438
|
}
|
|
3993
4439
|
)
|
|
3994
4440
|
] }),
|
|
3995
|
-
/* @__PURE__ */
|
|
4441
|
+
/* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", height: listHeight, children: [
|
|
3996
4442
|
visibleItems.slice(windowed.start, windowed.end).map((repo, i) => {
|
|
3997
4443
|
const idx = windowed.start + i;
|
|
3998
|
-
return /* @__PURE__ */
|
|
4444
|
+
return /* @__PURE__ */ jsx23(
|
|
3999
4445
|
RepoRow,
|
|
4000
4446
|
{
|
|
4001
4447
|
repo,
|
|
@@ -4010,55 +4456,59 @@ function RepoList({ token, maxVisibleRows, onLogout, viewerLogin, onOrgContextCh
|
|
|
4010
4456
|
repo.nameWithOwner
|
|
4011
4457
|
);
|
|
4012
4458
|
}),
|
|
4013
|
-
loadingMore && hasNextPage && !starsMode && /* @__PURE__ */
|
|
4014
|
-
/* @__PURE__ */
|
|
4015
|
-
/* @__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: [
|
|
4016
4462
|
"Loading repositories\u2026 ",
|
|
4017
4463
|
totalCount > 0 ? `(${items.length}/${totalCount})` : `(${items.length})`
|
|
4018
4464
|
] })
|
|
4019
4465
|
] }) }),
|
|
4020
|
-
loadingMore && hasNextPage && starsMode && /* @__PURE__ */
|
|
4021
|
-
/* @__PURE__ */
|
|
4022
|
-
/* @__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..." })
|
|
4023
4469
|
] }) }),
|
|
4024
|
-
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: [
|
|
4025
4471
|
"Still loading repos (",
|
|
4026
4472
|
items.length,
|
|
4027
4473
|
"/",
|
|
4028
4474
|
totalCount > 0 ? totalCount : "?",
|
|
4029
4475
|
") \u2014 fuzzy results may be incomplete"
|
|
4030
4476
|
] }) }),
|
|
4031
|
-
!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" }) })
|
|
4032
4478
|
] })
|
|
4033
4479
|
] }) }),
|
|
4034
|
-
/* @__PURE__ */
|
|
4035
|
-
/* @__PURE__ */
|
|
4036
|
-
/* @__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: [
|
|
4037
4483
|
"/ Search",
|
|
4038
4484
|
!filterActive && " \u2022 S Sort \u2022 D Direction",
|
|
4039
4485
|
" \u2022 T Density \u2022 Shift+T Theme \u2022 A Archive Filter",
|
|
4040
4486
|
!starsMode && " \u2022 V Visibility Filter"
|
|
4041
4487
|
] }) }),
|
|
4042
|
-
/* @__PURE__ */
|
|
4043
|
-
/* @__PURE__ */
|
|
4044
|
-
|
|
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" }) })
|
|
4045
4495
|
] }),
|
|
4046
|
-
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */
|
|
4047
|
-
/* @__PURE__ */
|
|
4048
|
-
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))
|
|
4049
4499
|
] }),
|
|
4050
|
-
themeToast && /* @__PURE__ */
|
|
4051
|
-
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 }) }) })
|
|
4052
4502
|
] });
|
|
4053
4503
|
}
|
|
4054
4504
|
|
|
4055
4505
|
// src/ui/components/auth/AuthMethodSelector.tsx
|
|
4056
|
-
import { useState as
|
|
4057
|
-
import { Box as
|
|
4506
|
+
import { useState as useState20 } from "react";
|
|
4507
|
+
import { Box as Box23, Text as Text24, useInput as useInput20 } from "ink";
|
|
4058
4508
|
import chalk16 from "chalk";
|
|
4059
|
-
import { jsx as
|
|
4509
|
+
import { jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
4060
4510
|
function AuthMethodSelector({ onSelect, onQuit }) {
|
|
4061
|
-
const [selectedIndex, setSelectedIndex] =
|
|
4511
|
+
const [selectedIndex, setSelectedIndex] = useState20(0);
|
|
4062
4512
|
const methods = [
|
|
4063
4513
|
{
|
|
4064
4514
|
key: "oauth",
|
|
@@ -4071,7 +4521,7 @@ function AuthMethodSelector({ onSelect, onQuit }) {
|
|
|
4071
4521
|
description: "Manually enter a GitHub Personal Access Token"
|
|
4072
4522
|
}
|
|
4073
4523
|
];
|
|
4074
|
-
|
|
4524
|
+
useInput20((input, key) => {
|
|
4075
4525
|
if (key.escape || input?.toLowerCase() === "q") {
|
|
4076
4526
|
if (onQuit) {
|
|
4077
4527
|
onQuit();
|
|
@@ -4090,33 +4540,33 @@ function AuthMethodSelector({ onSelect, onQuit }) {
|
|
|
4090
4540
|
onSelect("pat");
|
|
4091
4541
|
}
|
|
4092
4542
|
});
|
|
4093
|
-
return /* @__PURE__ */
|
|
4094
|
-
/* @__PURE__ */
|
|
4095
|
-
/* @__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) => {
|
|
4096
4546
|
const isSelected = index === selectedIndex;
|
|
4097
4547
|
const prefix = isSelected ? chalk16.cyan("\u203A") : " ";
|
|
4098
4548
|
const numberPrefix = `${index + 1}.`;
|
|
4099
|
-
return /* @__PURE__ */
|
|
4100
|
-
/* @__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: [
|
|
4101
4551
|
prefix,
|
|
4102
4552
|
" ",
|
|
4103
4553
|
numberPrefix,
|
|
4104
4554
|
" ",
|
|
4105
4555
|
method.label
|
|
4106
4556
|
] }) }),
|
|
4107
|
-
/* @__PURE__ */
|
|
4557
|
+
/* @__PURE__ */ jsxs23(Text24, { color: "gray", dimColor: true, children: [
|
|
4108
4558
|
" ",
|
|
4109
4559
|
method.description
|
|
4110
4560
|
] })
|
|
4111
4561
|
] }, method.key);
|
|
4112
4562
|
}) }),
|
|
4113
|
-
/* @__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" })
|
|
4114
4564
|
] });
|
|
4115
4565
|
}
|
|
4116
4566
|
|
|
4117
4567
|
// src/ui/components/auth/OAuthProgress.tsx
|
|
4118
|
-
import { Box as
|
|
4119
|
-
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";
|
|
4120
4570
|
function OAuthProgress({ status, error, deviceCode }) {
|
|
4121
4571
|
const statusMessages = {
|
|
4122
4572
|
initializing: {
|
|
@@ -4153,69 +4603,69 @@ function OAuthProgress({ status, error, deviceCode }) {
|
|
|
4153
4603
|
}
|
|
4154
4604
|
};
|
|
4155
4605
|
const { message, showSpinner } = statusMessages[status];
|
|
4156
|
-
return /* @__PURE__ */
|
|
4157
|
-
/* @__PURE__ */
|
|
4158
|
-
/* @__PURE__ */
|
|
4159
|
-
/* @__PURE__ */
|
|
4160
|
-
/* @__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: [
|
|
4161
4611
|
" ",
|
|
4162
4612
|
message
|
|
4163
4613
|
] })
|
|
4164
|
-
] }) : /* @__PURE__ */
|
|
4614
|
+
] }) : /* @__PURE__ */ jsxs24(Text25, { color: status === "error" ? "red" : "green", children: [
|
|
4165
4615
|
status === "error" ? "\u2717" : "\u2713",
|
|
4166
4616
|
" ",
|
|
4167
4617
|
message
|
|
4168
4618
|
] }) }),
|
|
4169
|
-
(status === "waiting_for_authorization" || status === "polling_for_token") && deviceCode && /* @__PURE__ */
|
|
4170
|
-
/* @__PURE__ */
|
|
4171
|
-
/* @__PURE__ */
|
|
4172
|
-
/* @__PURE__ */
|
|
4173
|
-
/* @__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 })
|
|
4174
4624
|
] }),
|
|
4175
|
-
/* @__PURE__ */
|
|
4176
|
-
/* @__PURE__ */
|
|
4177
|
-
/* @__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 }) })
|
|
4178
4628
|
] }),
|
|
4179
|
-
status === "waiting_for_authorization" && /* @__PURE__ */
|
|
4180
|
-
status === "polling_for_token" && /* @__PURE__ */
|
|
4181
|
-
/* @__PURE__ */
|
|
4182
|
-
/* @__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." })
|
|
4183
4633
|
] })
|
|
4184
4634
|
] }),
|
|
4185
|
-
status === "error" && error && /* @__PURE__ */
|
|
4186
|
-
/* @__PURE__ */
|
|
4187
|
-
/* @__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." })
|
|
4188
4638
|
] }),
|
|
4189
|
-
status === "success" && /* @__PURE__ */
|
|
4639
|
+
status === "success" && /* @__PURE__ */ jsx25(Text25, { color: "gray", marginTop: 1, children: "Returning to application..." })
|
|
4190
4640
|
] });
|
|
4191
4641
|
}
|
|
4192
4642
|
|
|
4193
4643
|
// src/ui/App.tsx
|
|
4194
|
-
import { jsx as
|
|
4644
|
+
import { jsx as jsx26, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
4195
4645
|
var packageJson = require_package();
|
|
4196
4646
|
function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlineTokenEphemeral }) {
|
|
4197
4647
|
const { exit } = useApp2();
|
|
4198
4648
|
const { stdout } = useStdout2();
|
|
4199
|
-
const [mode, setMode] =
|
|
4200
|
-
const [token, setToken] =
|
|
4201
|
-
const [input, setInput] =
|
|
4202
|
-
const [error, setError] =
|
|
4203
|
-
const [viewer, setViewer] =
|
|
4204
|
-
const [rateLimitReset, setRateLimitReset] =
|
|
4205
|
-
const [wasRateLimited, setWasRateLimited] =
|
|
4206
|
-
const [orgContext, setOrgContext] =
|
|
4207
|
-
const [authMethod, setAuthMethod] =
|
|
4208
|
-
const [oauthStatus, setOAuthStatus] =
|
|
4209
|
-
const [tokenSource, setTokenSource] =
|
|
4210
|
-
const [sessionTokenOrigin, setSessionTokenOrigin] =
|
|
4211
|
-
const [deviceCodeResponse, setDeviceCodeResponse] =
|
|
4212
|
-
const [oauthDeviceCode, setOauthDeviceCode] =
|
|
4213
|
-
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(() => {
|
|
4214
4664
|
const cols = stdout?.columns ?? 100;
|
|
4215
4665
|
const rows = stdout?.rows ?? 30;
|
|
4216
4666
|
return { cols, rows };
|
|
4217
4667
|
});
|
|
4218
|
-
|
|
4668
|
+
useEffect14(() => {
|
|
4219
4669
|
if (!stdout) return;
|
|
4220
4670
|
const onResize = () => {
|
|
4221
4671
|
const cols = stdout.columns ?? 100;
|
|
@@ -4227,7 +4677,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4227
4677
|
stdout.off?.("resize", onResize);
|
|
4228
4678
|
};
|
|
4229
4679
|
}, [stdout]);
|
|
4230
|
-
|
|
4680
|
+
useEffect14(() => {
|
|
4231
4681
|
const env = getTokenFromEnv();
|
|
4232
4682
|
const stored = getStoredToken();
|
|
4233
4683
|
const source = getTokenSource();
|
|
@@ -4251,7 +4701,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4251
4701
|
setMode("auth_method_selection");
|
|
4252
4702
|
}
|
|
4253
4703
|
}, [inlineToken2]);
|
|
4254
|
-
|
|
4704
|
+
useEffect14(() => {
|
|
4255
4705
|
if (mode !== "oauth_flow") return;
|
|
4256
4706
|
(async () => {
|
|
4257
4707
|
try {
|
|
@@ -4303,7 +4753,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4303
4753
|
setMode("oauth_flow");
|
|
4304
4754
|
}
|
|
4305
4755
|
};
|
|
4306
|
-
|
|
4756
|
+
useEffect14(() => {
|
|
4307
4757
|
(async () => {
|
|
4308
4758
|
if (mode !== "validating" || !token) return;
|
|
4309
4759
|
const timeoutId = setTimeout(() => {
|
|
@@ -4415,7 +4865,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4415
4865
|
setTokenSource("pat");
|
|
4416
4866
|
setMode("auth_method_selection");
|
|
4417
4867
|
};
|
|
4418
|
-
|
|
4868
|
+
useInput21((input2, key) => {
|
|
4419
4869
|
if ((mode === "prompt" || mode === "auth_method_selection") && key.escape) {
|
|
4420
4870
|
exit();
|
|
4421
4871
|
}
|
|
@@ -4447,19 +4897,19 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4447
4897
|
}
|
|
4448
4898
|
});
|
|
4449
4899
|
const verticalPadding = Math.floor(dims.rows * 0.05);
|
|
4450
|
-
const header = useMemo3(() => /* @__PURE__ */
|
|
4451
|
-
/* @__PURE__ */
|
|
4452
|
-
/* @__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: [
|
|
4453
4903
|
" ",
|
|
4454
4904
|
"GitHub Repository Manager"
|
|
4455
4905
|
] }),
|
|
4456
|
-
/* @__PURE__ */
|
|
4906
|
+
/* @__PURE__ */ jsxs25(Text26, { color: "gray", dimColor: true, children: [
|
|
4457
4907
|
"v",
|
|
4458
4908
|
packageJson.version
|
|
4459
4909
|
] }),
|
|
4460
|
-
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */
|
|
4910
|
+
process.env.GH_MANAGER_DEBUG === "1" && /* @__PURE__ */ jsx26(Text26, { backgroundColor: "blue", color: "white", children: " debug mode " })
|
|
4461
4911
|
] }),
|
|
4462
|
-
viewer && /* @__PURE__ */
|
|
4912
|
+
viewer && /* @__PURE__ */ jsx26(Text26, { color: "gray", children: orgContext !== "personal" && orgContext.login ? `${orgContext.login}/@${viewer} ` : `@${viewer} ` })
|
|
4463
4913
|
] }), [viewer, orgContext]);
|
|
4464
4914
|
if (mode === "rate_limited") {
|
|
4465
4915
|
const formatResetTime = (resetTime) => {
|
|
@@ -4482,71 +4932,71 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4482
4932
|
return "Unknown";
|
|
4483
4933
|
}
|
|
4484
4934
|
};
|
|
4485
|
-
return /* @__PURE__ */
|
|
4935
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4486
4936
|
header,
|
|
4487
|
-
/* @__PURE__ */
|
|
4488
|
-
/* @__PURE__ */
|
|
4489
|
-
/* @__PURE__ */
|
|
4490
|
-
/* @__PURE__ */
|
|
4491
|
-
rateLimitReset && /* @__PURE__ */
|
|
4492
|
-
/* @__PURE__ */
|
|
4493
|
-
/* @__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:" }),
|
|
4494
4944
|
" ",
|
|
4495
|
-
/* @__PURE__ */
|
|
4945
|
+
/* @__PURE__ */ jsx26(Text26, { bold: true, children: formatResetTime(rateLimitReset) })
|
|
4496
4946
|
] }),
|
|
4497
|
-
/* @__PURE__ */
|
|
4947
|
+
/* @__PURE__ */ jsxs25(Text26, { color: "gray", dimColor: true, children: [
|
|
4498
4948
|
"(",
|
|
4499
4949
|
new Date(rateLimitReset).toLocaleTimeString(),
|
|
4500
4950
|
")"
|
|
4501
4951
|
] })
|
|
4502
4952
|
] }),
|
|
4503
|
-
/* @__PURE__ */
|
|
4504
|
-
/* @__PURE__ */
|
|
4505
|
-
/* @__PURE__ */
|
|
4506
|
-
/* @__PURE__ */
|
|
4507
|
-
/* @__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" }),
|
|
4508
4958
|
" - Retry now ",
|
|
4509
4959
|
rateLimitReset && formatResetTime(rateLimitReset) !== "Now (should be reset)" ? "(likely to fail until reset)" : "(should work now)"
|
|
4510
4960
|
] }),
|
|
4511
|
-
/* @__PURE__ */
|
|
4512
|
-
/* @__PURE__ */
|
|
4961
|
+
/* @__PURE__ */ jsxs25(Text26, { children: [
|
|
4962
|
+
/* @__PURE__ */ jsx26(Text26, { color: "cyan", bold: true, children: "L" }),
|
|
4513
4963
|
" - Logout and choose authentication method"
|
|
4514
4964
|
] }),
|
|
4515
|
-
/* @__PURE__ */
|
|
4516
|
-
/* @__PURE__ */
|
|
4965
|
+
/* @__PURE__ */ jsxs25(Text26, { children: [
|
|
4966
|
+
/* @__PURE__ */ jsx26(Text26, { color: "gray", bold: true, children: "Q/Esc" }),
|
|
4517
4967
|
" - Quit application"
|
|
4518
4968
|
] })
|
|
4519
4969
|
] })
|
|
4520
4970
|
] }),
|
|
4521
|
-
/* @__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." })
|
|
4522
4972
|
] }) })
|
|
4523
4973
|
] });
|
|
4524
4974
|
}
|
|
4525
4975
|
if (mode === "auth_method_selection") {
|
|
4526
|
-
return /* @__PURE__ */
|
|
4976
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4527
4977
|
header,
|
|
4528
|
-
/* @__PURE__ */
|
|
4529
|
-
/* @__PURE__ */
|
|
4530
|
-
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 })
|
|
4531
4981
|
] }) })
|
|
4532
4982
|
] });
|
|
4533
4983
|
}
|
|
4534
4984
|
if (mode === "oauth_flow") {
|
|
4535
|
-
return /* @__PURE__ */
|
|
4985
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4536
4986
|
header,
|
|
4537
|
-
/* @__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 }) })
|
|
4538
4988
|
] });
|
|
4539
4989
|
}
|
|
4540
4990
|
if (mode === "prompt") {
|
|
4541
|
-
return /* @__PURE__ */
|
|
4991
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4542
4992
|
header,
|
|
4543
|
-
/* @__PURE__ */
|
|
4544
|
-
/* @__PURE__ */
|
|
4545
|
-
/* @__PURE__ */
|
|
4546
|
-
/* @__PURE__ */
|
|
4547
|
-
/* @__PURE__ */
|
|
4548
|
-
/* @__PURE__ */
|
|
4549
|
-
|
|
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,
|
|
4550
5000
|
{
|
|
4551
5001
|
value: input,
|
|
4552
5002
|
onChange: setInput,
|
|
@@ -4555,30 +5005,30 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4555
5005
|
}
|
|
4556
5006
|
)
|
|
4557
5007
|
] }),
|
|
4558
|
-
error && /* @__PURE__ */
|
|
4559
|
-
/* @__PURE__ */
|
|
4560
|
-
/* @__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" })
|
|
4561
5011
|
] }) })
|
|
4562
5012
|
] });
|
|
4563
5013
|
}
|
|
4564
5014
|
if (mode === "validating" || mode === "checking") {
|
|
4565
|
-
return /* @__PURE__ */
|
|
5015
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4566
5016
|
header,
|
|
4567
|
-
/* @__PURE__ */
|
|
4568
|
-
/* @__PURE__ */
|
|
4569
|
-
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" })
|
|
4570
5020
|
] }) })
|
|
4571
5021
|
] });
|
|
4572
5022
|
}
|
|
4573
5023
|
if (mode === "error") {
|
|
4574
|
-
return /* @__PURE__ */
|
|
5024
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4575
5025
|
header,
|
|
4576
|
-
/* @__PURE__ */
|
|
5026
|
+
/* @__PURE__ */ jsx26(Box25, { flexGrow: 1, justifyContent: "center", alignItems: "center", children: /* @__PURE__ */ jsx26(Text26, { color: "red", children: error ?? "Unexpected error" }) })
|
|
4577
5027
|
] });
|
|
4578
5028
|
}
|
|
4579
|
-
return /* @__PURE__ */
|
|
5029
|
+
return /* @__PURE__ */ jsxs25(Box25, { flexDirection: "column", height: dims.rows, paddingX: 2, paddingTop: verticalPadding, paddingBottom: verticalPadding, children: [
|
|
4580
5030
|
header,
|
|
4581
|
-
/* @__PURE__ */
|
|
5031
|
+
/* @__PURE__ */ jsx26(
|
|
4582
5032
|
RepoList,
|
|
4583
5033
|
{
|
|
4584
5034
|
token,
|
|
@@ -4593,7 +5043,7 @@ function App({ initialOrgSlug: initialOrgSlug2, inlineToken: inlineToken2, inlin
|
|
|
4593
5043
|
}
|
|
4594
5044
|
|
|
4595
5045
|
// src/index.tsx
|
|
4596
|
-
import { jsx as
|
|
5046
|
+
import { jsx as jsx27, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
4597
5047
|
var argv = process.argv.slice(2);
|
|
4598
5048
|
var getFlagValue = (name) => {
|
|
4599
5049
|
const idx = argv.findIndex((a) => a === `--${name}` || a.startsWith(`--${name}=`));
|
|
@@ -4706,8 +5156,8 @@ var inlineToken = (() => {
|
|
|
4706
5156
|
})();
|
|
4707
5157
|
logger.debug("Rendering UI");
|
|
4708
5158
|
var { unmount } = render(
|
|
4709
|
-
/* @__PURE__ */
|
|
4710
|
-
/* @__PURE__ */
|
|
4711
|
-
/* @__PURE__ */
|
|
5159
|
+
/* @__PURE__ */ jsxs26(Box26, { flexDirection: "column", children: [
|
|
5160
|
+
/* @__PURE__ */ jsx27(App, { initialOrgSlug, inlineToken, inlineTokenEphemeral: Boolean(inlineToken) }),
|
|
5161
|
+
/* @__PURE__ */ jsx27(Text27, { color: "gray" })
|
|
4712
5162
|
] })
|
|
4713
5163
|
);
|