dmux 1.6.0 → 2.0.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 (139) hide show
  1. package/README.md +12 -8
  2. package/dist/AutoUpdater.d.ts +2 -2
  3. package/dist/AutoUpdater.d.ts.map +1 -1
  4. package/dist/AutoUpdater.js +18 -7
  5. package/dist/AutoUpdater.js.map +1 -1
  6. package/dist/CleanTextInput.d.ts.map +1 -1
  7. package/dist/CleanTextInput.js +12 -4
  8. package/dist/CleanTextInput.js.map +1 -1
  9. package/dist/DmuxApp.d.ts +1 -10
  10. package/dist/DmuxApp.d.ts.map +1 -1
  11. package/dist/DmuxApp.js +146 -1483
  12. package/dist/DmuxApp.js.map +1 -1
  13. package/dist/components/AgentChoiceDialog.d.ts +7 -0
  14. package/dist/components/AgentChoiceDialog.d.ts.map +1 -0
  15. package/dist/components/AgentChoiceDialog.js +12 -0
  16. package/dist/components/AgentChoiceDialog.js.map +1 -0
  17. package/dist/components/CloseOptionsDialog.d.ts +9 -0
  18. package/dist/components/CloseOptionsDialog.d.ts.map +1 -0
  19. package/dist/components/CloseOptionsDialog.js +30 -0
  20. package/dist/components/CloseOptionsDialog.js.map +1 -0
  21. package/dist/components/CommandPromptDialog.d.ts +9 -0
  22. package/dist/components/CommandPromptDialog.d.ts.map +1 -0
  23. package/dist/components/CommandPromptDialog.js +20 -0
  24. package/dist/components/CommandPromptDialog.js.map +1 -0
  25. package/dist/components/CreatingIndicator.d.ts +7 -0
  26. package/dist/components/CreatingIndicator.d.ts.map +1 -0
  27. package/dist/components/CreatingIndicator.js +10 -0
  28. package/dist/components/CreatingIndicator.js.map +1 -0
  29. package/dist/components/FileCopyPrompt.d.ts +4 -0
  30. package/dist/components/FileCopyPrompt.d.ts.map +1 -0
  31. package/dist/components/FileCopyPrompt.js +13 -0
  32. package/dist/components/FileCopyPrompt.js.map +1 -0
  33. package/dist/components/FooterHelp.d.ts +8 -0
  34. package/dist/components/FooterHelp.d.ts.map +1 -0
  35. package/dist/components/FooterHelp.js +12 -0
  36. package/dist/components/FooterHelp.js.map +1 -0
  37. package/dist/components/LoadingIndicator.d.ts +4 -0
  38. package/dist/components/LoadingIndicator.d.ts.map +1 -0
  39. package/dist/components/LoadingIndicator.js +10 -0
  40. package/dist/components/LoadingIndicator.js.map +1 -0
  41. package/dist/components/MergeConfirmationDialog.d.ts +8 -0
  42. package/dist/components/MergeConfirmationDialog.d.ts.map +1 -0
  43. package/dist/components/MergeConfirmationDialog.js +13 -0
  44. package/dist/components/MergeConfirmationDialog.js.map +1 -0
  45. package/dist/components/NewPaneDialog.d.ts +9 -0
  46. package/dist/components/NewPaneDialog.d.ts.map +1 -0
  47. package/dist/components/NewPaneDialog.js +13 -0
  48. package/dist/components/NewPaneDialog.js.map +1 -0
  49. package/dist/components/PaneCard.d.ts +9 -0
  50. package/dist/components/PaneCard.d.ts.map +1 -0
  51. package/dist/components/PaneCard.js +37 -0
  52. package/dist/components/PaneCard.js.map +1 -0
  53. package/dist/components/PanesGrid.d.ts +11 -0
  54. package/dist/components/PanesGrid.d.ts.map +1 -0
  55. package/dist/components/PanesGrid.js +11 -0
  56. package/dist/components/PanesGrid.js.map +1 -0
  57. package/dist/components/RunningIndicator.d.ts +4 -0
  58. package/dist/components/RunningIndicator.d.ts.map +1 -0
  59. package/dist/components/RunningIndicator.js +9 -0
  60. package/dist/components/RunningIndicator.js.map +1 -0
  61. package/dist/components/UpdateDialog.d.ts +7 -0
  62. package/dist/components/UpdateDialog.d.ts.map +1 -0
  63. package/dist/components/UpdateDialog.js +27 -0
  64. package/dist/components/UpdateDialog.js.map +1 -0
  65. package/dist/components/UpdatingIndicator.d.ts +4 -0
  66. package/dist/components/UpdatingIndicator.d.ts.map +1 -0
  67. package/dist/components/UpdatingIndicator.js +9 -0
  68. package/dist/components/UpdatingIndicator.js.map +1 -0
  69. package/dist/hooks/useAgentDetection.d.ts +4 -0
  70. package/dist/hooks/useAgentDetection.d.ts.map +1 -0
  71. package/dist/hooks/useAgentDetection.js +71 -0
  72. package/dist/hooks/useAgentDetection.js.map +1 -0
  73. package/dist/hooks/useAgentStatus.d.ts +11 -0
  74. package/dist/hooks/useAgentStatus.d.ts.map +1 -0
  75. package/dist/hooks/useAgentStatus.js +172 -0
  76. package/dist/hooks/useAgentStatus.js.map +1 -0
  77. package/dist/hooks/useAutoUpdater.d.ts +20 -0
  78. package/dist/hooks/useAutoUpdater.d.ts.map +1 -0
  79. package/dist/hooks/useAutoUpdater.js +100 -0
  80. package/dist/hooks/useAutoUpdater.js.map +1 -0
  81. package/dist/hooks/useCommandRunner.d.ts +18 -0
  82. package/dist/hooks/useCommandRunner.d.ts.map +1 -0
  83. package/dist/hooks/useCommandRunner.js +44 -0
  84. package/dist/hooks/useCommandRunner.js.map +1 -0
  85. package/dist/hooks/useNavigation.d.ts +8 -0
  86. package/dist/hooks/useNavigation.d.ts.map +1 -0
  87. package/dist/hooks/useNavigation.js +62 -0
  88. package/dist/hooks/useNavigation.js.map +1 -0
  89. package/dist/hooks/usePaneCreation.d.ts +16 -0
  90. package/dist/hooks/usePaneCreation.d.ts.map +1 -0
  91. package/dist/hooks/usePaneCreation.js +133 -0
  92. package/dist/hooks/usePaneCreation.js.map +1 -0
  93. package/dist/hooks/usePaneRunner.d.ts +17 -0
  94. package/dist/hooks/usePaneRunner.d.ts.map +1 -0
  95. package/dist/hooks/usePaneRunner.js +149 -0
  96. package/dist/hooks/usePaneRunner.js.map +1 -0
  97. package/dist/hooks/usePanes.d.ts +9 -0
  98. package/dist/hooks/usePanes.d.ts.map +1 -0
  99. package/dist/hooks/usePanes.js +222 -0
  100. package/dist/hooks/usePanes.js.map +1 -0
  101. package/dist/hooks/useProjectSettings.d.ts +6 -0
  102. package/dist/hooks/useProjectSettings.d.ts.map +1 -0
  103. package/dist/hooks/useProjectSettings.js +46 -0
  104. package/dist/hooks/useProjectSettings.js.map +1 -0
  105. package/dist/hooks/useTerminalWidth.d.ts +2 -0
  106. package/dist/hooks/useTerminalWidth.d.ts.map +1 -0
  107. package/dist/hooks/useTerminalWidth.js +13 -0
  108. package/dist/hooks/useTerminalWidth.js.map +1 -0
  109. package/dist/hooks/useWorktreeActions.d.ts +17 -0
  110. package/dist/hooks/useWorktreeActions.d.ts.map +1 -0
  111. package/dist/hooks/useWorktreeActions.js +190 -0
  112. package/dist/hooks/useWorktreeActions.js.map +1 -0
  113. package/dist/index.js +86 -11
  114. package/dist/index.js.map +1 -1
  115. package/dist/types.d.ts +38 -0
  116. package/dist/types.d.ts.map +1 -0
  117. package/dist/types.js +2 -0
  118. package/dist/types.js.map +1 -0
  119. package/dist/utils/commands.d.ts +6 -0
  120. package/dist/utils/commands.d.ts.map +1 -0
  121. package/dist/utils/commands.js +35 -0
  122. package/dist/utils/commands.js.map +1 -0
  123. package/dist/utils/input.d.ts +13 -0
  124. package/dist/utils/input.d.ts.map +1 -0
  125. package/dist/utils/input.js +100 -0
  126. package/dist/utils/input.js.map +1 -0
  127. package/dist/utils/slug.d.ts +3 -0
  128. package/dist/utils/slug.d.ts.map +1 -0
  129. package/dist/utils/slug.js +58 -0
  130. package/dist/utils/slug.js.map +1 -0
  131. package/dist/utils/tmux.d.ts +4 -0
  132. package/dist/utils/tmux.d.ts.map +1 -0
  133. package/dist/utils/tmux.js +62 -0
  134. package/dist/utils/tmux.js.map +1 -0
  135. package/dist/workers/updateChecker.d.ts +2 -0
  136. package/dist/workers/updateChecker.d.ts.map +1 -0
  137. package/dist/workers/updateChecker.js +33 -0
  138. package/dist/workers/updateChecker.js.map +1 -0
  139. package/package.json +6 -2
@@ -0,0 +1,44 @@
1
+ import usePaneRunner from './usePaneRunner.js';
2
+ export default function useCommandRunner({ panes, savePanes, projectSettings, saveSettings, setShowCommandPrompt, setShowFileCopyPrompt, setCurrentCommandType, setStatusMessage, setRunningCommand, }) {
3
+ const { runCommandInternal, copyNonGitFiles } = usePaneRunner({
4
+ panes,
5
+ savePanes,
6
+ projectSettings,
7
+ setStatusMessage,
8
+ setRunningCommand,
9
+ });
10
+ const runCommand = async (type, pane) => {
11
+ if (!pane.worktreePath) {
12
+ setStatusMessage('No worktree path for this pane');
13
+ setTimeout(() => setStatusMessage(''), 2000);
14
+ return;
15
+ }
16
+ const command = type === 'test' ? projectSettings.testCommand : projectSettings.devCommand;
17
+ const isFirstRun = type === 'test' ? !projectSettings.firstTestRun : !projectSettings.firstDevRun;
18
+ if (!command) {
19
+ setShowCommandPrompt(type);
20
+ return;
21
+ }
22
+ if (isFirstRun) {
23
+ setShowFileCopyPrompt(true);
24
+ setCurrentCommandType(type);
25
+ setStatusMessage(`First time running ${type} command...`);
26
+ return;
27
+ }
28
+ await runCommandInternal(type, pane);
29
+ };
30
+ const handleFirstRunResponse = async (accepted, type, pane) => {
31
+ if (!pane.worktreePath)
32
+ return;
33
+ if (accepted)
34
+ await copyNonGitFiles(pane.worktreePath);
35
+ const newSettings = {
36
+ ...projectSettings,
37
+ [type === 'test' ? 'firstTestRun' : 'firstDevRun']: true,
38
+ };
39
+ await saveSettings(newSettings);
40
+ await runCommandInternal(type, pane);
41
+ };
42
+ return { runCommand, handleFirstRunResponse };
43
+ }
44
+ //# sourceMappingURL=useCommandRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCommandRunner.js","sourceRoot":"","sources":["../../src/hooks/useCommandRunner.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAc/C,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,KAAK,EACL,SAAS,EACT,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,GACV;IACP,MAAM,EAAE,kBAAkB,EAAE,eAAe,EAAE,GAAG,aAAa,CAAC;QAC5D,KAAK;QACL,SAAS;QACT,eAAe;QACf,gBAAgB;QAChB,iBAAiB;KAClB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,KAAK,EAAE,IAAoB,EAAE,IAAc,EAAE,EAAE;QAChE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,gBAAgB,CAAC,gCAAgC,CAAC,CAAC;YACnD,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC;QAC3F,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC;QAElG,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAC5B,gBAAgB,CAAC,sBAAsB,IAAI,aAAa,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,MAAM,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,MAAM,sBAAsB,GAAG,KAAK,EAAE,QAAiB,EAAE,IAAoB,EAAE,IAAc,EAAE,EAAE;QAC/F,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAC/B,IAAI,QAAQ;YAAE,MAAM,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAoB;YACnC,GAAG,eAAe;YAClB,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,IAAI;SACzD,CAAC;QACF,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;QAEhC,MAAM,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAW,CAAC;AACzD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export default function useNavigation(terminalWidth: number, panesLength: number, isLoading: boolean): {
2
+ getCardGridPosition: (index: number) => {
3
+ row: number;
4
+ col: number;
5
+ };
6
+ findCardInDirection: (currentIndex: number, direction: "up" | "down" | "left" | "right") => number | null;
7
+ };
8
+ //# sourceMappingURL=useNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNavigation.d.ts","sourceRoot":"","sources":["../../src/hooks/useNavigation.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO;iCAMjF,MAAM,KAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;wCAQ9B,MAAM,aAAa,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,KAAG,MAAM,GAAG,IAAI;EA4C5F"}
@@ -0,0 +1,62 @@
1
+ import { useMemo } from 'react';
2
+ export default function useNavigation(terminalWidth, panesLength, isLoading) {
3
+ const cardWidth = 35 + 2; // Card width + gap
4
+ const cardsPerRow = Math.max(1, Math.floor(terminalWidth / cardWidth));
5
+ const totalItems = panesLength + (isLoading ? 0 : 1);
6
+ const getCardGridPosition = useMemo(() => {
7
+ return (index) => {
8
+ const row = Math.floor(index / cardsPerRow);
9
+ const col = index % cardsPerRow;
10
+ return { row, col };
11
+ };
12
+ }, [cardsPerRow]);
13
+ const findCardInDirection = useMemo(() => {
14
+ return (currentIndex, direction) => {
15
+ const currentPos = getCardGridPosition(currentIndex);
16
+ let targetIndex = null;
17
+ switch (direction) {
18
+ case 'up':
19
+ if (currentPos.row > 0) {
20
+ targetIndex = (currentPos.row - 1) * cardsPerRow + currentPos.col;
21
+ if (targetIndex >= totalItems) {
22
+ targetIndex = Math.min((currentPos.row - 1) * cardsPerRow + cardsPerRow - 1, totalItems - 1);
23
+ }
24
+ }
25
+ break;
26
+ case 'down':
27
+ targetIndex = (currentPos.row + 1) * cardsPerRow + currentPos.col;
28
+ if (targetIndex >= totalItems) {
29
+ if (currentIndex < totalItems - 1)
30
+ targetIndex = totalItems - 1;
31
+ else
32
+ targetIndex = null;
33
+ }
34
+ break;
35
+ case 'left':
36
+ if (currentPos.col > 0) {
37
+ targetIndex = currentIndex - 1;
38
+ }
39
+ else if (currentPos.row > 0) {
40
+ targetIndex = currentPos.row * cardsPerRow - 1;
41
+ if (targetIndex >= totalItems)
42
+ targetIndex = totalItems - 1;
43
+ }
44
+ break;
45
+ case 'right':
46
+ if (currentPos.col < cardsPerRow - 1 && currentIndex < totalItems - 1) {
47
+ targetIndex = currentIndex + 1;
48
+ }
49
+ else if ((currentPos.row + 1) * cardsPerRow < totalItems) {
50
+ targetIndex = (currentPos.row + 1) * cardsPerRow;
51
+ }
52
+ break;
53
+ }
54
+ if (targetIndex !== null && targetIndex >= 0 && targetIndex < totalItems) {
55
+ return targetIndex;
56
+ }
57
+ return null;
58
+ };
59
+ }, [cardsPerRow, totalItems, getCardGridPosition]);
60
+ return { getCardGridPosition, findCardInDirection };
61
+ }
62
+ //# sourceMappingURL=useNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNavigation.js","sourceRoot":"","sources":["../../src/hooks/useNavigation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { DmuxPane } from '../types.js';
2
+ interface Params {
3
+ panes: DmuxPane[];
4
+ savePanes: (p: DmuxPane[]) => Promise<void>;
5
+ projectName: string;
6
+ setIsCreatingPane: (v: boolean) => void;
7
+ setStatusMessage: (msg: string) => void;
8
+ setNewPanePrompt: (v: string) => void;
9
+ loadPanes: () => Promise<void>;
10
+ }
11
+ export default function usePaneCreation({ panes, savePanes, projectName, setIsCreatingPane, setStatusMessage, setNewPanePrompt, loadPanes }: Params): {
12
+ readonly openInEditor: (currentPrompt: string, setPrompt: (v: string) => void) => Promise<void>;
13
+ readonly createNewPane: (prompt: string, agent?: "claude" | "opencode") => Promise<void>;
14
+ };
15
+ export {};
16
+ //# sourceMappingURL=usePaneCreation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePaneCreation.d.ts","sourceRoot":"","sources":["../../src/hooks/usePaneCreation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI5C,UAAU,MAAM;IACd,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,MAAM;2CACtG,MAAM,aAAa,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI;qCAqB5C,MAAM,UAAU,QAAQ,GAAG,UAAU;EAsG3E"}
@@ -0,0 +1,133 @@
1
+ import { execSync } from 'child_process';
2
+ import path from 'path';
3
+ import { applySmartLayout } from '../utils/tmux.js';
4
+ import { generateSlug } from '../utils/slug.js';
5
+ export default function usePaneCreation({ panes, savePanes, projectName, setIsCreatingPane, setStatusMessage, setNewPanePrompt, loadPanes }) {
6
+ const openInEditor = async (currentPrompt, setPrompt) => {
7
+ try {
8
+ const os = await import('os');
9
+ const fs = await import('fs');
10
+ const tmpFile = path.join(os.tmpdir(), `dmux-prompt-${Date.now()}.md`);
11
+ fs.writeFileSync(tmpFile, currentPrompt || '# Enter your Claude prompt here\n\n');
12
+ const editor = process.env.EDITOR || process.env.VISUAL || 'nano';
13
+ process.stdout.write('\x1b[2J\x1b[H');
14
+ const { spawn } = await import('child_process');
15
+ const editorProcess = spawn(editor, [tmpFile], { stdio: 'inherit', shell: true });
16
+ editorProcess.on('close', () => {
17
+ try {
18
+ const content = fs.readFileSync(tmpFile, 'utf8').replace(/^# Enter your Claude prompt here\s*\n*/m, '').trim();
19
+ setPrompt(content);
20
+ fs.unlinkSync(tmpFile);
21
+ process.stdout.write('\x1b[2J\x1b[H');
22
+ }
23
+ catch { }
24
+ });
25
+ }
26
+ catch { }
27
+ };
28
+ const createNewPane = async (prompt, agent) => {
29
+ setIsCreatingPane(true);
30
+ setStatusMessage('Generating slug...');
31
+ const slug = await generateSlug(prompt);
32
+ setStatusMessage(`Creating worktree: ${slug}...`);
33
+ let projectRoot;
34
+ try {
35
+ projectRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf-8', stdio: 'pipe' }).trim();
36
+ }
37
+ catch {
38
+ projectRoot = process.cwd();
39
+ }
40
+ const worktreePath = path.join(path.dirname(projectRoot), `${path.basename(projectRoot)}-${slug}`);
41
+ const originalPaneId = execSync('tmux display-message -p "#{pane_id}"', { encoding: 'utf-8' }).trim();
42
+ process.stdout.write('\x1b[2J\x1b[H');
43
+ process.stdout.write('\n'.repeat(100));
44
+ try {
45
+ execSync('tmux clear-history', { stdio: 'pipe' });
46
+ execSync('tmux send-keys C-l', { stdio: 'pipe' });
47
+ }
48
+ catch { }
49
+ await new Promise(r => setTimeout(r, 100));
50
+ try {
51
+ execSync('tmux refresh-client', { stdio: 'pipe' });
52
+ }
53
+ catch { }
54
+ const paneCount = parseInt(execSync('tmux list-panes | wc -l', { encoding: 'utf-8' }).trim());
55
+ try {
56
+ execSync(`tmux set-option -g pane-border-status top`, { stdio: 'pipe' });
57
+ }
58
+ catch { }
59
+ const paneInfo = execSync(`tmux split-window -h -P -F '#{pane_id}'`, { encoding: 'utf-8' }).trim();
60
+ await new Promise(r => setTimeout(r, 500));
61
+ try {
62
+ execSync(`tmux select-pane -t '${paneInfo}' -T "${slug}"`, { stdio: 'pipe' });
63
+ }
64
+ catch { }
65
+ applySmartLayout(paneCount + 1);
66
+ try {
67
+ const worktreeCmd = `git worktree add "${worktreePath}" -b ${slug} 2>/dev/null ; cd "${worktreePath}"`;
68
+ execSync(`tmux send-keys -t '${paneInfo}' '${worktreeCmd}' Enter`, { stdio: 'pipe' });
69
+ await new Promise(r => setTimeout(r, 2500));
70
+ execSync(`tmux send-keys -t '${paneInfo}' 'echo "Worktree created at:" && pwd' Enter`, { stdio: 'pipe' });
71
+ await new Promise(r => setTimeout(r, 500));
72
+ setStatusMessage(agent ? `Worktree created, launching ${agent === 'opencode' ? 'opencode' : 'Claude'}...` : 'Worktree created.');
73
+ }
74
+ catch (error) {
75
+ setStatusMessage(`Warning: Worktree issue: ${error}`);
76
+ execSync(`tmux send-keys -t '${paneInfo}' 'cd "${worktreePath}" 2>/dev/null || (echo "ERROR: Failed to create/enter worktree ${slug}" && pwd)' Enter`, { stdio: 'pipe' });
77
+ await new Promise(r => setTimeout(r, 1000));
78
+ }
79
+ let escapedCmd = '';
80
+ if (agent === 'claude') {
81
+ let claudeCmd;
82
+ if (prompt && prompt.trim()) {
83
+ const escapedPrompt = prompt.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/`/g, '\\`').replace(/\$/g, '\\$');
84
+ claudeCmd = `claude "${escapedPrompt}" --permission-mode=acceptEdits`;
85
+ }
86
+ else {
87
+ claudeCmd = `claude --permission-mode=acceptEdits`;
88
+ }
89
+ escapedCmd = claudeCmd.replace(/'/g, "'\\''");
90
+ execSync(`tmux send-keys -t '${paneInfo}' '${escapedCmd}'`, { stdio: 'pipe' });
91
+ execSync(`tmux send-keys -t '${paneInfo}' Enter`, { stdio: 'pipe' });
92
+ }
93
+ else if (agent === 'opencode') {
94
+ const openCoderCmd = `opencode`;
95
+ const escapedOpenCmd = openCoderCmd.replace(/'/g, "'\\''");
96
+ execSync(`tmux send-keys -t '${paneInfo}' '${escapedOpenCmd}'`, { stdio: 'pipe' });
97
+ execSync(`tmux send-keys -t '${paneInfo}' Enter`, { stdio: 'pipe' });
98
+ if (prompt && prompt.trim()) {
99
+ await new Promise(r => setTimeout(r, 1500));
100
+ const bufName = `dmux_prompt_${Date.now()}`;
101
+ const promptEsc = prompt.replace(/\\/g, '\\\\').replace(/'/g, "'\\''");
102
+ execSync(`tmux set-buffer -b '${bufName}' -- '${promptEsc}'`, { stdio: 'pipe' });
103
+ execSync(`tmux paste-buffer -b '${bufName}' -t '${paneInfo}'`, { stdio: 'pipe' });
104
+ await new Promise(r => setTimeout(r, 200));
105
+ execSync(`tmux delete-buffer -b '${bufName}'`, { stdio: 'pipe' });
106
+ execSync(`tmux send-keys -t '${paneInfo}' Enter`, { stdio: 'pipe' });
107
+ }
108
+ }
109
+ execSync(`tmux select-pane -t '${paneInfo}'`, { stdio: 'pipe' });
110
+ const newPane = {
111
+ id: `dmux-${Date.now()}`,
112
+ slug,
113
+ prompt: prompt ? (prompt.substring(0, 50) + (prompt.length > 50 ? '...' : '')) : 'No initial prompt',
114
+ paneId: paneInfo,
115
+ worktreePath,
116
+ agent,
117
+ };
118
+ const updatedPanes = [...panes, newPane];
119
+ await savePanes(updatedPanes);
120
+ execSync(`tmux select-pane -t '${originalPaneId}'`, { stdio: 'pipe' });
121
+ try {
122
+ execSync(`tmux select-pane -t '${originalPaneId}' -T "dmux-${projectName}"`, { stdio: 'pipe' });
123
+ }
124
+ catch { }
125
+ process.stdout.write('\x1b[2J\x1b[H');
126
+ setIsCreatingPane(false);
127
+ setStatusMessage('');
128
+ setNewPanePrompt('');
129
+ await loadPanes();
130
+ };
131
+ return { openInEditor, createNewPane };
132
+ }
133
+ //# sourceMappingURL=usePaneCreation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePaneCreation.js","sourceRoot":"","sources":["../../src/hooks/usePaneCreation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { DmuxPane, ProjectSettings } from '../types.js';
2
+ interface Params {
3
+ panes: DmuxPane[];
4
+ savePanes: (p: DmuxPane[]) => Promise<void>;
5
+ projectSettings: ProjectSettings;
6
+ setStatusMessage: (msg: string) => void;
7
+ setRunningCommand: (v: boolean) => void;
8
+ }
9
+ export default function usePaneRunner({ panes, savePanes, projectSettings, setStatusMessage, setRunningCommand }: Params): {
10
+ readonly copyNonGitFiles: (worktreePath: string) => Promise<void>;
11
+ readonly runCommandInternal: (type: "test" | "dev", pane: DmuxPane) => Promise<void>;
12
+ readonly monitorTestOutput: (paneId: string, logFile: string) => Promise<void>;
13
+ readonly monitorDevOutput: (paneId: string, logFile: string) => Promise<void>;
14
+ readonly attachBackgroundWindow: (pane: DmuxPane, type: "test" | "dev") => Promise<void>;
15
+ };
16
+ export {};
17
+ //# sourceMappingURL=usePaneRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePaneRunner.d.ts","sourceRoot":"","sources":["../../src/hooks/usePaneRunner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG7D,UAAU,MAAM;IACd,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,eAAe,EAAE,eAAe,CAAC;IACjC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,iBAAiB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,EAAE,MAAM;6CACzE,MAAM;wCAcX,MAAM,GAAG,KAAK,QAAQ,QAAQ;yCAmD7B,MAAM,WAAW,MAAM;wCA6BxB,MAAM,WAAW,MAAM;4CAoBnB,QAAQ,QAAQ,MAAM,GAAG,KAAK;EAqB3E"}
@@ -0,0 +1,149 @@
1
+ import { execSync } from 'child_process';
2
+ import fs from 'fs/promises';
3
+ import { applySmartLayout } from '../utils/tmux.js';
4
+ export default function usePaneRunner({ panes, savePanes, projectSettings, setStatusMessage, setRunningCommand }) {
5
+ const copyNonGitFiles = async (worktreePath) => {
6
+ try {
7
+ setStatusMessage('Copying non-git files from main...');
8
+ const projectRoot = execSync('git rev-parse --show-toplevel', { encoding: 'utf-8', stdio: 'pipe' }).trim();
9
+ const rsyncCmd = `rsync -avz --exclude='.git' --exclude='node_modules' --exclude='dist' --exclude='build' --exclude='.next' --exclude='.turbo' "${projectRoot}/" "${worktreePath}/"`;
10
+ execSync(rsyncCmd, { stdio: 'pipe' });
11
+ setStatusMessage('Non-git files copied successfully');
12
+ setTimeout(() => setStatusMessage(''), 2000);
13
+ }
14
+ catch {
15
+ setStatusMessage('Failed to copy non-git files');
16
+ setTimeout(() => setStatusMessage(''), 2000);
17
+ }
18
+ };
19
+ const runCommandInternal = async (type, pane) => {
20
+ if (!pane.worktreePath) {
21
+ setStatusMessage('No worktree path for this pane');
22
+ setTimeout(() => setStatusMessage(''), 2000);
23
+ return;
24
+ }
25
+ const command = type === 'test' ? projectSettings.testCommand : projectSettings.devCommand;
26
+ if (!command) {
27
+ setStatusMessage('No command configured');
28
+ setTimeout(() => setStatusMessage(''), 2000);
29
+ return;
30
+ }
31
+ try {
32
+ setRunningCommand(true);
33
+ setStatusMessage(`Starting ${type} in background window...`);
34
+ const existingWindowId = type === 'test' ? pane.testWindowId : pane.devWindowId;
35
+ if (existingWindowId) {
36
+ try {
37
+ execSync(`tmux kill-window -t '${existingWindowId}'`, { stdio: 'pipe' });
38
+ }
39
+ catch { }
40
+ }
41
+ const windowName = `${pane.slug}-${type}`;
42
+ const windowId = execSync(`tmux new-window -d -n '${windowName}' -P -F '#{window_id}'`, { encoding: 'utf-8', stdio: 'pipe' }).trim();
43
+ const logFile = `/tmp/dmux-${pane.id}-${type}.log`;
44
+ const fullCommand = `cd "${pane.worktreePath}" && ${command} 2>&1 | tee ${logFile}`;
45
+ execSync(`tmux send-keys -t '${windowId}' '${fullCommand.replace(/'/g, "'\\''")}' Enter`, { stdio: 'pipe' });
46
+ const updatedPane = {
47
+ ...pane,
48
+ [type === 'test' ? 'testWindowId' : 'devWindowId']: windowId,
49
+ [type === 'test' ? 'testStatus' : 'devStatus']: 'running'
50
+ };
51
+ const updatedPanes = panes.map(p => p.id === pane.id ? updatedPane : p);
52
+ await savePanes(updatedPanes);
53
+ if (type === 'test')
54
+ setTimeout(() => monitorTestOutput(pane.id, logFile), 2000);
55
+ else
56
+ setTimeout(() => monitorDevOutput(pane.id, logFile), 2000);
57
+ setRunningCommand(false);
58
+ setStatusMessage(`${type === 'test' ? 'Test' : 'Dev server'} started in background`);
59
+ setTimeout(() => setStatusMessage(''), 3000);
60
+ }
61
+ catch {
62
+ setRunningCommand(false);
63
+ setStatusMessage(`Failed to run ${type} command`);
64
+ setTimeout(() => setStatusMessage(''), 3000);
65
+ }
66
+ };
67
+ const monitorTestOutput = async (paneId, logFile) => {
68
+ try {
69
+ const content = await fs.readFile(logFile, 'utf-8');
70
+ let status = 'running';
71
+ if (content.match(/(?:tests?|specs?) (?:passed|✓|succeeded)/i) || content.match(/\b0 fail(?:ing|ed|ures?)\b/i)) {
72
+ status = 'passed';
73
+ }
74
+ else if (content.match(/(?:tests?|specs?) (?:failed|✗|✖)/i) || content.match(/\d+ fail(?:ing|ed|ures?)/i) || content.match(/error:/i)) {
75
+ status = 'failed';
76
+ }
77
+ const pane = panes.find(p => p.id === paneId);
78
+ if (pane?.testWindowId) {
79
+ try {
80
+ execSync(`tmux list-windows -F '#{window_id}' | rg -q '${pane.testWindowId}'`, { stdio: 'pipe' });
81
+ const paneOutput = execSync(`tmux capture-pane -t '${pane.testWindowId}' -p | tail -5`, { encoding: 'utf-8' });
82
+ if (paneOutput.includes('$') || paneOutput.includes('#')) {
83
+ if (status === 'running')
84
+ status = 'passed';
85
+ }
86
+ }
87
+ catch {
88
+ if (status === 'running')
89
+ status = 'failed';
90
+ }
91
+ }
92
+ const updatedPanes = panes.map(p => p.id === paneId ? { ...p, testStatus: status, testOutput: content.slice(-5000) } : p);
93
+ await savePanes(updatedPanes);
94
+ if (status === 'running')
95
+ setTimeout(() => monitorTestOutput(paneId, logFile), 2000);
96
+ }
97
+ catch { }
98
+ };
99
+ const monitorDevOutput = async (paneId, logFile) => {
100
+ try {
101
+ const content = await fs.readFile(logFile, 'utf-8');
102
+ const urlMatch = content.match(/https?:\/\/(?:localhost|127\.0\.0\.1|0\.0\.0\.0):\d+/i) || content.match(/Local:\s+(https?:\/\/[^\s]+)/i) || content.match(/listening on port (\d+)/i);
103
+ let devUrl = '';
104
+ if (urlMatch) {
105
+ if (urlMatch[0].startsWith('http'))
106
+ devUrl = urlMatch[0];
107
+ else if (urlMatch[1])
108
+ devUrl = `http://localhost:${urlMatch[1]}`;
109
+ }
110
+ const pane = panes.find(p => p.id === paneId);
111
+ let status = 'running';
112
+ if (pane?.devWindowId) {
113
+ try {
114
+ execSync(`tmux list-windows -F '#{window_id}' | rg -q '${pane.devWindowId}'`, { stdio: 'pipe' });
115
+ }
116
+ catch {
117
+ status = 'stopped';
118
+ }
119
+ }
120
+ const updatedPanes = panes.map(p => p.id === paneId ? { ...p, devStatus: status, devUrl: devUrl || p.devUrl } : p);
121
+ await savePanes(updatedPanes);
122
+ if (status === 'running')
123
+ setTimeout(() => monitorDevOutput(paneId, logFile), 2000);
124
+ }
125
+ catch { }
126
+ };
127
+ const attachBackgroundWindow = async (pane, type) => {
128
+ const windowId = type === 'test' ? pane.testWindowId : pane.devWindowId;
129
+ if (!windowId) {
130
+ setStatusMessage(`No ${type} window to attach`);
131
+ setTimeout(() => setStatusMessage(''), 2000);
132
+ return;
133
+ }
134
+ try {
135
+ execSync(`tmux join-pane -h -s '${windowId}'`, { stdio: 'pipe' });
136
+ const paneCount = parseInt(execSync('tmux list-panes | wc -l', { encoding: 'utf-8' }).trim());
137
+ applySmartLayout(paneCount);
138
+ execSync(`tmux select-pane -t '{last}'`, { stdio: 'pipe' });
139
+ setStatusMessage(`Attached ${type} window`);
140
+ setTimeout(() => setStatusMessage(''), 2000);
141
+ }
142
+ catch {
143
+ setStatusMessage(`Failed to attach ${type} window`);
144
+ setTimeout(() => setStatusMessage(''), 2000);
145
+ }
146
+ };
147
+ return { copyNonGitFiles, runCommandInternal, monitorTestOutput, monitorDevOutput, attachBackgroundWindow };
148
+ }
149
+ //# sourceMappingURL=usePaneRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePaneRunner.js","sourceRoot":"","sources":["../../src/hooks/usePaneRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { DmuxPane } from '../types.js';
2
+ export default function usePanes(panesFile: string, skipLoading: boolean): {
3
+ readonly panes: DmuxPane[];
4
+ readonly setPanes: import("react").Dispatch<import("react").SetStateAction<DmuxPane[]>>;
5
+ readonly isLoading: boolean;
6
+ readonly loadPanes: () => Promise<void>;
7
+ readonly savePanes: (newPanes: DmuxPane[]) => Promise<void>;
8
+ };
9
+ //# sourceMappingURL=usePanes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePanes.d.ts","sourceRoot":"","sources":["../../src/hooks/usePanes.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAW5C,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;;;;;mCA+JnC,QAAQ,EAAE;EA0D9C"}