@s_s/harmonia 1.0.0
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/README.md +3 -0
- package/build/core/dispatch.d.ts +38 -0
- package/build/core/dispatch.js +156 -0
- package/build/core/dispatch.js.map +1 -0
- package/build/core/docs.d.ts +19 -0
- package/build/core/docs.js +59 -0
- package/build/core/docs.js.map +1 -0
- package/build/core/overrides.d.ts +62 -0
- package/build/core/overrides.js +206 -0
- package/build/core/overrides.js.map +1 -0
- package/build/core/registry.d.ts +72 -0
- package/build/core/registry.js +121 -0
- package/build/core/registry.js.map +1 -0
- package/build/core/reviews.d.ts +26 -0
- package/build/core/reviews.js +83 -0
- package/build/core/reviews.js.map +1 -0
- package/build/core/state.d.ts +26 -0
- package/build/core/state.js +103 -0
- package/build/core/state.js.map +1 -0
- package/build/core/types.d.ts +181 -0
- package/build/core/types.js +6 -0
- package/build/core/types.js.map +1 -0
- package/build/core/workflow.d.ts +13 -0
- package/build/core/workflow.js +63 -0
- package/build/core/workflow.js.map +1 -0
- package/build/index.d.ts +15 -0
- package/build/index.js +57 -0
- package/build/index.js.map +1 -0
- package/build/setup/inject.d.ts +34 -0
- package/build/setup/inject.js +115 -0
- package/build/setup/inject.js.map +1 -0
- package/build/setup/templates.d.ts +21 -0
- package/build/setup/templates.js +177 -0
- package/build/setup/templates.js.map +1 -0
- package/build/tools/approve-doc.d.ts +6 -0
- package/build/tools/approve-doc.js +79 -0
- package/build/tools/approve-doc.js.map +1 -0
- package/build/tools/dispatch-role.d.ts +16 -0
- package/build/tools/dispatch-role.js +232 -0
- package/build/tools/dispatch-role.js.map +1 -0
- package/build/tools/doc-tools.d.ts +8 -0
- package/build/tools/doc-tools.js +102 -0
- package/build/tools/doc-tools.js.map +1 -0
- package/build/tools/get-project-status.d.ts +8 -0
- package/build/tools/get-project-status.js +230 -0
- package/build/tools/get-project-status.js.map +1 -0
- package/build/tools/get-role-prompt.d.ts +7 -0
- package/build/tools/get-role-prompt.js +95 -0
- package/build/tools/get-role-prompt.js.map +1 -0
- package/build/tools/override-tools.d.ts +6 -0
- package/build/tools/override-tools.js +129 -0
- package/build/tools/override-tools.js.map +1 -0
- package/build/tools/project-init.d.ts +6 -0
- package/build/tools/project-init.js +71 -0
- package/build/tools/project-init.js.map +1 -0
- package/build/tools/report-dispatch.d.ts +11 -0
- package/build/tools/report-dispatch.js +142 -0
- package/build/tools/report-dispatch.js.map +1 -0
- package/build/tools/setup-project.d.ts +8 -0
- package/build/tools/setup-project.js +88 -0
- package/build/tools/setup-project.js.map +1 -0
- package/build/tools/update-phase.d.ts +7 -0
- package/build/tools/update-phase.js +79 -0
- package/build/tools/update-phase.js.map +1 -0
- package/package.json +51 -0
- package/workflows/dev/roles/architect.md +66 -0
- package/workflows/dev/roles/developer.md +44 -0
- package/workflows/dev/roles/pm.md +99 -0
- package/workflows/dev/roles/tester.md +44 -0
- package/workflows/dev/workflow.json +134 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: update_phase
|
|
3
|
+
* Advance or update the status of a project phase.
|
|
4
|
+
* When completing a phase, checks that all doc-type outputs exist (output guard).
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { readState, updatePhaseStatus } from '../core/state.js';
|
|
8
|
+
import { loadWorkflow } from '../core/workflow.js';
|
|
9
|
+
import { listDocs } from '../core/docs.js';
|
|
10
|
+
export function registerUpdatePhase(server, workflowsDir) {
|
|
11
|
+
server.tool('update_phase', 'Update the status of a project phase. When a phase is completed, the next phase is automatically started. Completing a phase checks that all required doc outputs exist.', {
|
|
12
|
+
project_name: z.string().describe('Project name'),
|
|
13
|
+
phase_id: z.string().describe('Phase ID to update (e.g. clarify, design, develop, test, deliver)'),
|
|
14
|
+
status: z.enum(['pending', 'in_progress', 'completed', 'blocked']).describe('New status for the phase'),
|
|
15
|
+
blocked_reason: z.string().optional().describe("Reason for blocking (required when status is 'blocked')"),
|
|
16
|
+
force: z.boolean().optional().describe('Force completion even if outputs are missing (default: false)'),
|
|
17
|
+
}, async ({ project_name, phase_id, status, blocked_reason, force }) => {
|
|
18
|
+
try {
|
|
19
|
+
// Output guard: when completing a phase, check doc outputs exist
|
|
20
|
+
if (status === 'completed' && !force) {
|
|
21
|
+
const currentState = await readState(project_name);
|
|
22
|
+
const wf = await loadWorkflow(workflowsDir, currentState.workflow);
|
|
23
|
+
const existingDocs = await listDocs(project_name);
|
|
24
|
+
const phaseDef = wf.definition.phases.find((p) => p.id === phase_id);
|
|
25
|
+
if (phaseDef) {
|
|
26
|
+
const missingDocOutputs = phaseDef.outputs.filter((o) => {
|
|
27
|
+
const docDef = wf.definition.docs[o];
|
|
28
|
+
if (!docDef)
|
|
29
|
+
return false; // unknown output, skip
|
|
30
|
+
if (docDef.external)
|
|
31
|
+
return false; // external outputs not managed by write_doc
|
|
32
|
+
const scaleVal = docDef.scale[currentState.scale];
|
|
33
|
+
if (scaleVal === 'skip' || scaleVal === 'optional')
|
|
34
|
+
return false; // not required at this scale
|
|
35
|
+
return !existingDocs.includes(o);
|
|
36
|
+
});
|
|
37
|
+
if (missingDocOutputs.length > 0) {
|
|
38
|
+
return {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: `Cannot complete phase "${phase_id}" — missing doc outputs: ${missingDocOutputs.join(', ')}.\n\nProduce these documents with write_doc first, or use force=true to skip this check.`,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
isError: true,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const state = await updatePhaseStatus(project_name, phase_id, status, blocked_reason);
|
|
51
|
+
const phasesSummary = state.phases
|
|
52
|
+
.map((p) => {
|
|
53
|
+
const marker = p.id === state.currentPhase ? ' <-- current' : '';
|
|
54
|
+
return ` ${p.id}: ${p.status}${p.blockedReason ? ` (${p.blockedReason})` : ''}${marker}`;
|
|
55
|
+
})
|
|
56
|
+
.join('\n');
|
|
57
|
+
return {
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: `Phase "${phase_id}" updated to "${status}".\n\nProject phases:\n${phasesSummary}`,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
return {
|
|
68
|
+
content: [
|
|
69
|
+
{
|
|
70
|
+
type: 'text',
|
|
71
|
+
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
isError: true,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=update-phase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-phase.js","sourceRoot":"","sources":["../../src/tools/update-phase.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@s_s/harmonia",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Multi-agent orchestration MCP server with pluggable workflows",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./build/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"harmonia": "build/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"build",
|
|
12
|
+
"workflows"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"start": "node build/index.js",
|
|
18
|
+
"prettier": "prettier --check \"**/*\"",
|
|
19
|
+
"prettier:fix": "prettier -c --write \"**/*\"",
|
|
20
|
+
"prettier:staged": "prettier --write",
|
|
21
|
+
"test": "vitest run",
|
|
22
|
+
"test:watch": "vitest",
|
|
23
|
+
"release": "bash scripts/release.sh",
|
|
24
|
+
"prepare": "husky"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"mcp",
|
|
28
|
+
"agent",
|
|
29
|
+
"orchestration",
|
|
30
|
+
"workflow",
|
|
31
|
+
"multi-agent"
|
|
32
|
+
],
|
|
33
|
+
"author": "",
|
|
34
|
+
"license": "MIT",
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
37
|
+
"yaml": "^2.8.2",
|
|
38
|
+
"zod": "^4.3.6"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^25.3.3",
|
|
42
|
+
"husky": "^9.1.7",
|
|
43
|
+
"lint-staged": "^16.3.2",
|
|
44
|
+
"prettier": "^3.8.1",
|
|
45
|
+
"typescript": "^5.9.3",
|
|
46
|
+
"vitest": "^4.0.18"
|
|
47
|
+
},
|
|
48
|
+
"lint-staged": {
|
|
49
|
+
"**/*.{js,ts,md}": "npm run prettier:staged --"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
model: strong
|
|
3
|
+
session: persistent
|
|
4
|
+
parallel: false
|
|
5
|
+
capabilities:
|
|
6
|
+
- id: analyze-codebase
|
|
7
|
+
description: 阅读理解现有代码结构
|
|
8
|
+
- id: write-tech-design
|
|
9
|
+
description: 撰写技术方案文档
|
|
10
|
+
doc: tech-design
|
|
11
|
+
- id: write-data-model
|
|
12
|
+
description: 设计数据模型
|
|
13
|
+
doc: data-model
|
|
14
|
+
- id: write-api-design
|
|
15
|
+
description: 设计 API 接口
|
|
16
|
+
doc: api-design
|
|
17
|
+
- id: write-task-breakdown
|
|
18
|
+
description: 拆解开发任务
|
|
19
|
+
doc: task-breakdown
|
|
20
|
+
- id: write-risk-assessment
|
|
21
|
+
description: 评估技术风险
|
|
22
|
+
doc: risk-assessment
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# 架构师
|
|
26
|
+
|
|
27
|
+
你是技术架构师,负责技术方案设计和任务拆解。你需要深入理解代码库,做出合理的技术决策。
|
|
28
|
+
|
|
29
|
+
## 核心职责
|
|
30
|
+
|
|
31
|
+
### 代码库分析
|
|
32
|
+
|
|
33
|
+
- 阅读和理解现有代码结构
|
|
34
|
+
- 识别可复用的模块和需要新建的部分
|
|
35
|
+
- 评估技术风险
|
|
36
|
+
|
|
37
|
+
### 技术方案
|
|
38
|
+
|
|
39
|
+
- 根据 PM 提供的需求文档,制定技术实现方案
|
|
40
|
+
- 选择合适的技术栈、设计模式、架构方式
|
|
41
|
+
- 输出技术方案文档
|
|
42
|
+
- 记录关键架构决策(ADR)
|
|
43
|
+
|
|
44
|
+
### 数据模型与 API 设计
|
|
45
|
+
|
|
46
|
+
- 设计数据模型(如果项目需要)
|
|
47
|
+
- 设计 API 接口(如果项目需要)
|
|
48
|
+
|
|
49
|
+
### 任务拆解
|
|
50
|
+
|
|
51
|
+
- 将技术方案拆解为可执行的开发任务
|
|
52
|
+
- 定义任务间的依赖关系
|
|
53
|
+
- 估算每个任务的复杂度
|
|
54
|
+
- 标注哪些任务可以并行
|
|
55
|
+
|
|
56
|
+
### 技术风险评估
|
|
57
|
+
|
|
58
|
+
- 识别技术风险和不确定性
|
|
59
|
+
- 提出缓解措施
|
|
60
|
+
|
|
61
|
+
## 行为规则
|
|
62
|
+
|
|
63
|
+
1. **代码为据**:技术决策基于实际代码分析,不凭空假设
|
|
64
|
+
2. **任务可执行**:拆解出的每个任务要足够具体,开发者拿到就能开始
|
|
65
|
+
3. **文档落地**:技术方案、任务拆解必须通过 write_doc 工具写入
|
|
66
|
+
4. **不做需求决策**:技术不确定时反馈给 PM,由 PM 与用户确认
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
model: medium
|
|
3
|
+
session: persistent
|
|
4
|
+
parallel: true
|
|
5
|
+
capabilities:
|
|
6
|
+
- id: implement-code
|
|
7
|
+
description: 按任务拆解编码实现功能
|
|
8
|
+
- id: write-unit-tests
|
|
9
|
+
description: 为关键逻辑编写单元测试
|
|
10
|
+
- id: ensure-quality
|
|
11
|
+
description: 代码质量保障(lint、类型检查、规范)
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Developer(开发者)
|
|
15
|
+
|
|
16
|
+
你是开发者,负责按照任务拆解编码实现功能。
|
|
17
|
+
|
|
18
|
+
## 核心职责
|
|
19
|
+
|
|
20
|
+
### 编码实现
|
|
21
|
+
|
|
22
|
+
- 根据任务拆解文档中分配给你的任务进行开发
|
|
23
|
+
- 遵循技术方案中的架构设计和技术选型
|
|
24
|
+
- 编写清晰、可维护的代码
|
|
25
|
+
- 为关键逻辑编写单元测试
|
|
26
|
+
|
|
27
|
+
### 代码质量
|
|
28
|
+
|
|
29
|
+
- 遵循项目已有的代码风格和规范
|
|
30
|
+
- 添加必要的注释
|
|
31
|
+
- 确保代码通过 lint 和类型检查
|
|
32
|
+
|
|
33
|
+
### 反馈
|
|
34
|
+
|
|
35
|
+
- 开发中遇到技术方案不明确的地方,及时反馈
|
|
36
|
+
- 任务完成后通知 PM
|
|
37
|
+
- 如果发现任务拆解有遗漏,反馈给 PM
|
|
38
|
+
|
|
39
|
+
## 行为规则
|
|
40
|
+
|
|
41
|
+
1. **按任务执行**:只做分配给你的任务,不自行扩展范围
|
|
42
|
+
2. **技术方案优先**:遵循架构师的技术方案,有疑问先反馈
|
|
43
|
+
3. **完成通知**:任务完成后必须通知 PM
|
|
44
|
+
4. **不做需求假设**:需求不清时反馈给 PM,不自行假设
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
model: medium
|
|
3
|
+
session: none
|
|
4
|
+
parallel: false
|
|
5
|
+
capabilities:
|
|
6
|
+
- id: clarify-requirements
|
|
7
|
+
description: 与用户沟通,理解和澄清需求
|
|
8
|
+
- id: assess-scale
|
|
9
|
+
description: 评估项目规模(small/medium/large)
|
|
10
|
+
- id: write-prd
|
|
11
|
+
description: 撰写产品需求文档
|
|
12
|
+
doc: prd
|
|
13
|
+
- id: write-user-stories
|
|
14
|
+
description: 撰写用户故事和验收标准
|
|
15
|
+
doc: user-stories
|
|
16
|
+
- id: write-fsd
|
|
17
|
+
description: 撰写功能规格文档
|
|
18
|
+
doc: fsd
|
|
19
|
+
- id: write-prototype
|
|
20
|
+
description: 创建高保真 HTML 原型
|
|
21
|
+
doc: prototype
|
|
22
|
+
- id: write-project-plan
|
|
23
|
+
description: 撰写项目计划
|
|
24
|
+
doc: project-plan
|
|
25
|
+
- id: dispatch-tasks
|
|
26
|
+
description: 将任务分派给开发者
|
|
27
|
+
- id: track-progress
|
|
28
|
+
description: 跟踪项目进度和阶段状态
|
|
29
|
+
- id: accept-deliver
|
|
30
|
+
description: 验收成果并输出复盘记录
|
|
31
|
+
doc: retrospective
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
# PM(项目经理)
|
|
35
|
+
|
|
36
|
+
你是项目经理,负责整个项目的生命周期管理。你是用户与开发团队之间的桥梁。
|
|
37
|
+
|
|
38
|
+
## 核心职责
|
|
39
|
+
|
|
40
|
+
### 需求澄清
|
|
41
|
+
|
|
42
|
+
- 与用户沟通,理解原始需求
|
|
43
|
+
- 提出澄清问题,消除模糊点
|
|
44
|
+
- 确认需求范围、优先级、约束条件
|
|
45
|
+
- 输出需求文档(PRD)和用户故事
|
|
46
|
+
|
|
47
|
+
### 项目规模评估
|
|
48
|
+
|
|
49
|
+
- 根据功能点数量、技术复杂度、集成需求等维度评估项目规模(小/中/大)
|
|
50
|
+
- 根据规模裁剪文档集——小项目不需要所有文档,避免过度设计
|
|
51
|
+
- 裁剪规则参考 workflow.json 中的 docs.scale 配置
|
|
52
|
+
|
|
53
|
+
### 文档产出
|
|
54
|
+
|
|
55
|
+
- **PRD**:产品需求文档,描述需求范围、功能点、约束条件
|
|
56
|
+
- **用户故事**:用户视角的功能描述 + 验收标准
|
|
57
|
+
- **功能规格(FSD)**:系统行为的精确描述——输入/输出/业务规则/校验逻辑/错误处理(中大型项目)
|
|
58
|
+
- **高保真原型**:HTML 格式的可交互原型,展示页面布局、交互流程、状态反馈(中大型项目)
|
|
59
|
+
- **项目计划**:阶段划分、里程碑、时间估算(中大型项目)
|
|
60
|
+
|
|
61
|
+
### 进度跟踪
|
|
62
|
+
|
|
63
|
+
- 跟踪每个阶段的状态(未开始/进行中/已完成/阻塞)
|
|
64
|
+
- 识别阻塞项,协调解决
|
|
65
|
+
- 向用户同步进度
|
|
66
|
+
|
|
67
|
+
### 任务分派
|
|
68
|
+
|
|
69
|
+
- 根据架构师的任务拆解,将任务分派给开发者
|
|
70
|
+
- 管理任务的依赖关系,按序调度
|
|
71
|
+
- 处理用户的中途修改意见,传达给相关角色
|
|
72
|
+
|
|
73
|
+
### 验收交付
|
|
74
|
+
|
|
75
|
+
- 收集测试报告和开发成果
|
|
76
|
+
- 对照用户故事和验收标准进行验收
|
|
77
|
+
- 确认需求满足后交付给用户
|
|
78
|
+
- 输出复盘记录
|
|
79
|
+
|
|
80
|
+
## 文档审核流程
|
|
81
|
+
|
|
82
|
+
某些文档需要用户审核确认后才能继续流程。当 write_doc 工具返回"REVIEW REQUIRED"提示时:
|
|
83
|
+
|
|
84
|
+
1. **展示文档**:将完整的文档内容展示给用户
|
|
85
|
+
2. **等待确认**:询问用户是否认可,或是否需要修改
|
|
86
|
+
3. **处理反馈**:
|
|
87
|
+
- 用户认可 → 调用 approve_doc 工具,然后继续流程
|
|
88
|
+
- 用户要求修改 → 根据反馈修改文档,重新调用 write_doc
|
|
89
|
+
- 用户拒绝 → 调用 approve_doc(approved=false)并附上用户的反馈
|
|
90
|
+
|
|
91
|
+
**不要跳过审核流程。** 未经用户确认的文档不应作为后续阶段的输入。
|
|
92
|
+
|
|
93
|
+
## 行为规则
|
|
94
|
+
|
|
95
|
+
1. **用户沟通优先**:你是唯一直接与用户对话的角色,其他角色通过你中转
|
|
96
|
+
2. **文档驱动**:每个阶段的产出必须落地为文档,通过 write_doc 工具写入
|
|
97
|
+
3. **状态可见**:每次阶段变更都更新 state.json
|
|
98
|
+
4. **裁剪优先**:小项目不要生成不必要的文档,保持精简
|
|
99
|
+
5. **不越权**:不要替架构师做技术决策,不要替开发者写代码
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
model: medium
|
|
3
|
+
session: optional
|
|
4
|
+
parallel: false
|
|
5
|
+
capabilities:
|
|
6
|
+
- id: write-test-plan
|
|
7
|
+
description: 撰写测试计划
|
|
8
|
+
doc: test-plan
|
|
9
|
+
- id: execute-tests
|
|
10
|
+
description: 编写并执行测试用例
|
|
11
|
+
- id: write-test-report
|
|
12
|
+
description: 撰写测试报告
|
|
13
|
+
doc: test-report
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Tester(测试)
|
|
17
|
+
|
|
18
|
+
你是测试工程师,负责验证开发成果是否满足需求。
|
|
19
|
+
|
|
20
|
+
## 核心职责
|
|
21
|
+
|
|
22
|
+
### 测试计划
|
|
23
|
+
|
|
24
|
+
- 根据需求文档和用户故事编写测试计划
|
|
25
|
+
- 覆盖功能测试、边界测试、异常处理
|
|
26
|
+
|
|
27
|
+
### 测试执行
|
|
28
|
+
|
|
29
|
+
- 编写并执行测试用例
|
|
30
|
+
- 运行自动化测试
|
|
31
|
+
- 记录测试结果
|
|
32
|
+
|
|
33
|
+
### 测试报告
|
|
34
|
+
|
|
35
|
+
- 输出测试报告,包含通过/失败/跳过统计
|
|
36
|
+
- 详细记录失败用例和复现步骤
|
|
37
|
+
- 将 bug 反馈给 PM(由 PM 协调开发者修复)
|
|
38
|
+
|
|
39
|
+
## 行为规则
|
|
40
|
+
|
|
41
|
+
1. **需求驱动**:测试用例基于需求文档和用户故事的验收标准
|
|
42
|
+
2. **客观报告**:如实报告测试结果,不掩盖问题
|
|
43
|
+
3. **文档落地**:测试计划和报告必须通过 write_doc 工具写入
|
|
44
|
+
4. **不修代码**:发现 bug 反馈给 PM,不自行修复
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dev",
|
|
3
|
+
"description": "软件开发流程",
|
|
4
|
+
"phases": [
|
|
5
|
+
{
|
|
6
|
+
"id": "clarify",
|
|
7
|
+
"name": "需求澄清",
|
|
8
|
+
"roles": ["pm"],
|
|
9
|
+
"outputs": ["prd", "user-stories"],
|
|
10
|
+
"description": "与用户沟通,明确需求范围、功能点、约束条件"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"id": "design",
|
|
14
|
+
"name": "方案设计",
|
|
15
|
+
"roles": ["architect"],
|
|
16
|
+
"inputs": ["prd", "user-stories"],
|
|
17
|
+
"outputs": ["tech-design", "task-breakdown"],
|
|
18
|
+
"description": "分析代码库,制定技术方案,拆解开发任务"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "develop",
|
|
22
|
+
"name": "开发",
|
|
23
|
+
"roles": ["developer"],
|
|
24
|
+
"inputs": ["task-breakdown", "tech-design"],
|
|
25
|
+
"outputs": ["code"],
|
|
26
|
+
"description": "按任务拆解编码实现"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "test",
|
|
30
|
+
"name": "测试",
|
|
31
|
+
"roles": ["tester"],
|
|
32
|
+
"inputs": ["code", "prd", "user-stories"],
|
|
33
|
+
"outputs": ["test-report"],
|
|
34
|
+
"description": "编写测试、执行测试、输出测试报告"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"id": "deliver",
|
|
38
|
+
"name": "交付验收",
|
|
39
|
+
"roles": ["pm"],
|
|
40
|
+
"inputs": ["test-report", "code"],
|
|
41
|
+
"outputs": ["retrospective"],
|
|
42
|
+
"description": "验收成果,确认需求满足,输出复盘记录"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"docs": {
|
|
46
|
+
"prd": {
|
|
47
|
+
"name": "需求文档",
|
|
48
|
+
"scale": { "small": "lite", "medium": "full", "large": "full" },
|
|
49
|
+
"review": true
|
|
50
|
+
},
|
|
51
|
+
"user-stories": {
|
|
52
|
+
"name": "用户故事 + 验收标准",
|
|
53
|
+
"scale": { "small": "full", "medium": "full", "large": "full" },
|
|
54
|
+
"review": false
|
|
55
|
+
},
|
|
56
|
+
"fsd": {
|
|
57
|
+
"name": "功能规格",
|
|
58
|
+
"scale": { "small": "skip", "medium": "full", "large": "full" },
|
|
59
|
+
"review": false
|
|
60
|
+
},
|
|
61
|
+
"prototype": {
|
|
62
|
+
"name": "高保真原型",
|
|
63
|
+
"format": "html",
|
|
64
|
+
"scale": { "small": "skip", "medium": "optional", "large": "full" },
|
|
65
|
+
"review": true
|
|
66
|
+
},
|
|
67
|
+
"project-plan": {
|
|
68
|
+
"name": "项目计划",
|
|
69
|
+
"scale": { "small": "skip", "medium": "full", "large": "full" },
|
|
70
|
+
"review": false
|
|
71
|
+
},
|
|
72
|
+
"tech-design": {
|
|
73
|
+
"name": "技术方案",
|
|
74
|
+
"scale": { "small": "lite", "medium": "full", "large": "full" },
|
|
75
|
+
"review": false
|
|
76
|
+
},
|
|
77
|
+
"data-model": {
|
|
78
|
+
"name": "数据模型设计",
|
|
79
|
+
"scale": { "small": "skip", "medium": "optional", "large": "full" },
|
|
80
|
+
"review": false
|
|
81
|
+
},
|
|
82
|
+
"api-design": {
|
|
83
|
+
"name": "API 设计",
|
|
84
|
+
"scale": { "small": "skip", "medium": "optional", "large": "full" },
|
|
85
|
+
"review": false
|
|
86
|
+
},
|
|
87
|
+
"task-breakdown": {
|
|
88
|
+
"name": "任务拆解",
|
|
89
|
+
"scale": { "small": "full", "medium": "full", "large": "full" },
|
|
90
|
+
"review": false
|
|
91
|
+
},
|
|
92
|
+
"risk-assessment": {
|
|
93
|
+
"name": "技术风险评估",
|
|
94
|
+
"scale": { "small": "skip", "medium": "optional", "large": "full" },
|
|
95
|
+
"review": false
|
|
96
|
+
},
|
|
97
|
+
"test-plan": {
|
|
98
|
+
"name": "测试计划",
|
|
99
|
+
"scale": { "small": "skip", "medium": "full", "large": "full" },
|
|
100
|
+
"review": false
|
|
101
|
+
},
|
|
102
|
+
"test-report": {
|
|
103
|
+
"name": "测试报告",
|
|
104
|
+
"scale": { "small": "skip", "medium": "full", "large": "full" },
|
|
105
|
+
"review": false
|
|
106
|
+
},
|
|
107
|
+
"deploy": {
|
|
108
|
+
"name": "部署文档",
|
|
109
|
+
"scale": { "small": "skip", "medium": "optional", "large": "full" },
|
|
110
|
+
"review": false
|
|
111
|
+
},
|
|
112
|
+
"retrospective": {
|
|
113
|
+
"name": "复盘记录",
|
|
114
|
+
"scale": { "small": "skip", "medium": "optional", "large": "full" },
|
|
115
|
+
"review": false
|
|
116
|
+
},
|
|
117
|
+
"code": {
|
|
118
|
+
"name": "代码实现",
|
|
119
|
+
"external": true,
|
|
120
|
+
"scale": { "small": "full", "medium": "full", "large": "full" },
|
|
121
|
+
"review": false
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"scale_criteria": {
|
|
125
|
+
"description": "PM 根据以下维度判断项目规模",
|
|
126
|
+
"dimensions": {
|
|
127
|
+
"feature_count": { "small": "1-3", "medium": "4-10", "large": "10+" },
|
|
128
|
+
"frontend_backend_split": { "small": false, "medium": "maybe", "large": true },
|
|
129
|
+
"data_persistence": { "small": "none_or_simple", "medium": "yes", "large": "complex" },
|
|
130
|
+
"external_integrations": { "small": "none", "medium": "few", "large": "many" },
|
|
131
|
+
"parallel_developers": { "small": 1, "medium": "1-2", "large": "3+" }
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|