@s_s/harmonia 1.0.0 → 1.1.1
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 +396 -2
- package/build/cli/setup.d.ts +21 -0
- package/build/cli/setup.js +71 -0
- package/build/cli/setup.js.map +1 -0
- package/build/core/dispatch.d.ts +10 -0
- package/build/core/dispatch.js +21 -0
- package/build/core/dispatch.js.map +1 -1
- package/build/core/docs.d.ts +13 -0
- package/build/core/docs.js +32 -0
- package/build/core/docs.js.map +1 -1
- package/build/core/registry.d.ts +1 -1
- package/build/core/registry.js +5 -16
- package/build/core/registry.js.map +1 -1
- package/build/core/schema.d.ts +38 -0
- package/build/core/schema.js +187 -0
- package/build/core/schema.js.map +1 -0
- package/build/core/state.d.ts +11 -1
- package/build/core/state.js +23 -2
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +34 -0
- package/build/core/steps.js +113 -0
- package/build/core/steps.js.map +1 -0
- package/build/core/types.d.ts +81 -4
- package/build/core/workflow.d.ts +26 -6
- package/build/core/workflow.js +88 -11
- package/build/core/workflow.js.map +1 -1
- package/build/hooks/claude-code.d.ts +20 -0
- package/build/hooks/claude-code.js +218 -0
- package/build/hooks/claude-code.js.map +1 -0
- package/build/hooks/content.d.ts +43 -0
- package/build/hooks/content.js +109 -0
- package/build/hooks/content.js.map +1 -0
- package/build/hooks/install.d.ts +40 -0
- package/build/hooks/install.js +63 -0
- package/build/hooks/install.js.map +1 -0
- package/build/hooks/openclaw.d.ts +24 -0
- package/build/hooks/openclaw.js +219 -0
- package/build/hooks/openclaw.js.map +1 -0
- package/build/hooks/opencode.d.ts +29 -0
- package/build/hooks/opencode.js +226 -0
- package/build/hooks/opencode.js.map +1 -0
- package/build/index.d.ts +4 -7
- package/build/index.js +80 -42
- package/build/index.js.map +1 -1
- package/build/setup/inject.d.ts +22 -18
- package/build/setup/inject.js +42 -93
- package/build/setup/inject.js.map +1 -1
- package/build/setup/templates.d.ts +12 -16
- package/build/setup/templates.js +52 -69
- package/build/setup/templates.js.map +1 -1
- package/build/tools/approve-doc.d.ts +1 -1
- package/build/tools/approve-doc.js +4 -4
- package/build/tools/approve-doc.js.map +1 -1
- package/build/tools/dispatch-role.d.ts +2 -2
- package/build/tools/dispatch-role.js +41 -11
- package/build/tools/dispatch-role.js.map +1 -1
- package/build/tools/doc-tools.d.ts +11 -3
- package/build/tools/doc-tools.js +257 -13
- package/build/tools/doc-tools.js.map +1 -1
- package/build/tools/get-project-status.d.ts +4 -2
- package/build/tools/get-project-status.js +165 -50
- package/build/tools/get-project-status.js.map +1 -1
- package/build/tools/get-role-prompt.d.ts +2 -2
- package/build/tools/get-role-prompt.js +4 -4
- package/build/tools/get-role-prompt.js.map +1 -1
- package/build/tools/override-tools.d.ts +1 -1
- package/build/tools/override-tools.js +4 -4
- package/build/tools/override-tools.js.map +1 -1
- package/build/tools/project-init.d.ts +5 -1
- package/build/tools/project-init.js +92 -32
- package/build/tools/project-init.js.map +1 -1
- package/build/tools/report-dispatch.d.ts +6 -3
- package/build/tools/report-dispatch.js +45 -8
- package/build/tools/report-dispatch.js.map +1 -1
- package/build/tools/set-scale.d.ts +6 -0
- package/build/tools/set-scale.js +92 -0
- package/build/tools/set-scale.js.map +1 -0
- package/build/tools/setup-project.d.ts +1 -1
- package/build/tools/setup-project.js +33 -5
- package/build/tools/setup-project.js.map +1 -1
- package/build/tools/update-phase.d.ts +8 -3
- package/build/tools/update-phase.js +85 -20
- package/build/tools/update-phase.js.map +1 -1
- package/package.json +2 -1
- package/workflows/dev/roles/architect.md +1 -1
- package/workflows/dev/roles/pm.md +5 -5
- package/workflows/dev/roles/tester.md +1 -1
- package/workflows/dev/schemas/api-design.json +25 -0
- package/workflows/dev/schemas/data-model.json +20 -0
- package/workflows/dev/schemas/deploy.json +20 -0
- package/workflows/dev/schemas/fsd.json +25 -0
- package/workflows/dev/schemas/prd.completeness-check.json +24 -0
- package/workflows/dev/schemas/prd.draft.json +15 -0
- package/workflows/dev/schemas/prd.final.json +30 -0
- package/workflows/dev/schemas/prd.json +30 -0
- package/workflows/dev/schemas/prd.requirements.json +25 -0
- package/workflows/dev/schemas/project-plan.json +20 -0
- package/workflows/dev/schemas/prototype.json +4 -0
- package/workflows/dev/schemas/retrospective.json +20 -0
- package/workflows/dev/schemas/risk-assessment.json +15 -0
- package/workflows/dev/schemas/task-breakdown.coarse.json +15 -0
- package/workflows/dev/schemas/task-breakdown.dependencies.json +20 -0
- package/workflows/dev/schemas/task-breakdown.detailed.json +10 -0
- package/workflows/dev/schemas/task-breakdown.final.json +10 -0
- package/workflows/dev/schemas/task-breakdown.json +10 -0
- package/workflows/dev/schemas/tech-design.analysis.json +25 -0
- package/workflows/dev/schemas/tech-design.api-contract.json +20 -0
- package/workflows/dev/schemas/tech-design.draft.json +15 -0
- package/workflows/dev/schemas/tech-design.final.json +30 -0
- package/workflows/dev/schemas/tech-design.json +30 -0
- package/workflows/dev/schemas/test-plan.json +20 -0
- package/workflows/dev/schemas/test-report.json +25 -0
- package/workflows/dev/schemas/user-stories.json +10 -0
- package/workflows/dev/workflow.json +85 -5
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MCP Tool:
|
|
2
|
+
* MCP Tool: phase_update
|
|
3
3
|
* Advance or update the status of a project phase.
|
|
4
|
-
*
|
|
4
|
+
*
|
|
5
|
+
* Guards (when completing a phase with force!=true):
|
|
6
|
+
* - Prior phases must all be completed
|
|
7
|
+
* - Required doc outputs must exist
|
|
8
|
+
* - Docs requiring review must be approved
|
|
9
|
+
* - No active (dispatched/running) dispatches in the phase
|
|
5
10
|
*/
|
|
6
11
|
import { z } from 'zod';
|
|
7
12
|
import { readState, updatePhaseStatus } from '../core/state.js';
|
|
8
13
|
import { loadWorkflow } from '../core/workflow.js';
|
|
9
14
|
import { listDocs } from '../core/docs.js';
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
import { readReviews } from '../core/reviews.js';
|
|
16
|
+
import { readDispatches } from '../core/dispatch.js';
|
|
17
|
+
import { getMergedOverrides, resolveDocReview } from '../core/overrides.js';
|
|
18
|
+
export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
19
|
+
server.tool('phase_update', '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
20
|
project_name: z.string().describe('Project name'),
|
|
13
21
|
phase_id: z.string().describe('Phase ID to update (e.g. clarify, design, develop, test, deliver)'),
|
|
14
22
|
status: z.enum(['pending', 'in_progress', 'completed', 'blocked']).describe('New status for the phase'),
|
|
@@ -16,36 +24,93 @@ export function registerUpdatePhase(server, workflowsDir) {
|
|
|
16
24
|
force: z.boolean().optional().describe('Force completion even if outputs are missing (default: false)'),
|
|
17
25
|
}, async ({ project_name, phase_id, status, blocked_reason, force }) => {
|
|
18
26
|
try {
|
|
19
|
-
//
|
|
27
|
+
// ── Completion guards ──
|
|
20
28
|
if (status === 'completed' && !force) {
|
|
21
29
|
const currentState = await readState(project_name);
|
|
22
|
-
const wf = await loadWorkflow(
|
|
30
|
+
const wf = await loadWorkflow(builtinDir, customDir, currentState.workflow);
|
|
23
31
|
const existingDocs = await listDocs(project_name);
|
|
24
32
|
const phaseDef = wf.definition.phases.find((p) => p.id === phase_id);
|
|
25
|
-
|
|
33
|
+
const phaseIndex = wf.definition.phases.findIndex((p) => p.id === phase_id);
|
|
34
|
+
const guardErrors = [];
|
|
35
|
+
// Guard 0: Scale must be set before completing any phase
|
|
36
|
+
if (currentState.scale === null) {
|
|
37
|
+
guardErrors.push('Scale 尚未设定。请先调用 project_set_scale 设定项目规模。');
|
|
38
|
+
}
|
|
39
|
+
// Guard 1: Prior phases must all be completed
|
|
40
|
+
if (phaseIndex > 0) {
|
|
41
|
+
const priorPhases = wf.definition.phases.slice(0, phaseIndex);
|
|
42
|
+
const incompletePriors = priorPhases.filter((pp) => {
|
|
43
|
+
const ps = currentState.phases.find((s) => s.id === pp.id);
|
|
44
|
+
return !ps || ps.status !== 'completed';
|
|
45
|
+
});
|
|
46
|
+
if (incompletePriors.length > 0) {
|
|
47
|
+
guardErrors.push(`前序阶段未完成: ${incompletePriors.map((p) => p.id).join(', ')}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Guard 2 & 3 require scale to be set
|
|
51
|
+
if (currentState.scale !== null && phaseDef) {
|
|
52
|
+
const scale = currentState.scale;
|
|
53
|
+
// Guard 2: Required doc outputs must exist
|
|
26
54
|
const missingDocOutputs = phaseDef.outputs.filter((o) => {
|
|
27
55
|
const docDef = wf.definition.docs[o];
|
|
28
56
|
if (!docDef)
|
|
29
|
-
return false;
|
|
57
|
+
return false;
|
|
30
58
|
if (docDef.external)
|
|
31
|
-
return false;
|
|
32
|
-
const scaleVal = docDef.scale[
|
|
59
|
+
return false;
|
|
60
|
+
const scaleVal = docDef.scale[scale];
|
|
33
61
|
if (scaleVal === 'skip' || scaleVal === 'optional')
|
|
34
|
-
return false;
|
|
62
|
+
return false;
|
|
35
63
|
return !existingDocs.includes(o);
|
|
36
64
|
});
|
|
37
65
|
if (missingDocOutputs.length > 0) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
66
|
+
guardErrors.push(`缺少必需文档产出: ${missingDocOutputs.join(', ')}`);
|
|
67
|
+
}
|
|
68
|
+
// Guard 3: Docs requiring review must be approved
|
|
69
|
+
const overrides = await getMergedOverrides(project_name);
|
|
70
|
+
const reviews = await readReviews(project_name);
|
|
71
|
+
const unapprovedDocs = phaseDef.outputs.filter((o) => {
|
|
72
|
+
const docDef = wf.definition.docs[o];
|
|
73
|
+
if (!docDef)
|
|
74
|
+
return false;
|
|
75
|
+
if (docDef.external)
|
|
76
|
+
return false;
|
|
77
|
+
const scaleVal = docDef.scale[scale];
|
|
78
|
+
if (scaleVal === 'skip' || scaleVal === 'optional')
|
|
79
|
+
return false;
|
|
80
|
+
const needsReview = resolveDocReview(o, docDef, overrides);
|
|
81
|
+
if (!needsReview)
|
|
82
|
+
return false;
|
|
83
|
+
const reviewState = reviews[o];
|
|
84
|
+
return !reviewState || reviewState.status !== 'approved';
|
|
85
|
+
});
|
|
86
|
+
if (unapprovedDocs.length > 0) {
|
|
87
|
+
guardErrors.push(`文档待审核或未通过: ${unapprovedDocs.join(', ')}`);
|
|
47
88
|
}
|
|
48
89
|
}
|
|
90
|
+
// Guard 4: No active dispatches
|
|
91
|
+
const dispatches = await readDispatches(project_name);
|
|
92
|
+
const activeDispatches = dispatches.filter((d) => d.status === 'dispatched' || d.status === 'running');
|
|
93
|
+
if (activeDispatches.length > 0) {
|
|
94
|
+
const activeList = activeDispatches.map((d) => `${d.id} (${d.role}, ${d.status})`).join(', ');
|
|
95
|
+
guardErrors.push(`存在进行中的 dispatch: ${activeList}`);
|
|
96
|
+
}
|
|
97
|
+
if (guardErrors.length > 0) {
|
|
98
|
+
return {
|
|
99
|
+
content: [
|
|
100
|
+
{
|
|
101
|
+
type: 'text',
|
|
102
|
+
text: [
|
|
103
|
+
`无法完成阶段 "${phase_id}":`,
|
|
104
|
+
'',
|
|
105
|
+
...guardErrors.map((e) => `- ${e}`),
|
|
106
|
+
'',
|
|
107
|
+
'请先解决以上问题,或使用 force=true 强制完成。',
|
|
108
|
+
].join('\n'),
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
isError: true,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
49
114
|
}
|
|
50
115
|
const state = await updatePhaseStatus(project_name, phase_id, status, blocked_reason);
|
|
51
116
|
const phasesSummary = state.phases
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-phase.js","sourceRoot":"","sources":["../../src/tools/update-phase.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"update-phase.js","sourceRoot":"","sources":["../../src/tools/update-phase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@s_s/harmonia",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Multi-agent orchestration MCP server with pluggable workflows",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./build/index.js",
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"license": "MIT",
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
37
|
+
"@s_s/agent-kit": "^1.2.1",
|
|
37
38
|
"yaml": "^2.8.2",
|
|
38
39
|
"zod": "^4.3.6"
|
|
39
40
|
},
|
|
@@ -79,21 +79,21 @@ capabilities:
|
|
|
79
79
|
|
|
80
80
|
## 文档审核流程
|
|
81
81
|
|
|
82
|
-
某些文档需要用户审核确认后才能继续流程。当
|
|
82
|
+
某些文档需要用户审核确认后才能继续流程。当 doc_write 工具返回"REVIEW REQUIRED"提示时:
|
|
83
83
|
|
|
84
84
|
1. **展示文档**:将完整的文档内容展示给用户
|
|
85
85
|
2. **等待确认**:询问用户是否认可,或是否需要修改
|
|
86
86
|
3. **处理反馈**:
|
|
87
|
-
- 用户认可 → 调用
|
|
88
|
-
- 用户要求修改 → 根据反馈修改文档,重新调用
|
|
89
|
-
- 用户拒绝 → 调用
|
|
87
|
+
- 用户认可 → 调用 doc_approve 工具,然后继续流程
|
|
88
|
+
- 用户要求修改 → 根据反馈修改文档,重新调用 doc_write
|
|
89
|
+
- 用户拒绝 → 调用 doc_approve(approved=false)并附上用户的反馈
|
|
90
90
|
|
|
91
91
|
**不要跳过审核流程。** 未经用户确认的文档不应作为后续阶段的输入。
|
|
92
92
|
|
|
93
93
|
## 行为规则
|
|
94
94
|
|
|
95
95
|
1. **用户沟通优先**:你是唯一直接与用户对话的角色,其他角色通过你中转
|
|
96
|
-
2. **文档驱动**:每个阶段的产出必须落地为文档,通过
|
|
96
|
+
2. **文档驱动**:每个阶段的产出必须落地为文档,通过 doc_write 工具写入
|
|
97
97
|
3. **状态可见**:每次阶段变更都更新 state.json
|
|
98
98
|
4. **裁剪优先**:小项目不要生成不必要的文档,保持精简
|
|
99
99
|
5. **不越权**:不要替架构师做技术决策,不要替开发者写代码
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sections": [
|
|
3
|
+
{
|
|
4
|
+
"heading": "## 端点列表",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"aliases": ["## API Endpoints", "## 接口列表", "## Endpoints"]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"heading": "## 请求/响应格式",
|
|
10
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
11
|
+
"aliases": ["## Request/Response", "## 数据格式", "## 请求响应"]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"heading": "## 错误码",
|
|
15
|
+
"required": { "small": false, "medium": false, "large": true },
|
|
16
|
+
"aliases": ["## Error Codes", "## 错误处理", "## 异常码"]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"heading": "## 认证与授权",
|
|
20
|
+
"required": { "small": false, "medium": false, "large": true },
|
|
21
|
+
"aliases": ["## Authentication", "## Auth", "## 权限"]
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"minLength": 100
|
|
25
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sections": [
|
|
3
|
+
{
|
|
4
|
+
"heading": "## 数据模型",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"aliases": ["## Data Model", "## 数据设计", "## 数据结构"]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"heading": "## 实体关系",
|
|
10
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
11
|
+
"aliases": ["## Entity Relationships", "## ER 图", "## 关系设计"]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"heading": "## 字段定义",
|
|
15
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
16
|
+
"aliases": ["## Field Definitions", "## 字段说明", "## 表结构"]
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"minLength": 100
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sections": [
|
|
3
|
+
{
|
|
4
|
+
"heading": "## 部署环境",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"aliases": ["## Deployment Environment", "## 环境要求", "## 运行环境"]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"heading": "## 部署步骤",
|
|
10
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
11
|
+
"aliases": ["## Deployment Steps", "## 部署流程", "## 安装步骤"]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"heading": "## 配置说明",
|
|
15
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
16
|
+
"aliases": ["## Configuration", "## 环境配置", "## 配置项"]
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"minLength": 100
|
|
20
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sections": [
|
|
3
|
+
{
|
|
4
|
+
"heading": "## 功能概述",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"aliases": ["## Feature Overview", "## 功能说明"]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"heading": "## 功能规格",
|
|
10
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
11
|
+
"aliases": ["## Functional Specifications", "## 详细规格", "## 功能详情"]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"heading": "## 交互流程",
|
|
15
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
16
|
+
"aliases": ["## Interaction Flow", "## 用户流程", "## 交互设计"]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"heading": "## 边界条件",
|
|
20
|
+
"required": { "small": false, "medium": false, "large": true },
|
|
21
|
+
"aliases": ["## Edge Cases", "## 边界情况", "## 异常处理"]
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"minLength": 200
|
|
25
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jsonFields": [
|
|
3
|
+
{
|
|
4
|
+
"field": "coverage",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"type": "object"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"field": "missing",
|
|
10
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
11
|
+
"type": "array"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"field": "conflicts",
|
|
15
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
16
|
+
"type": "array"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"field": "verdict",
|
|
20
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
21
|
+
"type": "string"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sections": [
|
|
3
|
+
{
|
|
4
|
+
"heading": "## 项目概述",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"aliases": ["## Project Overview", "## 概述"]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"heading": "## 功能需求",
|
|
10
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
11
|
+
"aliases": ["## Functional Requirements", "## 需求列表", "## 功能列表"]
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"minLength": 150
|
|
15
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sections": [
|
|
3
|
+
{
|
|
4
|
+
"heading": "## 项目概述",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"aliases": ["## Project Overview", "## 概述"]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"heading": "## 功能需求",
|
|
10
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
11
|
+
"aliases": ["## Functional Requirements", "## 需求列表", "## 功能列表"]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"heading": "## 非功能需求",
|
|
15
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
16
|
+
"aliases": ["## Non-Functional Requirements", "## 非功能性需求"]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"heading": "## 验收标准",
|
|
20
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
21
|
+
"aliases": ["## Acceptance Criteria", "## 验收条件"]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"heading": "## 约束与假设",
|
|
25
|
+
"required": { "small": false, "medium": false, "large": true },
|
|
26
|
+
"aliases": ["## Constraints and Assumptions", "## 约束条件", "## 前提假设"]
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"minLength": 200
|
|
30
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sections": [
|
|
3
|
+
{
|
|
4
|
+
"heading": "## 项目概述",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"aliases": ["## Project Overview", "## 概述"]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"heading": "## 功能需求",
|
|
10
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
11
|
+
"aliases": ["## Functional Requirements", "## 需求列表", "## 功能列表"]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"heading": "## 非功能需求",
|
|
15
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
16
|
+
"aliases": ["## Non-Functional Requirements", "## 非功能性需求"]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"heading": "## 验收标准",
|
|
20
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
21
|
+
"aliases": ["## Acceptance Criteria", "## 验收条件"]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"heading": "## 约束与假设",
|
|
25
|
+
"required": { "small": false, "medium": false, "large": true },
|
|
26
|
+
"aliases": ["## Constraints and Assumptions", "## 约束条件", "## 前提假设"]
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"minLength": 200
|
|
30
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jsonFields": [
|
|
3
|
+
{
|
|
4
|
+
"field": "features",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"type": "array",
|
|
7
|
+
"minItems": 1
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"field": "constraints",
|
|
11
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
12
|
+
"type": "array"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"field": "priorities",
|
|
16
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
17
|
+
"type": "object"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"field": "scope",
|
|
21
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
22
|
+
"type": "string"
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sections": [
|
|
3
|
+
{
|
|
4
|
+
"heading": "## 项目计划",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"aliases": ["## Project Plan", "## 计划概述"]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"heading": "## 里程碑",
|
|
10
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
11
|
+
"aliases": ["## Milestones", "## 关键节点"]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"heading": "## 时间安排",
|
|
15
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
16
|
+
"aliases": ["## Timeline", "## 排期", "## 时间线"]
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"minLength": 100
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sections": [
|
|
3
|
+
{
|
|
4
|
+
"heading": "## 项目总结",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"aliases": ["## Summary", "## 总结", "## 项目概要"]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"heading": "## 经验教训",
|
|
10
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
11
|
+
"aliases": ["## Lessons Learned", "## 收获与反思"]
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"heading": "## 改进建议",
|
|
15
|
+
"required": { "small": false, "medium": false, "large": true },
|
|
16
|
+
"aliases": ["## Improvements", "## 后续改进", "## 待改进"]
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"minLength": 50
|
|
20
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"sections": [
|
|
3
|
+
{
|
|
4
|
+
"heading": "## 风险项",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"aliases": ["## Risks", "## 风险列表", "## 风险清单"]
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"heading": "## 缓解措施",
|
|
10
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
11
|
+
"aliases": ["## Mitigation", "## 应对策略", "## 缓解方案"]
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"minLength": 100
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jsonFields": [
|
|
3
|
+
{
|
|
4
|
+
"field": "tasks",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"type": "array",
|
|
7
|
+
"minItems": 1
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"field": "estimatedTotal",
|
|
11
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
12
|
+
"type": "string"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jsonFields": [
|
|
3
|
+
{
|
|
4
|
+
"field": "dependencies",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"type": "array"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"field": "executionOrder",
|
|
10
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
11
|
+
"type": "array",
|
|
12
|
+
"minItems": 1
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"field": "parallelGroups",
|
|
16
|
+
"required": { "small": false, "medium": false, "large": true },
|
|
17
|
+
"type": "array"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jsonFields": [
|
|
3
|
+
{
|
|
4
|
+
"field": "currentArchitecture",
|
|
5
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
6
|
+
"type": "object"
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
"field": "constraints",
|
|
10
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
11
|
+
"type": "array"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"field": "proposals",
|
|
15
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
16
|
+
"type": "array",
|
|
17
|
+
"minItems": 1
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"field": "recommendation",
|
|
21
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
22
|
+
"type": "string"
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"jsonFields": [
|
|
3
|
+
{
|
|
4
|
+
"field": "endpoints",
|
|
5
|
+
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
+
"type": "array",
|
|
7
|
+
"minItems": 1
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
"field": "dataModels",
|
|
11
|
+
"required": { "small": false, "medium": true, "large": true },
|
|
12
|
+
"type": "array"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"field": "errorCodes",
|
|
16
|
+
"required": { "small": false, "medium": false, "large": true },
|
|
17
|
+
"type": "array"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|