内容
# MONAD — 编译身份内核
> Monad 是不可分割的存在单位。这是我的 Monad。
**▶ 在线控制台:[keshavashiya.github.io/monad](https://keshavashiya.github.io/monad/)** — 或者在您的终端中运行:
```bash
npx keshavashiya # 在本地启动内核(Node 20+,无需安装)
```
[](https://www.npmjs.com/package/keshavashiya)
MONAD 是一个编译的身份内核:一个单一的 Rust 核心,**AI 代理可以采访**,可以在任何地方运行,从一个二进制文件,并且**在用户的机器上记住访客 — 从不在服务器上**。它是编译的,而不是服务的。没有数据库,没有所需的后端 — 只有内核和其嵌入的保险库。
浏览器页面不是“一个带有终端主题的网站”。它是内核上的一个**适配器** — 相同的核心也在 CLI(`npx keshavashiya`)、`wasmtime`和作为 MCP 服务器运行,AI 代理可以连接到它。
> 一个核心,多个协议 — 与 [`brain`](https://github.com/keshavashiya/brain)、[`docify`](https://github.com/keshavashiya/docify) 和 [`codesage`](https://github.com/keshavashiya/codesage) 相同的本地优先、内存优先的理念。免费开源;在任何静态主机上运行。
## 快速开始
```bash
make setup # 安装所有先决条件(Rust 目标、wasm-pack、cargo-watch、控制台依赖 + 保险库验证器)— 幂等
make dev # 固件监视器 + vite 开发服务器 → http://localhost:5173
# 或者,对于一次性静态构建:
make build # 将站点组装到 dist/
```
需要 [Rust](https://rustup.rs) 和 [Node 20.19+](https://nodejs.org) 在您的 `PATH` 上;`make setup` 安装所有其他内容。随时运行 `make doctor` 以检查缺少的内容,或运行 `make`(无目标)以列出所有命令。
## 项目结构
```
monad/
├── kernel/ # 纯 Rust 核心 — 所有逻辑,主机无关
├── firmware/ # 薄的 wasm-bindgen 垫片(浏览器适配器)
├── console/ # 网络串行适配器(Vite + TypeScript)
├── cli/ # 本地 + WASI 二进制;MCP 服务器;npx 启动器
├── vault/ # 编译身份数据(JSON)
├── daemon/ # 可选的内核 HTTP 服务器(自托管)
├── lib/ # 共享跨 crate 数据结构
├── scripts/ # 构建和开发工具
└── docs/ # 可分叉的保险库模式协议
```
## 架构
```
vault/profile.json ──include_str!──▶ kernel/(纯 Rust,主机无关)
│
┌─────────────────────┼─────────────────────┐
│ │ │
firmware/(wasm) cli/(本地 + WASI) daemon/(可选)
│ │ │
console/(TS) npx keshavashiya HTTP /execute
│ │
TTY 渲染器 标准输出 / MCP
```
**关键约束**:适配器从不直接读取保险库数据。所有逻辑都生活在 `kernel` crate 中;每个适配器只注入一个 `Host`(时钟/随机数)并渲染 `execute()` 返回的内容。终端是一个显示驱动程序。
## 保险库
`vault/profile.json` 文件是 MONAD 的**根文件系统**。它定义了内核所知道的一切:身份、角色、堆栈、系统、项目、虚拟文件系统、进程、启动日志和运气。
模式版本控制在 `vault/schema.json` 中,并记录为 **可分叉协议**,位于 [docs/vault-schema.md](docs/vault-schema.md) 中。任何人都可以分叉 MONAD,编写自己的 `profile.json`,并构建自己的身份内核 — 包括网站、CLI、WASI 二进制文件和 MCP 服务器。
## 可验证身份
每个构建都嵌入了 **可复制的 SHA-256 保险库**,在构建时计算([`kernel/build.rs`](kernel/build.rs))。使用标准工具重新计算它并与运行内核报告的内容进行比较 — 如果它们匹配,则您正在与提交的源代码进行对话:
```bash
monad verify # 或控制台中的 `verify` 命令
shasum -a 256 vault/profile.json # macOS (Linux 上的 sha256sum)
```
## 无需浏览器即可运行
内核是工件;网站只是其中一个适配器。相同的核心在 npm 上运行,在任何 WASM 运行时和本地运行 — 前两个不需要 Rust 工具链:
```bash
npx keshavashiya # 通过 Node 的内置 WASI 启动内核
npx keshavashiya whoami # 一次性命令
wasmtime monad.wasm whoami # 完全相同的二进制文件,独立
cargo run -p monad-cli -- repl # 本地交互式会话
```
`npx keshavashiya` 通过 Node 的 WASI 运行时运行捆绑的 `monad.wasm` — 无需本地二进制文件,无需 `wasmtime`,无需安装。(此软件包的 v4 版本是一个静态名片;v5 启动了真正的内核。)
## 让 AI 代理采访我(MCP)
MONAD 作为 [MCP](https://modelcontextprotocol.io) 服务器提供,因此越来越多的候选人筛选工具可以直接查询真实来源。它在**代理**机器上的标准输入/输出上运行 — 无需托管的服务器。
```bash
claude mcp add keshav -- npx -y keshavashiya mcp
```
暴露的工具:`get_experience`、`query_systems`、`list_projects`、`ask`。
## 自托管为 HTTP 服务(可选)
`daemon` 是内核后面一个小 HTTP 适配器 — 只有 `std::net`,无需异步运行时,无需加载 `monad.wasm`。可选且自托管;核心体验永远不需要服务器。
```bash
make daemon # 构建 ./target/release/monad-daemon
./target/release/monad-daemon # 绑定 127.0.0.1:7373(本地)
./target/release/monad-daemon 0.0.0.0:7373 # 暴露它
curl -s localhost:7373/execute -d '{"input":"whoami"}'
# → {"input":"whoami","output":"keshavashiya"}
```
`GET /` 返回健康状态和使用情况;`POST /execute` 在一个全新的、无状态的内核上运行一个命令。响应带有宽容的 CORS,因此浏览器也可以调用它。
## 命令
### 系统
`whoami`、`id`、`uname`、`uptime`、`date`、`neofetch`、`ps`、`top`、`dmesg`、`clear`
### 配置文件
`roles`、`stacks`、`systems`、`projects`
### 文件系统
`ls`、`cat`、`tree`、`pwd`、`cd`、`find`
### 联系方式
`links`、`pgp`、`resume`、`meeting`
### 元数据
`help`、`hint`、`fortune`、`history`、`exit`、`logout`
### 客户端内存(仅限浏览器 — **内核忘记;您的机器记住**)
`memory` — 显示您的浏览器记住的关于您访问的内容 · `forget` — 删除它。
内核是无状态的;此状态仅生活在您的浏览器的 IndexedDB 中(带有本地存储的后备),并且**永远不会发送到服务器**。返回的访问者会收到“欢迎回来”,并跳过主机密钥提示。
## 构建
```bash
make setup # 安装先决条件(运行一次)
make doctor # 检查先决条件而不安装
make # 列出所有目标
make build # 验证 + 固件 + 控制台 → dist/(网站)
make wasi # 构建 monad.wasm → npm/(用于 npx keshavashiya / wasmtime)
make cli # 构建本地 `monad` 二进制文件
make daemon # 构建自托管的 HTTP 服务器(POST /execute)
make dev # 并发监视器 + vite 开发服务器
make clean # 删除构建工件
```
`make` 的输出是一个完全静态的 `dist/` 文件夹,可以部署到 GitHub Pages、Cloudflare Pages、Netlify 或任何 HTTP 服务器。
要发布 npm 启动器(在 `make wasi` 生成 `npm/monad.wasm` 之后):
```bash
npm publish ./npm # 发布 `keshavashiya` 包
```
## 部署
```bash
make build
npx gh-pages -d dist
```
## CI/CD
GitHub Actions 自动构建所有内容:
| 工作流程 | 触发器 | 它执行的操作 |
|---|---|---|
| `.github/workflows/ci.yml` | 每次推送 / PR | 测试内核,验证保险库,构建 **`dist/`** 和 npm 包(包括 WASI 烟雾测试),并将两者上传为工件 |
| `.github/workflows/deploy.yml` | 推送到 `main` | 构建 `dist/` 并部署到 GitHub Pages |
| `.github/workflows/publish-npm.yml` | 发布版本 | 构建 `monad.wasm` 并发布 `keshavashiya` 包到 npm,将二进制文件附加到版本 |
`publish-npm.yml` 需要一个 `NPM_TOKEN` 仓库秘密(设置 → 机密 → 操作)。要发布新版本,请增加 `npm/package.json` 并发布版本 — 标签和工作流程自动跟进:
```bash
gh release create v5.0.1 --target main --title "v5.0.1" --notes "…"
```
## 许可证
MIT — 见 [LICENSE](LICENSE)。
---
*"Monad 是不可分割的存在单位。这是我的 Monad。"*