vkit 0.1.4

Fast Rust dev CLI: manage git worktrees, Node ports, run scripts, install & sync VS Code / Cursor extensions.
# vkit

用 Rust + [ratatui](https://ratatui.rs) 重写的 `vkit` CLI 快速伴生工具(二进制与命令均为 `vkit`,源码仓库为 [`vkit-rs`](https://github.com/stekovinbranturry/vkit-rs))。目标:把「唤起 → 交互 → 退出」的秒级命令做到极致启动速度(Node + Ink 冷启动约 80–150ms,Rust 二进制约几 ms)。

独立于 [`vkit`](https://github.com/stekovinbranturry/vkit) 主仓的实验 / 学习项目,与其并存、互不干扰。

## 命令

| 命令 | 说明 | 平台 |
| --- | --- | --- |
| `vkit` | 无参数进入入口菜单(dashboard),选择要用的工具 | 跨平台 |
| `vkit port` | 列出正在监听的 Node 端口及进程,多选一键关闭 | 仅 macOS |
| `vkit run` | 扫描当前目录及子包的 `package.json`,过滤 + 多选批量运行 scripts(须在 git 仓库内) | 跨平台 |
| `vkit worktree`(别名 `wt`) | TUI 管理 worktree;另有 `wt switch` / `wt shell-init` | 跨平台 |
| `vkit vsix` | 从 Marketplace 下载 VSIX 并安装到 Cursor / VS Code | 跨平台 |
| `vkit sync` | 把 VS Code 已装扩展批量同步到 Cursor | 跨平台 |
| `vkit preview` | 一屏预览所有主题色与组件样式(校色用) | 跨平台 |
| `vkit update` | 从 GitHub Releases 下载最新二进制并原地替换 | 跨平台 |

dashboard 键位:`↑/↓` 选择 · `Enter` 进入 · `1-9` 直达 · `?` 帮助(列出子命令)· `q` 退出。

所有选择列表均支持**环形移动**:在第一项按 `↑` 跳到最后一项,在最后一项按 `↓` 回到第一项。

配色为 Everforest 风格低饱和主题:绿色作主强调(标题 / logo / 按键 / 聚焦边框),黄色表示勾选 / 选中,橙色表示光标行,绿色另用于成功状态(如状态 ✓);边框统一走弱化色。启动时按终端背景**自动切换深/浅色**(探测失败默认深色)。所有选择列表的未选中标题、描述、勾选样式与光标高亮均统一。

## 安装

```sh
# 从 crates.io 安装(需要 Rust 工具链)
cargo install vkit
```

或从 [Releases](https://github.com/stekovinbranturry/vkit-rs/releases) 下载对应平台的预编译二进制(macOS / Linux),解压后把 `vkit` 放进 PATH。

### 从源码安装

需要 [Rust 工具链](https://rustup.rs)。

```sh
# 从源码安装到 ~/.cargo/bin
cargo install --path .

# 或直接构建后自行软链
cargo build --release
ln -sf "$(pwd)/target/release/vkit" /usr/local/bin/vkit
```

## 开发

```sh
cargo run -- port   # 运行
cargo test          # 单测(纯逻辑:解析 / 过滤 / 截断 / 选择状态)
cargo clippy        # lint
```

## `port` 键位

- `↑ / ↓`:移动光标
- `/`:进入搜索模式(端口号 / 进程名 / 完整命令;`Enter` 回列表,`Esc` 清空)
- `Space`:勾选 / 取消当前行
- `A`:全选 / 全不选(当前搜索范围)
- `Enter`:关闭选中项(未勾选时关闭当前行)——弹出二次确认(`Y` 确认 / `n` 取消 / `Esc` 返回)
- `R`:重新扫描刷新
- `q` / `Esc`:退出;`Ctrl+C` 退出

表格的 **DIR 列**显示每行服务的**启动目录**(进程 cwd,即启动该服务时所在的目录,home 前缀缩写为 `~`),方便区分是哪个项目起的服务。搜索也会匹配该目录。

关闭进程:确认后在后台线程执行并显示 loading(spinner),先 `SIGTERM` 优雅退出,3 秒未退再 `SIGKILL` 强制,完成后就地刷新。

## `run` 键位

双栏主从布局:左栏包列表,右栏当前包的 scripts。

**包栏(左)**

- `↑ / ↓`:切换包
- `→` / `l` / `Tab`:进入右侧 scripts
- `1-9`:跳到第 N 个包并进入其 scripts

**Scripts 栏(右)**

- `↑ / ↓`:移动光标(光标行显示 `→ 命令`)
- `←` / `h`:回到包栏
- `Space`:勾选 / 取消当前 script
- `A`:全选 / 全不选本包 scripts

**通用**

- `Enter`:运行——有勾选则跨包批量顺序运行,否则运行光标所在 script
- `/`:进入搜索模式(包名 / script / 命令;`Enter` 回列表,`Esc` 清空)
- `R`:重新扫描刷新
- `q` / `Esc`:退出;`Ctrl+C` 退出

发现范围:须位于 git 仓库内(自当前目录向上找 `.git`),再从当前目录递归扫描所有 `package.json`(尊重 `.gitignore`,跳过 `node_modules`/`dist`/`target` 等),当前目录所属包排在最前并标 `*`,包名后括号内为已勾选数。嵌套子包显示为 `父包 -> 子包`。包管理器按 `packageManager` 字段 → lock 文件逐级向上探测(默认 `npm`)。运行时会临时挂起 TUI,把终端完整交给子进程(继承 stdio,适配 `dev` 这类长驻进程),结束后回到界面并显示退出码。

## `worktree` / `wt`

管理当前仓库的 Main Worktree 与约定 Placement 下的附加 Worktree(In-repo:`.worktrees/`;Global:默认 `~/worktrees/<repo>/`,可在 `~/.config/vkit/config.toml` 的 `[worktree] global_root` 覆盖)。其它路径上的 worktree 不展示。

### 快速切换(学自 Worktrunk)

```sh
# 一次性启用 shell 集成(定义 vkit-wt / 别名 vwt,不抢占 worktrunk 的 wt)
eval "$(vkit wt shell-init zsh)"   # 可写入 ~/.zshrc

vwt switch feat            # 进入该分支的 worktree(自动 cd)
vwt switch -               # 上一个 worktree
vwt switch ^               # Main
vwt switch -c feat/x       # 新建分支 + worktree 并进入
vwt switch mr:126          # 按 GitLab MR 进入(必要时创建 worktree)
vwt switch feat -x cursor  # 进入后打开 cursor
```

无 shell 集成时,`vkit wt switch` 仍会打印路径,但不会改父 shell 的 cwd。

### TUI

`vkit wt` / `vkit worktree` 进入表格界面。若已 `eval` shell-init,在 TUI 里按 `Enter` 会写 CD 指令并退出,由 `vwt` 包装层自动 cd。

列表为表格:BRANCH / PATH / WHERE / STATUS(相对 Main:绿 `↑` 领先、红 `↓` 落后、`=` 齐平、黄 `*` 脏)/ MR(`!N` 打开 · `!N✓` 已合并 · `!N×` 已关闭)。

**列表键位**

- `↑ / ↓`:移动
- `Enter`:进入(有 shell 集成则 cd;否则开子 shell)
- `o`:用 `cursor` 打开
- `m`:浏览器打开 MR
- `n`:新建
- `d`:Remove(保留分支)
- `p`:Purge(连分支删)
- `r`:刷新
- `q` / `Esc`:退出

## `vsix` 键位

两步流程:输入扩展 → 下载 → 选编辑器安装。

- **输入**:键入扩展 id(`publisher.name`)或 Marketplace 链接;`Enter` 查询最新版本并下载到 `~/Downloads`;`Esc` 退出。
- **选编辑器**(下载完成后自动进入,若检测到 `cursor` / `code`):`↑/↓` 移动 · `Space` 选择 · `A` 全选 · `Enter` 安装 · `Esc` 跳过。

下载走 Marketplace 的 `extensionquery`(查最新版本)+ `vspackage`(带 gzip 自动解压),安装用 `<editor> --install-extension`。`Ctrl+C` 随时退出。

## `sync` 键位

把 VS Code 已装扩展批量同步到 Cursor(方向固定 `VS Code → Cursor`)。

- 进入后自动读取两个编辑器的 `--list-extensions`,算出 Cursor 尚缺的插件。
- **选择**:左右双栏布局——左栏「待安装」展示 Cursor 尚缺、可多选的插件(checkbox + 光标高亮,焦点常驻),右栏「已安装」只读展示已在 Cursor 里的插件(弱化样式、前缀 ✓)。键位:`↑/↓` 移动 · `Space` 选择 · `A` 全选 · `Enter` 下一步 · `Esc` 退出(默认全选缺失项)。
- **确认**:`Enter` 开始 · `Esc` 返回修改。
- **同步中**:逐个下载 vsix 到临时目录并安装,实时显示进度与每项状态;完成后展示成功/失败汇总,`Enter`/`q` 返回。

前置:需要 `code` 与 `cursor` 两个命令都在 PATH(在各自编辑器里执行「Shell Command: Install 'xxx' command in PATH」)。