tmuxclihook 0.5.1 → 0.5.2
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 +3 -3
- package/bin/cli.js +2 -11
- package/package.json +1 -1
- package/src/help.js +31 -0
- package/src/update.js +39 -12
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ tmuxclihook
|
|
|
12
12
|
# 按当前安装方式(npm/volta)检查并更新到最新版
|
|
13
13
|
tmuxclihook update
|
|
14
14
|
|
|
15
|
-
#
|
|
15
|
+
# 删除不生效的另一份安装;已是最新时也会执行清理(默认交互确认)
|
|
16
16
|
tmuxclihook update --prune
|
|
17
17
|
|
|
18
18
|
# hooks 健康明细(非交互):每个 CLI 的完整性、判定真源、注册路径、漂移警告
|
|
@@ -37,11 +37,11 @@ npm start
|
|
|
37
37
|
|
|
38
38
|
hooks 安装、tmux 集成写入的路径由「source」决定:环境变量 `TMUXCLIHOOK_SOURCE` > 持久化配置 `~/.config/tmuxclihook/config.json`(TUI「source 管理」菜单写入)> 包内自带 scripts/(生产默认)> 仓库根 scripts/(`cd installer && npm start` 时的开发回落)。见下方「source 管理」一节。
|
|
39
39
|
|
|
40
|
-
`tmuxclihook update` 会显示当前版本,通过 `npm view tmuxclihook version`
|
|
40
|
+
`tmuxclihook update` 会显示当前版本,通过 `npm view tmuxclihook version` 查询最新版;版本相同则不做任何安装(若显式传入 `--prune`,仍会执行一次非生效副本检测与清理)。需要升级时,它按 PATH 上第一个可执行的 `tmuxclihook` 判断当前生效的安装方式:入口位于 `$VOLTA_HOME/bin/`(默认 `~/.volta/bin/`)或 volta 的 packages 镜像内时,只执行 `volta install tmuxclihook@latest`;其余入口(npm 全局、nvm/fnm 等 node 工具链目录)只执行 `npm install -g tmuxclihook@latest`。不会同时写入两套安装。网络查询或安装失败时命令以非零状态退出。
|
|
41
41
|
|
|
42
42
|
安装完成后会按 PATH 自检实际生效版本。若生效入口不是 volta、自检仍未反映新版,且本机可执行 volta,则补执行一次 `volta install tmuxclihook@latest` 作为兜底并复检;仍不一致时打印警告(不影响退出码)。
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
升级成功,或版本已是最新且显式传入 `--prune` 时,update 会检查另一套安装(volta packages 镜像或当前 npm 全局 prefix)是否还留有副本。发现副本时:TTY 下询问是否删除(默认不删);非交互环境只打印警告;`--prune` 跳过询问直接删除。删除前会校验该副本未被任何 hooks 与 `~/.tmux.conf` 引用——任一检查无法确认就保留并提示先重装 hooks。**生效入口永远不删**,清理失败不影响升级结果。也可以手动收敛:卸载不再使用的那份(`npm uninstall -g tmuxclihook` 或 `volta uninstall tmuxclihook`),再从生效入口重新安装 hooks。
|
|
45
45
|
|
|
46
46
|
## 功能
|
|
47
47
|
|
package/bin/cli.js
CHANGED
|
@@ -31,6 +31,7 @@ import { setSource, clearSource, getPersistedSource, originLabel } from '../src/
|
|
|
31
31
|
import { enableEscapeCancel, setSpinnerActive } from '../src/esc.js';
|
|
32
32
|
import { note, padDisplay } from '../src/tui.js';
|
|
33
33
|
import { updatePackage, CURRENT_VERSION } from '../src/update.js';
|
|
34
|
+
import { HELP_TEXT } from '../src/help.js';
|
|
34
35
|
|
|
35
36
|
const OK = '✓';
|
|
36
37
|
const NO = '✗';
|
|
@@ -505,17 +506,7 @@ if (arg === 'update') {
|
|
|
505
506
|
} else if (arg === '--version' || arg === '-v' || arg === 'version') {
|
|
506
507
|
console.log(`tmuxclihook v${CURRENT_VERSION}`);
|
|
507
508
|
} else if (arg === '--help' || arg === '-h' || arg === 'help') {
|
|
508
|
-
console.log(
|
|
509
|
-
'tmuxclihook — tmux-ai-status 交互式安装器\n' +
|
|
510
|
-
'\n' +
|
|
511
|
-
'用法:\n' +
|
|
512
|
-
' tmuxclihook 打开交互式 TUI 安装器\n' +
|
|
513
|
-
' tmuxclihook check hooks 健康明细(可跟 claude|codex|opencode;exit 1 = 有缺失或漂移)\n' +
|
|
514
|
-
' tmuxclihook update 按当前安装方式(npm/volta)检查并更新到最新版本\n' +
|
|
515
|
-
' tmuxclihook update --prune 升级后直接删除不生效的另一份安装(默认交互确认)\n' +
|
|
516
|
-
' tmuxclihook version 显示版本(--version / -v 等价)\n' +
|
|
517
|
-
' tmuxclihook help 显示本帮助(--help / -h 等价)',
|
|
518
|
-
);
|
|
509
|
+
console.log(HELP_TEXT);
|
|
519
510
|
} else {
|
|
520
511
|
main().catch((err) => {
|
|
521
512
|
console.error(err);
|
package/package.json
CHANGED
package/src/help.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// `tmuxclihook help` 的静态文案。独立成模块是为了让测试可以直接 import,
|
|
2
|
+
// 而不必加载 bin/cli.js(入口文件顶层会执行参数分支,未知参数会启动 TUI)。
|
|
3
|
+
const COMMAND_WIDTH = 26;
|
|
4
|
+
|
|
5
|
+
function line(command, description) {
|
|
6
|
+
return ` ${command.padEnd(COMMAND_WIDTH)} ${description}`;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const HELP_TEXT = [
|
|
10
|
+
'tmuxclihook — tmux-ai-status 交互式安装器',
|
|
11
|
+
'',
|
|
12
|
+
'命令行:',
|
|
13
|
+
line('tmuxclihook', '打开交互式 TUI 安装器'),
|
|
14
|
+
line('tmuxclihook check', 'hooks 健康明细(可跟 claude|codex|opencode;exit 1 = 有缺失或漂移)'),
|
|
15
|
+
line('tmuxclihook update', '按当前安装方式(npm/volta)检查并更新到最新版本'),
|
|
16
|
+
line('tmuxclihook update --prune', '更新后删除不生效的另一份安装;已是最新时也会执行清理'),
|
|
17
|
+
line('tmuxclihook version', '显示版本(--version / -v 等价)'),
|
|
18
|
+
line('tmuxclihook help', '显示本帮助(--help / -h 等价)'),
|
|
19
|
+
'',
|
|
20
|
+
'tmux 快捷键(插件加载后生效):',
|
|
21
|
+
line('prefix + I', '打开交互式 TUI 安装器'),
|
|
22
|
+
line('prefix + C-h', '安装 Claude Code hooks'),
|
|
23
|
+
line('prefix + C-u', '卸载 Claude Code hooks'),
|
|
24
|
+
line('prefix + M-h', '安装 Codex hooks'),
|
|
25
|
+
line('prefix + M-u', '卸载 Codex hooks'),
|
|
26
|
+
line('prefix + C-p', '安装 opencode plugin'),
|
|
27
|
+
line('prefix + M-p', '卸载 opencode plugin'),
|
|
28
|
+
line('prefix + r', '重载配置(含本插件初始化)'),
|
|
29
|
+
'',
|
|
30
|
+
'prefix 默认是 Ctrl+b;若你在 tmux 配置中改过 prefix,以你的配置为准。',
|
|
31
|
+
].join('\n');
|
package/src/update.js
CHANGED
|
@@ -290,6 +290,26 @@ function warnNotEffective(log, result) {
|
|
|
290
290
|
log.error(`If you use volta, run: volta install ${PACKAGE_NAME}@latest`);
|
|
291
291
|
}
|
|
292
292
|
|
|
293
|
+
// 清理非生效副本,并在实际删除过副本后复检生效入口。升级成功路径与
|
|
294
|
+
// 「已是最新 + --prune」路径共用,避免两处逻辑漂移。清理失败只记录日志,
|
|
295
|
+
// 不影响 update 的返回值。
|
|
296
|
+
async function reconcileStaleCopies({
|
|
297
|
+
source, env, run, log, prune, isTTY, confirm,
|
|
298
|
+
checkHooks, checkTmuxConf, detectStale, verify, expectedVersion,
|
|
299
|
+
}) {
|
|
300
|
+
try {
|
|
301
|
+
const removed = await cleanupStale({
|
|
302
|
+
source, env, run, log, prune, isTTY, confirm, checkHooks, checkTmuxConf, detectStale,
|
|
303
|
+
});
|
|
304
|
+
if (removed && verify) {
|
|
305
|
+
const after = await verify(expectedVersion, env);
|
|
306
|
+
if (after.status !== 'ok') warnNotEffective(log, after);
|
|
307
|
+
}
|
|
308
|
+
} catch (err) {
|
|
309
|
+
log.error(`Cleanup skipped: ${err}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
293
313
|
// volta 安装路径:当 PATH 上的生效入口来自 volta(shim 或 packages 镜像)
|
|
294
314
|
// 时,升级只能走 `volta install`——`npm install -g` 只写 node 工具链目录,
|
|
295
315
|
// 不会更新 volta 的 packages 镜像。此函数现在是 volta 分支的唯一升级动作,
|
|
@@ -346,6 +366,20 @@ export async function updatePackage(options = {}) {
|
|
|
346
366
|
|
|
347
367
|
if (currentVersion === latestVersion) {
|
|
348
368
|
log.log('Already up to date.');
|
|
369
|
+
|
|
370
|
+
// 版本已最新:绝不安装;仅显式 --prune 时收敛非生效副本。
|
|
371
|
+
// 未传 --prune 时保持历史行为:不探测来源、不清理、直接返回。
|
|
372
|
+
if (cleanup && prune) {
|
|
373
|
+
const effectiveSource = typeof detectSource === 'function'
|
|
374
|
+
? detectSource(env)
|
|
375
|
+
: 'unknown';
|
|
376
|
+
await reconcileStaleCopies({
|
|
377
|
+
source: effectiveSource, env, run, log, prune, isTTY, confirm,
|
|
378
|
+
checkHooks, checkTmuxConf, detectStale, verify,
|
|
379
|
+
expectedVersion: latestVersion,
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
|
|
349
383
|
return true;
|
|
350
384
|
}
|
|
351
385
|
|
|
@@ -394,18 +428,11 @@ export async function updatePackage(options = {}) {
|
|
|
394
428
|
|
|
395
429
|
// 升级已确认成功后再收敛历史副本;清理失败不影响升级结果,也不改变退出码。
|
|
396
430
|
if (cleanup && result.status === 'ok') {
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
if (removed && verify) {
|
|
403
|
-
const after = await verify(latestVersion, env);
|
|
404
|
-
if (after.status !== 'ok') warnNotEffective(log, after);
|
|
405
|
-
}
|
|
406
|
-
} catch (err) {
|
|
407
|
-
log.error(`Cleanup skipped: ${err}`);
|
|
408
|
-
}
|
|
431
|
+
await reconcileStaleCopies({
|
|
432
|
+
source, env, run, log, prune, isTTY, confirm,
|
|
433
|
+
checkHooks, checkTmuxConf, detectStale, verify,
|
|
434
|
+
expectedVersion: latestVersion,
|
|
435
|
+
});
|
|
409
436
|
}
|
|
410
437
|
|
|
411
438
|
return true;
|