clairo 2.1.2 → 2.2.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/dist/cli.js +1126 -472
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
import meow from "meow";
|
|
5
5
|
|
|
6
6
|
// src/app.tsx
|
|
7
|
-
import { useCallback as useCallback11, useMemo as useMemo4, useState as
|
|
8
|
-
import { Box as Box22, Text as
|
|
7
|
+
import { useCallback as useCallback11, useMemo as useMemo4, useState as useState22 } from "react";
|
|
8
|
+
import { Box as Box22, Text as Text21, useApp, useInput as useInput18 } from "ink";
|
|
9
9
|
|
|
10
10
|
// src/components/github/GitHubView.tsx
|
|
11
|
-
import { useCallback as useCallback8, useEffect as
|
|
11
|
+
import { useCallback as useCallback8, useEffect as useEffect9, useRef as useRef5, useState as useState12 } from "react";
|
|
12
12
|
import { TitledBox as TitledBox3 } from "@mishieck/ink-titled-box";
|
|
13
|
-
import { Box as Box6, Text as
|
|
13
|
+
import { Box as Box6, Text as Text7, useInput as useInput4 } from "ink";
|
|
14
14
|
import { ScrollView as ScrollView4 } from "ink-scroll-view";
|
|
15
15
|
|
|
16
16
|
// src/hooks/github/useGitRepo.ts
|
|
@@ -1535,14 +1535,25 @@ ${detail}
|
|
|
1535
1535
|
// src/components/github/PRDetailsBox.tsx
|
|
1536
1536
|
import open from "open";
|
|
1537
1537
|
import { useRef as useRef2 } from "react";
|
|
1538
|
-
import { Box as Box3, Text as
|
|
1538
|
+
import { Box as Box3, Text as Text3, useInput, useStdout } from "ink";
|
|
1539
1539
|
import { ScrollView } from "ink-scroll-view";
|
|
1540
1540
|
|
|
1541
|
+
// src/components/ui/Badge.tsx
|
|
1542
|
+
import { Text } from "ink";
|
|
1543
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
1544
|
+
function Badge({ color, background, children }) {
|
|
1545
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
1546
|
+
/* @__PURE__ */ jsx(Text, { color: background, children: "\uE0B6" }),
|
|
1547
|
+
/* @__PURE__ */ jsx(Text, { color, backgroundColor: background, bold: true, children }),
|
|
1548
|
+
/* @__PURE__ */ jsx(Text, { color: background, children: "\uE0B4" })
|
|
1549
|
+
] });
|
|
1550
|
+
}
|
|
1551
|
+
|
|
1541
1552
|
// src/components/ui/Divider.tsx
|
|
1542
1553
|
import { Box } from "ink";
|
|
1543
|
-
import { jsx } from "react/jsx-runtime";
|
|
1554
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
1544
1555
|
function Divider({ color }) {
|
|
1545
|
-
return /* @__PURE__ */
|
|
1556
|
+
return /* @__PURE__ */ jsx2(
|
|
1546
1557
|
Box,
|
|
1547
1558
|
{
|
|
1548
1559
|
flexGrow: 1,
|
|
@@ -1560,18 +1571,18 @@ function Divider({ color }) {
|
|
|
1560
1571
|
// src/components/ui/Markdown.tsx
|
|
1561
1572
|
import Table from "cli-table3";
|
|
1562
1573
|
import { marked } from "marked";
|
|
1563
|
-
import { Box as Box2, Text } from "ink";
|
|
1574
|
+
import { Box as Box2, Text as Text2 } from "ink";
|
|
1564
1575
|
import Link from "ink-link";
|
|
1565
|
-
import { jsx as
|
|
1576
|
+
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
1566
1577
|
function Markdown({ children }) {
|
|
1567
1578
|
const tokens = marked.lexer(children);
|
|
1568
|
-
return /* @__PURE__ */
|
|
1579
|
+
return /* @__PURE__ */ jsx3(Box2, { flexDirection: "column", children: tokens.map((token, idx) => /* @__PURE__ */ jsx3(TokenRenderer, { token }, idx)) });
|
|
1569
1580
|
}
|
|
1570
1581
|
function TokenRenderer({ token }) {
|
|
1571
1582
|
var _a, _b;
|
|
1572
1583
|
switch (token.type) {
|
|
1573
1584
|
case "heading":
|
|
1574
|
-
return /* @__PURE__ */
|
|
1585
|
+
return /* @__PURE__ */ jsx3(Box2, { marginTop: token.depth === 1 ? 0 : 1, children: /* @__PURE__ */ jsx3(Text2, { bold: true, underline: token.depth === 1, children: renderInline(token.tokens) }) });
|
|
1575
1586
|
case "paragraph": {
|
|
1576
1587
|
const hasLinks = (_a = token.tokens) == null ? void 0 : _a.some(
|
|
1577
1588
|
(t) => {
|
|
@@ -1580,31 +1591,31 @@ function TokenRenderer({ token }) {
|
|
|
1580
1591
|
}
|
|
1581
1592
|
);
|
|
1582
1593
|
if (hasLinks) {
|
|
1583
|
-
return /* @__PURE__ */
|
|
1594
|
+
return /* @__PURE__ */ jsx3(Box2, { flexDirection: "row", flexWrap: "wrap", children: renderInline(token.tokens) });
|
|
1584
1595
|
}
|
|
1585
|
-
return /* @__PURE__ */
|
|
1596
|
+
return /* @__PURE__ */ jsx3(Text2, { children: renderInline(token.tokens) });
|
|
1586
1597
|
}
|
|
1587
1598
|
case "code":
|
|
1588
|
-
return /* @__PURE__ */
|
|
1599
|
+
return /* @__PURE__ */ jsx3(Box2, { marginY: 1, paddingX: 1, borderStyle: "single", borderColor: "gray", children: /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: token.text }) });
|
|
1589
1600
|
case "blockquote":
|
|
1590
|
-
return /* @__PURE__ */
|
|
1591
|
-
/* @__PURE__ */
|
|
1592
|
-
/* @__PURE__ */
|
|
1601
|
+
return /* @__PURE__ */ jsxs2(Box2, { marginLeft: 2, children: [
|
|
1602
|
+
/* @__PURE__ */ jsx3(Text2, { color: "gray", children: "\u2502 " }),
|
|
1603
|
+
/* @__PURE__ */ jsx3(Box2, { flexDirection: "column", children: (_b = token.tokens) == null ? void 0 : _b.map((t, idx) => /* @__PURE__ */ jsx3(TokenRenderer, { token: t }, idx)) })
|
|
1593
1604
|
] });
|
|
1594
1605
|
case "list":
|
|
1595
|
-
return /* @__PURE__ */
|
|
1596
|
-
/* @__PURE__ */
|
|
1597
|
-
/* @__PURE__ */
|
|
1606
|
+
return /* @__PURE__ */ jsx3(Box2, { flexDirection: "column", marginY: 1, children: token.items.map((item, idx) => /* @__PURE__ */ jsxs2(Box2, { children: [
|
|
1607
|
+
/* @__PURE__ */ jsx3(Text2, { children: token.ordered ? `${idx + 1}. ` : "\u2022 " }),
|
|
1608
|
+
/* @__PURE__ */ jsx3(Box2, { flexDirection: "column", children: item.tokens.map((t, i) => /* @__PURE__ */ jsx3(TokenRenderer, { token: t }, i)) })
|
|
1598
1609
|
] }, idx)) });
|
|
1599
1610
|
case "table":
|
|
1600
|
-
return /* @__PURE__ */
|
|
1611
|
+
return /* @__PURE__ */ jsx3(TableRenderer, { token });
|
|
1601
1612
|
case "hr":
|
|
1602
|
-
return /* @__PURE__ */
|
|
1613
|
+
return /* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "\u2500".repeat(40) });
|
|
1603
1614
|
case "space":
|
|
1604
1615
|
return null;
|
|
1605
1616
|
default:
|
|
1606
1617
|
if ("text" in token && typeof token.text === "string") {
|
|
1607
|
-
return /* @__PURE__ */
|
|
1618
|
+
return /* @__PURE__ */ jsx3(Text2, { children: token.text });
|
|
1608
1619
|
}
|
|
1609
1620
|
return null;
|
|
1610
1621
|
}
|
|
@@ -1617,39 +1628,39 @@ function TableRenderer({ token }) {
|
|
|
1617
1628
|
for (const row of token.rows) {
|
|
1618
1629
|
table.push(row.map((cell) => renderInlineToString(cell.tokens)));
|
|
1619
1630
|
}
|
|
1620
|
-
return /* @__PURE__ */
|
|
1631
|
+
return /* @__PURE__ */ jsx3(Text2, { children: table.toString() });
|
|
1621
1632
|
}
|
|
1622
1633
|
function renderInline(tokens) {
|
|
1623
1634
|
if (!tokens) return null;
|
|
1624
1635
|
return tokens.map((token, idx) => {
|
|
1625
1636
|
switch (token.type) {
|
|
1626
1637
|
case "text":
|
|
1627
|
-
return /* @__PURE__ */
|
|
1638
|
+
return /* @__PURE__ */ jsx3(Text2, { children: token.text }, idx);
|
|
1628
1639
|
case "strong":
|
|
1629
|
-
return /* @__PURE__ */
|
|
1640
|
+
return /* @__PURE__ */ jsx3(Text2, { bold: true, children: renderInline(token.tokens) }, idx);
|
|
1630
1641
|
case "em":
|
|
1631
|
-
return /* @__PURE__ */
|
|
1642
|
+
return /* @__PURE__ */ jsx3(Text2, { italic: true, children: renderInline(token.tokens) }, idx);
|
|
1632
1643
|
case "codespan":
|
|
1633
|
-
return /* @__PURE__ */
|
|
1644
|
+
return /* @__PURE__ */ jsxs2(Text2, { color: "yellow", children: [
|
|
1634
1645
|
"`",
|
|
1635
1646
|
token.text,
|
|
1636
1647
|
"`"
|
|
1637
1648
|
] }, idx);
|
|
1638
1649
|
case "link":
|
|
1639
|
-
return /* @__PURE__ */
|
|
1650
|
+
return /* @__PURE__ */ jsx3(Link, { url: token.href, children: /* @__PURE__ */ jsx3(Text2, { color: "blue", children: renderInlineToString(token.tokens) }) }, idx);
|
|
1640
1651
|
case "image":
|
|
1641
|
-
return /* @__PURE__ */
|
|
1652
|
+
return /* @__PURE__ */ jsxs2(Text2, { color: "blue", children: [
|
|
1642
1653
|
"[Image: ",
|
|
1643
1654
|
token.text || token.href,
|
|
1644
1655
|
"]"
|
|
1645
1656
|
] }, idx);
|
|
1646
1657
|
case "br":
|
|
1647
|
-
return /* @__PURE__ */
|
|
1658
|
+
return /* @__PURE__ */ jsx3(Text2, { children: "\n" }, idx);
|
|
1648
1659
|
case "del":
|
|
1649
|
-
return /* @__PURE__ */
|
|
1660
|
+
return /* @__PURE__ */ jsx3(Text2, { strikethrough: true, children: renderInline(token.tokens) }, idx);
|
|
1650
1661
|
default:
|
|
1651
1662
|
if ("text" in token && typeof token.text === "string") {
|
|
1652
|
-
return /* @__PURE__ */
|
|
1663
|
+
return /* @__PURE__ */ jsx3(Text2, { children: token.text }, idx);
|
|
1653
1664
|
}
|
|
1654
1665
|
return null;
|
|
1655
1666
|
}
|
|
@@ -1669,7 +1680,7 @@ function renderInlineToString(tokens) {
|
|
|
1669
1680
|
}
|
|
1670
1681
|
|
|
1671
1682
|
// src/components/github/PRDetailsBox.tsx
|
|
1672
|
-
import { Fragment, jsx as
|
|
1683
|
+
import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
1673
1684
|
function PRDetailsBox({ pr, loading, error, isActive }) {
|
|
1674
1685
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
1675
1686
|
const scrollRef = useRef2(null);
|
|
@@ -1700,9 +1711,9 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
|
|
|
1700
1711
|
const titlePart = `\u256D ${displayTitle} `;
|
|
1701
1712
|
const dashCount = Math.max(0, columnWidth - titlePart.length - 1);
|
|
1702
1713
|
const topBorder = `${titlePart}${"\u2500".repeat(dashCount)}\u256E`;
|
|
1703
|
-
return /* @__PURE__ */
|
|
1704
|
-
/* @__PURE__ */
|
|
1705
|
-
/* @__PURE__ */
|
|
1714
|
+
return /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", flexGrow: 1, children: [
|
|
1715
|
+
/* @__PURE__ */ jsx4(Text3, { color: borderColor, children: topBorder }),
|
|
1716
|
+
/* @__PURE__ */ jsx4(
|
|
1706
1717
|
Box3,
|
|
1707
1718
|
{
|
|
1708
1719
|
flexDirection: "column",
|
|
@@ -1712,22 +1723,20 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
|
|
|
1712
1723
|
borderStyle: "round",
|
|
1713
1724
|
borderTop: false,
|
|
1714
1725
|
borderColor,
|
|
1715
|
-
children: /* @__PURE__ */
|
|
1716
|
-
loading && /* @__PURE__ */
|
|
1717
|
-
error && /* @__PURE__ */
|
|
1718
|
-
!loading && !error && !pr && /* @__PURE__ */
|
|
1719
|
-
!loading && !error && pr && /* @__PURE__ */
|
|
1720
|
-
/* @__PURE__ */
|
|
1721
|
-
/* @__PURE__ */
|
|
1726
|
+
children: /* @__PURE__ */ jsx4(ScrollView, { ref: scrollRef, children: /* @__PURE__ */ jsxs3(Box3, { flexDirection: "column", paddingX: 1, children: [
|
|
1727
|
+
loading && /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Loading details..." }),
|
|
1728
|
+
error && /* @__PURE__ */ jsx4(Text3, { color: "red", children: error }),
|
|
1729
|
+
!loading && !error && !pr && /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Select a PR to view details" }),
|
|
1730
|
+
!loading && !error && pr && /* @__PURE__ */ jsxs3(Fragment2, { children: [
|
|
1731
|
+
/* @__PURE__ */ jsxs3(Box3, { children: [
|
|
1732
|
+
/* @__PURE__ */ jsxs3(Text3, { bold: true, children: [
|
|
1722
1733
|
pr.title,
|
|
1723
1734
|
" "
|
|
1724
1735
|
] }),
|
|
1725
|
-
/* @__PURE__ */
|
|
1726
|
-
/* @__PURE__ */ jsx3(Text2, { color: "black", backgroundColor: mergeDisplay.color, bold: true, children: `${mergeDisplay.text}` }),
|
|
1727
|
-
/* @__PURE__ */ jsx3(Text2, { color: mergeDisplay.color, children: "\uE0B4" })
|
|
1736
|
+
/* @__PURE__ */ jsx4(Badge, { color: "black", background: mergeDisplay.color, children: mergeDisplay.text })
|
|
1728
1737
|
] }),
|
|
1729
|
-
/* @__PURE__ */
|
|
1730
|
-
/* @__PURE__ */
|
|
1738
|
+
/* @__PURE__ */ jsxs3(Box3, { children: [
|
|
1739
|
+
/* @__PURE__ */ jsxs3(Text3, { dimColor: true, children: [
|
|
1731
1740
|
pr.baseRefName,
|
|
1732
1741
|
" \u2190 ",
|
|
1733
1742
|
pr.headRefName,
|
|
@@ -1741,52 +1750,48 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
|
|
|
1741
1750
|
" |",
|
|
1742
1751
|
" "
|
|
1743
1752
|
] }),
|
|
1744
|
-
/* @__PURE__ */
|
|
1753
|
+
/* @__PURE__ */ jsxs3(Text3, { color: "green", children: [
|
|
1745
1754
|
"+",
|
|
1746
1755
|
pr.additions
|
|
1747
1756
|
] }),
|
|
1748
|
-
/* @__PURE__ */
|
|
1749
|
-
/* @__PURE__ */
|
|
1757
|
+
/* @__PURE__ */ jsx4(Text3, { dimColor: true, children: " " }),
|
|
1758
|
+
/* @__PURE__ */ jsxs3(Text3, { color: "red", children: [
|
|
1750
1759
|
"-",
|
|
1751
1760
|
pr.deletions
|
|
1752
1761
|
] })
|
|
1753
1762
|
] }),
|
|
1754
|
-
(((_c = pr.labels) == null ? void 0 : _c.length) ?? 0) > 0 && /* @__PURE__ */
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
/* @__PURE__ */
|
|
1758
|
-
|
|
1759
|
-
/* @__PURE__ */ jsx3(Box3, { marginTop: 1, children: /* @__PURE__ */ jsx3(Divider, {}) }),
|
|
1760
|
-
(((_d = pr.assignees) == null ? void 0 : _d.length) ?? 0) > 0 && /* @__PURE__ */ jsxs2(Box3, { marginTop: 1, children: [
|
|
1761
|
-
/* @__PURE__ */ jsx3(Text2, { dimColor: true, children: "Assignees: " }),
|
|
1762
|
-
/* @__PURE__ */ jsx3(Text2, { children: pr.assignees.map((a) => a.login).join(", ") })
|
|
1763
|
+
(((_c = pr.labels) == null ? void 0 : _c.length) ?? 0) > 0 && /* @__PURE__ */ jsx4(Box3, { gap: 1, children: pr.labels.map((l) => /* @__PURE__ */ jsx4(Box3, { children: /* @__PURE__ */ jsx4(Badge, { color: "black", background: "gray", children: l.name }) }, l.name)) }),
|
|
1764
|
+
/* @__PURE__ */ jsx4(Box3, { marginTop: 1, children: /* @__PURE__ */ jsx4(Divider, {}) }),
|
|
1765
|
+
(((_d = pr.assignees) == null ? void 0 : _d.length) ?? 0) > 0 && /* @__PURE__ */ jsxs3(Box3, { marginTop: 1, children: [
|
|
1766
|
+
/* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Assignees: " }),
|
|
1767
|
+
/* @__PURE__ */ jsx4(Text3, { children: pr.assignees.map((a) => a.login).join(", ") })
|
|
1763
1768
|
] }),
|
|
1764
|
-
((((_e = pr.reviews) == null ? void 0 : _e.length) ?? 0) > 0 || (((_f = pr.reviewRequests) == null ? void 0 : _f.length) ?? 0) > 0) && /* @__PURE__ */
|
|
1765
|
-
/* @__PURE__ */
|
|
1766
|
-
/* @__PURE__ */
|
|
1767
|
-
/* @__PURE__ */
|
|
1769
|
+
((((_e = pr.reviews) == null ? void 0 : _e.length) ?? 0) > 0 || (((_f = pr.reviewRequests) == null ? void 0 : _f.length) ?? 0) > 0) && /* @__PURE__ */ jsxs3(Box3, { marginTop: 1, flexDirection: "column", children: [
|
|
1770
|
+
/* @__PURE__ */ jsxs3(Box3, { children: [
|
|
1771
|
+
/* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Reviews: " }),
|
|
1772
|
+
/* @__PURE__ */ jsx4(Text3, { color: reviewDisplay.color, children: reviewDisplay.text })
|
|
1768
1773
|
] }),
|
|
1769
1774
|
(_g = pr.reviews) == null ? void 0 : _g.map((review, idx) => {
|
|
1770
1775
|
const color = review.state === "APPROVED" ? "green" : review.state === "CHANGES_REQUESTED" ? "red" : review.state === "COMMENTED" ? "blue" : "yellow";
|
|
1771
1776
|
const icon = review.state === "APPROVED" ? "\u2713" : review.state === "CHANGES_REQUESTED" ? "\u2717" : review.state === "COMMENTED" ? "\u{1F4AC}" : "\u25CB";
|
|
1772
|
-
return /* @__PURE__ */
|
|
1777
|
+
return /* @__PURE__ */ jsxs3(Text3, { color, children: [
|
|
1773
1778
|
" ",
|
|
1774
1779
|
icon,
|
|
1775
1780
|
" ",
|
|
1776
1781
|
review.author.login
|
|
1777
1782
|
] }, idx);
|
|
1778
1783
|
}),
|
|
1779
|
-
(_h = pr.reviewRequests) == null ? void 0 : _h.map((r, idx) => /* @__PURE__ */
|
|
1784
|
+
(_h = pr.reviewRequests) == null ? void 0 : _h.map((r, idx) => /* @__PURE__ */ jsxs3(Text3, { color: "yellow", children: [
|
|
1780
1785
|
" ",
|
|
1781
1786
|
"\u25CB ",
|
|
1782
1787
|
r.login ?? r.name ?? r.slug ?? "Team",
|
|
1783
1788
|
" ",
|
|
1784
|
-
/* @__PURE__ */
|
|
1789
|
+
/* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "(pending)" })
|
|
1785
1790
|
] }, `pending-${idx}`))
|
|
1786
1791
|
] }),
|
|
1787
|
-
(((_i = pr.statusCheckRollup) == null ? void 0 : _i.length) ?? 0) > 0 && /* @__PURE__ */
|
|
1788
|
-
/* @__PURE__ */
|
|
1789
|
-
/* @__PURE__ */
|
|
1792
|
+
(((_i = pr.statusCheckRollup) == null ? void 0 : _i.length) ?? 0) > 0 && /* @__PURE__ */ jsxs3(Box3, { marginTop: 1, flexDirection: "column", children: [
|
|
1793
|
+
/* @__PURE__ */ jsx4(Divider, {}),
|
|
1794
|
+
/* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Checks:" }),
|
|
1790
1795
|
Array.from(
|
|
1791
1796
|
((_j = pr.statusCheckRollup) == null ? void 0 : _j.reduce((acc, check) => {
|
|
1792
1797
|
const key = check.name ?? check.context ?? "";
|
|
@@ -1800,7 +1805,7 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
|
|
|
1800
1805
|
const jobName = check.name ?? check.context;
|
|
1801
1806
|
const displayName = check.workflowName ? `${check.workflowName} / ${jobName}` : jobName;
|
|
1802
1807
|
const status = resolveCheckStatus(check);
|
|
1803
|
-
return /* @__PURE__ */
|
|
1808
|
+
return /* @__PURE__ */ jsxs3(Text3, { color: CHECK_COLORS[status], children: [
|
|
1804
1809
|
" ",
|
|
1805
1810
|
CHECK_ICONS[status],
|
|
1806
1811
|
" ",
|
|
@@ -1808,10 +1813,10 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
|
|
|
1808
1813
|
] }, idx);
|
|
1809
1814
|
})
|
|
1810
1815
|
] }),
|
|
1811
|
-
pr.body && /* @__PURE__ */
|
|
1812
|
-
/* @__PURE__ */
|
|
1813
|
-
/* @__PURE__ */
|
|
1814
|
-
/* @__PURE__ */
|
|
1816
|
+
pr.body && /* @__PURE__ */ jsxs3(Box3, { marginTop: 1, flexDirection: "column", children: [
|
|
1817
|
+
/* @__PURE__ */ jsx4(Divider, {}),
|
|
1818
|
+
/* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "Description:" }),
|
|
1819
|
+
/* @__PURE__ */ jsx4(Markdown, { children: pr.body })
|
|
1815
1820
|
] })
|
|
1816
1821
|
] })
|
|
1817
1822
|
] }) })
|
|
@@ -1822,11 +1827,10 @@ function PRDetailsBox({ pr, loading, error, isActive }) {
|
|
|
1822
1827
|
|
|
1823
1828
|
// src/components/github/PullRequestsBox.tsx
|
|
1824
1829
|
import open2 from "open";
|
|
1825
|
-
import { useState as
|
|
1830
|
+
import { useState as useState11 } from "react";
|
|
1826
1831
|
import { TitledBox } from "@mishieck/ink-titled-box";
|
|
1827
|
-
import { Box as Box4, Text as
|
|
1832
|
+
import { Box as Box4, Text as Text5, useInput as useInput3 } from "ink";
|
|
1828
1833
|
import { ScrollView as ScrollView2 } from "ink-scroll-view";
|
|
1829
|
-
import Spinner from "ink-spinner";
|
|
1830
1834
|
|
|
1831
1835
|
// src/hooks/jira/useJiraTickets.ts
|
|
1832
1836
|
import { useCallback as useCallback4, useState as useState5 } from "react";
|
|
@@ -2600,8 +2604,665 @@ async function copyToClipboard(text) {
|
|
|
2600
2604
|
}
|
|
2601
2605
|
}
|
|
2602
2606
|
|
|
2607
|
+
// node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.js
|
|
2608
|
+
var ANSI_BACKGROUND_OFFSET = 10;
|
|
2609
|
+
var wrapAnsi16 = (offset = 0) => (code) => `\x1B[${code + offset}m`;
|
|
2610
|
+
var wrapAnsi256 = (offset = 0) => (code) => `\x1B[${38 + offset};5;${code}m`;
|
|
2611
|
+
var wrapAnsi16m = (offset = 0) => (red, green, blue) => `\x1B[${38 + offset};2;${red};${green};${blue}m`;
|
|
2612
|
+
var styles = {
|
|
2613
|
+
modifier: {
|
|
2614
|
+
reset: [0, 0],
|
|
2615
|
+
// 21 isn't widely supported and 22 does the same thing
|
|
2616
|
+
bold: [1, 22],
|
|
2617
|
+
dim: [2, 22],
|
|
2618
|
+
italic: [3, 23],
|
|
2619
|
+
underline: [4, 24],
|
|
2620
|
+
overline: [53, 55],
|
|
2621
|
+
inverse: [7, 27],
|
|
2622
|
+
hidden: [8, 28],
|
|
2623
|
+
strikethrough: [9, 29]
|
|
2624
|
+
},
|
|
2625
|
+
color: {
|
|
2626
|
+
black: [30, 39],
|
|
2627
|
+
red: [31, 39],
|
|
2628
|
+
green: [32, 39],
|
|
2629
|
+
yellow: [33, 39],
|
|
2630
|
+
blue: [34, 39],
|
|
2631
|
+
magenta: [35, 39],
|
|
2632
|
+
cyan: [36, 39],
|
|
2633
|
+
white: [37, 39],
|
|
2634
|
+
// Bright color
|
|
2635
|
+
blackBright: [90, 39],
|
|
2636
|
+
gray: [90, 39],
|
|
2637
|
+
// Alias of `blackBright`
|
|
2638
|
+
grey: [90, 39],
|
|
2639
|
+
// Alias of `blackBright`
|
|
2640
|
+
redBright: [91, 39],
|
|
2641
|
+
greenBright: [92, 39],
|
|
2642
|
+
yellowBright: [93, 39],
|
|
2643
|
+
blueBright: [94, 39],
|
|
2644
|
+
magentaBright: [95, 39],
|
|
2645
|
+
cyanBright: [96, 39],
|
|
2646
|
+
whiteBright: [97, 39]
|
|
2647
|
+
},
|
|
2648
|
+
bgColor: {
|
|
2649
|
+
bgBlack: [40, 49],
|
|
2650
|
+
bgRed: [41, 49],
|
|
2651
|
+
bgGreen: [42, 49],
|
|
2652
|
+
bgYellow: [43, 49],
|
|
2653
|
+
bgBlue: [44, 49],
|
|
2654
|
+
bgMagenta: [45, 49],
|
|
2655
|
+
bgCyan: [46, 49],
|
|
2656
|
+
bgWhite: [47, 49],
|
|
2657
|
+
// Bright color
|
|
2658
|
+
bgBlackBright: [100, 49],
|
|
2659
|
+
bgGray: [100, 49],
|
|
2660
|
+
// Alias of `bgBlackBright`
|
|
2661
|
+
bgGrey: [100, 49],
|
|
2662
|
+
// Alias of `bgBlackBright`
|
|
2663
|
+
bgRedBright: [101, 49],
|
|
2664
|
+
bgGreenBright: [102, 49],
|
|
2665
|
+
bgYellowBright: [103, 49],
|
|
2666
|
+
bgBlueBright: [104, 49],
|
|
2667
|
+
bgMagentaBright: [105, 49],
|
|
2668
|
+
bgCyanBright: [106, 49],
|
|
2669
|
+
bgWhiteBright: [107, 49]
|
|
2670
|
+
}
|
|
2671
|
+
};
|
|
2672
|
+
var modifierNames = Object.keys(styles.modifier);
|
|
2673
|
+
var foregroundColorNames = Object.keys(styles.color);
|
|
2674
|
+
var backgroundColorNames = Object.keys(styles.bgColor);
|
|
2675
|
+
var colorNames = [...foregroundColorNames, ...backgroundColorNames];
|
|
2676
|
+
function assembleStyles() {
|
|
2677
|
+
const codes = /* @__PURE__ */ new Map();
|
|
2678
|
+
for (const [groupName, group] of Object.entries(styles)) {
|
|
2679
|
+
for (const [styleName, style] of Object.entries(group)) {
|
|
2680
|
+
styles[styleName] = {
|
|
2681
|
+
open: `\x1B[${style[0]}m`,
|
|
2682
|
+
close: `\x1B[${style[1]}m`
|
|
2683
|
+
};
|
|
2684
|
+
group[styleName] = styles[styleName];
|
|
2685
|
+
codes.set(style[0], style[1]);
|
|
2686
|
+
}
|
|
2687
|
+
Object.defineProperty(styles, groupName, {
|
|
2688
|
+
value: group,
|
|
2689
|
+
enumerable: false
|
|
2690
|
+
});
|
|
2691
|
+
}
|
|
2692
|
+
Object.defineProperty(styles, "codes", {
|
|
2693
|
+
value: codes,
|
|
2694
|
+
enumerable: false
|
|
2695
|
+
});
|
|
2696
|
+
styles.color.close = "\x1B[39m";
|
|
2697
|
+
styles.bgColor.close = "\x1B[49m";
|
|
2698
|
+
styles.color.ansi = wrapAnsi16();
|
|
2699
|
+
styles.color.ansi256 = wrapAnsi256();
|
|
2700
|
+
styles.color.ansi16m = wrapAnsi16m();
|
|
2701
|
+
styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);
|
|
2702
|
+
styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
|
|
2703
|
+
styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
|
|
2704
|
+
Object.defineProperties(styles, {
|
|
2705
|
+
rgbToAnsi256: {
|
|
2706
|
+
value(red, green, blue) {
|
|
2707
|
+
if (red === green && green === blue) {
|
|
2708
|
+
if (red < 8) {
|
|
2709
|
+
return 16;
|
|
2710
|
+
}
|
|
2711
|
+
if (red > 248) {
|
|
2712
|
+
return 231;
|
|
2713
|
+
}
|
|
2714
|
+
return Math.round((red - 8) / 247 * 24) + 232;
|
|
2715
|
+
}
|
|
2716
|
+
return 16 + 36 * Math.round(red / 255 * 5) + 6 * Math.round(green / 255 * 5) + Math.round(blue / 255 * 5);
|
|
2717
|
+
},
|
|
2718
|
+
enumerable: false
|
|
2719
|
+
},
|
|
2720
|
+
hexToRgb: {
|
|
2721
|
+
value(hex) {
|
|
2722
|
+
const matches = /[a-f\d]{6}|[a-f\d]{3}/i.exec(hex.toString(16));
|
|
2723
|
+
if (!matches) {
|
|
2724
|
+
return [0, 0, 0];
|
|
2725
|
+
}
|
|
2726
|
+
let [colorString] = matches;
|
|
2727
|
+
if (colorString.length === 3) {
|
|
2728
|
+
colorString = [...colorString].map((character) => character + character).join("");
|
|
2729
|
+
}
|
|
2730
|
+
const integer = Number.parseInt(colorString, 16);
|
|
2731
|
+
return [
|
|
2732
|
+
/* eslint-disable no-bitwise */
|
|
2733
|
+
integer >> 16 & 255,
|
|
2734
|
+
integer >> 8 & 255,
|
|
2735
|
+
integer & 255
|
|
2736
|
+
/* eslint-enable no-bitwise */
|
|
2737
|
+
];
|
|
2738
|
+
},
|
|
2739
|
+
enumerable: false
|
|
2740
|
+
},
|
|
2741
|
+
hexToAnsi256: {
|
|
2742
|
+
value: (hex) => styles.rgbToAnsi256(...styles.hexToRgb(hex)),
|
|
2743
|
+
enumerable: false
|
|
2744
|
+
},
|
|
2745
|
+
ansi256ToAnsi: {
|
|
2746
|
+
value(code) {
|
|
2747
|
+
if (code < 8) {
|
|
2748
|
+
return 30 + code;
|
|
2749
|
+
}
|
|
2750
|
+
if (code < 16) {
|
|
2751
|
+
return 90 + (code - 8);
|
|
2752
|
+
}
|
|
2753
|
+
let red;
|
|
2754
|
+
let green;
|
|
2755
|
+
let blue;
|
|
2756
|
+
if (code >= 232) {
|
|
2757
|
+
red = ((code - 232) * 10 + 8) / 255;
|
|
2758
|
+
green = red;
|
|
2759
|
+
blue = red;
|
|
2760
|
+
} else {
|
|
2761
|
+
code -= 16;
|
|
2762
|
+
const remainder = code % 36;
|
|
2763
|
+
red = Math.floor(code / 36) / 5;
|
|
2764
|
+
green = Math.floor(remainder / 6) / 5;
|
|
2765
|
+
blue = remainder % 6 / 5;
|
|
2766
|
+
}
|
|
2767
|
+
const value = Math.max(red, green, blue) * 2;
|
|
2768
|
+
if (value === 0) {
|
|
2769
|
+
return 30;
|
|
2770
|
+
}
|
|
2771
|
+
let result = 30 + (Math.round(blue) << 2 | Math.round(green) << 1 | Math.round(red));
|
|
2772
|
+
if (value === 2) {
|
|
2773
|
+
result += 60;
|
|
2774
|
+
}
|
|
2775
|
+
return result;
|
|
2776
|
+
},
|
|
2777
|
+
enumerable: false
|
|
2778
|
+
},
|
|
2779
|
+
rgbToAnsi: {
|
|
2780
|
+
value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),
|
|
2781
|
+
enumerable: false
|
|
2782
|
+
},
|
|
2783
|
+
hexToAnsi: {
|
|
2784
|
+
value: (hex) => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),
|
|
2785
|
+
enumerable: false
|
|
2786
|
+
}
|
|
2787
|
+
});
|
|
2788
|
+
return styles;
|
|
2789
|
+
}
|
|
2790
|
+
var ansiStyles = assembleStyles();
|
|
2791
|
+
var ansi_styles_default = ansiStyles;
|
|
2792
|
+
|
|
2793
|
+
// node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.js
|
|
2794
|
+
import process2 from "process";
|
|
2795
|
+
import os from "os";
|
|
2796
|
+
import tty from "tty";
|
|
2797
|
+
function hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process2.argv) {
|
|
2798
|
+
const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--";
|
|
2799
|
+
const position = argv.indexOf(prefix + flag);
|
|
2800
|
+
const terminatorPosition = argv.indexOf("--");
|
|
2801
|
+
return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);
|
|
2802
|
+
}
|
|
2803
|
+
var { env } = process2;
|
|
2804
|
+
var flagForceColor;
|
|
2805
|
+
if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false") || hasFlag("color=never")) {
|
|
2806
|
+
flagForceColor = 0;
|
|
2807
|
+
} else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) {
|
|
2808
|
+
flagForceColor = 1;
|
|
2809
|
+
}
|
|
2810
|
+
function envForceColor() {
|
|
2811
|
+
if ("FORCE_COLOR" in env) {
|
|
2812
|
+
if (env.FORCE_COLOR === "true") {
|
|
2813
|
+
return 1;
|
|
2814
|
+
}
|
|
2815
|
+
if (env.FORCE_COLOR === "false") {
|
|
2816
|
+
return 0;
|
|
2817
|
+
}
|
|
2818
|
+
return env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);
|
|
2819
|
+
}
|
|
2820
|
+
}
|
|
2821
|
+
function translateLevel(level) {
|
|
2822
|
+
if (level === 0) {
|
|
2823
|
+
return false;
|
|
2824
|
+
}
|
|
2825
|
+
return {
|
|
2826
|
+
level,
|
|
2827
|
+
hasBasic: true,
|
|
2828
|
+
has256: level >= 2,
|
|
2829
|
+
has16m: level >= 3
|
|
2830
|
+
};
|
|
2831
|
+
}
|
|
2832
|
+
function _supportsColor(haveStream, { streamIsTTY, sniffFlags = true } = {}) {
|
|
2833
|
+
const noFlagForceColor = envForceColor();
|
|
2834
|
+
if (noFlagForceColor !== void 0) {
|
|
2835
|
+
flagForceColor = noFlagForceColor;
|
|
2836
|
+
}
|
|
2837
|
+
const forceColor = sniffFlags ? flagForceColor : noFlagForceColor;
|
|
2838
|
+
if (forceColor === 0) {
|
|
2839
|
+
return 0;
|
|
2840
|
+
}
|
|
2841
|
+
if (sniffFlags) {
|
|
2842
|
+
if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) {
|
|
2843
|
+
return 3;
|
|
2844
|
+
}
|
|
2845
|
+
if (hasFlag("color=256")) {
|
|
2846
|
+
return 2;
|
|
2847
|
+
}
|
|
2848
|
+
}
|
|
2849
|
+
if ("TF_BUILD" in env && "AGENT_NAME" in env) {
|
|
2850
|
+
return 1;
|
|
2851
|
+
}
|
|
2852
|
+
if (haveStream && !streamIsTTY && forceColor === void 0) {
|
|
2853
|
+
return 0;
|
|
2854
|
+
}
|
|
2855
|
+
const min = forceColor || 0;
|
|
2856
|
+
if (env.TERM === "dumb") {
|
|
2857
|
+
return min;
|
|
2858
|
+
}
|
|
2859
|
+
if (process2.platform === "win32") {
|
|
2860
|
+
const osRelease = os.release().split(".");
|
|
2861
|
+
if (Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {
|
|
2862
|
+
return Number(osRelease[2]) >= 14931 ? 3 : 2;
|
|
2863
|
+
}
|
|
2864
|
+
return 1;
|
|
2865
|
+
}
|
|
2866
|
+
if ("CI" in env) {
|
|
2867
|
+
if (["GITHUB_ACTIONS", "GITEA_ACTIONS", "CIRCLECI"].some((key) => key in env)) {
|
|
2868
|
+
return 3;
|
|
2869
|
+
}
|
|
2870
|
+
if (["TRAVIS", "APPVEYOR", "GITLAB_CI", "BUILDKITE", "DRONE"].some((sign) => sign in env) || env.CI_NAME === "codeship") {
|
|
2871
|
+
return 1;
|
|
2872
|
+
}
|
|
2873
|
+
return min;
|
|
2874
|
+
}
|
|
2875
|
+
if ("TEAMCITY_VERSION" in env) {
|
|
2876
|
+
return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
|
|
2877
|
+
}
|
|
2878
|
+
if (env.COLORTERM === "truecolor") {
|
|
2879
|
+
return 3;
|
|
2880
|
+
}
|
|
2881
|
+
if (env.TERM === "xterm-kitty") {
|
|
2882
|
+
return 3;
|
|
2883
|
+
}
|
|
2884
|
+
if (env.TERM === "xterm-ghostty") {
|
|
2885
|
+
return 3;
|
|
2886
|
+
}
|
|
2887
|
+
if (env.TERM === "wezterm") {
|
|
2888
|
+
return 3;
|
|
2889
|
+
}
|
|
2890
|
+
if ("TERM_PROGRAM" in env) {
|
|
2891
|
+
const version = Number.parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
|
|
2892
|
+
switch (env.TERM_PROGRAM) {
|
|
2893
|
+
case "iTerm.app": {
|
|
2894
|
+
return version >= 3 ? 3 : 2;
|
|
2895
|
+
}
|
|
2896
|
+
case "Apple_Terminal": {
|
|
2897
|
+
return 2;
|
|
2898
|
+
}
|
|
2899
|
+
}
|
|
2900
|
+
}
|
|
2901
|
+
if (/-256(color)?$/i.test(env.TERM)) {
|
|
2902
|
+
return 2;
|
|
2903
|
+
}
|
|
2904
|
+
if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
|
|
2905
|
+
return 1;
|
|
2906
|
+
}
|
|
2907
|
+
if ("COLORTERM" in env) {
|
|
2908
|
+
return 1;
|
|
2909
|
+
}
|
|
2910
|
+
return min;
|
|
2911
|
+
}
|
|
2912
|
+
function createSupportsColor(stream, options = {}) {
|
|
2913
|
+
const level = _supportsColor(stream, {
|
|
2914
|
+
streamIsTTY: stream && stream.isTTY,
|
|
2915
|
+
...options
|
|
2916
|
+
});
|
|
2917
|
+
return translateLevel(level);
|
|
2918
|
+
}
|
|
2919
|
+
var supportsColor = {
|
|
2920
|
+
stdout: createSupportsColor({ isTTY: tty.isatty(1) }),
|
|
2921
|
+
stderr: createSupportsColor({ isTTY: tty.isatty(2) })
|
|
2922
|
+
};
|
|
2923
|
+
var supports_color_default = supportsColor;
|
|
2924
|
+
|
|
2925
|
+
// node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/utilities.js
|
|
2926
|
+
function stringReplaceAll(string, substring, replacer) {
|
|
2927
|
+
let index = string.indexOf(substring);
|
|
2928
|
+
if (index === -1) {
|
|
2929
|
+
return string;
|
|
2930
|
+
}
|
|
2931
|
+
const substringLength = substring.length;
|
|
2932
|
+
let endIndex = 0;
|
|
2933
|
+
let returnValue = "";
|
|
2934
|
+
do {
|
|
2935
|
+
returnValue += string.slice(endIndex, index) + substring + replacer;
|
|
2936
|
+
endIndex = index + substringLength;
|
|
2937
|
+
index = string.indexOf(substring, endIndex);
|
|
2938
|
+
} while (index !== -1);
|
|
2939
|
+
returnValue += string.slice(endIndex);
|
|
2940
|
+
return returnValue;
|
|
2941
|
+
}
|
|
2942
|
+
function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {
|
|
2943
|
+
let endIndex = 0;
|
|
2944
|
+
let returnValue = "";
|
|
2945
|
+
do {
|
|
2946
|
+
const gotCR = string[index - 1] === "\r";
|
|
2947
|
+
returnValue += string.slice(endIndex, gotCR ? index - 1 : index) + prefix + (gotCR ? "\r\n" : "\n") + postfix;
|
|
2948
|
+
endIndex = index + 1;
|
|
2949
|
+
index = string.indexOf("\n", endIndex);
|
|
2950
|
+
} while (index !== -1);
|
|
2951
|
+
returnValue += string.slice(endIndex);
|
|
2952
|
+
return returnValue;
|
|
2953
|
+
}
|
|
2954
|
+
|
|
2955
|
+
// node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/index.js
|
|
2956
|
+
var { stdout: stdoutColor, stderr: stderrColor } = supports_color_default;
|
|
2957
|
+
var GENERATOR = /* @__PURE__ */ Symbol("GENERATOR");
|
|
2958
|
+
var STYLER = /* @__PURE__ */ Symbol("STYLER");
|
|
2959
|
+
var IS_EMPTY = /* @__PURE__ */ Symbol("IS_EMPTY");
|
|
2960
|
+
var levelMapping = [
|
|
2961
|
+
"ansi",
|
|
2962
|
+
"ansi",
|
|
2963
|
+
"ansi256",
|
|
2964
|
+
"ansi16m"
|
|
2965
|
+
];
|
|
2966
|
+
var styles2 = /* @__PURE__ */ Object.create(null);
|
|
2967
|
+
var applyOptions = (object, options = {}) => {
|
|
2968
|
+
if (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {
|
|
2969
|
+
throw new Error("The `level` option should be an integer from 0 to 3");
|
|
2970
|
+
}
|
|
2971
|
+
const colorLevel = stdoutColor ? stdoutColor.level : 0;
|
|
2972
|
+
object.level = options.level === void 0 ? colorLevel : options.level;
|
|
2973
|
+
};
|
|
2974
|
+
var chalkFactory = (options) => {
|
|
2975
|
+
const chalk2 = (...strings) => strings.join(" ");
|
|
2976
|
+
applyOptions(chalk2, options);
|
|
2977
|
+
Object.setPrototypeOf(chalk2, createChalk.prototype);
|
|
2978
|
+
return chalk2;
|
|
2979
|
+
};
|
|
2980
|
+
function createChalk(options) {
|
|
2981
|
+
return chalkFactory(options);
|
|
2982
|
+
}
|
|
2983
|
+
Object.setPrototypeOf(createChalk.prototype, Function.prototype);
|
|
2984
|
+
for (const [styleName, style] of Object.entries(ansi_styles_default)) {
|
|
2985
|
+
styles2[styleName] = {
|
|
2986
|
+
get() {
|
|
2987
|
+
const builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);
|
|
2988
|
+
Object.defineProperty(this, styleName, { value: builder });
|
|
2989
|
+
return builder;
|
|
2990
|
+
}
|
|
2991
|
+
};
|
|
2992
|
+
}
|
|
2993
|
+
styles2.visible = {
|
|
2994
|
+
get() {
|
|
2995
|
+
const builder = createBuilder(this, this[STYLER], true);
|
|
2996
|
+
Object.defineProperty(this, "visible", { value: builder });
|
|
2997
|
+
return builder;
|
|
2998
|
+
}
|
|
2999
|
+
};
|
|
3000
|
+
var getModelAnsi = (model, level, type, ...arguments_) => {
|
|
3001
|
+
if (model === "rgb") {
|
|
3002
|
+
if (level === "ansi16m") {
|
|
3003
|
+
return ansi_styles_default[type].ansi16m(...arguments_);
|
|
3004
|
+
}
|
|
3005
|
+
if (level === "ansi256") {
|
|
3006
|
+
return ansi_styles_default[type].ansi256(ansi_styles_default.rgbToAnsi256(...arguments_));
|
|
3007
|
+
}
|
|
3008
|
+
return ansi_styles_default[type].ansi(ansi_styles_default.rgbToAnsi(...arguments_));
|
|
3009
|
+
}
|
|
3010
|
+
if (model === "hex") {
|
|
3011
|
+
return getModelAnsi("rgb", level, type, ...ansi_styles_default.hexToRgb(...arguments_));
|
|
3012
|
+
}
|
|
3013
|
+
return ansi_styles_default[type][model](...arguments_);
|
|
3014
|
+
};
|
|
3015
|
+
var usedModels = ["rgb", "hex", "ansi256"];
|
|
3016
|
+
for (const model of usedModels) {
|
|
3017
|
+
styles2[model] = {
|
|
3018
|
+
get() {
|
|
3019
|
+
const { level } = this;
|
|
3020
|
+
return function(...arguments_) {
|
|
3021
|
+
const styler = createStyler(getModelAnsi(model, levelMapping[level], "color", ...arguments_), ansi_styles_default.color.close, this[STYLER]);
|
|
3022
|
+
return createBuilder(this, styler, this[IS_EMPTY]);
|
|
3023
|
+
};
|
|
3024
|
+
}
|
|
3025
|
+
};
|
|
3026
|
+
const bgModel = "bg" + model[0].toUpperCase() + model.slice(1);
|
|
3027
|
+
styles2[bgModel] = {
|
|
3028
|
+
get() {
|
|
3029
|
+
const { level } = this;
|
|
3030
|
+
return function(...arguments_) {
|
|
3031
|
+
const styler = createStyler(getModelAnsi(model, levelMapping[level], "bgColor", ...arguments_), ansi_styles_default.bgColor.close, this[STYLER]);
|
|
3032
|
+
return createBuilder(this, styler, this[IS_EMPTY]);
|
|
3033
|
+
};
|
|
3034
|
+
}
|
|
3035
|
+
};
|
|
3036
|
+
}
|
|
3037
|
+
var proto = Object.defineProperties(() => {
|
|
3038
|
+
}, {
|
|
3039
|
+
...styles2,
|
|
3040
|
+
level: {
|
|
3041
|
+
enumerable: true,
|
|
3042
|
+
get() {
|
|
3043
|
+
return this[GENERATOR].level;
|
|
3044
|
+
},
|
|
3045
|
+
set(level) {
|
|
3046
|
+
this[GENERATOR].level = level;
|
|
3047
|
+
}
|
|
3048
|
+
}
|
|
3049
|
+
});
|
|
3050
|
+
var createStyler = (open6, close, parent) => {
|
|
3051
|
+
let openAll;
|
|
3052
|
+
let closeAll;
|
|
3053
|
+
if (parent === void 0) {
|
|
3054
|
+
openAll = open6;
|
|
3055
|
+
closeAll = close;
|
|
3056
|
+
} else {
|
|
3057
|
+
openAll = parent.openAll + open6;
|
|
3058
|
+
closeAll = close + parent.closeAll;
|
|
3059
|
+
}
|
|
3060
|
+
return {
|
|
3061
|
+
open: open6,
|
|
3062
|
+
close,
|
|
3063
|
+
openAll,
|
|
3064
|
+
closeAll,
|
|
3065
|
+
parent
|
|
3066
|
+
};
|
|
3067
|
+
};
|
|
3068
|
+
var createBuilder = (self, _styler, _isEmpty) => {
|
|
3069
|
+
const builder = (...arguments_) => applyStyle(builder, arguments_.length === 1 ? "" + arguments_[0] : arguments_.join(" "));
|
|
3070
|
+
Object.setPrototypeOf(builder, proto);
|
|
3071
|
+
builder[GENERATOR] = self;
|
|
3072
|
+
builder[STYLER] = _styler;
|
|
3073
|
+
builder[IS_EMPTY] = _isEmpty;
|
|
3074
|
+
return builder;
|
|
3075
|
+
};
|
|
3076
|
+
var applyStyle = (self, string) => {
|
|
3077
|
+
if (self.level <= 0 || !string) {
|
|
3078
|
+
return self[IS_EMPTY] ? "" : string;
|
|
3079
|
+
}
|
|
3080
|
+
let styler = self[STYLER];
|
|
3081
|
+
if (styler === void 0) {
|
|
3082
|
+
return string;
|
|
3083
|
+
}
|
|
3084
|
+
const { openAll, closeAll } = styler;
|
|
3085
|
+
if (string.includes("\x1B")) {
|
|
3086
|
+
while (styler !== void 0) {
|
|
3087
|
+
string = stringReplaceAll(string, styler.close, styler.open);
|
|
3088
|
+
styler = styler.parent;
|
|
3089
|
+
}
|
|
3090
|
+
}
|
|
3091
|
+
const lfIndex = string.indexOf("\n");
|
|
3092
|
+
if (lfIndex !== -1) {
|
|
3093
|
+
string = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);
|
|
3094
|
+
}
|
|
3095
|
+
return openAll + string + closeAll;
|
|
3096
|
+
};
|
|
3097
|
+
Object.defineProperties(createChalk.prototype, styles2);
|
|
3098
|
+
var chalk = createChalk();
|
|
3099
|
+
var chalkStderr = createChalk({ level: stderrColor ? stderrColor.level : 0 });
|
|
3100
|
+
var source_default = chalk;
|
|
3101
|
+
|
|
3102
|
+
// src/components/ui/AnimatedText.tsx
|
|
3103
|
+
import { useEffect as useEffect8, useState as useState10 } from "react";
|
|
3104
|
+
import { Text as Text4 } from "ink";
|
|
3105
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
3106
|
+
function hexToRgb(hex) {
|
|
3107
|
+
const h = hex.replace("#", "");
|
|
3108
|
+
const n = h.length === 3 ? parseInt(h[0] + h[0] + h[1] + h[1] + h[2] + h[2], 16) : parseInt(h, 16);
|
|
3109
|
+
return [n >> 16 & 255, n >> 8 & 255, n & 255];
|
|
3110
|
+
}
|
|
3111
|
+
var DELAYS = {
|
|
3112
|
+
pulse: 16,
|
|
3113
|
+
neon: 500,
|
|
3114
|
+
radar: 50,
|
|
3115
|
+
karaoke: 50,
|
|
3116
|
+
rainbow: 15,
|
|
3117
|
+
glitch: 55
|
|
3118
|
+
};
|
|
3119
|
+
var GLITCH_CHARS = "\u2593\u2592\u2591\u2588\u2580\u2584\u258C\u2590\u2500\u2502\u2524\u2510\u2514\u2518\u251C\u252C\u2534\u253C";
|
|
3120
|
+
var TOTAL_PULSE_FRAMES = 120;
|
|
3121
|
+
function lerp(a, b, t) {
|
|
3122
|
+
return Math.round(a + (b - a) * t);
|
|
3123
|
+
}
|
|
3124
|
+
function applyPulse(text, frame, config) {
|
|
3125
|
+
const [br, bg, bb] = hexToRgb((config == null ? void 0 : config.baseColor) ?? "#E6E6E6");
|
|
3126
|
+
const [pr, pg, pb] = hexToRgb((config == null ? void 0 : config.pulseColor) ?? "#FF1010");
|
|
3127
|
+
const t = (Math.sin(frame / TOTAL_PULSE_FRAMES * Math.PI * 2) + 1) / 2;
|
|
3128
|
+
const r = lerp(br, pr, t);
|
|
3129
|
+
const g = lerp(bg, pg, t);
|
|
3130
|
+
const b = lerp(bb, pb, t);
|
|
3131
|
+
return source_default.rgb(r, g, b)(text);
|
|
3132
|
+
}
|
|
3133
|
+
function applyNeon(text, frame, config) {
|
|
3134
|
+
const on = frame % 2 === 0;
|
|
3135
|
+
const onColor = (config == null ? void 0 : config.onColor) ?? "#00FFFF";
|
|
3136
|
+
const offColor = (config == null ? void 0 : config.offColor) ?? "#325050";
|
|
3137
|
+
return on ? source_default.hex(onColor)(text) : source_default.hex(offColor)(text);
|
|
3138
|
+
}
|
|
3139
|
+
function applyRadar(text, frame, config) {
|
|
3140
|
+
const [br, bg, bb] = hexToRgb((config == null ? void 0 : config.baseColor) ?? "#3C3C3C");
|
|
3141
|
+
const depth = Math.max(1, Math.floor(text.length * 0.2));
|
|
3142
|
+
const globalPos = frame % (text.length + depth);
|
|
3143
|
+
const chars = [];
|
|
3144
|
+
for (let i = 0; i < text.length; i++) {
|
|
3145
|
+
const pos = -(i - globalPos);
|
|
3146
|
+
if (pos > 0 && pos <= depth - 1) {
|
|
3147
|
+
const t = (depth - pos) / depth;
|
|
3148
|
+
chars.push(source_default.rgb(lerp(br, 255, t), lerp(bg, 255, t), lerp(bb, 255, t))(text[i]));
|
|
3149
|
+
} else {
|
|
3150
|
+
chars.push(source_default.rgb(br, bg, bb)(text[i]));
|
|
3151
|
+
}
|
|
3152
|
+
}
|
|
3153
|
+
return chars.join("");
|
|
3154
|
+
}
|
|
3155
|
+
function applyKaraoke(text, frame, config) {
|
|
3156
|
+
const highlightColor = (config == null ? void 0 : config.highlightColor) ?? "#FFBB00";
|
|
3157
|
+
const baseColor = (config == null ? void 0 : config.baseColor) ?? "#FFFFFF";
|
|
3158
|
+
const pos = frame % (text.length + 20) - 10;
|
|
3159
|
+
if (pos < 0) {
|
|
3160
|
+
return source_default.hex(baseColor)(text);
|
|
3161
|
+
}
|
|
3162
|
+
return source_default.hex(highlightColor).bold(text.substring(0, pos)) + source_default.hex(baseColor)(text.substring(pos));
|
|
3163
|
+
}
|
|
3164
|
+
function hsvToRgb(h, s, v) {
|
|
3165
|
+
const i = Math.floor(h / 60) % 6;
|
|
3166
|
+
const f = h / 60 - Math.floor(h / 60);
|
|
3167
|
+
const p = v * (1 - s);
|
|
3168
|
+
const q = v * (1 - f * s);
|
|
3169
|
+
const t = v * (1 - (1 - f) * s);
|
|
3170
|
+
const map = [
|
|
3171
|
+
[v, t, p],
|
|
3172
|
+
[q, v, p],
|
|
3173
|
+
[p, v, t],
|
|
3174
|
+
[p, q, v],
|
|
3175
|
+
[t, p, v],
|
|
3176
|
+
[v, p, q]
|
|
3177
|
+
];
|
|
3178
|
+
return map[i].map((c) => Math.round(c * 255));
|
|
3179
|
+
}
|
|
3180
|
+
function applyRainbow(text, frame, config) {
|
|
3181
|
+
const sat = (config == null ? void 0 : config.saturation) ?? 1;
|
|
3182
|
+
const bri = (config == null ? void 0 : config.brightness) ?? 1;
|
|
3183
|
+
const hueStart = 5 * frame % 360;
|
|
3184
|
+
const chars = [];
|
|
3185
|
+
for (let i = 0; i < text.length; i++) {
|
|
3186
|
+
const hue = (hueStart + i * 360 / Math.max(text.length, 1)) % 360;
|
|
3187
|
+
const [r, g, b] = hsvToRgb(hue, sat, bri);
|
|
3188
|
+
chars.push(source_default.rgb(r, g, b)(text[i]));
|
|
3189
|
+
}
|
|
3190
|
+
return chars.join("");
|
|
3191
|
+
}
|
|
3192
|
+
function applyGlitch(text, frame) {
|
|
3193
|
+
if (frame % 2 + frame % 3 + frame % 11 + frame % 29 + frame % 37 > 52) {
|
|
3194
|
+
return text.replace(/[^\r\n]/g, " ");
|
|
3195
|
+
}
|
|
3196
|
+
const chunkSize = Math.max(3, Math.round(text.length * 0.02));
|
|
3197
|
+
const chars = [];
|
|
3198
|
+
for (let i = 0; i < text.length; i++) {
|
|
3199
|
+
const skip = Math.round(Math.max(0, (Math.random() - 0.8) * chunkSize));
|
|
3200
|
+
chars.push(text.substring(i, i + skip).replace(/[^\r\n]/g, " "));
|
|
3201
|
+
i += skip;
|
|
3202
|
+
if (text[i]) {
|
|
3203
|
+
if (text[i] !== "\n" && text[i] !== "\r" && Math.random() > 0.995) {
|
|
3204
|
+
chars.push(GLITCH_CHARS[Math.floor(Math.random() * GLITCH_CHARS.length)]);
|
|
3205
|
+
} else if (Math.random() > 5e-3) {
|
|
3206
|
+
chars.push(text[i]);
|
|
3207
|
+
}
|
|
3208
|
+
}
|
|
3209
|
+
}
|
|
3210
|
+
return chars.join("");
|
|
3211
|
+
}
|
|
3212
|
+
function applyAnimation(text, name, frame, config) {
|
|
3213
|
+
switch (name) {
|
|
3214
|
+
case "pulse":
|
|
3215
|
+
return applyPulse(text, frame, config);
|
|
3216
|
+
case "neon":
|
|
3217
|
+
return applyNeon(text, frame, config);
|
|
3218
|
+
case "radar":
|
|
3219
|
+
return applyRadar(text, frame, config);
|
|
3220
|
+
case "karaoke":
|
|
3221
|
+
return applyKaraoke(text, frame, config);
|
|
3222
|
+
case "rainbow":
|
|
3223
|
+
return applyRainbow(text, frame, config);
|
|
3224
|
+
case "glitch":
|
|
3225
|
+
return applyGlitch(text, frame);
|
|
3226
|
+
}
|
|
3227
|
+
}
|
|
3228
|
+
function flattenChildren(children) {
|
|
3229
|
+
if (typeof children === "string") return children;
|
|
3230
|
+
if (typeof children === "number") return String(children);
|
|
3231
|
+
if (children == null || typeof children === "boolean") return "";
|
|
3232
|
+
if (Array.isArray(children)) return children.map(flattenChildren).join("");
|
|
3233
|
+
return "";
|
|
3234
|
+
}
|
|
3235
|
+
function AnimatedText({
|
|
3236
|
+
name = "pulse",
|
|
3237
|
+
speed = 1,
|
|
3238
|
+
bold,
|
|
3239
|
+
italic,
|
|
3240
|
+
underline,
|
|
3241
|
+
strikethrough,
|
|
3242
|
+
dimColor,
|
|
3243
|
+
config,
|
|
3244
|
+
children
|
|
3245
|
+
}) {
|
|
3246
|
+
const [frame, setFrame] = useState10(0);
|
|
3247
|
+
const text = flattenChildren(children);
|
|
3248
|
+
useEffect8(() => {
|
|
3249
|
+
const delay = DELAYS[name] / speed;
|
|
3250
|
+
const interval = setInterval(() => {
|
|
3251
|
+
setFrame((f) => f + 1);
|
|
3252
|
+
}, delay);
|
|
3253
|
+
return () => clearInterval(interval);
|
|
3254
|
+
}, [name, speed]);
|
|
3255
|
+
let animated = applyAnimation(text, name, frame, config);
|
|
3256
|
+
if (bold) animated = source_default.bold(animated);
|
|
3257
|
+
if (italic) animated = source_default.italic(animated);
|
|
3258
|
+
if (underline) animated = source_default.underline(animated);
|
|
3259
|
+
if (strikethrough) animated = source_default.strikethrough(animated);
|
|
3260
|
+
if (dimColor) animated = source_default.dim(animated);
|
|
3261
|
+
return /* @__PURE__ */ jsx5(Text4, { children: animated });
|
|
3262
|
+
}
|
|
3263
|
+
|
|
2603
3264
|
// src/components/github/PullRequestsBox.tsx
|
|
2604
|
-
import { jsx as
|
|
3265
|
+
import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
2605
3266
|
function PullRequestsBox({
|
|
2606
3267
|
prs,
|
|
2607
3268
|
selectedPR,
|
|
@@ -2614,7 +3275,7 @@ function PullRequestsBox({
|
|
|
2614
3275
|
isActive,
|
|
2615
3276
|
isGeneratingPR
|
|
2616
3277
|
}) {
|
|
2617
|
-
const [copied, setCopied] =
|
|
3278
|
+
const [copied, setCopied] = useState11(false);
|
|
2618
3279
|
const selectedIndex = prs.findIndex((p) => p.number === (selectedPR == null ? void 0 : selectedPR.number));
|
|
2619
3280
|
const { highlightedIndex, scrollRef } = useListNavigation({
|
|
2620
3281
|
items: prs,
|
|
@@ -2651,43 +3312,40 @@ function PullRequestsBox({
|
|
|
2651
3312
|
const subtitle = branch ? ` (${branch})` : "";
|
|
2652
3313
|
const copiedIndicator = copied ? " [Copied!]" : "";
|
|
2653
3314
|
const borderColor = isActive ? "yellow" : void 0;
|
|
2654
|
-
return /* @__PURE__ */
|
|
3315
|
+
return /* @__PURE__ */ jsx6(
|
|
2655
3316
|
TitledBox,
|
|
2656
3317
|
{
|
|
2657
3318
|
borderStyle: "round",
|
|
2658
3319
|
titles: [`${title}${subtitle}${copiedIndicator}`],
|
|
2659
3320
|
borderColor,
|
|
2660
3321
|
height: 5,
|
|
2661
|
-
children: /* @__PURE__ */
|
|
2662
|
-
loading && /* @__PURE__ */
|
|
2663
|
-
error && /* @__PURE__ */
|
|
2664
|
-
isGeneratingPR && /* @__PURE__ */
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
] }),
|
|
2668
|
-
!loading && !error && /* @__PURE__ */ jsxs3(ScrollView2, { ref: scrollRef, children: [
|
|
2669
|
-
prs.length === 0 && /* @__PURE__ */ jsx4(Text3, { dimColor: true, children: "No PRs for this branch" }, "empty"),
|
|
3322
|
+
children: /* @__PURE__ */ jsxs4(Box4, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
|
|
3323
|
+
loading && /* @__PURE__ */ jsx6(Text5, { dimColor: true, children: "Loading PRs..." }),
|
|
3324
|
+
error && /* @__PURE__ */ jsx6(Text5, { color: "red", children: error }),
|
|
3325
|
+
isGeneratingPR && /* @__PURE__ */ jsx6(AnimatedText, { name: "radar", config: { baseColor: "#CC6600" }, children: "Generating PR with Claude... (Esc to cancel)" }),
|
|
3326
|
+
!loading && !error && /* @__PURE__ */ jsxs4(ScrollView2, { ref: scrollRef, children: [
|
|
3327
|
+
prs.length === 0 && /* @__PURE__ */ jsx6(Text5, { dimColor: true, children: "No PRs for this branch" }, "empty"),
|
|
2670
3328
|
prs.map((pr, idx) => {
|
|
2671
3329
|
const isHighlighted = isActive && idx === highlightedIndex;
|
|
2672
3330
|
const isSelected = pr.number === (selectedPR == null ? void 0 : selectedPR.number);
|
|
2673
3331
|
const cursor = isHighlighted ? ">" : " ";
|
|
2674
3332
|
const indicator = isSelected ? " *" : "";
|
|
2675
|
-
return /* @__PURE__ */
|
|
2676
|
-
/* @__PURE__ */
|
|
3333
|
+
return /* @__PURE__ */ jsxs4(Box4, { children: [
|
|
3334
|
+
/* @__PURE__ */ jsxs4(Text5, { color: isHighlighted ? "yellow" : void 0, children: [
|
|
2677
3335
|
cursor,
|
|
2678
3336
|
" "
|
|
2679
3337
|
] }),
|
|
2680
|
-
/* @__PURE__ */
|
|
3338
|
+
/* @__PURE__ */ jsxs4(Text5, { color: isSelected ? "green" : void 0, children: [
|
|
2681
3339
|
"#",
|
|
2682
3340
|
pr.number,
|
|
2683
3341
|
" ",
|
|
2684
3342
|
pr.isDraft ? "[Draft] " : "",
|
|
2685
3343
|
pr.title
|
|
2686
3344
|
] }),
|
|
2687
|
-
/* @__PURE__ */
|
|
3345
|
+
/* @__PURE__ */ jsx6(Text5, { dimColor: true, children: indicator })
|
|
2688
3346
|
] }, pr.number);
|
|
2689
3347
|
}),
|
|
2690
|
-
/* @__PURE__ */
|
|
3348
|
+
/* @__PURE__ */ jsxs4(Text5, { color: "blue", children: [
|
|
2691
3349
|
isActive && highlightedIndex === prs.length ? "> " : " ",
|
|
2692
3350
|
"+ Create new PR"
|
|
2693
3351
|
] }, "create")
|
|
@@ -2699,9 +3357,9 @@ function PullRequestsBox({
|
|
|
2699
3357
|
|
|
2700
3358
|
// src/components/github/RemotesBox.tsx
|
|
2701
3359
|
import { TitledBox as TitledBox2 } from "@mishieck/ink-titled-box";
|
|
2702
|
-
import { Box as Box5, Text as
|
|
3360
|
+
import { Box as Box5, Text as Text6 } from "ink";
|
|
2703
3361
|
import { ScrollView as ScrollView3 } from "ink-scroll-view";
|
|
2704
|
-
import { jsx as
|
|
3362
|
+
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
2705
3363
|
function RemotesBox({ remotes, selectedRemote, onSelect, loading, error, isActive }) {
|
|
2706
3364
|
const selectedIndex = remotes.findIndex((r) => r.name === selectedRemote);
|
|
2707
3365
|
const { highlightedIndex, scrollRef } = useListNavigation({
|
|
@@ -2712,52 +3370,52 @@ function RemotesBox({ remotes, selectedRemote, onSelect, loading, error, isActiv
|
|
|
2712
3370
|
});
|
|
2713
3371
|
const title = "[1] Remotes";
|
|
2714
3372
|
const borderColor = isActive ? "yellow" : void 0;
|
|
2715
|
-
return /* @__PURE__ */
|
|
2716
|
-
loading && /* @__PURE__ */
|
|
2717
|
-
error && /* @__PURE__ */
|
|
2718
|
-
!loading && !error && remotes.length === 0 && /* @__PURE__ */
|
|
2719
|
-
!loading && !error && remotes.length > 0 && /* @__PURE__ */
|
|
3373
|
+
return /* @__PURE__ */ jsx7(TitledBox2, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
|
|
3374
|
+
loading && /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: "Loading..." }),
|
|
3375
|
+
error && /* @__PURE__ */ jsx7(Text6, { color: "red", children: error }),
|
|
3376
|
+
!loading && !error && remotes.length === 0 && /* @__PURE__ */ jsx7(Text6, { dimColor: true, children: "No remotes configured" }),
|
|
3377
|
+
!loading && !error && remotes.length > 0 && /* @__PURE__ */ jsx7(ScrollView3, { ref: scrollRef, children: remotes.map((remote, idx) => {
|
|
2720
3378
|
const isHighlighted = isActive && idx === highlightedIndex;
|
|
2721
3379
|
const isSelected = remote.name === selectedRemote;
|
|
2722
3380
|
const cursor = isHighlighted ? ">" : " ";
|
|
2723
3381
|
const indicator = isSelected ? " *" : "";
|
|
2724
|
-
return /* @__PURE__ */
|
|
2725
|
-
/* @__PURE__ */
|
|
3382
|
+
return /* @__PURE__ */ jsxs5(Box5, { children: [
|
|
3383
|
+
/* @__PURE__ */ jsxs5(Text6, { color: isHighlighted ? "yellow" : void 0, children: [
|
|
2726
3384
|
cursor,
|
|
2727
3385
|
" "
|
|
2728
3386
|
] }),
|
|
2729
|
-
/* @__PURE__ */
|
|
3387
|
+
/* @__PURE__ */ jsxs5(Text6, { color: isSelected ? "green" : void 0, children: [
|
|
2730
3388
|
remote.name,
|
|
2731
3389
|
" (",
|
|
2732
3390
|
remote.url,
|
|
2733
3391
|
")"
|
|
2734
3392
|
] }),
|
|
2735
|
-
/* @__PURE__ */
|
|
3393
|
+
/* @__PURE__ */ jsx7(Text6, { dimColor: true, children: indicator })
|
|
2736
3394
|
] }, remote.name);
|
|
2737
3395
|
}) })
|
|
2738
3396
|
] }) });
|
|
2739
3397
|
}
|
|
2740
3398
|
|
|
2741
3399
|
// src/components/github/GitHubView.tsx
|
|
2742
|
-
import { jsx as
|
|
3400
|
+
import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
2743
3401
|
function GitHubView({ isActive, onFocusedBoxChange, onLogUpdated }) {
|
|
2744
3402
|
const repo = useGitRepo();
|
|
2745
3403
|
const pullRequests = usePullRequests();
|
|
2746
|
-
const [focusedBox, setFocusedBox] =
|
|
2747
|
-
const [isGeneratingPR, setIsGeneratingPR] =
|
|
3404
|
+
const [focusedBox, setFocusedBox] = useState12("remotes");
|
|
3405
|
+
const [isGeneratingPR, setIsGeneratingPR] = useState12(false);
|
|
2748
3406
|
const claudeProcessRef = useRef5(null);
|
|
2749
3407
|
const previewScrollRef = useRef5(null);
|
|
2750
|
-
const [prPreview, setPrPreview] =
|
|
2751
|
-
|
|
3408
|
+
const [prPreview, setPrPreview] = useState12(null);
|
|
3409
|
+
useEffect9(() => {
|
|
2752
3410
|
if (repo.loading || !repo.currentBranch || !repo.currentRepoSlug) return;
|
|
2753
3411
|
pullRequests.fetchPRsAndDetails(repo.currentBranch, repo.currentRepoSlug);
|
|
2754
3412
|
}, [repo.loading, repo.currentBranch, repo.currentRepoSlug, pullRequests.fetchPRsAndDetails]);
|
|
2755
|
-
|
|
3413
|
+
useEffect9(() => {
|
|
2756
3414
|
if (isActive) {
|
|
2757
3415
|
repo.refreshBranch();
|
|
2758
3416
|
}
|
|
2759
3417
|
}, [isActive, repo.refreshBranch]);
|
|
2760
|
-
|
|
3418
|
+
useEffect9(() => {
|
|
2761
3419
|
onFocusedBoxChange == null ? void 0 : onFocusedBoxChange(focusedBox);
|
|
2762
3420
|
}, [focusedBox, onFocusedBoxChange]);
|
|
2763
3421
|
const handleRemoteSelect = useCallback8(
|
|
@@ -2776,7 +3434,7 @@ function GitHubView({ isActive, onFocusedBoxChange, onLogUpdated }) {
|
|
|
2776
3434
|
onLogUpdatedRef.current = onLogUpdated;
|
|
2777
3435
|
const prsRef = useRef5(pullRequests.prs);
|
|
2778
3436
|
prsRef.current = pullRequests.prs;
|
|
2779
|
-
|
|
3437
|
+
useEffect9(() => {
|
|
2780
3438
|
return () => {
|
|
2781
3439
|
var _a;
|
|
2782
3440
|
(_a = claudeProcessRef.current) == null ? void 0 : _a.cancel();
|
|
@@ -2799,9 +3457,9 @@ function GitHubView({ isActive, onFocusedBoxChange, onLogUpdated }) {
|
|
|
2799
3457
|
const branch = repo.currentBranch;
|
|
2800
3458
|
const repoPath = repo.repoPath;
|
|
2801
3459
|
const owner = remoteResult.data.owner;
|
|
2802
|
-
const
|
|
2803
|
-
claudeProcessRef.current =
|
|
2804
|
-
|
|
3460
|
+
const process3 = generatePRContent();
|
|
3461
|
+
claudeProcessRef.current = process3;
|
|
3462
|
+
process3.promise.then((result) => {
|
|
2805
3463
|
claudeProcessRef.current = null;
|
|
2806
3464
|
setIsGeneratingPR(false);
|
|
2807
3465
|
if (!result.success) {
|
|
@@ -2955,10 +3613,10 @@ ${body}`;
|
|
|
2955
3613
|
{ isActive }
|
|
2956
3614
|
);
|
|
2957
3615
|
if (repo.isRepo === false) {
|
|
2958
|
-
return /* @__PURE__ */
|
|
3616
|
+
return /* @__PURE__ */ jsx8(TitledBox3, { borderStyle: "round", titles: ["Error"], flexGrow: 1, children: /* @__PURE__ */ jsx8(Text7, { color: "red", children: "Current directory is not a git repository" }) });
|
|
2959
3617
|
}
|
|
2960
|
-
return /* @__PURE__ */
|
|
2961
|
-
/* @__PURE__ */
|
|
3618
|
+
return /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", flexGrow: 1, children: [
|
|
3619
|
+
/* @__PURE__ */ jsx8(
|
|
2962
3620
|
RemotesBox,
|
|
2963
3621
|
{
|
|
2964
3622
|
remotes: repo.remotes,
|
|
@@ -2969,7 +3627,7 @@ ${body}`;
|
|
|
2969
3627
|
isActive: isActive && !prPreview && focusedBox === "remotes"
|
|
2970
3628
|
}
|
|
2971
3629
|
),
|
|
2972
|
-
/* @__PURE__ */
|
|
3630
|
+
/* @__PURE__ */ jsx8(
|
|
2973
3631
|
PullRequestsBox,
|
|
2974
3632
|
{
|
|
2975
3633
|
prs: pullRequests.prs,
|
|
@@ -2984,7 +3642,7 @@ ${body}`;
|
|
|
2984
3642
|
isGeneratingPR
|
|
2985
3643
|
}
|
|
2986
3644
|
),
|
|
2987
|
-
/* @__PURE__ */
|
|
3645
|
+
/* @__PURE__ */ jsx8(
|
|
2988
3646
|
PRDetailsBox,
|
|
2989
3647
|
{
|
|
2990
3648
|
pr: pullRequests.prDetails,
|
|
@@ -2993,28 +3651,28 @@ ${body}`;
|
|
|
2993
3651
|
isActive: isActive && !prPreview && focusedBox === "details"
|
|
2994
3652
|
}
|
|
2995
3653
|
),
|
|
2996
|
-
prPreview && /* @__PURE__ */
|
|
2997
|
-
/* @__PURE__ */
|
|
2998
|
-
/* @__PURE__ */
|
|
2999
|
-
/* @__PURE__ */
|
|
3000
|
-
/* @__PURE__ */
|
|
3654
|
+
prPreview && /* @__PURE__ */ jsx8(TitledBox3, { borderStyle: "round", titles: ["PR Preview"], borderColor: "yellow", flexGrow: 1, flexBasis: 0, children: /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", paddingX: 1, flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
|
|
3655
|
+
/* @__PURE__ */ jsx8(Box6, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: /* @__PURE__ */ jsx8(ScrollView4, { ref: previewScrollRef, children: /* @__PURE__ */ jsxs6(Box6, { flexDirection: "column", children: [
|
|
3656
|
+
/* @__PURE__ */ jsx8(Text7, { bold: true, children: prPreview.title }),
|
|
3657
|
+
/* @__PURE__ */ jsx8(Text7, { children: "" }),
|
|
3658
|
+
/* @__PURE__ */ jsx8(Text7, { children: prPreview.body })
|
|
3001
3659
|
] }) }) }),
|
|
3002
|
-
/* @__PURE__ */
|
|
3660
|
+
/* @__PURE__ */ jsx8(Text7, { dimColor: true, children: "Enter to apply, Esc to dismiss, j/k to scroll" })
|
|
3003
3661
|
] }) })
|
|
3004
3662
|
] });
|
|
3005
3663
|
}
|
|
3006
3664
|
|
|
3007
3665
|
// src/components/jira-browser/JiraBrowserView.tsx
|
|
3008
|
-
import { useCallback as useCallback10, useEffect as
|
|
3666
|
+
import { useCallback as useCallback10, useEffect as useEffect13, useMemo as useMemo3, useRef as useRef7, useState as useState17 } from "react";
|
|
3009
3667
|
import { Box as Box12, useInput as useInput10 } from "ink";
|
|
3010
3668
|
|
|
3011
3669
|
// src/components/jira-browser/AddViewModal.tsx
|
|
3012
|
-
import { useState as
|
|
3013
|
-
import { Box as Box8, Text as
|
|
3670
|
+
import { useState as useState13 } from "react";
|
|
3671
|
+
import { Box as Box8, Text as Text9, useInput as useInput6 } from "ink";
|
|
3014
3672
|
|
|
3015
3673
|
// src/components/ui/TextInput.tsx
|
|
3016
|
-
import { Box as Box7, Text as
|
|
3017
|
-
import { jsx as
|
|
3674
|
+
import { Box as Box7, Text as Text8, useInput as useInput5 } from "ink";
|
|
3675
|
+
import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
3018
3676
|
function TextInput({ value, onChange, placeholder, isActive, mask }) {
|
|
3019
3677
|
useInput5(
|
|
3020
3678
|
(input, key) => {
|
|
@@ -3038,18 +3696,18 @@ function TextInput({ value, onChange, placeholder, isActive, mask }) {
|
|
|
3038
3696
|
);
|
|
3039
3697
|
const displayValue = mask ? "*".repeat(value.length) : value;
|
|
3040
3698
|
const showPlaceholder = value.length === 0 && placeholder;
|
|
3041
|
-
return /* @__PURE__ */
|
|
3042
|
-
showPlaceholder ? /* @__PURE__ */
|
|
3043
|
-
isActive && /* @__PURE__ */
|
|
3699
|
+
return /* @__PURE__ */ jsx9(Box7, { children: /* @__PURE__ */ jsxs7(Text8, { children: [
|
|
3700
|
+
showPlaceholder ? /* @__PURE__ */ jsx9(Text8, { dimColor: true, children: placeholder }) : /* @__PURE__ */ jsx9(Text8, { children: displayValue }),
|
|
3701
|
+
isActive && /* @__PURE__ */ jsx9(Text8, { backgroundColor: "yellow", children: " " })
|
|
3044
3702
|
] }) });
|
|
3045
3703
|
}
|
|
3046
3704
|
|
|
3047
3705
|
// src/components/jira-browser/AddViewModal.tsx
|
|
3048
|
-
import { jsx as
|
|
3706
|
+
import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
3049
3707
|
function AddViewModal({ onSubmit, onCancel, loading, error }) {
|
|
3050
|
-
const [url, setUrl] =
|
|
3051
|
-
const [name, setName] =
|
|
3052
|
-
const [activeField, setActiveField] =
|
|
3708
|
+
const [url, setUrl] = useState13("");
|
|
3709
|
+
const [name, setName] = useState13("");
|
|
3710
|
+
const [activeField, setActiveField] = useState13("url");
|
|
3053
3711
|
const canSubmit = url.trim().length > 0;
|
|
3054
3712
|
useInput6(
|
|
3055
3713
|
(_input, key) => {
|
|
@@ -3069,14 +3727,14 @@ function AddViewModal({ onSubmit, onCancel, loading, error }) {
|
|
|
3069
3727
|
},
|
|
3070
3728
|
{ isActive: !loading }
|
|
3071
3729
|
);
|
|
3072
|
-
return /* @__PURE__ */
|
|
3073
|
-
/* @__PURE__ */
|
|
3074
|
-
/* @__PURE__ */
|
|
3075
|
-
/* @__PURE__ */
|
|
3076
|
-
error && /* @__PURE__ */
|
|
3077
|
-
/* @__PURE__ */
|
|
3078
|
-
/* @__PURE__ */
|
|
3079
|
-
/* @__PURE__ */
|
|
3730
|
+
return /* @__PURE__ */ jsxs8(Box8, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
|
|
3731
|
+
/* @__PURE__ */ jsx10(Text9, { bold: true, color: "yellow", children: "Add Jira View" }),
|
|
3732
|
+
/* @__PURE__ */ jsx10(Text9, { dimColor: true, children: "Tab to switch fields, Enter to save, Esc to cancel" }),
|
|
3733
|
+
/* @__PURE__ */ jsx10(Box8, { marginTop: 1 }),
|
|
3734
|
+
error && /* @__PURE__ */ jsx10(Box8, { marginBottom: 1, children: /* @__PURE__ */ jsx10(Text9, { color: "red", children: error }) }),
|
|
3735
|
+
/* @__PURE__ */ jsxs8(Box8, { children: [
|
|
3736
|
+
/* @__PURE__ */ jsx10(Text9, { color: "blue", children: "URL: " }),
|
|
3737
|
+
/* @__PURE__ */ jsx10(
|
|
3080
3738
|
TextInput,
|
|
3081
3739
|
{
|
|
3082
3740
|
value: url,
|
|
@@ -3086,9 +3744,9 @@ function AddViewModal({ onSubmit, onCancel, loading, error }) {
|
|
|
3086
3744
|
}
|
|
3087
3745
|
)
|
|
3088
3746
|
] }),
|
|
3089
|
-
/* @__PURE__ */
|
|
3090
|
-
/* @__PURE__ */
|
|
3091
|
-
/* @__PURE__ */
|
|
3747
|
+
/* @__PURE__ */ jsxs8(Box8, { marginTop: 1, children: [
|
|
3748
|
+
/* @__PURE__ */ jsx10(Text9, { color: "blue", children: "Name: " }),
|
|
3749
|
+
/* @__PURE__ */ jsx10(
|
|
3092
3750
|
TextInput,
|
|
3093
3751
|
{
|
|
3094
3752
|
value: name,
|
|
@@ -3098,27 +3756,27 @@ function AddViewModal({ onSubmit, onCancel, loading, error }) {
|
|
|
3098
3756
|
}
|
|
3099
3757
|
)
|
|
3100
3758
|
] }),
|
|
3101
|
-
loading && /* @__PURE__ */
|
|
3102
|
-
/* @__PURE__ */
|
|
3759
|
+
loading && /* @__PURE__ */ jsx10(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx10(Text9, { color: "yellow", children: "Validating view..." }) }),
|
|
3760
|
+
/* @__PURE__ */ jsx10(Box8, { marginTop: 1, children: /* @__PURE__ */ jsx10(Text9, { dimColor: true, children: "Supports: filter URLs, JQL URLs, board URLs" }) })
|
|
3103
3761
|
] });
|
|
3104
3762
|
}
|
|
3105
3763
|
|
|
3106
3764
|
// src/components/jira-browser/JiraSavedViewBrowserBox.tsx
|
|
3107
3765
|
import open4 from "open";
|
|
3108
|
-
import { useCallback as useCallback9, useEffect as
|
|
3766
|
+
import { useCallback as useCallback9, useEffect as useEffect11, useMemo as useMemo2, useState as useState15 } from "react";
|
|
3109
3767
|
import { TitledBox as TitledBox4 } from "@mishieck/ink-titled-box";
|
|
3110
|
-
import { Box as Box10, Text as
|
|
3768
|
+
import { Box as Box10, Text as Text11, useInput as useInput8 } from "ink";
|
|
3111
3769
|
import { ScrollView as ScrollView6 } from "ink-scroll-view";
|
|
3112
|
-
import
|
|
3770
|
+
import Spinner2 from "ink-spinner";
|
|
3113
3771
|
|
|
3114
3772
|
// src/components/jira-browser/JiraIssueDetailView.tsx
|
|
3115
3773
|
import open3 from "open";
|
|
3116
|
-
import { useEffect as
|
|
3117
|
-
import { Box as Box9, Text as
|
|
3774
|
+
import { useEffect as useEffect10, useRef as useRef6, useState as useState14 } from "react";
|
|
3775
|
+
import { Box as Box9, Text as Text10, useInput as useInput7 } from "ink";
|
|
3118
3776
|
import { ScrollView as ScrollView5 } from "ink-scroll-view";
|
|
3119
3777
|
import SelectInput from "ink-select-input";
|
|
3120
|
-
import
|
|
3121
|
-
import { jsx as
|
|
3778
|
+
import Spinner from "ink-spinner";
|
|
3779
|
+
import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
3122
3780
|
function JiraIssueDetailView({
|
|
3123
3781
|
issueKey,
|
|
3124
3782
|
issueSummary,
|
|
@@ -3132,15 +3790,15 @@ function JiraIssueDetailView({
|
|
|
3132
3790
|
}) {
|
|
3133
3791
|
var _a, _b;
|
|
3134
3792
|
const scrollRef = useRef6(null);
|
|
3135
|
-
const [detail, setDetail] =
|
|
3136
|
-
const [loading, setLoading] =
|
|
3137
|
-
const [error, setError] =
|
|
3138
|
-
const [mode, setMode] =
|
|
3139
|
-
const [transitions, setTransitions] =
|
|
3140
|
-
const [transitionsLoading, setTransitionsLoading] =
|
|
3141
|
-
const [actionLoading, setActionLoading] =
|
|
3142
|
-
const [actionError, setActionError] =
|
|
3143
|
-
|
|
3793
|
+
const [detail, setDetail] = useState14(null);
|
|
3794
|
+
const [loading, setLoading] = useState14(true);
|
|
3795
|
+
const [error, setError] = useState14(null);
|
|
3796
|
+
const [mode, setMode] = useState14("normal");
|
|
3797
|
+
const [transitions, setTransitions] = useState14([]);
|
|
3798
|
+
const [transitionsLoading, setTransitionsLoading] = useState14(false);
|
|
3799
|
+
const [actionLoading, setActionLoading] = useState14(null);
|
|
3800
|
+
const [actionError, setActionError] = useState14(null);
|
|
3801
|
+
useEffect10(() => {
|
|
3144
3802
|
setLoading(true);
|
|
3145
3803
|
setError(null);
|
|
3146
3804
|
getIssueDetail(auth, issueKey).then((result) => {
|
|
@@ -3261,44 +3919,44 @@ function JiraIssueDetailView({
|
|
|
3261
3919
|
const descriptionMd = (detail == null ? void 0 : detail.fields.description) ? adfToMarkdown(detail.fields.description) : null;
|
|
3262
3920
|
const comments = (detail == null ? void 0 : detail.fields.comment.comments) ?? [];
|
|
3263
3921
|
const totalComments = (detail == null ? void 0 : detail.fields.comment.total) ?? 0;
|
|
3264
|
-
return /* @__PURE__ */
|
|
3265
|
-
/* @__PURE__ */
|
|
3266
|
-
loading && /* @__PURE__ */
|
|
3267
|
-
/* @__PURE__ */
|
|
3922
|
+
return /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", flexGrow: 1, children: [
|
|
3923
|
+
/* @__PURE__ */ jsxs9(Box9, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
|
|
3924
|
+
loading && /* @__PURE__ */ jsx11(Box9, { paddingX: 1, children: /* @__PURE__ */ jsxs9(Text10, { color: "yellow", children: [
|
|
3925
|
+
/* @__PURE__ */ jsx11(Spinner, { type: "dots" }),
|
|
3268
3926
|
" Loading issue details..."
|
|
3269
3927
|
] }) }),
|
|
3270
|
-
error && /* @__PURE__ */
|
|
3271
|
-
!loading && !error && detail && /* @__PURE__ */
|
|
3272
|
-
/* @__PURE__ */
|
|
3273
|
-
/* @__PURE__ */
|
|
3274
|
-
/* @__PURE__ */
|
|
3928
|
+
error && /* @__PURE__ */ jsx11(Box9, { paddingX: 1, children: /* @__PURE__ */ jsx11(Text10, { color: "red", children: error }) }),
|
|
3929
|
+
!loading && !error && detail && /* @__PURE__ */ jsx11(ScrollView5, { ref: scrollRef, children: /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", paddingX: 1, children: [
|
|
3930
|
+
/* @__PURE__ */ jsxs9(Box9, { children: [
|
|
3931
|
+
/* @__PURE__ */ jsx11(Text10, { bold: true, color: "blue", children: detail.key }),
|
|
3932
|
+
/* @__PURE__ */ jsxs9(Text10, { bold: true, children: [
|
|
3275
3933
|
" ",
|
|
3276
3934
|
detail.fields.summary
|
|
3277
3935
|
] })
|
|
3278
3936
|
] }),
|
|
3279
|
-
/* @__PURE__ */
|
|
3280
|
-
/* @__PURE__ */
|
|
3281
|
-
/* @__PURE__ */
|
|
3282
|
-
/* @__PURE__ */
|
|
3283
|
-
/* @__PURE__ */
|
|
3284
|
-
/* @__PURE__ */
|
|
3285
|
-
/* @__PURE__ */
|
|
3937
|
+
/* @__PURE__ */ jsxs9(Box9, { gap: 1, children: [
|
|
3938
|
+
/* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Status:" }),
|
|
3939
|
+
/* @__PURE__ */ jsx11(Text10, { color: statusColor, children: detail.fields.status.name }),
|
|
3940
|
+
/* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Assignee:" }),
|
|
3941
|
+
/* @__PURE__ */ jsx11(Text10, { children: ((_a = detail.fields.assignee) == null ? void 0 : _a.displayName) ?? "Unassigned" }),
|
|
3942
|
+
/* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Reporter:" }),
|
|
3943
|
+
/* @__PURE__ */ jsx11(Text10, { children: ((_b = detail.fields.reporter) == null ? void 0 : _b.displayName) ?? "Unknown" })
|
|
3286
3944
|
] }),
|
|
3287
|
-
/* @__PURE__ */
|
|
3288
|
-
/* @__PURE__ */
|
|
3289
|
-
/* @__PURE__ */
|
|
3290
|
-
descriptionMd ? /* @__PURE__ */
|
|
3945
|
+
/* @__PURE__ */ jsx11(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx11(Divider, {}) }),
|
|
3946
|
+
/* @__PURE__ */ jsxs9(Box9, { marginTop: 1, flexDirection: "column", children: [
|
|
3947
|
+
/* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Description:" }),
|
|
3948
|
+
descriptionMd ? /* @__PURE__ */ jsx11(Markdown, { children: descriptionMd }) : /* @__PURE__ */ jsx11(Text10, { dimColor: true, italic: true, children: "No description" })
|
|
3291
3949
|
] }),
|
|
3292
|
-
/* @__PURE__ */
|
|
3293
|
-
/* @__PURE__ */
|
|
3294
|
-
/* @__PURE__ */
|
|
3950
|
+
/* @__PURE__ */ jsx11(Box9, { marginTop: 1, children: /* @__PURE__ */ jsx11(Divider, {}) }),
|
|
3951
|
+
/* @__PURE__ */ jsxs9(Box9, { marginTop: 1, flexDirection: "column", children: [
|
|
3952
|
+
/* @__PURE__ */ jsxs9(Text10, { dimColor: true, children: [
|
|
3295
3953
|
"Comments (",
|
|
3296
3954
|
totalComments,
|
|
3297
3955
|
"):"
|
|
3298
3956
|
] }),
|
|
3299
|
-
comments.length === 0 && /* @__PURE__ */
|
|
3300
|
-
comments.map((comment) => /* @__PURE__ */
|
|
3301
|
-
comments.length < totalComments && /* @__PURE__ */
|
|
3957
|
+
comments.length === 0 && /* @__PURE__ */ jsx11(Text10, { dimColor: true, italic: true, children: "No comments" }),
|
|
3958
|
+
comments.map((comment) => /* @__PURE__ */ jsx11(CommentBlock, { comment }, comment.id)),
|
|
3959
|
+
comments.length < totalComments && /* @__PURE__ */ jsx11(Box9, { marginTop: 1, children: /* @__PURE__ */ jsxs9(Text10, { dimColor: true, children: [
|
|
3302
3960
|
"Showing ",
|
|
3303
3961
|
comments.length,
|
|
3304
3962
|
" of ",
|
|
@@ -3308,40 +3966,40 @@ function JiraIssueDetailView({
|
|
|
3308
3966
|
] })
|
|
3309
3967
|
] }) })
|
|
3310
3968
|
] }),
|
|
3311
|
-
mode === "transitions" && /* @__PURE__ */
|
|
3312
|
-
/* @__PURE__ */
|
|
3313
|
-
/* @__PURE__ */
|
|
3969
|
+
mode === "transitions" && /* @__PURE__ */ jsxs9(Box9, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, children: [
|
|
3970
|
+
/* @__PURE__ */ jsx11(Text10, { bold: true, color: "yellow", children: "Change Status" }),
|
|
3971
|
+
/* @__PURE__ */ jsx11(
|
|
3314
3972
|
SelectInput,
|
|
3315
3973
|
{
|
|
3316
3974
|
items: transitions.map((t) => ({ label: t.name, value: t.id })),
|
|
3317
3975
|
onSelect: handleTransitionSelect
|
|
3318
3976
|
}
|
|
3319
3977
|
),
|
|
3320
|
-
/* @__PURE__ */
|
|
3978
|
+
/* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Esc to cancel" })
|
|
3321
3979
|
] }),
|
|
3322
|
-
/* @__PURE__ */
|
|
3323
|
-
actionLoading && /* @__PURE__ */
|
|
3324
|
-
/* @__PURE__ */
|
|
3980
|
+
/* @__PURE__ */ jsxs9(Box9, { paddingX: 1, flexDirection: "column", children: [
|
|
3981
|
+
actionLoading && /* @__PURE__ */ jsxs9(Text10, { color: "yellow", children: [
|
|
3982
|
+
/* @__PURE__ */ jsx11(Spinner, { type: "dots" }),
|
|
3325
3983
|
" ",
|
|
3326
3984
|
actionLoading
|
|
3327
3985
|
] }),
|
|
3328
|
-
actionError && /* @__PURE__ */
|
|
3329
|
-
transitionsLoading && /* @__PURE__ */
|
|
3330
|
-
/* @__PURE__ */
|
|
3986
|
+
actionError && /* @__PURE__ */ jsx11(Text10, { color: "red", children: actionError }),
|
|
3987
|
+
transitionsLoading && /* @__PURE__ */ jsxs9(Text10, { color: "yellow", children: [
|
|
3988
|
+
/* @__PURE__ */ jsx11(Spinner, { type: "dots" }),
|
|
3331
3989
|
" Loading transitions..."
|
|
3332
3990
|
] }),
|
|
3333
|
-
!actionLoading && !transitionsLoading && mode === "normal" && /* @__PURE__ */
|
|
3991
|
+
!actionLoading && !transitionsLoading && mode === "normal" && /* @__PURE__ */ jsx11(Text10, { dimColor: true, children: "Esc close \xB7 j/k scroll \xB7 s status \xB7 a assign \xB7 A unassign \xB7 o open \xB7 y copy" })
|
|
3334
3992
|
] })
|
|
3335
3993
|
] });
|
|
3336
3994
|
}
|
|
3337
3995
|
function CommentBlock({ comment }) {
|
|
3338
3996
|
const bodyMd = adfToMarkdown(comment.body);
|
|
3339
|
-
return /* @__PURE__ */
|
|
3340
|
-
/* @__PURE__ */
|
|
3341
|
-
/* @__PURE__ */
|
|
3342
|
-
/* @__PURE__ */
|
|
3997
|
+
return /* @__PURE__ */ jsxs9(Box9, { marginTop: 1, flexDirection: "column", children: [
|
|
3998
|
+
/* @__PURE__ */ jsxs9(Box9, { gap: 1, children: [
|
|
3999
|
+
/* @__PURE__ */ jsx11(Text10, { bold: true, children: comment.author.displayName }),
|
|
4000
|
+
/* @__PURE__ */ jsx11(Text10, { dimColor: true, children: timeAgo(comment.created) })
|
|
3343
4001
|
] }),
|
|
3344
|
-
bodyMd ? /* @__PURE__ */
|
|
4002
|
+
bodyMd ? /* @__PURE__ */ jsx11(Markdown, { children: bodyMd }) : /* @__PURE__ */ jsx11(Text10, { dimColor: true, italic: true, children: "Empty comment" })
|
|
3345
4003
|
] });
|
|
3346
4004
|
}
|
|
3347
4005
|
function getStatusColor(status) {
|
|
@@ -3352,7 +4010,7 @@ function getStatusColor(status) {
|
|
|
3352
4010
|
}
|
|
3353
4011
|
|
|
3354
4012
|
// src/components/jira-browser/JiraSavedViewBrowserBox.tsx
|
|
3355
|
-
import { Fragment as
|
|
4013
|
+
import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
3356
4014
|
function groupBySprint(issues) {
|
|
3357
4015
|
const groups = /* @__PURE__ */ new Map();
|
|
3358
4016
|
for (const issue of issues) {
|
|
@@ -3400,17 +4058,17 @@ function JiraSavedViewBrowserBox({
|
|
|
3400
4058
|
onInputModeChange,
|
|
3401
4059
|
onLogUpdated
|
|
3402
4060
|
}) {
|
|
3403
|
-
const [issues, setIssues] =
|
|
3404
|
-
const [loading, setLoading] =
|
|
3405
|
-
const [error, setError] =
|
|
3406
|
-
const [total, setTotal] =
|
|
3407
|
-
const [highlightedIndex, setHighlightedIndex] =
|
|
3408
|
-
const [inputText, setInputText] =
|
|
3409
|
-
const [searchText, setSearchText] =
|
|
3410
|
-
const [isFiltering, setIsFiltering] =
|
|
3411
|
-
const [assigneeFilter, setAssigneeFilter] =
|
|
3412
|
-
const [detailIssue, setDetailIssue] =
|
|
3413
|
-
|
|
4061
|
+
const [issues, setIssues] = useState15([]);
|
|
4062
|
+
const [loading, setLoading] = useState15(false);
|
|
4063
|
+
const [error, setError] = useState15(null);
|
|
4064
|
+
const [total, setTotal] = useState15(0);
|
|
4065
|
+
const [highlightedIndex, setHighlightedIndex] = useState15(0);
|
|
4066
|
+
const [inputText, setInputText] = useState15("");
|
|
4067
|
+
const [searchText, setSearchText] = useState15("");
|
|
4068
|
+
const [isFiltering, setIsFiltering] = useState15(false);
|
|
4069
|
+
const [assigneeFilter, setAssigneeFilter] = useState15("all");
|
|
4070
|
+
const [detailIssue, setDetailIssue] = useState15(null);
|
|
4071
|
+
useEffect11(() => {
|
|
3414
4072
|
onInputModeChange == null ? void 0 : onInputModeChange(isFiltering || detailIssue !== null);
|
|
3415
4073
|
}, [isFiltering, detailIssue, onInputModeChange]);
|
|
3416
4074
|
const title = "[6] Issues";
|
|
@@ -3470,7 +4128,7 @@ function JiraSavedViewBrowserBox({
|
|
|
3470
4128
|
},
|
|
3471
4129
|
[view, auth]
|
|
3472
4130
|
);
|
|
3473
|
-
|
|
4131
|
+
useEffect11(() => {
|
|
3474
4132
|
if (view && auth) {
|
|
3475
4133
|
setSearchText("");
|
|
3476
4134
|
setInputText("");
|
|
@@ -3594,7 +4252,7 @@ function JiraSavedViewBrowserBox({
|
|
|
3594
4252
|
if (assigneeFilter === "unassigned") filterParts.push("unassigned");
|
|
3595
4253
|
if (assigneeFilter === "me") filterParts.push("mine");
|
|
3596
4254
|
if (searchText) filterParts.push(`"${searchText}"`);
|
|
3597
|
-
return /* @__PURE__ */
|
|
4255
|
+
return /* @__PURE__ */ jsx12(TitledBox4, { borderStyle: "round", titles: [displayTitle], borderColor, flexGrow: 1, children: /* @__PURE__ */ jsx12(Box10, { flexDirection: "column", flexGrow: 1, children: detailIssue && auth ? /* @__PURE__ */ jsx12(
|
|
3598
4256
|
JiraIssueDetailView,
|
|
3599
4257
|
{
|
|
3600
4258
|
issueKey: detailIssue.key,
|
|
@@ -3607,15 +4265,15 @@ function JiraSavedViewBrowserBox({
|
|
|
3607
4265
|
onIssueUpdated: handleIssueUpdated,
|
|
3608
4266
|
onLogUpdated
|
|
3609
4267
|
}
|
|
3610
|
-
) : /* @__PURE__ */
|
|
3611
|
-
(isFiltering || hasActiveFilters) && /* @__PURE__ */
|
|
3612
|
-
/* @__PURE__ */
|
|
3613
|
-
isFiltering ? /* @__PURE__ */
|
|
3614
|
-
/* @__PURE__ */
|
|
3615
|
-
/* @__PURE__ */
|
|
3616
|
-
] }) : /* @__PURE__ */
|
|
3617
|
-
/* @__PURE__ */
|
|
3618
|
-
/* @__PURE__ */
|
|
4268
|
+
) : /* @__PURE__ */ jsxs10(Fragment3, { children: [
|
|
4269
|
+
(isFiltering || hasActiveFilters) && /* @__PURE__ */ jsxs10(Box10, { paddingX: 1, children: [
|
|
4270
|
+
/* @__PURE__ */ jsx12(Text11, { color: "blue", children: "Search: " }),
|
|
4271
|
+
isFiltering ? /* @__PURE__ */ jsxs10(Fragment3, { children: [
|
|
4272
|
+
/* @__PURE__ */ jsx12(Text11, { children: inputText }),
|
|
4273
|
+
/* @__PURE__ */ jsx12(Text11, { backgroundColor: "yellow", children: " " })
|
|
4274
|
+
] }) : /* @__PURE__ */ jsxs10(Fragment3, { children: [
|
|
4275
|
+
/* @__PURE__ */ jsx12(Text11, { children: filterParts.join(" + ") }),
|
|
4276
|
+
/* @__PURE__ */ jsxs10(Text11, { dimColor: true, children: [
|
|
3619
4277
|
" ",
|
|
3620
4278
|
"(",
|
|
3621
4279
|
filteredIssues.length,
|
|
@@ -3625,38 +4283,38 @@ function JiraSavedViewBrowserBox({
|
|
|
3625
4283
|
] })
|
|
3626
4284
|
] })
|
|
3627
4285
|
] }),
|
|
3628
|
-
/* @__PURE__ */
|
|
3629
|
-
!view && /* @__PURE__ */
|
|
3630
|
-
view && loading && issues.length === 0 && /* @__PURE__ */
|
|
3631
|
-
/* @__PURE__ */
|
|
4286
|
+
/* @__PURE__ */ jsxs10(Box10, { flexGrow: 1, flexBasis: 0, overflow: "hidden", children: [
|
|
4287
|
+
!view && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: "Select a view to browse issues" }) }),
|
|
4288
|
+
view && loading && issues.length === 0 && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsxs10(Text11, { color: "yellow", children: [
|
|
4289
|
+
/* @__PURE__ */ jsx12(Spinner2, { type: "dots" }),
|
|
3632
4290
|
" Loading issues..."
|
|
3633
4291
|
] }) }),
|
|
3634
|
-
view && error && /* @__PURE__ */
|
|
3635
|
-
view && !loading && !error && issues.length === 0 && /* @__PURE__ */
|
|
3636
|
-
view && !loading && !error && filteredIssues.length === 0 && issues.length > 0 && /* @__PURE__ */
|
|
3637
|
-
rows.length > 0 && /* @__PURE__ */
|
|
4292
|
+
view && error && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text11, { color: "red", children: error }) }),
|
|
4293
|
+
view && !loading && !error && issues.length === 0 && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: searchText ? "No issues match search" : "No issues found" }) }),
|
|
4294
|
+
view && !loading && !error && filteredIssues.length === 0 && issues.length > 0 && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: "No issues match filter" }) }),
|
|
4295
|
+
rows.length > 0 && /* @__PURE__ */ jsx12(ScrollView6, { ref: scrollRef, children: rows.map((row, rowIdx) => {
|
|
3638
4296
|
if (row.type === "header") {
|
|
3639
4297
|
const stateLabel = row.state === "active" ? " (active)" : "";
|
|
3640
|
-
return /* @__PURE__ */
|
|
4298
|
+
return /* @__PURE__ */ jsx12(Box10, { paddingX: 1, marginTop: rowIdx > 0 ? 1 : 0, children: /* @__PURE__ */ jsxs10(Text11, { bold: true, color: "magenta", children: [
|
|
3641
4299
|
row.label,
|
|
3642
|
-
stateLabel && /* @__PURE__ */
|
|
4300
|
+
stateLabel && /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: stateLabel })
|
|
3643
4301
|
] }) }, `header-${row.label}`);
|
|
3644
4302
|
}
|
|
3645
4303
|
const navIdx = navigableIndices.indexOf(rowIdx);
|
|
3646
4304
|
const isHighlighted = navIdx === highlightedIndex;
|
|
3647
4305
|
const cursor = isHighlighted ? ">" : " ";
|
|
3648
4306
|
const statusColor = getStatusColor2(row.issue.fields.status.name);
|
|
3649
|
-
return /* @__PURE__ */
|
|
3650
|
-
/* @__PURE__ */
|
|
4307
|
+
return /* @__PURE__ */ jsxs10(Box10, { paddingX: 1, children: [
|
|
4308
|
+
/* @__PURE__ */ jsxs10(Text11, { color: isHighlighted ? "yellow" : void 0, children: [
|
|
3651
4309
|
cursor,
|
|
3652
4310
|
" "
|
|
3653
4311
|
] }),
|
|
3654
|
-
/* @__PURE__ */
|
|
3655
|
-
/* @__PURE__ */
|
|
4312
|
+
/* @__PURE__ */ jsx12(Text11, { bold: true, color: "blue", children: row.issue.key }),
|
|
4313
|
+
/* @__PURE__ */ jsxs10(Text11, { children: [
|
|
3656
4314
|
" ",
|
|
3657
4315
|
row.issue.fields.summary
|
|
3658
4316
|
] }),
|
|
3659
|
-
/* @__PURE__ */
|
|
4317
|
+
/* @__PURE__ */ jsxs10(Text11, { color: statusColor, children: [
|
|
3660
4318
|
" [",
|
|
3661
4319
|
row.issue.fields.status.name,
|
|
3662
4320
|
"]"
|
|
@@ -3664,14 +4322,14 @@ function JiraSavedViewBrowserBox({
|
|
|
3664
4322
|
] }, row.issue.key);
|
|
3665
4323
|
}) })
|
|
3666
4324
|
] }),
|
|
3667
|
-
view && !loading && issues.length > 0 && /* @__PURE__ */
|
|
4325
|
+
view && !loading && issues.length > 0 && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsxs10(Text11, { dimColor: true, children: [
|
|
3668
4326
|
issues.length,
|
|
3669
4327
|
" of ",
|
|
3670
4328
|
total,
|
|
3671
4329
|
" loaded",
|
|
3672
4330
|
hasMore && " \xB7 l to load more"
|
|
3673
4331
|
] }) }),
|
|
3674
|
-
view && loading && issues.length > 0 && /* @__PURE__ */
|
|
4332
|
+
view && loading && issues.length > 0 && /* @__PURE__ */ jsx12(Box10, { paddingX: 1, children: /* @__PURE__ */ jsx12(Text11, { dimColor: true, children: "Loading more..." }) })
|
|
3675
4333
|
] }) }) });
|
|
3676
4334
|
}
|
|
3677
4335
|
function getStatusColor2(status) {
|
|
@@ -3682,11 +4340,11 @@ function getStatusColor2(status) {
|
|
|
3682
4340
|
}
|
|
3683
4341
|
|
|
3684
4342
|
// src/components/jira-browser/JiraSavedViewsBox.tsx
|
|
3685
|
-
import { useEffect as
|
|
4343
|
+
import { useEffect as useEffect12, useState as useState16 } from "react";
|
|
3686
4344
|
import { TitledBox as TitledBox5 } from "@mishieck/ink-titled-box";
|
|
3687
|
-
import { Box as Box11, Text as
|
|
4345
|
+
import { Box as Box11, Text as Text12, useInput as useInput9 } from "ink";
|
|
3688
4346
|
import { ScrollView as ScrollView7 } from "ink-scroll-view";
|
|
3689
|
-
import { Fragment as
|
|
4347
|
+
import { Fragment as Fragment4, jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
3690
4348
|
function JiraSavedViewsBox({
|
|
3691
4349
|
views,
|
|
3692
4350
|
selectedViewId,
|
|
@@ -3700,9 +4358,9 @@ function JiraSavedViewsBox({
|
|
|
3700
4358
|
onInputModeChange
|
|
3701
4359
|
}) {
|
|
3702
4360
|
const scrollRef = useScrollToIndex(highlightedIndex);
|
|
3703
|
-
const [renaming, setRenaming] =
|
|
3704
|
-
const [renameValue, setRenameValue] =
|
|
3705
|
-
|
|
4361
|
+
const [renaming, setRenaming] = useState16(null);
|
|
4362
|
+
const [renameValue, setRenameValue] = useState16("");
|
|
4363
|
+
useEffect12(() => {
|
|
3706
4364
|
onInputModeChange == null ? void 0 : onInputModeChange(renaming !== null);
|
|
3707
4365
|
}, [renaming, onInputModeChange]);
|
|
3708
4366
|
const title = "[5] Views";
|
|
@@ -3755,23 +4413,23 @@ function JiraSavedViewsBox({
|
|
|
3755
4413
|
},
|
|
3756
4414
|
{ isActive }
|
|
3757
4415
|
);
|
|
3758
|
-
return /* @__PURE__ */
|
|
3759
|
-
views.length === 0 && /* @__PURE__ */
|
|
3760
|
-
views.length > 0 && /* @__PURE__ */
|
|
4416
|
+
return /* @__PURE__ */ jsx13(TitledBox5, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs11(Box11, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
|
|
4417
|
+
views.length === 0 && /* @__PURE__ */ jsx13(Text12, { dimColor: true, children: "No saved views" }),
|
|
4418
|
+
views.length > 0 && /* @__PURE__ */ jsx13(ScrollView7, { ref: scrollRef, children: views.map((view, idx) => {
|
|
3761
4419
|
const isHighlighted = isActive && idx === highlightedIndex;
|
|
3762
4420
|
const isSelected = view.id === selectedViewId;
|
|
3763
4421
|
const isRenaming = view.id === renaming;
|
|
3764
4422
|
const cursor = isHighlighted ? ">" : " ";
|
|
3765
4423
|
const nameColor = isSelected ? "green" : void 0;
|
|
3766
4424
|
const indicator = isSelected ? " *" : "";
|
|
3767
|
-
return /* @__PURE__ */
|
|
3768
|
-
/* @__PURE__ */
|
|
4425
|
+
return /* @__PURE__ */ jsxs11(Box11, { children: [
|
|
4426
|
+
/* @__PURE__ */ jsxs11(Text12, { color: isHighlighted ? "yellow" : void 0, children: [
|
|
3769
4427
|
cursor,
|
|
3770
4428
|
" "
|
|
3771
4429
|
] }),
|
|
3772
|
-
isRenaming ? /* @__PURE__ */
|
|
3773
|
-
/* @__PURE__ */
|
|
3774
|
-
/* @__PURE__ */
|
|
4430
|
+
isRenaming ? /* @__PURE__ */ jsx13(TextInput, { value: renameValue, onChange: setRenameValue, isActive: true }) : /* @__PURE__ */ jsxs11(Fragment4, { children: [
|
|
4431
|
+
/* @__PURE__ */ jsx13(Text12, { color: nameColor, children: view.name }),
|
|
4432
|
+
/* @__PURE__ */ jsx13(Text12, { dimColor: true, children: indicator })
|
|
3775
4433
|
] })
|
|
3776
4434
|
] }, view.id);
|
|
3777
4435
|
}) })
|
|
@@ -3779,7 +4437,7 @@ function JiraSavedViewsBox({
|
|
|
3779
4437
|
}
|
|
3780
4438
|
|
|
3781
4439
|
// src/components/jira-browser/JiraBrowserView.tsx
|
|
3782
|
-
import { jsx as
|
|
4440
|
+
import { jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
3783
4441
|
function JiraBrowserView({
|
|
3784
4442
|
isActive,
|
|
3785
4443
|
focusedBox,
|
|
@@ -3789,14 +4447,14 @@ function JiraBrowserView({
|
|
|
3789
4447
|
}) {
|
|
3790
4448
|
const repo = useGitRepo();
|
|
3791
4449
|
const modal = useModal();
|
|
3792
|
-
const [views, setViews] =
|
|
3793
|
-
const [selectedViewId, setSelectedViewId] =
|
|
3794
|
-
const [highlightedIndex, setHighlightedIndex] =
|
|
3795
|
-
const [addError, setAddError] =
|
|
3796
|
-
const [addLoading, setAddLoading] =
|
|
3797
|
-
const [myAccountId, setMyAccountId] =
|
|
3798
|
-
const [myDisplayName, setMyDisplayName] =
|
|
3799
|
-
const [inputModeActive, setInputModeActive] =
|
|
4450
|
+
const [views, setViews] = useState17([]);
|
|
4451
|
+
const [selectedViewId, setSelectedViewId] = useState17(null);
|
|
4452
|
+
const [highlightedIndex, setHighlightedIndex] = useState17(0);
|
|
4453
|
+
const [addError, setAddError] = useState17(void 0);
|
|
4454
|
+
const [addLoading, setAddLoading] = useState17(false);
|
|
4455
|
+
const [myAccountId, setMyAccountId] = useState17(null);
|
|
4456
|
+
const [myDisplayName, setMyDisplayName] = useState17(null);
|
|
4457
|
+
const [inputModeActive, setInputModeActive] = useState17(false);
|
|
3800
4458
|
const lastRepoRef = useRef7(null);
|
|
3801
4459
|
const auth = useMemo3(() => {
|
|
3802
4460
|
if (!repo.repoPath || !isJiraConfigured(repo.repoPath)) return null;
|
|
@@ -3806,7 +4464,7 @@ function JiraBrowserView({
|
|
|
3806
4464
|
return { siteUrl, email: creds.email, apiToken: creds.apiToken };
|
|
3807
4465
|
}, [repo.repoPath]);
|
|
3808
4466
|
const selectedView = useMemo3(() => views.find((v) => v.id === selectedViewId) ?? null, [views, selectedViewId]);
|
|
3809
|
-
|
|
4467
|
+
useEffect13(() => {
|
|
3810
4468
|
if (!repo.repoPath || repo.repoPath === lastRepoRef.current) return;
|
|
3811
4469
|
lastRepoRef.current = repo.repoPath;
|
|
3812
4470
|
const loaded = getSavedViews(repo.repoPath);
|
|
@@ -3815,7 +4473,7 @@ function JiraBrowserView({
|
|
|
3815
4473
|
setSelectedViewId(loaded[0].id);
|
|
3816
4474
|
}
|
|
3817
4475
|
}, [repo.repoPath]);
|
|
3818
|
-
|
|
4476
|
+
useEffect13(() => {
|
|
3819
4477
|
if (!auth) {
|
|
3820
4478
|
setMyAccountId(null);
|
|
3821
4479
|
return;
|
|
@@ -3827,10 +4485,10 @@ function JiraBrowserView({
|
|
|
3827
4485
|
}
|
|
3828
4486
|
});
|
|
3829
4487
|
}, [auth == null ? void 0 : auth.siteUrl, auth == null ? void 0 : auth.email]);
|
|
3830
|
-
|
|
4488
|
+
useEffect13(() => {
|
|
3831
4489
|
onModalChange == null ? void 0 : onModalChange(modal.isOpen || inputModeActive);
|
|
3832
4490
|
}, [modal.isOpen, inputModeActive, onModalChange]);
|
|
3833
|
-
|
|
4491
|
+
useEffect13(() => {
|
|
3834
4492
|
if (!isActive) modal.close();
|
|
3835
4493
|
}, [isActive, modal.close]);
|
|
3836
4494
|
const refreshViews = useCallback10(() => {
|
|
@@ -3892,7 +4550,7 @@ function JiraBrowserView({
|
|
|
3892
4550
|
{ isActive: isActive && !modal.isOpen }
|
|
3893
4551
|
);
|
|
3894
4552
|
if (modal.type === "add") {
|
|
3895
|
-
return /* @__PURE__ */
|
|
4553
|
+
return /* @__PURE__ */ jsx14(Box12, { flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx14(
|
|
3896
4554
|
AddViewModal,
|
|
3897
4555
|
{
|
|
3898
4556
|
onSubmit: handleAddView,
|
|
@@ -3905,8 +4563,8 @@ function JiraBrowserView({
|
|
|
3905
4563
|
}
|
|
3906
4564
|
) });
|
|
3907
4565
|
}
|
|
3908
|
-
return /* @__PURE__ */
|
|
3909
|
-
/* @__PURE__ */
|
|
4566
|
+
return /* @__PURE__ */ jsxs12(Box12, { flexDirection: "column", flexGrow: 1, children: [
|
|
4567
|
+
/* @__PURE__ */ jsx14(
|
|
3910
4568
|
JiraSavedViewsBox,
|
|
3911
4569
|
{
|
|
3912
4570
|
views,
|
|
@@ -3921,7 +4579,7 @@ function JiraBrowserView({
|
|
|
3921
4579
|
onInputModeChange: setInputModeActive
|
|
3922
4580
|
}
|
|
3923
4581
|
),
|
|
3924
|
-
/* @__PURE__ */
|
|
4582
|
+
/* @__PURE__ */ jsx14(
|
|
3925
4583
|
JiraSavedViewBrowserBox,
|
|
3926
4584
|
{
|
|
3927
4585
|
view: selectedView,
|
|
@@ -3938,14 +4596,14 @@ function JiraBrowserView({
|
|
|
3938
4596
|
|
|
3939
4597
|
// src/components/jira/JiraView.tsx
|
|
3940
4598
|
import open5 from "open";
|
|
3941
|
-
import { useEffect as
|
|
4599
|
+
import { useEffect as useEffect15, useRef as useRef8 } from "react";
|
|
3942
4600
|
|
|
3943
4601
|
// src/components/jira/LinkTicketModal.tsx
|
|
3944
|
-
import { useState as
|
|
3945
|
-
import { Box as Box13, Text as
|
|
3946
|
-
import { jsx as
|
|
4602
|
+
import { useState as useState18 } from "react";
|
|
4603
|
+
import { Box as Box13, Text as Text13, useInput as useInput11 } from "ink";
|
|
4604
|
+
import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
3947
4605
|
function LinkTicketModal({ onSubmit, onCancel, loading, error }) {
|
|
3948
|
-
const [ticketInput, setTicketInput] =
|
|
4606
|
+
const [ticketInput, setTicketInput] = useState18("");
|
|
3949
4607
|
const canSubmit = ticketInput.trim().length > 0;
|
|
3950
4608
|
useInput11(
|
|
3951
4609
|
(_input, key) => {
|
|
@@ -3960,35 +4618,35 @@ function LinkTicketModal({ onSubmit, onCancel, loading, error }) {
|
|
|
3960
4618
|
},
|
|
3961
4619
|
{ isActive: !loading }
|
|
3962
4620
|
);
|
|
3963
|
-
return /* @__PURE__ */
|
|
3964
|
-
/* @__PURE__ */
|
|
3965
|
-
/* @__PURE__ */
|
|
3966
|
-
/* @__PURE__ */
|
|
3967
|
-
error && /* @__PURE__ */
|
|
3968
|
-
/* @__PURE__ */
|
|
3969
|
-
/* @__PURE__ */
|
|
3970
|
-
/* @__PURE__ */
|
|
4621
|
+
return /* @__PURE__ */ jsxs13(Box13, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
|
|
4622
|
+
/* @__PURE__ */ jsx15(Text13, { bold: true, color: "yellow", children: "Link Jira Ticket" }),
|
|
4623
|
+
/* @__PURE__ */ jsx15(Text13, { dimColor: true, children: "Type ticket ID, Enter to submit, Esc to cancel" }),
|
|
4624
|
+
/* @__PURE__ */ jsx15(Box13, { marginTop: 1 }),
|
|
4625
|
+
error && /* @__PURE__ */ jsx15(Box13, { marginBottom: 1, children: /* @__PURE__ */ jsx15(Text13, { color: "red", children: error }) }),
|
|
4626
|
+
/* @__PURE__ */ jsxs13(Box13, { children: [
|
|
4627
|
+
/* @__PURE__ */ jsx15(Text13, { color: "blue", children: "Ticket: " }),
|
|
4628
|
+
/* @__PURE__ */ jsx15(TextInput, { value: ticketInput, onChange: setTicketInput, placeholder: "PROJ-123", isActive: !loading })
|
|
3971
4629
|
] }),
|
|
3972
|
-
loading && /* @__PURE__ */
|
|
3973
|
-
/* @__PURE__ */
|
|
4630
|
+
loading && /* @__PURE__ */ jsx15(Box13, { marginTop: 1, children: /* @__PURE__ */ jsx15(Text13, { color: "yellow", children: "Fetching ticket..." }) }),
|
|
4631
|
+
/* @__PURE__ */ jsx15(Box13, { marginTop: 1, children: /* @__PURE__ */ jsx15(Text13, { dimColor: true, children: "Examples: PROJ-123 or https://company.atlassian.net/browse/PROJ-123" }) })
|
|
3974
4632
|
] });
|
|
3975
4633
|
}
|
|
3976
4634
|
|
|
3977
4635
|
// src/components/jira/JiraView.tsx
|
|
3978
4636
|
import { TitledBox as TitledBox6 } from "@mishieck/ink-titled-box";
|
|
3979
|
-
import { Box as Box17, Text as
|
|
4637
|
+
import { Box as Box17, Text as Text17, useInput as useInput14 } from "ink";
|
|
3980
4638
|
|
|
3981
4639
|
// src/components/jira/ChangeStatusModal.tsx
|
|
3982
|
-
import { useEffect as
|
|
3983
|
-
import { Box as Box14, Text as
|
|
4640
|
+
import { useEffect as useEffect14, useState as useState19 } from "react";
|
|
4641
|
+
import { Box as Box14, Text as Text14, useInput as useInput12 } from "ink";
|
|
3984
4642
|
import SelectInput2 from "ink-select-input";
|
|
3985
|
-
import { jsx as
|
|
4643
|
+
import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
3986
4644
|
function ChangeStatusModal({ repoPath, ticketKey, currentStatus, onComplete, onCancel }) {
|
|
3987
|
-
const [transitions, setTransitions] =
|
|
3988
|
-
const [loading, setLoading] =
|
|
3989
|
-
const [applying, setApplying] =
|
|
3990
|
-
const [error, setError] =
|
|
3991
|
-
|
|
4645
|
+
const [transitions, setTransitions] = useState19([]);
|
|
4646
|
+
const [loading, setLoading] = useState19(true);
|
|
4647
|
+
const [applying, setApplying] = useState19(false);
|
|
4648
|
+
const [error, setError] = useState19(null);
|
|
4649
|
+
useEffect14(() => {
|
|
3992
4650
|
const fetchTransitions = async () => {
|
|
3993
4651
|
const siteUrl = getJiraSiteUrl(repoPath);
|
|
3994
4652
|
const creds = getJiraCredentials(repoPath);
|
|
@@ -4050,23 +4708,23 @@ function ChangeStatusModal({ repoPath, ticketKey, currentStatus, onComplete, onC
|
|
|
4050
4708
|
0,
|
|
4051
4709
|
transitions.findIndex((t) => t.to.name === currentStatus)
|
|
4052
4710
|
);
|
|
4053
|
-
return /* @__PURE__ */
|
|
4054
|
-
/* @__PURE__ */
|
|
4711
|
+
return /* @__PURE__ */ jsxs14(Box14, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 1, paddingY: 1, children: [
|
|
4712
|
+
/* @__PURE__ */ jsxs14(Text14, { bold: true, color: "yellow", children: [
|
|
4055
4713
|
"Change Status: ",
|
|
4056
4714
|
ticketKey
|
|
4057
4715
|
] }),
|
|
4058
|
-
loading && /* @__PURE__ */
|
|
4059
|
-
error && /* @__PURE__ */
|
|
4060
|
-
!loading && !error && transitions.length === 0 && /* @__PURE__ */
|
|
4061
|
-
!loading && !error && transitions.length > 0 && !applying && /* @__PURE__ */
|
|
4062
|
-
applying && /* @__PURE__ */
|
|
4063
|
-
/* @__PURE__ */
|
|
4716
|
+
loading && /* @__PURE__ */ jsx16(Text14, { dimColor: true, children: "Loading transitions..." }),
|
|
4717
|
+
error && /* @__PURE__ */ jsx16(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text14, { color: "red", children: error }) }),
|
|
4718
|
+
!loading && !error && transitions.length === 0 && /* @__PURE__ */ jsx16(Text14, { dimColor: true, children: "No available transitions" }),
|
|
4719
|
+
!loading && !error && transitions.length > 0 && !applying && /* @__PURE__ */ jsx16(Box14, { marginTop: 1, flexDirection: "column", children: /* @__PURE__ */ jsx16(SelectInput2, { items, initialIndex, onSelect: handleSelect }) }),
|
|
4720
|
+
applying && /* @__PURE__ */ jsx16(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text14, { color: "yellow", children: "Updating status..." }) }),
|
|
4721
|
+
/* @__PURE__ */ jsx16(Box14, { marginTop: 1, children: /* @__PURE__ */ jsx16(Text14, { dimColor: true, children: "Esc to cancel" }) })
|
|
4064
4722
|
] });
|
|
4065
4723
|
}
|
|
4066
4724
|
|
|
4067
4725
|
// src/components/jira/ConfigureJiraSiteModal.tsx
|
|
4068
|
-
import { useState as
|
|
4069
|
-
import { Box as Box15, Text as
|
|
4726
|
+
import { useState as useState20 } from "react";
|
|
4727
|
+
import { Box as Box15, Text as Text15, useInput as useInput13 } from "ink";
|
|
4070
4728
|
import { ScrollView as ScrollView8 } from "ink-scroll-view";
|
|
4071
4729
|
|
|
4072
4730
|
// src/lib/editor.ts
|
|
@@ -4098,7 +4756,7 @@ function openInEditor(content, filename) {
|
|
|
4098
4756
|
}
|
|
4099
4757
|
|
|
4100
4758
|
// src/components/jira/ConfigureJiraSiteModal.tsx
|
|
4101
|
-
import { jsx as
|
|
4759
|
+
import { jsx as jsx17, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
4102
4760
|
var MAX_VISIBLE_ITEMS = 4;
|
|
4103
4761
|
function ConfigureJiraSiteModal({
|
|
4104
4762
|
initialSiteUrl,
|
|
@@ -4110,13 +4768,13 @@ function ConfigureJiraSiteModal({
|
|
|
4110
4768
|
error
|
|
4111
4769
|
}) {
|
|
4112
4770
|
const hasExisting = existingConfigs.length > 0;
|
|
4113
|
-
const [mode, setMode] =
|
|
4114
|
-
const [selectedExisting, setSelectedExisting] =
|
|
4771
|
+
const [mode, setMode] = useState20(hasExisting ? "choose" : "manual");
|
|
4772
|
+
const [selectedExisting, setSelectedExisting] = useState20(0);
|
|
4115
4773
|
const scrollRef = useScrollToIndex(selectedExisting);
|
|
4116
|
-
const [siteUrl, setSiteUrl] =
|
|
4117
|
-
const [email, setEmail] =
|
|
4118
|
-
const [apiToken, setApiToken] =
|
|
4119
|
-
const [selectedItem, setSelectedItem] =
|
|
4774
|
+
const [siteUrl, setSiteUrl] = useState20(initialSiteUrl ?? "");
|
|
4775
|
+
const [email, setEmail] = useState20(initialEmail ?? "");
|
|
4776
|
+
const [apiToken, setApiToken] = useState20("");
|
|
4777
|
+
const [selectedItem, setSelectedItem] = useState20("siteUrl");
|
|
4120
4778
|
const items = ["siteUrl", "email", "apiToken", "submit"];
|
|
4121
4779
|
const canSubmit = siteUrl.trim() && email.trim() && apiToken.trim();
|
|
4122
4780
|
const chooseItems = existingConfigs.length + 1;
|
|
@@ -4192,38 +4850,38 @@ function ConfigureJiraSiteModal({
|
|
|
4192
4850
|
const prefix = isSelected ? "> " : " ";
|
|
4193
4851
|
const color = isSelected ? "yellow" : void 0;
|
|
4194
4852
|
const displayValue = isSensitive && value ? "*".repeat(Math.min(value.length, 20)) : value;
|
|
4195
|
-
return /* @__PURE__ */
|
|
4196
|
-
/* @__PURE__ */
|
|
4853
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", children: [
|
|
4854
|
+
/* @__PURE__ */ jsxs15(Text15, { color, bold: isSelected, children: [
|
|
4197
4855
|
prefix,
|
|
4198
4856
|
label
|
|
4199
4857
|
] }),
|
|
4200
|
-
value !== void 0 && /* @__PURE__ */
|
|
4858
|
+
value !== void 0 && /* @__PURE__ */ jsx17(Box15, { marginLeft: 4, children: /* @__PURE__ */ jsx17(Text15, { dimColor: true, children: displayValue || "(empty - press Enter to edit)" }) })
|
|
4201
4859
|
] });
|
|
4202
4860
|
};
|
|
4203
4861
|
if (mode === "choose") {
|
|
4204
4862
|
const totalItems = existingConfigs.length + 1;
|
|
4205
4863
|
const listHeight = Math.min(totalItems * 2, MAX_VISIBLE_ITEMS * 2);
|
|
4206
|
-
return /* @__PURE__ */
|
|
4207
|
-
/* @__PURE__ */
|
|
4208
|
-
/* @__PURE__ */
|
|
4209
|
-
/* @__PURE__ */
|
|
4210
|
-
error && /* @__PURE__ */
|
|
4211
|
-
/* @__PURE__ */
|
|
4864
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, paddingY: 1, children: [
|
|
4865
|
+
/* @__PURE__ */ jsx17(Text15, { bold: true, color: "cyan", children: "Configure Jira Site" }),
|
|
4866
|
+
/* @__PURE__ */ jsx17(Text15, { dimColor: true, children: "Select an existing configuration or enter new credentials" }),
|
|
4867
|
+
/* @__PURE__ */ jsx17(Box15, { marginTop: 1 }),
|
|
4868
|
+
error && /* @__PURE__ */ jsx17(Box15, { marginBottom: 1, children: /* @__PURE__ */ jsx17(Text15, { color: "red", children: error }) }),
|
|
4869
|
+
/* @__PURE__ */ jsx17(Box15, { height: listHeight, overflow: "hidden", children: /* @__PURE__ */ jsxs15(ScrollView8, { ref: scrollRef, children: [
|
|
4212
4870
|
existingConfigs.map((config, idx) => {
|
|
4213
4871
|
const isSelected = selectedExisting === idx;
|
|
4214
|
-
return /* @__PURE__ */
|
|
4215
|
-
/* @__PURE__ */
|
|
4872
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", children: [
|
|
4873
|
+
/* @__PURE__ */ jsxs15(Text15, { color: isSelected ? "yellow" : void 0, bold: isSelected, children: [
|
|
4216
4874
|
isSelected ? "> " : " ",
|
|
4217
4875
|
config.siteUrl
|
|
4218
4876
|
] }),
|
|
4219
|
-
/* @__PURE__ */
|
|
4877
|
+
/* @__PURE__ */ jsxs15(Text15, { dimColor: true, children: [
|
|
4220
4878
|
" ",
|
|
4221
4879
|
config.email
|
|
4222
4880
|
] })
|
|
4223
4881
|
] }, config.siteUrl + config.email);
|
|
4224
4882
|
}),
|
|
4225
|
-
/* @__PURE__ */
|
|
4226
|
-
|
|
4883
|
+
/* @__PURE__ */ jsx17(Box15, { children: /* @__PURE__ */ jsxs15(
|
|
4884
|
+
Text15,
|
|
4227
4885
|
{
|
|
4228
4886
|
color: selectedExisting === existingConfigs.length ? "yellow" : void 0,
|
|
4229
4887
|
bold: selectedExisting === existingConfigs.length,
|
|
@@ -4234,44 +4892,44 @@ function ConfigureJiraSiteModal({
|
|
|
4234
4892
|
}
|
|
4235
4893
|
) })
|
|
4236
4894
|
] }) }),
|
|
4237
|
-
loading && /* @__PURE__ */
|
|
4895
|
+
loading && /* @__PURE__ */ jsx17(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx17(Text15, { color: "yellow", children: "Validating credentials..." }) })
|
|
4238
4896
|
] });
|
|
4239
4897
|
}
|
|
4240
|
-
return /* @__PURE__ */
|
|
4241
|
-
/* @__PURE__ */
|
|
4242
|
-
/* @__PURE__ */
|
|
4898
|
+
return /* @__PURE__ */ jsxs15(Box15, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 1, paddingY: 1, children: [
|
|
4899
|
+
/* @__PURE__ */ jsx17(Text15, { bold: true, color: "cyan", children: "Configure Jira Site" }),
|
|
4900
|
+
/* @__PURE__ */ jsxs15(Text15, { dimColor: true, children: [
|
|
4243
4901
|
"Up/Down to select, Enter to edit, Esc to ",
|
|
4244
4902
|
hasExisting ? "go back" : "cancel"
|
|
4245
4903
|
] }),
|
|
4246
|
-
/* @__PURE__ */
|
|
4247
|
-
error && /* @__PURE__ */
|
|
4904
|
+
/* @__PURE__ */ jsx17(Box15, { marginTop: 1 }),
|
|
4905
|
+
error && /* @__PURE__ */ jsx17(Box15, { marginBottom: 1, children: /* @__PURE__ */ jsx17(Text15, { color: "red", children: error }) }),
|
|
4248
4906
|
renderItem("siteUrl", "Site URL (e.g., https://company.atlassian.net)", siteUrl),
|
|
4249
|
-
/* @__PURE__ */
|
|
4907
|
+
/* @__PURE__ */ jsx17(Box15, { marginTop: 1 }),
|
|
4250
4908
|
renderItem("email", "Email", email),
|
|
4251
|
-
/* @__PURE__ */
|
|
4909
|
+
/* @__PURE__ */ jsx17(Box15, { marginTop: 1 }),
|
|
4252
4910
|
renderItem("apiToken", "API Token", apiToken, true),
|
|
4253
|
-
/* @__PURE__ */
|
|
4254
|
-
/* @__PURE__ */
|
|
4911
|
+
/* @__PURE__ */ jsx17(Box15, { marginTop: 1 }),
|
|
4912
|
+
/* @__PURE__ */ jsx17(Box15, { children: /* @__PURE__ */ jsxs15(Text15, { color: selectedItem === "submit" ? "green" : void 0, bold: selectedItem === "submit", children: [
|
|
4255
4913
|
selectedItem === "submit" ? "> " : " ",
|
|
4256
4914
|
canSubmit ? "[Save Configuration]" : "[Fill all fields first]"
|
|
4257
4915
|
] }) }),
|
|
4258
|
-
loading && /* @__PURE__ */
|
|
4259
|
-
/* @__PURE__ */
|
|
4916
|
+
loading && /* @__PURE__ */ jsx17(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx17(Text15, { color: "yellow", children: "Validating credentials..." }) }),
|
|
4917
|
+
/* @__PURE__ */ jsx17(Box15, { marginTop: 1, children: /* @__PURE__ */ jsx17(Text15, { dimColor: true, children: "Get your API token from: https://id.atlassian.com/manage-profile/security/api-tokens" }) })
|
|
4260
4918
|
] });
|
|
4261
4919
|
}
|
|
4262
4920
|
|
|
4263
4921
|
// src/components/jira/TicketItem.tsx
|
|
4264
|
-
import { Box as Box16, Text as
|
|
4265
|
-
import { jsx as
|
|
4922
|
+
import { Box as Box16, Text as Text16 } from "ink";
|
|
4923
|
+
import { jsx as jsx18, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
4266
4924
|
function TicketItem({ ticketKey, summary, status, isHighlighted, isSelected }) {
|
|
4267
4925
|
const prefix = isHighlighted ? "> " : isSelected ? "\u25CF " : " ";
|
|
4268
4926
|
const textColor = isSelected ? "green" : void 0;
|
|
4269
|
-
return /* @__PURE__ */
|
|
4927
|
+
return /* @__PURE__ */ jsx18(Box16, { children: /* @__PURE__ */ jsxs16(Text16, { color: textColor, children: [
|
|
4270
4928
|
prefix,
|
|
4271
|
-
/* @__PURE__ */
|
|
4929
|
+
/* @__PURE__ */ jsx18(Text16, { bold: true, color: "blue", children: ticketKey }),
|
|
4272
4930
|
" ",
|
|
4273
4931
|
summary,
|
|
4274
|
-
status && /* @__PURE__ */
|
|
4932
|
+
status && /* @__PURE__ */ jsxs16(Text16, { dimColor: true, children: [
|
|
4275
4933
|
" [",
|
|
4276
4934
|
status,
|
|
4277
4935
|
"]"
|
|
@@ -4280,7 +4938,7 @@ function TicketItem({ ticketKey, summary, status, isHighlighted, isSelected }) {
|
|
|
4280
4938
|
}
|
|
4281
4939
|
|
|
4282
4940
|
// src/components/jira/JiraView.tsx
|
|
4283
|
-
import { jsx as
|
|
4941
|
+
import { jsx as jsx19, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
4284
4942
|
function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated }) {
|
|
4285
4943
|
const repo = useGitRepo();
|
|
4286
4944
|
const jira = useJiraTickets();
|
|
@@ -4288,7 +4946,7 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
|
|
|
4288
4946
|
const nav = useListNavigation({ items: jira.tickets });
|
|
4289
4947
|
const currentTicket = jira.tickets[nav.index] ?? null;
|
|
4290
4948
|
const lastInitRef = useRef8(null);
|
|
4291
|
-
|
|
4949
|
+
useEffect15(() => {
|
|
4292
4950
|
if (repo.loading || !repo.repoPath || !repo.currentBranch) return;
|
|
4293
4951
|
const current = { branch: repo.currentBranch };
|
|
4294
4952
|
const last = lastInitRef.current;
|
|
@@ -4296,17 +4954,17 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
|
|
|
4296
4954
|
lastInitRef.current = current;
|
|
4297
4955
|
jira.initializeJiraState(repo.repoPath, repo.currentBranch, repo.currentRepoSlug);
|
|
4298
4956
|
}, [repo.loading, repo.repoPath, repo.currentBranch, repo.currentRepoSlug, jira.initializeJiraState]);
|
|
4299
|
-
|
|
4957
|
+
useEffect15(() => {
|
|
4300
4958
|
if (isActive) {
|
|
4301
4959
|
repo.refreshBranch();
|
|
4302
4960
|
} else {
|
|
4303
4961
|
modal.close();
|
|
4304
4962
|
}
|
|
4305
4963
|
}, [isActive, repo.refreshBranch, modal.close]);
|
|
4306
|
-
|
|
4964
|
+
useEffect15(() => {
|
|
4307
4965
|
onModalChange == null ? void 0 : onModalChange(modal.isOpen);
|
|
4308
4966
|
}, [modal.isOpen, onModalChange]);
|
|
4309
|
-
|
|
4967
|
+
useEffect15(() => {
|
|
4310
4968
|
onJiraStateChange == null ? void 0 : onJiraStateChange(jira.jiraState);
|
|
4311
4969
|
}, [jira.jiraState, onJiraStateChange]);
|
|
4312
4970
|
const handleConfigureSubmit = async (siteUrl, email, apiToken) => {
|
|
@@ -4378,13 +5036,13 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
|
|
|
4378
5036
|
{ isActive: isActive && !modal.isOpen }
|
|
4379
5037
|
);
|
|
4380
5038
|
if (repo.isRepo === false) {
|
|
4381
|
-
return /* @__PURE__ */
|
|
5039
|
+
return /* @__PURE__ */ jsx19(TitledBox6, { borderStyle: "round", titles: ["Jira"], flexShrink: 0, children: /* @__PURE__ */ jsx19(Text17, { color: "red", children: "Not a git repository" }) });
|
|
4382
5040
|
}
|
|
4383
5041
|
if (modal.type === "configure") {
|
|
4384
5042
|
const siteUrl = repo.repoPath ? getJiraSiteUrl(repo.repoPath) : void 0;
|
|
4385
5043
|
const creds = repo.repoPath ? getJiraCredentials(repo.repoPath) : { email: null, apiToken: null };
|
|
4386
5044
|
const existingConfigs = getExistingJiraConfigs(repo.repoPath ?? void 0);
|
|
4387
|
-
return /* @__PURE__ */
|
|
5045
|
+
return /* @__PURE__ */ jsx19(Box17, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx19(
|
|
4388
5046
|
ConfigureJiraSiteModal,
|
|
4389
5047
|
{
|
|
4390
5048
|
initialSiteUrl: siteUrl ?? void 0,
|
|
@@ -4401,7 +5059,7 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
|
|
|
4401
5059
|
) });
|
|
4402
5060
|
}
|
|
4403
5061
|
if (modal.type === "link") {
|
|
4404
|
-
return /* @__PURE__ */
|
|
5062
|
+
return /* @__PURE__ */ jsx19(Box17, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx19(
|
|
4405
5063
|
LinkTicketModal,
|
|
4406
5064
|
{
|
|
4407
5065
|
onSubmit: handleLinkSubmit,
|
|
@@ -4415,7 +5073,7 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
|
|
|
4415
5073
|
) });
|
|
4416
5074
|
}
|
|
4417
5075
|
if (modal.type === "status" && repo.repoPath && repo.currentBranch && currentTicket) {
|
|
4418
|
-
return /* @__PURE__ */
|
|
5076
|
+
return /* @__PURE__ */ jsx19(Box17, { flexDirection: "column", flexShrink: 0, children: /* @__PURE__ */ jsx19(
|
|
4419
5077
|
ChangeStatusModal,
|
|
4420
5078
|
{
|
|
4421
5079
|
repoPath: repo.repoPath,
|
|
@@ -4428,10 +5086,10 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
|
|
|
4428
5086
|
}
|
|
4429
5087
|
const title = "[4] Jira";
|
|
4430
5088
|
const borderColor = isActive ? "yellow" : void 0;
|
|
4431
|
-
return /* @__PURE__ */
|
|
4432
|
-
jira.jiraState === "not_configured" && /* @__PURE__ */
|
|
4433
|
-
jira.jiraState === "no_tickets" && /* @__PURE__ */
|
|
4434
|
-
jira.jiraState === "has_tickets" && jira.tickets.map((ticket, idx) => /* @__PURE__ */
|
|
5089
|
+
return /* @__PURE__ */ jsx19(TitledBox6, { borderStyle: "round", titles: [title], borderColor, flexShrink: 0, children: /* @__PURE__ */ jsxs17(Box17, { flexDirection: "column", paddingX: 1, children: [
|
|
5090
|
+
jira.jiraState === "not_configured" && /* @__PURE__ */ jsx19(Text17, { dimColor: true, children: "No Jira site configured" }),
|
|
5091
|
+
jira.jiraState === "no_tickets" && /* @__PURE__ */ jsx19(Text17, { dimColor: true, children: "No tickets linked to this branch" }),
|
|
5092
|
+
jira.jiraState === "has_tickets" && jira.tickets.map((ticket, idx) => /* @__PURE__ */ jsx19(
|
|
4435
5093
|
TicketItem,
|
|
4436
5094
|
{
|
|
4437
5095
|
ticketKey: ticket.key,
|
|
@@ -4445,23 +5103,22 @@ function JiraView({ isActive, onModalChange, onJiraStateChange, onLogUpdated })
|
|
|
4445
5103
|
}
|
|
4446
5104
|
|
|
4447
5105
|
// src/components/logs/LogsView.tsx
|
|
4448
|
-
import { useEffect as
|
|
5106
|
+
import { useEffect as useEffect17 } from "react";
|
|
4449
5107
|
import { Box as Box20, useInput as useInput17 } from "ink";
|
|
4450
5108
|
|
|
4451
5109
|
// src/components/logs/LogViewerBox.tsx
|
|
4452
|
-
import { useEffect as
|
|
5110
|
+
import { useEffect as useEffect16, useRef as useRef9, useState as useState21 } from "react";
|
|
4453
5111
|
import { TitledBox as TitledBox7 } from "@mishieck/ink-titled-box";
|
|
4454
|
-
import { Box as Box18, Text as
|
|
5112
|
+
import { Box as Box18, Text as Text18, useInput as useInput15 } from "ink";
|
|
4455
5113
|
import { ScrollView as ScrollView9 } from "ink-scroll-view";
|
|
4456
|
-
import Spinner4 from "ink-spinner";
|
|
4457
5114
|
import TextInput2 from "ink-text-input";
|
|
4458
|
-
import { jsx as
|
|
5115
|
+
import { jsx as jsx20, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
4459
5116
|
function LogViewerBox({ date, content, isActive, onRefresh, onLogCreated }) {
|
|
4460
5117
|
const scrollRef = useRef9(null);
|
|
4461
|
-
const [isInputMode, setIsInputMode] =
|
|
4462
|
-
const [inputValue, setInputValue] =
|
|
4463
|
-
const [isGeneratingStandup, setIsGeneratingStandup] =
|
|
4464
|
-
const [standupResult, setStandupResult] =
|
|
5118
|
+
const [isInputMode, setIsInputMode] = useState21(false);
|
|
5119
|
+
const [inputValue, setInputValue] = useState21("");
|
|
5120
|
+
const [isGeneratingStandup, setIsGeneratingStandup] = useState21(false);
|
|
5121
|
+
const [standupResult, setStandupResult] = useState21(null);
|
|
4465
5122
|
const claudeProcessRef = useRef9(null);
|
|
4466
5123
|
const title = "[6] Log Content";
|
|
4467
5124
|
const borderColor = isActive ? "yellow" : void 0;
|
|
@@ -4513,9 +5170,9 @@ function LogViewerBox({ date, content, isActive, onRefresh, onLogCreated }) {
|
|
|
4513
5170
|
if (input === "c" && date && content && !isGeneratingStandup) {
|
|
4514
5171
|
setIsGeneratingStandup(true);
|
|
4515
5172
|
setStandupResult(null);
|
|
4516
|
-
const
|
|
4517
|
-
claudeProcessRef.current =
|
|
4518
|
-
|
|
5173
|
+
const process3 = generateStandupNotes(content);
|
|
5174
|
+
claudeProcessRef.current = process3;
|
|
5175
|
+
process3.promise.then((result) => {
|
|
4519
5176
|
claudeProcessRef.current = null;
|
|
4520
5177
|
setIsGeneratingStandup(false);
|
|
4521
5178
|
if (result.success) {
|
|
@@ -4528,7 +5185,7 @@ function LogViewerBox({ date, content, isActive, onRefresh, onLogCreated }) {
|
|
|
4528
5185
|
},
|
|
4529
5186
|
{ isActive }
|
|
4530
5187
|
);
|
|
4531
|
-
|
|
5188
|
+
useEffect16(() => {
|
|
4532
5189
|
return () => {
|
|
4533
5190
|
var _a;
|
|
4534
5191
|
(_a = claudeProcessRef.current) == null ? void 0 : _a.cancel();
|
|
@@ -4551,14 +5208,14 @@ ${value.trim()}
|
|
|
4551
5208
|
setIsInputMode(false);
|
|
4552
5209
|
onRefresh();
|
|
4553
5210
|
};
|
|
4554
|
-
return /* @__PURE__ */
|
|
4555
|
-
/* @__PURE__ */
|
|
4556
|
-
!date && /* @__PURE__ */
|
|
4557
|
-
date && content === null && /* @__PURE__ */
|
|
4558
|
-
date && content !== null && content.trim() === "" && /* @__PURE__ */
|
|
4559
|
-
date && content && content.trim() !== "" && /* @__PURE__ */
|
|
5211
|
+
return /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", flexGrow: 1, children: [
|
|
5212
|
+
/* @__PURE__ */ jsx20(TitledBox7, { borderStyle: "round", titles: [displayTitle], borderColor, flexGrow: 1, children: /* @__PURE__ */ jsx20(Box18, { flexDirection: "column", flexGrow: 1, children: /* @__PURE__ */ jsx20(ScrollView9, { ref: scrollRef, children: /* @__PURE__ */ jsxs18(Box18, { flexDirection: "column", paddingX: 1, children: [
|
|
5213
|
+
!date && /* @__PURE__ */ jsx20(Text18, { dimColor: true, children: "Select a log file to view" }),
|
|
5214
|
+
date && content === null && /* @__PURE__ */ jsx20(Text18, { dimColor: true, children: "Log file not found" }),
|
|
5215
|
+
date && content !== null && content.trim() === "" && /* @__PURE__ */ jsx20(Text18, { dimColor: true, children: "Empty log file" }),
|
|
5216
|
+
date && content && content.trim() !== "" && /* @__PURE__ */ jsx20(Markdown, { children: content })
|
|
4560
5217
|
] }) }) }) }),
|
|
4561
|
-
isInputMode && /* @__PURE__ */
|
|
5218
|
+
isInputMode && /* @__PURE__ */ jsx20(TitledBox7, { borderStyle: "round", titles: ["Add Entry"], borderColor: "yellow", children: /* @__PURE__ */ jsx20(Box18, { paddingX: 1, children: /* @__PURE__ */ jsx20(
|
|
4562
5219
|
TextInput2,
|
|
4563
5220
|
{
|
|
4564
5221
|
value: inputValue,
|
|
@@ -4566,22 +5223,19 @@ ${value.trim()}
|
|
|
4566
5223
|
onSubmit: handleInputSubmit
|
|
4567
5224
|
}
|
|
4568
5225
|
) }) }),
|
|
4569
|
-
isGeneratingStandup && /* @__PURE__ */
|
|
4570
|
-
/* @__PURE__ */
|
|
4571
|
-
|
|
4572
|
-
" Generating standup notes..."
|
|
4573
|
-
] }),
|
|
4574
|
-
/* @__PURE__ */ jsx18(Text16, { dimColor: true, children: "Press Esc to cancel" })
|
|
5226
|
+
isGeneratingStandup && /* @__PURE__ */ jsx20(TitledBox7, { borderStyle: "round", titles: ["Standup Notes"], borderColor: "yellow", children: /* @__PURE__ */ jsxs18(Box18, { paddingX: 1, flexDirection: "column", children: [
|
|
5227
|
+
/* @__PURE__ */ jsx20(AnimatedText, { name: "radar", config: { baseColor: "#CC6600" }, children: "Generating standup notes with Claude..." }),
|
|
5228
|
+
/* @__PURE__ */ jsx20(Text18, { dimColor: true, children: "Press Esc to cancel" })
|
|
4575
5229
|
] }) }),
|
|
4576
|
-
standupResult && /* @__PURE__ */
|
|
5230
|
+
standupResult && /* @__PURE__ */ jsx20(
|
|
4577
5231
|
TitledBox7,
|
|
4578
5232
|
{
|
|
4579
5233
|
borderStyle: "round",
|
|
4580
5234
|
titles: ["Standup Notes"],
|
|
4581
5235
|
borderColor: standupResult.type === "error" ? "red" : "green",
|
|
4582
|
-
children: /* @__PURE__ */
|
|
4583
|
-
standupResult.type === "error" ? /* @__PURE__ */
|
|
4584
|
-
/* @__PURE__ */
|
|
5236
|
+
children: /* @__PURE__ */ jsxs18(Box18, { paddingX: 1, flexDirection: "column", children: [
|
|
5237
|
+
standupResult.type === "error" ? /* @__PURE__ */ jsx20(Text18, { color: "red", children: standupResult.message }) : /* @__PURE__ */ jsx20(Markdown, { children: standupResult.message }),
|
|
5238
|
+
/* @__PURE__ */ jsx20(Text18, { dimColor: true, children: "Press Esc to dismiss" })
|
|
4585
5239
|
] })
|
|
4586
5240
|
}
|
|
4587
5241
|
)
|
|
@@ -4590,9 +5244,9 @@ ${value.trim()}
|
|
|
4590
5244
|
|
|
4591
5245
|
// src/components/logs/LogsHistoryBox.tsx
|
|
4592
5246
|
import { TitledBox as TitledBox8 } from "@mishieck/ink-titled-box";
|
|
4593
|
-
import { Box as Box19, Text as
|
|
5247
|
+
import { Box as Box19, Text as Text19, useInput as useInput16 } from "ink";
|
|
4594
5248
|
import { ScrollView as ScrollView10 } from "ink-scroll-view";
|
|
4595
|
-
import { jsx as
|
|
5249
|
+
import { jsx as jsx21, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
4596
5250
|
function LogsHistoryBox({
|
|
4597
5251
|
logFiles,
|
|
4598
5252
|
selectedDate,
|
|
@@ -4622,31 +5276,31 @@ function LogsHistoryBox({
|
|
|
4622
5276
|
},
|
|
4623
5277
|
{ isActive }
|
|
4624
5278
|
);
|
|
4625
|
-
return /* @__PURE__ */
|
|
4626
|
-
logFiles.length === 0 && /* @__PURE__ */
|
|
4627
|
-
logFiles.length > 0 && /* @__PURE__ */
|
|
5279
|
+
return /* @__PURE__ */ jsx21(TitledBox8, { borderStyle: "round", titles: [title], borderColor, height: 5, children: /* @__PURE__ */ jsxs19(Box19, { flexDirection: "column", paddingX: 1, flexGrow: 1, overflow: "hidden", children: [
|
|
5280
|
+
logFiles.length === 0 && /* @__PURE__ */ jsx21(Text19, { dimColor: true, children: "No logs yet" }),
|
|
5281
|
+
logFiles.length > 0 && /* @__PURE__ */ jsx21(ScrollView10, { ref: scrollRef, children: logFiles.map((file, idx) => {
|
|
4628
5282
|
const isHighlighted = idx === highlightedIndex;
|
|
4629
5283
|
const isSelected = file.date === selectedDate;
|
|
4630
5284
|
const cursor = isHighlighted ? ">" : " ";
|
|
4631
5285
|
const indicator = isSelected ? " *" : "";
|
|
4632
|
-
return /* @__PURE__ */
|
|
4633
|
-
/* @__PURE__ */
|
|
5286
|
+
return /* @__PURE__ */ jsxs19(Box19, { children: [
|
|
5287
|
+
/* @__PURE__ */ jsxs19(Text19, { color: isHighlighted ? "yellow" : void 0, children: [
|
|
4634
5288
|
cursor,
|
|
4635
5289
|
" "
|
|
4636
5290
|
] }),
|
|
4637
|
-
/* @__PURE__ */
|
|
4638
|
-
file.isToday && /* @__PURE__ */
|
|
4639
|
-
/* @__PURE__ */
|
|
5291
|
+
/* @__PURE__ */ jsx21(Text19, { color: file.isToday ? "green" : void 0, bold: file.isToday, children: file.date }),
|
|
5292
|
+
file.isToday && /* @__PURE__ */ jsx21(Text19, { color: "green", children: " (today)" }),
|
|
5293
|
+
/* @__PURE__ */ jsx21(Text19, { dimColor: true, children: indicator })
|
|
4640
5294
|
] }, file.date);
|
|
4641
5295
|
}) })
|
|
4642
5296
|
] }) });
|
|
4643
5297
|
}
|
|
4644
5298
|
|
|
4645
5299
|
// src/components/logs/LogsView.tsx
|
|
4646
|
-
import { jsx as
|
|
5300
|
+
import { jsx as jsx22, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
4647
5301
|
function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
|
|
4648
5302
|
const logs = useLogs();
|
|
4649
|
-
|
|
5303
|
+
useEffect17(() => {
|
|
4650
5304
|
if (refreshKey !== void 0 && refreshKey > 0) {
|
|
4651
5305
|
logs.handleExternalLogUpdate();
|
|
4652
5306
|
}
|
|
@@ -4658,8 +5312,8 @@ function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
|
|
|
4658
5312
|
},
|
|
4659
5313
|
{ isActive }
|
|
4660
5314
|
);
|
|
4661
|
-
return /* @__PURE__ */
|
|
4662
|
-
/* @__PURE__ */
|
|
5315
|
+
return /* @__PURE__ */ jsxs20(Box20, { flexDirection: "column", flexGrow: 1, children: [
|
|
5316
|
+
/* @__PURE__ */ jsx22(
|
|
4663
5317
|
LogsHistoryBox,
|
|
4664
5318
|
{
|
|
4665
5319
|
logFiles: logs.logFiles,
|
|
@@ -4670,7 +5324,7 @@ function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
|
|
|
4670
5324
|
isActive: isActive && focusedBox === "history"
|
|
4671
5325
|
}
|
|
4672
5326
|
),
|
|
4673
|
-
/* @__PURE__ */
|
|
5327
|
+
/* @__PURE__ */ jsx22(
|
|
4674
5328
|
LogViewerBox,
|
|
4675
5329
|
{
|
|
4676
5330
|
date: logs.selectedDate,
|
|
@@ -4684,8 +5338,8 @@ function LogsView({ isActive, refreshKey, focusedBox, onFocusedBoxChange }) {
|
|
|
4684
5338
|
}
|
|
4685
5339
|
|
|
4686
5340
|
// src/components/ui/KeybindingsBar.tsx
|
|
4687
|
-
import { Box as Box21, Text as
|
|
4688
|
-
import { jsx as
|
|
5341
|
+
import { Box as Box21, Text as Text20 } from "ink";
|
|
5342
|
+
import { jsx as jsx23, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
4689
5343
|
var globalBindings = [
|
|
4690
5344
|
{ key: "1-4", label: "Focus" },
|
|
4691
5345
|
{ key: "Tab", label: "Switch Tab" },
|
|
@@ -4696,14 +5350,14 @@ var modalBindings = [{ key: "Esc", label: "Cancel" }];
|
|
|
4696
5350
|
var DUCK_ASCII = "<(')___";
|
|
4697
5351
|
function KeybindingsBar({ contextBindings = [], modalOpen = false, duck }) {
|
|
4698
5352
|
const allBindings = modalOpen ? [...contextBindings, ...modalBindings] : [...contextBindings, ...globalBindings];
|
|
4699
|
-
return /* @__PURE__ */
|
|
4700
|
-
allBindings.map((binding) => /* @__PURE__ */
|
|
4701
|
-
/* @__PURE__ */
|
|
4702
|
-
/* @__PURE__ */
|
|
5353
|
+
return /* @__PURE__ */ jsxs21(Box21, { flexShrink: 0, paddingX: 1, gap: 2, children: [
|
|
5354
|
+
allBindings.map((binding) => /* @__PURE__ */ jsxs21(Box21, { gap: 1, children: [
|
|
5355
|
+
/* @__PURE__ */ jsx23(Text20, { bold: true, color: binding.color ?? "yellow", children: binding.key }),
|
|
5356
|
+
/* @__PURE__ */ jsx23(Text20, { dimColor: true, children: binding.label })
|
|
4703
5357
|
] }, binding.key)),
|
|
4704
|
-
(duck == null ? void 0 : duck.visible) && /* @__PURE__ */
|
|
4705
|
-
/* @__PURE__ */
|
|
4706
|
-
/* @__PURE__ */
|
|
5358
|
+
(duck == null ? void 0 : duck.visible) && /* @__PURE__ */ jsxs21(Box21, { flexGrow: 1, justifyContent: "flex-end", gap: 1, children: [
|
|
5359
|
+
/* @__PURE__ */ jsx23(Text20, { children: DUCK_ASCII }),
|
|
5360
|
+
/* @__PURE__ */ jsx23(Text20, { dimColor: true, children: duck.message })
|
|
4707
5361
|
] })
|
|
4708
5362
|
] });
|
|
4709
5363
|
}
|
|
@@ -4731,6 +5385,23 @@ var GITHUB_KEYBINDINGS = {
|
|
|
4731
5385
|
]
|
|
4732
5386
|
};
|
|
4733
5387
|
|
|
5388
|
+
// src/constants/jira.ts
|
|
5389
|
+
var JIRA_KEYBINDINGS = {
|
|
5390
|
+
not_configured: [{ key: "c", label: "Configure Jira" }],
|
|
5391
|
+
no_tickets: [
|
|
5392
|
+
{ key: "l", label: "Link Ticket" },
|
|
5393
|
+
{ key: "r", label: "Remove Config", color: "red" }
|
|
5394
|
+
],
|
|
5395
|
+
has_tickets: [
|
|
5396
|
+
{ key: "l", label: "Link" },
|
|
5397
|
+
{ key: "s", label: "Status" },
|
|
5398
|
+
{ key: "d", label: "Unlink", color: "red" },
|
|
5399
|
+
{ key: "o", label: "Open", color: "green" },
|
|
5400
|
+
{ key: "y", label: "Copy Link" },
|
|
5401
|
+
{ key: "r", label: "Remove Config", color: "red" }
|
|
5402
|
+
]
|
|
5403
|
+
};
|
|
5404
|
+
|
|
4734
5405
|
// src/constants/jira-browser.ts
|
|
4735
5406
|
var JIRA_BROWSER_KEYBINDINGS = {
|
|
4736
5407
|
"saved-views": [
|
|
@@ -4752,23 +5423,6 @@ var JIRA_BROWSER_KEYBINDINGS = {
|
|
|
4752
5423
|
]
|
|
4753
5424
|
};
|
|
4754
5425
|
|
|
4755
|
-
// src/constants/jira.ts
|
|
4756
|
-
var JIRA_KEYBINDINGS = {
|
|
4757
|
-
not_configured: [{ key: "c", label: "Configure Jira" }],
|
|
4758
|
-
no_tickets: [
|
|
4759
|
-
{ key: "l", label: "Link Ticket" },
|
|
4760
|
-
{ key: "r", label: "Remove Config", color: "red" }
|
|
4761
|
-
],
|
|
4762
|
-
has_tickets: [
|
|
4763
|
-
{ key: "l", label: "Link" },
|
|
4764
|
-
{ key: "s", label: "Status" },
|
|
4765
|
-
{ key: "d", label: "Unlink", color: "red" },
|
|
4766
|
-
{ key: "o", label: "Open", color: "green" },
|
|
4767
|
-
{ key: "y", label: "Copy Link" },
|
|
4768
|
-
{ key: "r", label: "Remove Config", color: "red" }
|
|
4769
|
-
]
|
|
4770
|
-
};
|
|
4771
|
-
|
|
4772
5426
|
// src/constants/logs.ts
|
|
4773
5427
|
var LOGS_KEYBINDINGS = {
|
|
4774
5428
|
history: [{ key: "Space", label: "Select" }],
|
|
@@ -4800,19 +5454,19 @@ function computeKeybindings(focusedView, state) {
|
|
|
4800
5454
|
}
|
|
4801
5455
|
|
|
4802
5456
|
// src/app.tsx
|
|
4803
|
-
import { jsx as
|
|
5457
|
+
import { jsx as jsx24, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
4804
5458
|
function App() {
|
|
4805
5459
|
const { exit } = useApp();
|
|
4806
|
-
const [focusedView, setFocusedView] =
|
|
4807
|
-
const [modalOpen, setModalOpen] =
|
|
4808
|
-
const [logRefreshKey, setLogRefreshKey] =
|
|
4809
|
-
const [activeTab, setActiveTab] =
|
|
5460
|
+
const [focusedView, setFocusedView] = useState22("github");
|
|
5461
|
+
const [modalOpen, setModalOpen] = useState22(false);
|
|
5462
|
+
const [logRefreshKey, setLogRefreshKey] = useState22(0);
|
|
5463
|
+
const [activeTab, setActiveTab] = useState22("logs");
|
|
4810
5464
|
const duck = useRubberDuck();
|
|
4811
|
-
const [githubFocusedBox, setGithubFocusedBox] =
|
|
4812
|
-
const [jiraState, setJiraState] =
|
|
4813
|
-
const [logsFocusedBox, setLogsFocusedBox] =
|
|
4814
|
-
const [jiraBrowserFocusedBox, setJiraBrowserFocusedBox] =
|
|
4815
|
-
const [jiraBrowserModalOpen, setJiraBrowserModalOpen] =
|
|
5465
|
+
const [githubFocusedBox, setGithubFocusedBox] = useState22("remotes");
|
|
5466
|
+
const [jiraState, setJiraState] = useState22("not_configured");
|
|
5467
|
+
const [logsFocusedBox, setLogsFocusedBox] = useState22("history");
|
|
5468
|
+
const [jiraBrowserFocusedBox, setJiraBrowserFocusedBox] = useState22("saved-views");
|
|
5469
|
+
const [jiraBrowserModalOpen, setJiraBrowserModalOpen] = useState22(false);
|
|
4816
5470
|
const keybindings = useMemo4(
|
|
4817
5471
|
() => computeKeybindings(focusedView, {
|
|
4818
5472
|
github: { focusedBox: githubFocusedBox },
|
|
@@ -4865,17 +5519,17 @@ function App() {
|
|
|
4865
5519
|
},
|
|
4866
5520
|
{ isActive: !anyModalOpen }
|
|
4867
5521
|
);
|
|
4868
|
-
return /* @__PURE__ */
|
|
4869
|
-
/* @__PURE__ */
|
|
4870
|
-
/* @__PURE__ */
|
|
4871
|
-
/* @__PURE__ */
|
|
4872
|
-
/* @__PURE__ */
|
|
4873
|
-
COLUMN2_TABS.map((tab) => /* @__PURE__ */
|
|
5522
|
+
return /* @__PURE__ */ jsxs22(Box22, { flexGrow: 1, flexDirection: "column", overflow: "hidden", children: [
|
|
5523
|
+
/* @__PURE__ */ jsxs22(Box22, { height: 1, flexDirection: "row", columnGap: 1, children: [
|
|
5524
|
+
/* @__PURE__ */ jsx24(Box22, { flexGrow: 1, paddingX: 1, flexBasis: 0, children: /* @__PURE__ */ jsx24(Text21, { color: "gray", children: "Current branch" }) }),
|
|
5525
|
+
/* @__PURE__ */ jsxs22(Box22, { flexGrow: 1, gap: 1, flexBasis: 0, children: [
|
|
5526
|
+
/* @__PURE__ */ jsx24(Text21, { color: "gray", children: "Dashboards" }),
|
|
5527
|
+
COLUMN2_TABS.map((tab) => /* @__PURE__ */ jsx24(Text21, { bold: true, dimColor: activeTab !== tab.id, children: tab.label }, tab.id))
|
|
4874
5528
|
] })
|
|
4875
5529
|
] }),
|
|
4876
|
-
/* @__PURE__ */
|
|
4877
|
-
/* @__PURE__ */
|
|
4878
|
-
/* @__PURE__ */
|
|
5530
|
+
/* @__PURE__ */ jsxs22(Box22, { flexGrow: 1, flexDirection: "row", columnGap: 1, children: [
|
|
5531
|
+
/* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: [
|
|
5532
|
+
/* @__PURE__ */ jsx24(
|
|
4879
5533
|
GitHubView,
|
|
4880
5534
|
{
|
|
4881
5535
|
isActive: focusedView === "github",
|
|
@@ -4883,7 +5537,7 @@ function App() {
|
|
|
4883
5537
|
onLogUpdated: handleLogUpdated
|
|
4884
5538
|
}
|
|
4885
5539
|
),
|
|
4886
|
-
/* @__PURE__ */
|
|
5540
|
+
/* @__PURE__ */ jsx24(
|
|
4887
5541
|
JiraView,
|
|
4888
5542
|
{
|
|
4889
5543
|
isActive: focusedView === "jira",
|
|
@@ -4893,8 +5547,8 @@ function App() {
|
|
|
4893
5547
|
}
|
|
4894
5548
|
)
|
|
4895
5549
|
] }),
|
|
4896
|
-
/* @__PURE__ */
|
|
4897
|
-
activeTab === "logs" && /* @__PURE__ */
|
|
5550
|
+
/* @__PURE__ */ jsxs22(Box22, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: [
|
|
5551
|
+
activeTab === "logs" && /* @__PURE__ */ jsx24(
|
|
4898
5552
|
LogsView,
|
|
4899
5553
|
{
|
|
4900
5554
|
isActive: focusedView === "logs",
|
|
@@ -4903,7 +5557,7 @@ function App() {
|
|
|
4903
5557
|
onFocusedBoxChange: setLogsFocusedBox
|
|
4904
5558
|
}
|
|
4905
5559
|
),
|
|
4906
|
-
activeTab === "jira-browser" && /* @__PURE__ */
|
|
5560
|
+
activeTab === "jira-browser" && /* @__PURE__ */ jsx24(
|
|
4907
5561
|
JiraBrowserView,
|
|
4908
5562
|
{
|
|
4909
5563
|
isActive: focusedView === "jira-browser",
|
|
@@ -4915,7 +5569,7 @@ function App() {
|
|
|
4915
5569
|
)
|
|
4916
5570
|
] })
|
|
4917
5571
|
] }),
|
|
4918
|
-
/* @__PURE__ */
|
|
5572
|
+
/* @__PURE__ */ jsx24(
|
|
4919
5573
|
KeybindingsBar,
|
|
4920
5574
|
{
|
|
4921
5575
|
contextBindings: keybindings,
|
|
@@ -4930,31 +5584,31 @@ function App() {
|
|
|
4930
5584
|
import { render as inkRender } from "ink";
|
|
4931
5585
|
|
|
4932
5586
|
// src/lib/Screen.tsx
|
|
4933
|
-
import { useCallback as useCallback12, useEffect as
|
|
5587
|
+
import { useCallback as useCallback12, useEffect as useEffect18, useState as useState23 } from "react";
|
|
4934
5588
|
import { Box as Box23, useStdout as useStdout2 } from "ink";
|
|
4935
|
-
import { jsx as
|
|
5589
|
+
import { jsx as jsx25 } from "react/jsx-runtime";
|
|
4936
5590
|
function Screen({ children }) {
|
|
4937
5591
|
const { stdout } = useStdout2();
|
|
4938
5592
|
const getSize = useCallback12(() => ({ height: stdout.rows, width: stdout.columns }), [stdout]);
|
|
4939
|
-
const [size, setSize] =
|
|
4940
|
-
|
|
5593
|
+
const [size, setSize] = useState23(getSize);
|
|
5594
|
+
useEffect18(() => {
|
|
4941
5595
|
const onResize = () => setSize(getSize());
|
|
4942
5596
|
stdout.on("resize", onResize);
|
|
4943
5597
|
return () => {
|
|
4944
5598
|
stdout.off("resize", onResize);
|
|
4945
5599
|
};
|
|
4946
5600
|
}, [stdout, getSize]);
|
|
4947
|
-
return /* @__PURE__ */
|
|
5601
|
+
return /* @__PURE__ */ jsx25(Box23, { height: size.height, width: size.width, children });
|
|
4948
5602
|
}
|
|
4949
5603
|
|
|
4950
5604
|
// src/lib/render.tsx
|
|
4951
|
-
import { jsx as
|
|
5605
|
+
import { jsx as jsx26 } from "react/jsx-runtime";
|
|
4952
5606
|
var ENTER_ALT_BUFFER = "\x1B[?1049h";
|
|
4953
5607
|
var EXIT_ALT_BUFFER = "\x1B[?1049l";
|
|
4954
5608
|
var CLEAR_SCREEN = "\x1B[2J\x1B[H";
|
|
4955
5609
|
function render(node, options) {
|
|
4956
5610
|
process.stdout.write(ENTER_ALT_BUFFER + CLEAR_SCREEN);
|
|
4957
|
-
const element = /* @__PURE__ */
|
|
5611
|
+
const element = /* @__PURE__ */ jsx26(Screen, { children: node });
|
|
4958
5612
|
const instance = inkRender(element, options);
|
|
4959
5613
|
setImmediate(() => instance.rerender(element));
|
|
4960
5614
|
const cleanup = () => process.stdout.write(EXIT_ALT_BUFFER);
|
|
@@ -4975,7 +5629,7 @@ function render(node, options) {
|
|
|
4975
5629
|
}
|
|
4976
5630
|
|
|
4977
5631
|
// src/cli.tsx
|
|
4978
|
-
import { jsx as
|
|
5632
|
+
import { jsx as jsx27 } from "react/jsx-runtime";
|
|
4979
5633
|
var cli = meow(
|
|
4980
5634
|
`
|
|
4981
5635
|
Usage
|
|
@@ -5008,4 +5662,4 @@ if (cli.flags.cwd) {
|
|
|
5008
5662
|
process.exit(1);
|
|
5009
5663
|
}
|
|
5010
5664
|
}
|
|
5011
|
-
render(/* @__PURE__ */
|
|
5665
|
+
render(/* @__PURE__ */ jsx27(App, {}));
|