let graph = @moonflowgraph.FlowGraph::new()
guard graph.add_task(@moonflowgraph.TaskNode::new("collect_papers", "Collect papers")) is Ok(_) else { fail("add task") }
guard graph.add_task(@moonflowgraph.TaskNode::new("write_report", "Write report")) is Ok(_) else { fail("add task") }
guard graph.add_dependency(@moonflowgraph.TaskId::new("collect_papers"), @moonflowgraph.TaskId::new("write_report")) is Ok(_) else { fail("add dependency") }
guard graph.plan() is Ok(plan) else { fail("invalid graph") }
debug_inspect(plan.order().length(), content="2")
let trace = @moonflowgraph.Trace::new()
guard graph.to_json_checked(plan, trace) is Ok(snapshot) else { fail("invalid snapshot") }
let workflow_json = graph.to_workflow_spec().to_json()
guard @moonflowgraph.FlowGraph::from_workflow_json(workflow_json) is Ok(round_trip) else { fail("invalid workflow") }
debug_inspect(round_trip.task_count(), content="2")
guard @moonflowgraph.RunSnapshot::from_json(snapshot) is Ok(imported_snapshot) else { fail("invalid run snapshot") }
debug_inspect(imported_snapshot.audit() is Ok(_), content="true")
常用查询:
let _ = graph.transition_status(TaskId::new("collect_papers"), Running)
let _ = graph.predecessors(TaskId::new("write_report"))
let _ = graph.successors(TaskId::new("collect_papers"))
let _ = graph.ready_tasks([TaskId::new("collect_papers")])
let _ = graph.runnable_tasks()
MoonFlowGraph
我在维护科研自动化插件时,经常遇到一个不太显眼、但很影响复现的问题:任务清单写在计划里,依赖关系藏在代码里,运行结果又散落在日志和临时文件中。流程短的时候还能靠记忆串起来;一旦同时包含文献检索、数据准备、baseline、指标比较和报告撰写,就很难回答三个简单的问题:下一步能做什么,哪些步骤可以并行,这次运行到底留下了哪些证据。
MoonFlowGraph 是我对这个问题的一次小范围拆解。它用 MoonBit 提供任务图、DAG 校验、执行批次和 provenance trace,只负责把流程和证据说清楚,不替调用者执行模型或命令。
它适合解决什么
核心能力
before -> after的执行约束。value()、outputs()、before()、batches()、message()等访问器读取。cmd/workflow和示例 JSON,用于导入、校验、规划、Mermaid 渲染和规范化 JSON 导出。cmd/audit、完整科研运行 fixture 和文件型 Bash wrapper。ready_tasks和读取节点状态的runnable_tasks。它刻意不做什么
MoonFlowGraph 不是完整 Agent runtime。当前版本刻意不做这些事情:
这些能力更适合由上层 runtime 负责。MoonFlowGraph 保持在“描述计划、检查依赖、记录证据”这一层,因而可以单独测试,也容易嵌入现有工具。
安装
在 MoonBit 项目中添加已经发布的包:
在调用方包的
moon.pkg中导入:之后可通过默认别名
@moonflowgraph使用公共 API。仓库快速运行
需要本机已安装 MoonBit 工具链,并确保
moon在PATH中。也可以运行仓库内脚本:
一个具体例子
仓库里的 demo 模拟一次从文献和数据准备走向实验报告的流程:
第一批
collect_papers和prepare_dataset可以并行;第二批extract_claims和run_baseline可以并行;之后汇合到compare_metrics,最后进入write_report。trace 不只写“任务完成”,还会记录检索范围、数据快照、baseline 配置和比较依据。demo 最终输出:
如果只想验证并规划一个 workflow-spec-v1 输入,不需要改 MoonBit 源码:
第一个命令使用内置科研工作流示例;第二个命令由 Bash 读取示例 JSON 文件,再传给
cmd/workflow --json。如果需要检查一次已记录的运行是否自洽,可以执行:
该命令只读取和审计快照,不执行任何任务;图、计划、trace 引用、生命周期或任务状态不一致时会以非零状态退出。
完整 API 和错误行为见 docs/API.md。 JSON 快照 v1 的正式契约见 docs/run-snapshot-v1.schema.json。 工作流输入 v1 的正式契约见 docs/workflow-spec-v1.schema.json。
API 示例
常用查询:
当前状态
0.3.0。moon fmt --check、moon info、.mbtidiff、moon check --deny-warn、moon build --deny-warn、moon test --deny-warn、demo 和两个 JSON CLI。moon test当前共 48 项测试,覆盖大图、宽图、Workflow JSON、RunSnapshot 导入审计和 README 可执行示例。moon run cmd/bench可输出机器可读的轻量 benchmark 摘要;CI 不强制跑基准,避免平台抖动。moon run cmd/demo可以直接运行,并展示 Markdown、JSON 和 Mermaid 三种结果。moon run cmd/workflow与run_workflow.sh可以展示 workflow import → validate → plan → export 的完整路径。run_audit.sh可以审计 run-snapshot-v1 fixture 的图、计划、trace 生命周期和状态一致性。完整九项验收证据见 docs/ACCEPTANCE.md。
项目链接
开发说明
项目为原创 MoonBit 实现,参考的是通用的 DAG、workflow 和 provenance 思路,不直接移植某个上游项目。开发过程中使用了 AI 辅助代码实现、测试和文档整理;选题、功能取舍、验收与提交由项目作者负责。
许可证
Apache-2.0。详见 LICENSE。