@reconcrap/boss-recommend-mcp 2.1.1 → 2.1.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/README.md +96 -2
- package/package.json +3 -1
- package/scripts/install-macos.sh +280 -0
- package/skills/boss-recommend-pipeline/SKILL.md +29 -8
- package/src/cli.js +221 -46
- package/src/index.js +65 -0
- package/src/recommend-scheduler.js +482 -0
package/README.md
CHANGED
|
@@ -7,6 +7,68 @@ Boss 推荐 / 搜索 / 聊天筛选 MCP(stdio)服务。
|
|
|
7
7
|
- npm: `@reconcrap/boss-recommend-mcp`(https://www.npmjs.com/package/@reconcrap/boss-recommend-mcp)
|
|
8
8
|
- GitHub: `reconcrap-cpu/boss-recommend-mcp`(https://github.com/reconcrap-cpu/boss-recommend-mcp)
|
|
9
9
|
|
|
10
|
+
## AI harness install entrypoint
|
|
11
|
+
|
|
12
|
+
如果用户只把这个 GitHub 链接交给 Codex、Claude Code、Cursor、OpenClaw、QClaw、Trae 等 AI harness,并要求“安装这个工具”,请优先执行本节,而不是直接在 macOS 上裸跑 `npm install -g`。
|
|
13
|
+
|
|
14
|
+
AI harness 不能只完成 npm 安装就结束。安装流程还必须帮助用户完成必填 LLM 配置;如果用户没有提前提供,请向用户索取:
|
|
15
|
+
|
|
16
|
+
- LLM base URL(默认可用 `https://api.openai.com/v1`)
|
|
17
|
+
- LLM API key
|
|
18
|
+
- LLM model(默认可用 `gpt-4.1-mini`)
|
|
19
|
+
|
|
20
|
+
然后写入配置:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
boss-recommend-mcp config set --base-url <baseUrl> --api-key <apiKey> --model <model> --thinking-level low
|
|
24
|
+
boss-recommend-mcp doctor
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
如果用户用 macOS bootstrap,它会自动尝试交互式询问并写入这些字段。非交互式 AI harness 如果拿不到用户输入,应暂停并询问用户上述三项,不要把安装标记为完成。
|
|
28
|
+
|
|
29
|
+
macOS 首次安装推荐使用仓库里的 nvm bootstrap。它会把 Node/npm/global packages 放到用户目录,避免首次安装或后续升级时出现:
|
|
30
|
+
|
|
31
|
+
```text
|
|
32
|
+
EACCES: permission denied, mkdir '/usr/local/lib/node_modules/@reconcrap'
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
这是 npm global prefix 权限问题,不是 `boss-recommend-mcp` 包内部创建目录失败。
|
|
36
|
+
|
|
37
|
+
macOS 一键安装:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
curl -fsSL https://raw.githubusercontent.com/reconcrap-cpu/boss-recommend-mcp/main/scripts/install-macos.sh | bash
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
如果要直接配置某个宿主:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
curl -fsSL https://raw.githubusercontent.com/reconcrap-cpu/boss-recommend-mcp/main/scripts/install-macos.sh | bash -s -- --agent openclaw
|
|
47
|
+
curl -fsSL https://raw.githubusercontent.com/reconcrap-cpu/boss-recommend-mcp/main/scripts/install-macos.sh | bash -s -- --agent qclaw
|
|
48
|
+
curl -fsSL https://raw.githubusercontent.com/reconcrap-cpu/boss-recommend-mcp/main/scripts/install-macos.sh | bash -s -- --agent trae-cn
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
安装后,未来升级只需要在同一个 nvm shell 里运行:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npm -g i @reconcrap/boss-recommend-mcp@latest
|
|
55
|
+
boss-recommend-mcp where
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
如果升级前 `npm config get prefix` 返回 `/usr/local`,说明当前 shell 没有使用 nvm Node;请先重新加载 nvm,不要使用 `sudo npm install -g`。
|
|
59
|
+
|
|
60
|
+
macOS bootstrap 会执行 `boss-recommend-mcp install --mcp-launch global-wrapper`。该模式会把 MCP 宿主配置为启动稳定 wrapper:`~/.boss-recommend-mcp/bin/boss-recommend-mcp-mcp-server`。这个 wrapper 每次启动时都会调用当前全局 `boss-recommend-mcp start`,因此后续 `npm -g i @reconcrap/boss-recommend-mcp@latest` 会更新 MCP 宿主实际运行的版本,不需要每次升级后重写 MCP 配置。
|
|
61
|
+
|
|
62
|
+
如果 AI harness 已经从用户处拿到 LLM 信息,可以非交互式传给 bootstrap:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
curl -fsSL https://raw.githubusercontent.com/reconcrap-cpu/boss-recommend-mcp/main/scripts/install-macos.sh \
|
|
66
|
+
| BOSS_RECOMMEND_BASE_URL="https://api.openai.com/v1" \
|
|
67
|
+
BOSS_RECOMMEND_API_KEY="<apiKey>" \
|
|
68
|
+
BOSS_RECOMMEND_MODEL="gpt-4.1-mini" \
|
|
69
|
+
bash -s -- --agent openclaw
|
|
70
|
+
```
|
|
71
|
+
|
|
10
72
|
2.0.0 是 CDP-only 重写版本:活跃浏览器路径只允许 Chrome DevTools Protocol 的 `DOM` / `Input` / `Page` / `Network` / `Accessibility` 等域,不使用 `Runtime.evaluate` 或页面 JS。包内保留 recommend、search/recruit、chat 三条域服务,并共享浏览器、生命周期、筛选、CV 获取、无限滚动、自愈与 CSV 报告层。
|
|
11
73
|
|
|
12
74
|
安装 `boss-recommend-mcp` 后可以直接:
|
|
@@ -21,6 +83,8 @@ MCP 工具:
|
|
|
21
83
|
|
|
22
84
|
- `list_recommend_jobs`(只读读取推荐页岗位下拉框,返回可直接用于 cron/一次性任务的 `job_names`)
|
|
23
85
|
- `prepare_recommend_pipeline_run`(只校验完整 payload 是否已可用于 cron/一次性任务;不启动筛选,返回 `READY + cron_ready=true` 后才应创建 cron)
|
|
86
|
+
- `schedule_recommend_pipeline_run`(创建 package-owned 定时任务;保存已 READY 的完整 payload,启动 detached scheduler,到点后直接调用 `start_recommend_pipeline_run`)
|
|
87
|
+
- `get_recommend_scheduled_run`(查询 package-owned 定时任务;到点后会显示内层 `run_id` 和 run 快照)
|
|
24
88
|
- `start_recommend_pipeline_run`(异步启动;同样先经过前置门禁,通过后返回 run_id)
|
|
25
89
|
- `get_recommend_pipeline_run`(轮询 run_id 状态)
|
|
26
90
|
- `cancel_recommend_pipeline_run`(取消运行中任务)
|
|
@@ -58,15 +122,18 @@ Cron / 一次性定时任务设置建议先在设置阶段完成 Chrome/登录/
|
|
|
58
122
|
|
|
59
123
|
```bash
|
|
60
124
|
boss-recommend-mcp prepare-run --instruction-file boss-recommend-instruction.txt --overrides-file boss-recommend-overrides.json --confirmation-file boss-recommend-confirmation.json --slow-live --port 9222
|
|
125
|
+
boss-recommend-mcp schedule-run --schedule-delay-minutes 10 --instruction-file boss-recommend-instruction.txt --overrides-file boss-recommend-overrides.json --confirmation-file boss-recommend-confirmation.json --slow-live --port 9222
|
|
126
|
+
boss-recommend-mcp schedule-status --schedule-id <schedule_id>
|
|
61
127
|
```
|
|
62
128
|
|
|
63
|
-
|
|
129
|
+
只有 `prepare-run` 输出 `status: "READY"` 且 `cron_ready: true` 后,才继续调用 `schedule-run`。只有 `schedule-run` 输出 `status: "SCHEDULED"` 且带有 `schedule_id` 后,才算定时任务真的创建成功。不要让外部 AI harness 自己拼 `/tmp/*.log` shell cron 或未来对话提醒;那类 cron 容易丢失 JSON/file 参数并在到点后重新卡确认门禁。
|
|
64
130
|
|
|
65
131
|
状态机:
|
|
66
132
|
|
|
67
133
|
- `NEED_INPUT`
|
|
68
134
|
- `NEED_CONFIRMATION`
|
|
69
135
|
- `READY`(仅准备工具)
|
|
136
|
+
- `SCHEDULED`(仅定时工具)
|
|
70
137
|
- `COMPLETED`
|
|
71
138
|
- `FAILED`
|
|
72
139
|
|
|
@@ -125,6 +192,13 @@ npm install -g @reconcrap/boss-recommend-mcp@latest
|
|
|
125
192
|
boss-recommend-mcp start
|
|
126
193
|
```
|
|
127
194
|
|
|
195
|
+
macOS 首次安装如果没有确认 npm prefix 在用户目录,优先使用本文开头的 `scripts/install-macos.sh`。完成 bootstrap 后,后续升级仍然使用同一个 npm 命令:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
npm -g i @reconcrap/boss-recommend-mcp@latest
|
|
199
|
+
boss-recommend-mcp where
|
|
200
|
+
```
|
|
201
|
+
|
|
128
202
|
无需安装(npx 直接运行):
|
|
129
203
|
|
|
130
204
|
```bash
|
|
@@ -150,7 +224,8 @@ node src/cli.js start
|
|
|
150
224
|
如果检测到 legacy Boss server entries,installer 会:
|
|
151
225
|
|
|
152
226
|
- 保留非 Boss MCP server。
|
|
153
|
-
-
|
|
227
|
+
- 默认写入统一 server:`boss-recommend -> npx -y @reconcrap/boss-recommend-mcp@<installed-version> start`
|
|
228
|
+
- 如果传入 `--mcp-launch global-wrapper`,写入升级稳定入口:`boss-recommend -> ~/.boss-recommend-mcp/bin/boss-recommend-mcp-mcp-server`。该 wrapper 会加载 `~/.nvm/nvm.sh` 并执行当前全局 `boss-recommend-mcp start`,适合 macOS 上通过 `npm -g i @reconcrap/boss-recommend-mcp@latest` 持续升级。
|
|
154
229
|
- 从同一个 `mcp.json` 删除旧 `boss-recruit-mcp`、standalone `boss-chat`、旧本地 Boss repo 路径,避免 agent 继续调用 legacy 包。
|
|
155
230
|
- 在原文件旁生成 `mcp.json.boss-mcp-migration-*.bak`。
|
|
156
231
|
- 同步外部 skills 目录里的 `boss-recommend-pipeline`、`boss-recruit-pipeline`、`boss-chat`。
|
|
@@ -166,6 +241,14 @@ boss-recommend-mcp doctor --agent openclaw
|
|
|
166
241
|
boss-recommend-mcp doctor --agent qclaw
|
|
167
242
|
```
|
|
168
243
|
|
|
244
|
+
macOS 上如果希望 MCP 宿主总是使用全局 npm 最新安装版本:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
boss-recommend-mcp install --mcp-launch global-wrapper --agent openclaw
|
|
248
|
+
boss-recommend-mcp install --mcp-launch global-wrapper --agent qclaw
|
|
249
|
+
boss-recommend-mcp install --mcp-launch global-wrapper --agent trae-cn
|
|
250
|
+
```
|
|
251
|
+
|
|
169
252
|
自定义路径:
|
|
170
253
|
|
|
171
254
|
```bash
|
|
@@ -191,6 +274,16 @@ npx -y @reconcrap/boss-recommend-mcp@latest run --detached --instruction-file bo
|
|
|
191
274
|
|
|
192
275
|
`--detached` 会让父进程输出 `ACCEPTED + run_id` 后退出,子进程继续持有 Chrome DevTools 会话并执行长任务。岗位发现可以使用只读 CLI:
|
|
193
276
|
|
|
277
|
+
如果是稍后启动/cron/定时任务,不要手写系统 cron;用 package-owned scheduler:
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
npx -y @reconcrap/boss-recommend-mcp@latest prepare-run --instruction-file boss-recommend-instruction.txt --overrides-file boss-recommend-overrides.json --confirmation-file boss-recommend-confirmation.json --slow-live --port 9222
|
|
281
|
+
npx -y @reconcrap/boss-recommend-mcp@latest schedule-run --schedule-delay-minutes 10 --instruction-file boss-recommend-instruction.txt --overrides-file boss-recommend-overrides.json --confirmation-file boss-recommend-confirmation.json --slow-live --port 9222
|
|
282
|
+
npx -y @reconcrap/boss-recommend-mcp@latest schedule-status --schedule-id <schedule_id>
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
`schedule-run` 会保存同一份已验证 payload 并启动 detached scheduler worker;到点后 worker 会直接调用包内 `start_recommend_pipeline_run`,不会重新让 AI harness 拼参数。
|
|
286
|
+
|
|
194
287
|
```bash
|
|
195
288
|
npx -y @reconcrap/boss-recommend-mcp@latest list-jobs --slow-live --port 9222
|
|
196
289
|
# 源码模式(GitHub clone 后)
|
|
@@ -385,6 +478,7 @@ Trae-CN / 长对话防循环建议:
|
|
|
385
478
|
|
|
386
479
|
- `start_recommend_pipeline_run` 为异步入口,但不会跳过同步确认流程。
|
|
387
480
|
- `prepare_recommend_pipeline_run` / `boss-recommend-mcp prepare-run` 用于 cron 设置阶段;它不启动筛选,只确认 payload 已经不需要到点后再问用户。
|
|
481
|
+
- `schedule_recommend_pipeline_run` / `boss-recommend-mcp schedule-run` 是推荐页定时启动的唯一推荐路径;它创建真实 package-owned detached scheduler,并返回 `schedule_id`。
|
|
388
482
|
- 定时心跳默认 120 秒一次;`updated_at` 仍会在阶段或进度变化时刷新。
|
|
389
483
|
- 每个 run 会持久化到 `~/.boss-recommend-mcp/runs/<run_id>.json`(可通过 `BOSS_RECOMMEND_HOME` 覆盖)。
|
|
390
484
|
- screen 阶段会持久化 checkpoint:`~/.boss-recommend-mcp/runs/<run_id>.checkpoint.json`。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reconcrap/boss-recommend-mcp",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.3",
|
|
4
4
|
"description": "Unified MCP pipeline for recommend-page filtering and screening on Boss Zhipin",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"boss",
|
|
@@ -82,6 +82,7 @@
|
|
|
82
82
|
"bin",
|
|
83
83
|
"config/screening-config.example.json",
|
|
84
84
|
"skills",
|
|
85
|
+
"scripts/install-macos.sh",
|
|
85
86
|
"scripts/postinstall.cjs",
|
|
86
87
|
"src/core",
|
|
87
88
|
"src/domains",
|
|
@@ -92,6 +93,7 @@
|
|
|
92
93
|
"src/index.js",
|
|
93
94
|
"src/parser.js",
|
|
94
95
|
"src/recommend-mcp.js",
|
|
96
|
+
"src/recommend-scheduler.js",
|
|
95
97
|
"src/recruit-mcp.js",
|
|
96
98
|
"src/run-state.js",
|
|
97
99
|
"README.md"
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
PACKAGE_NAME="@reconcrap/boss-recommend-mcp"
|
|
5
|
+
DEFAULT_NODE_VERSION="${BOSS_RECOMMEND_NODE_VERSION:-22}"
|
|
6
|
+
DEFAULT_NVM_VERSION="${BOSS_RECOMMEND_NVM_VERSION:-v0.40.4}"
|
|
7
|
+
|
|
8
|
+
NODE_VERSION="$DEFAULT_NODE_VERSION"
|
|
9
|
+
NVM_VERSION="$DEFAULT_NVM_VERSION"
|
|
10
|
+
AGENT="${BOSS_RECOMMEND_AGENT:-}"
|
|
11
|
+
DRY_RUN=0
|
|
12
|
+
SKIP_DOCTOR=0
|
|
13
|
+
SKIP_LLM_CONFIG=0
|
|
14
|
+
BASE_URL="${BOSS_RECOMMEND_BASE_URL:-https://api.openai.com/v1}"
|
|
15
|
+
API_KEY="${BOSS_RECOMMEND_API_KEY:-}"
|
|
16
|
+
MODEL="${BOSS_RECOMMEND_MODEL:-gpt-4.1-mini}"
|
|
17
|
+
THINKING_LEVEL="${BOSS_RECOMMEND_THINKING_LEVEL:-low}"
|
|
18
|
+
GREETING_MESSAGE="${BOSS_RECOMMEND_GREETING_MESSAGE:-Hi同学,能麻烦发下简历吗?}"
|
|
19
|
+
|
|
20
|
+
usage() {
|
|
21
|
+
cat <<'EOF'
|
|
22
|
+
Install boss-recommend-mcp on macOS with nvm-backed npm globals.
|
|
23
|
+
|
|
24
|
+
Usage:
|
|
25
|
+
install-macos.sh [--agent <agent|all>] [--node-version <version>] [--nvm-version <tag>] [--dry-run] [--skip-doctor] [--skip-llm-config]
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
curl -fsSL https://raw.githubusercontent.com/reconcrap-cpu/boss-recommend-mcp/main/scripts/install-macos.sh | bash
|
|
29
|
+
curl -fsSL https://raw.githubusercontent.com/reconcrap-cpu/boss-recommend-mcp/main/scripts/install-macos.sh | bash -s -- --agent openclaw
|
|
30
|
+
|
|
31
|
+
Supported agents: cursor, trae, trae-cn, claude, openclaw, qclaw, all
|
|
32
|
+
|
|
33
|
+
LLM config can be supplied non-interactively with:
|
|
34
|
+
BOSS_RECOMMEND_BASE_URL, BOSS_RECOMMEND_API_KEY, BOSS_RECOMMEND_MODEL,
|
|
35
|
+
BOSS_RECOMMEND_THINKING_LEVEL, BOSS_RECOMMEND_GREETING_MESSAGE
|
|
36
|
+
EOF
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
log() {
|
|
40
|
+
printf '%s\n' "[boss-recommend-mcp] $*"
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
die() {
|
|
44
|
+
printf '%s\n' "[boss-recommend-mcp] ERROR: $*" >&2
|
|
45
|
+
exit 1
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
run() {
|
|
49
|
+
log "+ $*"
|
|
50
|
+
if [ "$DRY_RUN" -eq 0 ]; then
|
|
51
|
+
"$@"
|
|
52
|
+
fi
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
while [ "$#" -gt 0 ]; do
|
|
56
|
+
case "$1" in
|
|
57
|
+
--agent)
|
|
58
|
+
[ "$#" -ge 2 ] || die "--agent requires a value"
|
|
59
|
+
AGENT="$2"
|
|
60
|
+
shift 2
|
|
61
|
+
;;
|
|
62
|
+
--node-version)
|
|
63
|
+
[ "$#" -ge 2 ] || die "--node-version requires a value"
|
|
64
|
+
NODE_VERSION="$2"
|
|
65
|
+
shift 2
|
|
66
|
+
;;
|
|
67
|
+
--nvm-version)
|
|
68
|
+
[ "$#" -ge 2 ] || die "--nvm-version requires a value"
|
|
69
|
+
NVM_VERSION="$2"
|
|
70
|
+
shift 2
|
|
71
|
+
;;
|
|
72
|
+
--dry-run)
|
|
73
|
+
DRY_RUN=1
|
|
74
|
+
shift
|
|
75
|
+
;;
|
|
76
|
+
--skip-doctor)
|
|
77
|
+
SKIP_DOCTOR=1
|
|
78
|
+
shift
|
|
79
|
+
;;
|
|
80
|
+
--skip-llm-config)
|
|
81
|
+
SKIP_LLM_CONFIG=1
|
|
82
|
+
shift
|
|
83
|
+
;;
|
|
84
|
+
--base-url)
|
|
85
|
+
[ "$#" -ge 2 ] || die "--base-url requires a value"
|
|
86
|
+
BASE_URL="$2"
|
|
87
|
+
shift 2
|
|
88
|
+
;;
|
|
89
|
+
--api-key)
|
|
90
|
+
[ "$#" -ge 2 ] || die "--api-key requires a value"
|
|
91
|
+
API_KEY="$2"
|
|
92
|
+
shift 2
|
|
93
|
+
;;
|
|
94
|
+
--model)
|
|
95
|
+
[ "$#" -ge 2 ] || die "--model requires a value"
|
|
96
|
+
MODEL="$2"
|
|
97
|
+
shift 2
|
|
98
|
+
;;
|
|
99
|
+
--thinking-level)
|
|
100
|
+
[ "$#" -ge 2 ] || die "--thinking-level requires a value"
|
|
101
|
+
THINKING_LEVEL="$2"
|
|
102
|
+
shift 2
|
|
103
|
+
;;
|
|
104
|
+
--greeting-message)
|
|
105
|
+
[ "$#" -ge 2 ] || die "--greeting-message requires a value"
|
|
106
|
+
GREETING_MESSAGE="$2"
|
|
107
|
+
shift 2
|
|
108
|
+
;;
|
|
109
|
+
-h|--help)
|
|
110
|
+
usage
|
|
111
|
+
exit 0
|
|
112
|
+
;;
|
|
113
|
+
*)
|
|
114
|
+
die "Unknown option: $1"
|
|
115
|
+
;;
|
|
116
|
+
esac
|
|
117
|
+
done
|
|
118
|
+
|
|
119
|
+
prompt_text() {
|
|
120
|
+
local label="$1"
|
|
121
|
+
local default_value="$2"
|
|
122
|
+
local secret="${3:-0}"
|
|
123
|
+
local value
|
|
124
|
+
if [ ! -r /dev/tty ]; then
|
|
125
|
+
return 1
|
|
126
|
+
fi
|
|
127
|
+
if [ "$secret" -eq 1 ]; then
|
|
128
|
+
printf '%s' "${label}: " > /dev/tty
|
|
129
|
+
IFS= read -r -s value < /dev/tty || return 1
|
|
130
|
+
printf '\n' > /dev/tty
|
|
131
|
+
elif [ -n "$default_value" ]; then
|
|
132
|
+
printf '%s' "${label} [${default_value}]: " > /dev/tty
|
|
133
|
+
IFS= read -r value < /dev/tty || return 1
|
|
134
|
+
if [ -z "$value" ]; then
|
|
135
|
+
value="$default_value"
|
|
136
|
+
fi
|
|
137
|
+
else
|
|
138
|
+
printf '%s' "${label}: " > /dev/tty
|
|
139
|
+
IFS= read -r value < /dev/tty || return 1
|
|
140
|
+
fi
|
|
141
|
+
printf '%s' "$value"
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if [ "$(uname -s)" != "Darwin" ]; then
|
|
145
|
+
if [ "$DRY_RUN" -eq 1 ]; then
|
|
146
|
+
log "dry-run on non-macOS host; skipping platform enforcement"
|
|
147
|
+
else
|
|
148
|
+
die "This bootstrap script is for macOS. Use npm install -g ${PACKAGE_NAME}@latest on other platforms."
|
|
149
|
+
fi
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
|
|
153
|
+
|
|
154
|
+
load_nvm() {
|
|
155
|
+
if [ -s "$NVM_DIR/nvm.sh" ]; then
|
|
156
|
+
# shellcheck disable=SC1090
|
|
157
|
+
. "$NVM_DIR/nvm.sh"
|
|
158
|
+
elif [ -s "$HOME/.nvm/nvm.sh" ]; then
|
|
159
|
+
export NVM_DIR="$HOME/.nvm"
|
|
160
|
+
# shellcheck disable=SC1091
|
|
161
|
+
. "$HOME/.nvm/nvm.sh"
|
|
162
|
+
fi
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
install_nvm() {
|
|
166
|
+
if command -v nvm >/dev/null 2>&1; then
|
|
167
|
+
return
|
|
168
|
+
fi
|
|
169
|
+
log "nvm was not found; installing ${NVM_VERSION} into ${NVM_DIR}"
|
|
170
|
+
if [ "$DRY_RUN" -eq 1 ]; then
|
|
171
|
+
log "+ curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh | bash"
|
|
172
|
+
return
|
|
173
|
+
fi
|
|
174
|
+
curl -fsSL "https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh" | bash
|
|
175
|
+
load_nvm
|
|
176
|
+
command -v nvm >/dev/null 2>&1 || die "nvm installed but is not available in this shell. Open a new terminal and rerun this script."
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
load_nvm
|
|
180
|
+
install_nvm
|
|
181
|
+
|
|
182
|
+
run nvm install "$NODE_VERSION"
|
|
183
|
+
run nvm alias default "$NODE_VERSION"
|
|
184
|
+
run nvm use "$NODE_VERSION"
|
|
185
|
+
|
|
186
|
+
if [ "$DRY_RUN" -eq 0 ]; then
|
|
187
|
+
NODE_PATH="$(command -v node || true)"
|
|
188
|
+
NPM_PATH="$(command -v npm || true)"
|
|
189
|
+
NPM_PREFIX="$(npm config get prefix || true)"
|
|
190
|
+
log "node: ${NODE_PATH}"
|
|
191
|
+
log "npm: ${NPM_PATH}"
|
|
192
|
+
log "npm prefix: ${NPM_PREFIX}"
|
|
193
|
+
|
|
194
|
+
case "$NPM_PREFIX" in
|
|
195
|
+
/usr/local|/usr/local/*)
|
|
196
|
+
die "npm is still using /usr/local. Reload nvm and rerun this script; do not use sudo npm install -g."
|
|
197
|
+
;;
|
|
198
|
+
esac
|
|
199
|
+
case "$NPM_PREFIX" in
|
|
200
|
+
"$NVM_DIR"/*)
|
|
201
|
+
;;
|
|
202
|
+
*)
|
|
203
|
+
die "npm prefix is not under ${NVM_DIR}. Current prefix: ${NPM_PREFIX}"
|
|
204
|
+
;;
|
|
205
|
+
esac
|
|
206
|
+
else
|
|
207
|
+
log "+ verify: npm config get prefix must be under ${NVM_DIR}, not /usr/local"
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
run npm -g i "${PACKAGE_NAME}@latest"
|
|
211
|
+
run boss-recommend-mcp where
|
|
212
|
+
|
|
213
|
+
INSTALL_ARGS=(install --mcp-launch global-wrapper)
|
|
214
|
+
DOCTOR_ARGS=(doctor)
|
|
215
|
+
if [ -n "$AGENT" ]; then
|
|
216
|
+
INSTALL_ARGS+=(--agent "$AGENT")
|
|
217
|
+
DOCTOR_ARGS+=(--agent "$AGENT")
|
|
218
|
+
fi
|
|
219
|
+
|
|
220
|
+
run boss-recommend-mcp "${INSTALL_ARGS[@]}"
|
|
221
|
+
|
|
222
|
+
if [ "$SKIP_LLM_CONFIG" -eq 0 ]; then
|
|
223
|
+
log "LLM screening config is required before running candidate screening."
|
|
224
|
+
if [ "$DRY_RUN" -eq 0 ]; then
|
|
225
|
+
if [ -r /dev/tty ]; then
|
|
226
|
+
BASE_URL="$(prompt_text "LLM base URL" "$BASE_URL")"
|
|
227
|
+
MODEL="$(prompt_text "LLM model" "$MODEL")"
|
|
228
|
+
THINKING_LEVEL="$(prompt_text "LLM thinking level" "$THINKING_LEVEL")"
|
|
229
|
+
GREETING_MESSAGE="$(prompt_text "Greeting message for candidates" "$GREETING_MESSAGE")"
|
|
230
|
+
if [ -z "$API_KEY" ]; then
|
|
231
|
+
API_KEY="$(prompt_text "LLM API key (input hidden)" "" 1)"
|
|
232
|
+
fi
|
|
233
|
+
fi
|
|
234
|
+
if [ -z "$BASE_URL" ] || [ -z "$API_KEY" ] || [ -z "$MODEL" ]; then
|
|
235
|
+
cat >&2 <<EOF
|
|
236
|
+
[boss-recommend-mcp] LLM config is still required.
|
|
237
|
+
[boss-recommend-mcp] Ask the user for:
|
|
238
|
+
1. LLM base URL
|
|
239
|
+
2. LLM API key
|
|
240
|
+
3. LLM model name
|
|
241
|
+
[boss-recommend-mcp] Then run:
|
|
242
|
+
boss-recommend-mcp config set --base-url <baseUrl> --api-key <apiKey> --model <model> --thinking-level ${THINKING_LEVEL}
|
|
243
|
+
EOF
|
|
244
|
+
exit 2
|
|
245
|
+
fi
|
|
246
|
+
fi
|
|
247
|
+
|
|
248
|
+
CONFIG_ARGS=(config set --base-url "$BASE_URL" --api-key "$API_KEY" --model "$MODEL")
|
|
249
|
+
if [ -n "$THINKING_LEVEL" ]; then
|
|
250
|
+
CONFIG_ARGS+=(--thinking-level "$THINKING_LEVEL")
|
|
251
|
+
fi
|
|
252
|
+
if [ -n "$GREETING_MESSAGE" ]; then
|
|
253
|
+
CONFIG_ARGS+=(--greeting-message "$GREETING_MESSAGE")
|
|
254
|
+
fi
|
|
255
|
+
|
|
256
|
+
if [ "$DRY_RUN" -eq 1 ]; then
|
|
257
|
+
log "+ boss-recommend-mcp config set --base-url ${BASE_URL:-<baseUrl>} --api-key <hidden> --model ${MODEL:-<model>} --thinking-level ${THINKING_LEVEL:-<level>}"
|
|
258
|
+
else
|
|
259
|
+
log "+ boss-recommend-mcp config set --base-url ${BASE_URL} --api-key <hidden> --model ${MODEL}"
|
|
260
|
+
boss-recommend-mcp "${CONFIG_ARGS[@]}"
|
|
261
|
+
fi
|
|
262
|
+
else
|
|
263
|
+
log "Skipping LLM config because --skip-llm-config was provided."
|
|
264
|
+
fi
|
|
265
|
+
|
|
266
|
+
if [ "$SKIP_DOCTOR" -eq 0 ]; then
|
|
267
|
+
log "+ boss-recommend-mcp ${DOCTOR_ARGS[*]}"
|
|
268
|
+
if [ "$DRY_RUN" -eq 0 ]; then
|
|
269
|
+
if ! boss-recommend-mcp "${DOCTOR_ARGS[@]}"; then
|
|
270
|
+
log "doctor reported follow-up work. The npm package install still completed."
|
|
271
|
+
fi
|
|
272
|
+
fi
|
|
273
|
+
fi
|
|
274
|
+
|
|
275
|
+
cat <<EOF
|
|
276
|
+
[boss-recommend-mcp] install complete.
|
|
277
|
+
[boss-recommend-mcp] Future upgrades:
|
|
278
|
+
npm -g i ${PACKAGE_NAME}@latest
|
|
279
|
+
boss-recommend-mcp where
|
|
280
|
+
EOF
|
|
@@ -94,8 +94,14 @@ description: "Use when users want Boss recommend-page filtering/screening via bo
|
|
|
94
94
|
- 限制:只读岗位列表,不启动筛选任务;若返回 `BOSS_LOGIN_REQUIRED`,必须让用户在自动打开的 Chrome 完成登录后重试,本次 cron 不得创建。
|
|
95
95
|
- Cron 准备工具:`prepare_recommend_pipeline_run`
|
|
96
96
|
- 用途:只校验参数是否已可用于 cron / 一次性任务,不启动筛选任务。
|
|
97
|
-
- 要求:只有返回 `status=READY` 且 `cron_ready=true`
|
|
97
|
+
- 要求:只有返回 `status=READY` 且 `cron_ready=true` 后,才允许继续创建定时任务。
|
|
98
98
|
- 若返回 `NEED_INPUT` / `NEED_CONFIRMATION` / `FAILED`:继续补齐 `pending_questions` 或修复登录/页面/config;不得先创建 cron。
|
|
99
|
+
- Cron 创建工具:`schedule_recommend_pipeline_run`
|
|
100
|
+
- 用途:保存已经 READY 的完整 payload,并启动 package-owned detached scheduler;到点后由包内 worker 直接调用 `start_recommend_pipeline_run`。
|
|
101
|
+
- 必填:同 `start_recommend_pipeline_run` 的完整 payload,另加 `schedule_delay_minutes` / `schedule_delay_seconds` / `schedule_run_at` 之一。
|
|
102
|
+
- 成功标准:必须返回 `status=SCHEDULED`、`schedule_created=true`、`schedule_id`、`run_at`。只有这个返回后,才可以告诉用户定时任务已创建。
|
|
103
|
+
- Cron 查询工具:`get_recommend_scheduled_run`
|
|
104
|
+
- 用途:用户问“任务是否启动/进度”时,先查 `schedule_id`。若到点后已启动,会返回内层 `run_id` 和 run 快照。
|
|
99
105
|
- 主工具:`start_recommend_pipeline_run`
|
|
100
106
|
- 必填:`instruction`
|
|
101
107
|
- 关键输入:
|
|
@@ -119,16 +125,30 @@ description: "Use when users want Boss recommend-page filtering/screening via bo
|
|
|
119
125
|
2. 收集 Stage A 全部筛选项、`target_count`、`post_action`、`max_greet_count`(如需要)和本次 `rest_level`。
|
|
120
126
|
3. 调用 `list_recommend_jobs`;若 Chrome 未打开,工具会尝试自动打开本机 9222 Chrome 并进入推荐页。若返回 `BOSS_LOGIN_REQUIRED` 或页面不可用,停止 cron 创建,让用户登录/修复后重试。
|
|
121
127
|
4. 用 `job_names` 中的精确岗位名完成岗位确认,并完成最终总确认,写入 `job_confirmed=true` 与 `final_confirmed=true`。
|
|
122
|
-
5. 调用 `prepare_recommend_pipeline_run` 传入将来要执行的完整 payload;只有 `READY + cron_ready=true`
|
|
123
|
-
6.
|
|
128
|
+
5. 调用 `prepare_recommend_pipeline_run` 传入将来要执行的完整 payload;只有 `READY + cron_ready=true` 才能继续。
|
|
129
|
+
6. 立即调用 `schedule_recommend_pipeline_run`,传入同一份完整 payload 和 `schedule_delay_minutes` / `schedule_run_at`。禁止让 OpenClaw 自己写 `/tmp/*.log` shell cron、自然语言提醒、或未来对话回调来代替此工具。
|
|
130
|
+
7. 只有拿到 `SCHEDULED + schedule_id` 后才告诉用户定时任务已创建。回复必须包含 `schedule_id`,而不是只说“10 分钟后会启动”。
|
|
131
|
+
8. 到点后由 package-owned detached scheduler 启动;若 Chrome/登录异常,应作为 schedule/run 失败处理,不得再向用户追问参数。
|
|
124
132
|
|
|
125
|
-
Shell-only OpenClaw/QClaw cron
|
|
133
|
+
Shell-only OpenClaw/QClaw cron 设置同样先运行 prepare:
|
|
126
134
|
|
|
127
135
|
```powershell
|
|
128
136
|
npx -y @reconcrap/boss-recommend-mcp@latest prepare-run --instruction-file .\boss-recommend-instruction.txt --overrides-file .\boss-recommend-overrides.json --confirmation-file .\boss-recommend-confirmation.json --slow-live --port 9222
|
|
129
137
|
```
|
|
130
138
|
|
|
131
|
-
仅当上述命令输出 `READY` 且 `cron_ready=true`
|
|
139
|
+
仅当上述命令输出 `READY` 且 `cron_ready=true` 后,才允许继续创建定时任务。
|
|
140
|
+
|
|
141
|
+
然后必须用 package-owned scheduler 创建定时任务,不要手写系统 cron:
|
|
142
|
+
|
|
143
|
+
```powershell
|
|
144
|
+
npx -y @reconcrap/boss-recommend-mcp@latest schedule-run --schedule-delay-minutes 10 --instruction-file .\boss-recommend-instruction.txt --overrides-file .\boss-recommend-overrides.json --confirmation-file .\boss-recommend-confirmation.json --slow-live --port 9222
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
用户查询时:
|
|
148
|
+
|
|
149
|
+
```powershell
|
|
150
|
+
npx -y @reconcrap/boss-recommend-mcp@latest schedule-status --schedule-id <schedule_id>
|
|
151
|
+
```
|
|
132
152
|
|
|
133
153
|
## Async Run Policy
|
|
134
154
|
|
|
@@ -173,14 +193,15 @@ npx -y @reconcrap/boss-recommend-mcp@latest prepare-run --instruction-file .\bos
|
|
|
173
193
|
推荐做法:
|
|
174
194
|
|
|
175
195
|
1. 将锁定的用户原文写入 instruction 文件,将已确认参数写入 `overrides` 与 `confirmation` JSON 文件。
|
|
176
|
-
2. 先用 `prepare-run` 校验完整 payload 已 cron-ready;未返回 `READY + cron_ready=true`
|
|
177
|
-
3.
|
|
196
|
+
2. 先用 `prepare-run` 校验完整 payload 已 cron-ready;未返回 `READY + cron_ready=true` 不得创建定时任务或启动 run。
|
|
197
|
+
3. 若用户要“现在启动”,用 detached CLI 启动,让父命令返回启动证据,子进程继续持有 CDP 会话:
|
|
178
198
|
|
|
179
199
|
```powershell
|
|
180
200
|
npx -y @reconcrap/boss-recommend-mcp@latest run --detached --instruction-file .\boss-recommend-instruction.txt --overrides-file .\boss-recommend-overrides.json --confirmation-file .\boss-recommend-confirmation.json --slow-live --port 9222
|
|
181
201
|
```
|
|
182
202
|
|
|
183
|
-
4.
|
|
203
|
+
4. 若用户要“稍后/cron/定时启动”,用 `schedule-run`,不是 `run --detached`。若 `schedule-run` 未返回 `SCHEDULED + schedule_id`,不得告诉用户定时任务已创建。
|
|
204
|
+
5. 若即时 `run --detached` 返回 `ACCEPTED + run_id`,即任务已启动;记录 `run_id/stdout_path/stderr_path`。若返回 `NEED_INPUT` 或 `NEED_CONFIRMATION`,说明设置阶段漏掉了准备门禁,应回到 `prepare-run` 补齐,不能在到点后继续问用户确认。
|
|
184
205
|
|
|
185
206
|
兼容路径:
|
|
186
207
|
|