@anov/gis-skills-cli 0.3.0 → 0.3.3

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/CHANGELOG.md CHANGED
@@ -4,6 +4,25 @@
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.3.3] - 2026-11-02
8
+
9
+ - fix: README 文档链接改绝对 URL,修 npm 包页面点不开的问题 (`a118366`)
10
+ - feat: npm run release 自动打 tag 并推送 (`018027d`)
11
+ - feat: npm run release 自动提交并推送发版文件 (`e6c5bb1`)
12
+
13
+
14
+ ## [0.3.2] - 2026-10-30
15
+
16
+ - chore: 新增 npm run release 一键发版脚本 (`e147f1d`)
17
+ - fix: setup 只装已检测智能体,MCP 默认写 Claude Code + Codex (`ee704ee`)
18
+
19
+
20
+ ## [0.3.1] - 2026-10-30
21
+
22
+ - chore: 新增 npm run release 一键发版脚本 (`e147f1d`)
23
+ - fix: setup 只装已检测智能体,MCP 默认写 Claude Code + Codex (`ee704ee`)
24
+
25
+
7
26
  ## [0.3.0] - 2026-10-30
8
27
 
9
28
  分发体系改造:npm 包内置 Cesium skill(vendor 15 个,Apache-2.0)、CLI 命令族重写为 setup/mcp/doctor/uninstall、MCP 配置自动写入各智能体
package/INSTALL.md CHANGED
@@ -47,7 +47,7 @@ anov-gis-skills setup
47
47
  npx @anov/gis-skills-cli setup # → ~/.claude/skills/ 等
48
48
  npx @anov/gis-skills-cli setup --project # → ./.claude/skills/,可提交进项目仓库
49
49
 
50
- # 装给谁(默认全部检测到的智能体)
50
+ # 装给谁(默认:共享目录 ~/.agents/skills + 已装的 Claude Code)
51
51
  npx @anov/gis-skills-cli setup --agent claude-code
52
52
  npx @anov/gis-skills-cli setup --agent claude-code --agent codex
53
53
 
@@ -87,12 +87,12 @@ npx @anov/gis-skills-cli setup --print
87
87
 
88
88
  ### A.5 MCP 接入
89
89
 
90
- `setup` 默认会写一条 MCP 配置(stdio 直连 `anov-gis-mcp`)。单独管理:
90
+ `setup` 默认给 **Claude Code 和 Codex** 各写一条 MCP 配置(stdio 直连 `anov-gis-mcp`)。单独管理:
91
91
 
92
92
  ```bash
93
93
  npx @anov/gis-skills-cli mcp show # 看当前状态
94
- npx @anov/gis-skills-cli mcp add # 补上(默认 Claude Code + 用户级)
95
- npx @anov/gis-skills-cli mcp add --mcp-agent codex
94
+ npx @anov/gis-skills-cli mcp add # 补上(默认 Claude Code + Codex + 用户级)
95
+ npx @anov/gis-skills-cli mcp add --mcp-agent cursor
96
96
  npx @anov/gis-skills-cli mcp remove # 拿掉
97
97
  ```
98
98
 
@@ -100,7 +100,7 @@ npx @anov/gis-skills-cli mcp remove # 拿掉
100
100
 
101
101
  | 参数 | 说明 |
102
102
  |---|---|
103
- | `--mcp-agent <名字>` | `claude-code`(默认)/ `codex` / `cursor` / `vscode` |
103
+ | `--mcp-agent <名字...>` | `claude-code` / `codex`(默认这两个都写)/ `cursor` / `vscode`,可指定多个 |
104
104
  | `--mcp-mode stdio\|http` | 默认 `stdio`(本地起进程);`http` 连服务器 |
105
105
  | `--mcp-url <地址>` | HTTP 模式必填,例如 `http://192.168.11.164:3000/mcp` |
106
106
  | `--mcp-command` / `--mcp-arg` | 自定义 stdio 启动命令(默认 `npx -y anov-gis-mcp --stdio`) |
@@ -132,6 +132,9 @@ npx @anov/gis-skills-cli doctor
132
132
 
133
133
  ── MCP · Claude Code(用户级) ── C:\Users\你\.claude.json
134
134
  ✓ 已配置(stdio)
135
+
136
+ ── MCP · Codex(用户级) ── C:\Users\你\.codex\config.toml
137
+ ✓ 已配置(stdio)
135
138
  ```
136
139
 
137
140
  | 检查项 | 不通过意味着 |
@@ -241,7 +244,7 @@ Claude Code 走 marketplace,多两个好处:**发版后自动升级**、**
241
244
 
242
245
  > ⚠️ **版本约束只对 `enabledPlugins` 生效**。`/plugin install` 与 `claude plugin install` 的参数只接受 `插件名` 或 `插件名@市场名`(第三段会被丢弃),所以**命令行装的时候锁不住版本** —— 要锁版本就靠 settings 里的 `enabledPlugins`。
243
246
 
244
- **完全锁死(不推荐)**:把约束写成精确版本 `anov-gis-skills@anov-gis-skills@0.3.0`。精确锁定后**不会自动升级**,每次发版都要人工改这一行 —— 这正是 v0.2.15 之前"发完版还要挨个催"的原因。
247
+ **完全锁死(不推荐)**:把约束写成精确版本 `anov-gis-skills@anov-gis-skills@0.3.3`。精确锁定后**不会自动升级**,每次发版都要人工改这一行 —— 这正是 v0.2.15 之前"发完版还要挨个催"的原因。
245
248
 
246
249
  ### B.4 插件缓存位置
247
250
 
@@ -448,9 +451,9 @@ git clone https://github.com/CesiumGS/cesiumjs-skills.git ~/.codex/skills/cesium
448
451
  | 场景 | 说明 |
449
452
  |---|---|
450
453
  | 首次开启 `autoUpdate` | 2026-10 之前装的,`known_marketplaces.json` 里 `autoUpdate` 默认是 `false`(第三方 marketplace 的默认值)。改一次 §方式 B.2 的配置或跑一次 `/plugin marketplace update` 即可 |
451
- | 用了精确锁版本 | `anov-gis-skills@anov-gis-skills@0.3.0` 这种精确锁定**不会自动升级**,必须改这一行 |
454
+ | 用了精确锁版本 | `anov-gis-skills@anov-gis-skills@0.3.3` 这种精确锁定**不会自动升级**,必须改这一行 |
452
455
  | 提示 restart required | 重开 Claude Code 会话 |
453
- | 想立刻跳到指定版本 | `/plugin install anov-gis-skills@anov-gis-skills@0.3.0`(降级同理) |
456
+ | 想立刻跳到指定版本 | `/plugin install anov-gis-skills@anov-gis-skills@0.3.3`(降级同理) |
454
457
 
455
458
  ### 查看当前版本
456
459
 
@@ -461,7 +464,7 @@ git clone https://github.com/CesiumGS/cesiumjs-skills.git ~/.codex/skills/cesium
461
464
 
462
465
  ### 破坏性变更
463
466
 
464
- **从 v0.1.1 升级到 v0.3.0 的破坏性变更**:无。所有 v0.1.1 skill 在 v0.3.0 仍然可用;v0.2.0 新增 3 个 skill + DOMAINS 强化;v0.2.1–v0.3.0 为修复性版本(skill 名称与目录结构未变)。
467
+ **从 v0.1.1 升级到 v0.3.3 的破坏性变更**:无。所有 v0.1.1 skill 在 v0.3.3 仍然可用;v0.2.0 新增 3 个 skill + DOMAINS 强化;v0.2.1–v0.3.3 为修复性版本(skill 名称与目录结构未变)。
465
468
 
466
469
  ---
467
470
 
package/README.md CHANGED
@@ -24,7 +24,7 @@ npx @anov/gis-skills-cli setup # 27 个 skill + MCP 接入
24
24
  `setup` 做两件事:
25
25
 
26
26
  1. 把 **27 个 skill** 落到各智能体的标准目录(`~/.claude/skills/`、`~/.agents/skills/` 等)
27
- 2. 写一条 **MCP 配置**(默认 Claude Code,stdio 直连 `anov-gis-mcp`)—— 不想要就加 `--no-mcp`
27
+ 2. 写 **MCP 配置**(默认 Claude Code + Codex,stdio 直连 `anov-gis-mcp`)—— 不想要就加 `--no-mcp`
28
28
 
29
29
  不需要预先 `npm i -g`,也不需要 clone 本仓库。
30
30
 
@@ -34,11 +34,11 @@ npx @anov/gis-skills-cli setup # 27 个 skill + MCP 接入
34
34
  npx @anov/gis-skills-cli setup --project # 装到当前项目(默认用户级)
35
35
  npx @anov/gis-skills-cli setup --agent cursor # 只装给某个智能体
36
36
  npx @anov/gis-skills-cli setup --no-mcp # 只装 skill,不碰 MCP
37
- npx @anov/gis-skills-cli mcp add --mcp-agent codex # MCP 单独接到 Codex
37
+ npx @anov/gis-skills-cli mcp add --mcp-agent cursor # MCP 接到 Cursor(默认 Claude Code + Codex)
38
38
  npx @anov/gis-skills-cli uninstall # 清理(只删自己的)
39
39
  ```
40
40
 
41
- 完整参数见 [INSTALL.md](INSTALL.md)。
41
+ 完整参数见 [INSTALL.md](https://cdn.jsdelivr.net/npm/@anov/gis-skills-cli@0.3.3/INSTALL.md)。
42
42
 
43
43
 
44
44
  ### 验证
@@ -51,7 +51,7 @@ npx @anov/gis-skills-cli doctor
51
51
 
52
52
  新开一个会话提问"flowPolyline 颜色怎么改",应自动激活 `anovgis-materials` 并给出溯源 snippet。
53
53
 
54
- 安装排错见 [INSTALL.md](INSTALL.md#排错);地图黑屏 / Workers 404 / 材质不生效等问题看下面的「报错排查」。
54
+ 安装排错见 [INSTALL.md](https://cdn.jsdelivr.net/npm/@anov/gis-skills-cli@0.3.3/INSTALL.md) 的「排错」一节;地图黑屏 / Workers 404 / 材质不生效等问题看下面的「报错排查」。
55
55
 
56
56
  ---
57
57
 
@@ -77,7 +77,7 @@ npx @anov/gis-skills-cli doctor
77
77
 
78
78
  ### 改 SDK 自带 demo
79
79
 
80
- 团队最常见的场景是「复制 SDK 自带 demo → 改成自己的业务」。137 个 demo 的路由表在 [`skills/using-anovgis/DEMO-SKILL-MAP.md`](skills/using-anovgis/DEMO-SKILL-MAP.md)。
80
+ 团队最常见的场景是「复制 SDK 自带 demo → 改成自己的业务」。137 个 demo 的路由表在 [`skills/using-anovgis/DEMO-SKILL-MAP.md`](https://cdn.jsdelivr.net/npm/@anov/gis-skills-cli@0.3.3/skills/using-anovgis/DEMO-SKILL-MAP.md)。
81
81
 
82
82
  直接跟 AI 说文件名 + 想改什么,它会自动路由:
83
83
 
@@ -143,7 +143,7 @@ npx @anov/gis-skills-cli mcp remove # 拿掉
143
143
  | 11 | `anovgis-effects` | 天气 / 漫游 / 动画 / 后期处理(Bloom / 夜视 / 景深 / 黑白)+ 天空盒 | weather、roaming、AroundPoint、FlyManager、bloom、skybox |
144
144
  | 12 | `anovgis-pitfalls` | Cesium 1.143 + v1.8.6 典型陷阱(P0–P12)+ 自定义图元报错 | 黑屏、白屏、不生效、报错、Workers 404、AMD、CustomPrimitive |
145
145
 
146
- 完整路由(用户意图 → skill)见 `skills/using-anovgis/SKILL.md`;完整 demo 路由(demo 文件名 → skill)见 [`skills/using-anovgis/DEMO-SKILL-MAP.md`](skills/using-anovgis/DEMO-SKILL-MAP.md)。
146
+ 完整路由(用户意图 → skill)见 `skills/using-anovgis/SKILL.md`;完整 demo 路由(demo 文件名 → skill)见 [`skills/using-anovgis/DEMO-SKILL-MAP.md`](https://cdn.jsdelivr.net/npm/@anov/gis-skills-cli@0.3.3/skills/using-anovgis/DEMO-SKILL-MAP.md)。
147
147
 
148
148
  另外 15 个 Cesium skill 由官方 `cesiumjs-skills` 提供(`cesiumjs-3d-tiles` / `cesiumjs-camera` / `cesiumjs-primitives` …),
149
149
  `using-cesiumjs-skills` 是它们的入口 —— 由 `using-anovgis` 自动转过去,你一般不用直接调用。
package/RELEASING.md CHANGED
@@ -79,18 +79,20 @@ node scripts/bump.mjs --check # 校验所有版本位一致(发版前自检
79
79
  10. **结构自检**:`node scripts/check-structure.mjs` —— 相对链接 / 锚点 / frontmatter / 章节完整性,不一致就 exit 1
80
80
  11. **npm 包自检**:`node scripts/build-npm.mjs` —— 校验两棵 skill 树的相对链接、无本机绝对路径、vendor 齐全(15 个 skill + LICENSE + NOTICE),不一致就 exit 1
81
81
  11b. **vendor 一致性**(改动过 Cesium skill 时):`node scripts/sync-cesium.mjs --check` —— vendor 与内网镜像不一致就 exit 1;需要更新时去掉 `--check` 重新同步,并核对 `vendor/cesiumjs-skills/NOTICE` 里的版本号
82
- 12. `git commit -am "feat: v<X.Y.Z> — ..."` + `git push`
83
- 13. **手工补 GitLab 侧产物**(本仓库不跑 CI,这步要人工做):打 `anov-gis-skills--v<版本>` tag,见 §四
82
+ 12. **提交推送**:用 `npm run release` 时自动完成 —— 只 `git add` bump 改写的发版文件后 commit + push(`--no-commit` 可只改文件不提交)。手工流程则 `git add` 发版文件 + `git commit -m "chore: release v<X.Y.Z>"` + `git push`
83
+ 13. **打 tag**:用 `npm run release` 时自动打 `anov-gis-skills--v<版本>` 注解 tag 并推送;不走 release 时按 §四 手工打
84
84
  14. **发 npm 包**(方式 A 的分发源):`npm publish` —— 发到哪由仓库根 `.npmrc` 决定(内网 / 公网),见 §五
85
85
  15. **验证已发布的包**:`node scripts/verify-published.mjs` —— 确认可安装、内容与源码一致、CLI 能发现全部 skill、链接全解析,不一致就 exit 1
86
86
 
87
87
  > v0.2.15 起,第 8 步之前的手工改版本号(各 manifest + DOMAINS.md + DEMO-SKILL-MAP.md)全部由 `scripts/bump.mjs` 代劳,避免版本漂移。
88
+ >
89
+ > 用 `npm run release` 时,第 8–13 步(bump · 版本校验 · 结构校验 · npm 包校验 · 提交推送 · 打 tag)会一并自动执行;两道结构校验在写文件之前跑,失败则什么都不会改。
88
90
 
89
91
  ---
90
92
 
91
- ## 四、手工打的 tag
93
+ ## 四、tag
92
94
 
93
- 本仓库**不跑 CI**(内网 GitLab 上没有 runner),下面这步要人工执行。
95
+ 本仓库**不跑 CI**(内网 GitLab 上没有 runner),没有流水线帮你打 tag —— `npm run release` 会自动打并推送,手工发版时用下面的命令。
94
96
 
95
97
  **打 tag** —— 带版本约束的安装串(`"anov-gis-skills@anov-gis-skills@^0.3.0"`)靠这个 tag 解析版本,没有匹配 tag 会报 `no-matching-tag`:
96
98
 
@@ -39,11 +39,18 @@ const CESIUM_DIR = join(PKG_ROOT, "vendor", "cesiumjs-skills", "skills");
39
39
  const SKILLS_CLI = "skills@1.5.18";
40
40
 
41
41
  const MCP_PACKAGE = "anov-gis-mcp";
42
+ const DEFAULT_MCP_AGENTS = ["claude-code", "codex"];
43
+
44
+ // 用 npx 跑时脚本在 npm 缓存的 _npx 目录里,此时 `anov-gis-skills` 不在 PATH 上,
45
+ // 提示语必须给回 npx 形式,否则用户会撞上「不是内部或外部命令」。
46
+ const CLI_CMD = /[\\/]_npx[\\/]/.test(process.argv[1] ?? "")
47
+ ? "npx @anov/gis-skills-cli"
48
+ : "anov-gis-skills";
42
49
 
43
50
  // ---------------------------------------------------------------- 参数解析
44
51
 
45
52
  function parseArgs(argv) {
46
- const out = { _: [], agents: [], mcpArgs: [], unknown: [] };
53
+ const out = { _: [], agents: [], mcpAgents: [], mcpArgs: [], unknown: [] };
47
54
  for (let i = 0; i < argv.length; i++) {
48
55
  const a = argv[i];
49
56
  if (a === "-g" || a === "--global") out.scope = "global";
@@ -55,8 +62,11 @@ function parseArgs(argv) {
55
62
  else if (a === "--mcp") out.mcp = true;
56
63
  else if (a === "-a" || a === "--agent") {
57
64
  while (argv[++i] && !argv[i].startsWith("-")) out.agents.push(argv[i]);
58
- } else if (a === "--mcp-agent") out.mcpAgent = argv[++i];
59
- else if (a === "--mcp-mode") out.mcpMode = argv[++i];
65
+ } else if (a === "--mcp-agent") {
66
+ while (argv[i + 1] && !argv[i + 1].startsWith("-")) {
67
+ for (const v of argv[++i].split(",")) if (v.trim()) out.mcpAgents.push(v.trim());
68
+ }
69
+ } else if (a === "--mcp-mode") out.mcpMode = argv[++i];
60
70
  else if (a === "--mcp-url") out.mcpUrl = argv[++i];
61
71
  else if (a === "--mcp-command") out.mcpCommand = argv[++i];
62
72
  else if (a === "--mcp-arg") {
@@ -68,26 +78,26 @@ function parseArgs(argv) {
68
78
  return out;
69
79
  }
70
80
 
71
- const HELP = `anov-gis-skills —— 装 skill + 接 MCP
81
+ const HELP = `${CLI_CMD} —— 装 skill + 接 MCP
72
82
 
73
83
  用法
74
- anov-gis-skills setup 装全部 skill(默认顺带写 MCP 配置)
75
- anov-gis-skills mcp add 只写 MCP 配置
76
- anov-gis-skills mcp remove 删掉 MCP 配置
77
- anov-gis-skills mcp show 看 MCP 配置状态
78
- anov-gis-skills doctor 自检(skill 完整性 + MCP 配置)
79
- anov-gis-skills uninstall 清理(只删本包与本 MCP 的东西)
84
+ ${CLI_CMD} setup 装全部 skill(默认顺带写 MCP 配置)
85
+ ${CLI_CMD} mcp add 只写 MCP 配置
86
+ ${CLI_CMD} mcp remove 删掉 MCP 配置
87
+ ${CLI_CMD} mcp show 看 MCP 配置状态
88
+ ${CLI_CMD} doctor 自检(skill 完整性 + MCP 配置)
89
+ ${CLI_CMD} uninstall 清理(只删本包与本 MCP 的东西)
80
90
 
81
91
  通用选项
82
92
  --scope global|project 装到哪(默认 global = 用户级,任何项目都能用)
83
93
  -g, --global 等价于 --scope global
84
94
  --project 等价于 --scope project
85
- -a, --agent <名字...> 只装给指定智能体(默认全部检测到的)
95
+ -a, --agent <名字...> 只装给指定智能体(默认:共享目录 + 已装的 Claude Code)
86
96
  -y, --yes 跳过所有交互
87
97
  --print 只打印要写的内容,不落盘
88
98
 
89
99
  MCP 选项
90
- --mcp-agent <名字> 写到哪个智能体(${SUPPORTED_AGENTS.join(" / ")},默认 claude-code)
100
+ --mcp-agent <名字...> 写到哪个智能体(${SUPPORTED_AGENTS.join(" / ")};默认 claude-code + codex)
91
101
  --mcp-mode stdio|http 连接方式(默认 stdio)
92
102
  --mcp-url <地址> HTTP 模式的服务地址(stdio 模式不需要)
93
103
  --mcp-command <命令> stdio 模式的启动命令(默认 npx)
@@ -129,14 +139,23 @@ function scopeFlags(scope) {
129
139
  return scope === "global" ? ["--global"] : [];
130
140
  }
131
141
 
142
+ // 上游的自动检测会把 57 个 universal 系智能体全拉进来,其中 PromptScript 没有全局
143
+ // 目录却仍在名单里,每个 skill 刷一条 Failed。所以这里只显式点名:
144
+ // 共享目录 .agents/skills(universal 系智能体本来就读这里)+ 实际存在的 Claude Code。
145
+ function defaultSkillAgents() {
146
+ return existsSync(join(homedir(), ".claude")) ? ["claude-code"] : ["universal"];
147
+ }
148
+
149
+ // 传 [] 时不加 --agent:remove 的上游语义是从所有智能体删,正好用来清旧的 symlink。
132
150
  function targetFlags(agents) {
133
- return agents.length ? ["--agent", ...agents] : ["--all"];
151
+ return agents.length ? ["--agent", ...agents] : [];
134
152
  }
135
153
 
136
154
  // ---------------------------------------------------------------- setup
137
155
 
138
156
  function cmdSetup(opts) {
139
157
  const scope = opts.scope ?? "global";
158
+ const agents = opts.agents.length ? opts.agents : defaultSkillAgents();
140
159
  const anov = skillNames(SKILLS_DIR);
141
160
  const cesium = skillNames(CESIUM_DIR);
142
161
 
@@ -153,10 +172,11 @@ function cmdSetup(opts) {
153
172
  console.log(` anov-gis ${anov.length} 个`);
154
173
  console.log(` cesiumjs ${cesium.length} 个`);
155
174
  console.log(` 范围 ${scope === "global" ? "用户级(任何项目可用)" : "项目级(当前目录)"}`);
175
+ console.log(` 智能体 ${agents.join(", ")}`);
156
176
 
157
177
  for (const [label, dir] of [["anov-gis", SKILLS_DIR], ["cesiumjs", CESIUM_DIR]]) {
158
178
  console.log(`\n── ${label} ──`);
159
- const code = runSkillsCLI(["add", dir, ...targetFlags(opts.agents), ...scopeFlags(scope), "-y"]);
179
+ const code = runSkillsCLI(["add", dir, "--agent", ...agents, ...scopeFlags(scope), "-y"]);
160
180
  if (code !== 0) {
161
181
  console.error(`✗ ${label} 安装失败(退出码 ${code})`);
162
182
  process.exit(code);
@@ -165,7 +185,6 @@ function cmdSetup(opts) {
165
185
 
166
186
  if (!opts.noMcp) {
167
187
  const mode = opts.mcpMode ?? "stdio";
168
- const agent = opts.mcpAgent ?? "claude-code";
169
188
  const config = buildServerConfig({
170
189
  mode,
171
190
  url: opts.mcpUrl,
@@ -173,32 +192,74 @@ function cmdSetup(opts) {
173
192
  args: opts.mcpArgs.length ? opts.mcpArgs : undefined,
174
193
  env: collectEnv(),
175
194
  });
176
- writeMcp(agent, scope, config, opts.print);
195
+ writeMcp(mcpAgents(opts), scope, config, { printOnly: opts.print, strict: opts.mcpAgents.length > 0 });
177
196
  }
178
197
 
179
198
  console.log("\n✓ 完成");
180
199
  if (!opts.noMcp) {
181
- console.log(" 验证:anov-gis-skills doctor");
200
+ console.log(` 验证:${CLI_CMD} doctor`);
182
201
  }
183
202
  }
184
203
 
185
204
  // ---------------------------------------------------------------- MCP
186
205
 
187
- function mcpTargets(agent, scope) {
188
- const targets = agentTargets(agent, scope);
189
- if (!targets.length) {
190
- console.error(`✗ ${agent} 不支持 ${scope} 级配置`);
191
- console.error(` 支持的智能体:${SUPPORTED_AGENTS.join(" / ")}`);
192
- process.exit(1);
206
+ /** 默认 Claude Code + Codex;`--mcp-agent` 指定时只用指定的那些。 */
207
+ function mcpAgents(opts) {
208
+ return opts.mcpAgents.length ? opts.mcpAgents : DEFAULT_MCP_AGENTS;
209
+ }
210
+
211
+ /**
212
+ * strict = 用户显式点名了智能体:不支持当前 scope 就直接报错。
213
+ * 默认集合则静默跳过(如 Codex 没有项目级配置),不算失败。
214
+ */
215
+ function mcpTargets(agents, scope, strict) {
216
+ const out = [];
217
+ for (const agent of agents) {
218
+ if (!SUPPORTED_AGENTS.includes(agent)) {
219
+ console.error(`✗ 不支持的智能体:${agent}(可用:${SUPPORTED_AGENTS.join(" / ")})`);
220
+ process.exit(2);
221
+ }
222
+ const targets = agentTargets(agent, scope);
223
+ if (!targets.length) {
224
+ if (strict) {
225
+ console.error(`✗ ${agent} 不支持 ${scope === "global" ? "用户级" : "项目级"}配置`);
226
+ process.exit(1);
227
+ }
228
+ continue;
229
+ }
230
+ out.push(...targets);
231
+ }
232
+ return out;
233
+ }
234
+
235
+ /** --print 的片段按目标格式输出:Codex 是 TOML,其余是 JSON。 */
236
+ function printTarget(target, config) {
237
+ console.log(`\n# ${target.label} → ${target.file}`);
238
+ if (target.key !== null) {
239
+ console.log(JSON.stringify({ [target.key]: { [MCP_SERVER_NAME]: config } }, null, 2));
240
+ return;
241
+ }
242
+ const toml = (v) =>
243
+ typeof v === "string"
244
+ ? `"${v.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`
245
+ : Array.isArray(v)
246
+ ? `[${v.map(toml).join(", ")}]`
247
+ : String(v);
248
+ const lines = [`[mcp_servers.${MCP_SERVER_NAME}]`];
249
+ for (const [k, v] of Object.entries(config)) {
250
+ if (k !== "env") lines.push(`${k} = ${toml(v)}`);
251
+ }
252
+ if (config.env) {
253
+ lines.push("", `[mcp_servers.${MCP_SERVER_NAME}.env]`);
254
+ for (const [k, v] of Object.entries(config.env)) lines.push(`${k} = ${toml(v)}`);
193
255
  }
194
- return targets;
256
+ console.log(lines.join("\n"));
195
257
  }
196
258
 
197
- function writeMcp(agent, scope, config, printOnly) {
198
- for (const target of mcpTargets(agent, scope)) {
259
+ function writeMcp(agents, scope, config, { printOnly = false, strict = false } = {}) {
260
+ for (const target of mcpTargets(agents, scope, strict)) {
199
261
  if (printOnly) {
200
- console.log(`\n# ${target.label} → ${target.file}`);
201
- console.log(JSON.stringify({ mcpServers: { [MCP_SERVER_NAME]: config } }, null, 2));
262
+ printTarget(target, config);
202
263
  continue;
203
264
  }
204
265
  writeServer(target, MCP_SERVER_NAME, config);
@@ -209,10 +270,11 @@ function writeMcp(agent, scope, config, printOnly) {
209
270
  function cmdMcp(opts) {
210
271
  const action = opts._[0] ?? "show";
211
272
  const scope = opts.scope ?? "global";
212
- const agent = opts.mcpAgent ?? "claude-code";
273
+ const agents = mcpAgents(opts);
274
+ const strict = opts.mcpAgents.length > 0;
213
275
 
214
276
  if (action === "show") {
215
- for (const target of mcpTargets(agent, scope)) {
277
+ for (const target of mcpTargets(agents, scope, strict)) {
216
278
  const existing = readServer(target, MCP_SERVER_NAME);
217
279
  console.log(`\n${target.label} —— ${target.file}`);
218
280
  if (!existing) {
@@ -225,7 +287,7 @@ function cmdMcp(opts) {
225
287
  }
226
288
 
227
289
  if (action === "remove") {
228
- for (const target of mcpTargets(agent, scope)) {
290
+ for (const target of mcpTargets(agents, scope, strict)) {
229
291
  const r = removeServer(target, MCP_SERVER_NAME);
230
292
  console.log(r.removed ? ` ✓ 已删除:${target.file}` : ` · 本来就没有:${target.file}`);
231
293
  }
@@ -246,7 +308,7 @@ function cmdMcp(opts) {
246
308
  env: collectEnv(),
247
309
  });
248
310
  console.log(`\n接入 MCP(${mode})`);
249
- writeMcp(agent, scope, config, opts.print);
311
+ writeMcp(agents, scope, config, { printOnly: opts.print, strict });
250
312
  if (!opts.print) console.log("\n✓ 完成。重启智能体生效。");
251
313
  }
252
314
 
@@ -326,14 +388,14 @@ function cmdDoctor(opts) {
326
388
  if (existing) {
327
389
  console.log(` ✓ 已配置(${existing.type ?? "unknown"})`);
328
390
  } else {
329
- console.log(" · 未配置 —— anov-gis-skills mcp add");
391
+ console.log(` · 未配置 —— ${CLI_CMD} mcp add`);
330
392
  }
331
393
  }
332
394
  }
333
395
 
334
396
  console.log("");
335
397
  if (problems) {
336
- console.error(`✗ 发现 ${problems} 处问题 —— 重装:anov-gis-skills setup\n`);
398
+ console.error(`✗ 发现 ${problems} 处问题 —— 重装:${CLI_CMD} setup\n`);
337
399
  process.exit(1);
338
400
  }
339
401
  console.log("✓ 检查通过\n");
@@ -357,8 +419,8 @@ function cmdUninstall(opts) {
357
419
  process.exit(code);
358
420
  }
359
421
 
360
- const agent = opts.mcpAgent ?? "claude-code";
361
- for (const target of mcpTargets(agent, scope)) {
422
+ const agents = mcpAgents(opts);
423
+ for (const target of mcpTargets(agents, scope, opts.mcpAgents.length > 0)) {
362
424
  const r = removeServer(target, MCP_SERVER_NAME);
363
425
  console.log(r.removed ? ` ✓ 已删除 MCP 条目:${target.file}` : ` · 没有 MCP 条目:${target.file}`);
364
426
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anov/gis-skills-cli",
3
- "version": "0.3.0",
3
+ "version": "0.3.3",
4
4
  "description": "12 个 @anov/gis (Cesium 1.143) 领域 skill + 15 个 Cesium 原生 skill,外加 anov-gis-mcp 的接入配置。一条命令装到 Claude Code / Codex / Cursor 等智能体。",
5
5
  "type": "module",
6
6
  "license": "ISC AND Apache-2.0",
@@ -38,6 +38,7 @@
38
38
  "cursor"
39
39
  ],
40
40
  "scripts": {
41
+ "release": "node scripts/release.cjs",
41
42
  "prepublishOnly": "node scripts/bump.mjs --check && node scripts/check-structure.mjs",
42
43
  "pack:check": "node scripts/build-npm.mjs"
43
44
  }
@@ -1,7 +1,7 @@
1
1
  # DEMO-SKILL-MAP.md — 137 个 demo → Skill 路由矩阵
2
2
 
3
3
  > **SDK 版本基准:** @anov/gis v1.8.6(基于 Cesium 1.143.0)
4
- > **Plugin 版本:** anov-gis-skills v0.3.0
4
+ > **Plugin 版本:** anov-gis-skills v0.3.3
5
5
  > **Demo 来源:** ANOV-GIS 仓库 `examples/public/examples/html/`(仓库内相对路径)共 137 个 .html 文件,按 13 类目分组
6
6
 
7
7
  本文档是 demo **文件名** → skill 的**完整版**路由矩阵(`using-anovgis/DEMO-MAP.md` 是场景级的简版)。当用户提到具体 demo 文件名或场景时,按本表路由到对应 skill。
@@ -1,7 +1,7 @@
1
1
  # DOMAINS.md — anov-gis-skills 权威归属
2
2
 
3
3
  > **SDK 版本基准:** @anov/gis **v1.8.6**(基于 Cesium **1.143.0**)
4
- > **Plugin 版本:** anov-gis-skills **v0.3.0**
4
+ > **Plugin 版本:** anov-gis-skills **v0.3.3**
5
5
  > **Skill 数:** **12**(含 `using-anovgis` 入口 + 3 个 v0.2.0 新增 skill)
6
6
  > **入口 skill 额外职责**:引导式初始化(AskUserQuestion 向导:底图 / 控件 / 部署;**技术栈固定 Vue 3 + Vite**)
7
7