@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.
Files changed (114) hide show
  1. package/README.md +396 -2
  2. package/build/cli/setup.d.ts +21 -0
  3. package/build/cli/setup.js +71 -0
  4. package/build/cli/setup.js.map +1 -0
  5. package/build/core/dispatch.d.ts +10 -0
  6. package/build/core/dispatch.js +21 -0
  7. package/build/core/dispatch.js.map +1 -1
  8. package/build/core/docs.d.ts +13 -0
  9. package/build/core/docs.js +32 -0
  10. package/build/core/docs.js.map +1 -1
  11. package/build/core/registry.d.ts +1 -1
  12. package/build/core/registry.js +5 -16
  13. package/build/core/registry.js.map +1 -1
  14. package/build/core/schema.d.ts +38 -0
  15. package/build/core/schema.js +187 -0
  16. package/build/core/schema.js.map +1 -0
  17. package/build/core/state.d.ts +11 -1
  18. package/build/core/state.js +23 -2
  19. package/build/core/state.js.map +1 -1
  20. package/build/core/steps.d.ts +34 -0
  21. package/build/core/steps.js +113 -0
  22. package/build/core/steps.js.map +1 -0
  23. package/build/core/types.d.ts +81 -4
  24. package/build/core/workflow.d.ts +26 -6
  25. package/build/core/workflow.js +88 -11
  26. package/build/core/workflow.js.map +1 -1
  27. package/build/hooks/claude-code.d.ts +20 -0
  28. package/build/hooks/claude-code.js +218 -0
  29. package/build/hooks/claude-code.js.map +1 -0
  30. package/build/hooks/content.d.ts +43 -0
  31. package/build/hooks/content.js +109 -0
  32. package/build/hooks/content.js.map +1 -0
  33. package/build/hooks/install.d.ts +40 -0
  34. package/build/hooks/install.js +63 -0
  35. package/build/hooks/install.js.map +1 -0
  36. package/build/hooks/openclaw.d.ts +24 -0
  37. package/build/hooks/openclaw.js +219 -0
  38. package/build/hooks/openclaw.js.map +1 -0
  39. package/build/hooks/opencode.d.ts +29 -0
  40. package/build/hooks/opencode.js +226 -0
  41. package/build/hooks/opencode.js.map +1 -0
  42. package/build/index.d.ts +4 -7
  43. package/build/index.js +80 -42
  44. package/build/index.js.map +1 -1
  45. package/build/setup/inject.d.ts +22 -18
  46. package/build/setup/inject.js +42 -93
  47. package/build/setup/inject.js.map +1 -1
  48. package/build/setup/templates.d.ts +12 -16
  49. package/build/setup/templates.js +52 -69
  50. package/build/setup/templates.js.map +1 -1
  51. package/build/tools/approve-doc.d.ts +1 -1
  52. package/build/tools/approve-doc.js +4 -4
  53. package/build/tools/approve-doc.js.map +1 -1
  54. package/build/tools/dispatch-role.d.ts +2 -2
  55. package/build/tools/dispatch-role.js +41 -11
  56. package/build/tools/dispatch-role.js.map +1 -1
  57. package/build/tools/doc-tools.d.ts +11 -3
  58. package/build/tools/doc-tools.js +257 -13
  59. package/build/tools/doc-tools.js.map +1 -1
  60. package/build/tools/get-project-status.d.ts +4 -2
  61. package/build/tools/get-project-status.js +165 -50
  62. package/build/tools/get-project-status.js.map +1 -1
  63. package/build/tools/get-role-prompt.d.ts +2 -2
  64. package/build/tools/get-role-prompt.js +4 -4
  65. package/build/tools/get-role-prompt.js.map +1 -1
  66. package/build/tools/override-tools.d.ts +1 -1
  67. package/build/tools/override-tools.js +4 -4
  68. package/build/tools/override-tools.js.map +1 -1
  69. package/build/tools/project-init.d.ts +5 -1
  70. package/build/tools/project-init.js +92 -32
  71. package/build/tools/project-init.js.map +1 -1
  72. package/build/tools/report-dispatch.d.ts +6 -3
  73. package/build/tools/report-dispatch.js +45 -8
  74. package/build/tools/report-dispatch.js.map +1 -1
  75. package/build/tools/set-scale.d.ts +6 -0
  76. package/build/tools/set-scale.js +92 -0
  77. package/build/tools/set-scale.js.map +1 -0
  78. package/build/tools/setup-project.d.ts +1 -1
  79. package/build/tools/setup-project.js +33 -5
  80. package/build/tools/setup-project.js.map +1 -1
  81. package/build/tools/update-phase.d.ts +8 -3
  82. package/build/tools/update-phase.js +85 -20
  83. package/build/tools/update-phase.js.map +1 -1
  84. package/package.json +2 -1
  85. package/workflows/dev/roles/architect.md +1 -1
  86. package/workflows/dev/roles/pm.md +5 -5
  87. package/workflows/dev/roles/tester.md +1 -1
  88. package/workflows/dev/schemas/api-design.json +25 -0
  89. package/workflows/dev/schemas/data-model.json +20 -0
  90. package/workflows/dev/schemas/deploy.json +20 -0
  91. package/workflows/dev/schemas/fsd.json +25 -0
  92. package/workflows/dev/schemas/prd.completeness-check.json +24 -0
  93. package/workflows/dev/schemas/prd.draft.json +15 -0
  94. package/workflows/dev/schemas/prd.final.json +30 -0
  95. package/workflows/dev/schemas/prd.json +30 -0
  96. package/workflows/dev/schemas/prd.requirements.json +25 -0
  97. package/workflows/dev/schemas/project-plan.json +20 -0
  98. package/workflows/dev/schemas/prototype.json +4 -0
  99. package/workflows/dev/schemas/retrospective.json +20 -0
  100. package/workflows/dev/schemas/risk-assessment.json +15 -0
  101. package/workflows/dev/schemas/task-breakdown.coarse.json +15 -0
  102. package/workflows/dev/schemas/task-breakdown.dependencies.json +20 -0
  103. package/workflows/dev/schemas/task-breakdown.detailed.json +10 -0
  104. package/workflows/dev/schemas/task-breakdown.final.json +10 -0
  105. package/workflows/dev/schemas/task-breakdown.json +10 -0
  106. package/workflows/dev/schemas/tech-design.analysis.json +25 -0
  107. package/workflows/dev/schemas/tech-design.api-contract.json +20 -0
  108. package/workflows/dev/schemas/tech-design.draft.json +15 -0
  109. package/workflows/dev/schemas/tech-design.final.json +30 -0
  110. package/workflows/dev/schemas/tech-design.json +30 -0
  111. package/workflows/dev/schemas/test-plan.json +20 -0
  112. package/workflows/dev/schemas/test-report.json +25 -0
  113. package/workflows/dev/schemas/user-stories.json +10 -0
  114. package/workflows/dev/workflow.json +85 -5
@@ -1,14 +1,22 @@
1
1
  /**
2
- * MCP Tool: update_phase
2
+ * MCP Tool: phase_update
3
3
  * Advance or update the status of a project phase.
4
- * When completing a phase, checks that all doc-type outputs exist (output guard).
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
- 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.', {
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
- // Output guard: when completing a phase, check doc outputs exist
27
+ // ── Completion guards ──
20
28
  if (status === 'completed' && !force) {
21
29
  const currentState = await readState(project_name);
22
- const wf = await loadWorkflow(workflowsDir, currentState.workflow);
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
- if (phaseDef) {
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; // unknown output, skip
57
+ return false;
30
58
  if (docDef.external)
31
- return false; // external outputs not managed by write_doc
32
- const scaleVal = docDef.scale[currentState.scale];
59
+ return false;
60
+ const scaleVal = docDef.scale[scale];
33
61
  if (scaleVal === 'skip' || scaleVal === 'optional')
34
- return false; // not required at this scale
62
+ return false;
35
63
  return !existingDocs.includes(o);
36
64
  });
37
65
  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
- };
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":"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"}
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.0.0",
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
  },
@@ -62,5 +62,5 @@ capabilities:
62
62
 
63
63
  1. **代码为据**:技术决策基于实际代码分析,不凭空假设
64
64
  2. **任务可执行**:拆解出的每个任务要足够具体,开发者拿到就能开始
65
- 3. **文档落地**:技术方案、任务拆解必须通过 write_doc 工具写入
65
+ 3. **文档落地**:技术方案、任务拆解必须通过 doc_write 工具写入
66
66
  4. **不做需求决策**:技术不确定时反馈给 PM,由 PM 与用户确认
@@ -79,21 +79,21 @@ capabilities:
79
79
 
80
80
  ## 文档审核流程
81
81
 
82
- 某些文档需要用户审核确认后才能继续流程。当 write_doc 工具返回"REVIEW REQUIRED"提示时:
82
+ 某些文档需要用户审核确认后才能继续流程。当 doc_write 工具返回"REVIEW REQUIRED"提示时:
83
83
 
84
84
  1. **展示文档**:将完整的文档内容展示给用户
85
85
  2. **等待确认**:询问用户是否认可,或是否需要修改
86
86
  3. **处理反馈**:
87
- - 用户认可 → 调用 approve_doc 工具,然后继续流程
88
- - 用户要求修改 → 根据反馈修改文档,重新调用 write_doc
89
- - 用户拒绝 → 调用 approve_doc(approved=false)并附上用户的反馈
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. **文档驱动**:每个阶段的产出必须落地为文档,通过 write_doc 工具写入
96
+ 2. **文档驱动**:每个阶段的产出必须落地为文档,通过 doc_write 工具写入
97
97
  3. **状态可见**:每次阶段变更都更新 state.json
98
98
  4. **裁剪优先**:小项目不要生成不必要的文档,保持精简
99
99
  5. **不越权**:不要替架构师做技术决策,不要替开发者写代码
@@ -40,5 +40,5 @@ capabilities:
40
40
 
41
41
  1. **需求驱动**:测试用例基于需求文档和用户故事的验收标准
42
42
  2. **客观报告**:如实报告测试结果,不掩盖问题
43
- 3. **文档落地**:测试计划和报告必须通过 write_doc 工具写入
43
+ 3. **文档落地**:测试计划和报告必须通过 doc_write 工具写入
44
44
  4. **不修代码**:发现 bug 反馈给 PM,不自行修复
@@ -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,4 @@
1
+ {
2
+ "htmlTags": ["html", "body"],
3
+ "minLength": 200
4
+ }
@@ -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,10 @@
1
+ {
2
+ "sections": [
3
+ {
4
+ "heading": "## 任务列表",
5
+ "required": { "small": true, "medium": true, "large": true },
6
+ "aliases": ["## Task List", "## 任务清单", "## Tasks"]
7
+ }
8
+ ],
9
+ "minLength": 80
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "sections": [
3
+ {
4
+ "heading": "## 任务列表",
5
+ "required": { "small": true, "medium": true, "large": true },
6
+ "aliases": ["## Task List", "## 任务清单", "## Tasks"]
7
+ }
8
+ ],
9
+ "minLength": 100
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "sections": [
3
+ {
4
+ "heading": "## 任务列表",
5
+ "required": { "small": true, "medium": true, "large": true },
6
+ "aliases": ["## Task List", "## 任务清单", "## Tasks"]
7
+ }
8
+ ],
9
+ "minLength": 100
10
+ }
@@ -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
+ }