@colmbus72/yeehaw 0.5.0 → 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 (43) hide show
  1. package/claude-plugin/skills/yeehaw-development/SKILL.md +70 -0
  2. package/dist/app.js +166 -15
  3. package/dist/components/CritterHeader.d.ts +7 -0
  4. package/dist/components/CritterHeader.js +81 -0
  5. package/dist/components/List.d.ts +2 -0
  6. package/dist/components/List.js +1 -1
  7. package/dist/lib/auth/index.d.ts +2 -0
  8. package/dist/lib/auth/index.js +3 -0
  9. package/dist/lib/auth/linear.d.ts +20 -0
  10. package/dist/lib/auth/linear.js +79 -0
  11. package/dist/lib/auth/storage.d.ts +12 -0
  12. package/dist/lib/auth/storage.js +53 -0
  13. package/dist/lib/context.d.ts +10 -0
  14. package/dist/lib/context.js +63 -0
  15. package/dist/lib/critters.d.ts +33 -0
  16. package/dist/lib/critters.js +164 -0
  17. package/dist/lib/hotkeys.d.ts +1 -1
  18. package/dist/lib/hotkeys.js +6 -2
  19. package/dist/lib/issues/github.d.ts +11 -0
  20. package/dist/lib/issues/github.js +154 -0
  21. package/dist/lib/issues/index.d.ts +14 -0
  22. package/dist/lib/issues/index.js +27 -0
  23. package/dist/lib/issues/linear.d.ts +24 -0
  24. package/dist/lib/issues/linear.js +345 -0
  25. package/dist/lib/issues/types.d.ts +82 -0
  26. package/dist/lib/issues/types.js +2 -0
  27. package/dist/lib/paths.d.ts +1 -0
  28. package/dist/lib/paths.js +1 -0
  29. package/dist/lib/tmux.d.ts +1 -0
  30. package/dist/lib/tmux.js +45 -0
  31. package/dist/types.d.ts +19 -0
  32. package/dist/views/BarnContext.d.ts +2 -1
  33. package/dist/views/BarnContext.js +136 -14
  34. package/dist/views/CritterDetailView.d.ts +10 -0
  35. package/dist/views/CritterDetailView.js +117 -0
  36. package/dist/views/CritterLogsView.d.ts +8 -0
  37. package/dist/views/CritterLogsView.js +100 -0
  38. package/dist/views/IssuesView.d.ts +2 -1
  39. package/dist/views/IssuesView.js +661 -98
  40. package/dist/views/LivestockDetailView.d.ts +2 -1
  41. package/dist/views/LivestockDetailView.js +8 -1
  42. package/dist/views/ProjectContext.js +35 -1
  43. package/package.json +1 -1
@@ -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;
@@ -83,6 +83,7 @@ export function ProjectContext({ project, barns, windows, onBack, onNewClaudeFor
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, onNewClaudeFor
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 = () => {
@@ -328,7 +330,39 @@ export function ProjectContext({ project, barns, windows, onBack, onNewClaudeFor
328
330
  const filtered = value.replace(/[\[\]!]/g, '');
329
331
  setEditColor(filtered);
330
332
  };
331
- 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" }) })] })] }));
332
366
  }
333
367
  // Add livestock flow: name → barn → path (with auto-detect)
334
368
  if (mode === 'add-livestock-name') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colmbus72/yeehaw",
3
- "version": "0.5.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",