@tacuchi/agent-workflow-cli 7.2.0 → 7.3.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/application/project-tab-data.d.ts +119 -0
- package/dist/application/project-tab-data.d.ts.map +1 -0
- package/dist/application/project-tab-data.js +320 -0
- package/dist/application/project-tab-data.js.map +1 -0
- package/dist/cli/interactive-menu.d.ts +1 -1
- package/dist/cli/interactive-menu.d.ts.map +1 -1
- package/dist/cli/main.js +6 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/tui/app.d.ts.map +1 -1
- package/dist/cli/tui/app.js +116 -102
- package/dist/cli/tui/app.js.map +1 -1
- package/dist/cli/tui/components/command-palette.d.ts +39 -0
- package/dist/cli/tui/components/command-palette.d.ts.map +1 -0
- package/dist/cli/tui/components/command-palette.js +116 -0
- package/dist/cli/tui/components/command-palette.js.map +1 -0
- package/dist/cli/tui/components/header.d.ts +6 -0
- package/dist/cli/tui/components/header.d.ts.map +1 -1
- package/dist/cli/tui/components/header.js +8 -2
- package/dist/cli/tui/components/header.js.map +1 -1
- package/dist/cli/tui/components/host-chip.d.ts +28 -0
- package/dist/cli/tui/components/host-chip.d.ts.map +1 -0
- package/dist/cli/tui/components/host-chip.js +35 -0
- package/dist/cli/tui/components/host-chip.js.map +1 -0
- package/dist/cli/tui/components/keymap-bar.d.ts +8 -0
- package/dist/cli/tui/components/keymap-bar.d.ts.map +1 -1
- package/dist/cli/tui/components/keymap-bar.js +7 -1
- package/dist/cli/tui/components/keymap-bar.js.map +1 -1
- package/dist/cli/tui/components/page-head.d.ts +18 -0
- package/dist/cli/tui/components/page-head.d.ts.map +1 -0
- package/dist/cli/tui/components/page-head.js +14 -0
- package/dist/cli/tui/components/page-head.js.map +1 -0
- package/dist/cli/tui/components/pill.d.ts +16 -0
- package/dist/cli/tui/components/pill.d.ts.map +1 -0
- package/dist/cli/tui/components/pill.js +24 -0
- package/dist/cli/tui/components/pill.js.map +1 -0
- package/dist/cli/tui/components/tab-bar.d.ts +12 -0
- package/dist/cli/tui/components/tab-bar.d.ts.map +1 -1
- package/dist/cli/tui/components/tab-bar.js +11 -5
- package/dist/cli/tui/components/tab-bar.js.map +1 -1
- package/dist/cli/tui/components/toast-stack.d.ts +41 -0
- package/dist/cli/tui/components/toast-stack.d.ts.map +1 -0
- package/dist/cli/tui/components/toast-stack.js +61 -0
- package/dist/cli/tui/components/toast-stack.js.map +1 -0
- package/dist/cli/tui/hosts.d.ts +16 -0
- package/dist/cli/tui/hosts.d.ts.map +1 -0
- package/dist/cli/tui/hosts.js +31 -0
- package/dist/cli/tui/hosts.js.map +1 -0
- package/dist/cli/tui/tabs/mcp-tab.d.ts +22 -1
- package/dist/cli/tui/tabs/mcp-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab.js +165 -129
- package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
- package/dist/cli/tui/tabs/plugins-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/plugins-tab.js +78 -19
- package/dist/cli/tui/tabs/plugins-tab.js.map +1 -1
- package/dist/cli/tui/tabs/project-tab.d.ts +19 -0
- package/dist/cli/tui/tabs/project-tab.d.ts.map +1 -0
- package/dist/cli/tui/tabs/project-tab.js +188 -0
- package/dist/cli/tui/tabs/project-tab.js.map +1 -0
- package/dist/cli/tui/tabs/skills-tab.d.ts +17 -1
- package/dist/cli/tui/tabs/skills-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/skills-tab.js +127 -224
- package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
- package/dist/cli/tui/tabs/status-tab.d.ts +13 -0
- package/dist/cli/tui/tabs/status-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/status-tab.js +52 -66
- package/dist/cli/tui/tabs/status-tab.js.map +1 -1
- package/dist/cli/tui/tabs/update-tab.d.ts +12 -1
- package/dist/cli/tui/tabs/update-tab.d.ts.map +1 -1
- package/dist/cli/tui/tabs/update-tab.js +54 -49
- package/dist/cli/tui/tabs/update-tab.js.map +1 -1
- package/dist/cli/tui/theme.d.ts +84 -12
- package/dist/cli/tui/theme.d.ts.map +1 -1
- package/dist/cli/tui/theme.js +100 -16
- package/dist/cli/tui/theme.js.map +1 -1
- package/dist/cli/tui/tui-prefs.d.ts +15 -0
- package/dist/cli/tui/tui-prefs.d.ts.map +1 -0
- package/dist/cli/tui/tui-prefs.js +45 -0
- package/dist/cli/tui/tui-prefs.js.map +1 -0
- package/package.json +1 -1
- package/skills/agent-workflow/commands/doctor.md +1 -1
- package/skills/agent-workflow/doctrine/compact/SKILL.md +1 -1
- package/skills/agent-workflow/doctrine/session/references/branch-verification.md +1 -1
- package/skills/agent-workflow/doctrine/session/references/commits-policy.md +2 -2
- package/skills/agent-workflow/specialties/design-deliver/SKILL.md +1 -1
- package/skills/agent-workflow/standards/coding-standards/references/fe-be-integration.md +2 -2
package/dist/cli/tui/app.js
CHANGED
|
@@ -1,96 +1,144 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Box,
|
|
3
|
-
import { useMemo, useState } from "react";
|
|
2
|
+
import { Box, useApp, useInput } from "ink";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
4
4
|
import { Header } from "./components/header.js";
|
|
5
5
|
import { KeymapBar } from "./components/keymap-bar.js";
|
|
6
6
|
import { ScreenFrame } from "./components/screen-frame.js";
|
|
7
7
|
import { TabBar } from "./components/tab-bar.js";
|
|
8
|
+
import { ToastStack, useToasts } from "./components/toast-stack.js";
|
|
8
9
|
import { InputLockProvider, useInputLock } from "./input-lock.js";
|
|
9
10
|
import { McpTab } from "./tabs/mcp-tab.js";
|
|
10
11
|
import { PluginsTab } from "./tabs/plugins-tab.js";
|
|
12
|
+
import { ProjectTab } from "./tabs/project-tab.js";
|
|
11
13
|
import { SkillsTab } from "./tabs/skills-tab.js";
|
|
12
14
|
import { StatusTab } from "./tabs/status-tab.js";
|
|
13
15
|
import { UpdateTab } from "./tabs/update-tab.js";
|
|
14
|
-
import {
|
|
15
|
-
const TAB_ORDER = [
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
import { TuiPrefsService } from "./tui-prefs.js";
|
|
17
|
+
const TAB_ORDER = [
|
|
18
|
+
"status",
|
|
19
|
+
"project",
|
|
20
|
+
"mcp",
|
|
21
|
+
"skills",
|
|
22
|
+
"plugins",
|
|
23
|
+
"update",
|
|
22
24
|
];
|
|
25
|
+
// Atajo numérico → tab id.
|
|
26
|
+
const TAB_BY_KEY = {
|
|
27
|
+
"1": "status",
|
|
28
|
+
"2": "project",
|
|
29
|
+
"3": "mcp",
|
|
30
|
+
"4": "skills",
|
|
31
|
+
"5": "plugins",
|
|
32
|
+
"6": "update",
|
|
33
|
+
};
|
|
34
|
+
const QUIT_HINT = { key: "q", action: "salir" };
|
|
35
|
+
const TAB_HINT = { key: "Tab", action: "siguiente" };
|
|
36
|
+
const KEYS_BY_TAB = {
|
|
37
|
+
status: [TAB_HINT, QUIT_HINT],
|
|
38
|
+
project: [
|
|
39
|
+
{ key: "↑↓", action: "navegar" },
|
|
40
|
+
{ key: "⏎", action: "aplicar", accent: true },
|
|
41
|
+
QUIT_HINT,
|
|
42
|
+
],
|
|
43
|
+
mcp: [
|
|
44
|
+
{ key: "↑↓", action: "navegar" },
|
|
45
|
+
{ key: "⏎", action: "acciones", accent: true },
|
|
46
|
+
{ key: "n", action: "nueva" },
|
|
47
|
+
QUIT_HINT,
|
|
48
|
+
],
|
|
49
|
+
skills: [
|
|
50
|
+
{ key: "↑↓", action: "navegar" },
|
|
51
|
+
{ key: "⏎", action: "acciones", accent: true },
|
|
52
|
+
QUIT_HINT,
|
|
53
|
+
],
|
|
54
|
+
plugins: [
|
|
55
|
+
{ key: "↑↓", action: "navegar" },
|
|
56
|
+
{ key: "/", action: "buscar" },
|
|
57
|
+
{ key: "f", action: "filtros" },
|
|
58
|
+
QUIT_HINT,
|
|
59
|
+
],
|
|
60
|
+
update: [
|
|
61
|
+
{ key: "i", action: "aplicar", accent: true },
|
|
62
|
+
{ key: "r", action: "buscar" },
|
|
63
|
+
QUIT_HINT,
|
|
64
|
+
],
|
|
65
|
+
};
|
|
23
66
|
export function App(props) {
|
|
24
67
|
return (_jsx(InputLockProvider, { children: _jsx(AppShell, { ...props }) }));
|
|
25
68
|
}
|
|
26
69
|
function AppShell({ version, ctx, onResult }) {
|
|
27
70
|
const [activeTab, setActiveTab] = useState("status");
|
|
28
|
-
const [
|
|
71
|
+
const [density, setDensity] = useState("comfortable");
|
|
29
72
|
const { exit } = useApp();
|
|
30
73
|
const { locked: inputLocked } = useInputLock();
|
|
74
|
+
const { toasts, push: pushToast } = useToasts();
|
|
75
|
+
const prefsSvc = useMemo(() => new TuiPrefsService(ctx.fs, ctx.paths), [ctx.fs, ctx.paths]);
|
|
76
|
+
useEffect(() => {
|
|
77
|
+
void (async () => {
|
|
78
|
+
const prefs = await prefsSvc.load();
|
|
79
|
+
setDensity(prefs.density);
|
|
80
|
+
})();
|
|
81
|
+
}, [prefsSvc]);
|
|
82
|
+
/**
|
|
83
|
+
* Despacha acciones provenientes de las tabs (Proyecto landing, Update, etc).
|
|
84
|
+
* Las acciones que requieren ejecutar un comando CLI con stdin (init, update)
|
|
85
|
+
* salen del TUI primero y se manejan en `dispatchMenuAction` del main.
|
|
86
|
+
*/
|
|
87
|
+
const runAction = useCallback((id, _payload) => {
|
|
88
|
+
if (id === "project-init") {
|
|
89
|
+
onResult({ kind: "menu-action", action: "project-init" });
|
|
90
|
+
exit();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (id === "hub-init") {
|
|
94
|
+
onResult({ kind: "menu-action", action: "hub-init" });
|
|
95
|
+
exit();
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (id === "quit") {
|
|
99
|
+
onResult({ kind: "exit", exitCode: 0 });
|
|
100
|
+
exit();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (id === "git:status") {
|
|
104
|
+
pushToast({
|
|
105
|
+
tone: "info",
|
|
106
|
+
title: "git status",
|
|
107
|
+
body: "Abrí tu terminal para ver el detalle.",
|
|
108
|
+
});
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
pushToast({ tone: "info", title: id });
|
|
112
|
+
}, [pushToast, onResult, exit]);
|
|
31
113
|
useInput((input, key) => {
|
|
32
|
-
if (
|
|
33
|
-
|
|
114
|
+
if (inputLocked)
|
|
115
|
+
return;
|
|
116
|
+
if (input === "q" || input === "Q") {
|
|
117
|
+
onResult({ kind: "exit", exitCode: 0 });
|
|
118
|
+
exit();
|
|
34
119
|
return;
|
|
35
120
|
}
|
|
36
|
-
|
|
37
|
-
setActiveTab,
|
|
38
|
-
|
|
39
|
-
onExit: () => {
|
|
40
|
-
onResult({ kind: "exit", exitCode: 0 });
|
|
41
|
-
exit();
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
}, { isActive: !inputLocked });
|
|
45
|
-
const keymap = useMemo(() => {
|
|
46
|
-
if (inputLocked) {
|
|
47
|
-
return [
|
|
48
|
-
{ key: "⏎", action: "aceptar" },
|
|
49
|
-
{ key: "Esc", action: "cancelar" },
|
|
50
|
-
];
|
|
121
|
+
if (key.tab) {
|
|
122
|
+
setActiveTab((t) => cycleTab(t, key.shift === true));
|
|
123
|
+
return;
|
|
51
124
|
}
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
125
|
+
const target = TAB_BY_KEY[input];
|
|
126
|
+
if (target)
|
|
127
|
+
setActiveTab(target);
|
|
128
|
+
}, { isActive: true });
|
|
129
|
+
const tabs = [
|
|
130
|
+
{ id: "status", label: "Status", key: "1" },
|
|
131
|
+
{ id: "project", label: "Proyecto", key: "2" },
|
|
132
|
+
{ id: "mcp", label: "MCP", key: "3" },
|
|
133
|
+
{ id: "skills", label: "Skills", key: "4" },
|
|
134
|
+
{ id: "plugins", label: "Plugins", key: "5" },
|
|
135
|
+
{ id: "update", label: "Update", key: "6", alert: true },
|
|
136
|
+
];
|
|
137
|
+
const keymap = KEYS_BY_TAB[activeTab] ?? [];
|
|
138
|
+
return (_jsxs(ScreenFrame, { children: [_jsx(Header, { version: version, cwd: ctx.env.cwd(), homeDir: ctx.env.homeDir() }), _jsx(TabBar, { tabs: tabs, activeId: activeTab }), _jsxs(Box, { marginTop: density === "compact" ? 0 : 1, flexDirection: "column", children: [activeTab === "status" ? _jsx(StatusTab, { ctx: ctx, isActive: true }) : null, activeTab === "project" ? (_jsx(ProjectTab, { ctx: ctx, isActive: true, onRunAction: runAction })) : null, activeTab === "mcp" ? _jsx(McpTab, { ctx: ctx, isActive: true, onToast: pushToast }) : null, activeTab === "skills" ? (_jsx(SkillsTab, { ctx: ctx, isActive: true, onToast: pushToast })) : null, activeTab === "update" ? (_jsx(UpdateTab, { ctx: ctx, version: version, isActive: true, onToast: pushToast, onRequestUpdate: () => {
|
|
62
139
|
onResult({ kind: "menu-action", action: "update" });
|
|
63
140
|
exit();
|
|
64
|
-
} })) : null, activeTab === "plugins" ? _jsx(PluginsTab, { ctx: ctx, isActive:
|
|
65
|
-
}
|
|
66
|
-
function handleHelpKey(input, key, setHelpOpen) {
|
|
67
|
-
if (key.escape || input === "?" || input === "q" || input === "Q") {
|
|
68
|
-
setHelpOpen(false);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
function handleAppKey(input, key, handlers) {
|
|
72
|
-
if (input === "q" || input === "Q") {
|
|
73
|
-
handlers.onExit();
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
if (input === "?") {
|
|
77
|
-
handlers.setHelpOpen(true);
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
if (key.tab) {
|
|
81
|
-
handlers.setActiveTab((t) => cycleTab(t, key.shift === true));
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
const byNumber = {
|
|
85
|
-
"1": "status",
|
|
86
|
-
"2": "mcp",
|
|
87
|
-
"3": "skills",
|
|
88
|
-
"4": "plugins",
|
|
89
|
-
"5": "update",
|
|
90
|
-
};
|
|
91
|
-
const target = byNumber[input];
|
|
92
|
-
if (target)
|
|
93
|
-
handlers.setActiveTab(target);
|
|
141
|
+
} })) : null, activeTab === "plugins" ? _jsx(PluginsTab, { ctx: ctx, isActive: true }) : null] }), _jsx(ToastStack, { toasts: toasts }), _jsx(KeymapBar, { entries: keymap })] }));
|
|
94
142
|
}
|
|
95
143
|
function cycleTab(current, reverse) {
|
|
96
144
|
const idx = TAB_ORDER.indexOf(current);
|
|
@@ -99,38 +147,4 @@ function cycleTab(current, reverse) {
|
|
|
99
147
|
: (idx + 1) % TAB_ORDER.length;
|
|
100
148
|
return TAB_ORDER[next] ?? "status";
|
|
101
149
|
}
|
|
102
|
-
function keymapForTab(tab) {
|
|
103
|
-
switch (tab) {
|
|
104
|
-
case "mcp":
|
|
105
|
-
return [
|
|
106
|
-
{ key: "↑↓", action: "navegar" },
|
|
107
|
-
{ key: "⏎", action: "acciones" },
|
|
108
|
-
{ key: "n", action: "nueva" },
|
|
109
|
-
];
|
|
110
|
-
case "skills":
|
|
111
|
-
return [
|
|
112
|
-
{ key: "↑↓", action: "navegar" },
|
|
113
|
-
{ key: "⏎", action: "acciones" },
|
|
114
|
-
];
|
|
115
|
-
case "update":
|
|
116
|
-
return [
|
|
117
|
-
{ key: "↑↓", action: "navegar" },
|
|
118
|
-
{ key: "⏎", action: "seleccionar" },
|
|
119
|
-
];
|
|
120
|
-
case "plugins":
|
|
121
|
-
return [
|
|
122
|
-
{ key: "↑↓", action: "navegar" },
|
|
123
|
-
{ key: "⏎", action: "acciones" },
|
|
124
|
-
{ key: "n", action: "nuevo" },
|
|
125
|
-
];
|
|
126
|
-
case "status":
|
|
127
|
-
return [];
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
function HelpOverlay() {
|
|
131
|
-
return (_jsxs(Box, { flexDirection: "column", marginTop: 1, borderStyle: "round", borderColor: colors.accent, paddingX: 2, paddingY: 1, children: [_jsx(Text, { color: colors.fg, bold: true, children: "Ayuda" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Help, { label: "Tab / \u21E7Tab", desc: "cambiar tab" }), _jsx(Help, { label: "1 .. 5", desc: "ir a tab por n\u00FAmero" }), _jsx(Help, { label: "?", desc: "abrir/cerrar esta ayuda" }), _jsx(Help, { label: "q", desc: "salir del TUI" })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: colors.fgSubtle, bold: true, children: "MCP" }), _jsx(Help, { label: "\u2191\u2193", desc: "navegar conexiones" }), _jsx(Help, { label: "\u23CE", desc: "abrir men\u00FA de acciones de la conexi\u00F3n" }), _jsx(Help, { label: "\u2191\u2193 \u23CE", desc: "navegar el men\u00FA y aplicar" }), _jsx(Help, { label: "Esc", desc: "cerrar men\u00FA sin aplicar" }), _jsx(Help, { label: "n", desc: "registrar nueva conexi\u00F3n" })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: colors.fgSubtle, bold: true, children: "Skills" }), _jsx(Help, { label: "\u2191\u2193", desc: "navegar targets (Claude / Codex / Warp)" }), _jsx(Help, { label: "\u23CE", desc: "abrir men\u00FA de acciones del target" }), _jsx(Help, { label: "\u2191\u2193 \u23CE", desc: "navegar el men\u00FA y aplicar (instalar / desinstalar)" }), _jsx(Help, { label: "Esc", desc: "cerrar men\u00FA sin aplicar" })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: colors.fgSubtle, bold: true, children: "Plugins" }), _jsx(Help, { label: "\u2191\u2193", desc: "navegar plugins" }), _jsx(Help, { label: "\u23CE", desc: "abrir men\u00FA de acciones (clear / reload / install por host)" }), _jsx(Help, { label: "\u2191\u2193 \u23CE", desc: "navegar el men\u00FA y aplicar" }), _jsx(Help, { label: "Esc", desc: "cerrar men\u00FA sin aplicar" }), _jsx(Help, { label: "n", desc: "agregar nuevo plugin desde URL git (Warp/Agents)" })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: colors.fgMoreSubtle, children: "Esc cierra esta ventana." }) })] }));
|
|
132
|
-
}
|
|
133
|
-
function Help({ label, desc }) {
|
|
134
|
-
return (_jsxs(Box, { children: [_jsx(Text, { color: colors.accent, bold: true, children: label }), _jsx(Text, { color: colors.fgMoreSubtle, children: " " }), _jsx(Text, { color: colors.fgSubtle, children: desc })] }));
|
|
135
|
-
}
|
|
136
150
|
//# sourceMappingURL=app.js.map
|
package/dist/cli/tui/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/cli/tui/app.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/cli/tui/app.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface CommandEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
/** Categoría (navegación / acción / proyecto / vista / sesión) */
|
|
5
|
+
ctx: string;
|
|
6
|
+
/** Glyph corto a la izquierda del label */
|
|
7
|
+
glyph: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CommandPaletteProps {
|
|
10
|
+
/** Comandos disponibles para filtrar */
|
|
11
|
+
commands: readonly CommandEntry[];
|
|
12
|
+
/** Callback al ejecutar — recibe el `id` del comando seleccionado */
|
|
13
|
+
onRun: (id: string) => void;
|
|
14
|
+
/** Cierra el palette sin ejecutar */
|
|
15
|
+
onClose: () => void;
|
|
16
|
+
/** Si false, no consume input (cuando hay otro modal por encima) */
|
|
17
|
+
isActive?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* CommandPalette — overlay tipo Ctrl+K.
|
|
21
|
+
*
|
|
22
|
+
* - TextInput de `@inkjs/ui` para filtrar (case-insensitive en `label` + `ctx`).
|
|
23
|
+
* - Lista filtrada con cursor; `↑↓` mueve, `⏎` ejecuta, `Esc` cierra.
|
|
24
|
+
* - Footer con hint de navegación y conteo de resultados.
|
|
25
|
+
*
|
|
26
|
+
* En TTY no hay backdrop translúcido — el componente se renderiza en el área
|
|
27
|
+
* de contenido en lugar de la tab activa cuando está abierto (app.tsx maneja
|
|
28
|
+
* esa conmutación).
|
|
29
|
+
*/
|
|
30
|
+
export declare function CommandPalette({ commands, onRun, onClose, isActive }: CommandPaletteProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
/**
|
|
32
|
+
* Catálogo canónico de comandos del TUI.
|
|
33
|
+
*
|
|
34
|
+
* Stable IDs porque app.tsx + hooks externos hacen pattern match contra ellos.
|
|
35
|
+
* Cuando un comando no aplica al contexto actual el handler debe responder
|
|
36
|
+
* con un toast (no romper).
|
|
37
|
+
*/
|
|
38
|
+
export declare const PALETTE_COMMANDS: readonly CommandEntry[];
|
|
39
|
+
//# sourceMappingURL=command-palette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-palette.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/components/command-palette.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,wCAAwC;IACxC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,qEAAqE;IACrE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,qCAAqC;IACrC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAe,EAAE,EAAE,mBAAmB,2CA2EhG;AAoBD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,YAAY,EAiDnD,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { TextInput } from "@inkjs/ui";
|
|
3
|
+
import { Box, Text, useInput } from "ink";
|
|
4
|
+
import { useMemo, useState } from "react";
|
|
5
|
+
import { colors, icons } from "../theme.js";
|
|
6
|
+
/**
|
|
7
|
+
* CommandPalette — overlay tipo Ctrl+K.
|
|
8
|
+
*
|
|
9
|
+
* - TextInput de `@inkjs/ui` para filtrar (case-insensitive en `label` + `ctx`).
|
|
10
|
+
* - Lista filtrada con cursor; `↑↓` mueve, `⏎` ejecuta, `Esc` cierra.
|
|
11
|
+
* - Footer con hint de navegación y conteo de resultados.
|
|
12
|
+
*
|
|
13
|
+
* En TTY no hay backdrop translúcido — el componente se renderiza en el área
|
|
14
|
+
* de contenido en lugar de la tab activa cuando está abierto (app.tsx maneja
|
|
15
|
+
* esa conmutación).
|
|
16
|
+
*/
|
|
17
|
+
export function CommandPalette({ commands, onRun, onClose, isActive = true }) {
|
|
18
|
+
const [query, setQuery] = useState("");
|
|
19
|
+
const [cursor, setCursor] = useState(0);
|
|
20
|
+
const filtered = useMemo(() => {
|
|
21
|
+
if (!query)
|
|
22
|
+
return commands;
|
|
23
|
+
const q = query.toLowerCase();
|
|
24
|
+
return commands.filter((c) => c.label.toLowerCase().includes(q) || c.ctx.toLowerCase().includes(q));
|
|
25
|
+
}, [query, commands]);
|
|
26
|
+
// Reset cursor cuando cambia el filtro — derivado, no necesita useEffect.
|
|
27
|
+
// (El cursor se ajusta al límite cuando `filtered.length` cambia.)
|
|
28
|
+
useInput((_input, key) => {
|
|
29
|
+
if (key.upArrow) {
|
|
30
|
+
setCursor((c) => Math.max(0, c - 1));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (key.downArrow) {
|
|
34
|
+
setCursor((c) => Math.min(filtered.length - 1, c + 1));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (key.escape) {
|
|
38
|
+
onClose();
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (key.return) {
|
|
42
|
+
const target = filtered[cursor];
|
|
43
|
+
if (target) {
|
|
44
|
+
onRun(target.id);
|
|
45
|
+
onClose();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}, { isActive });
|
|
49
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsxs(Text, { color: colors.accent, bold: true, children: [icons.promptMark, " "] }), _jsx(Box, { flexGrow: 1, children: _jsx(TextInput, { isDisabled: !isActive, placeholder: "Buscar acci\u00F3n\u2026", onChange: (v) => {
|
|
50
|
+
setQuery(v);
|
|
51
|
+
setCursor(0);
|
|
52
|
+
}, onSubmit: () => {
|
|
53
|
+
const target = filtered[cursor];
|
|
54
|
+
if (target) {
|
|
55
|
+
onRun(target.id);
|
|
56
|
+
onClose();
|
|
57
|
+
}
|
|
58
|
+
} }) }), _jsx(Text, { color: colors.fgFaint, children: "esc" })] }), _jsx(Box, { flexDirection: "column", children: filtered.length === 0 ? (_jsx(Text, { color: colors.fgFaint, children: "(sin coincidencias)" })) : (filtered.map((c, i) => _jsx(CommandRow, { cmd: c, active: i === cursor }, c.id))) })] }));
|
|
59
|
+
}
|
|
60
|
+
function CommandRow({ cmd, active }) {
|
|
61
|
+
return (_jsxs(Box, { children: [_jsxs(Text, { color: active ? colors.accent : colors.fgFaint, bold: active, children: [active ? "› " : " ", cmd.glyph] }), _jsx(Text, { children: " " }), _jsx(Box, { flexGrow: 1, children: _jsx(Text, { color: active ? colors.fgBright : colors.fgSubtle, bold: active, children: cmd.label }) }), _jsx(Text, { color: colors.fgFaint, children: cmd.ctx })] }));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Catálogo canónico de comandos del TUI.
|
|
65
|
+
*
|
|
66
|
+
* Stable IDs porque app.tsx + hooks externos hacen pattern match contra ellos.
|
|
67
|
+
* Cuando un comando no aplica al contexto actual el handler debe responder
|
|
68
|
+
* con un toast (no romper).
|
|
69
|
+
*/
|
|
70
|
+
export const PALETTE_COMMANDS = [
|
|
71
|
+
// navegación
|
|
72
|
+
{ id: "goto:status", label: "Ir a Status", ctx: "navegación", glyph: "›" },
|
|
73
|
+
{ id: "goto:project", label: "Ir a Proyecto", ctx: "navegación", glyph: "›" },
|
|
74
|
+
{ id: "goto:mcp", label: "Ir a MCP", ctx: "navegación", glyph: "›" },
|
|
75
|
+
{ id: "goto:skills", label: "Ir a Skills", ctx: "navegación", glyph: "›" },
|
|
76
|
+
{ id: "goto:plugins", label: "Ir a Plugins", ctx: "navegación", glyph: "›" },
|
|
77
|
+
{ id: "goto:update", label: "Ir a Update", ctx: "navegación", glyph: "›" },
|
|
78
|
+
// proyecto
|
|
79
|
+
{ id: "git:status", label: "Git status", ctx: "proyecto", glyph: "◆" },
|
|
80
|
+
{ id: "sessions:open", label: "Abrir sesión más reciente", ctx: "proyecto", glyph: "▸" },
|
|
81
|
+
{ id: "pending:next", label: "Saltar al próximo pendiente", ctx: "proyecto", glyph: "→" },
|
|
82
|
+
// acción (install/update/maintenance)
|
|
83
|
+
{ id: "install:all", label: "Install completa en todos los hosts", ctx: "acción", glyph: "↓" },
|
|
84
|
+
{
|
|
85
|
+
id: "uninstall:all",
|
|
86
|
+
label: "Uninstall completo en todos los hosts",
|
|
87
|
+
ctx: "acción",
|
|
88
|
+
glyph: "×",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
id: "clean:cache",
|
|
92
|
+
label: "Limpiar cache de plugins (todos los hosts)",
|
|
93
|
+
ctx: "acción",
|
|
94
|
+
glyph: "⊘",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: "legacy:clean",
|
|
98
|
+
label: "Limpiar skills legacy (qtc-*, agent-workflow-manager)",
|
|
99
|
+
ctx: "acción",
|
|
100
|
+
glyph: "⚒",
|
|
101
|
+
},
|
|
102
|
+
{ id: "update:check", label: "Buscar actualización del CLI", ctx: "acción", glyph: "↻" },
|
|
103
|
+
{ id: "mcp:new", label: "Nueva conexión MCP", ctx: "acción", glyph: "+" },
|
|
104
|
+
{ id: "mcp:test-all", label: "Probar todas las conexiones MCP", ctx: "acción", glyph: "▸" },
|
|
105
|
+
{ id: "plugins:refresh", label: "Refrescar lista de plugins", ctx: "acción", glyph: "↻" },
|
|
106
|
+
// vista
|
|
107
|
+
{
|
|
108
|
+
id: "toggle:density",
|
|
109
|
+
label: "Alternar densidad (cómodo ↔ compacto)",
|
|
110
|
+
ctx: "vista",
|
|
111
|
+
glyph: "↔",
|
|
112
|
+
},
|
|
113
|
+
// sesión
|
|
114
|
+
{ id: "quit", label: "Salir del TUI", ctx: "sesión", glyph: "⎋" },
|
|
115
|
+
];
|
|
116
|
+
//# sourceMappingURL=command-palette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-palette.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/command-palette.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAsB5C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAG,IAAI,EAAuB;IAC/F,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;QAC5B,IAAI,CAAC,KAAK;YAAE,OAAO,QAAQ,CAAC;QAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC5E,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtB,0EAA0E;IAC1E,mEAAmE;IAEnE,QAAQ,CACN,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACd,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChC,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACjB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC,EACD,EAAE,QAAQ,EAAE,CACb,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,mBAC7B,KAAK,CAAC,UAAU,EAAE,GAAG,IACjB,EACP,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACd,KAAC,SAAS,IACR,UAAU,EAAE,CAAC,QAAQ,EACrB,WAAW,EAAC,0BAAgB,EAC5B,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;gCACd,QAAQ,CAAC,CAAC,CAAC,CAAC;gCACZ,SAAS,CAAC,CAAC,CAAC,CAAC;4BACf,CAAC,EACD,QAAQ,EAAE,GAAG,EAAE;gCACb,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;gCAChC,IAAI,MAAM,EAAE,CAAC;oCACX,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oCACjB,OAAO,EAAE,CAAC;gCACZ,CAAC;4BACH,CAAC,GACD,GACE,EACN,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,oBAAY,IACnC,EAEN,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,YACxB,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACvB,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,oCAA4B,CACxD,CAAC,CAAC,CAAC,CACF,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAC,UAAU,IAAY,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,MAAM,IAAlC,CAAC,CAAC,EAAE,CAAkC,CAAC,CAChF,GACG,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,GAAG,EAAE,MAAM,EAA0C;IACzE,OAAO,CACL,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,aAC/D,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EACpB,GAAG,CAAC,KAAK,IACL,EACP,KAAC,IAAI,oBAAS,EACd,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACd,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,YAClE,GAAG,CAAC,KAAK,GACL,GACH,EACN,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,YAAG,GAAG,CAAC,GAAG,GAAQ,IACzC,CACP,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA4B;IACvD,aAAa;IACb,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE;IAC1E,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE;IAC7E,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE;IACpE,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE;IAC1E,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE;IAC5E,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,EAAE;IAE1E,WAAW;IACX,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE;IACtE,EAAE,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,2BAA2B,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE;IACxF,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,6BAA6B,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE;IAEzF,sCAAsC;IACtC,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,qCAAqC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IAC9F;QACE,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,uCAAuC;QAC9C,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,GAAG;KACX;IACD;QACE,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,4CAA4C;QACnD,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,GAAG;KACX;IACD;QACE,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,uDAAuD;QAC9D,GAAG,EAAE,QAAQ;QACb,KAAK,EAAE,GAAG;KACX;IACD,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,8BAA8B,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACxF,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IACzE,EAAE,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,iCAAiC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IAC3F,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,4BAA4B,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;IAEzF,QAAQ;IACR;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,uCAAuC;QAC9C,GAAG,EAAE,OAAO;QACZ,KAAK,EAAE,GAAG;KACX;IAED,SAAS;IACT,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;CAClE,CAAC"}
|
|
@@ -3,6 +3,12 @@ export interface HeaderProps {
|
|
|
3
3
|
cwd?: string;
|
|
4
4
|
homeDir?: string;
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* Header — minimal chrome superior.
|
|
8
|
+
*
|
|
9
|
+
* Izquierda: diamante + name + version. Derecha: path corto.
|
|
10
|
+
* Sin "live indicator" — ruido innecesario.
|
|
11
|
+
*/
|
|
6
12
|
export declare function Header({ version, cwd, homeDir }: HeaderProps): import("react/jsx-runtime").JSX.Element;
|
|
7
13
|
export declare function prettyPath(cwd: string, homeDir?: string): string;
|
|
8
14
|
//# sourceMappingURL=header.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/components/header.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/components/header.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,WAAW,2CAe5D;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAMhE"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
3
|
import { colors, icons } from "../theme.js";
|
|
4
|
+
/**
|
|
5
|
+
* Header — minimal chrome superior.
|
|
6
|
+
*
|
|
7
|
+
* Izquierda: diamante + name + version. Derecha: path corto.
|
|
8
|
+
* Sin "live indicator" — ruido innecesario.
|
|
9
|
+
*/
|
|
4
10
|
export function Header({ version, cwd, homeDir }) {
|
|
5
11
|
const path = cwd ? prettyPath(cwd, homeDir) : undefined;
|
|
6
|
-
return (_jsxs(Box, { justifyContent: "space-between", marginBottom: 1, children: [_jsxs(Box, { children: [
|
|
12
|
+
return (_jsxs(Box, { justifyContent: "space-between", marginBottom: 1, children: [_jsxs(Box, { children: [_jsx(Text, { color: colors.accent, children: icons.brand }), _jsx(Text, { children: " " }), _jsx(Text, { color: colors.fgBright, bold: true, children: "agent-workflow" }), _jsxs(Text, { color: colors.fgFaint, children: [" v", version] })] }), path ? _jsx(Text, { color: colors.fgMoreSubtle, children: path }) : null] }));
|
|
7
13
|
}
|
|
8
14
|
export function prettyPath(cwd, homeDir) {
|
|
9
15
|
if (homeDir && cwd.startsWith(homeDir)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAQ5C,MAAM,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAe;IAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,OAAO,CACL,MAAC,GAAG,IAAC,cAAc,EAAC,eAAe,EAAC,YAAY,EAAE,CAAC,aACjD,MAAC,GAAG,eACF,
|
|
1
|
+
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAQ5C;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAe;IAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,OAAO,CACL,MAAC,GAAG,IAAC,cAAc,EAAC,eAAe,EAAC,YAAY,EAAE,CAAC,aACjD,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,YAAG,KAAK,CAAC,KAAK,GAAQ,EAChD,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,qCAE3B,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,mBAAK,OAAO,IAAQ,IAC3C,EACL,IAAI,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,YAAY,YAAG,IAAI,GAAQ,CAAC,CAAC,CAAC,IAAI,IAC1D,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,OAAgB;IACtD,IAAI,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type HostMeta } from "../hosts.js";
|
|
2
|
+
export interface HostChipProps {
|
|
3
|
+
/** id del host del registry */
|
|
4
|
+
id: string;
|
|
5
|
+
/** true = host instalado / activo */
|
|
6
|
+
on?: boolean;
|
|
7
|
+
/** override de display (overrides host.glyph) */
|
|
8
|
+
glyph?: string;
|
|
9
|
+
/** sólo "sm" por defecto en TTY; "md" agrega padding lateral */
|
|
10
|
+
size?: "xs" | "sm" | "md";
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* HostChip — glyph compacto de 1 letra que indica un host.
|
|
14
|
+
* En TTY no hay fondos arbitrarios; usamos `backgroundColor` de Ink (que el
|
|
15
|
+
* renderer adapta al terminal) y color de letra. Cuando `on=false` el chip
|
|
16
|
+
* pierde el fill verde y vuelve a hueso (muted).
|
|
17
|
+
*/
|
|
18
|
+
export declare function HostChip({ id, on, glyph, size }: HostChipProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
/**
|
|
20
|
+
* HostChipStrip — todos los hosts del registry como chips, en línea.
|
|
21
|
+
* Los `active` reciben color de "on", el resto queda en "off".
|
|
22
|
+
*/
|
|
23
|
+
export declare function HostChipStrip({ active, size, hosts, }: {
|
|
24
|
+
active: readonly string[];
|
|
25
|
+
size?: "xs" | "sm" | "md";
|
|
26
|
+
hosts?: readonly HostMeta[];
|
|
27
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=host-chip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-chip.d.ts","sourceRoot":"","sources":["../../../../src/cli/tui/components/host-chip.tsx"],"names":[],"mappings":"AACA,OAAO,EAAS,KAAK,QAAQ,EAAY,MAAM,aAAa,CAAC;AAG7D,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,qCAAqC;IACrC,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAS,EAAE,KAAK,EAAE,IAAW,EAAE,EAAE,aAAa,2CAe5E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,IAAW,EACX,KAAa,GACd,EAAE;IACD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;CAC7B,2CAWA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { HOSTS, hostMeta } from "../hosts.js";
|
|
4
|
+
import { colors } from "../theme.js";
|
|
5
|
+
/**
|
|
6
|
+
* HostChip — glyph compacto de 1 letra que indica un host.
|
|
7
|
+
* En TTY no hay fondos arbitrarios; usamos `backgroundColor` de Ink (que el
|
|
8
|
+
* renderer adapta al terminal) y color de letra. Cuando `on=false` el chip
|
|
9
|
+
* pierde el fill verde y vuelve a hueso (muted).
|
|
10
|
+
*/
|
|
11
|
+
export function HostChip({ id, on = true, glyph, size = "sm" }) {
|
|
12
|
+
const meta = hostMeta(id);
|
|
13
|
+
const ch = glyph ?? meta.glyph;
|
|
14
|
+
if (on) {
|
|
15
|
+
return (_jsx(Text, { color: colors.success, bold: true, children: wrap(ch, size) }));
|
|
16
|
+
}
|
|
17
|
+
return (_jsx(Text, { color: colors.fgFaint, dimColor: true, children: wrap(ch, size) }));
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* HostChipStrip — todos los hosts del registry como chips, en línea.
|
|
21
|
+
* Los `active` reciben color de "on", el resto queda en "off".
|
|
22
|
+
*/
|
|
23
|
+
export function HostChipStrip({ active, size = "sm", hosts = HOSTS, }) {
|
|
24
|
+
const onSet = new Set(active);
|
|
25
|
+
return (_jsx(Box, { children: hosts.map((h, idx) => (_jsx(Box, { marginLeft: idx === 0 ? 0 : 1, children: _jsx(HostChip, { id: h.id, on: onSet.has(h.id), size: size }) }, h.id))) }));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Render del chip — en TTY usamos `[X]` para md, `X` solo para sm/xs.
|
|
29
|
+
*/
|
|
30
|
+
function wrap(ch, size) {
|
|
31
|
+
if (size === "md")
|
|
32
|
+
return `[${ch}]`;
|
|
33
|
+
return ch;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=host-chip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-chip.js","sourceRoot":"","sources":["../../../../src/cli/tui/components/host-chip.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,KAAK,EAAiB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAarC;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,EAAiB;IAC3E,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;IAC/B,IAAI,EAAE,EAAE,CAAC;QACP,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,kBAC9B,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,GACV,CACR,CAAC;IACJ,CAAC;IACD,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,kBAClC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,GACV,CACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,MAAM,EACN,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,KAAK,GAKd;IACC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,CACL,KAAC,GAAG,cACD,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CACrB,KAAC,GAAG,IAAY,UAAU,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAC3C,KAAC,QAAQ,IAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,GAAI,IAD/C,CAAC,CAAC,EAAE,CAER,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,IAAI,CAAC,EAAU,EAAE,IAAwB;IAChD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,EAAE,GAAG,CAAC;IACpC,OAAO,EAAE,CAAC;AACZ,CAAC"}
|