@gbits-jszx/gw-cli 2026.911.7 → 2026.914.0-520820d.11

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 CHANGED
@@ -1,99 +1,164 @@
1
1
  # @gbits-jszx/gw-cli
2
2
 
3
- GW-Framework 的跨平台构建、运行和交付工具。公网 registry 为 `https://registry.npmjs.org/`,包内包含 Windows amd64 和 Linux amd64(含 WSL)二进制。
3
+ 面向多个网关项目的跨平台构建、运行和交付工具。项目级命令的身份唯一来自显式 `--project-id <代号>`(或 `--project-id=<代号>`);不需要 `gw.project.yaml`,不接受旧 `--project` 路径,也不从 `GW_PROJECT_FILE` 或用户凭据中的旧 ID 兜底。`npm build/package/publish` 专用于维护 CLI 本身,不要求项目代号,包名固定为 `@gbits-jszx/gw-cli`。
4
+
5
+ > 当前公开版本为 `@gbits-jszx/gw-cli@2026.9.14-7`。公网使用 `npx -y --prefer-online @gbits-jszx/gw-cli@latest`;没有 Node/npm 的 Linux/WSL 可直接运行包内 `bin/native/gw-cli-linux-amd64`。源码开发继续使用 `go run ./tools/cli`。
6
+ >
7
+ > 默认 `all`、部署版本自动选择、npm 全局账本和 Helm 部署进度均已进入当前 npm 版本。
8
+
9
+ [PC 开发构建发布、WSL/云 VM 初始化部署更新](../../../docs/user-docs/CLI-MULTI-PROJECT.md)。公网 registry 为 `https://registry.npmjs.org/`,包内包含 Windows amd64 和 Linux amd64(含 WSL)二进制。
10
+
11
+ WSL 必须使用安装在 WSL 内的 Linux Node/npm。若 `type -a node npm npx` 指向 `/mnt/c/...`,或 `node -p "process.platform"` 输出 `win32`,应先切换到 WSL 原生 Node。即使 Node 正确,也不要在包含 Windows 侧 `node_modules` 的 `/mnt/c/Users/<用户>` 下运行;npm 会把它识别为本地项目并污染 WSL 的 bin 查找,表现为 `Path contains delimiter (":")` / `gw-cli: not found`。切到 WSL home 或实际仓库后再执行:
12
+
13
+ ```bash
14
+ cd /mnt/g/Git/Wurq/Projects/GW-Framework
15
+ npx -y --prefer-online @gbits-jszx/gw-cli@2026.9.14-7 --version
16
+ ```
4
17
 
5
18
  打包过程和最终 `.tgz` 全部位于仓库根目录 `.gw-build/npm/`;源码目录不会生成 `bin/native` 或被 `npm version` 改写。
6
19
 
7
- `npm package` 会依次输出准备包、Windows/Linux 编译和 npm 压缩打包日志。编译期间每 5 秒报告已用时间,完成时显示各平台二进制大小、npm 文件清单、压缩包文件名、输出目录和总耗时;任何阶段失败都会保留原始错误并返回非零退出码。
20
+ ## 端口调试与新项目
21
+
22
+ `debug port kill <端口>` 已包含在当前 npm 版本中,也可使用源码验证:
23
+
24
+ ```powershell
25
+ go run ./tools/cli debug port kill 18080 --dry-run
26
+ go run ./tools/cli debug port kill 18080
27
+ ```
28
+
29
+ 无需项目代号,查询指定端口的 TCP 监听和 UDP 绑定 PID,并强制结束对应进程。`--dry-run` 仅预览;不清理远端连接,不跨 Windows/WSL,不自动提权或结束进程树。Linux/WSL 需要 `ss`(iproute2);查询权限不足或清理失败会返回非零退出码。正在运行的 `run all` 若有一个 app 被结束,监督进程会退出并清理其余 app 和临时数据库;清理后的占用查询会发现自动重启,但不会自动追杀新 PID。
30
+
31
+ Windows 默认 `run all` 启动本机 app,连接 `db start` 管理的本机持久 PostgreSQL(`127.0.0.1:15433`);不是 k3s Pod。一次性数据库显式使用 `run all --database temporary`,默认映射 `127.0.0.1:55432`,退出时回收容器和数据;`--target local|wsl` 只控制该临时模式的 Docker 执行位置。
32
+
33
+ CLI 当前不提供新项目源码脚手架;先准备框架源码布局,再运行 `config new` 交互登记用户级项目配置。它不会生成目录或改写 Go module;`deploy k3s init` 只初始化集群资源。完整步骤见[新项目接入](../../../docs/user-docs/CLI-MULTI-PROJECT.md#新项目如何开始)。
34
+
35
+ `npm build` 与 `npm package` 等价,从当前源码编译 Windows/Linux CLI 并生成 `.tgz`。编译期间每 5 秒报告已用时间,完成时显示各平台二进制大小、npm 文件清单、压缩包文件名、输出目录和总耗时;任何阶段失败都会保留原始错误并返回非零退出码。`npm publish` / `publish npm` 每次重新构建,并在默认自动编号下分配新的 npm 版本,不直接上传之前 build 的归档。源码 `go run ./tools/cli --version` 显示嵌入的源码基线 `2026.9.11-2`;打包阶段才把发布版本注入二进制和 `package.json`。
8
36
 
9
37
  ## 日期版本号
10
38
 
11
- CLI 显示版本使用 `yyyy.MM.dd.id`,例如 `2026.09.10.1` 表示 2026 年 9 月 10 日第 1 次打包。`npm package`、`npm publish` 和 `publish npm` 默认 `--version auto`,按执行机器的本地日期生成,序号从 1 开始、同日递增、跨日重置。也可用 `--version 2026.09.10.7` 指定版本,日期须有效,序号须为不带前导零的正整数。
39
+ npm、Image、Chart 使用相同的 `yyyy.Mdd.0-short_sha1.id` 格式,例如 `2026.914.0-d3844db.1`,不要求三者同号。`Mdd` 是去除整体前导零的 `MMdd`,固定第三段 `0` 用于满足 SemVer。npm 在 CLI 全局范围独立编号;Image/Chart 按项目和制品类型编号。`npm build`、`npm package`、`npm publish` 和 `publish npm` 默认 `--version auto`,使用执行机器的本地日期、当前仓库 HEAD 的 7 位 Git SHA 和当天序号;序号从 1 开始、同日递增、跨日重置。也可用完整版本显式重建未发布版本;日期须有效,核心数字段和序号不得带前导零。
12
40
 
13
- npm 的 SemVer 不接受四段数字或带前导零的月日,所以 npm 包版本采用 `yyyy.(MM×100+dd).id`。例如:
41
+ 该格式可直接被 npm 和 Helm 解析为 SemVer:`yyyy.Mdd.0` 是 major/minor/patch,`short_sha1` 与 `id` 是 prerelease 标识。字面 `yyyy.MMdd.short_sha1-number` 不能直接使用,因为 `MMDD` 可能有前导零,且 SemVer 第三核心段必须为数字。CLI 在打包副本中自动同步 `package.json` 的 `version`、`gwVersion` 和 Windows/Linux 二进制编译版本,无需手工修改源码中的 `gwVersion`。日常安装继续使用 `@latest`;精确复现使用完整版本号。由于它在 SemVer 中属于 prerelease,普通版本范围默认不会匹配,依赖方应使用 `@latest` 或精确版本。
14
42
 
15
- | CLI 显示 / `--version` 输入 | npm 包版本 / 安装版本 |
16
- |---|---|
17
- | `2026.01.02.1` | `2026.102.1` |
18
- | `2026.09.10.7` | `2026.910.7` |
19
- | `2026.12.31.12` | `2026.1231.12` |
43
+ `npm publish` / `publish npm` 会自动向 npm 传入 `--tag latest`,明确把本次版本设为 `@latest`,同时满足 npm 对 prerelease 发布的显式 tag 要求。`--dry-run` 使用相同参数但不上传;`npm pack --dry-run` 只检查打包,不能替代发布检查。
20
44
 
21
- 这些是可按日期和序号排序的正式版本,可正常使用 `@latest`。包内 `package.json` 的 `version` 保存 npm 版本,`gwVersion` 保存四段显示版本;Windows/Linux 二进制编译时写入同一个显示版本,`gw-cli --version` 不会回退到源码包的旧版本。
45
+ 旧的 `yyyy.MM.dd.id` 仅保留为显式输入兼容,用于重建已经发布的旧包;新自动版本不会再生成旧格式。
22
46
 
23
- 序号记录位于 `~/jszx-infra/.gw-cli/projects.yaml`,按 `project-id` 和制品类型隔离;打包开始即占用,失败和 dry-run 也占用一次,避免自动重用版本。同一用户目录下的并发自动打包不会重复分配,清理 `.gw-build` 或切换仓库副本不会重置编号。手动指定版本可用于重打包或在本地验证后发布;换机器或 CI 多节点并行时仍需统一分配并显式传入未发布版本。`GW_CLI_PROJECTS` 可覆盖账本路径。
47
+ npm 序号记录位于统一配置 `~/jszx-infra/.gw-cli/config.yaml` 的 `shared.artifacts.npm`;打包开始即占用,失败和 dry-run 也占用一次,避免自动重用版本。同一用户配置下的并发自动打包不会重复分配,清理 `.gw-build` 或切换仓库副本不会重置编号。首次写入时,旧 `projects.*.artifacts.npm` 会合并到 shared:每日序号取最大值,最近构建/发布取较新记录,并删除项目内 npm 节点。手动指定版本可用于重打包或在本地验证后发布;换机器或 CI 多节点并行时仍需统一分配并显式传入未发布版本。`GW_CLI_PROJECTS` 仅覆盖旧账本作为升级兼容路径。
24
48
 
25
49
  ## 镜像 tag
26
50
 
27
- `image build` 默认 `--tag auto`,使用同样的 `yyyy.MM.dd.id` 规则,例如 `2026.09.10.1`。Docker 支持四段 tag,无需 npm 的三段映射。日期按执行 CLI 的机器本地时间计算,序号从 1 起,同日递增、跨日重置。参数优先级为 `--tag` > `GW_IMAGE_TAG` > `auto`;显式 tag 必须是有效日期和不带前导零的正整数序号,不能用 `latest`、`0.2.0-dev` 等旧格式构建。
51
+ `image build` 默认 `--tag auto`,生成 `yyyy.Mdd.0-short_sha1.id`,例如 `2026.914.0-d3844db.1`。该格式同时满足 Docker tag 与 Helm SemVer,Image 与 Chart 各自编号。`deploy helm install` 省略版本参数时,会按 `--project-id` 从发布账本自动选择最近成功发布的 Chart 版本和目标镜像仓库最近成功发布的 Image tag;换机器或账本缺失时再显式传入。日期按执行 CLI 的机器本地时间计算,SHA 取当前 HEAD,序号从 1 起,同日递增、跨日重置。参数优先级为 `--tag` > `GW_IMAGE_TAG` > `auto`;已存在的 `yyyy.M.d-id` 和 `yyyy.MM.dd.id` 仍可显式重建或推送。
28
52
 
29
- 镜像与 npm 独立计数,编号同样写入用户级 `projects.yaml`。开始构建时即占号,失败也保留,但只有成功构建才更新该 repository 的最近可推送 tag。同一 `project-id` 的不同镜像 repository 共用镜像每日序号,各自保存最近成功构建。显式 tag 可用于本地重建;不查询 Harbor。换机器或 CI 多节点构建时,应统一分配并显式传入未发布 tag,不能覆盖已发布镜像。
53
+ 镜像与 npm 独立计数;镜像编号写入统一配置的 `projects.<project-id>.artifacts.image`。开始构建时即占号,失败也保留,但只有成功构建才更新该 repository 的最近可推送 tag。同一 `project-id` 的不同镜像 repository 共用镜像每日序号,各自保存最近成功构建。显式 tag 可用于本地重建;不查询 Harbor。换机器或 CI 多节点构建时,应统一分配并显式传入未发布 tag,不能覆盖已发布镜像。
30
54
 
31
55
  ```powershell
32
56
  # 自动编号,输出 Docker 构建日志及最终完整镜像名
33
- npx -y --prefer-online @gbits-jszx/gw-cli@latest image build
57
+ go run ./tools/cli --project-id gw-demo image build
34
58
  # 自动使用该 repository 最近一次成功构建的 tag,不生成新编号
35
- npx -y --prefer-online @gbits-jszx/gw-cli@latest image push
59
+ go run ./tools/cli --project-id gw-demo image push
36
60
  ```
37
61
 
38
- `image push` / `publish image` 的默认 `--tag auto` 会读取最近成功构建记录;没有记录时要求先 build 或显式传入 tag。优先级为 `--tag` > `GW_IMAGE_TAG` > 自动识别;为兼容已有本地镜像,显式推送仍接受旧 tag 格式。以上行为在源码修改发布后才进入 npm `@latest`,发布前用 `go run ./tools/cli image build` 验证。
62
+ `image push` / `publish image` 的默认 `--tag auto` 会读取最近成功构建记录;没有记录时要求先 build 或显式传入 tag。优先级为 `--tag` > `GW_IMAGE_TAG` > 自动识别;为兼容已有本地镜像,显式推送仍接受旧 tag 格式。默认仓库为 `<Harbor>/<Harbor项目>/<project-id>`,完整地址可用 `--repository` 或 `GW_IMAGE_REPOSITORY` 覆盖。
39
63
 
40
64
  ## Chart 版本
41
65
 
42
- `chart package` 默认生成 `{project-id}-yyyy.MM.dd.id` 显示版本,例如 `gw-framework-2026.09.10.1`;Helm Chart metadata 只能使用 SemVer,因此包内版本和归档名映射为 `2026.910.1`。`chart push` 默认复用 `projects.yaml` 中尚未发布且文件仍存在的精确归档;没有可复用包时自动分配下一版本、打包并推送。显式 `--version` 接受带/不带 project-id 的日期版本,并兼容合法 SemVer。
66
+ `chart package` 独立生成 `yyyy.Mdd.0-short_sha1.id`,例如 `2026.914.0-d3844db.1`;Chart metadata、归档名和 Harbor OCI tag 不再二次映射或添加 project-id 前缀。`chart push` 默认复用统一配置中尚未发布且文件仍存在的精确归档;没有可复用包时自动分配下一版本、打包并推送。旧的 `yyyy.M.d-id`、`{project-id}-yyyy.MM.dd.id`、`yyyy.MM.dd.id` 和合法 SemVer 仍可显式用于重建或回滚。Chart 默认地址为 `oci://<Harbor>/<Harbor项目>/charts/<project-id>`,自动与镜像路径分离,无需另传 `/charts`;`--registry/--repository` 可覆盖 registry 和 OCI 父路径。
67
+
68
+ ## 配置查看与校验
69
+
70
+ ```powershell
71
+ go run ./tools/cli config new
72
+ go run ./tools/cli config new --project-id my-gateway --non-interactive --yes
73
+ go run ./tools/cli config list
74
+ go run ./tools/cli config list --json
75
+ go run ./tools/cli config show
76
+ go run ./tools/cli config check
77
+ go run ./tools/cli --project-id gw-demo config show
78
+ ```
79
+
80
+ `config new` 回显确认后写入 `projects.<project-id>` 并输出接入命令;若同一文件仍是旧版或混合版凭据结构,会先在内存升级和校验,再创建 `config.yaml.bak.<时间>` 私有备份并原子替换,失败不改原文件。`config list` 读取统一配置中已记录的项目代号;`config show` 仅显示凭据状态,不输出 Token 或密码;`config check` 只做静态校验,不执行集群写操作。运行时配置使用 `config runtime get/set/history/rollback`。
81
+ 配置命令已随 `2026.9.13-9` 发布到 npm latest。
43
82
 
44
83
  ## 使用
45
84
 
46
- 首次发布成功后,在 GW-Framework 项目根目录执行:
85
+ 在 GW-Framework 源码根目录执行以下命令;公开 npm 入口的切换条件见本文开头:
47
86
 
48
87
  ```powershell
49
- npx -y --prefer-online @gbits-jszx/gw-cli@latest --version
50
- npx -y --prefer-online @gbits-jszx/gw-cli@latest doctor
51
- npx -y --prefer-online @gbits-jszx/gw-cli@latest build all
52
- npx -y --prefer-online @gbits-jszx/gw-cli@latest run all
53
- # 另开终端
54
- npx -y --prefer-online @gbits-jszx/gw-cli@latest test all
88
+ go run ./tools/cli --version
89
+ go run ./tools/cli --project-id gw-demo doctor
90
+ go run ./tools/cli --project-id gw-demo test
91
+ go run ./tools/cli --project-id gw-demo build
92
+ go run ./tools/cli --project-id gw-demo run all
55
93
  ```
56
94
 
57
- `build`、`run`、`test` 统一接受 `core|mock|web|all`,`all` 只包含三个 app。`build`、`run` 需要源码和 Go,`run` 还需要 Docker(Windows 默认走 WSL)。npm 发布使用当前平台 npm;镜像命令优先使用当前平台 Docker,Windows 缺少 Docker 时转 WSL;Chart 推送在 Windows 默认走 WSL,可用 `--wsl=false` 切换。平台能力由 `doctor` 输出。
95
+ | 命令 | `--project-id` |
96
+ |---|---|
97
+ | `build/run/test`、`image/chart/npm/publish` 的实际操作 | 必填 |
98
+ | `deploy k3s/helm` 的实际操作,包括状态查询及 dry-run | 必填 |
99
+ | 隐藏 `cleanup`,仅供 npm wrapper 回收本地资源 | 必填 |
100
+ | `config new --non-interactive` | 必填 |
101
+ | `config list/new/show/check/runtime` | 可选;`config new` 交互询问代号 |
102
+ | `doctor` | 可选 |
103
+ | 帮助和版本查询 | 不需要 |
104
+
105
+ 项目代号最长 63 字符,以小写字母开头,只含小写字母、数字和不连续的连字符,末尾为字母或数字。缺失、空值、非法值或重复参数均失败;两次相同值也不接受。源码从当前目录向上找最近 `go.mod`,不通过项目代号定位另一个仓库。
106
+
107
+ `build`、`run`、`test` 省略目标时默认 `all`,也可显式选择 `core|mock|web|all`;目标固定映射 `./apps/core-gateway`、`./apps/mock-gateway`、`./apps/web-service`,构建和运行的 `all` 不包含 CLI。`test core/mock/web` 只执行对应宿主的 `go test -short`,`test all` 执行 `go test -short ./apps/...` 覆盖 `apps` 下全部包但不扫描 CLI;需要执行 CLI 集成测试时单独运行 `go test ./tools/cli`,CI 若要测试全部 Go 包但跳过集成测试则运行 `go test -short ./...`。单目标执行对应 package 的测试子树。旧 manifest 自定义 app/package/build/run/test/health-url 不再生效。`smoke` 和整个 `dev` 入口已删除。
108
+
109
+ 基础默认值仍为 `tools/helm/default/values.yaml`;`--profile beta` / `--profile release` 选择 Chart 内 profile,`--values` 额外覆盖,未指定 profile 时只用基础默认值。`--release` 仅表示 Helm 实例名。
110
+
111
+ 当前 GW 三套 values 分别声明 `gw-dev.g-bits.com`、`gw-test.g-bits.com`、`gw.g-bits.com`,统一使用 TLS Secret `gw-tls`。证书通过 `deploy k3s init` 显式导入;Web Demo 直接使用 values 中的 `demo123`,不创建登录 Secret。WSL 只为 dev 域名使用 `--windows-hosts`,beta/release 由正式 DNS/LB 解析。
58
112
 
59
- `k3s init` 支持 Windows/WSL 和 Linux amd64 VM,无需源码或 Go:
113
+ 本地 `run all` 除了通用宿主、`local.*` 配置和本机持久 PostgreSQL,还会根据 `local.demo` 启动仓库内置登录与 Hello Demo,本地演示账号和密码固定为 `demo/demo123`;不读取用户环境变量。Helm 直接使用 values 中的展示密码,TLS 证书由 Secret 管理。显式 `--database temporary` 使用随机密码,退出时回收。
60
114
 
61
- ```sh
62
- npx -y --prefer-online @gbits-jszx/gw-cli@latest k3s init --dry-run
63
- npx -y --prefer-online @gbits-jszx/gw-cli@latest k3s init
115
+ Go 项目的 `build`、`run`、`test` 需要源码和 Go。本仓库默认 `run` 还需要已由 `db start` 启动的本机 PostgreSQL,以及 Windows 上执行统一迁移脚本所需的 Git for Windows;只有 `--database temporary` 需要 Docker。`run` 会按目标先构建,再启动 `.gw-build/local/` 下对应二进制;Windows 启动 `.exe`,省略目标时等同 `build all`。如果旧 app 仍占用任一 app 端口,`run` 直接失败,不会自动终止旧进程。npm 发布使用当前平台 npm;镜像命令优先使用当前平台 Docker,Windows 缺少 Docker 时转 WSL;Chart 推送在 Windows 默认走 WSL,可用 `--wsl=false` 切换。平台能力由 `doctor` 输出。
116
+
117
+ 根 `--help` 只展示下一层入口,并按颜色分为“本地 PC · 日常开发”“远程 VM · 日常部署”“高级命令 · 制品与维护”;各级命令沿用所属分组颜色,参数默认值使用洋红色突出。交互终端默认启用颜色;`GW_CLI_COLOR=always|never` 可强制开关,未强制开启时 `NO_COLOR` 会关闭颜色。集群操作唯一入口为 `deploy k3s` / `deploy helm`,包括 `deploy k3s restore/purge`;顶层 `k3s` / `helm` 已删除。
118
+
119
+ `deploy k3s init` 在 WSL 或 Linux amd64 VM 内执行,无需项目文件、源码或 Go。当前公开包已包含新接口;无源码 VM 直接使用 npm 包中的 Linux amd64 CLI,或使用已核对版本的独立二进制。下面是 Windows 源码端的预览入口:
120
+
121
+ ```powershell
122
+ go run ./tools/cli --project-id gw-demo deploy k3s init --dry-run
64
123
  ```
65
124
 
66
- 目标机器需预先安装并运行 k3s、安装 Helm,并允许当前用户访问 kubeconfig。Windows 默认走 `Ubuntu-24.04` WSL,Linux 直接执行;不自动安装 k3s 或 Helm。PostgreSQL 参数使用 `--pgsql-*`,数据库名为 `--pgsql-dbname`。已有密码分别复用,首次业务及管理员密码人工输入,危险修改需二次确认,缺少 Docker 登录配置时跳过 imagePullSecret。完整说明见 [k3s 初始化](../../../docs/user-docs/K3S-INIT.md)。源码修改发布后才会进入 npm `@latest`。
125
+ 目标机器需预先安装并运行 k3s、安装 Helm,并允许当前用户访问 kubeconfig;不自动安装 k3s 或 Helm。部署前可运行 `doctor --scope deploy`,该 scope 只检查 Helm/k3s/kubeconfig,不要求 Go、Node.js 或 npm。PostgreSQL 参数使用 `--pgsql-*`,数据库名为 `--pgsql-dbname`。已有密码分别复用,首次密码隐藏输入,危险修改需二次确认。显式提供 `--tls-secret-name/--tls-cert-file/--tls-key-file/--tls-host` 可导入公司证书;WSL 开发机可加 `--windows-hosts`。完整说明见 [k3s 初始化](../../../docs/user-docs/K3S-INIT.md)。当前 `@latest` 是 `2026.9.14-7`,已包含上述参数和 WSL PowerShell 路径回退。
67
126
 
68
127
  ## 发布凭据
69
128
 
70
- 首次执行任何命令(含帮助、版本、doctor、dry-run)均检查用户配置;不存在或缺少 `project-id` 时引导填写项目代号,Harbor 地址与项目分别默认 `szharbor.g-bits.com`、`jszx-infra`,提示默认值可回车采用。旧配置中的发布凭据保留。镜像和 Chart 仓库末段统一为 `{project-id}`,Chart 打包也使用该包名。CI 需预先准备含 `project-id` 的配置。见 [首次配置说明](../../../configs/README.md)。
129
+ 项目身份仅来自 `--project-id`,默认交付地址和资源名称从代号推导。Harbor 端点按对应命令支持的参数 > `GW_HARBOR_REGISTRY/GW_HARBOR_PROJECT` > 用户配置端点 > `szharbor.g-bits.com/jszx-infra` 默认值解析。用户 `~/jszx-infra/.gw-cli/config.yaml` 保存凭据、平台区块和项目制品版本,不保存当前项目;旧 `projects.yaml` 仅通过显式 `GW_CLI_PROJECTS` 兼容。CI 显式传代号并注入凭据,无需携带项目清单。帮助和版本查询不创建配置。
130
+
131
+ Namespace/应用 Release 默认代号,PG Release 默认 `<代号>-pg`,数据库名/用户名将 `-` 转为 `_`,数据库连接 Secret 默认 `<代号>-database`。超长 Release/资源名自动缩短并保留确定性哈希;Namespace 和制品地址保留完整代号。kubeconfig/context 默认 `/etc/rancher/k3s/k3s.yaml` / `default`,可通过现有参数及环境变量覆盖。详细规则见[多项目 CLI 指南](../../../docs/user-docs/CLI-MULTI-PROJECT.md)。
71
132
 
72
133
  ```powershell
73
- npx -y --prefer-online @gbits-jszx/gw-cli@latest publish npm --version 2026.09.10.1
74
- npx -y --prefer-online @gbits-jszx/gw-cli@latest publish image
75
- npx -y --prefer-online @gbits-jszx/gw-cli@latest publish chart
134
+ go run ./tools/cli npm publish
135
+ go run ./tools/cli --project-id gw-demo image push
136
+ go run ./tools/cli --project-id gw-demo chart push
76
137
  ```
77
138
 
78
139
  缺少 npm Token 或 Harbor Robot 账号/密码时,CLI 会询问并自动保存到 `~/jszx-infra/.gw-cli/config.yaml`;可用 `GW_CLI_CONFIG` 覆盖位置。已有配置不重复询问。命令参数、`NODE_AUTH_TOKEN` / `GW_HARBOR_USERNAME` / `GW_HARBOR_PASSWORD` 优先于用户配置。
79
140
 
141
+ `deploy helm install` 的 release、namespace、Chart 地址、数据库资源名、kubeconfig/context 均由 `--project-id` 和固定规则推导;Chart 版本和镜像 tag 默认读取该项目的最近成功发布记录。`--version`、`--tag` 只用于跨机器、账本缺失、回滚或一次性覆盖。拉取 OCI Chart 时先复用 Helm 原生登录或公共访问;只有确认认证失败才补齐 Harbor 账密,隐藏密码输入、保存后通过 stdin 登录。支持 `--username` / `--password` 和 `GW_HARBOR_USERNAME` / `GW_HARBOR_PASSWORD`,也支持 `--helm-registry-config` / `HELM_REGISTRY_CONFIG` 指定执行机器的 Helm 凭据文件。网络、版本不存在等错误直接报告;`--dry-run` 不探测、不登录、不询问账密。
142
+
143
+ 实际安装按 4 个阶段输出目标、Chart/profile、数据库 Secret 前置检查和 Helm 执行结果;默认等待期间每 10 秒打印已用时间与 Pod 状态。缺少 `<project-id>-database` 时会在 Helm 前失败并提示先运行 `deploy k3s init`,避免无输出等待 5 分钟。
144
+
80
145
  Token 和密码在终端中不回显。配置文件保存明文凭据,Unix 下目录/文件权限为 0700/0600,Windows 使用用户目录 ACL。网关服务不读取此文件。
81
146
 
82
- ## 首次发布与本地验证
147
+ ## 源码打包与本地验证
83
148
 
84
- 2026-09-09 查询公网 `@gbits-jszx/gw-cli` 返回 404;首次发布前直接运行源码 CLI:
149
+ 已有公开 npm 包;npm 构建/发布在当前源码中不再使用项目代号,版本统一记录到 `shared.artifacts.npm`:
85
150
 
86
151
  ```powershell
87
152
  # 自动使用当天序号,终端会打印版本和文件名
88
- go run ./tools/cli npm package
89
- # 或显式指定版本
90
- go run ./tools/cli npm package --version 2026.09.10.1
91
- npx -y --package ./.gw-build/npm/gbits-jszx-gw-cli-2026.910.1.tgz gw-cli --version
92
- npx -y --package ./.gw-build/npm/gbits-jszx-gw-cli-2026.910.1.tgz gw-cli build all
153
+ go run ./tools/cli npm build
154
+ # 把占位文件名替换为本次 build 实际输出的文件名;这里使用本地新包
155
+ $gwNpmArchive = './.gw-build/npm/<本次输出的文件名>.tgz'
156
+ npx -y --package $gwNpmArchive gw-cli --version
157
+ npx -y --package $gwNpmArchive gw-cli --project-id gw-demo config show
93
158
  # 只检查发布包,不上传、不询问 Token
94
- go run ./tools/cli publish npm --dry-run
95
- # 真正发布:输入具备 @gbits-jszx/gw-cli 发布权限的 npm Token
96
- go run ./tools/cli publish npm --version 2026.09.10.1
159
+ go run ./tools/cli npm publish --dry-run
160
+ # 获得发布授权后执行:重新构建并自动编号,输入具备发布权限的 npm Token
161
+ go run ./tools/cli npm publish
97
162
  ```
98
163
 
99
164
  发布后的版本号不可复用。这里的 `gw-cli` 是包内命令名,公网下载始终使用 scoped 包 `@gbits-jszx/gw-cli`。
package/bin/gw-cli.js CHANGED
@@ -26,6 +26,41 @@ if (process.platform !== 'win32') {
26
26
  // supervisor and its deferred container/process cleanup runs on Windows.
27
27
  const child = spawn(binary, process.argv.slice(2), { stdio: 'inherit', windowsHide: false });
28
28
 
29
+ // Preserve project selection when cleanup is launched from outside the checkout.
30
+ const selection = [];
31
+ const command = [];
32
+ const cliArgs = process.argv.slice(2);
33
+ let helpOnly = false;
34
+ let invalidSelection = false;
35
+ for (let i = 0; i < cliArgs.length; i++) {
36
+ const arg = cliArgs[i];
37
+ if (arg === '--help' || arg === '-h') helpOnly = true;
38
+ if (arg === '--' || arg === '--project' || arg.startsWith('--project=')) invalidSelection = true;
39
+ if (arg === '--project-id' || arg.startsWith('--project-id=')) {
40
+ const value = arg === '--project-id' ? cliArgs[++i] : arg.slice('--project-id='.length);
41
+ if (selection.length > 0 || !value || value.length > 63 || !/^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(value)) invalidSelection = true;
42
+ if (arg === '--project-id') selection.push(arg, value);
43
+ else selection.push(arg);
44
+ } else {
45
+ command.push(arg);
46
+ }
47
+ }
48
+
49
+ // The run target is a positional that may sit behind value-taking flags
50
+ // (--target wsl all), so scan past them instead of testing command[1].
51
+ function runsLocalServices(command) {
52
+ if (command[0] !== 'run') return false;
53
+ const valueFlags = new Set(['--target', '--distro', '--values', '--profile']);
54
+ for (let i = 1; i < command.length; i++) {
55
+ const arg = command[i];
56
+ if (valueFlags.has(arg)) { i += 1; continue; }
57
+ if (arg.startsWith('--')) continue;
58
+ return ['core', 'mock', 'web', 'all'].includes(arg);
59
+ }
60
+ // The native CLI defaults an omitted app target to all.
61
+ return true;
62
+ }
63
+
29
64
  // Keep the wrapper alive while the native CLI stops its services and database.
30
65
  // Windows console events already reach the child; child.kill('SIGINT') on
31
66
  // Windows would force-terminate it and skip Go's deferred cleanup.
@@ -42,8 +77,8 @@ child.on('exit', (code) => {
42
77
  // Run after the child exits; invoking Docker while a Windows Ctrl+C event is
43
78
  // active can interrupt the cleanup subprocess itself.
44
79
  // A test/build/publish in another terminal must not remove run all's DB.
45
- if (process.argv[2] === 'run' && process.argv[3] === 'all') {
46
- spawnSync(binary, ['cleanup'], { stdio: 'inherit', windowsHide: false });
80
+ if (!helpOnly && !invalidSelection && selection.length > 0 && runsLocalServices(command) && Number.isInteger(child.pid) && child.pid > 0) {
81
+ spawnSync(binary, [...selection, 'cleanup', '--owner-pid', String(child.pid)], { stdio: 'inherit', windowsHide: true });
47
82
  }
48
83
  process.exit(code === null ? 1 : code);
49
84
  });
Binary file
Binary file
package/package.json CHANGED
@@ -9,12 +9,12 @@
9
9
  "files": [
10
10
  "bin"
11
11
  ],
12
- "gwVersion": "2026.09.11.7",
12
+ "gwVersion": "2026.914.0-520820d.11",
13
13
  "license": "MIT",
14
14
  "name": "@gbits-jszx/gw-cli",
15
15
  "publishConfig": {
16
16
  "access": "public",
17
17
  "registry": "https://registry.npmjs.org/"
18
18
  },
19
- "version": "2026.911.7"
19
+ "version": "2026.914.0-520820d.11"
20
20
  }