命令模块

src/commands/,入口 src/index.ts 统一注册,基于 commander。八个子命令全部是薄封装,业务能力来自管线与服务器模块;远程命令(add / del / list)共用的目标解析(--remote 与 --config 二选一,后者从本地服务配置读取管理端点与 token)与 token 认证流程(缓存 → 401 时交互询问并缓存)收敛在 shared.ts 的 resolveRemoteTarget / requestWithAuth。

包 bin 指向 bin/docdoc shell 启动器(POSIX sh),而非 dist/index.js 本体:启动器在 exec node 前剥离 NODE_CHANNEL_FD / NODE_CHANNEL_SERIALIZATION_MODE 并缺省导出 UV_USE_IO_URING=0(不覆盖外部显式设置)。这是 Node libuv io_uring 退出路径 SIGABRT 的根治防御——pm2 fork 模式管理的终端(如 opencode terminal)会向子 shell 泄漏 Node IPC 通道变量,node 在 JS 运行前即按它误开 IPC 通道,退出路径触发 libuv abort(工作已完成、仅退出码异常;libuv ≥1.50 无开关可用),因此 JS 层无法补救,只能由启动 shell 剥离环境变量;systemd 与普通 SSH 环境无此变量,剥离为无操作。install.sh 顶部的同名 unset 是安装时刻的双保险。

命令 职责
build 读取本地目录或 git 地址,执行构建管线,产物落 --output
preview 启动本地 node:http 服务器托管构建产物,监听源目录增量重建
add 注册站点:本地路径源本地构建后上传产物包;git 源提交给服务器克隆构建。站点名/域名命令行参数优先,缺省回退本地源 docdoc.json 声明的 name/domain;git 源必须显式 --name
del 删除站点:入参为站点名、域名(先经查询解析为站点名)或本地源目录(读其 docdoc.json 的 name/domain)
list 列表站点:请求 GET /api/v1/sites,对齐表格打印站点名、域名、源、页数、构建时间
service systemd 生命周期:install / start / stop
serve 服务器前台进程,加载配置并监听,是 systemd 单元的 ExecStart 目标
upgrade 自动升级:凭据解析链(配置 upgrade.token → gh 已认证账号 → 交互输入,逐项经仓库访问校验)取得 GitHub 令牌,gh api 取最新 vX.Y.Z 标签(客户端比较取最大),pnpm i -g 重装(令牌以 x-access-token 内嵌仓库 URL,剔除 SUDO_USER 干扰、注入 PNPM_HOME/bin),存在 systemd 单元时自动 systemctl restart docdoc;与当前版本相同则跳过,--ref 指定时直接安装