改版通知

巨人肩膀网站已全新改版。若您仍依赖旧站功能或数据,欢迎联系我们,我们会协助处理。联系我们

「Runstand」:给人和 AI Agent 用的轻量代码工程运行台

忆往昔 创建于 2026年10月10日

用 Cursor、Claude Code 或 Codex 写代码之后,很多人打开 IntelliJ IDEA,并不是为了再改一行代码,而是为了把 Spring Boot 跑起来、看启动日志、换一个 Profile 再跑一次。为这几件事长期挂着一个完整 IDE,往往比实际要解决的问题更重。

Runstand 把这一层单独拿出来。它是 macOS、Windows 和 Linux 上的轻量工程运行台:不写代码,只负责启动、停止本地的 Java / Spring Boot 和 Node.js 项目,查看日志,并让 AI Agent 用同一套能力做同样的事。当前版本是 0.1.2。

打开之后是这样:左侧是已添加的项目和运行状态,上方选择启动、停止、重启、Profile 和启动配置,右侧是当前服务的日志。

Runstand 主界面:左侧项目列表,右侧是正在运行的 Spring Boot 日志

它解决的是哪一件事

AI 编程把「改代码」从 IDE 里搬走之后,每天还剩下的高频动作往往是这些:

  • 启动、停止、重启本地服务
  • 切换 Spring Profile、JVM 参数和环境变量
  • 看启动失败的日志,确认进程是不是真的停干净
  • 同时跑几个本地服务,并按顺序把一组拉起来

这些事情不需要代码索引、调试器或 Git。Runstand 的做法是:轻量优先,本地优先,复用你机器上已经装好的 JDK、Maven、Gradle 和 Node.js,只操作你明确添加进来的项目。

人和 Agent 用同一套引擎

桌面窗口和命令行共用同一套运行引擎。桌面应用打开后,CLI 通过本机回环接口连上它,查到的状态和日志与窗口一致。

人在界面里添加项目、选启动配置、看日志。Agent 则可以直接调用命令,例如:

bash 复制代码
runstand project list --json
runstand start --project demo --profile local
runstand logs --project demo --grep ERROR
runstand stop --project demo

在 Agent 的 MCP 配置里加上 runstand mcp 之后,还可以用工具完成同样的事:列出项目、查状态、启动、停止、重启、拉日志、搜日志,以及按分组操作。桌面没打开时,这些工具会返回「桌面服务未运行」,不会自己去拉起进程。工具也只覆盖已经添加的项目,不接受列表之外的目录。

这样分工之后,写代码仍然留在你正在用的 AI 编辑器里;跑起来、停下来、把错误日志交给 Agent,则由 Runstand 接管。

它怎么认识一个项目

添加一个含 pom.xml、Gradle 构建文件、package.json 或 JAR 的目录即可。同一目录里既有 Java 构建文件又有 package.json 时,按 Java 项目添加;Node 服务添加它所在的子目录。

Java 项目如果有 IntelliJ 共享运行配置(.idea/runConfigurations 或 .run),会按这些配置生成启动项,并把 IDEA 当前选中的那条设为默认。没有共享配置时,再读本机的 .idea/workspace.xml。都没有可用配置时,默认配置名为「本地开发」。Maven 项目还会带入 IDEA 里的 Maven 主目录、用户设置文件和本地仓库。

Spring Profile 优先读 application.yml 里的 spring.profiles.active。项目里有多份 Profile(例如同时存在 application-local.yml 和 application-dev.yml)时,工具栏会出现 Profile 选择。切换后写入当前启动配置,之后用这套配置启动或重启都会使用它。选「不指定」则继续沿用 application.yml。

启动方式按项目自己的工具来:

  • Maven:优先项目里的 mvnw / mvnw.cmd,否则 mvn spring-boot:run
  • Gradle:优先 gradlew / gradlew.bat,否则 gradle bootRun --no-daemon
  • JAR:java -jar
  • Node:按 package.json 的 packageManager 和锁文件选择 npm、pnpm、yarn 或 bun,执行 dev、start、serve、preview 等已有脚本。有 dev 时,它是默认的「本地开发」

Node 路径留空时,会按项目的 .nvmrc 或 .node-version,在 nvm、fnm 里选对应版本。这个版本没有安装时,再退回到 PATH 或默认版本,并在启动日志里写明实际用的是哪一个。从访达或开始菜单打开时读不到 shell 里追加的 PATH,所以它也会直接查看 Volta、asdf、mise、Homebrew 等常见安装位置。

JVM 参数、程序参数、构建参数和环境变量分开保存,启动时再组装,不用 shell 拼接。秘密环境变量放进系统凭据库:macOS 钥匙串、Windows 凭据管理器、Linux 系统密钥环。数据库和日志里只保留空值。

日志、分组和就绪判断

启动后,日志在窗口下方。多个项目同时跑时,可以勾选「合并日志」,按时间把各项目输出放在同一视图里。清空和暂停只影响显示。界面里是最近一段;同一次运行的完整输出写在数据目录的 logs 下,单个文件超过 8MB 后,更早的内容转到旁边的 .1 文件。

Spring Boot 默认看启动日志里的 Started ... seconds,以及 APPLICATION FAILED TO START。Node 和其他项目默认在进程成功拉起后标为运行中。也可以改成访问本机健康检查地址。进程号如果对不上启动时记下的系统启动时间,状态会变成「状态未知」。这时可以清除记录;Runstand 不会按端口或模糊匹配去结束进程。

停止会结束这一次启动拉起的进程树。macOS 和 Linux 先发送终止信号,约 5 秒后仍未退出再强制结束。退出应用时,会停掉由 Runstand 拉起、且仍应停止的进程;如果退出发生在启动过程中,这次启动会被取消,不会留下新的进程。

多个服务可以放进分组。分组启动按成员顺序拉起尚未运行的项目,已经在跑的会跳过;某个成员失败不会停掉其他成员。开机自启也可以绑到某套启动配置上。

Node 项目还可以在不打断开发服务的情况下执行一次性脚本,例如打包、检查和测试。工具栏的「执行」,或 runstand exec --project 名称 --script build,跑的仍是 package.json 里已有的脚本。执行不改变项目的运行状态,也不参与分组启动和开机自启。对打包类命令,还可以在执行前填写版本,写入 package.json,并在存在时同步 Tauri 配置和 Cargo.toml 里的版本号。

它刻意不做什么

Runstand 不是 IDE,也不是另一个终端。本版不做代码编辑、调试、Git、数据库、Docker、账号、内置 AI、任意 shell 命令,也不做无界面守护进程。

它也不内置 JDK、Maven、Gradle 或 Node.js。这些工具仍然用你项目自己的环境。Windows 依赖系统自带的 WebView2(Windows 11 已包含);Linux 桌面需要 WebKitGTK 4.1,并用 Secret Service 保存秘密值。

数据留在本机:

  • macOS:~/Library/Application Support/app.runstand.desktop/
  • Linux:$XDG_DATA_HOME/app.runstand.desktop/,未设置时是 ~/.local/share/app.runstand.desktop/
  • Windows:%APPDATA%\app.runstand.desktop\

怎么开始

打开 Runstand,添加项目目录,选一条启动配置,点启动,在下方看日志。状态变成运行中并出现进程号之后,再次启动会被拒绝。停止后,这次启动拉起的进程都应该退出。

如果你希望 Agent 也能操作它,先保持桌面应用打开,再把本机的 runstand 可执行文件配进 MCP:

json 复制代码
{
  "mcpServers": {
    "runstand": {
      "command": "runstand",
      "args": ["mcp"]
    }
  }
}

command 填本机 runstand 的路径。之后 Agent 就可以查项目是不是在跑、把服务拉起来、把最近的错误日志拿回去,而不用再打开一个 IDE。