npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@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.

Readme

https://github.com/user-attachments/assets/ed4abf53-29dd-4863-903c-cb6388f0bb77

在人人都处于信息茧房的时代,让你轻松拥有世界顶尖的智囊团。

nuwa-cli 把这些大师蒸馏成可对话的人格,单聊、群聊皆可;跨会话长期记忆让他们的「认知操作系统」长期辅佐你的每一次决策。

当前版本:v0.1

亮点

  • 蒸馏任何人:调研任意公众人物,生成一份「人格卡」——认知操作系统:心智模型 / 决策启发式 / 表达 DNA / 反模式 / 诚实边界。
  • 带长期记忆的对话:跟蒸馏出的人格单聊,带跨会话长期记忆——退出时自动把要点滚动进记忆,下次进入时载入,依旧记得你们聊过什么。
  • 随处可用的智囊团:在终端里单聊,在浏览器里拉多个人格进群聊,或把每个人格接到飞书当独立机器人——私聊它,或在群里 @ 它。
  • 可插拔运行时:对话/蒸馏的后端可在 claude-codecodex、自定义 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 install

install幂等的,会:

  1. 检测可用运行时(claude / codex);
  2. 把女娲 Skill 全局装到检测到的运行时(npx skills add … -g);
  3. ~/.nuwa/ 维护一份女娲 Skill 本地副本(git clone);
  4. 初始化 ~/.nuwa/ 目录与默认 config.toml;
  5. 默认把女娲自带的示例人格导入本地人格库(~/.nuwa/personas/)——装完即可在 nuwa-cli ls 看到、用 nuwa-cli chat <名字> 直接开聊,无需先蒸馏;已存在的同名人格绝不覆盖;
  6. 自检并列出可用 provider 与各动作默认模型。

不想导入示例人格:

nuwa-cli install --no-example

无网络 / CI 环境可跳过 Skill 安装:

nuwa-cli install --skip-skill

零门槛免费上手(不需要 Claude Code / Codex)

没有 Claude Code 或 Codex?用免费的 OpenAI 兼容 LLM + 搜索服务,蒸馏和带检索的对话全都能跑:

  1. LLM 端点 —— 去 Agnes AI 注册一个免费 key(OpenAI 兼容,如 agnes-2.0-flash)。

  2. 检索后端 —— 去 AnySearch 注册一个免费 key(不注册也能匿名用,只是限速更低)。正是它让 api 档能联网:蒸馏时做多路调研、对话时查证实时事实。

  3. 把根目录的模板 .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

  4. 初始化即用 —— 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] 设为 noneapi 端点),蒸馏会明确中止并提示你配检索后端或改用 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-ab12

nuwa-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/*.jsonllong-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