openclawmp 1.0.3 → 1.0.4
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 +32 -0
- package/lib/commands/install.js +6 -5
- package/lib/config.js +81 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -147,6 +147,8 @@ openclawmp install skill/7c19dc4c3244418096f1dcb59c93f795
|
|
|
147
147
|
openclawmp install skill/7c19dc4c3244418096f1dcb59c93f795@1.0.3
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
+
默认安装根会优先跟随当前 OpenClaw/StepClaw state dir(`OPENCLAW_STATE_DIR`、`STEPCLAW_STATE_DIR` 或 `~/.stepclaw/stepclaw-install-state.json`),未检测到 StepClaw 时回退到 `~/.openclaw`。也可通过 `--target-dir <path>` 显式指定安装根。
|
|
151
|
+
|
|
150
152
|
卸载示例:
|
|
151
153
|
|
|
152
154
|
```bash
|
|
@@ -187,3 +189,33 @@ openclawmp users openclawmp.cc
|
|
|
187
189
|
- `--dry-run`
|
|
188
190
|
- `--yes, -y`
|
|
189
191
|
- `--verbose`
|
|
192
|
+
|
|
193
|
+
## 目录发布打包规则
|
|
194
|
+
|
|
195
|
+
- 目录发布会默认跳过 `.git`、`node_modules`、`__MACOSX`、`.DS_Store`、`Thumbs.db`
|
|
196
|
+
- 根目录可通过 `.openclawmpignore` 补充忽略规则,也会读取根目录 `.gitignore` / `.npmignore` 的常见规则
|
|
197
|
+
- 子路径遇到无权限读取的目录或文件时会自动跳过;使用 `--verbose` 可查看具体跳过项
|
|
198
|
+
|
|
199
|
+
## Publish Metadata
|
|
200
|
+
|
|
201
|
+
- `publish` 只读取发布目录或归档里的 `.metadata.json`
|
|
202
|
+
- `.metadata.json` 必须包含 `assetType`、`name`、`displayName`、`semver`
|
|
203
|
+
- `semver` 必须是严格的 `x.y.z` 纯数字格式,例如 `1.2.3`
|
|
204
|
+
- 可选字段:`assetId`、`category`、`tags`、`description`、`longDescription`
|
|
205
|
+
- 不再从 `README.md`、`package.json`、`openclaw.plugin.json`、`SKILL.md` 自动推断发布 metadata
|
|
206
|
+
- 不再通过 CLI 参数补录 `assetType`、`name`、`displayName`、`semver`
|
|
207
|
+
- `assetId` 可写在 `.metadata.json`,也可以通过 `--asset-id` 或目录根部 `.assetid` 透传
|
|
208
|
+
- `objectId` 由上传完成后自动生成,登录态始终必需
|
|
209
|
+
- 默认不打印请求预览或请求头明细;加 `--verbose` 会额外输出接口 URL、入参与返回详情
|
|
210
|
+
|
|
211
|
+
## 默认配置来源
|
|
212
|
+
|
|
213
|
+
`baseUrl` 优先级:
|
|
214
|
+
|
|
215
|
+
1. `--base-url`
|
|
216
|
+
2. `OPENCLAWMP_API_BASE_URL`
|
|
217
|
+
3. `OPENCLAWMP_BASE_URL`
|
|
218
|
+
4. `API_BASE_URL`
|
|
219
|
+
5. `NEXT_PUBLIC_API_BASE_URL`
|
|
220
|
+
6. 仓库根目录 `.env.local` / `.env` / `.env.prod`
|
|
221
|
+
7. `https://seafood.c.stepfun-inc.net`
|
package/lib/commands/install.js
CHANGED
|
@@ -33,11 +33,12 @@ function printHelp() {
|
|
|
33
33
|
console.log(" install 需要本地 token,默认读取 ~/.openclaw/hub-credentials.json");
|
|
34
34
|
console.log(" 可通过 --token-file <path> 指定其他凭证文件");
|
|
35
35
|
console.log(" 默认安装目录:");
|
|
36
|
-
console.log("
|
|
37
|
-
console.log("
|
|
38
|
-
console.log("
|
|
39
|
-
console.log("
|
|
40
|
-
console.log("
|
|
36
|
+
console.log(" 优先跟随当前 OpenClaw/StepClaw state dir(OPENCLAW_STATE_DIR、STEPCLAW_STATE_DIR 或 ~/.stepclaw)");
|
|
37
|
+
console.log(" 未检测到 StepClaw 时回退到 ~/.openclaw");
|
|
38
|
+
console.log(" skill -> <state-dir>/skills 或 ~/.openclaw/skills");
|
|
39
|
+
console.log(" plugin/channel -> <state-dir>/extensions 或 ~/.openclaw/extensions");
|
|
40
|
+
console.log(" trigger -> <state-dir>/triggers 或 ~/.openclaw/triggers");
|
|
41
|
+
console.log(" experience -> <state-dir>/experiences 或 ~/.openclaw/experiences");
|
|
41
42
|
console.log("");
|
|
42
43
|
console.log("示例:");
|
|
43
44
|
console.log(" " + buildInstallCommand("skill", "7c19dc4c3244418096f1dcb59c93f795"));
|
package/lib/config.js
CHANGED
|
@@ -17,6 +17,12 @@ const INSTALL_ROOT_BY_TYPE = {
|
|
|
17
17
|
experience: ["experiences"],
|
|
18
18
|
template: ["templates"],
|
|
19
19
|
};
|
|
20
|
+
const OPENCLAWMP_INSTALL_ROOT_ENV = "OPENCLAWMP_INSTALL_ROOT";
|
|
21
|
+
const OPENCLAW_STATE_DIR_ENV = "OPENCLAW_STATE_DIR";
|
|
22
|
+
const STEPCLAW_STATE_DIR_ENV = "STEPCLAW_STATE_DIR";
|
|
23
|
+
const STEPCLAW_STATE_DIR_NAME = ".stepclaw";
|
|
24
|
+
const STEPCLAW_INSTALL_STATE_FILE = "stepclaw-install-state.json";
|
|
25
|
+
const STEPCLAW_RUNTIME_STATE_FILE = "stepclaw-state.json";
|
|
20
26
|
|
|
21
27
|
function parseEnvFile(content) {
|
|
22
28
|
const result = {};
|
|
@@ -68,6 +74,26 @@ function firstDefined(values) {
|
|
|
68
74
|
});
|
|
69
75
|
}
|
|
70
76
|
|
|
77
|
+
function trimString(value) {
|
|
78
|
+
return typeof value === "string" ? value.trim() : "";
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function expandHomePath(value) {
|
|
82
|
+
const trimmed = trimString(value);
|
|
83
|
+
if (trimmed === "~") {
|
|
84
|
+
return os.homedir();
|
|
85
|
+
}
|
|
86
|
+
if (trimmed.startsWith("~/") || trimmed.startsWith("~\\")) {
|
|
87
|
+
return path.join(os.homedir(), trimmed.slice(2));
|
|
88
|
+
}
|
|
89
|
+
return trimmed;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function resolvePathValue(value) {
|
|
93
|
+
const expanded = expandHomePath(value);
|
|
94
|
+
return expanded ? path.resolve(expanded) : "";
|
|
95
|
+
}
|
|
96
|
+
|
|
71
97
|
function normalizeBaseUrl(value) {
|
|
72
98
|
return String(value)
|
|
73
99
|
.trim()
|
|
@@ -100,6 +126,51 @@ function getOpenClawHome() {
|
|
|
100
126
|
return path.join(os.homedir(), ".openclaw");
|
|
101
127
|
}
|
|
102
128
|
|
|
129
|
+
function getDefaultStepClawStateDir() {
|
|
130
|
+
return path.join(os.homedir(), STEPCLAW_STATE_DIR_NAME);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function readJsonFileIfExists(filePath) {
|
|
134
|
+
try {
|
|
135
|
+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
136
|
+
} catch (error) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function looksLikeStepClawStateDir(stateDir) {
|
|
142
|
+
return (
|
|
143
|
+
fs.existsSync(path.join(stateDir, "openclaw.json")) ||
|
|
144
|
+
fs.existsSync(path.join(stateDir, STEPCLAW_INSTALL_STATE_FILE)) ||
|
|
145
|
+
fs.existsSync(path.join(stateDir, "runtime", STEPCLAW_RUNTIME_STATE_FILE))
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function resolveStepClawStateDir() {
|
|
150
|
+
const envStateDir = firstDefined([
|
|
151
|
+
process.env[OPENCLAW_STATE_DIR_ENV],
|
|
152
|
+
process.env[STEPCLAW_STATE_DIR_ENV],
|
|
153
|
+
]);
|
|
154
|
+
if (envStateDir) {
|
|
155
|
+
return resolvePathValue(envStateDir);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const defaultStateDir = getDefaultStepClawStateDir();
|
|
159
|
+
const presence = readJsonFileIfExists(
|
|
160
|
+
path.join(defaultStateDir, STEPCLAW_INSTALL_STATE_FILE)
|
|
161
|
+
);
|
|
162
|
+
const redirectedStateDir = trimString(presence && presence.stateDir);
|
|
163
|
+
if (redirectedStateDir) {
|
|
164
|
+
return resolvePathValue(redirectedStateDir);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (looksLikeStepClawStateDir(defaultStateDir)) {
|
|
168
|
+
return defaultStateDir;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return "";
|
|
172
|
+
}
|
|
173
|
+
|
|
103
174
|
function defaultCredentialsPath() {
|
|
104
175
|
return path.join(getOpenClawHome(), "hub-credentials.json");
|
|
105
176
|
}
|
|
@@ -109,7 +180,14 @@ function getLockfilePath() {
|
|
|
109
180
|
}
|
|
110
181
|
|
|
111
182
|
function getManagedAssetsRoot() {
|
|
112
|
-
|
|
183
|
+
const explicitInstallRoot = firstDefined([
|
|
184
|
+
process.env[OPENCLAWMP_INSTALL_ROOT_ENV],
|
|
185
|
+
]);
|
|
186
|
+
if (explicitInstallRoot) {
|
|
187
|
+
return resolvePathValue(explicitInstallRoot);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return resolveStepClawStateDir() || getOpenClawHome();
|
|
113
191
|
}
|
|
114
192
|
|
|
115
193
|
function getInstallRoot(assetType) {
|
|
@@ -126,6 +204,8 @@ module.exports = {
|
|
|
126
204
|
resolveApiBaseUrl,
|
|
127
205
|
resolveConnectBaseUrl,
|
|
128
206
|
getOpenClawHome,
|
|
207
|
+
getDefaultStepClawStateDir,
|
|
208
|
+
resolveStepClawStateDir,
|
|
129
209
|
defaultCredentialsPath,
|
|
130
210
|
getLockfilePath,
|
|
131
211
|
getManagedAssetsRoot,
|