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,222 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { execSync } from 'child_process';
3
+ import fs from 'fs/promises';
4
+ export default function usePanes(panesFile, skipLoading) {
5
+ const [panes, setPanes] = useState([]);
6
+ const [isLoading, setIsLoading] = useState(true);
7
+ const loadPanes = async () => {
8
+ if (skipLoading)
9
+ return;
10
+ try {
11
+ const content = await fs.readFile(panesFile, 'utf-8');
12
+ // Handle both old array format and new config format
13
+ let loadedPanes;
14
+ let parsed = JSON.parse(content);
15
+ if (Array.isArray(parsed)) {
16
+ loadedPanes = parsed;
17
+ }
18
+ else {
19
+ const config = parsed;
20
+ loadedPanes = config.panes || [];
21
+ }
22
+ let allPaneIds = [];
23
+ let titleToId = new Map();
24
+ let retryCount = 0;
25
+ const maxRetries = 2;
26
+ while (retryCount <= maxRetries) {
27
+ try {
28
+ const output = execSync(`tmux list-panes -s -F '#{pane_id}::#{pane_title}'`, {
29
+ encoding: 'utf-8',
30
+ stdio: 'pipe',
31
+ timeout: 1000
32
+ }).trim();
33
+ if (output) {
34
+ const lines = output.split('\n');
35
+ for (const line of lines) {
36
+ const [id, title] = line.split('::');
37
+ if (id && id.startsWith('%')) {
38
+ allPaneIds.push(id);
39
+ if (title)
40
+ titleToId.set(title.trim(), id);
41
+ }
42
+ }
43
+ }
44
+ if (allPaneIds.length > 0 || retryCount === maxRetries)
45
+ break;
46
+ }
47
+ catch {
48
+ if (retryCount < maxRetries)
49
+ await new Promise(r => setTimeout(r, 100));
50
+ }
51
+ retryCount++;
52
+ }
53
+ // Attempt to rebind panes whose IDs changed by matching on title (slug)
54
+ const reboundPanes = loadedPanes.map(p => {
55
+ if (allPaneIds.length > 0 && !allPaneIds.includes(p.paneId)) {
56
+ const remappedId = titleToId.get(p.slug);
57
+ if (remappedId)
58
+ return { ...p, paneId: remappedId };
59
+ }
60
+ return p;
61
+ });
62
+ // Find panes that exist in config but not in tmux
63
+ const missingPanes = allPaneIds.length > 0
64
+ ? reboundPanes.filter(pane => !allPaneIds.includes(pane.paneId))
65
+ : [];
66
+ // Recreate missing panes
67
+ for (const missingPane of missingPanes) {
68
+ try {
69
+ // Create new pane
70
+ const newPaneId = execSync(`tmux split-window -h -P -F '#{pane_id}' -c "${missingPane.worktreePath || process.cwd()}"`, {
71
+ encoding: 'utf-8',
72
+ stdio: 'pipe'
73
+ }).trim();
74
+ // Set pane title
75
+ execSync(`tmux select-pane -t '${newPaneId}' -T "${missingPane.slug}"`, { stdio: 'pipe' });
76
+ // Update the pane with new ID
77
+ missingPane.paneId = newPaneId;
78
+ // Send a message to the pane indicating it was restored
79
+ execSync(`tmux send-keys -t '${newPaneId}' "# Pane restored: ${missingPane.slug}" Enter`, { stdio: 'pipe' });
80
+ execSync(`tmux send-keys -t '${newPaneId}' "# Original prompt: ${missingPane.prompt?.substring(0, 50)}..." Enter`, { stdio: 'pipe' });
81
+ execSync(`tmux send-keys -t '${newPaneId}' "cd ${missingPane.worktreePath || process.cwd()}" Enter`, { stdio: 'pipe' });
82
+ }
83
+ catch (error) {
84
+ // If we can't create the pane, skip it
85
+ console.error(`Failed to recreate pane ${missingPane.slug}:`, error);
86
+ }
87
+ }
88
+ // Re-fetch pane IDs after recreation
89
+ if (missingPanes.length > 0) {
90
+ // Apply even-horizontal layout after creating panes
91
+ try {
92
+ execSync('tmux select-layout even-horizontal', { stdio: 'pipe' });
93
+ }
94
+ catch { }
95
+ allPaneIds = [];
96
+ titleToId.clear();
97
+ try {
98
+ const output = execSync(`tmux list-panes -s -F '#{pane_id}::#{pane_title}'`, {
99
+ encoding: 'utf-8',
100
+ stdio: 'pipe',
101
+ timeout: 1000
102
+ }).trim();
103
+ if (output) {
104
+ const lines = output.split('\n');
105
+ for (const line of lines) {
106
+ const [id, title] = line.split('::');
107
+ if (id && id.startsWith('%')) {
108
+ allPaneIds.push(id);
109
+ if (title)
110
+ titleToId.set(title.trim(), id);
111
+ }
112
+ }
113
+ }
114
+ }
115
+ catch { }
116
+ // Re-rebind after recreation
117
+ loadedPanes.forEach(p => {
118
+ if (!allPaneIds.includes(p.paneId)) {
119
+ const remappedId = titleToId.get(p.slug);
120
+ if (remappedId)
121
+ p.paneId = remappedId;
122
+ }
123
+ });
124
+ }
125
+ // Now filter to only include panes that exist in tmux
126
+ const activePanes = allPaneIds.length > 0
127
+ ? loadedPanes.filter(pane => allPaneIds.includes(pane.paneId))
128
+ : panes; // Always preserve existing panes when tmux fails
129
+ const currentPaneIds = panes.map(p => p.paneId).sort().join(',');
130
+ const newPaneIds = activePanes.map(p => p.paneId).sort().join(',');
131
+ // Only update if there's a real change, not just on initial load
132
+ if (currentPaneIds !== newPaneIds && (panes.length > 0 || activePanes.length > 0)) {
133
+ if (activePanes.length > 0) {
134
+ activePanes.forEach(pane => {
135
+ try {
136
+ execSync(`tmux select-pane -t '${pane.paneId}' -T "${pane.slug}"`, { stdio: 'pipe' });
137
+ }
138
+ catch { }
139
+ });
140
+ }
141
+ setPanes(activePanes);
142
+ // Persist updated list if IDs changed or panes were filtered
143
+ if (JSON.stringify(activePanes) !== JSON.stringify(loadedPanes)) {
144
+ // Save in new config format
145
+ const config = {
146
+ ...parsed,
147
+ panes: activePanes,
148
+ lastUpdated: new Date().toISOString()
149
+ };
150
+ await fs.writeFile(panesFile, JSON.stringify(config, null, 2));
151
+ }
152
+ }
153
+ }
154
+ catch {
155
+ // ignore
156
+ }
157
+ finally {
158
+ if (isLoading)
159
+ setIsLoading(false);
160
+ }
161
+ };
162
+ const savePanes = async (newPanes) => {
163
+ let activePanes = newPanes;
164
+ try {
165
+ const out = execSync(`tmux list-panes -s -F '#{pane_id}::#{pane_title}'`, {
166
+ encoding: 'utf-8',
167
+ stdio: 'pipe',
168
+ timeout: 1000
169
+ }).trim();
170
+ const paneIds = [];
171
+ const titleToId = new Map();
172
+ if (out) {
173
+ out.split('\n').forEach(line => {
174
+ const [id, title] = line.split('::');
175
+ if (id && id.startsWith('%'))
176
+ paneIds.push(id);
177
+ if (title)
178
+ titleToId.set(title.trim(), id);
179
+ });
180
+ }
181
+ // Rebind panes by title if their IDs changed, then filter to existing panes when possible
182
+ activePanes = newPanes
183
+ .map(p => {
184
+ if (!paneIds.includes(p.paneId)) {
185
+ const remappedId = titleToId.get(p.slug);
186
+ if (remappedId)
187
+ return { ...p, paneId: remappedId };
188
+ }
189
+ return p;
190
+ })
191
+ .filter(p => paneIds.length > 0 ? paneIds.includes(p.paneId) : true);
192
+ }
193
+ catch {
194
+ activePanes = newPanes;
195
+ }
196
+ // Read existing config to preserve other fields
197
+ let config = { panes: [] };
198
+ try {
199
+ const content = await fs.readFile(panesFile, 'utf-8');
200
+ const parsed = JSON.parse(content);
201
+ if (!Array.isArray(parsed)) {
202
+ config = parsed;
203
+ }
204
+ }
205
+ catch { }
206
+ // Save in config format
207
+ config.panes = activePanes;
208
+ config.lastUpdated = new Date().toISOString();
209
+ await fs.writeFile(panesFile, JSON.stringify(config, null, 2));
210
+ setPanes(activePanes);
211
+ };
212
+ useEffect(() => {
213
+ loadPanes();
214
+ const interval = setInterval(() => {
215
+ if (!skipLoading)
216
+ loadPanes();
217
+ }, 3000);
218
+ return () => clearInterval(interval);
219
+ }, [skipLoading, panesFile]);
220
+ return { panes, setPanes, isLoading, loadPanes, savePanes };
221
+ }
222
+ //# sourceMappingURL=usePanes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePanes.js","sourceRoot":"","sources":["../../src/hooks/usePanes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ProjectSettings } from '../types.js';
2
+ export default function useProjectSettings(settingsFile: string): {
3
+ projectSettings: ProjectSettings;
4
+ saveSettings: (settings: ProjectSettings) => Promise<void>;
5
+ };
6
+ //# sourceMappingURL=useProjectSettings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProjectSettings.d.ts","sourceRoot":"","sources":["../../src/hooks/useProjectSettings.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAWnD,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,YAAY,EAAE,MAAM;;6BAyBvB,eAAe;EAoBtD"}
@@ -0,0 +1,46 @@
1
+ import { useEffect, useState } from 'react';
2
+ import fs from 'fs/promises';
3
+ export default function useProjectSettings(settingsFile) {
4
+ const [projectSettings, setProjectSettings] = useState({});
5
+ useEffect(() => {
6
+ const load = async () => {
7
+ try {
8
+ const content = await fs.readFile(settingsFile, 'utf-8');
9
+ const parsed = JSON.parse(content);
10
+ // Handle both old format (direct settings) and new format (config with settings field)
11
+ if (parsed.settings !== undefined || parsed.panes !== undefined) {
12
+ // New config format
13
+ const config = parsed;
14
+ setProjectSettings(config.settings || {});
15
+ }
16
+ else {
17
+ // Old format or direct settings
18
+ setProjectSettings(parsed);
19
+ }
20
+ }
21
+ catch {
22
+ setProjectSettings({});
23
+ }
24
+ };
25
+ load();
26
+ }, [settingsFile]);
27
+ const saveSettings = async (settings) => {
28
+ // Read existing config to preserve other fields
29
+ let config = {};
30
+ try {
31
+ const content = await fs.readFile(settingsFile, 'utf-8');
32
+ const parsed = JSON.parse(content);
33
+ if (parsed.panes !== undefined || parsed.settings !== undefined) {
34
+ config = parsed;
35
+ }
36
+ }
37
+ catch { }
38
+ // Update settings in config
39
+ config.settings = settings;
40
+ config.lastUpdated = new Date().toISOString();
41
+ await fs.writeFile(settingsFile, JSON.stringify(config, null, 2));
42
+ setProjectSettings(settings);
43
+ };
44
+ return { projectSettings, saveSettings };
45
+ }
46
+ //# sourceMappingURL=useProjectSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProjectSettings.js","sourceRoot":"","sources":["../../src/hooks/useProjectSettings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,MAAM,aAAa,CAAC;AAY7B,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,YAAoB;IAC7D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAE5E,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAEnC,uFAAuF;gBACvF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAChE,oBAAoB;oBACpB,MAAM,MAAM,GAAG,MAAoB,CAAC;oBACpC,kBAAkB,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,gCAAgC;oBAChC,kBAAkB,CAAC,MAAyB,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;IACT,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,MAAM,YAAY,GAAG,KAAK,EAAE,QAAyB,EAAE,EAAE;QACvD,gDAAgD;QAChD,IAAI,MAAM,GAAe,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACnC,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAChE,MAAM,GAAG,MAAM,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,4BAA4B;QAC5B,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC3B,MAAM,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE9C,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export default function useTerminalWidth(): number;
2
+ //# sourceMappingURL=useTerminalWidth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTerminalWidth.d.ts","sourceRoot":"","sources":["../../src/hooks/useTerminalWidth.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,gBAAgB,WAYvC"}
@@ -0,0 +1,13 @@
1
+ import { useEffect, useState } from 'react';
2
+ export default function useTerminalWidth() {
3
+ const [terminalWidth, setTerminalWidth] = useState(process.stdout.columns || 80);
4
+ useEffect(() => {
5
+ const handleResize = () => setTerminalWidth(process.stdout.columns || 80);
6
+ process.stdout.on('resize', handleResize);
7
+ return () => {
8
+ process.stdout.removeListener('resize', handleResize);
9
+ };
10
+ }, []);
11
+ return terminalWidth;
12
+ }
13
+ //# sourceMappingURL=useTerminalWidth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTerminalWidth.js","sourceRoot":"","sources":["../../src/hooks/useTerminalWidth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,CAAC,OAAO,UAAU,gBAAgB;IACtC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAS,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAEzF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC1E,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;YACV,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxD,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { DmuxPane } from '../types.js';
2
+ interface Params {
3
+ panes: DmuxPane[];
4
+ savePanes: (p: DmuxPane[]) => Promise<void>;
5
+ setStatusMessage: (msg: string) => void;
6
+ setShowMergeConfirmation: (v: boolean) => void;
7
+ setMergedPane: (pane: DmuxPane | null) => void;
8
+ }
9
+ export default function useWorktreeActions({ panes, savePanes, setStatusMessage, setShowMergeConfirmation, setMergedPane }: Params): {
10
+ readonly closePane: (pane: DmuxPane) => Promise<void>;
11
+ readonly mergeWorktree: (pane: DmuxPane) => Promise<void>;
12
+ readonly mergeAndPrune: (pane: DmuxPane) => Promise<void>;
13
+ readonly deleteUnsavedChanges: (pane: DmuxPane) => Promise<void>;
14
+ readonly handleCloseOption: (option: number, pane: DmuxPane) => Promise<void>;
15
+ };
16
+ export {};
17
+ //# sourceMappingURL=useWorktreeActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWorktreeActions.d.ts","sourceRoot":"","sources":["../../src/hooks/useWorktreeActions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,UAAU,MAAM;IACd,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,wBAAwB,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,aAAa,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,aAAa,EAAE,EAAE,MAAM;+BACrF,QAAQ;mCAiCJ,QAAQ;mCAuDR,QAAQ;0CAoDD,QAAQ;yCAmBT,MAAM,QAAQ,QAAQ;EAkB5E"}
@@ -0,0 +1,190 @@
1
+ import { execSync } from 'child_process';
2
+ import { useCallback } from 'react';
3
+ import { applySmartLayout } from '../utils/tmux.js';
4
+ export default function useWorktreeActions({ panes, savePanes, setStatusMessage, setShowMergeConfirmation, setMergedPane }) {
5
+ const closePane = useCallback(async (pane) => {
6
+ try {
7
+ if (pane.testWindowId) {
8
+ try {
9
+ execSync(`tmux kill-window -t '${pane.testWindowId}'`, { stdio: 'pipe' });
10
+ }
11
+ catch { }
12
+ }
13
+ if (pane.devWindowId) {
14
+ try {
15
+ execSync(`tmux kill-window -t '${pane.devWindowId}'`, { stdio: 'pipe' });
16
+ }
17
+ catch { }
18
+ }
19
+ process.stdout.write('\x1b[2J\x1b[H');
20
+ process.stdout.write('\n'.repeat(100));
21
+ try {
22
+ execSync('tmux clear-history', { stdio: 'pipe' });
23
+ execSync('tmux send-keys C-l', { stdio: 'pipe' });
24
+ }
25
+ catch { }
26
+ try {
27
+ execSync('tmux refresh-client', { stdio: 'pipe' });
28
+ }
29
+ catch { }
30
+ await new Promise(r => setTimeout(r, 100));
31
+ execSync(`tmux kill-pane -t '${pane.paneId}'`, { stdio: 'pipe' });
32
+ const paneCount = parseInt(execSync('tmux list-panes | wc -l', { encoding: 'utf-8' }).trim());
33
+ if (paneCount > 1)
34
+ applySmartLayout(paneCount);
35
+ const updatedPanes = panes.filter(p => p.id !== pane.id);
36
+ await savePanes(updatedPanes);
37
+ setStatusMessage(`Closed pane: ${pane.slug}`);
38
+ setTimeout(() => setStatusMessage(''), 3000);
39
+ }
40
+ catch {
41
+ setStatusMessage('Failed to close pane');
42
+ setTimeout(() => setStatusMessage(''), 2000);
43
+ }
44
+ }, [panes, savePanes, setStatusMessage]);
45
+ const mergeWorktree = useCallback(async (pane) => {
46
+ if (!pane.worktreePath) {
47
+ setStatusMessage('No worktree to merge');
48
+ setTimeout(() => setStatusMessage(''), 2000);
49
+ return;
50
+ }
51
+ try {
52
+ setStatusMessage('Checking worktree status...');
53
+ const mainBranch = execSync('git branch --show-current', { encoding: 'utf-8' }).trim();
54
+ const statusOutput = execSync(`git -C "${pane.worktreePath}" status --porcelain`, { encoding: 'utf-8' });
55
+ if (statusOutput.trim()) {
56
+ setStatusMessage('Staging changes...');
57
+ execSync(`git -C "${pane.worktreePath}" add -A`, { stdio: 'pipe' });
58
+ setStatusMessage('Committing changes...');
59
+ // Use generic message to avoid bringing in LLM here
60
+ execSync(`git -C "${pane.worktreePath}" commit -m 'chore: worktree changes'`, { stdio: 'pipe' });
61
+ }
62
+ setStatusMessage('Merging into main...');
63
+ try {
64
+ execSync(`git merge ${pane.slug}`, { stdio: 'pipe' });
65
+ }
66
+ catch (mergeError) {
67
+ const errorMessage = mergeError.message || String(mergeError);
68
+ if (errorMessage.includes('CONFLICT') || errorMessage.includes('conflict')) {
69
+ process.stderr.write('\n\x1b[31m✗ Merge conflict detected!\x1b[0m\n');
70
+ process.stderr.write(`\nThere are merge conflicts when merging branch '${pane.slug}' into '${mainBranch}'.\n`);
71
+ process.stderr.write('\nTo resolve:\n');
72
+ process.stderr.write('1. Manually resolve the merge conflicts in your editor\n');
73
+ process.stderr.write('2. Stage the resolved files: git add <resolved-files>\n');
74
+ process.stderr.write('3. Complete the merge: git commit\n');
75
+ process.stderr.write('4. Run dmux again to continue managing your panes\n');
76
+ process.stderr.write('\nExiting dmux now...\n\n');
77
+ process.stdout.write('\x1b[2J\x1b[H');
78
+ process.stdout.write('\x1b[3J');
79
+ try {
80
+ execSync('tmux clear-history', { stdio: 'pipe' });
81
+ }
82
+ catch { }
83
+ process.exit(1);
84
+ }
85
+ throw mergeError;
86
+ }
87
+ execSync(`git worktree remove "${pane.worktreePath}"`, { stdio: 'pipe' });
88
+ execSync(`git branch -d ${pane.slug}`, { stdio: 'pipe' });
89
+ setStatusMessage(`Merged ${pane.slug} into ${mainBranch}`);
90
+ setTimeout(() => setStatusMessage(''), 3000);
91
+ setMergedPane(pane);
92
+ setShowMergeConfirmation(true);
93
+ }
94
+ catch {
95
+ setStatusMessage('Failed to merge - check git status');
96
+ setTimeout(() => setStatusMessage(''), 3000);
97
+ }
98
+ }, [setStatusMessage, setMergedPane, setShowMergeConfirmation]);
99
+ const mergeAndPrune = useCallback(async (pane) => {
100
+ if (!pane.worktreePath) {
101
+ setStatusMessage('No worktree to merge');
102
+ setTimeout(() => setStatusMessage(''), 2000);
103
+ return;
104
+ }
105
+ try {
106
+ setStatusMessage('Checking worktree status...');
107
+ const mainBranch = execSync('git branch --show-current', { encoding: 'utf-8' }).trim();
108
+ const statusOutput = execSync(`git -C "${pane.worktreePath}" status --porcelain`, { encoding: 'utf-8' });
109
+ if (statusOutput.trim()) {
110
+ setStatusMessage('Staging changes...');
111
+ execSync(`git -C "${pane.worktreePath}" add -A`, { stdio: 'pipe' });
112
+ setStatusMessage('Committing changes...');
113
+ execSync(`git -C "${pane.worktreePath}" commit -m 'chore: worktree changes'`, { stdio: 'pipe' });
114
+ }
115
+ setStatusMessage('Merging into main...');
116
+ try {
117
+ execSync(`git merge ${pane.slug}`, { stdio: 'pipe' });
118
+ }
119
+ catch (mergeError) {
120
+ const errorMessage = mergeError.message || String(mergeError);
121
+ if (errorMessage.includes('CONFLICT') || errorMessage.includes('conflict')) {
122
+ process.stderr.write('\n\x1b[31m✗ Merge conflict detected!\x1b[0m\n');
123
+ process.stderr.write(`\nThere are merge conflicts when merging branch '${pane.slug}' into '${mainBranch}'.\n`);
124
+ process.stderr.write('\nTo resolve:\n');
125
+ process.stderr.write('1. Manually resolve the merge conflicts in your editor\n');
126
+ process.stderr.write('2. Stage the resolved files: git add <resolved-files>\n');
127
+ process.stderr.write('3. Complete the merge: git commit\n');
128
+ process.stderr.write('4. Run dmux again to continue managing your panes\n');
129
+ process.stderr.write('\nExiting dmux now...\n\n');
130
+ process.stdout.write('\x1b[2J\x1b[H');
131
+ process.stdout.write('\x1b[3J');
132
+ try {
133
+ execSync('tmux clear-history', { stdio: 'pipe' });
134
+ }
135
+ catch { }
136
+ process.exit(1);
137
+ }
138
+ throw mergeError;
139
+ }
140
+ execSync(`git worktree remove "${pane.worktreePath}"`, { stdio: 'pipe' });
141
+ execSync(`git branch -d ${pane.slug}`, { stdio: 'pipe' });
142
+ await closePane(pane);
143
+ setStatusMessage(`Merged ${pane.slug} into ${mainBranch} and closed pane`);
144
+ setTimeout(() => setStatusMessage(''), 3000);
145
+ }
146
+ catch {
147
+ setStatusMessage('Failed to merge - check git status');
148
+ setTimeout(() => setStatusMessage(''), 3000);
149
+ }
150
+ }, [closePane, setStatusMessage]);
151
+ const deleteUnsavedChanges = useCallback(async (pane) => {
152
+ if (!pane.worktreePath) {
153
+ await closePane(pane);
154
+ return;
155
+ }
156
+ try {
157
+ setStatusMessage('Removing worktree with unsaved changes...');
158
+ execSync(`git worktree remove --force "${pane.worktreePath}"`, { stdio: 'pipe' });
159
+ try {
160
+ execSync(`git branch -D ${pane.slug}`, { stdio: 'pipe' });
161
+ }
162
+ catch { }
163
+ await closePane(pane);
164
+ setStatusMessage(`Deleted worktree ${pane.slug} and closed pane`);
165
+ setTimeout(() => setStatusMessage(''), 3000);
166
+ }
167
+ catch {
168
+ setStatusMessage('Failed to delete worktree');
169
+ setTimeout(() => setStatusMessage(''), 3000);
170
+ }
171
+ }, [closePane, setStatusMessage]);
172
+ const handleCloseOption = useCallback(async (option, pane) => {
173
+ switch (option) {
174
+ case 0:
175
+ await mergeAndPrune(pane);
176
+ break;
177
+ case 1:
178
+ await mergeWorktree(pane);
179
+ break;
180
+ case 2:
181
+ await deleteUnsavedChanges(pane);
182
+ break;
183
+ case 3:
184
+ await closePane(pane);
185
+ break;
186
+ }
187
+ }, [mergeAndPrune, mergeWorktree, deleteUnsavedChanges, closePane]);
188
+ return { closePane, mergeWorktree, mergeAndPrune, deleteUnsavedChanges, handleCloseOption };
189
+ }
190
+ //# sourceMappingURL=useWorktreeActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWorktreeActions.js","sourceRoot":"","sources":["../../src/hooks/useWorktreeActions.ts"],"names":[],"mappings":"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"}