rootwarren: MoonBit full-stack Markdown wiki backend with protected REST API for LLM/client read and write
Dependencies
一片面向人类与 Agent 的活文档森林。rootwarren 是一个由 MoonBit 构建的、文件型 Markdown 文档空间:Markdown 文件是生长出来的树干与枝条,目录是不同枝系,文档之间用链接根系相连。人类在其中阅读与编辑,Agent / LLM 通过受保护的 REST API 进入、检索与写入。
请注意,该项目仍然在开发阶段中,请不要将其投入生产使用
app/ 共享组件包(js+native+wasm,纯 UI,数据走 @http API)
cmd/browser/ 前端水合入口 @rabbita.new(@app.app).hydrate()
cmd/server/ moonback 后端 + @rserver.Server(component=@app.app) SSR
├─ main.mbt 路由与 API
└─ auth.mbt 认证状态(JWT + cookie session)
public/ 静态资源(index.js 由 warren 生成,勿提交)make check # 类型检查全部 target
make dev # 自动准备 .env + 起 warren 全栈 dev server(端口 4300)用户名: operator
密码: <make dev 自动生成的随机值,见 .env 的 ADMIN_TOKEN>make dev 是自动生成(测试/开发即开即用);生产/正式请用 make run,它要求先手动配置 .env,缺失时会给出指引并退回,不自动生成。
make build # native server + frontend js
make test # 运行测试(moon test)
make init-env # 生成 .env 模板(不覆盖已有)
moon fmt # 格式化注意:meta/、public/index.js、.env 等本地/生成物已 gitignore,不会发布。
cp .env.example .env
# 编辑 .env,把 ADMIN_TOKEN 设成强密码
openssl rand -hex 16 # 可用于生成强密码
make run| 键 | 含义 |
|---|---|
| ADMIN_TOKEN | 后台初始登录密码(用户名固定 operator),登录后可在后台改为持久密钥 |
| MBT_MDWIKI_IP | make run 监听地址 |
| PORT | make run 端口(warren dev 固定用 4300) |
环境变量优先于 .env:若在 shell 已设置同名变量,则 .env 不覆盖它。
GET /health
GET /d/*slug 服务端渲染阅读页
GET /llms.txt
GET /feed RSS 2.0 订阅
GET /category/*slug 分类页(SSR)
GET /posts/*slug 文章固定链接(SSR)
GET /api/v1/categories 分类列表 + 计数
GET /api/v1/config
GET /api/v1/docs
GET /api/v1/docs/*slug
PUT /api/v1/docs/*slug (需写权限 + 前缀范围)
DELETE /api/v1/docs/*slug (需写权限 + 前缀范围)
POST /api/auth/login 返回 {token,role} + 设 mbt_auth cookie
POST /api/auth/logout
GET /api/auth/me
GET /api/admin/users (仅管理员)
POST /api/admin/users (仅管理员)
POST /api/admin/users/update
POST /api/admin/users/password
GET /api/admin/keys (仅管理员)
POST /api/admin/keys
POST /api/admin/keys/revoke
GET /api/admin/site (仅管理员)
POST /api/admin/sitepub trait Storage {
async fn read(Self, slug : String) -> String?
async fn write(Self, slug : String, content : String) -> Unit
async fn delete(Self, slug : String) -> Unit
async fn list(Self) -> Array[String]
}pub(all) suberror EntropyUnavailable {
EntropyUnavailable
}pub struct AdminTokenProvider {
username : String
key_hash : String
}fn AdminTokenProvider::set_credentials(self : AdminTokenProvider, username : String, key : String) -> Unitfn AdminTokenProvider::verify(self : AdminTokenProvider, username : String, password : String) -> Boolpub struct ApiKeyInfo {
id : Int
name : String
scopes : String
user_id : Int
read_prefix : String
write_prefix : String
enabled : Bool
created_at : String
}pub struct ApiKeyRecord {
id : Int
name : String
key_hash : String
scopes : String
user_id : Int
read_prefix : String
write_prefix : String
enabled : Bool
created_at : String
}pub struct CategoryRecord {
id : Int
name : String
slug : String
parent_id : Int
description : String
}pub struct DocumentMeta {
body : String
title : String
tags : String
status : String
category : String
}type JsonMetaasync fn JsonMeta::verify_user(self : JsonMeta, username : String, password : String) -> UserRecord?type LocalStoragepub struct UserRecord {
id : Int
username : String
password_hash : String
role : String
enabled : Bool
write_prefix : String
}fn issue_jwt(secret : String, subject : String) -> Stringfn render_doc_html(raw : String, slug : String) -> Stringfn rewrite_wiki_links(html : String, base_slug : String) -> StringInstall
Download ziprootwarren: MoonBit full-stack Markdown wiki backend with protected REST API for LLM/client read and write
Dependencies