@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 CHANGED
@@ -3,7 +3,7 @@
3
3
  面向 macOS 的 OpenClaw 多实例部署与协作编排脚手架,支持:
4
4
 
5
5
  - 一键环境初始化与非交互安装
6
- - `npm run` 统一管理
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
- npm run setup
26
- npm run deploy
27
- npm run status
28
- npm run help
26
+ clawctl setup
27
+ clawctl deploy
28
+ clawctl status
29
+ clawctl --help
29
30
  ```
30
31
 
31
- > 首次执行 `npm run deploy` 需要拉取官方镜像,可能耗时较长(取决于网络)。
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
- - `npm run help`:查看友好的 CLI 帮助
37
- - `npm run setup`:初始化环境(幂等)
38
- - `npm run deploy`:按配置启动全部实例
39
- - `npm run start` / `npm run stop` / `npm run restart`
40
- - `npm run status`:查看实例状态
41
- - `npm run list:claw`:列出当前配置的 claw 名称
42
- - `npm run start:claw -- <name>`:启动指定实例
43
- - `npm run stop:claw -- <name>`:停止指定实例
44
- - `npm run status:claw -- <name>`:查看指定实例状态
45
- - `npm run logs:claw -- <name>`:查看指定实例日志
46
- - `npm run logs`:查看日志
47
- - `npm run tui`:进入终端交互界面
48
- - `npm run tui:claw -- <name>`:进入指定容器内 OpenClaw 的对话 TUI
49
- - `npm run clawhub:login`:登录 clawhub,避免匿名限流影响 skills 安装
50
- - `npm run check-env`:检查你是否已补齐关键 `.env` 变量
51
- - `npm run sync-skills`:创建共享/专属 skills 目录,并优先通过 clawhub 搜索安装
52
- - `npm run sync-model-configs`:将各实例家目录的 `model.env` 同步到各自 `openclaw.json`
53
- - `npm run apply-config`:配置变更后统一生效(先同步模型配置,再重启)
54
- - `npm run bootstrap-models`:显式覆盖为 Ollama(需先开启覆盖开关)
55
- - `npm run set-model:qwen`:非交互切换到厂商 Qwen(DashScope/OpenAI 兼容)
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
- openclaw-manager --help
65
- openclaw-manager --config ./config/openclaw.dev.env status
66
- openclaw-manager --config ./config/openclaw.prod.env --env-file ./.env.prod apply-config
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
- 如果通过 `npm run` 使用,也可以把参数透传给底层脚本(注意 `--`):
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`,请先执行 `npm run clawhub:login` 再重试 `npm run sync-skills`。
101
- > 如果 TUI 报 `No API key found for provider "anthropic"`,先执行 `npm run apply-config`。该命令会重启容器并引导默认模型到 `ollama/qwen3.5:27b`。
102
- > 如果 TUI 报 `not connected to gateway`,通常是网关刚重启尚未就绪;`tui:claw` 现已内置等待逻辑,超时可执行 `npm run apply-config` 后重试。
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
- npm run set-model:qwen
171
+ clawctl set-qwen
114
172
  ```
115
173
 
116
174
  该命令会自动为每个实例写入 `~/openclaws/{instance}/model.env`,再同步到家目录 `openclaw.json`。
117
- 最终通过 `npm run apply-config` 重启生效,无需交互式 `openclaw configure`。
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
- > 当前建议包名:`@yyy9527/openclaw-manager`。若需组织统一命名,可改为你的团队 scope。
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.1.2",
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
- "openclaw-manager": "./scripts/openclaw_ctl.sh",
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
  }
@@ -1,7 +1,17 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
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
- openclaw-manager [--config <path>] [--env-file <path>] <command> [args]
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
- openclaw-manager --config ./config/openclaw.dev.env status
44
- openclaw-manager --env-file ./.env.prod start-claw master
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} 当前未运行,请先执行: npm run start-claw -- ${claw_name}" >&2
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 超时)。可先执行: npm run apply-config" >&2
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 "用法: openclaw-manager chat-claw <name>" >&2; exit 1; }
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 "=== 测试通过 ==="