Initial Dever 0.0.1

This commit is contained in:
Codex committed 2026-11-03 03:32:07 +00:00
commit 81233d098c
1479 files changed
+163782

No files matched your search

@@ -0,0 +1,4 @@
{
"lib": ["pip:markdown@3.8.2"],
"log": { "level": "info" }
}
@@ -0,0 +1,9 @@
# Markdown 渲染
用外部 Markdown 库实现渲染,通过 fake 测试成功与拒绝。
- [Markdown 适配器](doc/adapter.md)
- [Markdown 命令](doc/api.md)
- [业务操作](doc/app.md)
- [外部接口](doc/port.md)
- [调用流程](link.md)
@@ -0,0 +1,3 @@
external pip "python/render.py" {
lib "markdown@3.8.2"
}
@@ -0,0 +1 @@
cmd render = app.render
@@ -0,0 +1,8 @@
type RenderResult {
Rendered(html: Text)
error Rejected(message: Text)
}
render(source: Text) (html: Text) {
html = port.render(source)
}
@@ -0,0 +1,3 @@
# Markdown 适配器
使用 `python/render.py` 和锁定的 Markdown 库实现渲染。第三方库与 Worker 资源须先准备,测试中的 fake 不依赖它们。
@@ -0,0 +1,5 @@
# Markdown 命令
## document.markup.api.render
调用外部组件把 Markdown 转为 HTML。
@@ -0,0 +1,9 @@
# 业务操作
## document.markup.RenderResult
Markdown 渲染成功或业务拒绝;拒绝包含原因。
## document.markup.render
调用外部渲染器把 Markdown 转为 HTML;渲染器可拒绝输入。
@@ -0,0 +1,5 @@
# 外部接口
## document.markup.port.render
外部 Markdown 渲染操作,失败类型为 RenderResult。
@@ -0,0 +1,17 @@
package main
import (
"bytes"
"context"
"github.com/yuin/goldmark"
)
func Render(ctx context.Context, payload any, setting any) (any, error) {
var output bytes.Buffer
source := payload.(map[string]any)["source"].(string)
if err := goldmark.Convert([]byte(source), &output); err != nil {
return nil, err
}
return map[string]any{"html": output.String()}, nil
}
@@ -0,0 +1,5 @@
import { marked } from 'marked';
export async function render(payload, setting, signal) {
return { html: await marked.parse(payload.source) };
}
@@ -0,0 +1,114 @@
<!-- Generated by dever inspect --links. Do not edit. -->
<!-- source-sha256: 43bec2fc499db07b0488aa4e6d1775a75b4d28f1a575072696eba0c215ae34a6 -->
# document.markup
按求值顺序展示调用、分支和任务调度,包含 API 与自动 REST 入口。点击节点打开源码;双框为调用,虚线为调度或错误路径。外部库和驱动不展开。
图不是某次运行的日志,分句和 Adapter 按输入或配置选择。修改源码后运行 `dever inspect . --links`。
## 入口
- CMD [document.markup.api.render](api.dever#L1) → [document.markup.render](app.dever#L6)
## 外部调用方
当前加载的源码中没有已收录的外部调用。
## 能力与内部调用
### document.markup.RenderResult
定义:[app.dever:1:1](app.dever#L1,1)
没有已收录的下游调用。
### document.markup.adapter.render
定义:[adapter.dever:1:1](adapter.dever#L1,1)
<a id="flow-97bf2a6af81a831b-1"></a>
```mermaid
flowchart TD
n0(["render"])
click n0 href "adapter.dever#L1,1" "打开源码"
n1(["返回"])
n3[["外部 pip Worker 边界:render(受检协议与结果)"]]
click n3 href "adapter.dever#L1,1" "打开源码"
n4(["声明的业务错误或 Worker 故障向调用方传播"])
n0 --> n3
n3 -->|"成功"| n1
n3 -->|"失败"| n4
```
没有已收录的下游调用。
### document.markup.api.render
定义:[api.dever:1:1](api.dever#L1,1)
<a id="flow-b479961e7bdb93bd-1"></a>
```mermaid
flowchart TD
n0(["document.markup.api.render"])
click n0 href "api.dever#L1,14" "打开源码"
n1[["document.markup.render"]]
click n1 href "api.dever#L1,14" "打开源码"
n2(["返回命令结果;未捕获错误终止命令"])
n0 --> n1
n1 --> n2
```
<details>
<summary>源码与子流程</summary>
| 节点 | 源码 | 子流程 |
| --- | --- | --- |
| document.markup.render | [api.dever:1:14](api.dever#L1,14) | [document.markup.render](link.md#flow-1e0e90ddee897072-1) |
</details>
| 目标 | 归属 | 方式 | 调用位置 |
| --- | --- | --- | --- |
| [document.markup.render](app.dever#L6) | 领域内 | CMD 绑定 | [api.dever:1:14](api.dever#L1,14) |
### document.markup.port.render
定义:[port.dever:1:1](port.dever#L1,1)
没有已收录的下游调用。
### document.markup.render
定义:[app.dever:6:1](app.dever#L6,1)
<a id="flow-1e0e90ddee897072-1"></a>
```mermaid
flowchart TD
n0(["render"])
click n0 href "app.dever#L6,1" "打开源码"
n1(["返回"])
n3[["document.markup.adapter.render"]]
click n3 href "app.dever#L7,10" "打开源码"
n4["赋值 html"]
click n4 href "app.dever#L7,10" "打开源码"
n0 --> n3
n3 --> n4
n4 --> n1
```
<details>
<summary>源码与子流程</summary>
| 节点 | 源码 | 子流程 |
| --- | --- | --- |
| document.markup.adapter.render | [app.dever:7:10](app.dever#L7,10) | [document.markup.adapter.render](link.md#flow-97bf2a6af81a831b-1) |
</details>
| 目标 | 归属 | 方式 | 调用位置 |
| --- | --- | --- | --- |
| [document.markup.adapter.render](adapter.dever#L1) | 领域内 | 调用 | [app.dever:7:10](app.dever#L7,10) |
@@ -0,0 +1 @@
render(source: Text) (html: Text) fails app.RenderResult
@@ -0,0 +1,5 @@
import markdown
async def render(payload, setting):
return {"html": markdown.markdown(payload["source"])}
@@ -0,0 +1,16 @@
rejected() () {
verify(result(app.render("rejected input")))
}
port.render(source: Text) (html: Text) {
assertEq(source, "rejected input")
fail(app.RenderResult.Rejected("invalid document"))
}
verify(value: app.RenderResult.Rejected(message)) () recover("test verifies declared rejection") {
assertEq(message, "invalid document")
}
verify(value: app.RenderResult.Rendered(html)) () recover("test verifies declared rejection") {
assert(false)
}
@@ -0,0 +1,8 @@
rendered() () {
assertEq(app.render("# Report"), "<h1>Report</h1>")
}
port.render(source: Text) (html: Text) {
assertEq(source, "# Report")
html = "<h1>Report</h1>"
}