@cloudglab/confluence-cli 0.0.2 → 0.0.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 +16 -6
- package/README.md +1 -1
- package/dist/core/cli-output.js +6 -4
- package/dist/install.js +22 -14
- package/dist/manifest.json +1 -1
- package/dist/tools/install.js +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,17 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
-
## 0.0.
|
|
5
|
+
## 0.0.3 - 2026-06-16
|
|
6
6
|
|
|
7
7
|
### Fixed
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
- `
|
|
9
|
+
- 撤掉 0.0.2 在 `npx -y skills add` 命令里默认追加的 `--global`。`vercel-labs/skills` 在 agent 内运行时本身就走项目级(`cwd` 下对应 agent 的 skills 目录),与 npx 临时目录是否被回收无关;强制传 `--global` 会让不支持全局安装的 agent(如 `PromptScript`,见 `vercel-labs/skills` `src/installer.ts`)直接报 `does not support global skill installation`。
|
|
10
|
+
- 新增 `--skill-global` opt-in 标记,用户明确需要 user-level 全局时通过 `confluence install --skill-global true` / `confluence update --skill-global true` 显式开启。`InstallOptions` 新增 `skillGlobal: boolean`(默认 `false`),CLI 工具层 schema 与 help 文本同步更新。
|
|
11
|
+
- `runUninstallCommand` 链路行为不变(仍同时清理项目级与全局级残留),0.0.2 升级到 0.0.3 不会丢清理路径。
|
|
11
12
|
|
|
12
|
-
###
|
|
13
|
+
### Tests
|
|
14
|
+
|
|
15
|
+
- `tests/install.test.ts` 回退 3 处 `npx -y skills add` 期望参数为 `--yes`(默认项目级),新增 `--skill-global true` 用例验证 opt-in 路径会追加 `--global`。
|
|
16
|
+
- `tests/cli.test.ts` / `tests/update-probe.test.ts` 硬编码版本号同步 0.0.2 → 0.0.3。
|
|
17
|
+
|
|
18
|
+
## 0.0.2 - 2026-06-16(已撤回)
|
|
19
|
+
|
|
20
|
+
> 0.0.2 在 `createSkillAddArgs` 里默认传 `--global`,对不支持全局的 agent 不可用,发布后已被 0.0.3 撤回。已通过 `npm deprecate` 标记,请直接升级到 0.0.3。
|
|
21
|
+
|
|
22
|
+
### Reverted by 0.0.3
|
|
13
23
|
|
|
14
|
-
-
|
|
15
|
-
-
|
|
24
|
+
- 撤掉 `createSkillAddArgs` 默认追加的 `--global`;改回 `--yes`(项目级)。
|
|
25
|
+
- `runUninstallCommand` 链路保持兼容。
|
|
16
26
|
|
|
17
27
|
## 0.0.1 - 2026-06-15
|
|
18
28
|
|
package/README.md
CHANGED
|
@@ -32,7 +32,7 @@ confluence-reader list
|
|
|
32
32
|
confluence-writer list
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
> `install` / `update`
|
|
35
|
+
> `install` / `update` 默认走 `vercel-labs/skills` 推荐的项目级安装(`cwd` 下 agent skills 目录,兼容所有 agent,包括不支持全局的 PromptScript)。需要 user-level 全局时显式传 `--skill-global`(仅当 agent 支持,如 Claude Code / Cursor / OpenCode)。`confluence uninstall --confirm true` 会同时清理项目级与全局级残留。
|
|
36
36
|
|
|
37
37
|
卸载入口(默认仅打印卸载计划,真实执行需显式确认):
|
|
38
38
|
|
package/dist/core/cli-output.js
CHANGED
|
@@ -126,15 +126,16 @@ export function getBuiltinCommandHelp(commandName) {
|
|
|
126
126
|
"confluence install",
|
|
127
127
|
"",
|
|
128
128
|
"用法:",
|
|
129
|
-
" confluence install [--skill-source local|git|npm] [--skill-local-path <path>] [--skip-config-check] [--cli-only] [--skill-only]",
|
|
129
|
+
" confluence install [--skill-source local|git|npm] [--skill-local-path <path>] [--skill-global] [--skip-config-check] [--cli-only] [--skill-only]",
|
|
130
130
|
" npx -y @cloudglab/confluence-cli@latest install",
|
|
131
131
|
"",
|
|
132
132
|
"说明:",
|
|
133
|
-
" 安装或更新 CLI,并按来源安装 Confluence skill
|
|
133
|
+
" 安装或更新 CLI,并按来源安装 Confluence skill。默认走 vercel-labs/skills 推荐的项目级(cwd 下 agent skills 目录),兼容所有 agent;需要 user-level 全局时显式传 --skill-global(需 agent 支持)。",
|
|
134
134
|
"",
|
|
135
135
|
"参数:",
|
|
136
136
|
" --skill-source <local|git|npm> (可选):skill 安装来源,默认 local。",
|
|
137
137
|
" --skill-local-path <string> (可选):直接从本地目录安装 skill。",
|
|
138
|
+
" --skill-global (可选):将 skill 装到 user-level 全局目录;不支持的 agent(如 PromptScript)会失败。",
|
|
138
139
|
" --skip-config-check (可选):安装后跳过 Confluence 配置校验。",
|
|
139
140
|
" --cli-only (可选):只安装 CLI,不安装 skill。",
|
|
140
141
|
" --skill-only (可选):只安装 skill,不安装 CLI。",
|
|
@@ -143,15 +144,16 @@ export function getBuiltinCommandHelp(commandName) {
|
|
|
143
144
|
"confluence update",
|
|
144
145
|
"",
|
|
145
146
|
"用法:",
|
|
146
|
-
" confluence update [--skill-source local|git|npm] [--skill-local-path <path>] [--skip-config-check] [--cli-only] [--skill-only]",
|
|
147
|
+
" confluence update [--skill-source local|git|npm] [--skill-local-path <path>] [--skill-global] [--skip-config-check] [--cli-only] [--skill-only]",
|
|
147
148
|
" npx -y @cloudglab/confluence-cli@latest update",
|
|
148
149
|
"",
|
|
149
150
|
"说明:",
|
|
150
|
-
" 更新或重新安装 CLI,并按来源更新 Confluence skill。",
|
|
151
|
+
" 更新或重新安装 CLI,并按来源更新 Confluence skill。默认走项目级,--skill-global 同 install。",
|
|
151
152
|
"",
|
|
152
153
|
"参数:",
|
|
153
154
|
" --skill-source <local|git|npm> (可选):skill 更新来源,默认 local。",
|
|
154
155
|
" --skill-local-path <string> (可选):直接从本地目录更新 skill。",
|
|
156
|
+
" --skill-global (可选):将 skill 装到 user-level 全局目录;不支持的 agent 会失败。",
|
|
155
157
|
" --skip-config-check (可选):更新后跳过 Confluence 配置校验。",
|
|
156
158
|
" --cli-only (可选):只更新 CLI,不更新 skill。",
|
|
157
159
|
" --skill-only (可选):只更新 skill,不更新 CLI。",
|
package/dist/install.js
CHANGED
|
@@ -55,6 +55,7 @@ function printSuccessGuide(action, status) {
|
|
|
55
55
|
常用配置:
|
|
56
56
|
confluence update 更新 CLI 和 Skill
|
|
57
57
|
confluence install --skip-config-check 仅安装,跳过配置校验
|
|
58
|
+
confluence install --skill-global 把 skill 装到 user-level 全局目录
|
|
58
59
|
CONFLUENCE_DISABLE_WRITE=true 禁用真实写操作
|
|
59
60
|
|
|
60
61
|
写操作提示:真实写入仍需显式传 confirm=true。
|
|
@@ -63,6 +64,7 @@ function printSuccessGuide(action, status) {
|
|
|
63
64
|
function parseInstallOptions(args) {
|
|
64
65
|
let skillSource = "local";
|
|
65
66
|
let skillLocalPath;
|
|
67
|
+
let skillGlobal = false;
|
|
66
68
|
let skipConfigCheck = false;
|
|
67
69
|
let cliOnly = false;
|
|
68
70
|
let skillOnly = false;
|
|
@@ -84,6 +86,12 @@ function parseInstallOptions(args) {
|
|
|
84
86
|
index += 1;
|
|
85
87
|
continue;
|
|
86
88
|
}
|
|
89
|
+
if (arg === "--skill-global" || arg.startsWith("--skill-global=")) {
|
|
90
|
+
const parsed = readBooleanFlag(args, index, "--skill-global");
|
|
91
|
+
skillGlobal = parsed.value;
|
|
92
|
+
index += parsed.consumedArgs;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
87
95
|
if (arg === "--skip-config-check" || arg.startsWith("--skip-config-check=")) {
|
|
88
96
|
const parsed = readBooleanFlag(args, index, "--skip-config-check");
|
|
89
97
|
skipConfigCheck = parsed.value;
|
|
@@ -107,7 +115,7 @@ function parseInstallOptions(args) {
|
|
|
107
115
|
if (cliOnly && skillOnly) {
|
|
108
116
|
throw new Error("--cli-only 和 --skill-only 不能同时使用");
|
|
109
117
|
}
|
|
110
|
-
return { skillSource, skillLocalPath, skipConfigCheck, cliOnly, skillOnly };
|
|
118
|
+
return { skillSource, skillLocalPath, skillGlobal, skipConfigCheck, cliOnly, skillOnly };
|
|
111
119
|
}
|
|
112
120
|
function parseUninstallOptions(args) {
|
|
113
121
|
let confirm = false;
|
|
@@ -158,11 +166,11 @@ function printUninstallPreview(options) {
|
|
|
158
166
|
function shouldRemoveConfig(options) {
|
|
159
167
|
return !options.keepConfig && !options.cliOnly && !options.skillOnly;
|
|
160
168
|
}
|
|
161
|
-
function createSkillAddArgs(source) {
|
|
162
|
-
//
|
|
163
|
-
//
|
|
164
|
-
//
|
|
165
|
-
return ["-y", "skills", "add", source, "--global", "--yes"];
|
|
169
|
+
function createSkillAddArgs(source, global = false) {
|
|
170
|
+
// 默认走 vercel-labs/skills 推荐的项目级(cwd 下 agent skills 目录),
|
|
171
|
+
// 兼容所有 agent(包括不支持 --global 的,如 PromptScript)。
|
|
172
|
+
// 用户明确需要 user-level 全局时再通过 --skill-global 显式开启。
|
|
173
|
+
return ["-y", "skills", "add", source, ...(global ? ["--global"] : []), "--yes"];
|
|
166
174
|
}
|
|
167
175
|
function createSkillRemoveArgs(global = false) {
|
|
168
176
|
return ["-y", "skills", "remove", "confluence-cli", "--yes", ...(global ? ["--global"] : [])];
|
|
@@ -253,20 +261,20 @@ async function runNpxStepWithRetry(title, args) {
|
|
|
253
261
|
}
|
|
254
262
|
async function installSkill(action, options) {
|
|
255
263
|
if (options.skillLocalPath) {
|
|
256
|
-
await runNpxStepWithRetry(`${action} Confluence skill`, createSkillAddArgs(path.resolve(options.skillLocalPath)));
|
|
264
|
+
await runNpxStepWithRetry(`${action} Confluence skill`, createSkillAddArgs(path.resolve(options.skillLocalPath), options.skillGlobal));
|
|
257
265
|
return;
|
|
258
266
|
}
|
|
259
267
|
if (options.skillSource === "local") {
|
|
260
|
-
await installSkillFromInstalledPackage(action);
|
|
268
|
+
await installSkillFromInstalledPackage(action, options.skillGlobal);
|
|
261
269
|
return;
|
|
262
270
|
}
|
|
263
271
|
if (options.skillSource === "git") {
|
|
264
|
-
await runNpxStepWithRetry(`${action} Confluence skill`, createSkillAddArgs(GIT_SKILL_SOURCE));
|
|
272
|
+
await runNpxStepWithRetry(`${action} Confluence skill`, createSkillAddArgs(GIT_SKILL_SOURCE, options.skillGlobal));
|
|
265
273
|
return;
|
|
266
274
|
}
|
|
267
|
-
await installSkillFromNpmPackage(action);
|
|
275
|
+
await installSkillFromNpmPackage(action, options.skillGlobal);
|
|
268
276
|
}
|
|
269
|
-
async function installSkillFromInstalledPackage(action) {
|
|
277
|
+
async function installSkillFromInstalledPackage(action, skillGlobal) {
|
|
270
278
|
const skillPath = await getInstalledPackageSkillPath();
|
|
271
279
|
try {
|
|
272
280
|
await access(skillPath);
|
|
@@ -274,7 +282,7 @@ async function installSkillFromInstalledPackage(action) {
|
|
|
274
282
|
catch {
|
|
275
283
|
throw new Error(`未找到已安装包内的 Confluence skill:${skillPath}。可重试 --skill-source npm 或 --skill-source git。`);
|
|
276
284
|
}
|
|
277
|
-
await runNpxStepWithRetry(`${action} Confluence skill`, createSkillAddArgs(skillPath));
|
|
285
|
+
await runNpxStepWithRetry(`${action} Confluence skill`, createSkillAddArgs(skillPath, skillGlobal));
|
|
278
286
|
}
|
|
279
287
|
async function getInstalledPackageSkillPath() {
|
|
280
288
|
const globalNodeModules = (await runCommandOutput("npm", ["root", "-g"])).trim();
|
|
@@ -282,7 +290,7 @@ async function getInstalledPackageSkillPath() {
|
|
|
282
290
|
throw new Error("npm root -g 没有返回全局 node_modules 路径");
|
|
283
291
|
return path.join(globalNodeModules, PACKAGE_NAME, "skills", "confluence-cli");
|
|
284
292
|
}
|
|
285
|
-
async function installSkillFromNpmPackage(action) {
|
|
293
|
+
async function installSkillFromNpmPackage(action, skillGlobal) {
|
|
286
294
|
const tempDir = await mkdtemp(path.join(os.tmpdir(), "confluence-cli-skill-"));
|
|
287
295
|
try {
|
|
288
296
|
const stdout = await runCommandOutput("npm", ["pack", `${PACKAGE_NAME}@latest`, "--pack-destination", tempDir, "--silent"]);
|
|
@@ -290,7 +298,7 @@ async function installSkillFromNpmPackage(action) {
|
|
|
290
298
|
if (!tarballName)
|
|
291
299
|
throw new Error("npm pack 没有返回包文件名");
|
|
292
300
|
await runStep("解压 Confluence npm 包", "tar", ["-xzf", path.join(tempDir, tarballName), "-C", tempDir]);
|
|
293
|
-
await runNpxStepWithRetry(`${action} Confluence skill`, createSkillAddArgs(path.join(tempDir, "package")));
|
|
301
|
+
await runNpxStepWithRetry(`${action} Confluence skill`, createSkillAddArgs(path.join(tempDir, "package"), skillGlobal));
|
|
294
302
|
}
|
|
295
303
|
finally {
|
|
296
304
|
await rm(tempDir, { recursive: true, force: true });
|
package/dist/manifest.json
CHANGED
package/dist/tools/install.js
CHANGED
|
@@ -4,6 +4,7 @@ import { jsonResult } from "../utils/result.js";
|
|
|
4
4
|
const installSchema = z.object({
|
|
5
5
|
"skill-source": z.enum(["local", "git", "npm"]).optional().default("local").describe("技能来源"),
|
|
6
6
|
"skill-local-path": z.string().optional().describe("本地 skill 目录"),
|
|
7
|
+
"skill-global": z.boolean().optional().default(false).describe("将 skill 装到 user-level 全局目录(需 agent 支持)"),
|
|
7
8
|
"skip-config-check": z.boolean().optional().default(false).describe("跳过配置校验"),
|
|
8
9
|
"cli-only": z.boolean().optional().default(false).describe("只安装 CLI"),
|
|
9
10
|
"skill-only": z.boolean().optional().default(false).describe("只安装 skill"),
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "0.0.
|
|
1
|
+
export declare const VERSION = "0.0.3";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const VERSION = "0.0.
|
|
1
|
+
export const VERSION = "0.0.3";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|