@aion0/forge 0.9.1 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RELEASE_NOTES.md +60 -5
- package/app/api/agents/[id]/test/route.ts +150 -0
- package/app/api/connectors/[id]/sync-cli/route.ts +73 -0
- package/app/api/connectors/tool-test/route.ts +70 -0
- package/app/api/jobs/[id]/cancel/route.ts +50 -0
- package/app/api/jobs/[id]/dispatched-pipelines/route.ts +24 -0
- package/app/api/jobs/[id]/run/route.ts +22 -2
- package/app/api/jobs/route.ts +11 -1
- package/app/api/pipelines/[id]/schema/route.ts +53 -0
- package/app/api/pipelines/bulk-delete/route.ts +39 -0
- package/app/api/pipelines/gc/route.ts +27 -0
- package/app/api/schedules/[id]/cancel/route.ts +27 -0
- package/app/api/schedules/[id]/route.ts +173 -0
- package/app/api/schedules/[id]/run/route.ts +45 -0
- package/app/api/schedules/[id]/runs/route.ts +22 -0
- package/app/api/schedules/[id]/stop/route.ts +33 -0
- package/app/api/schedules/route.ts +175 -0
- package/app/api/tasks/bulk-delete/route.ts +47 -0
- package/bin/forge-server.mjs +22 -1
- package/cli/mw.mjs +186 -7657
- package/cli/mw.ts +26 -0
- package/components/ConnectorsPanel.tsx +46 -0
- package/components/Dashboard.tsx +23 -10
- package/components/JobsView.tsx +245 -6
- package/components/PipelineEditor.tsx +38 -1
- package/components/PipelineView.tsx +325 -4
- package/components/ScheduleCreateModal.tsx +1507 -0
- package/components/SchedulesView.tsx +605 -0
- package/components/SettingsModal.tsx +106 -0
- package/docs/Team-Workflow-Integration.md +487 -0
- package/docs/UI-Design-Brief-SidePanel.md +278 -0
- package/lib/__tests__/foreach-batch-yaml.test.ts +33 -0
- package/lib/__tests__/foreach-before.test.ts +201 -0
- package/lib/__tests__/foreach-parse.test.ts +114 -0
- package/lib/__tests__/foreach-snapshot.test.ts +112 -0
- package/lib/__tests__/foreach-source.test.ts +105 -0
- package/lib/__tests__/foreach-template.test.ts +112 -0
- package/lib/chat/agent-loop.ts +3 -3
- package/lib/chat-standalone.ts +26 -1
- package/lib/claude-process.ts +8 -5
- package/lib/connectors/sync.ts +8 -2
- package/lib/crypto.ts +1 -1
- package/lib/dirs.ts +22 -7
- package/lib/help-docs/05-pipelines.md +171 -0
- package/lib/help-docs/13-schedules.md +165 -0
- package/lib/help-docs/23-automation-states.md +148 -0
- package/lib/help-docs/CLAUDE.md +6 -6
- package/lib/init.ts +25 -6
- package/lib/jobs/recipes.ts +3 -2
- package/lib/jobs/scheduler.ts +215 -11
- package/lib/jobs/store.ts +79 -3
- package/lib/jobs/types.ts +31 -0
- package/lib/logger.ts +1 -1
- package/lib/notify.ts +13 -6
- package/lib/pipeline-gc.ts +105 -0
- package/lib/pipeline-scheduler.ts +29 -0
- package/lib/pipeline.ts +811 -330
- package/lib/schedules/action-runner.ts +257 -0
- package/lib/schedules/scheduler.ts +422 -0
- package/lib/schedules/state.ts +41 -0
- package/lib/schedules/store.ts +618 -0
- package/lib/schedules/types.ts +117 -0
- package/lib/settings.ts +35 -0
- package/lib/task-manager.ts +56 -13
- package/lib/workflow-marketplace.ts +7 -1
- package/lib/workspace/skill-installer.ts +7 -6
- package/package.json +3 -1
- package/lib/help-docs/19-jobs.md +0 -145
- package/lib/help-docs/20-mantis-bug-fix.md +0 -115
- package/lib/help-docs/22-recipes.md +0 -124
|
@@ -546,6 +546,58 @@ export default function SettingsModal({ onClose }: { onClose: () => void }) {
|
|
|
546
546
|
</p>
|
|
547
547
|
</div>
|
|
548
548
|
|
|
549
|
+
{/* Pipeline tmp dir GC */}
|
|
550
|
+
<div className="space-y-2">
|
|
551
|
+
<label className="text-xs text-[var(--text-secondary)] font-semibold uppercase">
|
|
552
|
+
Pipeline scratch dir GC
|
|
553
|
+
</label>
|
|
554
|
+
<p className="text-[10px] text-[var(--text-secondary)] leading-snug">
|
|
555
|
+
Each pipeline run gets a scratch dir at <code><project>/.forge/worktrees/pipeline-<id>/</code> exposed
|
|
556
|
+
to YAML as <code>{'{{run.tmp_dir}}'}</code>. Done runs are wiped immediately; failed / cancelled are
|
|
557
|
+
kept N days for inspection then swept by background GC.
|
|
558
|
+
</p>
|
|
559
|
+
<div className="flex items-center gap-2 flex-wrap">
|
|
560
|
+
<label className="text-[10px] text-[var(--text-secondary)] inline-flex items-center gap-1">
|
|
561
|
+
<input
|
|
562
|
+
type="checkbox"
|
|
563
|
+
checked={(settings as any).pipelineTmpCleanDoneImmediate !== false}
|
|
564
|
+
onChange={e => setSettings({ ...settings, pipelineTmpCleanDoneImmediate: e.target.checked } as any)}
|
|
565
|
+
className="accent-[var(--accent)]"
|
|
566
|
+
/>
|
|
567
|
+
Wipe <code>done</code> runs immediately
|
|
568
|
+
</label>
|
|
569
|
+
</div>
|
|
570
|
+
<div className="flex items-center gap-2 flex-wrap">
|
|
571
|
+
<span className="text-[10px] text-[var(--text-secondary)]">Keep failed (days)</span>
|
|
572
|
+
<input
|
|
573
|
+
type="number"
|
|
574
|
+
min={0}
|
|
575
|
+
max={90}
|
|
576
|
+
value={(settings as any).pipelineTmpKeepFailedDays ?? 3}
|
|
577
|
+
onChange={e => setSettings({ ...settings, pipelineTmpKeepFailedDays: Math.max(0, Number(e.target.value) || 0) } as any)}
|
|
578
|
+
className="w-16 text-xs bg-[var(--bg-tertiary)] border border-[var(--border)] rounded px-2 py-1 text-[var(--text-primary)]"
|
|
579
|
+
/>
|
|
580
|
+
<span className="text-[10px] text-[var(--text-secondary)] ml-2">Keep cancelled (days)</span>
|
|
581
|
+
<input
|
|
582
|
+
type="number"
|
|
583
|
+
min={0}
|
|
584
|
+
max={90}
|
|
585
|
+
value={(settings as any).pipelineTmpKeepCancelledDays ?? 3}
|
|
586
|
+
onChange={e => setSettings({ ...settings, pipelineTmpKeepCancelledDays: Math.max(0, Number(e.target.value) || 0) } as any)}
|
|
587
|
+
className="w-16 text-xs bg-[var(--bg-tertiary)] border border-[var(--border)] rounded px-2 py-1 text-[var(--text-primary)]"
|
|
588
|
+
/>
|
|
589
|
+
<span className="text-[10px] text-[var(--text-secondary)] ml-2">GC sweep every (hours)</span>
|
|
590
|
+
<input
|
|
591
|
+
type="number"
|
|
592
|
+
min={1}
|
|
593
|
+
max={168}
|
|
594
|
+
value={(settings as any).pipelineTmpGcIntervalHours ?? 6}
|
|
595
|
+
onChange={e => setSettings({ ...settings, pipelineTmpGcIntervalHours: Math.max(1, Number(e.target.value) || 6) } as any)}
|
|
596
|
+
className="w-16 text-xs bg-[var(--bg-tertiary)] border border-[var(--border)] rounded px-2 py-1 text-[var(--text-primary)]"
|
|
597
|
+
/>
|
|
598
|
+
</div>
|
|
599
|
+
</div>
|
|
600
|
+
|
|
549
601
|
{/* Remote Access (Cloudflare Tunnel) */}
|
|
550
602
|
<div className="space-y-2">
|
|
551
603
|
<label className="text-xs text-[var(--text-secondary)] font-semibold uppercase">
|
|
@@ -835,7 +887,36 @@ function ProfileRow({ id, cfg, inputClass, onUpdate, onDelete }: {
|
|
|
835
887
|
onUpdate: (cfg: any) => void; onDelete: () => void;
|
|
836
888
|
}) {
|
|
837
889
|
const [expanded, setExpanded] = useState(false);
|
|
890
|
+
const [testing, setTesting] = useState(false);
|
|
891
|
+
const [testResult, setTestResult] = useState<{ ok: boolean; message?: string; error?: string; duration_ms?: number } | null>(null);
|
|
838
892
|
const isApi = cfg.type === 'api';
|
|
893
|
+
|
|
894
|
+
async function runTest() {
|
|
895
|
+
setTesting(true);
|
|
896
|
+
setTestResult(null);
|
|
897
|
+
try {
|
|
898
|
+
// POST current in-memory values (apiKey/baseUrl/provider/model) so the
|
|
899
|
+
// user can test before clicking Save. Server falls back to saved values
|
|
900
|
+
// for anything we omit.
|
|
901
|
+
const r = await fetch(`/api/agents/${encodeURIComponent(id)}/test`, {
|
|
902
|
+
method: 'POST',
|
|
903
|
+
headers: { 'Content-Type': 'application/json' },
|
|
904
|
+
body: JSON.stringify({
|
|
905
|
+
apiKey: cfg.apiKey,
|
|
906
|
+
baseUrl: cfg.baseUrl,
|
|
907
|
+
provider: cfg.provider,
|
|
908
|
+
model: cfg.model,
|
|
909
|
+
}),
|
|
910
|
+
});
|
|
911
|
+
const j = await r.json();
|
|
912
|
+
setTestResult(j);
|
|
913
|
+
} catch (e) {
|
|
914
|
+
setTestResult({ ok: false, error: (e as Error).message || 'request failed' });
|
|
915
|
+
} finally {
|
|
916
|
+
setTesting(false);
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
|
|
839
920
|
const summary = isApi
|
|
840
921
|
? `API: ${cfg.provider || '?'} / ${cfg.model || '?'}`
|
|
841
922
|
: `CLI: ${cfg.cliType || cfg.base || '?'} / ${cfg.model || cfg.models?.task || 'default'}`;
|
|
@@ -895,6 +976,13 @@ function ProfileRow({ id, cfg, inputClass, onUpdate, onDelete }: {
|
|
|
895
976
|
<div className="flex-1">
|
|
896
977
|
<label className="text-[8px] text-[var(--text-secondary)]">API Key</label>
|
|
897
978
|
<input type="password" value={cfg.apiKey || ''} onChange={e => onUpdate({ ...cfg, apiKey: e.target.value })} className={inputClass} />
|
|
979
|
+
{(cfg.provider || '').toLowerCase() === 'anthropic' && (
|
|
980
|
+
<div className="text-[8px] text-[var(--text-secondary)] mt-0.5 leading-snug">
|
|
981
|
+
<code>sk-ant-api…</code> = standard pay-as-you-go key (recommended for chat).
|
|
982
|
+
|
|
983
|
+
<code>sk-ant-oat…</code> = Claude Code OAuth — works, but shares your Pro/Max 5h quota and 429s quickly.
|
|
984
|
+
</div>
|
|
985
|
+
)}
|
|
898
986
|
</div>
|
|
899
987
|
</div>
|
|
900
988
|
<div>
|
|
@@ -923,6 +1011,24 @@ function ProfileRow({ id, cfg, inputClass, onUpdate, onDelete }: {
|
|
|
923
1011
|
className={inputClass + ' font-mono'}
|
|
924
1012
|
/>
|
|
925
1013
|
</div>
|
|
1014
|
+
<div className="flex items-center gap-2 pt-1">
|
|
1015
|
+
<button
|
|
1016
|
+
onClick={runTest}
|
|
1017
|
+
disabled={testing || !cfg.apiKey}
|
|
1018
|
+
className="text-[9px] px-2 py-0.5 rounded bg-[var(--accent)]/10 text-[var(--accent)] hover:bg-[var(--accent)]/20 disabled:opacity-40 disabled:cursor-not-allowed"
|
|
1019
|
+
title={!cfg.apiKey ? 'Enter an API key first' : 'Probe GET /models against the provider'}
|
|
1020
|
+
>
|
|
1021
|
+
{testing ? 'Testing…' : 'Test'}
|
|
1022
|
+
</button>
|
|
1023
|
+
{testResult && (
|
|
1024
|
+
<span className={`text-[9px] font-mono ${testResult.ok ? 'text-green-500' : 'text-red-400'}`}>
|
|
1025
|
+
{testResult.ok ? '✓' : '✗'} {testResult.message || testResult.error}
|
|
1026
|
+
{typeof testResult.duration_ms === 'number' && (
|
|
1027
|
+
<span className="text-[var(--text-secondary)] ml-1">({testResult.duration_ms}ms)</span>
|
|
1028
|
+
)}
|
|
1029
|
+
</span>
|
|
1030
|
+
)}
|
|
1031
|
+
</div>
|
|
926
1032
|
</>
|
|
927
1033
|
) : (
|
|
928
1034
|
<>
|
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
|
|
2
|
+
# Forge 部门工作流集成 —— Design / Dev / QA 三团队 Playbook
|
|
3
|
+
|
|
4
|
+
> Phase 1 目标:让部门内 **Design / Dev / QA** 三个团队的产出全部通过 Forge 打通,所有文档统一进 `pd-docs` GitLab 仓库,按 release / epic 双层组织。PM 与销售在本阶段是**输入源**而非 Forge 用户。
|
|
5
|
+
>
|
|
6
|
+
> 设计原则:**用 Forge 已有的能力(连接器、chat、jobs、crafts、Claude Code),不发明新概念。**
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## 0. 范围(Scope)
|
|
10
|
+
|
|
11
|
+
### In scope —— 本期要做
|
|
12
|
+
|
|
13
|
+
- Design / Dev / QA 三个内部团队的日常协作通过 Forge chat 进行
|
|
14
|
+
- 单一 GitLab 仓库 `pd-docs` 承载所有 markdown 资料,按 release/epic 组织
|
|
15
|
+
- 既有系统(PMDB、Mantis、GitLab)**通过 Forge 浏览器扩展连接器接入**,不做迁移
|
|
16
|
+
- 关键节点(立项、提测、发版)用 Forge job 做自动化
|
|
17
|
+
|
|
18
|
+
### Out of scope —— 本期不做
|
|
19
|
+
|
|
20
|
+
- PM / 销售直接进 Forge(他们继续用 PMDB,Forge 单向读)
|
|
21
|
+
- 替代 PMDB / Mantis(只是把它们做成 Forge 的工具,不动数据归属)
|
|
22
|
+
- 跨部门 / 跨公司的 marketplace
|
|
23
|
+
- 完整的发版自动化(只做 release notes 草稿,不接 CI/CD)
|
|
24
|
+
- **TP 系统**:由 QA 自己开发/维护,**QA 继续用**(本期不动);Dev / PM 内部跟踪改走 GitLab Epic+Issue
|
|
25
|
+
|
|
26
|
+
### 关键决策
|
|
27
|
+
|
|
28
|
+
| # | 决策 | 选择 | 备注 |
|
|
29
|
+
|---|---|---|---|
|
|
30
|
+
| 1 | TP 系统 | **QA 继续用,Dev/PM 侧用 GitLab Epic+Issue 替代** | TP 是 QA 自研系统,不进 Forge 集成范围;但 QA 工作流仍可保留 TP 引用(可选) |
|
|
31
|
+
| 2 | Mantis vs GitLab 分工 | **Mantis = 公司主要管理工具(NFR 立项 + Bug 追踪,合规必走);GitLab = Dev 内部推动使用(Epic + Issue + MR)** | 两套并存,各管各的;**Epic ID 命名带 Mantis NFR 编号**,可互查 |
|
|
32
|
+
| 3 | pd-docs 写权限 | **所有人有 push 权限,但 merge 到 master 必走 MR** | 用户确认 |
|
|
33
|
+
| 4 | 测试自动化脚本 | **QA 自己负责**,跟测试用例同仓库(`06-test/automation/`) | QA owns it end-to-end |
|
|
34
|
+
| 5 | PMDB → git 同步 | **Forge job 定时拉**,落到 `pd-docs/inbox/`,Design 从 inbox 挑需求建 epic | 不要求 PM/销售配合,自动化 |
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
## 1. 角色与系统映射
|
|
38
|
+
|
|
39
|
+
### 角色
|
|
40
|
+
|
|
41
|
+
| 角色 | 在本流程的职责 | 主用 Forge 功能 |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| **Design team** | 调研 / 沟通 / 写 PD 设计方案 | chat 起草 PD,Mantis/PMDB 连接器,文件 commit |
|
|
44
|
+
| **Dev (技术负责人)** | 拆模块 / 写技术设计 / 分配子任务 | chat + Claude Code 起草技术设计,GitLab Issue 连接器 |
|
|
45
|
+
| **Dev (模块负责人)** | 实现子功能,开 MR | GitLab MR 连接器,Forge pipeline |
|
|
46
|
+
| **QA** | 测试用例,自动化脚本,回归 | chat 起草用例,Mantis bug 连接器 |
|
|
47
|
+
| **Manager** | review 设计/技术方案,版本规划 | Forge craft(release dashboard) |
|
|
48
|
+
| ~~PM / 销售~~ | 在 PMDB 录入需求 | (不进 Forge) |
|
|
49
|
+
|
|
50
|
+
### 系统映射
|
|
51
|
+
|
|
52
|
+
| 系统 | 当前角色 | 如何接入 Forge |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| PMDB | 需求入口,PM/销售写 | 浏览器扩展连接器(只读)+ Forge job 定时同步到 `pd-docs/inbox/` |
|
|
55
|
+
| Mantis | **公司主要管理工具**:NFR 立项 + Bug 追踪(合规必走) | 浏览器扩展连接器(读 + 写) |
|
|
56
|
+
| GitLab `pd-docs` | 文档单一仓库 | 浏览器扩展连接器 + 本地 clone |
|
|
57
|
+
| GitLab 代码仓库 | **Dev 内部推动使用**:代码 + Epic + Issue + MR | 浏览器扩展连接器 + GitLab API |
|
|
58
|
+
| TP | QA 自研系统,QA 继续使用 | **不进 Forge 集成**(QA 视情况手动同步) |
|
|
59
|
+
| Forge chat | 协作主界面 | 主用 |
|
|
60
|
+
| Claude Code | 长文本起草 / 代码生成 | Forge chat 触发,在本地 pd-docs cwd 跑 |
|
|
61
|
+
| Forge jobs | 自动化:PMDB 同步 / 立项 / 周进度 / bug 日报 / release notes | 主用 |
|
|
62
|
+
| Forge craft | release dashboard(可选,后期) | 后期 |
|
|
63
|
+
| Teams | 评审通知 / 公告 | 浏览器扩展连接器(消息发送) |
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
## 2. 资料共享:`pd-docs` GitLab 仓库结构
|
|
67
|
+
|
|
68
|
+
### 设计原则
|
|
69
|
+
|
|
70
|
+
- **markdown only** —— 所有 stage 产出都是 `.md`,Forge chat 和 Claude Code 都能直接读
|
|
71
|
+
- **release / epic 双层目录** —— 一眼看到这个版本要交付什么
|
|
72
|
+
- **EPIC-编号 == Mantis NFR 编号 == GitLab Epic 编号** —— 三处可互查,人脑只记一个数字
|
|
73
|
+
- **文件名日期前缀** —— 同 stage 多次产出按时间序排
|
|
74
|
+
- **每个 epic 目录骨架由 Forge job 自动建立** —— 立项时一键生成,人不用复制模板
|
|
75
|
+
|
|
76
|
+
### 目录结构
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
pd-docs/ # GitLab 仓库
|
|
80
|
+
├── README.md # 索引 + 命名规范 + Forge 使用 cheatsheet
|
|
81
|
+
├── templates/ # 各阶段模板,立项时被复制
|
|
82
|
+
│ ├── 00-intake.md # PMDB 链接 + 销售原始描述
|
|
83
|
+
│ ├── 01-discovery-meeting.md # 客户/PM 访谈纪要
|
|
84
|
+
│ ├── 02-design.md # PD 设计方案主文档
|
|
85
|
+
│ ├── 03-review.md # 评审纪要
|
|
86
|
+
│ ├── 04-tech-design.md # 技术设计
|
|
87
|
+
│ ├── 06-test-cases.md # 测试用例
|
|
88
|
+
│ └── 07-release.md # 上线记录
|
|
89
|
+
├── inbox/ # Forge job 定时从 PMDB 拉的"未处理"需求
|
|
90
|
+
│ ├── 2026-04-08-PMDB-7821.md # 文件名带日期 + PMDB ID
|
|
91
|
+
│ └── 2026-04-09-PMDB-7825.md
|
|
92
|
+
├── releases/
|
|
93
|
+
│ ├── 2026-Q3/
|
|
94
|
+
│ │ ├── README.md # 本 release 范围、Epic 清单、关键时间点
|
|
95
|
+
│ │ ├── EPIC-1234-SAML-SSO/
|
|
96
|
+
│ │ │ ├── 00-intake.md
|
|
97
|
+
│ │ │ ├── 01-discovery/
|
|
98
|
+
│ │ │ │ ├── 2026-04-12-customer-acme.md
|
|
99
|
+
│ │ │ │ └── requirements.md
|
|
100
|
+
│ │ │ ├── 02-design.md
|
|
101
|
+
│ │ │ ├── 03-review/
|
|
102
|
+
│ │ │ │ ├── 2026-04-25-r1.md
|
|
103
|
+
│ │ │ │ └── 2026-05-08-r2.md
|
|
104
|
+
│ │ │ ├── 04-tech-design/
|
|
105
|
+
│ │ │ │ ├── overview.md
|
|
106
|
+
│ │ │ │ ├── module-auth.md
|
|
107
|
+
│ │ │ │ └── module-config.md
|
|
108
|
+
│ │ │ ├── 05-implementation/ # 开发期决策、调研、坑记录
|
|
109
|
+
│ │ │ ├── 06-test/
|
|
110
|
+
│ │ │ │ ├── test-cases.md
|
|
111
|
+
│ │ │ │ ├── test-plan.md
|
|
112
|
+
│ │ │ │ └── automation/ # 自动化脚本
|
|
113
|
+
│ │ │ └── 07-release.md
|
|
114
|
+
│ │ └── EPIC-1235-XXX/
|
|
115
|
+
│ └── 2026-Q4/
|
|
116
|
+
└── shared/ # 跨 release 通用资料
|
|
117
|
+
├── architecture/ # 部门级架构图(每年更新)
|
|
118
|
+
└── glossary.md # 术语表
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Forge chat 怎么"读这个仓库"
|
|
122
|
+
|
|
123
|
+
技术上有两种方式:
|
|
124
|
+
|
|
125
|
+
1. **本地 clone**:Forge 后端跑在内网机器上,定时 `git pull pd-docs`。chat 工具 `read_pd_doc(path)` 直接读本地文件 —— **快,低开销**。
|
|
126
|
+
2. **GitLab API 连接器**(浏览器扩展端):chat 调用 `gitlab.get_file(path)` 拉单个文件 —— **慢但解耦,适合 Forge 后端不在内网的情况**。
|
|
127
|
+
|
|
128
|
+
Phase 1 用方式 1(简单)。
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
## 3. 整体工作流(stage 维度)
|
|
132
|
+
|
|
133
|
+
| # | Stage | 主角色 | 输入 | 产出 | 周期 |
|
|
134
|
+
|---|---|---|---|---|---|
|
|
135
|
+
| 1 | Intake | PM/销售(Forge 外) | 业务需求 | PMDB 条目 | <1 周 |
|
|
136
|
+
| 2 | Discovery | Design | PMDB 条目 | `01-discovery/*.md` | 2-4 周 |
|
|
137
|
+
| 3 | Design | Design | 调研 + 历史 PD | `02-design.md` | 1-3 周 |
|
|
138
|
+
| 4 | Review | Dev + Design + Manager | `02-design.md` | `03-review/*.md` + 定稿 | 1-2 周 |
|
|
139
|
+
| 5 | Formalize | Manager + 技术负责人 | 定稿 PD | Mantis NFR + GitLab Epic + 目录骨架 | 1-2 天 |
|
|
140
|
+
| 6 | Release Plan | Manager | Epic 列表 | Epic milestone | 1 周 |
|
|
141
|
+
| 7 | Tech Design | 技术负责人 + 模块负责人 | `02-design.md` | `04-tech-design/*.md` + 子 issue | 2-4 周 |
|
|
142
|
+
| 8 | Implementation | 模块负责人 | 子 issue + 技术设计 | MR → merge | 4-12 周 |
|
|
143
|
+
| 9 | QA | QA + Dev | PD + 技术设计 + 代码 | `06-test/*` + bug 报告 | 2-4 周 |
|
|
144
|
+
| 10 | Release | Manager + 发版 | merged Epic | GitLab release + `07-release.md` | <1 周 |
|
|
145
|
+
|
|
146
|
+
**总周期 3-6 月**,跟现有版本节奏一致。
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
## 4. Design 团队工作流(详细)
|
|
150
|
+
|
|
151
|
+
### Stage 2: Discovery —— 调研沟通
|
|
152
|
+
|
|
153
|
+
**目标**:把 PMDB 里一条粗糙的需求,变成"我们要做什么、给谁、为什么"的明确陈述。
|
|
154
|
+
|
|
155
|
+
**步骤**:
|
|
156
|
+
|
|
157
|
+
1. **Forge job 已经自动同步 PMDB 到 `pd-docs/inbox/`**(每小时跑一次,新增需求自动落地)。Design 团队每天早上 chat 输入:
|
|
158
|
+
> "列下 inbox 里本周新增的需求"
|
|
159
|
+
|
|
160
|
+
chat 直接读本地 `pd-docs/inbox/` 列表,Design 不用打开 PMDB 网页。
|
|
161
|
+
|
|
162
|
+
2. 选定一条要做的,**chat 触发立项草稿**:
|
|
163
|
+
> "把 PMDB-7821 作为新 epic,起一个工作目录"
|
|
164
|
+
|
|
165
|
+
背后 Forge job 跑:
|
|
166
|
+
- 在 `pd-docs` 仓库建 `releases/未规划/EPIC-TBD-{slug}/` 目录
|
|
167
|
+
- **从 inbox 里 move `2026-04-08-PMDB-7821.md` 到新 epic 的 `00-intake.md`**(避免重复)
|
|
168
|
+
- 复制其他 stage 模板进去
|
|
169
|
+
|
|
170
|
+
3. 约客户 / PM / 销售开会(线下/Teams)。
|
|
171
|
+
|
|
172
|
+
4. **会后,chat 起会议纪要**:
|
|
173
|
+
> "刚跟客户 ACME 开了 30 分钟,主要谈了 SSO 改造,他们的痛点是 [...]。
|
|
174
|
+
> 帮我整理成一份 discovery 纪要,放到当前 epic 下"
|
|
175
|
+
|
|
176
|
+
Chat 生成 markdown,落到 `01-discovery/2026-04-12-customer-acme.md`,**commit 一个分支**(MR 进 master)。
|
|
177
|
+
|
|
178
|
+
5. 重复 2-3 次,直到 `01-discovery/requirements.md` 整理出明确的 "what / why / who / out-of-scope"。
|
|
179
|
+
|
|
180
|
+
**Forge 实际帮上的忙**:
|
|
181
|
+
- PMDB 连接器,**不用切到 PMDB 页面**
|
|
182
|
+
- chat 写 markdown,**比自己排版快**
|
|
183
|
+
- 同类历史 epic 的检索:`"找 pd-docs 里所有提过 SAML 的 epic"` → chat 在本地 clone 上跑 grep
|
|
184
|
+
|
|
185
|
+
### Stage 3: Design —— 写 PD 设计方案
|
|
186
|
+
|
|
187
|
+
**目标**:产出 `02-design.md`,包含设计 + 实现方案的初版,**够让研发开始 review**。
|
|
188
|
+
|
|
189
|
+
**步骤**:
|
|
190
|
+
|
|
191
|
+
1. **chat 起 PD 骨架**:
|
|
192
|
+
> "基于这个 epic 的 discovery 资料,起一份 PD 草稿,
|
|
193
|
+
> 参考 EPIC-1100 的 PD 结构"
|
|
194
|
+
|
|
195
|
+
Chat 读 `01-discovery/*` + `releases/*/EPIC-1100/02-design.md`,**生成 PD 骨架**。
|
|
196
|
+
|
|
197
|
+
2. Design 自己填充细节(架构图、字段定义、API 草案)。架构图用 Excalidraw,放在 `02-design.md` 同目录,文件名同名 `.excalidraw.svg`。
|
|
198
|
+
|
|
199
|
+
3. **chat 自检**:
|
|
200
|
+
> "这份 PD 哪里写得不够具体,有哪些没回答的问题?"
|
|
201
|
+
|
|
202
|
+
chat 给出 review 清单。Design 根据清单补。
|
|
203
|
+
|
|
204
|
+
4. PD 满意后 commit + push,触发**自动 MR 到 master**。**MR description 由 chat 起草**(改了什么、为什么)。
|
|
205
|
+
|
|
206
|
+
**Forge 实际帮上的忙**:
|
|
207
|
+
- 历史 PD 检索 + 套结构
|
|
208
|
+
- PD 自检 prompt
|
|
209
|
+
- MR description 起草
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
## 5. Dev 团队工作流(详细)
|
|
213
|
+
|
|
214
|
+
### Stage 4: Review —— 设计评审(多轮)
|
|
215
|
+
|
|
216
|
+
**目标**:研发对 `02-design.md` 提出问题/反对/改进,Design 改,直到通过。
|
|
217
|
+
|
|
218
|
+
**步骤**:
|
|
219
|
+
|
|
220
|
+
1. PD 被 push 到 master 后,**Forge job 自动**:
|
|
221
|
+
- Teams 连接器发消息到研发组群:"`EPIC-TBD-SAML-SSO` 的 PD 提交了,请 review"
|
|
222
|
+
- 在 `03-review/` 下建 `2026-04-25-r1.md` 模板,等填
|
|
223
|
+
|
|
224
|
+
2. 研发自己开 Forge chat:
|
|
225
|
+
> "把 EPIC-TBD-SAML-SSO 的 PD 给我总结一遍重点"
|
|
226
|
+
|
|
227
|
+
chat 读 `02-design.md`,给一段 300 字总结。
|
|
228
|
+
|
|
229
|
+
3. 研发提问/反对,Design 在会上记下,**chat 帮归类**:
|
|
230
|
+
> "帮我把刚才会上提的 12 个问题分类:必须改的、待讨论的、out-of-scope"
|
|
231
|
+
|
|
232
|
+
chat 落到 `03-review/2026-04-25-r1.md`。
|
|
233
|
+
|
|
234
|
+
4. 多轮后,PD 定稿。**chat 标记定稿版本**:
|
|
235
|
+
> "把 02-design.md 当前内容打 v1.0 tag"
|
|
236
|
+
|
|
237
|
+
触发 git tag。
|
|
238
|
+
|
|
239
|
+
### Stage 5: Formalize —— 正式立项
|
|
240
|
+
|
|
241
|
+
**目标**:把"草稿目录"变成正式 epic。
|
|
242
|
+
|
|
243
|
+
**步骤**:
|
|
244
|
+
|
|
245
|
+
1. Manager 或技术负责人在 chat 输入:
|
|
246
|
+
> "立项 EPIC-TBD-SAML-SSO,目标版本 2026-Q3"
|
|
247
|
+
|
|
248
|
+
2. **Forge job 跑一连串自动化**:
|
|
249
|
+
- **Mantis 连接器**:在 Mantis 建一个 NFR,返回编号 `MA-9981`
|
|
250
|
+
- **GitLab API**:在代码仓库建 Epic `EPIC-9981-SAML-SSO`(编号沿用 Mantis NFR)
|
|
251
|
+
- **pd-docs 仓库**:目录 rename `EPIC-TBD-SAML-SSO/` → `EPIC-9981-SAML-SSO/`,移动到 `releases/2026-Q3/` 下
|
|
252
|
+
- **Forge chat 会话**:绑定到这个 epic,后续 chat 默认上下文是这个目录
|
|
253
|
+
|
|
254
|
+
3. **chat 通知技术负责人**:Teams 发消息 + 邮件(Teams 连接器)。
|
|
255
|
+
|
|
256
|
+
### Stage 6: Release Plan —— 版本规划
|
|
257
|
+
|
|
258
|
+
不复杂,Manager 在 GitLab Epic 上设 milestone。
|
|
259
|
+
|
|
260
|
+
(后期可以做 Forge craft 作为 release dashboard,聚合 release 里所有 Epic 的进度 + 子 issue + bug 数。**Phase 1 不做。**)
|
|
261
|
+
|
|
262
|
+
### Stage 7: Tech Design —— 技术设计
|
|
263
|
+
|
|
264
|
+
**目标**:技术负责人(主)+ 模块负责人(辅),产出 `04-tech-design/` 下的多份文档,拆出 GitLab 子 issue。
|
|
265
|
+
|
|
266
|
+
**步骤**:
|
|
267
|
+
|
|
268
|
+
1. **技术负责人在 chat 起整体技术设计**:
|
|
269
|
+
> "基于 EPIC-9981 的 PD,起一份技术设计 overview。
|
|
270
|
+
> 重点是改造 auth 模块、新增 SAML config 模块,
|
|
271
|
+
> 我们的 Java 代码在 fortinac 仓库 src/main/java/com/foo/auth"
|
|
272
|
+
|
|
273
|
+
chat 触发 Claude Code 在本地 `fortinac` cwd 跑,产出 `04-tech-design/overview.md`。Overview 包含:模块拆分、接口契约、关键风险、子任务清单。
|
|
274
|
+
|
|
275
|
+
2. **拆模块,分配负责人**(人脑决策,不需要 Forge 帮)。
|
|
276
|
+
|
|
277
|
+
3. **每个模块负责人在 chat 起子模块技术设计**:
|
|
278
|
+
> "我是 auth 模块负责人,我需要起 module-auth.md"
|
|
279
|
+
|
|
280
|
+
chat 读 `overview.md` + 相关代码,产出 `04-tech-design/module-auth.md`。
|
|
281
|
+
|
|
282
|
+
4. **批量创建 GitLab 子 issue**:
|
|
283
|
+
> "把 overview.md 里的子任务清单转成 GitLab issue,
|
|
284
|
+
> 关联到 EPIC-9981"
|
|
285
|
+
|
|
286
|
+
Forge job 调用 GitLab API,**一次创建 N 个子 issue,自动 link 到 epic**。每个 issue 描述里贴对应技术设计文档的 GitLab 链接。
|
|
287
|
+
|
|
288
|
+
**Forge 实际帮上的忙**:
|
|
289
|
+
- Claude Code 在代码仓库 cwd 跑,**起的技术设计自动带具体类名/文件路径**(不像纯 chat 会瞎编)
|
|
290
|
+
- 子 issue 批量创建(节省 30 分钟纯手工)
|
|
291
|
+
|
|
292
|
+
### Stage 8: Implementation —— 开发
|
|
293
|
+
|
|
294
|
+
**目标**:模块负责人按子 issue 实现,提 MR。
|
|
295
|
+
|
|
296
|
+
**步骤(对每个子 issue)**:
|
|
297
|
+
|
|
298
|
+
1. 模块负责人 checkout 分支,本地开发(可用 Claude Code)。
|
|
299
|
+
|
|
300
|
+
2. **MR 自动关联**:开 MR 时 description 里写 `Closes #123`,GitLab 自动关联子 issue 到 epic。
|
|
301
|
+
|
|
302
|
+
3. **MR review 时**,reviewer 可以在 Forge chat 输入:
|
|
303
|
+
> "@gitlab 总结 MR !4427 的改动重点"
|
|
304
|
+
|
|
305
|
+
chat 用 GitLab 连接器拉 diff,给摘要。
|
|
306
|
+
|
|
307
|
+
4. **进度跟踪**:Forge job 每周一早上跑,生成本周进度简报,写到 `EPIC-9981/05-implementation/2026-W19-status.md`。简报包含:closed/open issue 比例、本周 merge MR 数、blocker 摘要(从 GitLab issue 评论里抓"blocked"标记)。
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
## 6. QA 团队工作流(详细)
|
|
311
|
+
|
|
312
|
+
### Stage 9: QA —— 测试
|
|
313
|
+
|
|
314
|
+
**目标**:`06-test/` 下产出完整测试用例 + 自动化脚本,跑测试,bug 进 Mantis。
|
|
315
|
+
|
|
316
|
+
**步骤**:
|
|
317
|
+
|
|
318
|
+
1. **QA 在 chat 起测试用例草稿**:
|
|
319
|
+
> "EPIC-9981 准备提测,基于 PD + 技术设计起一份测试用例"
|
|
320
|
+
|
|
321
|
+
chat 读 `02-design.md` + `04-tech-design/*.md`,生成 `06-test/test-cases.md`。用例分类:
|
|
322
|
+
- 正向用例(主流程)
|
|
323
|
+
- 异常用例(边界 / 错误处理)
|
|
324
|
+
- 兼容性用例(浏览器 / 旧版本配置)
|
|
325
|
+
- 性能/安全用例(只对关键 Epic 写)
|
|
326
|
+
|
|
327
|
+
2. QA review + 补 chat 没想到的(domain 知识),commit 进 `pd-docs`。
|
|
328
|
+
|
|
329
|
+
3. **自动化脚本草稿**:
|
|
330
|
+
> "把上面的正向用例转成 Playwright 脚本"
|
|
331
|
+
|
|
332
|
+
chat 触发 Claude Code 在 QA 仓库 cwd 跑,落地 `06-test/automation/saml-login.spec.ts`。**自动化覆盖率不是目标,先覆盖回归用例就够**。
|
|
333
|
+
|
|
334
|
+
4. **跑测试,发 bug 到 Mantis**:
|
|
335
|
+
- chat 输入 "在 Mantis 建一个 bug:[复现步骤] [期望] [实际]"
|
|
336
|
+
- Mantis 连接器创建 bug,关联到 NFR `MA-9981`
|
|
337
|
+
|
|
338
|
+
5. **bug 跟踪**:Forge job 每天跑一次,把本 epic 下未关闭的 bug 列到 `06-test/bug-status.md`,**chat 直接读这个文件做日会汇报**。
|
|
339
|
+
|
|
340
|
+
**Forge 实际帮上的忙**:
|
|
341
|
+
- 从 PD + 技术设计起测试用例,QA **不用重新读一遍设计**
|
|
342
|
+
- 自动化脚本起草(覆盖 70%,QA 改 30%)
|
|
343
|
+
- bug 创建 / 跟踪 / 汇报自动化
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
## 7. Forge 在每个 stage 的具体能力清单
|
|
347
|
+
|
|
348
|
+
汇总一张表(不重复内容,标用到的 Forge 能力):
|
|
349
|
+
|
|
350
|
+
| Stage | Forge 能力 | 现状 | 备注 |
|
|
351
|
+
|---|---|---|---|
|
|
352
|
+
| Intake | PMDB 浏览器连接器(只读) | 需新写 YAML(15 分钟) | 列需求 / 读详情 |
|
|
353
|
+
| Intake | PMDB → inbox 同步 job | 需新 Forge job(scheduled,每小时) | 写入 `pd-docs/inbox/` |
|
|
354
|
+
| Discovery | chat 读 inbox | ✅ 已有 | 直接读本地 markdown |
|
|
355
|
+
| Discovery | chat 起会议纪要 | ✅ 已有 | |
|
|
356
|
+
| Discovery | 历史 epic grep | ✅ 已有(本地 clone) | |
|
|
357
|
+
| Design | chat 起 PD 草稿 | ✅ 已有 | |
|
|
358
|
+
| Design | PD 自检 prompt | 需固化 prompt 模板 | |
|
|
359
|
+
| Review | Teams 连接器发通知 | 需新写 YAML | 已有 isolated runner |
|
|
360
|
+
| Review | chat 归类反馈 | ✅ 已有 | |
|
|
361
|
+
| Formalize | Mantis 连接器(写) | 需扩展现有连接器,加 create_nfr 工具 | 需 destructive 标记 + consent |
|
|
362
|
+
| Formalize | GitLab API 建 Epic | 需新连接器 / HTTP 协议 | |
|
|
363
|
+
| Formalize | pd-docs 目录重命名 + git 操作 | 需新 Forge job | |
|
|
364
|
+
| Tech Design | Claude Code 本地 cwd | ✅ 已有 | |
|
|
365
|
+
| Tech Design | GitLab API 批量建子 issue | 同上 | |
|
|
366
|
+
| Implementation | GitLab MR diff 摘要 | 需新连接器读 MR | |
|
|
367
|
+
| Implementation | 每周进度 job | 需新 job(scheduled) | |
|
|
368
|
+
| QA | chat 起测试用例 | ✅ 已有 | |
|
|
369
|
+
| QA | Claude Code 起自动化脚本 | ✅ 已有 | |
|
|
370
|
+
| QA | Mantis bug 创建 | 需扩展现有连接器 | |
|
|
371
|
+
| QA | bug 状态日报 | 需新 job | |
|
|
372
|
+
|
|
373
|
+
**总计需要新建/扩展**:
|
|
374
|
+
- 2 个连接器(PMDB 读、GitLab API)
|
|
375
|
+
- 现有 2 个连接器各加几个写工具(Mantis create_nfr/create_bug、Teams send_message 已经有)
|
|
376
|
+
- **4 个 Forge job**(**PMDB→inbox 同步**、立项、周进度、bug 日报)
|
|
377
|
+
- 1 个 prompt 模板(PD 自检)
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
## 8. 分阶段落地路线
|
|
381
|
+
|
|
382
|
+
**别一口气全做。按依赖关系拆 4 个 milestone:**
|
|
383
|
+
|
|
384
|
+
### M0: 基础设施(1 周)
|
|
385
|
+
|
|
386
|
+
- [ ] 建 `pd-docs` GitLab 仓库
|
|
387
|
+
- [ ] 写 `templates/` 下所有 stage 的模板
|
|
388
|
+
- [ ] 写 `README.md`,定义命名规范 + Forge 使用 cheatsheet
|
|
389
|
+
- [ ] Forge 后端机器 `git clone pd-docs`,设置 systemd timer 每 10 分钟 `git pull`
|
|
390
|
+
- [ ] 一个示范 epic(挑历史一个已完成的,reverse engineer 一份样板)
|
|
391
|
+
|
|
392
|
+
### M1: Design team 接入(2-4 周)
|
|
393
|
+
|
|
394
|
+
- [ ] PMDB 连接器(只读 YAML,~50 行)
|
|
395
|
+
- [ ] **PMDB → `pd-docs/inbox/` 同步 job(scheduled,每小时)**
|
|
396
|
+
- [ ] PD 自检 prompt 固化到 chat skill
|
|
397
|
+
- [ ] Design team 至少 1 个新 epic 全流程跑通(2-3 → commit 到 `pd-docs`)
|
|
398
|
+
- [ ] 反馈一轮,调模板和 prompt
|
|
399
|
+
|
|
400
|
+
**M1 验收**:Design 不再用 Word/wiki,所有新 PD 直接在 Forge chat 起草 + commit pd-docs。
|
|
401
|
+
|
|
402
|
+
### M2: Dev team 接入(2-4 周)
|
|
403
|
+
|
|
404
|
+
- [ ] GitLab API 连接器(用 HTTP protocol,~100 行 YAML + token 配置)
|
|
405
|
+
- [ ] Mantis 连接器扩展:加 `create_nfr` 工具
|
|
406
|
+
- [ ] Forge job:立项自动化(建 NFR + Epic + 目录重命名)
|
|
407
|
+
- [ ] Forge job:每周进度简报
|
|
408
|
+
- [ ] 技术负责人按新流程跑通 1 个 epic 的 review + tech design + 拆 issue
|
|
409
|
+
|
|
410
|
+
**M2 验收**:立项一键完成,技术设计在 chat 里起草并 commit pd-docs,子 issue 批量创建。
|
|
411
|
+
|
|
412
|
+
### M3: QA team 接入(2-4 周)
|
|
413
|
+
|
|
414
|
+
- [ ] Mantis 连接器扩展:加 `create_bug` 工具
|
|
415
|
+
- [ ] Forge job:bug 状态日报
|
|
416
|
+
- [ ] QA 按新流程跑通 1 个 epic 的测试用例 + 自动化脚本草稿 + bug 跟踪
|
|
417
|
+
|
|
418
|
+
**M3 验收**:QA 测试用例和自动化脚本都进 pd-docs,bug 通过 chat 创建。
|
|
419
|
+
|
|
420
|
+
### M4: 巩固 / 后续(常态)
|
|
421
|
+
|
|
422
|
+
- 每月 retro,改 prompt / 模板 / job
|
|
423
|
+
- 视情况做 release dashboard craft(如果 manager 真的需要)
|
|
424
|
+
- 跨部门推广(out of phase 1)
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
## 9. 常见反对与回应
|
|
428
|
+
|
|
429
|
+
**Q: 为什么不直接用 Notion / 公司 wiki?**
|
|
430
|
+
A: Forge chat 要能直接 read 文档做检索 / 起草。Notion / 公司 wiki 没有干净的 API,而 markdown + git 是 Claude Code 和 chat 天然能处理的格式。**markdown 不绑死任何工具**,Forge 没了文档还在 git。
|
|
431
|
+
|
|
432
|
+
**Q: pd-docs 一个仓库会不会太大?**
|
|
433
|
+
A: 一个 epic 一般产出 < 1 MB markdown + 几张 svg。一年 10-20 个 epic,5 年内不会超 100 MB。GitLab 没压力。
|
|
434
|
+
|
|
435
|
+
**Q: 立项时 Mantis NFR 和 GitLab Epic 两边同步会不会偏移?**
|
|
436
|
+
A: NFR 只在立项创建一次,之后只读(合规留痕)。日常执行只看 GitLab Epic。两边没有"同步"问题,各管各的。
|
|
437
|
+
|
|
438
|
+
**Q: 如果 PMDB 改了需求,谁负责把 `00-intake.md` 同步更新?**
|
|
439
|
+
A: 默认手动 —— Design 发现需求变了,在 chat 触发"重新拉 PMDB-7821 更新当前 epic 的 intake"。**不做定时 polling,降低复杂度。**
|
|
440
|
+
|
|
441
|
+
**Q: 评审记录会不会被人偷偷改?**
|
|
442
|
+
A: git 历史可追溯。任何 commit 都能 blame 出来。如果团队不放心,可以加 commit signing。
|
|
443
|
+
|
|
444
|
+
**Q: Forge 后端挂了影响整个流程吗?**
|
|
445
|
+
A: pd-docs 是 GitLab 仓库,Forge 没了仓库还在,人可以直接 git 操作。Forge 是**协作加速器**,不是 single point of failure。
|
|
446
|
+
|
|
447
|
+
|
|
448
|
+
## 10. 待澄清(下一轮 review 解决)
|
|
449
|
+
|
|
450
|
+
1. **pd-docs 仓库放在哪个 GitLab group?** 部门私有 group 还是研发 group?
|
|
451
|
+
2. **PMDB 连接器读什么字段?** 至少需要:标题、描述、提出人、状态、客户、优先级。需 PMDB 页面长啥样看一眼。
|
|
452
|
+
3. **Mantis NFR 字段:** 立项时需要预填哪些?(优先级、负责人、目标版本)
|
|
453
|
+
4. **Forge 后端部署在哪台机器?** 决定了 `pd-docs` 本地 clone 路径和 systemd timer 配置。
|
|
454
|
+
5. **PMDB → inbox 同步频率:** 默认每小时,有更急需求时是不是要做到 15 分钟?
|
|
455
|
+
6. **TP 系统在 QA 工作流的角色:** QA 是否需要 Forge 在创建 Mantis bug 后**同时也往 TP 写一条**?还是 QA 手动二次录入?
|
|
456
|
+
7. **Design team 谁负责试跑 M1?** 至少需要 1 个人配合,出来反馈调 prompt / 模板。
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
## 附录 A: 一个完整 epic 时间线示例(假想)
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
2026-04-08 PM 在 PMDB 录入 "客户 ACME 要 SAML SSO" (PMDB-7821)
|
|
463
|
+
2026-04-08 Forge job 同步进 pd-docs/inbox/2026-04-08-PMDB-7821.md(1h 内)
|
|
464
|
+
2026-04-10 Design Liu 看 inbox,chat "把 PMDB-7821 作为新 epic"
|
|
465
|
+
2026-04-12 跟 ACME 开会,chat 落地 01-discovery/2026-04-12-customer-acme.md
|
|
466
|
+
2026-04-15 跟 PM 复核,chat 落地 01-discovery/requirements.md
|
|
467
|
+
2026-04-20 chat 起 02-design.md 草稿,Liu 补细节,push,触发评审通知
|
|
468
|
+
2026-04-25 研发 r1 评审,chat 落地 03-review/r1.md,Liu 改 PD
|
|
469
|
+
2026-05-08 研发 r2 评审,通过
|
|
470
|
+
2026-05-09 Manager 在 chat "立项 EPIC-TBD-SAML-SSO 目标 2026-Q3"
|
|
471
|
+
↓ Forge job 跑 ~30s:
|
|
472
|
+
↓ Mantis NFR MA-9981 创建
|
|
473
|
+
↓ GitLab Epic !9981 创建
|
|
474
|
+
↓ 目录重命名 + 移到 releases/2026-Q3/
|
|
475
|
+
↓ Teams 通知技术负责人 Zhang
|
|
476
|
+
2026-05-10 Zhang 在 chat 起 04-tech-design/overview.md(用 Claude Code)
|
|
477
|
+
2026-05-15 拆模块,3 个模块负责人分别起 module-*.md
|
|
478
|
+
2026-05-18 批量建 12 个 GitLab 子 issue
|
|
479
|
+
2026-05-19 ~ 2026-07-15 开发 + MR + 周进度简报
|
|
480
|
+
2026-07-16 提测,QA Chen 在 chat 起 06-test/test-cases.md
|
|
481
|
+
2026-07-20 自动化脚本草稿
|
|
482
|
+
2026-07-22 ~ 2026-08-05 测试,5 个 bug 进 Mantis,修复
|
|
483
|
+
2026-08-12 发版,Manager 触发 chat 生成 07-release.md(从 epic 下所有 MR 取 changelog)
|
|
484
|
+
2026-08-15 上线
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
**总周期 ~4 个月,落在 3-6 个月窗口内。**
|