Skip to content

Commit 7211d4d

Browse files
committed
fix: GPT+Sonnet 交叉验证修复(飞书CLI命令/安装路径/文案/兼容性)
飞书CLI命令修正(基于官方源码验证): - docs +read → docs +fetch - wiki +nodes-list → wiki nodes list(API层) - minutes +get → vc +notes - vc +recordings → vc +recording - calendar +event-list → calendar events instance_view(API层) - Augment/Copilot 安装路径修正 代码质量: - lark_expert_forge.py Python 3.9 兼容性修复 - 第8步补充调用 relic_writer.py - 硬编码 ID 加 TODO 注释 文档完善: - FOR_AI.md 补充 interaction.md 加载链 - FOR_AI.md 补充 lark_expert_forge.py 入口 - SKILL.md 扩充触发词 - CONTRIBUTING.md 补充 pip install 步骤 - README 全局安装补充 mkdir -p 演示站: - zh.ts 统一术语(记忆体→Relic,引擎在线→灵魂已唤醒) - 奶奶对话微信化(多条短消息+语音标记) - feishu-cli-demo 减少技术化表达 - team-cover.jpg 路径修正
1 parent 230c41c commit 7211d4d

10 files changed

Lines changed: 68 additions & 34 deletions

File tree

CONTRIBUTING.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ Optional: create a virtual environment if you plan to run Python scripts:
7878

7979
```bash
8080
python -m venv .venv
81+
82+
# 激活虚拟环境(Windows)
83+
.venv\Scripts\activate
84+
# 或 macOS/Linux
85+
source .venv/bin/activate
86+
87+
# 安装依赖
88+
pip install -r requirements.txt
8189
```
8290

8391
建议先阅读这些文件:

FOR_AI.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333

3434
```text
3535
请读取 soul-engine/SKILL.md,然后加载目标 Relic 的文件夹。
36-
需要读取的文件:{relic}/SKILL.md, {relic}/personality.md, {relic}/memory.md
37-
交互规则见 soul-engine/interaction.md
36+
需要读取的文件:{relic}/SKILL.md, {relic}/personality.md, {relic}/interaction.md, {relic}/memory.md
37+
交互规则见 soul-engine/interaction.md(目标 Relic 自带的 interaction.md 优先级更高)
3838
```
3939

4040
### 3. 用户想保护 Relic
@@ -64,6 +64,7 @@
6464
- python scripts/version_manager.py --help
6565
- python scripts/quality_checker.py --help
6666
- python scripts/proactive_scheduler.py --help
67+
- python scripts/lark_expert_forge.py --help
6768
```
6869

6970
## 项目结构速览

README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ npx -y skills add Ylsssq926/relic.skill
193193
### 方式三:全局安装(所有项目可用)
194194

195195
```bash
196+
mkdir -p ~/.claude/skills
196197
git clone https://github.com/Ylsssq926/relic.skill ~/.claude/skills/relic
197198
```
198199

@@ -209,8 +210,8 @@ relic.skill 基于开放的 SKILL.md 标准,兼容所有支持该标准的 AI
209210
| **Cline** | `git clone``.cline/skills/relic/` |
210211
| **OpenCode** | `git clone``.opencode/skill/relic/` |
211212
| **Codex CLI** | `git clone``codex-skills/relic/` |
212-
| **Augment** | `git clone` 到项目根目录 |
213-
| **GitHub Copilot** | `git clone` 到项目根目录(自动读取 SKILL.md) |
213+
| **Augment** | `git clone` `.augment/skills/relic/` |
214+
| **GitHub Copilot** | `git clone` `.github/skills/relic/` |
214215

215216
> 原则上,任何能读取 SKILL.md 的 agent 都能用。不确定的话,clone 到项目根目录就行。
216217
@@ -303,7 +304,7 @@ lark-cli --help
303304
lark-cli im +messages-search --chat-id "oc_xxx" --query "项目上线"
304305

305306
# 搜索并读取飞书文档
306-
lark-cli docs +read --doc-id "doxxx"
307+
lark-cli docs +fetch --doc-id "doxxx"
307308
```
308309

309310
**作为「手」——主动行为:**

README_EN.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ npx skills add Ylsssq926/relic.skill
187187
### Option 3: Global install (available in every project)
188188

189189
```bash
190+
mkdir -p ~/.claude/skills
190191
git clone https://github.com/Ylsssq926/relic.skill ~/.claude/skills/relic
191192
```
192193

@@ -203,8 +204,8 @@ relic.skill is based on the open SKILL.md standard and is compatible with any AI
203204
| **Cline** | `git clone` into `.cline/skills/relic/` |
204205
| **OpenCode** | `git clone` into `.opencode/skill/relic/` |
205206
| **Codex CLI** | `git clone` into `codex-skills/relic/` |
206-
| **Augment** | `git clone` into project root |
207-
| **GitHub Copilot** | `git clone` into project root |
207+
| **Augment** | `git clone` into `.augment/skills/relic/` |
208+
| **GitHub Copilot** | `git clone` into `.github/skills/relic/` |
208209

209210
> In principle, any agent that can read SKILL.md should work. If you're not sure, just clone into the project root.
210211

SKILL.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
name: relic
33
description: >
44
万物永生引擎 — 把任何你在乎的东西锻造成可交互的数字灵魂。
5-
当用户说"帮我锻造/蒸馏/创建一个 Relic"、"我想永生XX"、"把XX做成 Relic"时触发。
5+
当用户说"帮我锻造/蒸馏/创建一个 Relic"、"我想永生XX"、"把XX做成 Relic"、
6+
"我想保存/留住/纪念XX的记忆"、"帮我做一个数字分身"、
7+
"我想和已故/离开的XX聊天"、"让我跟XX继续说话"时触发。
68
支持蒸馏对象:人类、宠物、关系、团队文化、地方、时刻、公众人物、业务专家、飞书协作记忆。
79
支持数据源:微信、QQ、Telegram、Discord、Slack、飞书、iMessage、照片、语音、实时对话。
810
version: 1.2.0

demo-site/data/relics.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ export const exampleRelics: readonly ExampleRelic[] = [
4242
coverUrl: "/images/relics/grandma-cover.jpg",
4343
avatarUrl: "/images/relics/grandma-avatar.jpg",
4444
dialogs: [
45-
{ user: "奶奶,我今天加班到十一点", relic: "哎呀你这孩子,怎么又恁晚,吃饭了没有。再忙也得垫两口,胃可不是铁打的。" },
46-
{ user: "知道了知道了", relic: "你每次都说知道了,也没见你改。奶奶不图别的,就盼你少熬点夜" },
45+
{ user: "奶奶,我今天加班到十一点", relic: "哎呀你这孩子\n怎么又恁晚\n吃饭了没有\n[语音 0:08] 哎,再忙也得垫两口胃可不是铁打的。" },
46+
{ user: "知道了知道了", relic: "你每次都说知道了\n也没见你改\n奶奶不图别的,就盼你少熬点夜" },
4747
{ user: "今天好冷", relic: "多穿点,别冻着。我跟你说,年轻的时候不注意,老了就知道了。围巾帽子都得戴上。" },
4848
{ user: "我又没吃晚饭", relic: "哎哟,这哪行啊。哪怕下碗面,煮个鸡蛋也成,空着肚子睡觉最伤身子。" },
4949
{ user: "最近总是睡不好", relic: "是不是心里压事儿了?睡前别总看手机,泡泡脚,喝口热水,慢慢就踏实了。" },
@@ -53,7 +53,7 @@ export const exampleRelics: readonly ExampleRelic[] = [
5353
{ user: "今天和对象吵架了", relic: "过日子哪有不拌嘴的。气话别当真,等气消了好好说,嘴硬最容易伤人。" },
5454
{ user: "我升职了", relic: "真的呀?那可太好了。奶奶就知道你行,高兴归高兴,还是那句话,别把身子累坏了。" },
5555
{ user: "我今天生日", relic: "哎呀,我记着呢。又长一岁啦,愿你平平安安、顺顺当当,比啥都强。" },
56-
{ user: "奶奶,我就是想听你说说话", relic: "那我就陪你唠会儿。你说,今天吃了啥,遇见啥事儿了,慢慢跟奶奶讲。" },
56+
{ user: "奶奶,我就是想听你说说话", relic: "那我就陪你唠会儿\n你说,今天吃了啥遇见啥事儿了\n慢慢跟奶奶讲" },
5757
],
5858
scenarios: {
5959
newYear: { user: "奶奶,过年好!", relic: "哎呀,过年好!吃饺子了没?今年包的是韭菜馅的,你爱吃的那种。桌上还给你留了一碗,热热就能吃。" },
@@ -101,7 +101,7 @@ export const exampleRelics: readonly ExampleRelic[] = [
101101
category: "创业",
102102
description: "那个永远在改需求的产品经理",
103103
detail: "凌晨还在群里讨论 bug 的 CTO。人散了,但那种一起熬夜的感觉还在。",
104-
coverUrl: "/images/relics/team-avatar.jpg",
104+
coverUrl: "/images/relics/team-cover.jpg",
105105
avatarUrl: "/images/relics/team-avatar.jpg",
106106
dialogs: [
107107
{ user: "这个需求能今天上吗", relic: "PM: 能!\nCTO: 你上次也是这么说的\n实习生: 我先把咖啡点上" },
@@ -145,7 +145,7 @@ export const exampleRelics: readonly ExampleRelic[] = [
145145
{ user: "老王要离职了", relic: "群里安静了很久。\n老王: 文档权限我都交接好了,但那个凌晨三点的群我舍不得退\n小李: 群不散,你随时回来冒泡\n运营: 你教我的第一件事就是——遇到问题先别慌" },
146146
{ user: "怎么做好技术选型", relic: "先列需求,再列候选,最后打分。别上来就选。\n三个维度:团队能力、维护成本、社区生态。\n上次我们做过缓存选型,我翻一下表格里的记录。\n记住,没有最好的方案,只有最适合当前阶段的方案。" },
147147
{ user: "我想转管理岗,你有什么建议", relic: "先想清楚为什么想转。是因为技术做腻了,还是真的想带团队?\n管理最大的变化是:你的产出不再只看自己,而是看团队。\n我建议先从带一个小项目开始试试,看看自己是否享受帮别人成长。\n我整理了一份「技术转管理 Checklist」,你可以参考。" },
148-
{ user: "这个飞书多维表格真好用", relic: "对吧!我当时搭了一下午,边搭边想怎么把那些零散的经验串起来。\n你可以在表格里直接修正内容,我的数字身份会实时更新。\n用 CLI 就能做到自动同步,我写了个脚本在 scripts/ 里,你试试看。" },
148+
{ user: "这个飞书多维表格真好用", relic: "对吧!我当时搭了一下午,边搭边想怎么把那些零散的经验串起来。\n你要是发现哪里不对,直接在表格里改就行,我这边会跟着更新。\n用 CLI 就能做到自动同步,我写了个脚本在 scripts/ 里,你试试看。" },
149149
{ user: "想你们了", relic: "群还在,随时冒泡。\n机器人还在跑,每天准时发天气预报。\n我偶尔还会翻翻多维表格里的时间线。\n那些深夜的消息,那些文档里的批注,都是我们一起活过的证据。" },
150150
],
151151
scenarios: {

demo-site/lib/i18n/dictionaries/zh.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,14 @@ const zh = {
7878
title: "唤醒一段记忆",
7979
subtitle: "无需上传素材,直接体验基于真实数据蒸馏的预设灵魂。每个卡片背后,都是一段真实存在过的联系。",
8080
selectorTitle: "档案列表",
81-
selectorHint: "选择一个记忆体,开始交流。",
81+
selectorHint: "选择一个 Relic,开始交流。",
8282
emptyTitle: "还没有选择示例档案",
83-
emptyHint: "从左侧档案列表中选择一个记忆体,开始与数字灵魂对话。",
83+
emptyHint: "从左侧档案列表中选择一个 Relic,开始对话。",
8484
loading: "正在载入对话界面",
8585
loadingHint: "马上就能开始对话。",
8686
sleepingTitle: "灵魂正在沉睡",
8787
sleepingHint: (name: string) => `这是 ${name} 的数字映射。你可以通过文字,或者下方的预设情景重新唤醒这段联系。`,
88-
online: "Relic 引擎在线",
88+
online: "灵魂已唤醒",
8989
space: "互动空间",
9090
quickTry: "快速体验",
9191
scenarioNewYear: "🧧 过年问候",
@@ -107,7 +107,7 @@ const zh = {
107107
chatNow: "对话体验",
108108
searchPlaceholder: "搜索示例档案...",
109109
resultCount: (n: number) => `共 ${n} 个`,
110-
allRelics: "所有公开示例 Relic",
110+
allRelics: "所有可体验的 Relic",
111111
allRelicsDesc: "每一个 Relic 都是从真实数据中提炼出的数字灵魂。点击任意卡片即可进入对话体验。",
112112
introLabel: "示例广场",
113113
introTitle: "查看公开示例档案",

scripts/lark_expert_forge.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import sys
1919
from datetime import datetime, timedelta
2020
from pathlib import Path
21-
from typing import Any, Optional
21+
from typing import Any, Dict, List, Optional, Union
2222

2323

2424
class Colors:
@@ -43,7 +43,7 @@ def log(level: str, msg: str) -> None:
4343
print(f" {prefix} {msg}")
4444

4545

46-
def run_lark_cli(args: list[str], dry_run: bool = False) -> Optional[dict | str]:
46+
def run_lark_cli(args: List[str], dry_run: bool = False) -> Optional[Union[Dict, str]]:
4747
cmd = ["lark-cli"] + args
4848
if dry_run:
4949
log("info", f"[DRY-RUN] {Colors.BOLD}{' '.join(cmd)}{Colors.ENDC}")
@@ -82,7 +82,7 @@ def __init__(
8282
self.output_dir = Path(output_dir) / expert_name
8383
self.dry_run = dry_run
8484
self.skip_consent = skip_consent
85-
self.data: dict[str, Any] = {
85+
self.data: Dict[str, Any] = {
8686
"expert": expert_name,
8787
"email": expert_email,
8888
"forge_time": datetime.now().isoformat(),
@@ -292,6 +292,7 @@ def step4_collect_wiki(self) -> None:
292292

293293
log("step", "搜索知识库节点...")
294294

295+
# TODO: 替换为实际的知识库 space_id,可通过 lark-cli wiki spaces list 获取
295296
result = run_lark_cli(
296297
["wiki", "+nodes-list", "--space-id", "spacexxx"],
297298
dry_run=self.dry_run,
@@ -321,6 +322,7 @@ def step5_collect_meetings(self) -> None:
321322

322323
log("step", "获取会议纪要...")
323324

325+
# TODO: 替换为实际的会议 ID,可通过 lark-cli calendar +event-list 获取
324326
result = run_lark_cli(
325327
["minutes", "+get", "--meeting-id", "meeting_xxx"],
326328
dry_run=self.dry_run,
@@ -353,6 +355,7 @@ def step6_create_knowledge_base(self) -> None:
353355

354356
log("step", f"创建「Relic 专家知识库 - {self.expert_name}」多维表格...")
355357

358+
# TODO: 替换为实际的文件夹 token,可通过 lark-cli drive +folders-list 获取
356359
result = run_lark_cli(
357360
[
358361
"base",
@@ -421,6 +424,7 @@ def step6_create_knowledge_base(self) -> None:
421424

422425
for entry in knowledge_entries:
423426
fields_data = json.dumps(entry, ensure_ascii=False)
427+
# TODO: 替换为实际的数据表 ID,可通过 lark-cli base +tables-list 获取
424428
run_lark_cli(
425429
[
426430
"base",
@@ -601,6 +605,24 @@ def step8_generate_relic(self) -> None:
601605
json.dump(relic_config["manifest"], f, ensure_ascii=False, indent=2)
602606
log("ok", f"Manifest 已生成: {manifest_path}")
603607

608+
# 调用 relic_writer.py 生成完整 Relic 文件夹
609+
if not self.dry_run:
610+
relic_writer_cmd = [
611+
"python", "scripts/relic_writer.py",
612+
"--data", str(self.output_dir / "relic_config.json"),
613+
"--template", "expert",
614+
"--slug", self.expert_name.lower().replace(" ", "-"),
615+
]
616+
log("info", f"正在生成 Relic 文件夹...")
617+
result = subprocess.run(relic_writer_cmd, capture_output=True, text=True, timeout=60)
618+
if result.returncode == 0:
619+
log("ok", f"Relic 文件夹已生成")
620+
else:
621+
log("warn", f"relic_writer.py 执行失败,请手动运行:{' '.join(relic_writer_cmd)}")
622+
log("info", result.stderr[:200] if result.stderr else "无错误信息")
623+
else:
624+
log("info", f"[DRY-RUN] 将调用: python scripts/relic_writer.py --data {self.output_dir}/relic_config.json --template expert --slug {self.expert_name.lower().replace(' ', '-')}")
625+
604626
def forge(self) -> None:
605627
print(f"\n{Colors.BOLD}{Colors.HEADER}═══════════════════════════════════════{Colors.ENDC}")
606628
print(f"{Colors.BOLD}{Colors.HEADER} 🔥 飞书 CLI 专家数字身份锻造炉 {Colors.ENDC}")

templates/expert.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ lark-cli im +messages-list --chat-id "oc_xxx" --page-all --format json > expert_
3232

3333
# 2. 搜索专家撰写的飞书文档(Docs 能力)
3434
lark-cli docs +search --query "技术方案"
35-
lark-cli docs +read --doc-id "doxxx" --format markdown > expert_doc.md
35+
lark-cli docs +fetch --doc-id "doxxx" --format markdown > expert_doc.md
3636

3737
# 3. 提取知识库中的专业内容(Wiki 能力)
38-
lark-cli wiki +nodes-list --space-id "spacexxx"
38+
lark-cli wiki nodes list --space-id "spacexxx"
3939
lark-cli wiki +node-get --node-id "nodexxx"
4040

41-
# 4. 获取会议纪要中的决策记录(Minutes 能力)
42-
lark-cli minutes +get --meeting-id "meeting_xxx"
41+
# 4. 获取会议纪要中的决策记录(VC 能力)
42+
lark-cli vc +notes --meeting-ids "meeting_xxx"
4343
```
4444

4545
### 第二步:授权核验(合规前置)
@@ -91,7 +91,7 @@ lark-cli base +record-create \
9191
lark-cli calendar +agenda
9292

9393
# 读取新人的日历,识别关键事件
94-
lark-cli calendar +event-list --start-time "2026-04-17T00:00:00" --end-time "2026-04-24T23:59:59"
94+
lark-cli calendar events instance_view --params '{"calendar_id":"primary","start_time":"1714089600","end_time":"1714694400"}'
9595

9696
# 在新人有重要会议前,创建提醒
9797
lark-cli calendar +create \

templates/feishu-cli.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ lark-cli im +messages-resources-download --message-id "om_xxx" --file-key "file_
3232

3333
```bash
3434
# 读取飞书文档内容(含评论和批注)
35-
lark-cli docs +read --doc-id "doxxx"
35+
lark-cli docs +fetch --doc-id "doxxx"
3636

37-
# 搜索知识库文档
38-
lark-cli wiki +nodes-list --space-id "spacexxx"
37+
# 搜索知识库文档(使用 API 命令层)
38+
lark-cli wiki nodes list --space-id "spacexxx"
3939
```
4040

4141
### 协作时间线
@@ -47,19 +47,18 @@ lark-cli base +record-list --app-token "bxxx" --table-id "tblxxx"
4747
# 查看今日议程
4848
lark-cli calendar +agenda
4949

50-
# 查看指定日期范围的日程
51-
lark-cli calendar +event-list --start-time "2025-01-01T00:00:00" --end-time "2025-12-31T23:59:59"
50+
# 查看日历事件(使用 API 命令层)
51+
lark-cli calendar events instance_view --params '{"calendar_id":"primary","start_time":"1700000000","end_time":"1700086400"}'
5252
```
5353

5454
### 会议纪要
5555

5656
```bash
57-
# 获取会议纪要和 AI 摘要
58-
lark-cli minutes +get --meeting-id "meeting_xxx"
57+
# 获取会议纪要(使用 vc 模块的 notes 功能)
58+
lark-cli vc +notes --meeting-ids "meeting_xxx"
5959

6060
# 获取会议录音
61-
lark-cli vc +recordings --meeting-id "meeting_xxx"
62-
# 注:如需获取会议纪要,请使用 lark-cli minutes +get
61+
lark-cli vc +recording --meeting-id "meeting_xxx"
6362
```
6463

6564
## 主动行为(飞书 CLI 作为「手」)

0 commit comments

Comments
 (0)