auto: sync OpenClaw config 2026-09-16 22:13
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
---
|
||||
name: "fitness-db-access"
|
||||
description: "读写 fitness 库健康数据时用:中文写入须前缀 SET NAMES utf8mb4(否则报错 1265 截断),斤转 kg,写后回读校验"
|
||||
---
|
||||
|
||||
# Fitness 库读写
|
||||
|
||||
## 连接方式
|
||||
一律用 `~/.openclaw/scripts/db-conn.sh fitness --sql "<SQL>"`(固定账号 `agent_fitness`)。
|
||||
禁止 root、禁止 docker exec 直连、禁止访问其他 agent 的库。建表结构与字段以 AGENTS.md 为准,勿在此重复。
|
||||
|
||||
## 含中文的 SQL 必须以 `SET NAMES utf8mb4;` 开头
|
||||
脚本内的 mysql 客户端连接字符集默认是 latin1(实测 `character_set_client` / `character_set_results` 均为 latin1)。因此:
|
||||
|
||||
- 写中文到 enum/文本列会直接失败:`ERROR 1265 (01000) ... Data truncated for column 'severity' at row 1`
|
||||
- 读中文会返回乱码(如 enum 显示成 `'?'`)
|
||||
|
||||
每条含中文的 SQL 都加前缀:
|
||||
|
||||
~/.openclaw/scripts/db-conn.sh fitness --sql "SET NAMES utf8mb4; INSERT INTO health_status_logs (...) VALUES (...)"
|
||||
|
||||
## 写入后回读(DML 与 DDL 都适用)
|
||||
`--sql` 以 `-N -B` 执行(制表符分隔、无表头),INSERT 无输出即成功。
|
||||
随后同条件 SELECT 回读,确认中文无乱码、字段无截断,再报完成。
|
||||
建表/改表同样静默成功,用 `DESC <表>`(或 `SHOW CREATE TABLE <表>\G` 看 COMMENT 与索引)回读确认,再报完成。
|
||||
|
||||
## 体重单位换算
|
||||
用户口述单位是「斤」,而 `body_records.weight` 存 kg(decimal(5,1)):kg = 斤 ÷ 2。
|
||||
例:132.4 斤 → 66.2。
|
||||
|
||||
## 身体尺寸 / 尺码卡查询
|
||||
尺寸单一真相来源是 `body_measurements`(字段清单见 AGENTS.md,勿在此重复)。取最新一条即"尺码卡":
|
||||
|
||||
~/.openclaw/scripts/db-conn.sh fitness --sql "SET NAMES utf8mb4; SELECT measure_date, height, shoulder_width, chest, waist, hip, arm_length, inseam, note FROM body_measurements WHERE user_id='yangxuan' ORDER BY measure_date DESC LIMIT 1;"
|
||||
|
||||
输出身高/肩宽/胸围/腰围/臀围/裤长,**必须标注腰围测法**:`waist` 是肚脐水平实测,与裤装标注腰围尺码可能差 2-4cm,买裤时以版型说明为准。
|
||||
尺寸是无单位的 cm 数(与体重不同,**不做斤/公斤换算**),不要套用上面的体重换算。
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: "birthday-reminder"
|
||||
description: "\"管理家人/朋友生日提醒。农历或阳历生日,每年换算公历,生日前7天、前3天、当天通过钉钉提醒杨轩。\""
|
||||
description: "管理家人/朋友生日提醒。农历或阳历生日,每年换算公历,生日前7天、前3天、当天通过钉钉提醒杨轩。"
|
||||
---
|
||||
|
||||
# 生日提醒 skill
|
||||
@@ -62,6 +62,7 @@ for year in range(2026, 2031):
|
||||
cd /home/yangxuan/.openclaw && openclaw cron create "<UTC时间ISO>" \
|
||||
--name "<姓名>生日提前7天" \
|
||||
--message "🎂 提醒:<姓名>生日快到了!7天后<br>就是生日。" \
|
||||
--agent main \
|
||||
--session isolated --announce --channel dingtalk-connector \
|
||||
--to "0464031658857345" --wake now --delete-after-run
|
||||
```
|
||||
|
||||
@@ -1,82 +1,50 @@
|
||||
---
|
||||
name: "db-backup-enroll"
|
||||
description: "新建带数据库的 agent 时,自动把其库加入每日备份脚本 backup-agent-dbs.sh,保证所有本地库被 crontab 03:00 备份。"
|
||||
description: "新建带库 agent 后核对每日 03:00 备份是否覆盖其库(backup-agent-dbs.sh 动态发现,无需改脚本)。"
|
||||
---
|
||||
|
||||
# DB Backup Enroll — 新建 agent 自动加入数据库备份
|
||||
# DB Backup Enroll — 新 agent 的库是否已被每日备份覆盖
|
||||
|
||||
## 目的
|
||||
|
||||
本地 Docker MySQL 有一套每日 03:00 自动备份机制(crontab + `/usr/local/bin/backup-agent-dbs.sh`)。**每当新建一个带数据库的 agent,必须把它的库加进这个备份脚本**,否则新库不会被备份,存在数据丢失风险。
|
||||
本地 Docker MySQL 有每日 03:00 自动备份(crontab + `/usr/local/bin/backup-agent-dbs.sh`)。新建带库 agent 后,**核对**其库已被自动覆盖;缺了就修根因,不要手工往脚本里塞库名。
|
||||
|
||||
## 核心脚本与机制
|
||||
## 机制(2026-09-16 改造后,实测)
|
||||
|
||||
| 项 | 内容 |
|
||||
|----|------|
|
||||
| 备份脚本 | `/usr/local/bin/backup-agent-dbs.sh`(root 所有,需 sudo 编辑)|
|
||||
| 触发 | crontab:`0 3 * * * /usr/local/bin/backup-agent-dbs.sh` |
|
||||
| 备份方式 | `docker exec mysql mysqldump --single-transaction --routines --triggers --events <db>` |
|
||||
| 备份产物 | `workspace-<agent>/db/<db>_<日期>.sql.gz` + `<db>_latest.sql` |
|
||||
| 保留 | 30 天前 `.sql.gz` 自动删除 |
|
||||
| 同步 | git commit + push 到 Gitea 远程 |
|
||||
| 目标发现 | **动态**:`agents.entries` 的 id ∩ MySQL 实际存在的库(排除 `mysql`/`information_schema`/`performance_schema`/`sys`) |
|
||||
| 备份方式 | `docker exec mysql mysqldump -uroot -p<从 .env 读> --single-transaction --routines --triggers --events <db>` |
|
||||
| 产物 | `workspace-<agentId>/db/<db>_<YYYYMMDD>.sql.gz` + `<db>_latest.sql`;`main` 的目录是 `workspace`(无 `-<id>` 后缀) |
|
||||
| 保留 | 30 天前的 `.sql.gz` 自动删除 |
|
||||
| 同步 | git add 各 `workspace-<id>/db/`(`main` 的 `workspace/db/` 不纳入)→ commit → push Gitea |
|
||||
| 日志 | `workspace/db/backup.log` |
|
||||
| 凭据 | `.env` 的 `MYSQL_PWD_ROOT`(缺失时回退 `MYSQL_PWD`)、`PGPASSWORD`,由脚本内部读取 |
|
||||
|
||||
## 需要备份的 MySQL 库(本地 Docker 实例 127.0.0.1:3306)
|
||||
> 旧版硬编码 `DB_MAP` 已废弃——脚本里只剩一句注释提到它。**不要再按「改三处名单(DB_MAP / 清理循环 / git add)」的旧流程操作**,那些循环现在都由动态 `TARGETS` 驱动。
|
||||
|
||||
当前 DB_MAP(脚本内)已覆盖:main / resume / travel / fitness / finances / wellness / juaner / tab。
|
||||
## 步骤
|
||||
|
||||
⚠️ **任何新建带库 agent,其库必须加入此映射。**
|
||||
|
||||
## 标准操作流程
|
||||
|
||||
### 1. 新增 agent 后——把库加入备份(核心步骤)
|
||||
|
||||
用 sudo 精确编辑 `/usr/local/bin/backup-agent-dbs.sh`,**三处都要改**(缺一不可):
|
||||
|
||||
**(a) 扩展 `DB_MAP`**(脚本中部):
|
||||
1. 确认库存在且归属正确:`~/.openclaw/scripts/db-conn.sh <agentId> --sql "SELECT DATABASE()"` 返回 `<agentId>` 才算通。
|
||||
2. 确认 id 在配置里:`agents.entries` 含该 id。
|
||||
- 用 `bash ~/.openclaw/scripts/new-agent.sh <id> <中文名>` 建的 agent 两件事都会就位(建库 + 建号 + 授权 + 写 `.env` + 建 agent),此时**无需再动备份脚本**。
|
||||
3. 核对覆盖情况:上次 03:00 之后看日志
|
||||
```bash
|
||||
declare -A DB_MAP=(
|
||||
...
|
||||
["<库名>"]="workspace-<agentId>" # 新增这一行
|
||||
)
|
||||
tail -30 /home/yangxuan/.openclaw/workspace/db/backup.log
|
||||
```
|
||||
日志应出现 `备份目标:... <db> ...`,且该库有 `✅ MySQL <db> -> ...` 行。
|
||||
4. 目标里缺该库时,先修根因(库不存在 / id 不在 `agents.entries`),不要改脚本绕过。
|
||||
5. 需要当天就见证而不等次日:执行一次备份脚本,再回看日志确认该库出现 `✅`(脚本会照常 git push,这是它设计内的行为)。
|
||||
|
||||
**(b) 扩展清理循环名单**(`for WS in workspace ...` 一行):
|
||||
```bash
|
||||
for WS in workspace workspace-resume workspace-travel workspace-fitness workspace-finances workspace-wellness workspace-juaner workspace-tab workspace-sql; do
|
||||
# 把 workspace-<agentId> 追加进去
|
||||
```
|
||||
## 红旗
|
||||
|
||||
**(c) 扩展 git add 名单**(`for WS in resume travel fitness finances ...` 一行):
|
||||
```bash
|
||||
for WS in resume travel fitness finances wellness juaner tab sql; do
|
||||
# 把 <agentId> 追加进去
|
||||
```
|
||||
|
||||
### 2. 语法与功能验证
|
||||
|
||||
```bash
|
||||
sudo bash -n /usr/local/bin/backup-agent-dbs.sh # 语法检查
|
||||
# 手动测试该库能否备份(不触发整个脚本的 git push)
|
||||
# 连接口令从脚本内读取到变量,勿明文写入命令行/聊天/日志
|
||||
docker exec mysql mysqldump -uroot -p"$DB_PW" --single-transaction --routines --triggers --events <db> | gzip > /tmp/test_<db>.sql.gz
|
||||
```
|
||||
|
||||
### 3. 核对清单(新 agent 交付前)
|
||||
|
||||
- [ ] DB_MAP 含 `<库名> => workspace-<agentId>`
|
||||
- [ ] 清理循环名单含 `workspace-<agentId>`
|
||||
- [ ] git add 名单含 `<agentId>`
|
||||
- [ ] 手动 mysqldump 该库成功
|
||||
- [ ] (可选)真实触发一次备份确认落盘
|
||||
|
||||
## 红旗 / 注意
|
||||
- 脚本属 root:编辑必须 `sudo`,改前先 `sudo cp ... .bak-$(date +%Y%m%d)` 备份。
|
||||
- 脚本内的连接口令只存在于主机脚本;**不要复制到命令参数、聊天或日志**,需要用连接时在脚本内部读取。
|
||||
- `docker exec mysql ...` 用的是容器名 `mysql`;PostgreSQL 部分是 `postgres` 容器 `openclaw` 库,无需动(除非新增 PG 库)。
|
||||
- 备份会自动 git push 到 Gitea——这是脚本设计的一部分,属授权操作,无需额外请示。
|
||||
- 备份脚本属 root:确有必要才 `sudo` 编辑,改前先 `sudo cp` 备份原件。
|
||||
- 连接口令只在 `.env` / 脚本内部读取;**不要复制到命令参数、聊天或日志**。
|
||||
- `docker exec` 容器名固定为 `mysql`;PostgreSQL 部分备份容器 `postgres` 的 `openclaw` 库,与本流程无关。
|
||||
- 备份会自动 push 到 Gitea,属脚本设计的一部分,无需额外请示。
|
||||
|
||||
## 相关文件
|
||||
- 主脚本:`/usr/local/bin/backup-agent-dbs.sh`
|
||||
- 建 agent 入口:`/home/yangxuan/.openclaw/scripts/new-agent.sh`
|
||||
- 备份日志:`/home/yangxuan/.openclaw/workspace/db/backup.log`
|
||||
- 数据库映射定义:`MEMORY.md` →「🐬 本地数据库环境(Docker MySQL)」→「本地库 ↔ Agent 映射」
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
---
|
||||
name: "scheduled-reminders"
|
||||
description: "创建/管理定时提醒(每周/每天/睡前等周期或一次性)并推送钉钉。触发:帮我设提醒、每天X点提醒、每周提醒。"
|
||||
description: "创建/管理定时提醒(每周/每天/睡前等周期或一次性)并推送到钉钉或飞书。触发:帮我设提醒、每天X点提醒、每周提醒、推送到飞书。"
|
||||
---
|
||||
|
||||
# scheduled-reminders
|
||||
|
||||
创建和管理杨轩的定时提醒:周期性(每周/每天)或一次性,统一通过钉钉推送。非生日类提醒走本 skill;生日提醒走 birthday-reminder skill。
|
||||
创建和管理杨轩的定时提醒:周期性(每周/每天)或一次性,默认推送钉钉,用户点名时改投飞书(见「投递通道」)。非生日类提醒走本 skill;生日提醒走 birthday-reminder skill。
|
||||
|
||||
## 触发场景
|
||||
|
||||
@@ -16,11 +16,21 @@ description: "创建/管理定时提醒(每周/每天/睡前等周期或一次
|
||||
|
||||
所有提醒都是 OpenClaw cron 任务,统一:
|
||||
|
||||
- **投递只交给 delivery**:`--announce --channel dingtalk-connector --to 0464031658857345`。payload 只输出文案 `--command 'echo "..."'`。
|
||||
- **投递只交给 delivery**:payload 只输出文案(`--command 'echo "..."'`),路由写在 delivery 参数上;**默认钉钉**:`--announce --channel dingtalk-connector --to 0464031658857345`。用户要求飞书时按「投递通道」换参数。
|
||||
- **多频道下频道必须显式**:本机已配 3 个频道(dingtalk-connector / feishu / openclaw-weixin),省略投递参数时 `cron add` 直接失败:`cron announce delivery requires an explicit channel when multiple channels are configured`。要推送就照上面写全;**不需要推送给人的内部维护任务**加 `--no-deliver`(实测结果 `delivery.mode=none`),不要只把 flag 省掉。
|
||||
- **禁止**在命令里手动调 `openclaw message send`——CLI 的 message send 不认识 `dingtalk-connector`(内置频道枚举无 DingTalk 插件名),会 exit 1 失败。
|
||||
- **必须 `--agent main`**:多 agent 环境下无 owner(agent-less)的 cron 任务会让调度器 nextWake 锁死,阻塞所有提醒。
|
||||
- **时间参数**:周期性用 `--cron "<表达式>" --tz Asia/Shanghai`;一次性用 `--at`(不带时区按 UTC 处理,北京时间 = UTC+8)。
|
||||
|
||||
## 投递通道:钉钉(默认)/ 飞书
|
||||
|
||||
杨轩说「推送到飞书」时,只把 delivery 换掉:`--announce --channel feishu --to <目标>`。
|
||||
|
||||
- **飞书目标必须用 DM 会话 chat_id**:`oc_8eecfa0e1cc185c1cb19b4f3950cbc52`(杨轩的飞书私聊)。
|
||||
- **不要用用户 open_id**(`ou_28124d6721134f0e31d6122d30088418`):2026-09-16 实测 cron 投递报 `Feishu send failed: Sending messages to users is temporarily unavailable.`,判为 not-delivered;同一时刻改投上面的 chat_id 即刻成功。错误文案含「temporarily」,条件可能变化,但先用 chat_id 就不必试错。用 `conversations_list(channel="feishu")` 可复核 DM 目标。
|
||||
- **换通道只动 delivery**:`--agent main`、时间、打卡机制等其余规则一律不变。
|
||||
- **通了没有要实测,不要推断**:可临时建一条一次性测试任务,用 `automations run <jobId>` 立即跑一次,看 `state.lastDelivered` / `lastDeliveryError`,验证完把测试任务删掉。
|
||||
|
||||
## 创建一条周期提醒
|
||||
|
||||
```bash
|
||||
@@ -34,6 +44,8 @@ openclaw cron add "任务名" \
|
||||
|
||||
cron 星期数字:**周日 = 0,周一 = 1 … 周六 = 6**(容易记错,务必核对)。
|
||||
|
||||
**写在脚本里时用 CLI 绝对路径**:`/home/yangxuan/.openclaw/tmp/agent-cli/openclaw`(裸 `openclaw` 是同一目录下的 shim,只在 exec 的 PATH 里有效)。shell 助手/批量脚本若自行重设了 `PATH`,裸 `openclaw` 会报「未找到命令」(2026-09-16 实测);用绝对路径,或把该目录并入 `PATH`。
|
||||
|
||||
## 一次创建多条(批量)
|
||||
|
||||
多条同类提醒时,写一个 shell 助手函数把上面的标准 flag 包起来,再用循环调用(模板见 `examples/batch-reminders.sh`),比逐条手敲省大量往返。文案相同的提醒合并成变量复用,避免重复粘贴。
|
||||
@@ -43,7 +55,7 @@ cron 星期数字:**周日 = 0,周一 = 1 … 周六 = 6**(容易记错,
|
||||
创建后用 `openclaw cron get <id>` 逐条确认:
|
||||
|
||||
- `agentId=main`
|
||||
- `delivery.mode=announce`、`delivery.channel=dingtalk-connector`、`delivery.to=0464031658857345`
|
||||
- `delivery.mode=announce`,且 `delivery.channel`/`delivery.to` 就是本次要求的目标(钉钉:`dingtalk-connector` + `0464031658857345`;飞书:`feishu` + chat_id)
|
||||
- `schedule.expr` 与下次触发 `nextRunAtMs` 正确
|
||||
|
||||
整库不应残留 `message send` 字样。
|
||||
@@ -68,11 +80,25 @@ openclaw cron add "打卡检查" \
|
||||
--message '检查打卡:用 sessions_history 读会话 agent:main:dingtalk-connector:direct:0464031658857345 今天的消息;若用户在提醒时间后回复过「打卡」则回 NO_REPLY,否则发一条温和催促。'
|
||||
```
|
||||
|
||||
## 盘点已有提醒(用户问「某提醒还在不在 / 是不是在钉钉」时)
|
||||
|
||||
1. `automations list`(`includeDisabled: true`)按 `name` 定位目标;返回已含 `schedule`、`effectiveAgentId`、`nextRunAt`。
|
||||
2. 对关心的每条 `automations get <jobId>`,确认 `agentId=main`、`delivery.mode=announce`,并读实际 `delivery.channel`/`to` 回报它是投到钉钉还是飞书(不要默认钉钉)。
|
||||
3. 回报时给下次触发时间 + 上次投递结果(`state.lastDeliveryStatus=delivered` 才算真的发出去过)。
|
||||
|
||||
## 修改 / 删除
|
||||
|
||||
- 改文案/时间:`openclaw cron edit <id> --command '...'`(或 `--cron`/`--message`)
|
||||
- 改文案/时间:`openclaw cron edit <id> --command '...'`(或 `--cron`/`--message`),也可用 `automations` 工具的 `update <jobId>`
|
||||
- 删除:`openclaw cron rm <id>`
|
||||
|
||||
## 临时改一次(某晚停用某产品、出门在外等)
|
||||
|
||||
只改周期任务的 payload 就完事,会一直错下去;要配一条恢复任务:
|
||||
|
||||
1. 用 `automations update <jobId>`(或 `openclaw cron edit <id> --command '...'`)换成当晚版本,回读 `automations get <jobId>` 确认文案已生效。
|
||||
2. 同一步里建一条一次性任务,在次日合适时间把 payload 改回标准版本。它跑在 isolated 会话、**没有本次对话的记忆**,所以 message 必须写全 jobId 与目标文案原文,并注明改完回读校验、成功即回 `NO_REPLY`。
|
||||
3. 恢复任务不需要给人看:按核心规则加 `--no-deliver`。
|
||||
|
||||
## 参考
|
||||
|
||||
- 生日提醒(农历换算、每年重设、一次性任务):见 `birthday-reminder` skill
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
TO="0464031658857345"
|
||||
CH="dingtalk-connector"
|
||||
AGENT="main"
|
||||
# 本脚本自行设定 PATH 时必须用绝对路径(裸 openclaw 只在 exec 的 PATH 里有效)
|
||||
OC="/home/yangxuan/.openclaw/tmp/agent-cli/openclaw"
|
||||
# 改投飞书:CH="feishu",TO="oc_8eecfa0e1cc185c1cb19b4f3950cbc52"(DM chat_id,不要用用户 open_id)
|
||||
|
||||
# 文案相同的提醒合并为变量复用(示例:护肤用酸日/保湿日/休息日)
|
||||
TEXT_A='第一条提醒文案(可多行)'
|
||||
@@ -13,7 +16,7 @@ TEXT_B='第二条提醒文案(可多行)'
|
||||
add() {
|
||||
local name="$1" dow="$2" text="$3" # dow: 周日=0, 周一=1 ... 周六=6
|
||||
echo "--- 创建: $name (周$dow 21:00) ---"
|
||||
openclaw cron add "$name" \
|
||||
"$OC" cron add "$name" \
|
||||
--cron "0 21 * * $dow" --tz Asia/Shanghai \
|
||||
--agent "$AGENT" \
|
||||
--session isolated --announce \
|
||||
|
||||
@@ -1,23 +1,37 @@
|
||||
---
|
||||
name: "wellness"
|
||||
description: "管理按摩放松记录:查询/新增技师联系人(cc_contract)和放松记录(cc_contract_record),本地 MySQL wellness 库。"
|
||||
description: "管理按摩放松记录:查询/新增技师联系人(cc_contract)与放松记录(cc_contract_record),本地 MySQL wellness 库。"
|
||||
---
|
||||
|
||||
# Wellness — 按摩放松记录管理
|
||||
|
||||
管理本地 MySQL `wellness` 数据库,专注**按摩/放松**方向的技师联系人(联系方式)与每次放松记录的**查询与新增**。统计功能后续扩展。
|
||||
|
||||
**边界**:本库只记**到店/付费服务**的消费记录(技师联系人 + 每次服务记录)。健康/皮肤病症(湿疹、闭口粉刺、用药等)不属于本库,归 fitness(健康)agent 的健康档案。
|
||||
|
||||
## 数据库连接
|
||||
|
||||
复用 db-query skill 配置,数据库名「按摩放松」:
|
||||
本库 `wellness` 是 agent `wellness` 的私有库:库名 = agent id,账号 `agent_wellness`,唯一入口 `db-conn.sh`。
|
||||
|
||||
```bash
|
||||
python3 skills/db-query/scripts/db_query.py --database "按摩放松" --query "<SQL>"
|
||||
~/.openclaw/scripts/db-conn.sh wellness --sql "<SQL>"
|
||||
```
|
||||
|
||||
- 连接方式:localhost Docker MySQL(127.0.0.1:3306),user=root,password 已配置
|
||||
- 所有查询/写入都走 db-query 脚本,凭据不直连
|
||||
- 执行路径:`/home/yangxuan/.openclaw/workspace/skills/db-query/scripts/db_query.py`
|
||||
- 口令存 `~/.openclaw/.env` 的 `DB_PASSWORD_放松保健`,由脚本内部读取(不进命令行、不打印)
|
||||
- **禁止 root、禁止 docker exec 直连、禁止跨库**;旧写法(root 账号、`db-query --database "按摩放松"`)已废弃
|
||||
|
||||
### 中文乱码 / 写入失败(实测坑)
|
||||
|
||||
`db-conn.sh` 的 mysql 客户端连接字符集默认是 **latin1**(读写都受影响;这是 `db-conn.sh` 层面的行为,**其他 agent 的库同样适用**):
|
||||
|
||||
- 读:不带 `SET NAMES utf8mb4;` 时中文列全部返回 `???`
|
||||
- 写:中文 INSERT/UPDATE 报 `ERROR 1265 Data truncated for column '<列名>'`
|
||||
|
||||
把该语句放在同一条 `--sql` 的最前面即可正常读写:
|
||||
|
||||
```bash
|
||||
~/.openclaw/scripts/db-conn.sh wellness --sql "SET NAMES utf8mb4; SELECT contract_name,record_locale,comment FROM cc_contract_record ORDER BY record_date DESC LIMIT 5"
|
||||
```
|
||||
|
||||
## 表结构
|
||||
|
||||
@@ -66,10 +80,10 @@ INSERT INTO cc_contract
|
||||
(id, name, wechat, qq, phone, address, price, description, comment, group_type,
|
||||
is_delete, status, deleted, gmt_create, gmt_update, score)
|
||||
VALUES
|
||||
(UUID(), '<name>', '<wechat>', '<qq>', '<phone>', '<address>', <price>, '<desc>', '<comment>', <group_type>,
|
||||
(REPLACE(UUID(),'-',''), '<name>', '<wechat>', '<qq>', '<phone>', '<address>', <price>, '<desc>', '<comment>', <group_type>,
|
||||
0, 0, 0, NOW(), NOW(), <score>)
|
||||
```
|
||||
> `<id>` 用 `UUID()` 生成(32位无横线)。若 name 已存在会因 UNIQUE 冲突报错,先查询确认。
|
||||
> `cc_contract.id` 是 `varchar(32)`:**必须去横线**。直接 `UUID()` 是 36 位,strict mode 下报 `ERROR 1406 Data too long`(实测);用 `REPLACE(UUID(),'-','')` 得 32 位。`cc_contract_record.id` 是 `varchar(50)`,36 位也能存,但同样用去横线写法保持一致。若 name 已存在会因 UNIQUE 冲突报错,先查询确认。
|
||||
|
||||
**新增一次放松记录**:
|
||||
```sql
|
||||
@@ -77,16 +91,16 @@ INSERT INTO cc_contract_record
|
||||
(id, contract_id, contract_name, record_date, record_locale, price, score, comment,
|
||||
is_delete, status, deleted, gmt_create, gmt_update)
|
||||
VALUES
|
||||
(UUID(), '<contract_id>', '<name>', '<record_date>', '<record_locale>', <price>, <score>, '<comment>',
|
||||
(REPLACE(UUID(),'-',''), '<contract_id>', '<name>', '<record_date>', '<record_locale>', <price>, <score>, '<comment>',
|
||||
0, 0, 0, NOW(), NOW())
|
||||
```
|
||||
> contract_id 需先从 cc_contract 查到对应联系人 id;record_date 用 `YYYY-MM-DD`;record_locale 必填。
|
||||
> contract_id 需先从 cc_contract 查到对应联系人 id;record_date 用 `YYYY-MM-DD`;record_locale 必填——**用户没说地点时用机构名占位**(如 `奢思雅`),不要留空。价格/评分未提供时:price 留 `NULL`、score 走列默认 `0`(=未评分),事后拿到再 `UPDATE` 补,不要为了凑字段而追问。
|
||||
|
||||
### 3. 更新 / 软删
|
||||
- 更新联系人/记录:`UPDATE ... WHERE id='<id>'`(保留软删字段不变)
|
||||
- 软删:`UPDATE cc_contract SET status=1,deleted=1 WHERE id='<id>'`(不物理删除)
|
||||
|
||||
⚠️ **写入前先 SELECT 确认目标存在**,避免误操作。所有写入均通过 db-query 脚本执行。
|
||||
⚠️ **写入前先 SELECT 确认目标存在**,避免误操作。所有写入均通过 `db-conn.sh wellness` 执行。
|
||||
|
||||
## 通用原则
|
||||
- 全程中文交互
|
||||
|
||||
+9
-4
@@ -33,6 +33,11 @@
|
||||
# 0 成功
|
||||
# 2 用法/环境错误(参数缺失或非法、agent 不存在、中文名取不到、口令缺失)
|
||||
# 其他 docker 或 mysql 的原始退出码
|
||||
#
|
||||
# 【连接字符集】
|
||||
# 容器内 mysql 客户端默认按 latin1 建连,写中文会报
|
||||
# `ERROR 1265 (01000) Data truncated for column '...'`。故本脚本所有 mysql
|
||||
# 调用点统一带 `--default-character-set=utf8mb4`,调用方无需再手写 SET NAMES。
|
||||
# =============================================================================
|
||||
set -euo pipefail
|
||||
|
||||
@@ -162,12 +167,12 @@ fi
|
||||
# —— ④ --print:只打印等价命令,口令用占位符(绝不打印真实值)——
|
||||
if [[ "$PRINT_ONLY" == "1" ]]; then
|
||||
if [[ -n "$SQL" ]]; then
|
||||
printf "MYSQL_PWD='<从 .env 读取:%s>' docker exec -e MYSQL_PWD %s mysql -u%s -N -B -e %s %s\n" \
|
||||
printf "MYSQL_PWD='<从 .env 读取:%s>' docker exec -e MYSQL_PWD %s mysql --default-character-set=utf8mb4 -u%s -N -B -e %s %s\n" \
|
||||
"$PWD_KEY" "$MYSQL_CONTAINER" "$DB_USER" "$(quote_sql "$SQL")" "$DB_NAME"
|
||||
else
|
||||
# 交互式:本地有 TTY 才能 -it(与下面实际执行时的判定保持一致)
|
||||
if [[ -t 0 && -t 1 ]]; then TTY_FLAGS="-it"; else TTY_FLAGS="-i"; fi
|
||||
printf "MYSQL_PWD='<从 .env 读取:%s>' docker exec %s -e MYSQL_PWD %s mysql -u%s %s\n" \
|
||||
printf "MYSQL_PWD='<从 .env 读取:%s>' docker exec %s -e MYSQL_PWD %s mysql --default-character-set=utf8mb4 -u%s %s\n" \
|
||||
"$PWD_KEY" "$TTY_FLAGS" "$MYSQL_CONTAINER" "$DB_USER" "$DB_NAME"
|
||||
fi
|
||||
exit 0
|
||||
@@ -176,10 +181,10 @@ fi
|
||||
# —— ⑤ 连接:口令经 MYSQL_PWD 环境变量转发(不进 argv、不进 stdout)——
|
||||
if [[ -n "$SQL" ]]; then
|
||||
MYSQL_PWD="$PWD_VALUE" docker exec -e MYSQL_PWD "$MYSQL_CONTAINER" \
|
||||
mysql -u"$DB_USER" -N -B -e "$SQL" "$DB_NAME"
|
||||
mysql --default-character-set=utf8mb4 -u"$DB_USER" -N -B -e "$SQL" "$DB_NAME"
|
||||
else
|
||||
if [[ -t 0 && -t 1 ]]; then TTY_FLAGS="-it"; else TTY_FLAGS="-i"; fi
|
||||
echo "→ 已连接:库 $DB_NAME,账号 $DB_USER(输入 exit 或按 Ctrl-D 退出)" >&2
|
||||
MYSQL_PWD="$PWD_VALUE" docker exec $TTY_FLAGS -e MYSQL_PWD "$MYSQL_CONTAINER" \
|
||||
mysql -u"$DB_USER" "$DB_NAME"
|
||||
mysql --default-character-set=utf8mb4 -u"$DB_USER" "$DB_NAME"
|
||||
fi
|
||||
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
---
|
||||
name: "fitness-db-access"
|
||||
description: "读写 fitness 库健康数据时用:中文写入须前缀 SET NAMES utf8mb4(否则报错 1265 截断),斤转 kg,写后回读校验"
|
||||
status: proposal
|
||||
version: "v1"
|
||||
date: "2026-09-16T12:32:53.487Z"
|
||||
---
|
||||
|
||||
# Fitness 库读写
|
||||
|
||||
## 连接方式
|
||||
一律用 `~/.openclaw/scripts/db-conn.sh fitness --sql "<SQL>"`(固定账号 `agent_fitness`)。
|
||||
禁止 root、禁止 docker exec 直连、禁止访问其他 agent 的库。建表结构与字段以 AGENTS.md 为准,勿在此重复。
|
||||
|
||||
## 含中文的 SQL 必须以 `SET NAMES utf8mb4;` 开头
|
||||
脚本内的 mysql 客户端连接字符集默认是 latin1(实测 `character_set_client` / `character_set_results` 均为 latin1)。因此:
|
||||
|
||||
- 写中文到 enum/文本列会直接失败:`ERROR 1265 (01000) ... Data truncated for column 'severity' at row 1`
|
||||
- 读中文会返回乱码(如 enum 显示成 `'?'`)
|
||||
|
||||
每条含中文的 SQL 都加前缀:
|
||||
|
||||
~/.openclaw/scripts/db-conn.sh fitness --sql "SET NAMES utf8mb4; INSERT INTO health_status_logs (...) VALUES (...)"
|
||||
|
||||
## 写入后回读
|
||||
`--sql` 以 `-N -B` 执行(制表符分隔、无表头),INSERT 无输出即成功。
|
||||
随后同条件 SELECT 回读,确认中文无乱码、字段无截断,再报完成。
|
||||
|
||||
## 体重单位换算
|
||||
用户口述单位是「斤」,而 `body_records.weight` 存 kg(decimal(5,1)):kg = 斤 ÷ 2。
|
||||
例:132.4 斤 → 66.2。
|
||||
|
||||
## 身体尺寸 / 尺码卡查询
|
||||
尺寸单一真相来源是 `body_measurements`(字段清单见 AGENTS.md,勿在此重复)。取最新一条即"尺码卡":
|
||||
|
||||
~/.openclaw/scripts/db-conn.sh fitness --sql "SET NAMES utf8mb4; SELECT measure_date, height, shoulder_width, chest, waist, hip, arm_length, inseam, note FROM body_measurements WHERE user_id='yangxuan' ORDER BY measure_date DESC LIMIT 1;"
|
||||
|
||||
输出身高/肩宽/胸围/腰围/臀围/裤长,**必须标注腰围测法**:`waist` 是肚脐水平实测,与裤装标注腰围尺码可能差 2-4cm,买裤时以版型说明为准。
|
||||
尺寸是无单位的 cm 数(与体重不同,**不做斤/公斤换算**),不要套用上面的体重换算。
|
||||
@@ -199,6 +199,24 @@ ORDER BY record_date ASC;
|
||||
- health_indicator_trends - 指标变化趋势
|
||||
- user_health_summary - 用户健康概要
|
||||
|
||||
### 身体尺寸(1张,2026-09-16 新增)
|
||||
- body_measurements - 身体尺寸(静态尺寸+历史,支撑「尺码卡」)
|
||||
- 字段:height 身高 / shoulder_width 肩宽 / chest 胸围 / waist 腰围 / hip 臀围 / arm_length 臂长 / inseam 裤长内长 / note 测法用途备注
|
||||
- **身体尺寸单一真相来源 = fitness 库**,不另开 agent;`user_profiles`(静态档)与 `body_records`(体重/腰围趋势)保持原样不动
|
||||
|
||||
#### 尺码卡查询口径(取每人最新一条 body_measurements)
|
||||
|
||||
```sql
|
||||
SET NAMES utf8mb4;
|
||||
SELECT measure_date, height, shoulder_width, chest, waist, hip, arm_length, inseam, note
|
||||
FROM body_measurements
|
||||
WHERE user_id='yangxuan'
|
||||
ORDER BY measure_date DESC
|
||||
LIMIT 1;
|
||||
```
|
||||
|
||||
输出身高/肩宽/胸围/腰围/臀围/裤长,并**必须标注腰围测法**:本表 waist 为肚脐水平实测,与裤装标注的腰围尺码可能差 2-4cm(买裤时以裤型/版型说明为准,差异写进 note)。
|
||||
|
||||
## Tools
|
||||
|
||||
### Local notes (migrated from TOOLS.md)
|
||||
|
||||
@@ -280,3 +280,15 @@
|
||||
- 不吸烟、不喝酒
|
||||
- 无家族遗传病史
|
||||
- 睡眠:入睡困难,5-7小时,需关注
|
||||
|
||||
## 皮肤护理史
|
||||
|
||||
### 2026-09-16 全脸深层清洁(细胞夹闭口粉刺)
|
||||
- **项目**:细胞夹闭口粉刺全脸深层清洁,40分钟
|
||||
- **地点**:美容院「奢思雅」(付费)
|
||||
- **效果**:黑头有明显清洁
|
||||
- **皮肤表现**:未提及泛红、刺痛、脱皮
|
||||
- **当晚处理**:修复日 → 仅温水清洁(不用洁面产品)、不刷壬二酸、只涂百雀羚B5修护乳
|
||||
- **壬二酸**:停 2-3 天,用酸日顺延至最早 **2026-09-21**
|
||||
- **护理原则**:清洁后 24-72 小时屏障脆弱,以保湿修护为主;若出现泛红刺痛则继续只做保湿修护
|
||||
- **数据库**:health_status_logs id=1(user_id=yangxuan, log_date=2026-09-16, status_type=皮肤护理, severity=轻)
|
||||
|
||||
+20
-1
@@ -103,7 +103,7 @@
|
||||
- **红线**:不要擅自改 Docker 代理配置或重启 Docker。代理没开就通知杨轩。
|
||||
|
||||
## 🤖 Agent 列表
|
||||
- 共 11 个 agents,职责如下:
|
||||
- 共 12 个 agents,职责如下:
|
||||
|
||||
| Agent | 职责 |
|
||||
|-------|------|
|
||||
@@ -118,6 +118,7 @@
|
||||
| **pbs** | PBS备份 💾:Proxmox Backup Server (pbs01) 备份管理,中文交互(Tailscale 100.115.195.195,SSH 免密 root,见 workspace-pbs/AGENTS.md) |
|
||||
| **wellness** | 放松保健 💆:管理放松保健记录(本地 MySQL `wellness` 库,账号 `agent_wellness`),查询/新增技师联系人(cc_contract)和放松记录(cc_contract_record),入口 `db-conn.sh wellness`/`db-query --database wellness`,见 workspace-wellness/skills/wellness |
|
||||
| **tab** | 项目管理 🗄️:管理 tab 项目数据库(本地 MySQL `tab` 库,账号 `agent_tab`),新增引擎/站点/站点类型(含去重)、启用禁用(status 切换),icon 自动取 favicon,入口 `db-conn.sh tab`/`db-query --database tab`,见 workspace-tab/skills/tab |
|
||||
| **dsh** | DSH 🔧:DeepSeek Harness(外部编码 harness 委派目标),承接长时间编码/批量命令/仓库级改动;委派见 `delegate-to-dsh` skill。**长期记忆此前遗漏,2026-09-16 补入** |
|
||||
|
||||
- config 见 `openclaw.json` → `agents.list`
|
||||
- `subagents.allowAgents` 已设为 `["*"]`,main 可 spawn 任意 agent
|
||||
@@ -157,6 +158,23 @@
|
||||
**排查命令**:`openclaw cron status`(看 nextWakeAtMs 是否停滞)、`openclaw cron get <id>`、`openclaw cron edit <id> --agent main`。
|
||||
**注意**:admin 环境 `openclaw cron list`/`automations list` 曾因 agent-less 任务报错,配置 systemAgent 后自动恢复。
|
||||
|
||||
## 💆 护肤提醒体系(2026-09-16 建立,agent=main)
|
||||
|
||||
数据归属:**身体/皮肤档案统一归 fitness 库**(身高体重/腰围 `user_profiles`+`body_records`,身体尺寸 `body_measurements`,护理史 `health_status_logs`);付费到店服务另在 wellness 记一条(消费视角)。
|
||||
|
||||
**护肤方案(壬二酸 + 保湿 + 洁面)**:周一/周三 21:00 用酸日、周二/周四/周日 21:00 保湿日、周五/周六 21:00 休息日;每天 22:30 打卡检查(读会话看有无回「打卡」,未回才催);2026-12-15 护肤3个月复评。均钉钉推送。
|
||||
|
||||
**双洁面分配规则**(2026-09-16 定):
|
||||
- 旁氏米粹(氨基酸系,含香精+IPBC)→ **保湿型,日常主力**;用酸日固定用它(不与壬二酸叠酸)
|
||||
- 奢思雅清润洁面膏(皂基+氨基酸表活,含高岭土+微量水杨酸)→ **清爽控油型,出油明显时用**;忌与壬二酸同晚
|
||||
- 一晚只用一款;干/紧绷选旁氏,油/闭口多选奢思雅
|
||||
|
||||
**美容院深层清洁**:2026-09-16 奢思雅(细胞夹清闭口全脸 40 分钟);此类人工挤压类操作**建议间隔 4 周**,敏感或屏障未恢复拉到 6-8 周;已设 2026-10-14 20:00 飞书评估提醒。
|
||||
|
||||
### 飞书 vs 钉钉推送(2026-09-16 起)
|
||||
- 护肤 7 条日常提醒 → **钉钉**(`dingtalk-connector` → `0464031658857345`)
|
||||
- 新增的一次性提醒(9/18 身体尺寸、10/14 深层清洁评估)→ **飞书**,投递必须用 **chat_id `oc_8eecfa0e1cc185c1cb19b4f3950cbc52`**(open_id 直推报 `temporarily unavailable`)
|
||||
|
||||
## 🧹 Git 清理
|
||||
- `/home/yangxuan/.openclaw/` 下仅主仓库一个 `.git`,子目录 `.git` 已全部删除
|
||||
- workspace 子模块不再有独立 git
|
||||
@@ -169,4 +187,5 @@
|
||||
- **机器人 open_id**:`ou_85d8747d90179b421e595cb22090d6fb`;DM chat_id:`oc_8eecfa0e1cc185c1cb19b4f3950cbc52`
|
||||
- **注意**:飞书 open_id 按应用隔离,换应用必须换白名单;`groupAllowFrom` 只能填群 ID(`oc_…`),不能填用户 `ou_…`
|
||||
- 日志里 `contact:contact.base:readonly` 类 99991672 报错被插件判为 stale 并忽略(仅影响发送者昵称解析)
|
||||
- **推送通道实测(2026-09-16)**:按用户 open_id 发(`--to ou_28124d6721134f0e31d6122d30088418`)**失败**,报 `Feishu send failed: Sending messages to users is temporarily unavailable.`;改发 **DM 会话 chat_id** `oc_8eecfa0e1cc185c1cb19b4f3950cbc52` 成功(实测 messageId `om_x100b659cf64734a1027a72cd0c0c7ff`)。→ **cron/自动化推送飞书私聊一律用 chat_id,不要用 open_id**。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user