@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.
Files changed (61) hide show
  1. package/claude-plugin/.claude-plugin/plugin.json +2 -1
  2. package/claude-plugin/hooks/hooks.json +41 -0
  3. package/claude-plugin/hooks/session-status.sh +13 -0
  4. package/claude-plugin/skills/yeehaw-development/SKILL.md +70 -0
  5. package/dist/app.js +228 -28
  6. package/dist/components/CritterHeader.d.ts +7 -0
  7. package/dist/components/CritterHeader.js +81 -0
  8. package/dist/components/HelpOverlay.js +4 -2
  9. package/dist/components/List.d.ts +10 -1
  10. package/dist/components/List.js +14 -5
  11. package/dist/components/Panel.js +27 -1
  12. package/dist/components/SplashScreen.js +1 -1
  13. package/dist/hooks/useSessions.js +2 -2
  14. package/dist/index.js +41 -1
  15. package/dist/lib/auth/index.d.ts +2 -0
  16. package/dist/lib/auth/index.js +3 -0
  17. package/dist/lib/auth/linear.d.ts +20 -0
  18. package/dist/lib/auth/linear.js +79 -0
  19. package/dist/lib/auth/storage.d.ts +12 -0
  20. package/dist/lib/auth/storage.js +53 -0
  21. package/dist/lib/config.d.ts +13 -1
  22. package/dist/lib/config.js +51 -0
  23. package/dist/lib/context.d.ts +10 -0
  24. package/dist/lib/context.js +63 -0
  25. package/dist/lib/critters.d.ts +61 -0
  26. package/dist/lib/critters.js +365 -0
  27. package/dist/lib/hooks.d.ts +20 -0
  28. package/dist/lib/hooks.js +91 -0
  29. package/dist/lib/hotkeys.d.ts +1 -1
  30. package/dist/lib/hotkeys.js +28 -20
  31. package/dist/lib/issues/github.d.ts +11 -0
  32. package/dist/lib/issues/github.js +154 -0
  33. package/dist/lib/issues/index.d.ts +14 -0
  34. package/dist/lib/issues/index.js +27 -0
  35. package/dist/lib/issues/linear.d.ts +24 -0
  36. package/dist/lib/issues/linear.js +345 -0
  37. package/dist/lib/issues/types.d.ts +82 -0
  38. package/dist/lib/issues/types.js +2 -0
  39. package/dist/lib/paths.d.ts +3 -0
  40. package/dist/lib/paths.js +3 -0
  41. package/dist/lib/signals.d.ts +30 -0
  42. package/dist/lib/signals.js +104 -0
  43. package/dist/lib/tmux.d.ts +9 -2
  44. package/dist/lib/tmux.js +114 -18
  45. package/dist/mcp-server.js +161 -1
  46. package/dist/types.d.ts +23 -2
  47. package/dist/views/BarnContext.d.ts +5 -2
  48. package/dist/views/BarnContext.js +202 -21
  49. package/dist/views/CritterDetailView.d.ts +10 -0
  50. package/dist/views/CritterDetailView.js +117 -0
  51. package/dist/views/CritterLogsView.d.ts +8 -0
  52. package/dist/views/CritterLogsView.js +100 -0
  53. package/dist/views/GlobalDashboard.d.ts +2 -2
  54. package/dist/views/GlobalDashboard.js +20 -18
  55. package/dist/views/IssuesView.d.ts +2 -1
  56. package/dist/views/IssuesView.js +661 -98
  57. package/dist/views/LivestockDetailView.d.ts +2 -1
  58. package/dist/views/LivestockDetailView.js +19 -8
  59. package/dist/views/ProjectContext.d.ts +2 -2
  60. package/dist/views/ProjectContext.js +68 -25
  61. 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
- id: String(w.index),
132
- label: `[${i + 1}] shell`,
133
- status: w.active ? 'active' : 'inactive',
134
- meta: getWindowStatus(w),
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, hints: `[s] shell ${livestock.log_path ? '[l] logs ' : ''}[e] edit`, children: sessionItems.length > 0 ? (_jsx(List, { items: sessionItems, focused: true, onSelect: (item) => {
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
- onNewClaude: () => void;
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, onNewClaude, onSelectWindow, onSelectLivestock, onOpenLivestockSession, onUpdateProject, onDeleteProject, onOpenWiki, onOpenIssues, }: ProjectContextProps): import("react/jsx-runtime").JSX.Element;
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, onNewClaude, onSelectWindow, onSelectLivestock, onOpenLivestockSession, onUpdateProject, onDeleteProject, onOpenWiki, onOpenIssues, }) {
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
- if (input === 'c') {
271
- onNewClaude();
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('done'), 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: save project, Esc: cancel" })] })] })] }));
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
- id: livestock.name,
416
- label: barn ? `${livestock.name} (${barn.host})` : `${livestock.name} (local)`,
417
- status: 'active', // TODO: actual health check
418
- meta: livestock.path,
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} · ${getWindowStatus(w)}`,
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 = '[s] shell [n] new [d] delete';
440
- const sessionHints = '1-9 switch';
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.4.2",
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": "^4.4.1",
49
- "ink-text-input": "^5.0.1",
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": "^18.2.0"
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": "^18.2.0",
59
+ "@types/react": "^19.0.0",
60
60
  "tsx": "^4.7.0",
61
61
  "typescript": "^5.3.0"
62
62
  },