@yyy9527/openclaw-manager 0.1.2 → 0.2.2
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 +105 -38
- package/config/openclaw.test.env +20 -0
- package/package.json +4 -4
- package/scripts/openclaw_ctl.sh +17 -7
- package/scripts/test_create_claw.sh +54 -0
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
面向 macOS 的 OpenClaw 多实例部署与协作编排脚手架,支持:
|
|
4
4
|
|
|
5
5
|
- 一键环境初始化与非交互安装
|
|
6
|
-
- `
|
|
6
|
+
- `clawctl` 命令统一管理
|
|
7
7
|
- TUI 交互
|
|
8
8
|
- 飞书通知适配
|
|
9
9
|
- 多实例隔离与统一命名规范
|
|
@@ -20,53 +20,111 @@
|
|
|
20
20
|
## 2. 快速开始
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
+
npm i -g @yyy9527/openclaw-manager
|
|
23
24
|
cp config/openclaw.env.example config/openclaw.env
|
|
24
25
|
cp .env.example .env
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
clawctl setup
|
|
27
|
+
clawctl deploy
|
|
28
|
+
clawctl status
|
|
29
|
+
clawctl --help
|
|
29
30
|
```
|
|
30
31
|
|
|
31
|
-
> 首次执行 `
|
|
32
|
+
> 首次执行 `clawctl deploy` 需要拉取官方镜像,可能耗时较长(取决于网络)。
|
|
32
33
|
> clawhub 在 macOS 安装后,只有把 skills 安装到 `OPENCLAW_HOME_ROOT` 可见目录并挂载到容器,才能持久化并在容器内生效。
|
|
33
34
|
|
|
35
|
+
### 2.1 在另一台电脑安装
|
|
36
|
+
|
|
37
|
+
在新机器上只需用 npm 安装包并按下面步骤做一次初始化即可使用。
|
|
38
|
+
|
|
39
|
+
**前置:**
|
|
40
|
+
|
|
41
|
+
- macOS,已安装 **Node.js**(建议 18+)和 **Docker Desktop**(并已启动)
|
|
42
|
+
- 准备好 Git 令牌、飞书 webhook 等(见下方配置)
|
|
43
|
+
|
|
44
|
+
**安装与首次配置:**
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
# 全局安装(推荐指定版本以便复现)
|
|
48
|
+
npm i -g @yyy9527/openclaw-manager
|
|
49
|
+
|
|
50
|
+
# 进入包所在目录(全局安装时通常在 node 的 lib/node_modules 下),或从本仓库复制配置到任意目录
|
|
51
|
+
# 方式 A:从本仓库 clone 后,在仓库根目录操作
|
|
52
|
+
cd /path/to/docker-claw
|
|
53
|
+
cp config/openclaw.env.example config/openclaw.env
|
|
54
|
+
cp .env.example .env
|
|
55
|
+
# 编辑 .env 和 config/openclaw.env,填入 GIT_TOKEN、FEISHU_WEBHOOK_URL 等
|
|
56
|
+
|
|
57
|
+
# 方式 B:仅用包内自带默认配置(需先找到包路径)
|
|
58
|
+
# npm root -g 可查看全局 node_modules 路径,包名 @yyy9527/openclaw-manager
|
|
59
|
+
# 复制该包内 config/openclaw.env.example -> config/openclaw.env,.env.example -> .env 并编辑
|
|
60
|
+
|
|
61
|
+
# 使用默认配置时,clawctl 会读取「当前工作目录」下的 config/openclaw.env 与 .env
|
|
62
|
+
# 因此建议:新建一个目录如 ~/openclaw-workspace,把 .env 和 config/openclaw.env 放进去,之后在该目录下执行 clawctl
|
|
63
|
+
cd ~/openclaw-workspace
|
|
64
|
+
clawctl setup
|
|
65
|
+
clawctl deploy
|
|
66
|
+
clawctl list-claw
|
|
67
|
+
clawctl status-claw master # 或你的实例名
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**常用命令示例(在新电脑上):**
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
clawctl --help
|
|
74
|
+
clawctl check-env
|
|
75
|
+
clawctl deploy
|
|
76
|
+
clawctl list-claw
|
|
77
|
+
clawctl start-claw master
|
|
78
|
+
clawctl status-claw master
|
|
79
|
+
clawctl chat-claw master
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
指定配置与敏感变量文件(多环境时):
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
clawctl --config ./config/openclaw.prod.env --env-file ./.env.prod status
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
安装指定版本(例如 0.2.2):
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npm i -g @yyy9527/openclaw-manager@0.2.2
|
|
92
|
+
```
|
|
93
|
+
|
|
34
94
|
## 3. 常用命令
|
|
35
95
|
|
|
36
|
-
- `
|
|
37
|
-
- `
|
|
38
|
-
- `
|
|
39
|
-
- `
|
|
40
|
-
- `
|
|
41
|
-
- `
|
|
42
|
-
- `
|
|
43
|
-
- `
|
|
44
|
-
- `
|
|
45
|
-
- `
|
|
46
|
-
- `
|
|
47
|
-
- `
|
|
48
|
-
- `
|
|
49
|
-
- `
|
|
50
|
-
- `
|
|
51
|
-
- `
|
|
52
|
-
- `
|
|
53
|
-
- `
|
|
54
|
-
- `
|
|
55
|
-
- `
|
|
56
|
-
- `npm run health-check`:检查 Docker / Gitee 令牌与仓库 / 飞书配置可用性
|
|
57
|
-
- `npm run self-test`:执行基础自测
|
|
96
|
+
- `clawctl --help`:查看友好的 CLI 帮助
|
|
97
|
+
- `clawctl setup`:初始化环境(幂等)
|
|
98
|
+
- `clawctl deploy`:按配置启动全部实例
|
|
99
|
+
- `clawctl start|stop|restart|status`
|
|
100
|
+
- `clawctl list-claw`:列出当前配置的 claw 名称
|
|
101
|
+
- `clawctl start-claw <name>`:启动指定实例
|
|
102
|
+
- `clawctl stop-claw <name>`:停止指定实例
|
|
103
|
+
- `clawctl status-claw <name>`:查看指定实例状态
|
|
104
|
+
- `clawctl logs-claw <name>`:查看指定实例日志
|
|
105
|
+
- `clawctl logs`:查看日志
|
|
106
|
+
- `clawctl tui`:进入终端交互界面
|
|
107
|
+
- `clawctl chat-claw <name>`:进入指定容器内 OpenClaw 的对话 TUI
|
|
108
|
+
- `clawctl check-env`:检查你是否已补齐关键 `.env` 变量
|
|
109
|
+
- `clawctl sync-skills`:创建共享/专属 skills 目录,并优先通过 clawhub 搜索安装
|
|
110
|
+
- `clawctl sync-model-configs`:将各实例家目录的 `model.env` 同步到各自 `openclaw.json`
|
|
111
|
+
- `clawctl apply-config`:配置变更后统一生效(先同步模型配置,再重启)
|
|
112
|
+
- `clawctl bootstrap-models`:显式覆盖为 Ollama(需先开启覆盖开关)
|
|
113
|
+
- `clawctl set-qwen`:非交互切换到厂商 Qwen(DashScope/OpenAI 兼容)
|
|
114
|
+
- `clawctl health-check`:检查 Docker / Gitee 令牌与仓库 / 飞书配置可用性
|
|
115
|
+
- `clawctl self-test`:执行基础自测
|
|
58
116
|
|
|
59
117
|
## 3.1 `--help` 与配置文件切换
|
|
60
118
|
|
|
61
119
|
脚本入口支持统一全局参数:
|
|
62
120
|
|
|
63
121
|
```bash
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
122
|
+
clawctl --help
|
|
123
|
+
clawctl --config ./config/openclaw.dev.env status
|
|
124
|
+
clawctl --config ./config/openclaw.prod.env --env-file ./.env.prod apply-config
|
|
67
125
|
```
|
|
68
126
|
|
|
69
|
-
|
|
127
|
+
如果在仓库开发态通过 `npm run` 使用,也可以把参数透传给底层脚本(注意 `--`):
|
|
70
128
|
|
|
71
129
|
```bash
|
|
72
130
|
npm run ctl -- --config ./config/openclaw.dev.env status
|
|
@@ -97,9 +155,9 @@ npm run ctl -- --config ./config/openclaw.prod.env --env-file ./.env.prod apply-
|
|
|
97
155
|
|
|
98
156
|
> `clawhub` 通过 `pnpm` 安装(`pnpm add -g clawhub`)。
|
|
99
157
|
> `sync-skills` 会先尝试安装 `find-skills`,再按检索词搜索最佳匹配并安装;遇到超时会自动重试。
|
|
100
|
-
> 若出现 `Rate limit exceeded`,请先执行 `
|
|
101
|
-
> 如果 TUI 报 `No API key found for provider "anthropic"`,先执行 `
|
|
102
|
-
> 如果 TUI 报 `not connected to gateway`,通常是网关刚重启尚未就绪;`
|
|
158
|
+
> 若出现 `Rate limit exceeded`,请先执行 `clawhub login` 再重试 `clawctl sync-skills`。
|
|
159
|
+
> 如果 TUI 报 `No API key found for provider "anthropic"`,先执行 `clawctl apply-config`。
|
|
160
|
+
> 如果 TUI 报 `not connected to gateway`,通常是网关刚重启尚未就绪;`chat-claw` 内置等待逻辑,超时可执行 `clawctl apply-config` 后重试。
|
|
103
161
|
|
|
104
162
|
### 非交互切换到厂商 Qwen
|
|
105
163
|
|
|
@@ -110,11 +168,11 @@ npm run ctl -- --config ./config/openclaw.prod.env --env-file ./.env.prod apply-
|
|
|
110
168
|
2. 执行:
|
|
111
169
|
|
|
112
170
|
```bash
|
|
113
|
-
|
|
171
|
+
clawctl set-qwen
|
|
114
172
|
```
|
|
115
173
|
|
|
116
174
|
该命令会自动为每个实例写入 `~/openclaws/{instance}/model.env`,再同步到家目录 `openclaw.json`。
|
|
117
|
-
最终通过 `
|
|
175
|
+
最终通过 `clawctl apply-config` 重启生效,无需交互式 `openclaw configure`。
|
|
118
176
|
|
|
119
177
|
你也可以按实例准备模板(可选):
|
|
120
178
|
|
|
@@ -192,4 +250,13 @@ npm login
|
|
|
192
250
|
npm publish --access public
|
|
193
251
|
```
|
|
194
252
|
|
|
195
|
-
|
|
253
|
+
使用 `.env` 中的 `NPM_TOKEN` 发布时(例如 CI 或本机已配置):
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# 在项目根目录
|
|
257
|
+
printf '//registry.npmjs.org/:_authToken=%s\n' "${NPM_TOKEN}" > .npmrc
|
|
258
|
+
export NPM_TOKEN # 若未导出,先 source .env 或 export NPM_TOKEN=你的令牌
|
|
259
|
+
npm publish --access public
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
> 当前包名:`@yyy9527/openclaw-manager`。CLI 主命令为 `clawctl`。
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# 测试配置:单实例 xiaomo(用于包流程自测)
|
|
2
|
+
OPENCLAW_IMAGE=ghcr.io/openclaw/openclaw
|
|
3
|
+
OPENCLAW_VERSION=latest
|
|
4
|
+
OPENCLAW_INSTANCE_IDS=xiaomo
|
|
5
|
+
OPENCLAW_NAME_PREFIX=openclaw
|
|
6
|
+
OPENCLAW_BASE_HTTP_PORT=3200
|
|
7
|
+
OPENCLAW_CONTAINER_PORT=18789
|
|
8
|
+
OPENCLAW_HOME_ROOT=${HOME}/openclaws
|
|
9
|
+
OPENCLAW_SHARED_SKILLS_DIR=${OPENCLAW_HOME_ROOT}/shared/skills
|
|
10
|
+
OPENCLAW_ENABLE_CLAWHUB_SKILLS=false
|
|
11
|
+
OPENCLAW_CLAWHUB_INSTALL_RETRIES=8
|
|
12
|
+
OPENCLAW_FORCE_OLLAMA_AFTER_APPLY=false
|
|
13
|
+
OPENCLAW_ALLOW_OLLAMA_OVERRIDE=false
|
|
14
|
+
OLLAMA_BASE_URL=http://host.docker.internal:11434
|
|
15
|
+
OLLAMA_MODEL=qwen3.5:27b
|
|
16
|
+
OLLAMA_API_KEY=ollama-local
|
|
17
|
+
GIT_PLATFORM=gitee
|
|
18
|
+
GIT_REPO=yangyiyuan0825/openclaws
|
|
19
|
+
GIT_API_BASE=https://gitee.com/api/v5
|
|
20
|
+
FEISHU_ENABLED=true
|
package/package.json
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yyy9527/openclaw-manager",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "OpenClaw multi-instance manager for macOS with docker, TUI, and collaboration workflow.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"bin": {
|
|
9
|
-
"
|
|
10
|
-
"clawctl": "./scripts/openclaw_ctl.sh"
|
|
9
|
+
"clawctl": "scripts/openclaw_ctl.sh"
|
|
11
10
|
},
|
|
12
11
|
"files": [
|
|
13
12
|
"scripts/",
|
|
@@ -42,6 +41,7 @@
|
|
|
42
41
|
"bootstrap-models": "bash ./scripts/openclaw_ctl.sh bootstrap-models",
|
|
43
42
|
"set-model:qwen": "bash ./scripts/openclaw_ctl.sh set-qwen",
|
|
44
43
|
"health-check": "bash ./scripts/openclaw_ctl.sh health-check",
|
|
45
|
-
"self-test": "bash ./scripts/openclaw_ctl.sh self-test"
|
|
44
|
+
"self-test": "bash ./scripts/openclaw_ctl.sh self-test",
|
|
45
|
+
"test": "bash ./scripts/test_create_claw.sh"
|
|
46
46
|
}
|
|
47
47
|
}
|
package/scripts/openclaw_ctl.sh
CHANGED
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
SOURCE_PATH="${BASH_SOURCE[0]}"
|
|
5
|
+
while [ -L "${SOURCE_PATH}" ]; do
|
|
6
|
+
LINK_DIR="$(cd -P "$(dirname "${SOURCE_PATH}")" && pwd)"
|
|
7
|
+
LINK_TARGET="$(readlink "${SOURCE_PATH}")"
|
|
8
|
+
if [[ "${LINK_TARGET}" != /* ]]; then
|
|
9
|
+
SOURCE_PATH="${LINK_DIR}/${LINK_TARGET}"
|
|
10
|
+
else
|
|
11
|
+
SOURCE_PATH="${LINK_TARGET}"
|
|
12
|
+
fi
|
|
13
|
+
done
|
|
14
|
+
SCRIPT_DIR="$(cd -P "$(dirname "${SOURCE_PATH}")" && pwd)"
|
|
5
15
|
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
6
16
|
DEFAULT_CONFIG_FILE="${PROJECT_ROOT}/config/openclaw.env"
|
|
7
17
|
DEFAULT_DOTENV_FILE="${PROJECT_ROOT}/.env"
|
|
@@ -14,7 +24,7 @@ usage() {
|
|
|
14
24
|
OpenClaw Manager CLI(多实例运维入口)
|
|
15
25
|
|
|
16
26
|
用法:
|
|
17
|
-
|
|
27
|
+
clawctl [--config <path>] [--env-file <path>] <command> [args]
|
|
18
28
|
|
|
19
29
|
全局参数:
|
|
20
30
|
-h, --help 显示帮助
|
|
@@ -40,8 +50,8 @@ OpenClaw Manager CLI(多实例运维入口)
|
|
|
40
50
|
self-test
|
|
41
51
|
|
|
42
52
|
示例:
|
|
43
|
-
|
|
44
|
-
|
|
53
|
+
clawctl --config ./config/openclaw.dev.env status
|
|
54
|
+
clawctl --env-file ./.env.prod start-claw master
|
|
45
55
|
EOF
|
|
46
56
|
}
|
|
47
57
|
|
|
@@ -122,7 +132,7 @@ chat_with_claw() {
|
|
|
122
132
|
local running_service
|
|
123
133
|
running_service="$(run_compose_for_instance "${claw_name}" ps --status running --services 2>/dev/null | awk 'NF{print $1; exit}')"
|
|
124
134
|
if [ "${running_service}" != "openclaw" ]; then
|
|
125
|
-
echo "实例 ${claw_name} 当前未运行,请先执行:
|
|
135
|
+
echo "实例 ${claw_name} 当前未运行,请先执行: clawctl start-claw ${claw_name}" >&2
|
|
126
136
|
exit 1
|
|
127
137
|
fi
|
|
128
138
|
|
|
@@ -131,7 +141,7 @@ chat_with_claw() {
|
|
|
131
141
|
until run_compose_for_instance "${claw_name}" exec -T openclaw sh -lc 'openclaw health >/dev/null 2>&1'; do
|
|
132
142
|
waited=$((waited + 2))
|
|
133
143
|
if [ "${waited}" -ge "${max_wait}" ]; then
|
|
134
|
-
echo "实例 ${claw_name} 网关尚未就绪(等待 ${max_wait}s 超时)。可先执行:
|
|
144
|
+
echo "实例 ${claw_name} 网关尚未就绪(等待 ${max_wait}s 超时)。可先执行: clawctl apply-config" >&2
|
|
135
145
|
exit 1
|
|
136
146
|
fi
|
|
137
147
|
sleep 2
|
|
@@ -269,7 +279,7 @@ case "${command}" in
|
|
|
269
279
|
;;
|
|
270
280
|
chat-claw)
|
|
271
281
|
claw_name="${2:-}"
|
|
272
|
-
[ -n "${claw_name}" ] || { echo "用法:
|
|
282
|
+
[ -n "${claw_name}" ] || { echo "用法: clawctl chat-claw <name>" >&2; exit 1; }
|
|
273
283
|
chat_with_claw "${claw_name}"
|
|
274
284
|
;;
|
|
275
285
|
status-claw)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# 测试用例:使用 test 配置执行「创建龙虾」流程并做简单断言
|
|
3
|
+
# 用于回归:check-env -> deploy -> list-claw 含 xiaomo -> status-claw xiaomo 成功
|
|
4
|
+
set -euo pipefail
|
|
5
|
+
|
|
6
|
+
SOURCE_PATH="${BASH_SOURCE[0]}"
|
|
7
|
+
while [ -L "${SOURCE_PATH}" ]; do
|
|
8
|
+
LINK_DIR="$(cd -P "$(dirname "${SOURCE_PATH}")" && pwd)"
|
|
9
|
+
LINK_TARGET="$(readlink "${SOURCE_PATH}")"
|
|
10
|
+
if [[ "${LINK_TARGET}" != /* ]]; then
|
|
11
|
+
SOURCE_PATH="${LINK_DIR}/${LINK_TARGET}"
|
|
12
|
+
else
|
|
13
|
+
SOURCE_PATH="${LINK_TARGET}"
|
|
14
|
+
fi
|
|
15
|
+
done
|
|
16
|
+
SCRIPT_DIR="$(cd -P "$(dirname "${SOURCE_PATH}")" && pwd)"
|
|
17
|
+
PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
|
18
|
+
CONFIG="${PROJECT_ROOT}/config/openclaw.test.env"
|
|
19
|
+
ENV_FILE="${PROJECT_ROOT}/.env"
|
|
20
|
+
CTL="${PROJECT_ROOT}/scripts/openclaw_ctl.sh"
|
|
21
|
+
|
|
22
|
+
if [ ! -f "${ENV_FILE}" ]; then
|
|
23
|
+
echo "跳过 deploy:未找到 .env,请复制 .env.example 为 .env 并填写后重试。仅执行 list-claw/status-claw 断言(需已有 xiaomo 容器)。"
|
|
24
|
+
SKIP_DEPLOY=1
|
|
25
|
+
else
|
|
26
|
+
SKIP_DEPLOY=0
|
|
27
|
+
fi
|
|
28
|
+
|
|
29
|
+
run_ctl() {
|
|
30
|
+
OPENCLAW_CONFIG_FILE="${CONFIG}" OPENCLAW_DOTENV_FILE="${ENV_FILE}" bash "${CTL}" "$@"
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
echo "=== 1. check-env ==="
|
|
34
|
+
run_ctl check-env
|
|
35
|
+
|
|
36
|
+
if [ "${SKIP_DEPLOY}" = 0 ]; then
|
|
37
|
+
echo "=== 2. deploy(test 配置单实例 xiaomo)==="
|
|
38
|
+
run_ctl deploy
|
|
39
|
+
else
|
|
40
|
+
echo "=== 2. 跳过 deploy ==="
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
echo "=== 3. list-claw(断言含 xiaomo)==="
|
|
44
|
+
list_out="$(run_ctl list-claw)"
|
|
45
|
+
echo "${list_out}"
|
|
46
|
+
if ! echo "${list_out}" | grep -q 'xiaomo'; then
|
|
47
|
+
echo "断言失败:list-claw 输出中未包含 xiaomo" >&2
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
echo "=== 4. status-claw xiaomo ==="
|
|
52
|
+
run_ctl status-claw xiaomo
|
|
53
|
+
|
|
54
|
+
echo "=== 测试通过 ==="
|