github-issue-tower-defence-management 1.144.4 → 1.144.5
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/CHANGELOG.md +7 -0
- package/bin/adapter/repositories/NodeTmuxSessionRepository.js +3 -25
- package/bin/adapter/repositories/NodeTmuxSessionRepository.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/repositories/NodeTmuxSessionRepository.test.ts +19 -34
- package/src/adapter/repositories/NodeTmuxSessionRepository.ts +3 -32
- package/types/adapter/repositories/NodeTmuxSessionRepository.d.ts +0 -1
- package/types/adapter/repositories/NodeTmuxSessionRepository.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [1.144.5](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.144.4...v1.144.5) (2026-08-05)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **tmux:** stop leaving blank lines in a session composer when sending keys ([#1384](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1384)) ([0bfa16e](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/0bfa16efa2ab4c9c52c21c01dd29549a5551d802)), closes [#1383](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1383)
|
|
7
|
+
|
|
1
8
|
## [1.144.4](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.144.3...v1.144.4) (2026-08-04)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -39,8 +39,8 @@ const path = __importStar(require("path"));
|
|
|
39
39
|
const clSessionScopeUnitName_1 = require("./clSessionScopeUnitName");
|
|
40
40
|
const clSessionScopeUnitNameFromCgroupContent_1 = require("./clSessionScopeUnitNameFromCgroupContent");
|
|
41
41
|
const DEFAULT_SEND_KEYS_SUBMIT_DELAY_MS = 1000;
|
|
42
|
-
const
|
|
43
|
-
const
|
|
42
|
+
const BRACKETED_PASTE_START = '\x1b[200~';
|
|
43
|
+
const BRACKETED_PASTE_END = '\x1b[201~';
|
|
44
44
|
const shellSingleQuote = (value) => `'${value.replace(/'/g, `'\\''`)}'`;
|
|
45
45
|
class NodeTmuxSessionRepository {
|
|
46
46
|
constructor(localCommandRunner, procDirectory = '/proc', submitDelayMilliseconds = DEFAULT_SEND_KEYS_SUBMIT_DELAY_MS) {
|
|
@@ -136,17 +136,13 @@ class NodeTmuxSessionRepository {
|
|
|
136
136
|
'-t',
|
|
137
137
|
sessionName,
|
|
138
138
|
'-l',
|
|
139
|
-
literalText
|
|
139
|
+
`${BRACKETED_PASTE_START}${literalText}${BRACKETED_PASTE_END}`,
|
|
140
140
|
]);
|
|
141
141
|
if (literalResult.exitCode !== 0) {
|
|
142
142
|
throw new Error(`Failed to send keys to tmux session "${sessionName}": exit code ${literalResult.exitCode}${literalResult.stderr ? `: ${literalResult.stderr}` : ''}`);
|
|
143
143
|
}
|
|
144
144
|
await this.delaySubmit();
|
|
145
145
|
await this.sendEnter(sessionName);
|
|
146
|
-
if (await this.messageStillInComposer(sessionName, literalText)) {
|
|
147
|
-
await this.delaySubmit();
|
|
148
|
-
await this.sendEnter(sessionName);
|
|
149
|
-
}
|
|
150
146
|
};
|
|
151
147
|
this.launchBareNameLeaderSession = async (name) => {
|
|
152
148
|
const sessionName = name.replace(/[.:]/g, '_');
|
|
@@ -167,24 +163,6 @@ class NodeTmuxSessionRepository {
|
|
|
167
163
|
throw new Error(`Failed to send Enter to tmux session "${sessionName}": exit code ${enterResult.exitCode}${enterResult.stderr ? `: ${enterResult.stderr}` : ''}`);
|
|
168
164
|
}
|
|
169
165
|
};
|
|
170
|
-
this.messageStillInComposer = async (sessionName, literalText) => {
|
|
171
|
-
const probe = literalText
|
|
172
|
-
.trim()
|
|
173
|
-
.split('\n', 1)[0]
|
|
174
|
-
.slice(0, SEND_KEYS_COMPOSER_PROBE_LENGTH);
|
|
175
|
-
if (probe.length === 0) {
|
|
176
|
-
return false;
|
|
177
|
-
}
|
|
178
|
-
const { stdout, exitCode } = await this.localCommandRunner.runCommand('tmux', ['capture-pane', '-p', '-t', sessionName]);
|
|
179
|
-
if (exitCode !== 0) {
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
const tail = stdout
|
|
183
|
-
.split('\n')
|
|
184
|
-
.slice(-SEND_KEYS_COMPOSER_TAIL_LINES)
|
|
185
|
-
.join('\n');
|
|
186
|
-
return tail.includes(probe);
|
|
187
|
-
};
|
|
188
166
|
this.delaySubmit = async () => {
|
|
189
167
|
if (this.submitDelayMilliseconds <= 0) {
|
|
190
168
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeTmuxSessionRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/NodeTmuxSessionRepository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAI7B,qEAAkE;AAClE,uGAAoG;AAEpG,MAAM,iCAAiC,GAAG,IAAI,CAAC;AAC/C,MAAM
|
|
1
|
+
{"version":3,"file":"NodeTmuxSessionRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/NodeTmuxSessionRepository.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -296,16 +296,13 @@ describe('NodeTmuxSessionRepository', () => {
|
|
|
296
296
|
});
|
|
297
297
|
|
|
298
298
|
describe('sendKeys', () => {
|
|
299
|
-
it('
|
|
299
|
+
it('wraps the message in bracketed paste markers and submits it with exactly one Enter', async () => {
|
|
300
300
|
const runner = createMockRunner();
|
|
301
|
-
runner.runCommand
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
stderr: '',
|
|
307
|
-
exitCode: 0,
|
|
308
|
-
});
|
|
301
|
+
runner.runCommand.mockResolvedValue({
|
|
302
|
+
stdout: '',
|
|
303
|
+
stderr: '',
|
|
304
|
+
exitCode: 0,
|
|
305
|
+
});
|
|
309
306
|
const repository = new NodeTmuxSessionRepository(runner, '/proc', 0);
|
|
310
307
|
|
|
311
308
|
await repository.sendKeys('session-a', 'checkpoint now');
|
|
@@ -315,7 +312,7 @@ describe('NodeTmuxSessionRepository', () => {
|
|
|
315
312
|
'-t',
|
|
316
313
|
'session-a',
|
|
317
314
|
'-l',
|
|
318
|
-
'checkpoint now',
|
|
315
|
+
'\x1b[200~checkpoint now\x1b[201~',
|
|
319
316
|
]);
|
|
320
317
|
expect(runner.runCommand.mock.calls[1][1]).toEqual([
|
|
321
318
|
'send-keys',
|
|
@@ -323,37 +320,25 @@ describe('NodeTmuxSessionRepository', () => {
|
|
|
323
320
|
'session-a',
|
|
324
321
|
'Enter',
|
|
325
322
|
]);
|
|
326
|
-
expect(runner.runCommand.mock.calls
|
|
327
|
-
'capture-pane',
|
|
328
|
-
'-p',
|
|
329
|
-
'-t',
|
|
330
|
-
'session-a',
|
|
331
|
-
]);
|
|
332
|
-
expect(runner.runCommand.mock.calls).toHaveLength(3);
|
|
323
|
+
expect(runner.runCommand.mock.calls).toHaveLength(2);
|
|
333
324
|
});
|
|
334
325
|
|
|
335
|
-
it('
|
|
326
|
+
it('never inspects the composer and never sends a second Enter', async () => {
|
|
336
327
|
const runner = createMockRunner();
|
|
337
|
-
runner.runCommand
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
stderr: '',
|
|
343
|
-
exitCode: 0,
|
|
344
|
-
})
|
|
345
|
-
.mockResolvedValueOnce({ stdout: '', stderr: '', exitCode: 0 });
|
|
328
|
+
runner.runCommand.mockResolvedValue({
|
|
329
|
+
stdout: '> checkpoint now',
|
|
330
|
+
stderr: '',
|
|
331
|
+
exitCode: 0,
|
|
332
|
+
});
|
|
346
333
|
const repository = new NodeTmuxSessionRepository(runner, '/proc', 0);
|
|
347
334
|
|
|
348
335
|
await repository.sendKeys('session-a', 'checkpoint now');
|
|
349
336
|
|
|
350
|
-
|
|
351
|
-
expect(
|
|
352
|
-
'
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
'Enter',
|
|
356
|
-
]);
|
|
337
|
+
const commands = runner.runCommand.mock.calls.map((call) => call[1]);
|
|
338
|
+
expect(
|
|
339
|
+
commands.filter((args) => args.includes('capture-pane')),
|
|
340
|
+
).toHaveLength(0);
|
|
341
|
+
expect(commands.filter((args) => args.includes('Enter'))).toHaveLength(1);
|
|
357
342
|
});
|
|
358
343
|
|
|
359
344
|
it('throws when sending the literal text fails', async () => {
|
|
@@ -7,8 +7,8 @@ import { clSessionScopeUnitName } from './clSessionScopeUnitName';
|
|
|
7
7
|
import { clSessionScopeUnitNameFromCgroupContent } from './clSessionScopeUnitNameFromCgroupContent';
|
|
8
8
|
|
|
9
9
|
const DEFAULT_SEND_KEYS_SUBMIT_DELAY_MS = 1000;
|
|
10
|
-
const
|
|
11
|
-
const
|
|
10
|
+
const BRACKETED_PASTE_START = '\x1b[200~';
|
|
11
|
+
const BRACKETED_PASTE_END = '\x1b[201~';
|
|
12
12
|
|
|
13
13
|
const shellSingleQuote = (value: string): string =>
|
|
14
14
|
`'${value.replace(/'/g, `'\\''`)}'`;
|
|
@@ -152,7 +152,7 @@ export class NodeTmuxSessionRepository implements TmuxSessionRepository {
|
|
|
152
152
|
'-t',
|
|
153
153
|
sessionName,
|
|
154
154
|
'-l',
|
|
155
|
-
literalText
|
|
155
|
+
`${BRACKETED_PASTE_START}${literalText}${BRACKETED_PASTE_END}`,
|
|
156
156
|
]);
|
|
157
157
|
if (literalResult.exitCode !== 0) {
|
|
158
158
|
throw new Error(
|
|
@@ -163,10 +163,6 @@ export class NodeTmuxSessionRepository implements TmuxSessionRepository {
|
|
|
163
163
|
}
|
|
164
164
|
await this.delaySubmit();
|
|
165
165
|
await this.sendEnter(sessionName);
|
|
166
|
-
if (await this.messageStillInComposer(sessionName, literalText)) {
|
|
167
|
-
await this.delaySubmit();
|
|
168
|
-
await this.sendEnter(sessionName);
|
|
169
|
-
}
|
|
170
166
|
};
|
|
171
167
|
|
|
172
168
|
launchBareNameLeaderSession = async (name: string): Promise<void> => {
|
|
@@ -201,31 +197,6 @@ export class NodeTmuxSessionRepository implements TmuxSessionRepository {
|
|
|
201
197
|
}
|
|
202
198
|
};
|
|
203
199
|
|
|
204
|
-
private messageStillInComposer = async (
|
|
205
|
-
sessionName: string,
|
|
206
|
-
literalText: string,
|
|
207
|
-
): Promise<boolean> => {
|
|
208
|
-
const probe = literalText
|
|
209
|
-
.trim()
|
|
210
|
-
.split('\n', 1)[0]
|
|
211
|
-
.slice(0, SEND_KEYS_COMPOSER_PROBE_LENGTH);
|
|
212
|
-
if (probe.length === 0) {
|
|
213
|
-
return false;
|
|
214
|
-
}
|
|
215
|
-
const { stdout, exitCode } = await this.localCommandRunner.runCommand(
|
|
216
|
-
'tmux',
|
|
217
|
-
['capture-pane', '-p', '-t', sessionName],
|
|
218
|
-
);
|
|
219
|
-
if (exitCode !== 0) {
|
|
220
|
-
return false;
|
|
221
|
-
}
|
|
222
|
-
const tail = stdout
|
|
223
|
-
.split('\n')
|
|
224
|
-
.slice(-SEND_KEYS_COMPOSER_TAIL_LINES)
|
|
225
|
-
.join('\n');
|
|
226
|
-
return tail.includes(probe);
|
|
227
|
-
};
|
|
228
|
-
|
|
229
200
|
private delaySubmit = async (): Promise<void> => {
|
|
230
201
|
if (this.submitDelayMilliseconds <= 0) {
|
|
231
202
|
return;
|
|
@@ -16,7 +16,6 @@ export declare class NodeTmuxSessionRepository implements TmuxSessionRepository
|
|
|
16
16
|
sendKeys: (sessionName: string, literalText: string) => Promise<void>;
|
|
17
17
|
launchBareNameLeaderSession: (name: string) => Promise<void>;
|
|
18
18
|
private sendEnter;
|
|
19
|
-
private messageStillInComposer;
|
|
20
19
|
private delaySubmit;
|
|
21
20
|
}
|
|
22
21
|
//# sourceMappingURL=NodeTmuxSessionRepository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NodeTmuxSessionRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/NodeTmuxSessionRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,gEAAgE,CAAC;AACvG,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAWxE,qBAAa,yBAA0B,YAAW,qBAAqB;IAEnE,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,uBAAuB;gBAFvB,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,GAAE,MAAgB,EAC/B,uBAAuB,GAAE,MAA0C;IAGtF,oBAAoB,QAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAYhD;IAEF,4BAA4B,QAAa,OAAO,CAAC,eAAe,EAAE,CAAC,CAkBjE;IAEF,kCAAkC,QAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAY9D;IAEF,qBAAqB,GACnB,aAAa,MAAM,EACnB,iBAAiB,MAAM,EACvB,UAAU,MAAM,KACf,OAAO,CAAC,IAAI,CAAC,CAcd;IAEF,WAAW,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CActD;IAEF,cAAc,QAAa,OAAO,CAAC,IAAI,CAAC,CAatC;IAEF,OAAO,CAAC,aAAa,CAsBnB;IAEF,QAAQ,GACN,aAAa,MAAM,EACnB,aAAa,MAAM,KAClB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"NodeTmuxSessionRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/NodeTmuxSessionRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,gEAAgE,CAAC;AACvG,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAWxE,qBAAa,yBAA0B,YAAW,qBAAqB;IAEnE,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,uBAAuB;gBAFvB,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,GAAE,MAAgB,EAC/B,uBAAuB,GAAE,MAA0C;IAGtF,oBAAoB,QAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAYhD;IAEF,4BAA4B,QAAa,OAAO,CAAC,eAAe,EAAE,CAAC,CAkBjE;IAEF,kCAAkC,QAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAY9D;IAEF,qBAAqB,GACnB,aAAa,MAAM,EACnB,iBAAiB,MAAM,EACvB,UAAU,MAAM,KACf,OAAO,CAAC,IAAI,CAAC,CAcd;IAEF,WAAW,GAAU,aAAa,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CActD;IAEF,cAAc,QAAa,OAAO,CAAC,IAAI,CAAC,CAatC;IAEF,OAAO,CAAC,aAAa,CAsBnB;IAEF,QAAQ,GACN,aAAa,MAAM,EACnB,aAAa,MAAM,KAClB,OAAO,CAAC,IAAI,CAAC,CAiBd;IAEF,2BAA2B,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC,CAc/D;IAEF,OAAO,CAAC,SAAS,CAcf;IAEF,OAAO,CAAC,WAAW,CAOjB;CACH"}
|