
最近在尝试用 AI 参与项目开发。
刚开始我的方式很简单:
text
提需求
↓
让 AI 直接实现
↓
不断返工
↓
继续补需求
结果非常熟悉:
- 功能能跑
- 代码越来越多
- 需求越来越乱
- AI 上下文越来越长
- 后面谁都不敢接手
尤其是涉及:
- 前后端联动
- 权限体系
- 数据结构变更
- API 契约
- 多阶段迭代
时,问题会迅速放大。
后来我接触到了 GitHub 开源的 Spec Kit。
它让我第一次把 AI 开发从:
text
直接写代码
变成:
text
先规格
↓
再设计
↓
再拆任务
↓
最后实现
整个过程开始变得可控。
Spec Kit 到底是什么?
如果用一句话概括:
Spec Kit = 把一次开发过程工程化。
它不会让 AI 直接开始改代码。
而是要求先产出一套完整工程文档。
例如:
text
constitution
spec
plan
tasks
checklists
contracts
research
最终形成类似结构:
text
specs/
├── spec.md
├── plan.md
├── tasks.md
├── research.md
├── data-model.md
├── quickstart.md
├── contracts/
└── checklists/
看起来像是多写了一堆 Markdown。
但实际作用是:
把需求从聊天记录里解放出来。
让需求、设计、任务、实现都能够被追踪、被审查、被交接。
为什么 AI 项目越来越需要 Spec?
以前开发靠的是:
text
需求文档
↓
开发
↓
测试
现在很多团队变成:
text
需求
↓
AI
↓
代码
中间设计环节直接没了。
于是会出现几个经典问题。
问题 1:需求隐藏在聊天记录里
AI 写了很多代码。
一个月后再看:
text
为什么这样设计?
没人知道。
因为答案在某次聊天记录里。
问题 2:实现范围不断膨胀
最开始:
text
做一个文章管理
后来:
text
加权限
加审核
加草稿
加发布
加版本
最后:
text
已经完全不是最初那个需求
但没人知道边界在哪里。
问题 3:Agent 交接困难
A Agent 做了一半。
换 B Agent。
B Agent:
text
重新理解项目
重新分析代码
重新推导需求
大量时间浪费在上下文恢复。
Spec Kit 最有价值的其实不是 Spec
很多人第一次接触会觉得:
text
不就是生成几个 md 文件吗?
实际上真正有价值的是:
Clarify
也就是需求澄清。
这是我实践下来收益最大的环节。
例如:
text
删除是软删除还是硬删除?
看起来简单。
但会影响:
- 数据库设计
- API 设计
- 权限体系
- 审计记录
- 自动化测试
又比如:
text
上线策略是什么?
是:
text
全部完成后开放
还是:
text
灰度发布
会直接影响:
- 发布方案
- 数据迁移方案
- 风险控制方案
这些问题如果在代码完成后才发现。
返工成本非常高。
我目前的使用流程
经过几轮实践后。
我基本固定成下面这套流程:
text
Constitution
↓
Specify
↓
Clarify
↓
Checklist
↓
Plan
↓
Tasks
↓
Analyze
↓
Implement
对应就是:
text
项目原则
↓
需求规格
↓
需求澄清
↓
质量检查
↓
技术设计
↓
任务拆解
↓
一致性分析
↓
代码实现
整个过程更像:
text
产品经理
↓
架构师
↓
Tech Lead
↓
开发
而不是:
text
需求
↓
AI
↓
代码
一套我实际在用的工作流
对于正式功能开发。
我基本都会按照下面的顺序推进:
text
1. Constitution
建立项目级原则
2. Specify
生成功能规格
3. Clarify
澄清需求边界
4. Checklist
检查需求质量
5. Plan
生成技术方案
6. Tasks
拆分可执行任务
7. Analyze
检查文档一致性
8. Implement
按任务实现代码
如果是实验性功能。
我会简化成:
text
Specify
↓
Plan
↓
Tasks
↓
Implement
如果涉及:
- 数据库
- 权限
- API
- 发布策略
那么 Clarify、Checklist、Analyze 基本不会跳过。
如果你想体验 Spec Kit
实际上上手成本并不高。
首先安装 uv:
bash
brew install uv
然后安装 Spec Kit:
bash
uv tool install specify-cli \
--from git+https://github.com/github/spec-kit.git
安装完成后验证:
bash
specify version
进入项目目录:
bash
cd your-project
初始化当前项目:
bash
specify init --here \
--integration codex \
--integration-options="--skills"
或者:
bash
uvx --from git+https://github.com/github/spec-kit.git \
specify init .
初始化完成后。
项目里会出现类似结构:
text
.agents/
skills/
speckit-constitution/
speckit-specify/
speckit-clarify/
speckit-plan/
speckit-tasks/
speckit-implement/
.specify/
templates/
memory/
specs/
后续所有需求都会围绕这些文档进行演进。
如果你的 Agent 没有自动识别这些 Skill。
可以主动调用:
text
[$speckit-constitution]
[$speckit-specify]
[$speckit-clarify]
[$speckit-checklist]
[$speckit-plan]
[$speckit-tasks]
[$speckit-analyze]
[$speckit-implement]
我自己的实践里。
并不是通过一个统一命令完成所有事情。
而是把它理解成:
text
一套 AI 软件工程工作流
然后按阶段调用。
我认为最应该写好的两个文件
如果时间有限。
不要追求把所有文档都写到极致。
优先保证:
1. Constitution
项目宪章。
例如:
text
禁止随意增加依赖
优先复用现有组件
必须通过 TS 检查
核心逻辑必须有测试
API 必须考虑兼容
这决定了 AI 后面会怎么做事。
2. Plan
技术计划。
因为后续 Agent 最常看的其实不是 Spec。
而是:
text
plan.md
这里会记录:
- 技术方案
- 数据模型
- API 设计
- 测试策略
- 发布策略
很多时候看 Plan 就能快速恢复上下文。
Spec Kit 不适合所有项目
如果只是:
text
改个按钮颜色
修一个 Bug
写一个脚本
直接让 AI 改更快。
Spec Kit 更适合:
✅ 中大型功能
✅ 前后端联动
✅ 数据结构变更
✅ 权限体系
✅ 多 Agent 协作
✅ 长周期迭代
这种场景收益会非常明显。
参考资料
GitHub Spec Kit
https://github.com/github/spec-kit
官方文档
https://github.github.com/spec-kit/
Installation Guide
https://github.github.com/spec-kit/installation.html
Quick Start Guide
https://github.github.com/spec-kit/quickstart.html
GitHub 官方介绍
最后的感受
用了几轮之后。
我最大的变化不是:
text
AI 写代码更快了
而是:
text
AI 开发终于开始像工程开发了
Spec Kit 的核心从来不是生成多少 Markdown。
而是强迫你在实现之前回答清楚:
- 要解决什么问题
- 用户到底是谁
- 验收标准是什么
- 数据边界是什么
- 权限边界是什么
- 如何测试
- 如何发布
- 什么才算真正完成
对于复杂项目来说。
这些问题想清楚之后。
代码反而成了最简单的部分。
我觉得 Spec Kit 真正解决的不是 AI 写代码的问题。
而是 AI 项目失控的问题。
当功能开始涉及多人协作、长期迭代、数据模型、权限体系和发布策略时。
代码往往不是最难的部分。
真正难的是:
如何让所有人、所有 Agent,对同一件事保持一致理解。
而 Spec Kit 本质上是在给 AI 开发补回软件工程里曾经被省略掉的那一层。
这里写自定义目录标题
- [Spec Kit 到底是什么?](#Spec Kit 到底是什么?)
- [为什么 AI 项目越来越需要 Spec?](#为什么 AI 项目越来越需要 Spec?)
-
- [问题 1:需求隐藏在聊天记录里](#问题 1:需求隐藏在聊天记录里)
- [问题 2:实现范围不断膨胀](#问题 2:实现范围不断膨胀)
- [问题 3:Agent 交接困难](#问题 3:Agent 交接困难)
- [Spec Kit 最有价值的其实不是 Spec](#Spec Kit 最有价值的其实不是 Spec)
- 我目前的使用流程
- 一套我实际在用的工作流
- [如果你想体验 Spec Kit](#如果你想体验 Spec Kit)
- 我认为最应该写好的两个文件
-
- [1. Constitution](#1. Constitution)
- [2. Plan](#2. Plan)
- [Spec Kit 不适合所有项目](#Spec Kit 不适合所有项目)
- 参考资料
- 最后的感受
- 欢迎使用Markdown编辑器
欢迎使用Markdown编辑器
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法[1](#甘特图的mermaid语法1) 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.
javascript
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
| 项目 | Value |
|---|---|
| 电脑 | $1600 |
| 手机 | $12 |
| 导管 | $1 |
设定内容居中、居左、居右
使用:---------:居中
使用:----------居左
使用----------:居右
| 第一列 | 第二列 | 第三列 |
|---|---|---|
| 第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants 是一个文本转换工具,主要功能是将普通的 ASCII 标点符号自动转换为更美观的印刷体标点符号。例如:
| 原始符号 | 转换后 | 说明 |
|---|---|---|
"引号" |
"引号" | 直引号变弯引号 |
'单引号' |
'单引号' | 直单引号变弯单引号 |
-- |
-- | 两个连字符变短破折号 |
--- |
--- | 三个连字符变长破折号 |
... |
... | 三个点变省略号 |
创建一个自定义列表
:
Text-to- conversion tool
: John
: Luke
如何创建一个注脚
一个具有注脚的文本。[2](#2)
注释也是必不可少的
Markdown将文本转换为 。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
#mermaid-svg-1i7Ky9ImIuIpGZj9{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .error-icon{fill:#552222;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .marker.cross{stroke:#333333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1i7Ky9ImIuIpGZj9 p{margin:0;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .mermaid-main-font{font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .exclude-range{fill:#eeeeee;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .section{stroke:none;opacity:0.2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-1i7Ky9ImIuIpGZj9 .section2{fill:#fff400;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .section1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .section3{fill:white;opacity:0.2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .sectionTitle0{fill:#333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .sectionTitle1{fill:#333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .sectionTitle2{fill:#333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .sectionTitle3{fill:#333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .sectionTitle{text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .grid .tick text{font-family:"trebuchet ms",verdana,arial,sans-serif;fill:#333;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .grid path{stroke-width:0;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .task{stroke-width:2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText{text-anchor:middle;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutsideRight{fill:black;text-anchor:start;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .task.clickable{cursor:pointer;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskText3{fill:white;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .task0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .task1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .task2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutside0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutside2{fill:black;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutside1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .taskTextOutside3{fill:black;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .active0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .active1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .active2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeText0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeText1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeText2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeText3{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .done0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .done1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .done2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText3{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText0.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText0.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText1.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText1.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText2.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText2.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText3.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .crit0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .crit1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .crit2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCrit0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCrit1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCrit2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCrit0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCrit1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCrit2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-1i7Ky9ImIuIpGZj9 .milestoneText{font-style:italic;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText3{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText0.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText0.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText1.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText1.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText2.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText2.taskTextOutsideRight,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText3.taskTextOutsideLeft,#mermaid-svg-1i7Ky9ImIuIpGZj9 .doneCritText3.taskTextOutsideRight{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .vert{stroke:navy;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .vertText{font-size:15px;text-anchor:middle;fill:navy!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCritText0,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCritText1,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCritText2,#mermaid-svg-1i7Ky9ImIuIpGZj9 .activeCritText3{fill:black!important;}#mermaid-svg-1i7Ky9ImIuIpGZj9 .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-1i7Ky9ImIuIpGZj9 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2014-01-07 2014-01-09 2014-01-11 2014-01-13 2014-01-15 2014-01-17 2014-01-19 2014-01-21 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
- 关于 甘特图 语法,参考 这儿,
UML图表
可以使用UML图表进行渲染,例如下面产生的一个序列图:
王五 李四 张三 王五 李四 张三 #mermaid-svg-obZEOp0icZk5u4Um{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-obZEOp0icZk5u4Um .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-obZEOp0icZk5u4Um .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-obZEOp0icZk5u4Um .error-icon{fill:#552222;}#mermaid-svg-obZEOp0icZk5u4Um .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-obZEOp0icZk5u4Um .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-obZEOp0icZk5u4Um .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-obZEOp0icZk5u4Um .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-obZEOp0icZk5u4Um .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-obZEOp0icZk5u4Um .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-obZEOp0icZk5u4Um .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-obZEOp0icZk5u4Um .marker{fill:#333333;stroke:#333333;}#mermaid-svg-obZEOp0icZk5u4Um .marker.cross{stroke:#333333;}#mermaid-svg-obZEOp0icZk5u4Um svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-obZEOp0icZk5u4Um p{margin:0;}#mermaid-svg-obZEOp0icZk5u4Um .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-obZEOp0icZk5u4Um text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-obZEOp0icZk5u4Um .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-obZEOp0icZk5u4Um .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-obZEOp0icZk5u4Um .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-obZEOp0icZk5u4Um .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-obZEOp0icZk5u4Um #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-obZEOp0icZk5u4Um .sequenceNumber{fill:white;}#mermaid-svg-obZEOp0icZk5u4Um #sequencenumber{fill:#333;}#mermaid-svg-obZEOp0icZk5u4Um #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-obZEOp0icZk5u4Um .messageText{fill:#333;stroke:none;}#mermaid-svg-obZEOp0icZk5u4Um .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-obZEOp0icZk5u4Um .labelText,#mermaid-svg-obZEOp0icZk5u4Um .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-obZEOp0icZk5u4Um .loopText,#mermaid-svg-obZEOp0icZk5u4Um .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-obZEOp0icZk5u4Um .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-obZEOp0icZk5u4Um .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-obZEOp0icZk5u4Um .noteText,#mermaid-svg-obZEOp0icZk5u4Um .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-obZEOp0icZk5u4Um .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-obZEOp0icZk5u4Um .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-obZEOp0icZk5u4Um .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-obZEOp0icZk5u4Um .actorPopupMenu{position:absolute;}#mermaid-svg-obZEOp0icZk5u4Um .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-obZEOp0icZk5u4Um .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-obZEOp0icZk5u4Um .actor-man circle,#mermaid-svg-obZEOp0icZk5u4Um line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-obZEOp0icZk5u4Um :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 李四想了很长时间, 文字太长了 不适合放在一行. 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 打量着王五... 很好... 王五, 你怎么样?
- 关于 UML图表 语法,参考 这儿,
流程图
#mermaid-svg-v0GFKDjtOXtaHxTJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-v0GFKDjtOXtaHxTJ .error-icon{fill:#552222;}#mermaid-svg-v0GFKDjtOXtaHxTJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-v0GFKDjtOXtaHxTJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .marker.cross{stroke:#333333;}#mermaid-svg-v0GFKDjtOXtaHxTJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-v0GFKDjtOXtaHxTJ p{margin:0;}#mermaid-svg-v0GFKDjtOXtaHxTJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster-label text{fill:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster-label span{color:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster-label span p{background-color:transparent;}#mermaid-svg-v0GFKDjtOXtaHxTJ .label text,#mermaid-svg-v0GFKDjtOXtaHxTJ span{fill:#333;color:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .node rect,#mermaid-svg-v0GFKDjtOXtaHxTJ .node circle,#mermaid-svg-v0GFKDjtOXtaHxTJ .node ellipse,#mermaid-svg-v0GFKDjtOXtaHxTJ .node polygon,#mermaid-svg-v0GFKDjtOXtaHxTJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .rough-node .label text,#mermaid-svg-v0GFKDjtOXtaHxTJ .node .label text,#mermaid-svg-v0GFKDjtOXtaHxTJ .image-shape .label,#mermaid-svg-v0GFKDjtOXtaHxTJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-v0GFKDjtOXtaHxTJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .rough-node .label,#mermaid-svg-v0GFKDjtOXtaHxTJ .node .label,#mermaid-svg-v0GFKDjtOXtaHxTJ .image-shape .label,#mermaid-svg-v0GFKDjtOXtaHxTJ .icon-shape .label{text-align:center;}#mermaid-svg-v0GFKDjtOXtaHxTJ .node.clickable{cursor:pointer;}#mermaid-svg-v0GFKDjtOXtaHxTJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .arrowheadPath{fill:#333333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v0GFKDjtOXtaHxTJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-v0GFKDjtOXtaHxTJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v0GFKDjtOXtaHxTJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster text{fill:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ .cluster span{color:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-v0GFKDjtOXtaHxTJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-v0GFKDjtOXtaHxTJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-v0GFKDjtOXtaHxTJ .icon-shape,#mermaid-svg-v0GFKDjtOXtaHxTJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-v0GFKDjtOXtaHxTJ .icon-shape p,#mermaid-svg-v0GFKDjtOXtaHxTJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-v0GFKDjtOXtaHxTJ .icon-shape .label rect,#mermaid-svg-v0GFKDjtOXtaHxTJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-v0GFKDjtOXtaHxTJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-v0GFKDjtOXtaHxTJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-v0GFKDjtOXtaHxTJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 链接
长方形
圆
圆角长方形
菱形
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart.js的流程图语法:
Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
-
注脚的解释 ↩︎
*[HTML]: 超文本标记语言