@cloudglab/confluence-cli 0.0.5 → 0.0.7

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
@@ -2,6 +2,34 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## Unreleased
6
+
7
+ ## 0.0.7 - 2026-06-17
8
+
9
+ ### 修复
10
+
11
+ - `install` / `update` 默认重新改回把 Confluence skill 安装到 user-level 全局目录,对齐 `zentao-cli`;如需改回当前项目目录,可显式传 `--skill-global false`。
12
+ - 安装成功提示中的 ASCII banner 调整为固定多行模板,减少终端里因行宽不一致造成的视觉偏移。
13
+
14
+ ### 测试
15
+
16
+ - `tests/install.test.ts` 同步默认全局安装、npm 包回退安装,以及 `--skill-global false` 切回项目级安装的断言。
17
+
18
+ ## 0.0.6 - 2026-06-17
19
+
20
+ ### 变更
21
+
22
+ - Mermaid 图片渲染从 `mmd-cli` 切换为 `beautiful-mermaid-cli` 的 `bm render`,默认 PNG/SVG 渲染不再依赖本机 Chrome、Chromium、Puppeteer 或原生编译工具链。
23
+ - `install` / `update` 改为通过 `npm install -g beautiful-mermaid-cli@latest` 安装 Mermaid 渲染器,不再执行 `raw.githubusercontent.com` 上的 `curl | sh` 安装脚本。
24
+ - 项目运行要求从 Node.js 18+ 提升到 Node.js 20+,与 `beautiful-mermaid-cli` 的运行时要求保持一致。
25
+ - 对齐 `zentao-cli` 的通用账号命令,新增 `whoami`、`who-am-i`,并支持 `confluence who am i` 口语化输入,均复用 `getCurrentUser` 查询当前 Confluence 账号。
26
+
27
+ ### 测试
28
+
29
+ - `tests/install.test.ts` 同步断言新的 `beautiful-mermaid-cli` 安装链路,并保留安装失败不阻断主流程的回归覆盖。
30
+ - `tests/tools/transfer.test.ts` 同步校验 `bm render <file> -o <png> --json --scale 3` 调用参数。
31
+ - `tests/cli.test.ts` 和 `tests/tools/spaces.test.ts` 覆盖 `whoami` / `who-am-i` 注册、命令列表展示和 `who am i` 归一化。
32
+
5
33
  ## 0.0.5 - 2026-06-17
6
34
 
7
35
  ### 修复
package/README.md CHANGED
@@ -21,13 +21,15 @@ pnpm test
21
21
  pnpm release:smoke-query --dry-run
22
22
  ```
23
23
 
24
- 从 `0.0.4` 起,Mermaid 渲染不再依赖 `@mermaid-js/mermaid-cli`。CLI 安装/更新时会自动安装 `coolamit/mermaid-cli` 提供的原生二进制 `mmd-cli`,避开 Puppeteer/Chrome 下载链路,并在卸载时清理常见安装位置下的 `mmd-cli` 二进制。
24
+ Mermaid 渲染默认使用 `beautiful-mermaid-cli` `bm` 命令。它通过纯 JS + WASM 渲染 SVG/PNG,不依赖 Chrome、Chromium、Puppeteer 或原生编译工具链;安装/更新时会自动执行 `npm install -g beautiful-mermaid-cli@latest`。
25
25
 
26
- `mmd-cli` 运行时仍需要系统已有 Chrome/Chromium;如果机器完全没有浏览器,可在上传时传 `--mermaid none`,保留 Mermaid 代码块。
26
+ 由于 `beautiful-mermaid-cli` 要求 Node.js 20+,本项目运行要求也同步提升到 Node.js 20+。如果自动安装失败,上传时仍可传 `--mermaid none` 保留 Mermaid 代码块。
27
27
 
28
- `0.0.5` 起,`install` / `update` 在以下两种情况会**继续完成安装**而不是中断:
28
+ 当前版本还补齐了 `zentao-cli` 风格的账号快捷命令:`confluence whoami`、`confluence who-am-i`,以及口语化输入 `confluence who am i`。
29
29
 
30
- - `mmd-cli` 官方安装脚本因网络问题失败时,会打印 `已跳过 mmd-cli 安装:<原因>` 与 `后续如需 Mermaid 图片渲染,可稍后重试安装,或在上传时传 --mermaid none 保留代码块。`。
30
+ `install` / `update` 在以下情况会**继续完成安装**而不是中断:
31
+
32
+ - `beautiful-mermaid-cli` 安装失败时,会打印 `已跳过 beautiful-mermaid-cli 安装:<原因>` 与 `后续如需 Mermaid 图片渲染,可稍后重试安装,或在上传时传 --mermaid none 保留代码块。`。
31
33
  - 全局包内 `skills/confluence-cli` 缺失时,会打印 `未找到已安装包内的 Confluence skill:<path>,正在自动回退到 npm 包解压安装...` 并自动用 `npm pack` + `tar` + `npx -y skills add` 完成 skill 安装,无需手动切换 `--skill-source npm`。
32
34
 
33
35
  安装/更新入口:
@@ -41,7 +43,7 @@ confluence-reader list
41
43
  confluence-writer list
42
44
  ```
43
45
 
44
- > `install` / `update` 默认走 `vercel-labs/skills` 推荐的项目级安装(`cwd` agent skills 目录,兼容所有 agent,包括不支持全局的 PromptScript)。需要 user-level 全局时显式传 `--skill-global`(仅当 agent 支持,如 Claude Code / Cursor / OpenCode)。`confluence uninstall --confirm true` 会同时清理项目级与全局级残留。
46
+ > `install` / `update` 默认会把 Confluence skill 安装到 user-level 全局目录,行为对齐 `zentao-cli`。如需改回当前项目目录,可显式传 `--skill-global false`。`confluence uninstall --confirm true` 会同时清理项目级与全局级残留。
45
47
 
46
48
  卸载入口(默认仅打印卸载计划,真实执行需显式确认):
47
49
 
@@ -71,6 +73,7 @@ CLI 会按顺序查找:显式 `envFile`、环境变量、当前/父目录 `.en
71
73
 
72
74
  ```bash
73
75
  confluence list
76
+ confluence whoami
74
77
  confluence searchContent --cql 'space = "DEV" AND text ~ "API"'
75
78
  confluence getContent --id 123456
76
79
  confluence listRestApis --group content
@@ -141,7 +144,7 @@ CONFLUENCE_SKIP_UPDATE_CHECK=true
141
144
  - Confluence 7.13.7 全量 REST API 端点注册与通用调用
142
145
  - MCP 页面/子页/评论/标签能力的语义化 CLI 命令
143
146
  - Markdown 转 Confluence Wiki Markup
144
- - Markdown/HTML 上传时默认用 `mmd-cli` 将 Mermaid 渲染为 PNG 附件并以内置图片宏展示,必要时可用 `--mermaid none` 保留原代码块
147
+ - Markdown/HTML 上传时默认用 `beautiful-mermaid-cli` 将 Mermaid 渲染为 PNG 附件并以内置图片宏展示,必要时可用 `--mermaid none` 保留原代码块
145
148
  - mark 风格 metadata 生成
146
149
  - Markdown 上传预览、确认写入和附件上传
147
150
  - 页面下载为带 frontmatter 的 Markdown,并可下载附件和一层子页
package/dist/cli.js CHANGED
@@ -149,6 +149,17 @@ function parseCli(argv) {
149
149
  role = value;
150
150
  args.splice(roleIndex, 2);
151
151
  }
152
- return { command: args[0], commandArgs: args.slice(1), role };
152
+ const normalized = normalizeCommandAlias(args[0], args.slice(1));
153
+ return {
154
+ command: normalized.command,
155
+ commandArgs: args.slice(1 + normalized.consumedArgs),
156
+ role,
157
+ };
158
+ }
159
+ function normalizeCommandAlias(command, args) {
160
+ if (command === "who" && args[0] === "am" && args[1] === "i") {
161
+ return { command: "whoami", consumedArgs: 2 };
162
+ }
163
+ return { command, consumedArgs: 0 };
153
164
  }
154
165
  //# sourceMappingURL=cli.js.map
@@ -23,6 +23,9 @@ const COMMAND_DESCRIPTIONS = {
23
23
  searchSpace: "搜索 Confluence 空间",
24
24
  listSpaces: "列出 Confluence 空间",
25
25
  getSpace: "获取空间详情",
26
+ getCurrentUser: "输出当前账号原始资料",
27
+ whoami: "查看当前 Confluence 账号",
28
+ "who-am-i": "whoami 的别名",
26
29
  searchContent: "使用 CQL 搜索内容",
27
30
  getContent: "获取页面或博客内容",
28
31
  createContent: "创建 Confluence 内容",
@@ -46,7 +49,7 @@ export function printHelp(role, commandNames) {
46
49
  "",
47
50
  `当前 role: ${role}`,
48
51
  "适配版本:Confluence Data Center / Server REST API。",
49
- "运行要求:Node.js >= 18",
52
+ "运行要求:Node.js >= 20",
50
53
  "",
51
54
  "用法:",
52
55
  " confluence [--role full|reader|writer] <command> [--key value]",
@@ -56,6 +59,7 @@ export function printHelp(role, commandNames) {
56
59
  "快速开始:",
57
60
  " confluence list 查看全部可用命令(推荐)",
58
61
  " confluence help <command> 查看命令参数",
62
+ " confluence whoami 校验当前账号",
59
63
  " confluence initConfluence 初始化或校验连接配置",
60
64
  " confluence version 查看版本",
61
65
  " confluence changelog 查看最近更新",
@@ -99,7 +103,7 @@ export function printCommandList(role, commandNames, builtinCommandNames = BUILT
99
103
  }
100
104
  lines.push("");
101
105
  }
102
- lines.push("下一步:", " - 查看参数:confluence help <command>,例如 confluence help searchContent", " - 初始化配置:confluence initConfluence", " - 查看脚本友好命令名:confluence list --raw", " - 切换角色命令集:confluence --role reader list 或 confluence --role writer list", "");
106
+ lines.push("下一步:", " - 查看参数:confluence help <command>,例如 confluence help searchContent", " - 快速校验账号:confluence whoami", " - 初始化配置:confluence initConfluence", " - 查看脚本友好命令名:confluence list --raw", " - 切换角色命令集:confluence --role reader list 或 confluence --role writer list", "");
103
107
  process.stdout.write(lines.join("\n"));
104
108
  }
105
109
  export function getBuiltinCommandHelp(commandName) {
@@ -210,7 +214,7 @@ export function renderCommandHelp(registry, name) {
210
214
  }
211
215
  function buildCommandGroups(commandNames) {
212
216
  const groups = [
213
- { title: "开始使用", match: (name) => ["changelog", "help", "list", "version", "install", "update", "upgrade", "uninstall", "remove", "initConfluence"].includes(name), commands: [] },
217
+ { title: "开始使用", match: (name) => ["changelog", "help", "list", "version", "install", "update", "upgrade", "uninstall", "remove", "initConfluence", "whoami", "who-am-i", "getCurrentUser"].includes(name), commands: [] },
214
218
  { title: "内容检索 / 页面", match: (name) => /Content|Page|searchContent|getContent/.test(name), commands: [] },
215
219
  { title: "上传 / 下载 / 附件", match: (name) => /Upload|Download|Attachment|upload|download/.test(name), commands: [] },
216
220
  { title: "空间 / 标签", match: (name) => /Space|Label/.test(name), commands: [] },
@@ -226,6 +230,7 @@ function buildCommandGroups(commandNames) {
226
230
  }
227
231
  function getRecommendedCommands(commandNames) {
228
232
  const candidates = [
233
+ { name: "whoami", description: "校验当前账号" },
229
234
  { name: "initConfluence", description: "初始化或校验连接配置" },
230
235
  { name: "searchContent", description: "使用 CQL 搜索页面/博客" },
231
236
  { name: "getContent", description: "读取 Confluence 内容" },
@@ -14,6 +14,8 @@ export const commandToGroup = {
14
14
  "getCurrentUser": "space",
15
15
  "getSpace": "space",
16
16
  "listSpaces": "space",
17
+ "who-am-i": "space",
18
+ "whoami": "space",
17
19
  "addComment": "content",
18
20
  "deleteContent": "content",
19
21
  "findContent": "content",
@@ -57,7 +59,9 @@ export const groupCommands = {
57
59
  "convertContentBody",
58
60
  "getCurrentUser",
59
61
  "getSpace",
60
- "listSpaces"
62
+ "listSpaces",
63
+ "who-am-i",
64
+ "whoami"
61
65
  ],
62
66
  "content": [
63
67
  "addComment",
package/dist/install.js CHANGED
@@ -7,7 +7,7 @@ import { loadConfluenceConfig, normalizeConfig, saveConfig } from "./core/config
7
7
  import { writeUpdateCacheAfterInstall } from "./update-probe.js";
8
8
  const PACKAGE_NAME = "@cloudglab/confluence-cli";
9
9
  const GIT_SKILL_SOURCE = "cloudglab/confluence-cli";
10
- const MMD_CLI_INSTALL_URL = "https://raw.githubusercontent.com/coolamit/mermaid-cli/master/install.sh";
10
+ const MERMAID_RENDERER_PACKAGE = "beautiful-mermaid-cli";
11
11
  export async function runInstallCommand(args = []) {
12
12
  const options = parseInstallOptions(args);
13
13
  await installPackageAndSkill("安装", options);
@@ -56,8 +56,8 @@ function printSuccessGuide(action, status) {
56
56
  常用配置:
57
57
  confluence update 更新 CLI 和 Skill
58
58
  confluence install --skip-config-check 仅安装,跳过配置校验
59
- confluence install --skill-global 把 skill 装到 user-level 全局目录
60
- mmd-cli --version 检查 Mermaid 渲染器
59
+ confluence install --skill-global false 把 skill 改为装到当前项目目录
60
+ bm doctor --json 检查 Mermaid 渲染器
61
61
  CONFLUENCE_DISABLE_WRITE=true 禁用真实写操作
62
62
 
63
63
  写操作提示:真实写入仍需显式传 confirm=true。
@@ -66,7 +66,7 @@ function printSuccessGuide(action, status) {
66
66
  function parseInstallOptions(args) {
67
67
  let skillSource = "local";
68
68
  let skillLocalPath;
69
- let skillGlobal = false;
69
+ let skillGlobal = true;
70
70
  let skipConfigCheck = false;
71
71
  let cliOnly = false;
72
72
  let skillOnly = false;
@@ -160,7 +160,7 @@ function parseUninstallOptions(args) {
160
160
  function printUninstallPreview(options) {
161
161
  const steps = [
162
162
  ...(!options.cliOnly ? ["卸载 confluence skill(项目级和全局级)"] : []),
163
- ...(!options.skillOnly ? ["卸载全局 CLI 包、清理 npm 残留目录,并删除 mmd-cli 二进制"] : []),
163
+ ...(!options.skillOnly ? ["卸载全局 CLI 包、清理 npm 残留目录,并卸载 Mermaid 渲染器"] : []),
164
164
  ...(shouldRemoveConfig(options) ? ["删除 ~/.confluence/config.json"] : ["保留 ~/.confluence/config.json"]),
165
165
  ];
166
166
  process.stdout.write(`卸载预览:\n${steps.map((step) => ` - ${step}`).join("\n")}\n\n真实执行请运行:\n confluence uninstall --confirm true\n npx -y ${PACKAGE_NAME}@latest uninstall --confirm true\n\n可选参数:\n --keep-config true 保留 Confluence 配置\n --cli-only true 只卸载 CLI\n --skill-only true 只卸载 skill\n`);
@@ -168,10 +168,9 @@ function printUninstallPreview(options) {
168
168
  function shouldRemoveConfig(options) {
169
169
  return !options.keepConfig && !options.cliOnly && !options.skillOnly;
170
170
  }
171
- function createSkillAddArgs(source, global = false) {
172
- // 默认走 vercel-labs/skills 推荐的项目级(cwd 下 agent skills 目录),
173
- // 兼容所有 agent(包括不支持 --global 的,如 PromptScript)。
174
- // 用户明确需要 user-level 全局时再通过 --skill-global 显式开启。
171
+ function createSkillAddArgs(source, global = true) {
172
+ // 默认对齐 zentao-cli,优先安装到 user-level 全局目录。
173
+ // 如需改为当前项目目录,可显式传 --skill-global false。
175
174
  return ["-y", "skills", "add", source, ...(global ? ["--global"] : []), "--yes"];
176
175
  }
177
176
  function createSkillRemoveArgs(global = false) {
@@ -224,7 +223,7 @@ async function installPackageAndSkill(action, options) {
224
223
  if (!options.skillOnly) {
225
224
  await cleanupGlobalPackageResidues();
226
225
  await installGlobalCli(action);
227
- await installMmdCli(action);
226
+ await installMermaidRenderer(action);
228
227
  }
229
228
  if (!options.cliOnly) {
230
229
  await installSkill(action, options);
@@ -245,13 +244,13 @@ async function installGlobalCli(action) {
245
244
  await runStep(`${action} Confluence CLI`, "npm", args);
246
245
  }
247
246
  }
248
- async function installMmdCli(action) {
247
+ async function installMermaidRenderer(action) {
249
248
  try {
250
- await runStep(`${action} Mermaid 原生渲染器 mmd-cli`, "sh", ["-c", `curl -fsSL ${MMD_CLI_INSTALL_URL} | sh`]);
249
+ await runStep(`${action} Mermaid 免浏览器渲染器 beautiful-mermaid-cli`, "npm", ["install", "-g", `${MERMAID_RENDERER_PACKAGE}@latest`]);
251
250
  }
252
251
  catch (error) {
253
252
  const message = error instanceof Error ? error.message : String(error);
254
- process.stdout.write(`已跳过 mmd-cli 安装:${message}\n`);
253
+ process.stdout.write(`已跳过 beautiful-mermaid-cli 安装:${message}\n`);
255
254
  process.stdout.write("后续如需 Mermaid 图片渲染,可稍后重试安装,或在上传时传 --mermaid none 保留代码块。\n");
256
255
  }
257
256
  }
@@ -326,11 +325,16 @@ async function uninstallSkill() {
326
325
  async function uninstallPackage() {
327
326
  await runStep("卸载 Confluence CLI", "npm", ["uninstall", "-g", PACKAGE_NAME]);
328
327
  await cleanupGlobalPackageResidues();
329
- await removeMmdCliBinary();
328
+ await uninstallMermaidRenderer();
330
329
  }
331
- async function removeMmdCliBinary() {
332
- await rm(path.join(os.homedir(), ".local", "bin", "mmd-cli"), { force: true });
333
- await rm("/usr/local/bin/mmd-cli", { force: true });
330
+ async function uninstallMermaidRenderer() {
331
+ try {
332
+ await runStep("卸载 Mermaid 免浏览器渲染器 beautiful-mermaid-cli", "npm", ["uninstall", "-g", MERMAID_RENDERER_PACKAGE]);
333
+ }
334
+ catch (error) {
335
+ const message = error instanceof Error ? error.message : String(error);
336
+ process.stdout.write(`已跳过 beautiful-mermaid-cli 卸载:${message}\n`);
337
+ }
334
338
  }
335
339
  async function cleanupGlobalPackageResidues() {
336
340
  const globalNodeModules = (await runCommandOutput("npm", ["root", "-g"])).trim();
@@ -431,14 +435,13 @@ function createInstallEnv() {
431
435
  };
432
436
  }
433
437
  function renderBanner() {
434
- return [
435
- " ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ",
436
- " /\\ \\ /\\ \\ /\\__\\ /\\ \\ /\\__\\ /\\__\\ /\\ \\ /\\__\\ /\\ \\ /\\ \\ ",
437
- " /::\\ \\ /::\\ \\ /:| _|_ /::\\ \\ /:/ / /:/ _/_ /::\\ \\ /:| _|_ /::\\ \\ /::\\ \\ ",
438
- "/:/\\:\\__\\ /:/\\:\\__\\ /::|/\\__\\ /::\\:\\__\\ /:/__/ /:/_/\\__\\ /::\\:\\__\\ /::|/\\__\\ /:/\\:\\__\\ /::\\:\\__\\",
439
- "\\:\\ \/__/ \\:\\/:/ / \\/|::/ / \\/\\:\\/__/ \\:\\ \\ \\:\\/:/ / \\:\\:\\/ / \\/|::/ / \\:\\ \/__/ \\:\\:\\/ /",
440
- " \\:\\__\\ \\::/ / |:/ / \/__/ \\:\\__\\ \\::/ / \\:\\/ / |:/ / \\:\\__\\ \\:\\/ / ",
441
- " \/__/ \/__/ \/__/ \/__/ \/__/ \/__/ \/__/ \/__/ \/__/ ",
442
- ].join("\n");
438
+ return String.raw ` ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
439
+ /\ \ /\ \ /\__\ /\ \ /\__\ /\__\ /\ \ /\__\ /\ \ /\ \
440
+ /::\ \ /::\ \ /:| _|_ /::\ \ /:/ / /:/ _/_ /::\ \ /:| _|_ /::\ \ /::\ \
441
+ /:/\:\__\ /:/\:\__\ /::|/\__\ /::\:\__\ /:/__/ /:/_/\__\ /::\:\__\ /::|/\__\ /:/\:\__\ /::\:\__\
442
+ \:\ /__/ \:\/:/ / /|::/ / /\:\/__/ \:\ \ \:\/:/ / \:\:\/ / /|::/ / \:\ /__/ \:\:\/ /
443
+ \:\__\ \::/ / |:/ / /__/ \:\__\ \::/ / \:\/ / |:/ / \:\__\ \:\/ /
444
+ /__/ /__/ /__/ /__/ /__/ /__/ /__/ /__/ /__/
445
+ `;
443
446
  }
444
447
  //# sourceMappingURL=install.js.map
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.0.5",
2
+ "version": "0.0.7",
3
3
  "commands": [
4
4
  "addComment",
5
5
  "addLabels",
@@ -31,7 +31,9 @@
31
31
  "updateAttachment",
32
32
  "uploadAttachment",
33
33
  "uploadHtml",
34
- "uploadMarkdown"
34
+ "uploadMarkdown",
35
+ "who-am-i",
36
+ "whoami"
35
37
  ],
36
38
  "groups": {
37
39
  "init": [
@@ -58,7 +60,9 @@
58
60
  "convertContentBody",
59
61
  "getCurrentUser",
60
62
  "getSpace",
61
- "listSpaces"
63
+ "listSpaces",
64
+ "who-am-i",
65
+ "whoami"
62
66
  ],
63
67
  "content": [
64
68
  "addComment",
@@ -101,6 +105,8 @@
101
105
  "getCurrentUser": "space",
102
106
  "getSpace": "space",
103
107
  "listSpaces": "space",
108
+ "who-am-i": "space",
109
+ "whoami": "space",
104
110
  "addComment": "content",
105
111
  "deleteContent": "content",
106
112
  "findContent": "content",
@@ -2,15 +2,18 @@ import { z } from "zod";
2
2
  import { getApi } from "../core/api-provider.js";
3
3
  import { jsonResult } from "../utils/result.js";
4
4
  export function registerSpaceTools(registry) {
5
+ const getCurrentUser = async () => {
6
+ return jsonResult(await getApi().getCurrentUser());
7
+ };
5
8
  registry.tool("listSpaces", z.object({ limit: z.number().int().positive().max(100).default(25) }), async ({ limit }) => {
6
9
  return jsonResult(await getApi().listSpaces(limit));
7
10
  }, "List Confluence spaces");
8
11
  registry.tool("getSpace", z.object({ spaceKey: z.string() }), async ({ spaceKey }) => {
9
12
  return jsonResult(await getApi().getSpace(spaceKey));
10
13
  }, "Get one Confluence space by key");
11
- registry.tool("getCurrentUser", z.object({}), async () => {
12
- return jsonResult(await getApi().getCurrentUser());
13
- }, "Get current authenticated Confluence user");
14
+ registry.tool("getCurrentUser", z.object({}), getCurrentUser, "Get current authenticated Confluence user");
15
+ registry.tool("whoami", z.object({}), getCurrentUser, "Show current authenticated Confluence user");
16
+ registry.tool("who-am-i", z.object({}), getCurrentUser, "Alias of whoami");
14
17
  registry.tool("convertContentBody", z.object({ to: z.enum(["storage", "view", "export_view", "styled_view"]), value: z.string(), representation: z.enum(["wiki", "storage", "view"]).default("wiki") }), async ({ to, value, representation }) => {
15
18
  return jsonResult(await getApi().convertBody(to, { value, representation: representation ?? "wiki" }));
16
19
  }, "Convert Confluence content body representation");
@@ -382,29 +382,30 @@ function createMermaidFile(mermaidSource, pageTitle, sourceFile, idx, renderKind
382
382
  function renderMermaidFile(mermaidSource, outputFile, renderKind) {
383
383
  const inputFile = join(dirname(outputFile), `${basename(outputFile, extname(outputFile))}.mmd`);
384
384
  writeFileSync(inputFile, mermaidSource, "utf8");
385
- const mmdCli = resolveMmdCliBin();
386
- const args = ["-i", inputFile, "-o", outputFile, "-b", "transparent"];
385
+ const renderer = resolveBeautifulMermaidBin();
386
+ const args = ["render", inputFile, "-o", outputFile, "--json"];
387
387
  if (renderKind === "png") {
388
- args.push("-s", "3");
388
+ args.push("--scale", "3");
389
389
  }
390
390
  try {
391
- execFileSync(mmdCli, args, { stdio: "pipe" });
391
+ execFileSync(renderer, args, { stdio: "pipe" });
392
392
  }
393
393
  catch (error) {
394
394
  const message = error instanceof Error ? error.message : String(error);
395
- throw new Error(`Failed to render Mermaid as ${renderKind} with mmd-cli: ${message}`);
395
+ throw new Error(`Failed to render Mermaid as ${renderKind} with beautiful-mermaid-cli: ${message}`);
396
396
  }
397
397
  }
398
- function resolveMmdCliBin() {
399
- const extension = process.platform === "win32" ? ".exe" : "";
398
+ function resolveBeautifulMermaidBin() {
399
+ const extension = process.platform === "win32" ? ".cmd" : "";
400
400
  const candidates = [
401
- join(process.env.HOME ?? "", ".local", "bin", `mmd-cli${extension}`),
402
- "/usr/local/bin/mmd-cli",
401
+ join(process.env.HOME ?? "", ".npm-global", "bin", `bm${extension}`),
402
+ join(process.env.HOME ?? "", ".local", "bin", `bm${extension}`),
403
+ `/usr/local/bin/bm${extension}`,
403
404
  ];
404
405
  const found = candidates.find((candidate) => existsSync(candidate));
405
406
  if (found)
406
407
  return found;
407
- return `mmd-cli${extension}`;
408
+ return `bm${extension}`;
408
409
  }
409
410
  function safeFileName(value) {
410
411
  return value.replace(/[\\/:*?"<>|]/g, "_");
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const VERSION = "0.0.5";
1
+ export declare const VERSION = "0.0.7";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.0.5";
1
+ export const VERSION = "0.0.7";
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudglab/confluence-cli",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "Confluence REST CLI for agents and local automation",
5
5
  "repository": {
6
6
  "type": "git",
@@ -53,7 +53,7 @@
53
53
  "vitest": "^4.1.8"
54
54
  },
55
55
  "engines": {
56
- "node": ">=18"
56
+ "node": ">=20"
57
57
  },
58
58
  "publishConfig": {
59
59
  "access": "public"