@lukealee/nuwa-cli
v0.1.1
Published
Command-line tool for distilling and chatting with anyone's cognitive operating system, powered by the Nuwa Skill — with long-term memory. English by default, switchable to Chinese.
Maintainers
Readme
https://github.com/user-attachments/assets/ed4abf53-29dd-4863-903c-cb6388f0bb77
在人人都处于信息茧房的时代,让你轻松拥有世界顶尖的智囊团。
nuwa-cli 把这些大师蒸馏成可对话的人格,单聊、群聊皆可;跨会话长期记忆让他们的「认知操作系统」长期辅佐你的每一次决策。
当前版本:v0.1。
亮点
- 蒸馏任何人:调研任意公众人物,生成一份「人格卡」——认知操作系统:心智模型 / 决策启发式 / 表达 DNA / 反模式 / 诚实边界。
- 带长期记忆的对话:跟蒸馏出的人格单聊,带跨会话长期记忆——退出时自动把要点滚动进记忆,下次进入时载入,依旧记得你们聊过什么。
- 随处可用的智囊团:在终端里单聊,在浏览器里拉多个人格进群聊,或把每个人格接到飞书当独立机器人——私聊它,或在群里 @ 它。
- 可插拔运行时:对话/蒸馏的后端可在
claude-code、codex、自定义api(OpenAI 兼容端点)之间切换。 - 联网检索:聊到实时内容时,人格能自行联网查证(只读检索)。
claude-code/codex用各自自带工具;纯api档则通过可插拔的检索后端获得同样的能力,让 OpenAI 兼容端点也能在蒸馏时做调研、对话时查证实时事实。 - 不依赖 Claude Code / Codex 也能用:配一个免费的 OpenAI 兼容端点 + 一个免费的检索 key,
api档就能同时蒸馏和带联网检索的对话——见 零门槛免费上手。
快速上手
npm i -g @lukealee/nuwa-cli # 安装全局 `nuwa-cli` 命令
nuwa-cli install # 一次性:装 Skill + 初始化
nuwa-cli distill 乔布斯 # 蒸馏一个人格(需 claude-code/codex,要几分钟)
nuwa-cli chat 乔布斯 # 正典单聊,带长期记忆
nuwa-cli chat 乔布斯 # 再进一次,他会记得上次聊的
nuwa-cli ls # 看看蒸馏了谁对话中输入 /exit 退出(也可 /quit、Ctrl+C、Ctrl+D),退出时会保存记忆。
安装
前置依赖
- Node.js ≥ 18
- 至少一个运行时:已安装并授权的 Claude Code(
claude)或 Codex(codex);或一个 OpenAI 兼容的 API 端点。 - 蒸馏(distill)需要「会用工具 + 能联网」的运行时(女娲要做多路调研):即
claude-code/codex,或配好了检索后端([search],如 AnySearch)的api端点。完全没有联网能力的纯api端点仍不能蒸馏(只会照搬过时的模型知识),命令会明确拦截并提示。
从 npm 安装(推荐)
npm i -g @lukealee/nuwa-cli # 安装全局 `nuwa-cli` 命令或免安装,按需直接跑:
npx @lukealee/nuwa-cli install从源码安装(开发用)
git clone https://github.com/LukeALee/nuwa-cli.git
cd nuwa-cli
npm install
npm run build
npm link # 可选:把 nuwa-cli 链接为全局命令下文命令以全局
nuwa-cli为准。没有npm link时,把nuwa-cli换成node dist/cli.js;开发期也可用npm run dev -- <命令>(经 tsx 直接跑 TS 源码)。
初始化(安装女娲 Skill + 建目录)
nuwa-cli installinstall 是幂等的,会:
- 检测可用运行时(claude / codex);
- 把女娲 Skill 全局装到检测到的运行时(
npx skills add … -g); - 在
~/.nuwa/维护一份女娲 Skill 本地副本(git clone); - 初始化
~/.nuwa/目录与默认config.toml; - 默认把女娲自带的示例人格导入本地人格库(
~/.nuwa/personas/)——装完即可在nuwa-cli ls看到、用nuwa-cli chat <名字>直接开聊,无需先蒸馏;已存在的同名人格绝不覆盖; - 自检并列出可用 provider 与各动作默认模型。
不想导入示例人格:
nuwa-cli install --no-example无网络 / CI 环境可跳过 Skill 安装:
nuwa-cli install --skip-skill零门槛免费上手(不需要 Claude Code / Codex)
没有 Claude Code 或 Codex?用免费的 OpenAI 兼容 LLM + 搜索服务,蒸馏和带检索的对话全都能跑:
LLM 端点 —— 去 Agnes AI 注册一个免费 key(OpenAI 兼容,如
agnes-2.0-flash)。检索后端 —— 去 AnySearch 注册一个免费 key(不注册也能匿名用,只是限速更低)。正是它让
api档能联网:蒸馏时做多路调研、对话时查证实时事实。把根目录的模板
.env.example复制为.env,填入你自己的 key(nuwa-cli 会从工作目录逐级向上自动加载):# OpenAI 兼容 LLM 端点(自动识别为 [provider.api]) AGNES_BASE_URL=https://apihub.agnes-ai.com/v1 AGNES_API_KEY=sk-... AGNES_MODEL=agnes-2.0-flash # 必填 —— 不显式指定 model,api 档请求会报错 # AnySearch key(可选;自动接入 [search])—— 让 api 档能联网检索 ANY_RS_KEY=as-...变量名前缀可换:任意
<PREFIX>_BASE_URL+<PREFIX>_API_KEY(+<PREFIX>_MODEL)成对即可自动识别(如OPENAI_*),也可用规范名NUWA_API_BASE_URL/NUWA_API_KEY/NUWA_API_MODEL。初始化即用 ——
install会读.env自动写好[provider.api]与[search](key 以env:引用形式存,绝不落明文):nuwa-cli install --skip-skill # --skip-skill:api 档用不到女娲 Skill nuwa-cli distill 马斯克 --provider api --model agnes-2.0-flash nuwa-cli chat 马斯克 --provider api --model agnes-2.0-flash # › 问一句时效性问题(「SpaceX 最近 IPO 了吗?定价多少?」), # 人格会先查 AnySearch,再用实时数据回答。(不想每次都带
--model?在~/.nuwa/config.toml的[provider.api]里写model = "agnes-2.0-flash",并在[models]里设distill = "api"/chat = "api"。)
安全提示:key 只存在本地
.env(已 git-ignore),在config.toml里以env:VAR引用,不会明文落盘。AnySearch 会把查询发往https://api.anysearch.com,别拿它搜敏感信息。
命令完整参考
nuwa-cli install [--no-example] [--skip-skill]
安装/校验女娲 Skill 与依赖,初始化 ~/.nuwa。默认把女娲自带示例人格导入人格库(可 nuwa-cli ls / chat 直接用);--no-example 跳过导入,--skip-skill 跳过 Skill 安装。
nuwa-cli distill <name> [选项]
蒸馏一个新人格。需要具备「工具 + 联网」能力的 provider —— claude-code / codex,或配了 [search] 检索后端(如 AnySearch)的 api。
| 选项 | 说明 |
| --- | --- |
| --provider <id> | 指定运行时:claude-code | codex | api |
| --model <model> | 指定模型 |
| --context <text> | 消歧 / 定位背景,揉进调研指令——小众或同名人物强烈建议填 |
| --force | 人格已存在时重新蒸馏(否则跳过) |
nuwa-cli distill 马斯克
nuwa-cli distill 花叔 --context "小猫补光灯创始人,nuwa-skill 作者,GitHub: alchaincyf"
nuwa-cli distill 李四 --provider codex若所选 provider 不具备工具/联网能力(如
[search]设为none的api端点),蒸馏会明确中止并提示你配检索后端或改用 claude-code/codex,而不是产出一份没调研过的劣质人格卡。
nuwa-cli chat <name> [选项]
与人格单聊(正典:读+写长期记忆)。
| 选项 | 说明 |
| --- | --- |
| --fresh | 临时实例:不读已有记忆、默认不写正典(退出时可促进) |
| --provider <id> | claude-code | codex | api |
| --model <model> | 指定模型 |
| --no-web-search | 关闭对话联网检索(默认开,仅 claude-code/codex 生效) |
nuwa-cli chat 乔布斯
nuwa-cli chat 乔布斯 --provider codex
nuwa-cli chat 乔布斯 --no-web-search
nuwa-cli chat 乔布斯 --fresh # 清场聊一次,不污染正典nuwa-cli new <name> [选项]
chat --fresh 的快捷别名(临时实例)。支持 --provider、--model、--no-web-search。
nuwa-cli new 乔布斯nuwa-cli remember <session-id>
把一次 --fresh 会话促进进正典长期记忆。会话 id 在进入聊天时显示(形如 solo-20260608T...),退出 fresh 会话时也会提示。
nuwa-cli remember solo-20260608T103000-ab12nuwa-cli ls
列出已蒸馏人格(含画像、蒸馏时间、provider、是否手工编辑等)。
nuwa-cli rm <name> [--purge]
删除人格。默认保留记忆(只删人格卡 / 调研 / meta,便于重蒸馏后续接历史);--purge 连记忆一起删。
nuwa-cli rm 乔布斯 # 删人格卡,保留记忆
nuwa-cli rm 乔布斯 --purge # 整个删干净nuwa-cli forget <name>
只清空该人格的长期记忆与对话日志,保留人格卡。
nuwa-cli forget 乔布斯会话内操作
| 输入 | 行为 |
| --- | --- |
| 普通文本 | 发送消息 |
| /exit 或 /quit | 退出(正典会话保存记忆) |
| Ctrl+C / Ctrl+D | 退出(同样保存记忆) |
接入 IM(飞书多机器人,非侵入式)
把人格接到飞书:每个人格 = 一个独立飞书应用(机器人),可在飞书里直接私聊,或把多个机器人拉进一个群一起聊。nuwa 不实现飞书 SDK,而是 shell 调官方 lark-cli 当传输层。
心智模型:一人一 app
| 概念 | 对应 |
| --- | --- |
| 一个人格(如「小明」) | 一个 lark-cli profile = 一个飞书应用 = 飞书里一个机器人 |
| 收消息 | lark-cli --profile <p> event consume(实时 NDJSON 流) |
| 发消息 | lark-cli --profile <p> im +messages-send |
| 群聊 @ 路由 | 平台自动:机器人在群里只收到 @ 它的消息,多机器人共群各答各的,无需写路由 |
开始(一条命令闭环)
nuwa-cli im feishu 小明 # 默认后台上线;首次自动建应用、绑定、再后台跑
nuwa-cli im feishu 巴菲特 --provider codex
nuwa-cli im feishu 小明 --profile xiaoming # 用已有飞书应用(而非新建)im feishu 小明 自己判断该怎么做:
- 已在后台跑 → 提示「已在运行」;
- 已绑定且存在的 profile → 直接后台拉起;
- 首次(未绑定)→ 打开浏览器创建一个独立飞书应用,绑定后再后台跑。
绑定过的 profile 记进人格卡(feishu_profile),之后免输 --profile。想前台盯着调试加 -a / --attach。
飞书后台一次性配置(每个应用做一遍)
应用建好后,在飞书开发者后台给它:
- 权限 scope:
im:message.p2p_msg:readonly(私聊)、im:message.group_at_msg:readonly(群 @) - 订阅事件:
im.message.receive_v1
否则机器人收不到消息。
查看 / 结束
nuwa-cli im-ls # 看谁在跑(人格 / profile / pid / 运行时长)
nuwa-cli im-logs 小明 -f # 跟随某人格日志(后台进程的回复/报错都在这看)
nuwa-cli im-stop 小明 # 优雅停止(SIGTERM → 回写记忆)命令一览(开始 / 查看 / 结束)
| 命令 | 作用 |
| --- | --- |
| im <平台> <人格> [--profile] [--provider] [--model] [-a] | 开始:默认后台;首次自动建应用;-a 前台调试 |
| im-ls | 查看:列出运行中的后台 bridge |
| im-stop <人格> | 结束:优雅停止(回写记忆) |
| im-logs <人格> [-f] | 看 / 跟随后台日志 |
企微(
wecom)/ 钉钉(dingtalk)为轮询模式占位档,命令字段待对应官方 CLI 核对;--profile仅飞书有意义。
⚠️ 网络提示:飞书是国内服务。若开了走海外节点的代理(尤其 Clash TUN 模式),
feishu.cn的 TLS 会被掐断(表现为EOF/SSL_ERROR_SYSCALL,即便本地凭证就绪也连不上)。把feishu.cn/open.feishu.cn走直连,或关掉 TUN;问题排查先看im-logs。
网页版 IM(在浏览器里单聊 / 群聊)
不想配飞书,也能聊:nuwa-cli web 起一个本地网页 IM,在浏览器里直接和人格库单聊,或拉 2+ 个人格进群(导演式编排)。
nuwa-cli web # 开发模式:打开 http://localhost:5173
nuwa-cli web --prod # 生产模式:构建并单进程托管 http://localhost:8787- 解耦:代码在仓库根目录的独立子项目
webim/里,有自己的package.json与构建;单向复用 CLI 核心(人格库、记忆、单聊引擎、群聊编排),CLI 不依赖它。 - 同一份记忆:网页聊的内容照常写回
~/.nuwa,和命令行 / 飞书共享人格记忆。 - 群聊:选 2+ 个人格即建群,导演按相关性点名、串行生成、拆气泡;
@名字指定谁必答。和飞书群走的是同一套编排核心。 - 端口:后端默认 8787。三种改法(优先级从高到低):
--port <n>选项(如nuwa-cli web --port 8989)、PORT环境变量(PORT=8989 nuwa-cli web——注意放在命令前面,Node 社区惯例)、或用nuwa-cli config set webim.port <n>持久化。端口被占时,nuwa-cli web会给一句干净的提示,而不是崩出堆栈。
首次使用需在
webim/里装一次前端依赖:cd webim && npm install。详见webim/README.md。
运行时(Provider)三档
| Provider | 说明 | 蒸馏 | 对话 | 联网检索 |
| --- | --- | --- | --- | --- |
| claude-code | 已装授权的 Claude Code(headless claude -p) | ✅ | ✅ 逐字流式;用 --resume 复用 session,省 token | WebSearch/WebFetch |
| codex | 已装授权的 Codex(codex exec) | ✅ | ✅ 每轮重发、无流式、较慢 | --search |
| api | 自定义 OpenAI 兼容端点(base_url+api_key) | ✅ 配了 [search] 后端(AnySearch)即可;否则 ⚠️ 被拦 | ✅ 逐字流式(SSE);开了检索时先跑一小段调研循环再作答 | AnySearch([search]),由模型输出 SEARCH: 指令触发 |
- 默认:
install自动检测,优先claude-code,其次codex;都没装则回退api(并从.env读端点 / 检索 key)。 - 命令行覆盖:
--provider、--model。 - codex 较慢:其
codex exec单轮延迟较高(带重推理),日常对话推荐用默认的claude-code。
配置 ~/.nuwa/config.toml
[provider]
default = "claude-code" # 没特别指定时用它
[provider.api] # 仅用自定义端点时需要
base_url = "https://api.example.com/v1"
api_key = "env:NUWA_API_KEY" # 支持 env: 前缀,避免明文
model = "your-model"
[models] # 可分别为不同动作指定 provider
distill = "claude-code" # 蒸馏要工具,用 CC 最稳
chat = "api" # 日常对话用便宜端点省成本
[general]
language = "en" # 全局语言:蒸馏 / 记忆 / 对话回复 / 网页 UI / CLI 输出(可选 "en" 或 "zh-CN",默认 "en")
memory_compact_threshold = 8000 # long-term.md 超此字符数触发二次压缩
[chat]
web_search = true # 对话联网检索总开关(所有运行时)
[search] # api 档的检索后端(CC/Codex 用各自自带工具)
provider = "anysearch" # "anysearch" | "none"
api_key = "env:ANY_RS_KEY" # 可选 —— AnySearch 也支持匿名(限速更低)
max_results = 5 # 单次查询结果条数(1-10)优先级:命令行 --provider > [models].<动作> > [provider].default。
api_key([provider.api] 与 [search] 都)支持 env:VAR 形式从环境变量读取,不必写明文。install 会从 .env 里识别的端点自动写好 [provider.api](如 AGNES_BASE_URL+AGNES_API_KEY,或 OPENAI_BASE_URL+OPENAI_API_KEY),并把 [search].api_key 指向你的 AnySearch key(ANY_RS_KEY / ANYSEARCH_API_KEY)。
语言(默认英文,可切中文)
nuwa-cli 默认英文。~/.nuwa/config.toml 里的 [general] language 一处控制全局语言,影响:
- 蒸馏产出(人格卡)的语言;
- 记忆摘要(第一人称长期记忆)的语言;
- 单聊 / 群聊回复——人格会被要求用该语言发言;
- 网页版 IM 的界面与每日话题;
- 所有 CLI 输出与
--help文案。
切到中文:
[general]
language = "zh-CN"可选值:"en"(默认)与 "zh-CN"。无论设成哪种,人格仍会随对方语言:你用别的语言说话,它就跟着用那种语言回。
记忆模型(把人格当真人)
- 每个人格只有一份
long-term.md(长期记忆),跨所有会话累积。 - 正典对话(
chat):退出时把要点以第一人称摘要滚动进long-term.md;原始对话留在episodes/*.jsonl。long-term.md过长时自动二次压缩(保留稳定事实、淘汰琐碎)。 - 临时对话(
--fresh/new):开干净上下文(不读记忆),默认不写正典;退出时可选择促进,或事后remember <session-id>。 - 清记忆:
forget <name>清空记忆保留人格卡;rm <name> --purge连人格一起删。
联网检索
人格在被问到实时内容(近期新闻、刚发布的东西、最新价格)时会自行联网查证——是否检索由模型自己判断(问"你好"不会搜)。
claude-code/codex:用各自自带的只读检索工具(claude-code:WebSearch/WebFetch;codex:--search),不给文件/命令权限。api:用[search]配置的 AnySearch 后端。底层是一小段 ReAct 循环——模型需要事实时输出一行SEARCH: <查询>,nuwa-cli 去查 AnySearch 并把结果回喂,人格再以本人口吻作答。api档的蒸馏(下笔前多路调研)走的也是这套机制。设[search] provider = "none"可关闭。- 默认开;
--no-web-search临时关,或config.toml里设[chat] web_search = false。
存储布局(~/.nuwa/)
~/.nuwa/
├── config.toml # 全局配置
├── personas/
│ └── <name>/
│ ├── persona.md # 人格卡(可手工编辑;可带 feishu_profile: 绑定的飞书应用)
│ ├── persona.base.md # 女娲原始版基线(供增量更新比对)
│ ├── meta.json # 蒸馏时间 / provider / 是否手工编辑
│ ├── research/ # 原始调研档案
│ └── memory/
│ ├── long-term.md # 统一长期记忆
│ └── episodes/*.jsonl # 带时间戳的原始对话日志
├── skill/ # 女娲 Skill 本地副本
└── im/ # IM 后台进程状态(<人格>.{pid,log,json})根目录可用环境变量
NUWA_HOME覆盖(便于隔离测试或多 profile):NUWA_HOME=/tmp/nuwa-试 nuwa-cli distill 张三
开发与测试
npm run dev -- <命令> # 经 tsx 跑 TS 源码,免编译
npm run build # 编译到 dist/
npm run typecheck # 类型检查
npm test # 跑全部测试(Vitest,无需网络)
npm run test:watch测试覆盖纯逻辑(frontmatter / 配置 / prompt 构造 / SSE 解析 / provider 选择)、存储层、记忆写回与命令集成;LLM 调用用 FakeProvider、api 用 mock fetch、存储用临时 NUWA_HOME,均不依赖网络。
引用与致谢
nuwa-cli 构建于这些项目之上:
- 女娲 Skill(
alchaincyf/nuwa-skill)—— 驱动distill的人格蒸馏 Skill。nuwa-cli 把它从一次性 Skill 调用,升级为有长期记忆的常驻工具。 - AnySearch —— 可插拔的联网检索后端,让纯
api档也能联网(蒸馏时调研、对话时查证)。免费 key 在 AnySearch 控制台 领。 - Agnes AI —— 免费的 OpenAI 兼容 LLM 端点,用于 零门槛免费上手。
- lark-cli —— 官方飞书/Lark CLI;nuwa-cli shell 调它当飞书多机器人接入的传输层,而非自己重写飞书 SDK。
- Claude Code / Codex —— nuwa-cli 可驱动的 agent 运行时,用于蒸馏与对话。
License
MIT
