@colmbus72/yeehaw 0.4.2 → 0.6.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/claude-plugin/.claude-plugin/plugin.json +2 -1
- package/claude-plugin/hooks/hooks.json +41 -0
- package/claude-plugin/hooks/session-status.sh +13 -0
- package/claude-plugin/skills/yeehaw-development/SKILL.md +70 -0
- package/dist/app.js +228 -28
- package/dist/components/CritterHeader.d.ts +7 -0
- package/dist/components/CritterHeader.js +81 -0
- package/dist/components/HelpOverlay.js +4 -2
- package/dist/components/List.d.ts +10 -1
- package/dist/components/List.js +14 -5
- package/dist/components/Panel.js +27 -1
- package/dist/components/SplashScreen.js +1 -1
- package/dist/hooks/useSessions.js +2 -2
- package/dist/index.js +41 -1
- package/dist/lib/auth/index.d.ts +2 -0
- package/dist/lib/auth/index.js +3 -0
- package/dist/lib/auth/linear.d.ts +20 -0
- package/dist/lib/auth/linear.js +79 -0
- package/dist/lib/auth/storage.d.ts +12 -0
- package/dist/lib/auth/storage.js +53 -0
- package/dist/lib/config.d.ts +13 -1
- package/dist/lib/config.js +51 -0
- package/dist/lib/context.d.ts +10 -0
- package/dist/lib/context.js +63 -0
- package/dist/lib/critters.d.ts +61 -0
- package/dist/lib/critters.js +365 -0
- package/dist/lib/hooks.d.ts +20 -0
- package/dist/lib/hooks.js +91 -0
- package/dist/lib/hotkeys.d.ts +1 -1
- package/dist/lib/hotkeys.js +28 -20
- package/dist/lib/issues/github.d.ts +11 -0
- package/dist/lib/issues/github.js +154 -0
- package/dist/lib/issues/index.d.ts +14 -0
- package/dist/lib/issues/index.js +27 -0
- package/dist/lib/issues/linear.d.ts +24 -0
- package/dist/lib/issues/linear.js +345 -0
- package/dist/lib/issues/types.d.ts +82 -0
- package/dist/lib/issues/types.js +2 -0
- package/dist/lib/paths.d.ts +3 -0
- package/dist/lib/paths.js +3 -0
- package/dist/lib/signals.d.ts +30 -0
- package/dist/lib/signals.js +104 -0
- package/dist/lib/tmux.d.ts +9 -2
- package/dist/lib/tmux.js +114 -18
- package/dist/mcp-server.js +161 -1
- package/dist/types.d.ts +23 -2
- package/dist/views/BarnContext.d.ts +5 -2
- package/dist/views/BarnContext.js +202 -21
- package/dist/views/CritterDetailView.d.ts +10 -0
- package/dist/views/CritterDetailView.js +117 -0
- package/dist/views/CritterLogsView.d.ts +8 -0
- package/dist/views/CritterLogsView.js +100 -0
- package/dist/views/GlobalDashboard.d.ts +2 -2
- package/dist/views/GlobalDashboard.js +20 -18
- package/dist/views/IssuesView.d.ts +2 -1
- package/dist/views/IssuesView.js +661 -98
- package/dist/views/LivestockDetailView.d.ts +2 -1
- package/dist/views/LivestockDetailView.js +19 -8
- package/dist/views/ProjectContext.d.ts +2 -2
- package/dist/views/ProjectContext.js +68 -25
- package/package.json +5 -5
|
@@ -9,8 +9,9 @@ interface LivestockDetailViewProps {
|
|
|
9
9
|
onBack: () => void;
|
|
10
10
|
onOpenLogs: () => void;
|
|
11
11
|
onOpenSession: () => void;
|
|
12
|
+
onOpenClaude?: () => void;
|
|
12
13
|
onSelectWindow: (window: TmuxWindow) => void;
|
|
13
14
|
onUpdateLivestock: (originalLivestock: Livestock, updatedLivestock: Livestock) => void;
|
|
14
15
|
}
|
|
15
|
-
export declare function LivestockDetailView({ project, livestock, source, sourceBarn, windows, onBack, onOpenLogs, onOpenSession, onSelectWindow, onUpdateLivestock, }: LivestockDetailViewProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export declare function LivestockDetailView({ project, livestock, source, sourceBarn, windows, onBack, onOpenLogs, onOpenSession, onOpenClaude, onSelectWindow, onUpdateLivestock, }: LivestockDetailViewProps): import("react/jsx-runtime").JSX.Element;
|
|
16
17
|
export {};
|
|
@@ -9,7 +9,7 @@ import { Panel } from '../components/Panel.js';
|
|
|
9
9
|
import { PathInput } from '../components/PathInput.js';
|
|
10
10
|
import { loadBarn } from '../lib/config.js';
|
|
11
11
|
import { getWindowStatus } from '../lib/tmux.js';
|
|
12
|
-
export function LivestockDetailView({ project, livestock, source, sourceBarn, windows, onBack, onOpenLogs, onOpenSession, onSelectWindow, onUpdateLivestock, }) {
|
|
12
|
+
export function LivestockDetailView({ project, livestock, source, sourceBarn, windows, onBack, onOpenLogs, onOpenSession, onOpenClaude, onSelectWindow, onUpdateLivestock, }) {
|
|
13
13
|
const [mode, setMode] = useState('normal');
|
|
14
14
|
// Edit form state
|
|
15
15
|
const [editName, setEditName] = useState(livestock.name);
|
|
@@ -74,6 +74,13 @@ export function LivestockDetailView({ project, livestock, source, sourceBarn, wi
|
|
|
74
74
|
// Only process these in normal mode
|
|
75
75
|
if (mode !== 'normal')
|
|
76
76
|
return;
|
|
77
|
+
if (input === 'c') {
|
|
78
|
+
// Claude session only available for local livestock
|
|
79
|
+
if (onOpenClaude && !barn) {
|
|
80
|
+
onOpenClaude();
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
77
84
|
if (input === 's') {
|
|
78
85
|
onOpenSession();
|
|
79
86
|
return;
|
|
@@ -127,14 +134,18 @@ export function LivestockDetailView({ project, livestock, source, sourceBarn, wi
|
|
|
127
134
|
// Filter windows to this livestock (match pattern: projectname-livestockname)
|
|
128
135
|
const livestockWindowName = `${project.name}-${livestock.name}`;
|
|
129
136
|
const livestockWindows = windows.filter(w => w.name === livestockWindowName || w.name.startsWith(`${livestockWindowName}-`));
|
|
130
|
-
const sessionItems = livestockWindows.map((w, i) =>
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
137
|
+
const sessionItems = livestockWindows.map((w, i) => {
|
|
138
|
+
const statusInfo = getWindowStatus(w);
|
|
139
|
+
return {
|
|
140
|
+
id: String(w.index),
|
|
141
|
+
label: `[${i + 1}] shell`,
|
|
142
|
+
status: w.active ? 'active' : 'inactive',
|
|
143
|
+
meta: statusInfo.text,
|
|
144
|
+
sessionStatus: statusInfo.status,
|
|
145
|
+
};
|
|
146
|
+
});
|
|
136
147
|
// Normal view - show livestock info inline with sessions
|
|
137
|
-
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(LivestockHeader, { project: project, livestock: livestock }), _jsxs(Box, { paddingX: 2, gap: 3, children: [_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "path:" }), " ", livestock.path] }), barn && (_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "barn:" }), " ", barn.name, " ", _jsxs(Text, { dimColor: true, children: ["(", barn.host, ")"] })] }))] }), _jsxs(Box, { paddingX: 2, gap: 3, marginBottom: 1, children: [livestock.repo && (_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "repo:" }), " ", livestock.repo] })), livestock.log_path && (_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "logs:" }), " ", livestock.log_path] })), livestock.env_path && (_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "env:" }), " ", livestock.env_path] }))] }), _jsx(Box, { paddingX: 1, flexGrow: 1, children: _jsx(Panel, { title: "Sessions", focused: true,
|
|
148
|
+
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(LivestockHeader, { project: project, livestock: livestock }), _jsxs(Box, { paddingX: 2, gap: 3, children: [_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "path:" }), " ", livestock.path] }), barn && (_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "barn:" }), " ", barn.name, " ", _jsxs(Text, { dimColor: true, children: ["(", barn.host, ")"] })] }))] }), _jsxs(Box, { paddingX: 2, gap: 3, marginBottom: 1, children: [livestock.repo && (_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "repo:" }), " ", livestock.repo] })), livestock.log_path && (_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "logs:" }), " ", livestock.log_path] })), livestock.env_path && (_jsxs(Text, { children: [_jsx(Text, { dimColor: true, children: "env:" }), " ", livestock.env_path] }))] }), _jsx(Box, { paddingX: 1, flexGrow: 1, children: _jsx(Panel, { title: "Sessions", focused: true, children: sessionItems.length > 0 ? (_jsx(List, { items: sessionItems, focused: true, onSelect: (item) => {
|
|
138
149
|
const window = livestockWindows.find(w => String(w.index) === item.id);
|
|
139
150
|
if (window)
|
|
140
151
|
onSelectWindow(window);
|
|
@@ -5,7 +5,7 @@ interface ProjectContextProps {
|
|
|
5
5
|
barns: Barn[];
|
|
6
6
|
windows: TmuxWindow[];
|
|
7
7
|
onBack: () => void;
|
|
8
|
-
|
|
8
|
+
onNewClaudeForLivestock: (livestock: Livestock) => void;
|
|
9
9
|
onSelectWindow: (window: TmuxWindow) => void;
|
|
10
10
|
onSelectLivestock: (livestock: Livestock, barn: Barn | null) => void;
|
|
11
11
|
onOpenLivestockSession: (livestock: Livestock, barn: Barn | null) => void;
|
|
@@ -14,5 +14,5 @@ interface ProjectContextProps {
|
|
|
14
14
|
onOpenWiki: () => void;
|
|
15
15
|
onOpenIssues: () => void;
|
|
16
16
|
}
|
|
17
|
-
export declare function ProjectContext({ project, barns, windows, onBack,
|
|
17
|
+
export declare function ProjectContext({ project, barns, windows, onBack, onNewClaudeForLivestock, onSelectWindow, onSelectLivestock, onOpenLivestockSession, onUpdateProject, onDeleteProject, onOpenWiki, onOpenIssues, }: ProjectContextProps): import("react/jsx-runtime").JSX.Element;
|
|
18
18
|
export {};
|
|
@@ -73,7 +73,7 @@ function hslToHex(h, s, l) {
|
|
|
73
73
|
const toHex = (n) => Math.round((n + m) * 255).toString(16).padStart(2, '0');
|
|
74
74
|
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
75
75
|
}
|
|
76
|
-
export function ProjectContext({ project, barns, windows, onBack,
|
|
76
|
+
export function ProjectContext({ project, barns, windows, onBack, onNewClaudeForLivestock, onSelectWindow, onSelectLivestock, onOpenLivestockSession, onUpdateProject, onDeleteProject, onOpenWiki, onOpenIssues, }) {
|
|
77
77
|
const [focusedPanel, setFocusedPanel] = useState('livestock');
|
|
78
78
|
const [mode, setMode] = useState('normal');
|
|
79
79
|
// Edit form state
|
|
@@ -83,6 +83,7 @@ export function ProjectContext({ project, barns, windows, onBack, onNewClaude, o
|
|
|
83
83
|
const [editColor, setEditColor] = useState(project.color || '');
|
|
84
84
|
const [editGradientSpread, setEditGradientSpread] = useState(project.gradientSpread ?? 5);
|
|
85
85
|
const [editGradientInverted, setEditGradientInverted] = useState(project.gradientInverted ?? false);
|
|
86
|
+
const [editIssueProvider, setEditIssueProvider] = useState((project.issueProvider?.type) ?? 'github');
|
|
86
87
|
// New livestock form state
|
|
87
88
|
const [newLivestockName, setNewLivestockName] = useState('');
|
|
88
89
|
const [newLivestockPath, setNewLivestockPath] = useState('');
|
|
@@ -149,6 +150,7 @@ export function ProjectContext({ project, barns, windows, onBack, onNewClaude, o
|
|
|
149
150
|
setEditColor(project.color || '');
|
|
150
151
|
setEditGradientSpread(project.gradientSpread ?? 5);
|
|
151
152
|
setEditGradientInverted(project.gradientInverted ?? false);
|
|
153
|
+
setEditIssueProvider((project.issueProvider?.type) ?? 'github');
|
|
152
154
|
setMode('edit-name');
|
|
153
155
|
};
|
|
154
156
|
const cancelEdit = () => {
|
|
@@ -267,10 +269,8 @@ export function ProjectContext({ project, barns, windows, onBack, onNewClaude, o
|
|
|
267
269
|
setFocusedPanel((p) => (p === 'livestock' ? 'sessions' : 'livestock'));
|
|
268
270
|
return;
|
|
269
271
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
272
|
+
// NOTE: 'c' for Claude is handled at row-level in the List component
|
|
273
|
+
// via the onAction callback - no page-level 'c' handler here
|
|
274
274
|
if (input === 'e') {
|
|
275
275
|
startEdit();
|
|
276
276
|
return;
|
|
@@ -294,16 +294,6 @@ export function ProjectContext({ project, barns, windows, onBack, onNewClaude, o
|
|
|
294
294
|
startAddLivestock();
|
|
295
295
|
return;
|
|
296
296
|
}
|
|
297
|
-
if (input === 's') {
|
|
298
|
-
// Open shell session for selected livestock
|
|
299
|
-
const livestock = project.livestock || [];
|
|
300
|
-
if (livestock.length > 0 && selectedLivestockIndex < livestock.length) {
|
|
301
|
-
const selected = livestock[selectedLivestockIndex];
|
|
302
|
-
const barn = selected.barn ? barns.find((b) => b.name === selected.barn) || null : null;
|
|
303
|
-
onOpenLivestockSession(selected, barn);
|
|
304
|
-
}
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
297
|
if (input === 'd') {
|
|
308
298
|
const livestock = project.livestock || [];
|
|
309
299
|
if (livestock.length > 0 && selectedLivestockIndex < livestock.length) {
|
|
@@ -340,7 +330,39 @@ export function ProjectContext({ project, barns, windows, onBack, onNewClaude, o
|
|
|
340
330
|
const filtered = value.replace(/[\[\]!]/g, '');
|
|
341
331
|
setEditColor(filtered);
|
|
342
332
|
};
|
|
343
|
-
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Header, { text: project.name, subtitle: "Editing project", color: displayColor, gradientSpread: editGradientSpread, gradientInverted: editGradientInverted }), _jsxs(Box, { flexDirection: "column", padding: 2, children: [_jsxs(Text, { bold: true, color: "yellow", children: ["Edit Project: ", editName] }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { children: "Color (hex): " }), _jsx(TextInput, { value: editColor, onChange: handleColorChange, onSubmit: () => saveAndNext('
|
|
333
|
+
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Header, { text: project.name, subtitle: "Editing project", color: displayColor, gradientSpread: editGradientSpread, gradientInverted: editGradientInverted }), _jsxs(Box, { flexDirection: "column", padding: 2, children: [_jsxs(Text, { bold: true, color: "yellow", children: ["Edit Project: ", editName] }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { children: "Color (hex): " }), _jsx(TextInput, { value: editColor, onChange: handleColorChange, onSubmit: () => saveAndNext('edit-issue-provider'), placeholder: "#ff6b6b" })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { dimColor: true, children: ["Spread: ", editGradientSpread, "/10 ", editGradientInverted ? '(inverted)' : ''] }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: displayColor, children: "\u2588\u2588\u2588\u2588" }), _jsx(Text, { children: " Preview" })] })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "[ ] shift color \u2191/\u2193 gradient spread ! invert" }), _jsx(Text, { dimColor: true, children: "Enter: next field, Esc: cancel" })] })] })] }));
|
|
334
|
+
}
|
|
335
|
+
if (mode === 'edit-issue-provider') {
|
|
336
|
+
const providerOptions = [
|
|
337
|
+
{ id: 'github', label: 'GitHub Issues', description: 'Use GitHub CLI (gh) for issues' },
|
|
338
|
+
{ id: 'linear', label: 'Linear', description: 'Use Linear for issue tracking' },
|
|
339
|
+
{ id: 'none', label: 'None', description: 'Disable issue tracking' },
|
|
340
|
+
];
|
|
341
|
+
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Header, { text: project.name, subtitle: "Editing project", color: editColor || project.color, gradientSpread: editGradientSpread, gradientInverted: editGradientInverted }), _jsxs(Box, { flexDirection: "column", padding: 2, children: [_jsxs(Text, { bold: true, color: "yellow", children: ["Edit Project: ", editName] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { children: "Issue Tracking:" }) }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: _jsx(List, { items: providerOptions.map((p) => ({
|
|
342
|
+
id: p.id,
|
|
343
|
+
label: p.label,
|
|
344
|
+
status: editIssueProvider === p.id ? 'active' : 'inactive',
|
|
345
|
+
meta: p.description,
|
|
346
|
+
})), focused: true, onSelect: (item) => {
|
|
347
|
+
setEditIssueProvider(item.id);
|
|
348
|
+
// Save the project with new issue provider
|
|
349
|
+
const issueProvider = item.id === 'github'
|
|
350
|
+
? { type: 'github' }
|
|
351
|
+
: item.id === 'linear'
|
|
352
|
+
? { type: 'linear' }
|
|
353
|
+
: { type: 'none' };
|
|
354
|
+
onUpdateProject({
|
|
355
|
+
...project,
|
|
356
|
+
name: editName,
|
|
357
|
+
path: editPath,
|
|
358
|
+
summary: editSummary || undefined,
|
|
359
|
+
color: editColor || undefined,
|
|
360
|
+
gradientSpread: editGradientSpread,
|
|
361
|
+
gradientInverted: editGradientInverted,
|
|
362
|
+
issueProvider,
|
|
363
|
+
});
|
|
364
|
+
setMode('normal');
|
|
365
|
+
} }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "Enter: select and save, Esc: cancel" }) })] })] }));
|
|
344
366
|
}
|
|
345
367
|
// Add livestock flow: name → barn → path (with auto-detect)
|
|
346
368
|
if (mode === 'add-livestock-name') {
|
|
@@ -411,12 +433,21 @@ export function ProjectContext({ project, barns, windows, onBack, onNewClaude, o
|
|
|
411
433
|
livestock,
|
|
412
434
|
barn: livestock.barn ? barns.find((b) => b.name === livestock.barn) || null : null,
|
|
413
435
|
}));
|
|
414
|
-
const livestockItems = livestockWithBarns.map(({ livestock, barn }) =>
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
436
|
+
const livestockItems = livestockWithBarns.map(({ livestock, barn }) => {
|
|
437
|
+
const isLocal = !barn || isLocalBarn(barn);
|
|
438
|
+
// Local livestock: claude + shell
|
|
439
|
+
// Remote livestock: shell only
|
|
440
|
+
const actions = isLocal
|
|
441
|
+
? [{ key: 'c', label: 'claude' }, { key: 's', label: 'shell' }]
|
|
442
|
+
: [{ key: 's', label: 'shell' }];
|
|
443
|
+
return {
|
|
444
|
+
id: livestock.name,
|
|
445
|
+
label: barn ? `${livestock.name} (${barn.host})` : `${livestock.name} (local)`,
|
|
446
|
+
status: 'active',
|
|
447
|
+
meta: livestock.path,
|
|
448
|
+
actions,
|
|
449
|
+
};
|
|
450
|
+
});
|
|
420
451
|
// Parse session name for type hint (consistent with GlobalDashboard)
|
|
421
452
|
const getSessionTypeHint = (name) => {
|
|
422
453
|
if (name.endsWith('-claude'))
|
|
@@ -428,21 +459,33 @@ export function ProjectContext({ project, barns, windows, onBack, onNewClaude, o
|
|
|
428
459
|
const sessionName = w.name.replace(`${project.name}-`, '');
|
|
429
460
|
const typeHint = getSessionTypeHint(w.name);
|
|
430
461
|
const displayName = sessionName.replace('-claude', '');
|
|
462
|
+
const statusInfo = getWindowStatus(w);
|
|
431
463
|
return {
|
|
432
464
|
id: String(w.index),
|
|
433
465
|
label: `[${i + 1}] ${displayName}`,
|
|
434
466
|
status: w.active ? 'active' : 'inactive',
|
|
435
|
-
meta: `${typeHint} · ${
|
|
467
|
+
meta: `${typeHint} · ${statusInfo.text}`,
|
|
468
|
+
sessionStatus: statusInfo.status,
|
|
436
469
|
};
|
|
437
470
|
});
|
|
438
471
|
// Panel-specific hints (page-level hotkeys like c/w/i are in BottomBar)
|
|
439
|
-
const livestockHints = '[
|
|
440
|
-
const sessionHints = '
|
|
472
|
+
const livestockHints = '[n] new [d] delete';
|
|
473
|
+
const sessionHints = '';
|
|
441
474
|
return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Header, { text: project.name, subtitle: project.path, summary: project.summary, color: project.color, gradientSpread: project.gradientSpread, gradientInverted: project.gradientInverted }), _jsxs(Box, { flexGrow: 1, marginY: 1, paddingX: 1, gap: 2, children: [_jsx(Panel, { title: "Livestock", focused: focusedPanel === 'livestock', width: "50%", hints: livestockHints, children: livestockItems.length > 0 ? (_jsx(List, { items: livestockItems, focused: focusedPanel === 'livestock', selectedIndex: selectedLivestockIndex, onSelectionChange: setSelectedLivestockIndex, onSelect: (item) => {
|
|
442
475
|
const found = livestockWithBarns.find((l) => l.livestock.name === item.id);
|
|
443
476
|
if (found) {
|
|
444
477
|
onSelectLivestock(found.livestock, found.barn);
|
|
445
478
|
}
|
|
479
|
+
}, onAction: (item, actionKey) => {
|
|
480
|
+
const found = livestockWithBarns.find((l) => l.livestock.name === item.id);
|
|
481
|
+
if (!found)
|
|
482
|
+
return;
|
|
483
|
+
if (actionKey === 's') {
|
|
484
|
+
onOpenLivestockSession(found.livestock, found.barn);
|
|
485
|
+
}
|
|
486
|
+
if (actionKey === 'c') {
|
|
487
|
+
onNewClaudeForLivestock(found.livestock);
|
|
488
|
+
}
|
|
446
489
|
} })) : (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "No livestock configured" }), _jsx(Text, { dimColor: true, italic: true, children: "Livestock are your deployed app instances" })] })) }), _jsx(Panel, { title: "Sessions", focused: focusedPanel === 'sessions', width: "50%", hints: sessionHints, children: sessionItems.length > 0 ? (_jsx(List, { items: sessionItems, focused: focusedPanel === 'sessions', onSelect: (item) => {
|
|
447
490
|
const window = projectWindows.find((w) => String(w.index) === item.id);
|
|
448
491
|
if (window)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@colmbus72/yeehaw",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Terminal dashboard for managing projects, servers, and deployments",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -45,18 +45,18 @@
|
|
|
45
45
|
"chokidar": "^3.6.0",
|
|
46
46
|
"execa": "^8.0.1",
|
|
47
47
|
"figlet": "^1.7.0",
|
|
48
|
-
"ink": "^
|
|
49
|
-
"ink-text-input": "^
|
|
48
|
+
"ink": "^6.6.0",
|
|
49
|
+
"ink-text-input": "^6.0.0",
|
|
50
50
|
"js-yaml": "^4.1.0",
|
|
51
51
|
"marked": "^9.1.6",
|
|
52
52
|
"marked-terminal": "^6.2.0",
|
|
53
|
-
"react": "^
|
|
53
|
+
"react": "^19.0.0"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/figlet": "^1.5.8",
|
|
57
57
|
"@types/js-yaml": "^4.0.9",
|
|
58
58
|
"@types/node": "^25.0.10",
|
|
59
|
-
"@types/react": "^
|
|
59
|
+
"@types/react": "^19.0.0",
|
|
60
60
|
"tsx": "^4.7.0",
|
|
61
61
|
"typescript": "^5.3.0"
|
|
62
62
|
},
|