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.
- package/README.md +12 -8
- package/dist/AutoUpdater.d.ts +2 -2
- package/dist/AutoUpdater.d.ts.map +1 -1
- package/dist/AutoUpdater.js +18 -7
- package/dist/AutoUpdater.js.map +1 -1
- package/dist/CleanTextInput.d.ts.map +1 -1
- package/dist/CleanTextInput.js +12 -4
- package/dist/CleanTextInput.js.map +1 -1
- package/dist/DmuxApp.d.ts +1 -10
- package/dist/DmuxApp.d.ts.map +1 -1
- package/dist/DmuxApp.js +146 -1483
- package/dist/DmuxApp.js.map +1 -1
- package/dist/components/AgentChoiceDialog.d.ts +7 -0
- package/dist/components/AgentChoiceDialog.d.ts.map +1 -0
- package/dist/components/AgentChoiceDialog.js +12 -0
- package/dist/components/AgentChoiceDialog.js.map +1 -0
- package/dist/components/CloseOptionsDialog.d.ts +9 -0
- package/dist/components/CloseOptionsDialog.d.ts.map +1 -0
- package/dist/components/CloseOptionsDialog.js +30 -0
- package/dist/components/CloseOptionsDialog.js.map +1 -0
- package/dist/components/CommandPromptDialog.d.ts +9 -0
- package/dist/components/CommandPromptDialog.d.ts.map +1 -0
- package/dist/components/CommandPromptDialog.js +20 -0
- package/dist/components/CommandPromptDialog.js.map +1 -0
- package/dist/components/CreatingIndicator.d.ts +7 -0
- package/dist/components/CreatingIndicator.d.ts.map +1 -0
- package/dist/components/CreatingIndicator.js +10 -0
- package/dist/components/CreatingIndicator.js.map +1 -0
- package/dist/components/FileCopyPrompt.d.ts +4 -0
- package/dist/components/FileCopyPrompt.d.ts.map +1 -0
- package/dist/components/FileCopyPrompt.js +13 -0
- package/dist/components/FileCopyPrompt.js.map +1 -0
- package/dist/components/FooterHelp.d.ts +8 -0
- package/dist/components/FooterHelp.d.ts.map +1 -0
- package/dist/components/FooterHelp.js +12 -0
- package/dist/components/FooterHelp.js.map +1 -0
- package/dist/components/LoadingIndicator.d.ts +4 -0
- package/dist/components/LoadingIndicator.d.ts.map +1 -0
- package/dist/components/LoadingIndicator.js +10 -0
- package/dist/components/LoadingIndicator.js.map +1 -0
- package/dist/components/MergeConfirmationDialog.d.ts +8 -0
- package/dist/components/MergeConfirmationDialog.d.ts.map +1 -0
- package/dist/components/MergeConfirmationDialog.js +13 -0
- package/dist/components/MergeConfirmationDialog.js.map +1 -0
- package/dist/components/NewPaneDialog.d.ts +9 -0
- package/dist/components/NewPaneDialog.d.ts.map +1 -0
- package/dist/components/NewPaneDialog.js +13 -0
- package/dist/components/NewPaneDialog.js.map +1 -0
- package/dist/components/PaneCard.d.ts +9 -0
- package/dist/components/PaneCard.d.ts.map +1 -0
- package/dist/components/PaneCard.js +37 -0
- package/dist/components/PaneCard.js.map +1 -0
- package/dist/components/PanesGrid.d.ts +11 -0
- package/dist/components/PanesGrid.d.ts.map +1 -0
- package/dist/components/PanesGrid.js +11 -0
- package/dist/components/PanesGrid.js.map +1 -0
- package/dist/components/RunningIndicator.d.ts +4 -0
- package/dist/components/RunningIndicator.d.ts.map +1 -0
- package/dist/components/RunningIndicator.js +9 -0
- package/dist/components/RunningIndicator.js.map +1 -0
- package/dist/components/UpdateDialog.d.ts +7 -0
- package/dist/components/UpdateDialog.d.ts.map +1 -0
- package/dist/components/UpdateDialog.js +27 -0
- package/dist/components/UpdateDialog.js.map +1 -0
- package/dist/components/UpdatingIndicator.d.ts +4 -0
- package/dist/components/UpdatingIndicator.d.ts.map +1 -0
- package/dist/components/UpdatingIndicator.js +9 -0
- package/dist/components/UpdatingIndicator.js.map +1 -0
- package/dist/hooks/useAgentDetection.d.ts +4 -0
- package/dist/hooks/useAgentDetection.d.ts.map +1 -0
- package/dist/hooks/useAgentDetection.js +71 -0
- package/dist/hooks/useAgentDetection.js.map +1 -0
- package/dist/hooks/useAgentStatus.d.ts +11 -0
- package/dist/hooks/useAgentStatus.d.ts.map +1 -0
- package/dist/hooks/useAgentStatus.js +172 -0
- package/dist/hooks/useAgentStatus.js.map +1 -0
- package/dist/hooks/useAutoUpdater.d.ts +20 -0
- package/dist/hooks/useAutoUpdater.d.ts.map +1 -0
- package/dist/hooks/useAutoUpdater.js +100 -0
- package/dist/hooks/useAutoUpdater.js.map +1 -0
- package/dist/hooks/useCommandRunner.d.ts +18 -0
- package/dist/hooks/useCommandRunner.d.ts.map +1 -0
- package/dist/hooks/useCommandRunner.js +44 -0
- package/dist/hooks/useCommandRunner.js.map +1 -0
- package/dist/hooks/useNavigation.d.ts +8 -0
- package/dist/hooks/useNavigation.d.ts.map +1 -0
- package/dist/hooks/useNavigation.js +62 -0
- package/dist/hooks/useNavigation.js.map +1 -0
- package/dist/hooks/usePaneCreation.d.ts +16 -0
- package/dist/hooks/usePaneCreation.d.ts.map +1 -0
- package/dist/hooks/usePaneCreation.js +133 -0
- package/dist/hooks/usePaneCreation.js.map +1 -0
- package/dist/hooks/usePaneRunner.d.ts +17 -0
- package/dist/hooks/usePaneRunner.d.ts.map +1 -0
- package/dist/hooks/usePaneRunner.js +149 -0
- package/dist/hooks/usePaneRunner.js.map +1 -0
- package/dist/hooks/usePanes.d.ts +9 -0
- package/dist/hooks/usePanes.d.ts.map +1 -0
- package/dist/hooks/usePanes.js +222 -0
- package/dist/hooks/usePanes.js.map +1 -0
- package/dist/hooks/useProjectSettings.d.ts +6 -0
- package/dist/hooks/useProjectSettings.d.ts.map +1 -0
- package/dist/hooks/useProjectSettings.js +46 -0
- package/dist/hooks/useProjectSettings.js.map +1 -0
- package/dist/hooks/useTerminalWidth.d.ts +2 -0
- package/dist/hooks/useTerminalWidth.d.ts.map +1 -0
- package/dist/hooks/useTerminalWidth.js +13 -0
- package/dist/hooks/useTerminalWidth.js.map +1 -0
- package/dist/hooks/useWorktreeActions.d.ts +17 -0
- package/dist/hooks/useWorktreeActions.d.ts.map +1 -0
- package/dist/hooks/useWorktreeActions.js +190 -0
- package/dist/hooks/useWorktreeActions.js.map +1 -0
- package/dist/index.js +86 -11
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/commands.d.ts +6 -0
- package/dist/utils/commands.d.ts.map +1 -0
- package/dist/utils/commands.js +35 -0
- package/dist/utils/commands.js.map +1 -0
- package/dist/utils/input.d.ts +13 -0
- package/dist/utils/input.d.ts.map +1 -0
- package/dist/utils/input.js +100 -0
- package/dist/utils/input.js.map +1 -0
- package/dist/utils/slug.d.ts +3 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +58 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/utils/tmux.d.ts +4 -0
- package/dist/utils/tmux.d.ts.map +1 -0
- package/dist/utils/tmux.js +62 -0
- package/dist/utils/tmux.js.map +1 -0
- package/dist/workers/updateChecker.d.ts +2 -0
- package/dist/workers/updateChecker.d.ts.map +1 -0
- package/dist/workers/updateChecker.js +33 -0
- package/dist/workers/updateChecker.js.map +1 -0
- 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"}
|