@jvittechs/jai1-cli 1.0.0 → 1.0.2
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 +49 -29
- package/dist/cli.js.map +1 -1
- package/package.json +12 -12
- package/scripts/redmine-sync-issue.sh +0 -0
package/dist/cli.js
CHANGED
|
@@ -33,7 +33,7 @@ var NetworkError = class extends Jai1Error {
|
|
|
33
33
|
// package.json
|
|
34
34
|
var package_default = {
|
|
35
35
|
name: "@jvittechs/jai1-cli",
|
|
36
|
-
version: "1.0.
|
|
36
|
+
version: "1.0.2",
|
|
37
37
|
description: "A unified CLI tool for JV-IT TECHS developers to manage Jai1 Framework. Please contact TeamAI for usage instructions.",
|
|
38
38
|
type: "module",
|
|
39
39
|
bin: {
|
|
@@ -1358,6 +1358,7 @@ var UnifiedApplyApp = ({
|
|
|
1358
1358
|
const [cursorIndex, setCursorIndex] = useState(0);
|
|
1359
1359
|
const [focusArea, setFocusArea] = useState("packages");
|
|
1360
1360
|
const [selectedPackageIndex, setSelectedPackageIndex] = useState(0);
|
|
1361
|
+
const [activePackageFilter, setActivePackageFilter] = useState(null);
|
|
1361
1362
|
const [installProgress, setInstallProgress] = useState([]);
|
|
1362
1363
|
const [installStats, setInstallStats] = useState({ total: 0, completed: 0, added: 0, updated: 0, failed: 0 });
|
|
1363
1364
|
const [availableIdes, setAvailableIdes] = useState([]);
|
|
@@ -1377,6 +1378,9 @@ var UnifiedApplyApp = ({
|
|
|
1377
1378
|
setComponents(comps);
|
|
1378
1379
|
setTags(tagList);
|
|
1379
1380
|
setInstalledPaths(new Set(Object.keys(installed)));
|
|
1381
|
+
if (tagList.length > 0) {
|
|
1382
|
+
setActivePackageFilter(tagList[0].tag);
|
|
1383
|
+
}
|
|
1380
1384
|
setLoading(false);
|
|
1381
1385
|
} catch (err) {
|
|
1382
1386
|
setError(err instanceof Error ? err.message : "Failed to load");
|
|
@@ -1387,21 +1391,20 @@ var UnifiedApplyApp = ({
|
|
|
1387
1391
|
setAvailableIdes(getMigrationIDEs());
|
|
1388
1392
|
}, []);
|
|
1389
1393
|
const filteredComponents = useMemo(() => {
|
|
1390
|
-
if (
|
|
1391
|
-
|
|
1392
|
-
if (selectedTag) {
|
|
1393
|
-
return components.filter((c) => c.tags?.includes(selectedTag.tag));
|
|
1394
|
-
}
|
|
1394
|
+
if (activePackageFilter) {
|
|
1395
|
+
return components.filter((c) => c.tags?.includes(activePackageFilter));
|
|
1395
1396
|
}
|
|
1396
|
-
if (
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1397
|
+
if (searchQuery.trim()) {
|
|
1398
|
+
const query = searchQuery.toLowerCase();
|
|
1399
|
+
return components.filter(
|
|
1400
|
+
(c) => c.filepath.toLowerCase().includes(query) || c.tags?.some((t) => t.toLowerCase().includes(query))
|
|
1401
|
+
);
|
|
1402
|
+
}
|
|
1403
|
+
return components;
|
|
1404
|
+
}, [components, searchQuery, activePackageFilter]);
|
|
1402
1405
|
useInput((input5, key) => {
|
|
1403
1406
|
if (viewState === "done") {
|
|
1404
|
-
if (key.return || input5 === "q" || key.escape) {
|
|
1407
|
+
if (key.return || input5 === "q" && key.ctrl || key.escape) {
|
|
1405
1408
|
onExit();
|
|
1406
1409
|
}
|
|
1407
1410
|
return;
|
|
@@ -1409,7 +1412,7 @@ var UnifiedApplyApp = ({
|
|
|
1409
1412
|
if (viewState === "summary") {
|
|
1410
1413
|
if (key.return) {
|
|
1411
1414
|
setViewState("ide-sync");
|
|
1412
|
-
} else if (input5 === "s" || input5 === "q" || key.escape) {
|
|
1415
|
+
} else if (input5 === "s" || input5 === "q" && key.ctrl || key.escape) {
|
|
1413
1416
|
onExit();
|
|
1414
1417
|
}
|
|
1415
1418
|
return;
|
|
@@ -1440,7 +1443,7 @@ var UnifiedApplyApp = ({
|
|
|
1440
1443
|
if (selectedIdes.size > 0) {
|
|
1441
1444
|
handleIdeSync();
|
|
1442
1445
|
}
|
|
1443
|
-
} else if (input5 === "s" || input5 === "q" || key.escape) {
|
|
1446
|
+
} else if (input5 === "s" || input5 === "q" && key.ctrl || key.escape) {
|
|
1444
1447
|
onExit();
|
|
1445
1448
|
}
|
|
1446
1449
|
return;
|
|
@@ -1452,12 +1455,19 @@ var UnifiedApplyApp = ({
|
|
|
1452
1455
|
return;
|
|
1453
1456
|
}
|
|
1454
1457
|
if (key.tab) {
|
|
1455
|
-
if (focusArea === "packages")
|
|
1456
|
-
|
|
1457
|
-
else
|
|
1458
|
+
if (focusArea === "packages") {
|
|
1459
|
+
setFocusArea("components");
|
|
1460
|
+
} else if (focusArea === "components") {
|
|
1461
|
+
setFocusArea("search");
|
|
1462
|
+
setActivePackageFilter(null);
|
|
1463
|
+
} else {
|
|
1464
|
+
setFocusArea("packages");
|
|
1465
|
+
const tag = tags[selectedPackageIndex];
|
|
1466
|
+
if (tag) setActivePackageFilter(tag.tag);
|
|
1467
|
+
}
|
|
1458
1468
|
return;
|
|
1459
1469
|
}
|
|
1460
|
-
if (key.escape || input5 === "q") {
|
|
1470
|
+
if (key.escape || input5 === "q" && key.ctrl) {
|
|
1461
1471
|
onExit();
|
|
1462
1472
|
return;
|
|
1463
1473
|
}
|
|
@@ -1502,9 +1512,19 @@ var UnifiedApplyApp = ({
|
|
|
1502
1512
|
}
|
|
1503
1513
|
if (focusArea === "packages") {
|
|
1504
1514
|
if (key.leftArrow) {
|
|
1505
|
-
setSelectedPackageIndex((prev) =>
|
|
1515
|
+
setSelectedPackageIndex((prev) => {
|
|
1516
|
+
const newIndex = Math.max(0, prev - 1);
|
|
1517
|
+
const tag = tags[newIndex];
|
|
1518
|
+
if (tag) setActivePackageFilter(tag.tag);
|
|
1519
|
+
return newIndex;
|
|
1520
|
+
});
|
|
1506
1521
|
} else if (key.rightArrow) {
|
|
1507
|
-
setSelectedPackageIndex((prev) =>
|
|
1522
|
+
setSelectedPackageIndex((prev) => {
|
|
1523
|
+
const newIndex = Math.min(tags.length - 1, prev + 1);
|
|
1524
|
+
const tag = tags[newIndex];
|
|
1525
|
+
if (tag) setActivePackageFilter(tag.tag);
|
|
1526
|
+
return newIndex;
|
|
1527
|
+
});
|
|
1508
1528
|
} else if (input5 === " " || key.return) {
|
|
1509
1529
|
const tag = tags[selectedPackageIndex];
|
|
1510
1530
|
if (tag) {
|
|
@@ -1609,7 +1629,7 @@ var UnifiedApplyApp = ({
|
|
|
1609
1629
|
return /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(Text3, { bold: true, color: "cyan" }, "\u{1F4E6} Installing Components")), /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(ProgressBar, { current: installStats.completed, total: installStats.total, width: 50 })), /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", borderStyle: "round", borderColor: "gray", padding: 1, height: 10 }, installProgress.slice(-8).map((item) => /* @__PURE__ */ React3.createElement(Box2, { key: item.filepath }, /* @__PURE__ */ React3.createElement(StatusIcon, { status: item.status === "success" ? "success" : item.status === "error" ? "error" : item.status === "downloading" ? "loading" : "pending" }), /* @__PURE__ */ React3.createElement(Text3, null, " ", item.filepath), item.error && /* @__PURE__ */ React3.createElement(Text3, { color: "red", dimColor: true }, " (", item.error, ")")))), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, "\u{1F4CA} ", /* @__PURE__ */ React3.createElement(Text3, { color: "green" }, installStats.added, " added"), " \xB7 ", /* @__PURE__ */ React3.createElement(Text3, { color: "cyan" }, installStats.updated, " updated"), " \xB7 ", /* @__PURE__ */ React3.createElement(Text3, { color: "red" }, installStats.failed, " failed"))));
|
|
1610
1630
|
}
|
|
1611
1631
|
if (viewState === "summary") {
|
|
1612
|
-
return /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(Text3, { bold: true, color: "green" }, "\u2705 Installation Complete!")), /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", borderStyle: "round", borderColor: "gray", padding: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, installStats.total, " components processed:"), /* @__PURE__ */ React3.createElement(Text3, null, " \u2514\u2500 ", /* @__PURE__ */ React3.createElement(Text3, { color: "green" }, installStats.added), " newly added"), /* @__PURE__ */ React3.createElement(Text3, null, " \u2514\u2500 ", /* @__PURE__ */ React3.createElement(Text3, { color: "cyan" }, installStats.updated), " updated"), installStats.failed > 0 && /* @__PURE__ */ React3.createElement(Text3, null, " \u2514\u2500 ", /* @__PURE__ */ React3.createElement(Text3, { color: "red" }, installStats.failed), " failed")), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, "\u{1F4C1} Location: ", /* @__PURE__ */ React3.createElement(Text3, { color: "cyan" }, process.cwd(), "/.jai1"))), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true, color: "yellow" }, "\u{1F4E6} Next Step: Sync to IDE(s)?"), /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "Sync .jai1/ content to your IDE directories (rules, workflows)")), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "[Enter] Select IDE(s) to sync \xB7 [S/Q] Skip and exit")));
|
|
1632
|
+
return /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(Text3, { bold: true, color: "green" }, "\u2705 Installation Complete!")), /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", borderStyle: "round", borderColor: "gray", padding: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, installStats.total, " components processed:"), /* @__PURE__ */ React3.createElement(Text3, null, " \u2514\u2500 ", /* @__PURE__ */ React3.createElement(Text3, { color: "green" }, installStats.added), " newly added"), /* @__PURE__ */ React3.createElement(Text3, null, " \u2514\u2500 ", /* @__PURE__ */ React3.createElement(Text3, { color: "cyan" }, installStats.updated), " updated"), installStats.failed > 0 && /* @__PURE__ */ React3.createElement(Text3, null, " \u2514\u2500 ", /* @__PURE__ */ React3.createElement(Text3, { color: "red" }, installStats.failed), " failed")), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, "\u{1F4C1} Location: ", /* @__PURE__ */ React3.createElement(Text3, { color: "cyan" }, process.cwd(), "/.jai1"))), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true, color: "yellow" }, "\u{1F4E6} Next Step: Sync to IDE(s)?"), /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "Sync .jai1/ content to your IDE directories (rules, workflows)")), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "[Enter] Select IDE(s) to sync \xB7 [S/Ctrl+Q] Skip and exit")));
|
|
1613
1633
|
}
|
|
1614
1634
|
if (viewState === "ide-sync") {
|
|
1615
1635
|
return /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(Text3, { bold: true, color: "cyan" }, "\u{1F504} Select IDE(s) to Sync")), /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "Sync .jai1/ content (rules, workflows) to IDE-specific directories")), /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", padding: 1 }, availableIdes.map((ide, i) => {
|
|
@@ -1617,7 +1637,7 @@ var UnifiedApplyApp = ({
|
|
|
1617
1637
|
const isCursor = i === ideCursorIndex;
|
|
1618
1638
|
const isChecked = selectedIdes.has(ide);
|
|
1619
1639
|
return /* @__PURE__ */ React3.createElement(Box2, { key: ide }, /* @__PURE__ */ React3.createElement(Text3, { color: isCursor ? "cyan" : "white" }, isCursor ? "\u276F " : " ", isChecked ? "[\u2713]" : "[ ]", " ", ideConfig.icon, " ", ideConfig.name));
|
|
1620
|
-
})), selectedIdes.size > 0 && /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, "Selected: ", /* @__PURE__ */ React3.createElement(Text3, { color: "green" }, selectedIdes.size), " IDE(s)")), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "[\u2191\u2193] Navigate \xB7 [\u2423] Toggle \xB7 [A] Select all \xB7 [C] Clear \xB7 [Enter] Sync \xB7 [S/Q] Skip")));
|
|
1640
|
+
})), selectedIdes.size > 0 && /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, "Selected: ", /* @__PURE__ */ React3.createElement(Text3, { color: "green" }, selectedIdes.size), " IDE(s)")), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "[\u2191\u2193] Navigate \xB7 [\u2423] Toggle \xB7 [A] Select all \xB7 [C] Clear \xB7 [Enter] Sync \xB7 [S/Ctrl+Q] Skip")));
|
|
1621
1641
|
}
|
|
1622
1642
|
if (viewState === "syncing") {
|
|
1623
1643
|
return /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", padding: 1 }, /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(Text3, { bold: true, color: "cyan" }, "\u{1F504} Syncing to IDE(s)")), /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(ProgressBar, { current: syncStats.completed, total: syncStats.total, width: 50 })), /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", borderStyle: "round", borderColor: "gray", padding: 1, height: 10 }, syncProgress.slice(-8).map((item, idx) => /* @__PURE__ */ React3.createElement(Box2, { key: `${item.targetPath}-${idx}` }, /* @__PURE__ */ React3.createElement(StatusIcon, { status: item.status === "success" ? "success" : item.status === "error" ? "error" : item.status === "syncing" ? "loading" : "pending" }), /* @__PURE__ */ React3.createElement(Text3, null, " ", item.targetPath), item.error && /* @__PURE__ */ React3.createElement(Text3, { color: "red", dimColor: true }, " (", item.error, ")")))), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, null, "\u{1F4CA} ", /* @__PURE__ */ React3.createElement(Text3, { color: "green" }, syncStats.created, " created"), " \xB7 ", /* @__PURE__ */ React3.createElement(Text3, { color: "cyan" }, syncStats.updated, " updated"), syncStats.skipped > 0 && /* @__PURE__ */ React3.createElement(React3.Fragment, null, " \xB7 ", /* @__PURE__ */ React3.createElement(Text3, { color: "yellow" }, syncStats.skipped, " skipped")), syncStats.errors > 0 && /* @__PURE__ */ React3.createElement(React3.Fragment, null, " \xB7 ", /* @__PURE__ */ React3.createElement(Text3, { color: "red" }, syncStats.errors, " errors")))));
|
|
@@ -1648,12 +1668,12 @@ var UnifiedApplyApp = ({
|
|
|
1648
1668
|
tag.count,
|
|
1649
1669
|
"]"
|
|
1650
1670
|
));
|
|
1651
|
-
})), focusArea === "packages" && tags.length > 0 && /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "\u2190 \u2192 to browse packages \xB7 Space/Enter to select package"))), /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", borderStyle: "round", borderColor: focusArea === "components" ? "cyan" : "gray", padding: 1 }, /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Components "),
|
|
1671
|
+
})), focusArea === "packages" && tags.length > 0 && /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "\u2190 \u2192 to browse packages \xB7 Space/Enter to select package"))), /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", borderStyle: "round", borderColor: focusArea === "components" ? "cyan" : "gray", padding: 1 }, /* @__PURE__ */ React3.createElement(Box2, { marginBottom: 1 }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Components "), activePackageFilter && /* @__PURE__ */ React3.createElement(Text3, { color: "cyan" }, "[", activePackageFilter, "] "), /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "(", filteredComponents.length, " shown", hasMore ? `, scroll for more` : "", ")")), visibleComponents.map((comp, i) => {
|
|
1652
1672
|
const isCursor = i === cursorIndex && focusArea === "components";
|
|
1653
1673
|
const isChecked = selectedPaths.has(comp.filepath);
|
|
1654
1674
|
const isInstalled = installedPaths.has(comp.filepath);
|
|
1655
1675
|
return /* @__PURE__ */ React3.createElement(Box2, { key: comp.filepath }, /* @__PURE__ */ React3.createElement(Text3, { color: isCursor ? "cyan" : "white" }, isCursor ? "\u276F " : " ", isChecked ? "[\u2713]" : "[ ]", " ", comp.filepath), /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, " ", isInstalled ? "\u2713 installed" : "\u25CB new"));
|
|
1656
|
-
}), filteredComponents.length === 0 && /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "No components match your search")), selectedPaths.size > 0 && /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Selected: ", selectedPaths.size, " components"), /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", marginLeft: 2 }, Array.from(selectedPaths).slice(0, 4).map((fp) => /* @__PURE__ */ React3.createElement(Text3, { key: fp, dimColor: true }, "\u{1F4CC} ", fp)), selectedPaths.size > 4 && /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, " ... and ", selectedPaths.size - 4, " more"))), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, focusArea === "packages" && "[\u2190\u2192] Browse packages \xB7 [\u2423/Enter] Select package", focusArea === "components" && "[\u2191\u2193] Navigate \xB7 [\u2423] Toggle", focusArea === "search" && "Type to search...", " \xB7 [Tab] Switch area \xB7 [A] All \xB7 [C] Clear \xB7 [Enter] Apply \xB7 [Q] Quit")));
|
|
1676
|
+
}), filteredComponents.length === 0 && /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "No components match your search")), selectedPaths.size > 0 && /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React3.createElement(Text3, { bold: true }, "Selected: ", selectedPaths.size, " components"), /* @__PURE__ */ React3.createElement(Box2, { flexDirection: "column", marginLeft: 2 }, Array.from(selectedPaths).slice(0, 4).map((fp) => /* @__PURE__ */ React3.createElement(Text3, { key: fp, dimColor: true }, "\u{1F4CC} ", fp)), selectedPaths.size > 4 && /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, " ... and ", selectedPaths.size - 4, " more"))), /* @__PURE__ */ React3.createElement(Box2, { marginTop: 1, borderStyle: "single", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, focusArea === "packages" && "[\u2190\u2192] Browse packages \xB7 [\u2423/Enter] Select package", focusArea === "components" && "[\u2191\u2193] Navigate \xB7 [\u2423] Toggle", focusArea === "search" && "Type to search...", " \xB7 [Tab] Switch area \xB7 [A] All \xB7 [C] Clear \xB7 [Enter] Apply \xB7 [Ctrl+Q] Quit")));
|
|
1657
1677
|
};
|
|
1658
1678
|
|
|
1659
1679
|
// src/commands/apply.ts
|
|
@@ -3831,7 +3851,7 @@ var Footer = ({ focusArea, isSearchOpen = false }) => {
|
|
|
3831
3851
|
{ key: "Enter", action: "Select" },
|
|
3832
3852
|
{ key: "\u2192/Tab", action: "Content" },
|
|
3833
3853
|
{ key: "/", action: "Search" },
|
|
3834
|
-
{ key: "q", action: "Quit" }
|
|
3854
|
+
{ key: "Ctrl+q", action: "Quit" }
|
|
3835
3855
|
];
|
|
3836
3856
|
}
|
|
3837
3857
|
return [
|
|
@@ -10158,7 +10178,7 @@ var UtilsApp = ({ onExit }) => {
|
|
|
10158
10178
|
setSelectedIndex((prev) => prev < MENU_ITEMS2.length - 1 ? prev + 1 : 0);
|
|
10159
10179
|
} else if (key.return) {
|
|
10160
10180
|
setActiveView(MENU_ITEMS2[selectedIndex].id);
|
|
10161
|
-
} else if (input5 === "q" || key.escape) {
|
|
10181
|
+
} else if (input5 === "q" && key.ctrl || key.escape) {
|
|
10162
10182
|
onExit();
|
|
10163
10183
|
exit();
|
|
10164
10184
|
}
|
|
@@ -10173,7 +10193,7 @@ var UtilsApp = ({ onExit }) => {
|
|
|
10173
10193
|
marginBottom: 1
|
|
10174
10194
|
},
|
|
10175
10195
|
/* @__PURE__ */ React41.createElement(Text36, { bold: true, color: "cyan" }, "\u{1F6E0}\uFE0F Developer Utilities - Interactive Mode"),
|
|
10176
|
-
/* @__PURE__ */ React41.createElement(Box36, { marginLeft: "auto" }, /* @__PURE__ */ React41.createElement(Text36, { dimColor: true }, "Press
|
|
10196
|
+
/* @__PURE__ */ React41.createElement(Box36, { marginLeft: "auto" }, /* @__PURE__ */ React41.createElement(Text36, { dimColor: true }, "Press Ctrl+Q to quit"))
|
|
10177
10197
|
), /* @__PURE__ */ React41.createElement(Box36, { flexGrow: 1 }, /* @__PURE__ */ React41.createElement(
|
|
10178
10198
|
Box36,
|
|
10179
10199
|
{
|
|
@@ -10232,7 +10252,7 @@ var WelcomeView = ({ selectedItem }) => {
|
|
|
10232
10252
|
marginBottom: 2
|
|
10233
10253
|
},
|
|
10234
10254
|
/* @__PURE__ */ React41.createElement(Box36, { flexDirection: "column" }, /* @__PURE__ */ React41.createElement(Text36, { bold: true, color: "yellow" }, selectedItem.icon, " ", selectedItem.label), /* @__PURE__ */ React41.createElement(Text36, { dimColor: true }, selectedItem.description))
|
|
10235
|
-
), /* @__PURE__ */ React41.createElement(Box36, { marginBottom: 1 }, /* @__PURE__ */ React41.createElement(Text36, { bold: true }, "Quick Actions:")), /* @__PURE__ */ React41.createElement(Box36, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React41.createElement(Text36, null, "\u2022 Press ", /* @__PURE__ */ React41.createElement(Text36, { color: "green" }, "Enter"), " to open selected utility"), /* @__PURE__ */ React41.createElement(Text36, null, "\u2022 Use ", /* @__PURE__ */ React41.createElement(Text36, { color: "green" }, "\u2191/\u2193"), " or ", /* @__PURE__ */ React41.createElement(Text36, { color: "green" }, "j/k"), " to navigate"), /* @__PURE__ */ React41.createElement(Text36, null, "\u2022 Press ", /* @__PURE__ */ React41.createElement(Text36, { color: "green" }, "Esc"), " to go back or quit"), /* @__PURE__ */ React41.createElement(Text36, null, "\u2022 Press ", /* @__PURE__ */ React41.createElement(Text36, { color: "green" }, "
|
|
10255
|
+
), /* @__PURE__ */ React41.createElement(Box36, { marginBottom: 1 }, /* @__PURE__ */ React41.createElement(Text36, { bold: true }, "Quick Actions:")), /* @__PURE__ */ React41.createElement(Box36, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React41.createElement(Text36, null, "\u2022 Press ", /* @__PURE__ */ React41.createElement(Text36, { color: "green" }, "Enter"), " to open selected utility"), /* @__PURE__ */ React41.createElement(Text36, null, "\u2022 Use ", /* @__PURE__ */ React41.createElement(Text36, { color: "green" }, "\u2191/\u2193"), " or ", /* @__PURE__ */ React41.createElement(Text36, { color: "green" }, "j/k"), " to navigate"), /* @__PURE__ */ React41.createElement(Text36, null, "\u2022 Press ", /* @__PURE__ */ React41.createElement(Text36, { color: "green" }, "Esc"), " to go back or quit"), /* @__PURE__ */ React41.createElement(Text36, null, "\u2022 Press ", /* @__PURE__ */ React41.createElement(Text36, { color: "green" }, "Ctrl+Q"), " to quit anytime")), /* @__PURE__ */ React41.createElement(Box36, { marginTop: 2 }, /* @__PURE__ */ React41.createElement(Text36, { dimColor: true }, "\u{1F4A1} Tip: Each utility provides an interactive interface for easy usage.")));
|
|
10236
10256
|
};
|
|
10237
10257
|
var ActiveUtilityView = ({ utilityType }) => {
|
|
10238
10258
|
switch (utilityType) {
|