把写给 AI 看的 skill 印成给人看的站点:书架树 / 本页目录 / 站内搜索 / 代码高亮,另出 llms.txt 与每页原文
写给 AI 看的 skill,印成给人看的站点。
| MoonBit 包 | moon add XiLaiTL/skillpress@0.1.1 |
| 宿主(JS) | npm install moobile-host(站点界面是个 moobile 应用,构建时用 esbuild 打包) |
| 已实测 | 自举站点 ✅(程序自己的 skills/ 印成站)|内容仓 ✅(6 份 skill / 34 页原文,站点判据 23 条全绿)|从 registry 装下来按 README 走一遍 ✅ |
| 产物形态 | 纯静态(dist/:HTML + 一个 bundle + 图片),扔进任何静态服务器就能跑;hash 路由 |
| 站点判据 | 23 条(起真 Chrome 无头 + 自起服务,走 CDP 真鼠标)—— ⚠️ 只能跑 native,要一次 C 工具链 |
| 许可 | Apache-2.0(内含 vendor 的 tree-sitter 运行时与五门语法资产,见 THIRD-PARTY-NOTICE.md) |
⚠️ 它今天最明显的短板:整站客户端渲染,#root 里是空壳 —— 无 JS 打不开, 搜索引擎看不到正文。预渲染还没做(PLAN.md 里记着)。另外行内图片(不独占一行的 )会被当成一条链接,整行一条才收成图片。
# ① 在你的工程里加上 skillpress,并编一次 CLI(包里不带构建产物,所以要编这一次)
moon add XiLaiTL/skillpress
moon -C .mooncakes/XiLaiTL/skillpress build cmd/skillpress --target js
# ② 生成站点工程(写进 <内容根>/skillpress/scripts/.skillpress/)
node .mooncakes/XiLaiTL/skillpress/launcher/skillpress.mjs attach --repo . --skills ./skills
# ③ 装依赖、印内容、打包、起服务
cd skills/skillpress/scripts/.skillpress
npm install && npm run press && npm run build && npm run serve # → http://127.0.0.1:8123/<!-- skills/alpha/SKILL.md -->
---
name: alpha
description: 一句话说清这份 skill 干什么(会出现在书架上那一行)
whenToUse: 什么时候该用它
---
# alpha
正文。标题、列表、表格、引用、围栏代码块都认;
`` 要**独占一行**才会被收成图片。<!-- skills/skillpress/WEBSITE.md —— 站点首页的源:H1 = 站名,第一个 ## 之前 = 首屏 -->
# 我的站
一句话说明这堆 skill 是干什么的。
## [从哪一份开始](../alpha/SKILL.md)
点这一栏会**直接渲染**目标那一页(纯链接节)。npm run serve # http://127.0.0.1:8123/
npm run press:check # 门:产物与现跑逐字节一致吗(改了内容忘了 press,它会红并指出第一处差异)
npm run build # 默认 **prod 档**(minify);开发用 `npm run build:dev`
node verify.mjs # 站点判据:真 Chrome 无头 + 自起服务,23 条(要一次 native 编译)| 实例 | 在哪 | 是什么 |
|---|---|---|
| 内容仓的站点 | ../moobile/skills/skillpress/scripts/.skillpress/ | 拿真语料(6 份 skill / 34 页原文)印的站;verify.sh 的 23 条判据就在它上面跑 |
| 自举站点 | skills/skillpress/scripts/.skillpress/ | 用程序自己的 skills/(讲怎么写 skill、怎么跑门)当内容根 |
| 夹具站点 | 由判据现搭(_scratch/image-check.mjs) | 拿 tools/fixtures/corpus/ 那份冻结语料印一遍,只为量"图片到底显示出来了没有" |
你的内容源(普通 markdown) skills/<name>/SKILL.md + references/*.md
│ + 可选的首页源 skillpress/WEBSITE.md
│ press:一次解析
▼
三件产物 content/content.generated.mbt(站点的内容值)
│ llms.txt(给 agent 的整站索引)
│ md/**(每页原文,逐字节拷贝)+ img/**(内容里的图)
│
│ 构建期:语法高亮(tree-sitter)已经算好,色号跟着一起进内容包
▼
站点(一个 moobile 应用:TEA 的 Model/Msg/update/view)
│ 顶栏 / 书架树 / 文档页 / 右栏目录 / 搜索浮层 / 主题 / hash 路由
▼
React 元素(react-native-web)──► 浏览器 DOM ──► dist/(静态站点)| 根 | 是什么 | 在哪儿 |
|---|---|---|
| 程序 | 引擎 + 站点界面 + 语法资产(能发布的那份) | 本仓库根;用户那边是 .mooncakes/XiLaiTL/skillpress |
| 内容 | 那批 skill(SKILL.md + references/) | --skills 指定;生成出来的实例里已经写死在 npm run press 里 |
| 实例 | 一个「用程序」的 MoonBit 工程,content/ 是生成物 | <内容根>/skillpress/scripts/.skillpress/ |
| 项 | 现状 |
|---|---|
| 认的内容构造 | 标题(h2/h3/h4)/ 段落 / 列表(有序·无序·缩进)/ 表格 / 引用 / 围栏代码块(五门语言构建期上色)/ 分隔线 / 链接(站内折成页面键、站外开新窗口)/ 整行图片 |
| 不认的构造 | 行首原始 HTML、表格缺分隔行、围栏没闭合 → 点名 + 退 2 + 不吐产物(不落坏产物) |
| 行内标记 | 加粗 / 行内代码 / 链接 / 斜体按字面显示(*斜体* 不特殊处理) |
| 搜索 | ⌘K / Ctrl+K;索引渲染期现算(内容大时会变慢,构建期索引还没做) |
| 主题 | 深/浅/跟随系统三态;配色与字号只在 shell/theme.mbt / tokens.mbt 一处 |
| 未做 | 预渲染(首屏空壳)|#section 深链|行内图片|pack 子命令(命令在,会明说"还没做"并退 2)|原生 RN 上图片要自己给尺寸 |
| 站点判据 | 只能 native(moonbitlang/async 的 websocket / http-server / process 在 js 上没有实现);js 那份 CLI 遇到 verify 会明说"只有 native 有"并退 2 |
| 想做什么 | 去哪 |
|---|---|
| 看一个真站怎么长出来的 | 内容仓的实例 | 自举实例 skills/skillpress/scripts/.skillpress/ |
| 用 skillpress 写内容(首页怎么写、忽略清单、目录规矩) | skills/skillpress/references/(站点上也印出来了) |
| 改站点界面 / 版式 / 交互 | DESIGN-site.md、PLAN-ui.md |
| 门与内容规范(写 skill 的规矩) | SPEC.md、SKILLS.md |
| 做到哪儿了 / 为什么这么做 | PLAN.md(决定表 D1–D46,每条带当天读数) |
| CLI 与启动器(随包发的那两份) | launcher/skillpress.mjs、cmd/skillpress/ |
| 仓库里有什么(每个目录干什么) | 下面这张表 ⬇️ |
| 路径 | 是什么 |
|---|---|
| engine/ | 引擎:markdown → 内容包、内容门(G1–G8)、构建期上色、忽略清单、脚手架 |
| shell/ | 站点界面:顶栏 / 侧栏树 / 正文渲染 / 目录 / 搜索 / 主题 / 路由 |
| cmd/ | CLI(cmd/skillpress 跑 js;cmd/skillpress-native 多一条 verify) |
| launcher/ | 随包发的启动器与 press(tools/ 不进包 ⇒ 一份实现只能落在这儿) |
| skills/ | 程序自己的 skill(随包发):怎么写一份 skill、怎么跑这几道门 |
| template/instance/ | 站点工程的模板(attach 就是把它按占位符渲染出来) |
| tools/ _scratch/ | 判据与开发脚本(不进发布包) |
仓库里若见到 lib/xxx.mjs / bin/skillpress.mjs,那是历史坐标(迁移记录里的出处), 活实现已在 engine/** / cmd/**;迁移的完整账在 PLAN.md 的 D40–D46。
| 东西 | 上游 | 许可 | 怎么进来的 |
|---|---|---|---|
| tree-sitter 运行时 | tree-sitter | MIT | 原样 vendor(vendor/web-tree-sitter/)⇒ 拿包的人一个 npm 依赖都不用装也能跑 gen-file |
| 五门语法(moonbit / bash / json / javascript / toml) | 各家官方仓库 | Apache-2.0 / MIT | 随包发(grammars/*.wasm + *.scm),出处逐个记在 PROVENANCE.md |
| mizchi/markdown | https://github.com/mizchi/markdown | MIT | MoonBit 依赖:内容管线的 markdown 解析 |
| XiLaiTL/moobile | 本机另一个仓(../moobile) | Apache-2.0 | MoonBit 依赖:站点界面本身是个 moobile 应用 |
| React / react-native-web / esbuild | Meta / Nicolas Gallagher / evanw | MIT | 站点工程构建期与运行期的 npm 依赖(由生成出来的 package.json 拉) |