cognis-digital/startboard
GitHub: cognis-digital/startboard
一款可自托管的分析师起始页生成器,用 JSON 配置即可构建出零外部依赖的独立静态 HTML 看板,集成书签、笔记和服务状态面板。
Stars: 0 | Forks: 0
# startboard
一个可自托管的**起始页 / 仪表盘生成器**,专为分析师设计。只需指定一个
小型的 JSON 配置文件,它就能生成一个单一、独立的静态 HTML 起始
看板 —— 包含书签组、工作笔记以及一个服务状态面板 —— **不依赖任何
外部资源、脚本、样式表、字体或图片**。将该文件放在
任何地方(本地磁盘、S3、静态托管服务)然后打开即可。
- 零运行时依赖。纯粹的 Node ESM。
- 独立输出:仅内联 CSS,不获取任何文档外的内容。
- 可插拔、可注入的状态检查 —— 完全支持离线测试。
- 一个以非零状态退出的 `validate` 命令,可用作 CI 门禁。
许可证:COCL 1.0。由 **Cognis Digital** 维护。
## 安装说明
需要 Node.js 20 或更高版本。
```
# 从 clone 开始
npm install # no runtime deps; installs nothing but sets up scripts
npm link # optional: expose the `startboard` bin globally
```
或者直接运行二进制文件而无需安装:
```
node bin/startboard.js help
```
## 快速开始
```
# 1. scaffold 一个 config
startboard new -o config.json
# 2. (可选) 编辑 config.json,然后 validate 它
startboard validate config.json
# 3. 生成一个 self-contained 的 start board
startboard build config.json -o board.html
# 4. 在任意浏览器中打开 board.html
```
## 命令
| 命令 | 描述 |
| --- | --- |
| `startboard build [-o board.html]` | 生成独立的 HTML。如果省略 `-o`,则写入 stdout。 |
| `startboard validate ` | 验证配置。任何错误都会以非零状态退出 —— 可用作 CI 门禁。 |
| `startboard new [-o config.json]` | 生成初始配置脚手架。如果省略 `-o`,则写入 stdout。 |
| `startboard check ` | 唯一联网的命令。探测每个状态目标并打印 UP/DOWN/ERROR。如果任何目标未处于 UP 状态,则以非零状态退出。 |
| `startboard help` | 显示用法。 |
## 配置格式
```
{
"title": "Analyst Start Board", // required, non-empty
"subtitle": "Daily links & status", // optional
"theme": "dark", // optional: "light" | "dark"
"groups": [ // optional bookmark groups
{
"title": "Markets",
"links": [
{ "label": "TradingView", "url": "https://www.tradingview.com", "description": "Charts" }
]
}
],
"notes": [ // optional note widgets
{ "title": "Today", "body": "Free-form text.\nNewlines are preserved." }
],
"status": [ // optional status targets
{
"name": "Example Service",
"url": "https://example.com",
"timeoutMs": 5000, // optional, default 5000
"okStatuses": [200] // optional; default is any 2xx/3xx
}
]
}
```
验证规则(由 `validate` 和在 `build` 之前强制执行):
- 必须提供 `title` 且不能为空。
- 所有 `url` 值(链接和状态目标)必须是 `http`/`https`。
`javascript:`、`data:` 和 `file:` URL 将被拒绝 —— 以确保输出安全。
- 如果存在 `theme`,则必须为 `light` 或 `dark`。
- `links` 需要 `label` + `url`;`notes` 需要 `title` + `body`;
`status` 目标需要 `name` + `url`。
完整示例位于 [`examples/config.json`](examples/config.json)。
## 状态检查是可插拔的
`check` 是唯一使用网络的路径。获取器(fetcher)被抽象在
一个可注入的函数背后,因此整个检查流水线可以使用模拟的获取器进行离线
单元测试,并且在测试中绝不会发起真实的请求。
```
import { checkAll } from "@cognis-digital/startboard";
const fakeFetcher = async (url) => ({ status: 200 });
const results = await checkAll(config, fakeFetcher); // no network
```
默认获取器使用全局的 `fetch`,并配有 `AbortController` 超时。
## 自包含保证
生成的 HTML 内联了所有样式,且不引用任何远程
资源。测试套件会断言输出不包含任何 `