@s_s/harmonia 1.0.0 → 1.1.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.
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 +72 -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 +13 -17
  46. package/build/setup/inject.js +34 -92
  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,20 +1,32 @@
1
1
  /**
2
2
  * MCP Tool: project_init
3
3
  * Initialize a new Harmonia project with global registry and data directory.
4
+ *
5
+ * Supports an optional `workflow` parameter. When multiple workflows are
6
+ * available and none is specified, returns an error with the available list
7
+ * so the agent can re-call with a specific choice.
4
8
  */
5
9
  import { z } from 'zod';
6
- import { loadWorkflow } from '../core/workflow.js';
10
+ import { loadWorkflow, listWorkflows } from '../core/workflow.js';
7
11
  import { initProjectState, readState } from '../core/state.js';
8
12
  import { registerProject, getProject } from '../core/registry.js';
9
- export function registerProjectInit(server, workflowsDir) {
10
- server.tool('project_init', "Initialize a new Harmonia project. Registers the project in the global data directory, creates data directories for documents/state, and creates the project source directory if it doesn't exist.", {
11
- project_name: z.string().describe('Unique project name (used as directory name in the data directory)'),
13
+ export function registerProjectInit(server, builtinDir, customDir) {
14
+ server.tool('project_init', "Initialize a new Harmonia project. Registers the project in the global data directory, creates data directories for documents/state, and creates the project source directory if it doesn't exist. Scale is NOT set here — use project_set_scale after PRD approval.", {
15
+ project_name: z
16
+ .string()
17
+ .regex(/^[a-z0-9][a-z0-9-]*[a-z0-9]$/, 'project_name 只允许小写字母、数字和短横线,且不能以短横线开头或结尾')
18
+ .min(2, 'project_name 至少 2 个字符')
19
+ .max(64, 'project_name 最多 64 个字符')
20
+ .describe('唯一的项目名称(只允许小写字母、数字和短横线,如 my-app)'),
12
21
  project_dir: z
13
22
  .string()
14
- .describe("Absolute path to the project source directory (will be created if it doesn't exist)"),
15
- workflow: z.string().default('dev').describe('Workflow name to use (default: dev)'),
16
- scale: z.enum(['small', 'medium', 'large']).default('small').describe('Project scale (small/medium/large)'),
17
- }, async ({ project_name, project_dir, workflow: workflowName, scale }) => {
23
+ .refine((s) => s.startsWith('/'), { message: 'project_dir 必须是绝对路径(以 / 开头)' })
24
+ .describe('项目源代码目录的绝对路径(如不存在会自动创建)'),
25
+ workflow: z
26
+ .string()
27
+ .optional()
28
+ .describe('工作流名称(如 dev)。只有一个可用工作流时自动选中;多个时必须指定。'),
29
+ }, async ({ project_name, project_dir, workflow }) => {
18
30
  // Check if already initialized
19
31
  const existing = await getProject(project_name);
20
32
  if (existing) {
@@ -28,40 +40,88 @@ export function registerProjectInit(server, workflowsDir) {
28
40
  ],
29
41
  };
30
42
  }
43
+ // Resolve workflow name
44
+ const available = await listWorkflows(builtinDir, customDir);
45
+ if (available.length === 0) {
46
+ return {
47
+ content: [
48
+ {
49
+ type: 'text',
50
+ text: '没有可用的工作流。请检查 Harmonia 安装是否完整,或在自定义工作流目录中创建工作流。',
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ let workflowName;
57
+ if (workflow) {
58
+ // Explicit workflow specified — validate it exists
59
+ if (!available.includes(workflow)) {
60
+ return {
61
+ content: [
62
+ {
63
+ type: 'text',
64
+ text: `工作流 "${workflow}" 不存在。可用的工作流: ${available.join(', ')}`,
65
+ },
66
+ ],
67
+ isError: true,
68
+ };
69
+ }
70
+ workflowName = workflow;
71
+ }
72
+ else if (available.length === 1) {
73
+ // Only one workflow — auto-select
74
+ workflowName = available[0];
75
+ }
76
+ else {
77
+ // Multiple workflows — require explicit choice
78
+ // Load descriptions for each workflow to help the agent decide
79
+ const descriptions = [];
80
+ for (const name of available) {
81
+ try {
82
+ const wf = await loadWorkflow(builtinDir, customDir, name);
83
+ descriptions.push(`- ${name}: ${wf.definition.description}`);
84
+ }
85
+ catch {
86
+ descriptions.push(`- ${name}: (无法加载描述)`);
87
+ }
88
+ }
89
+ return {
90
+ content: [
91
+ {
92
+ type: 'text',
93
+ text: [
94
+ `有 ${available.length} 个可用工作流,请指定 workflow 参数:`,
95
+ '',
96
+ ...descriptions,
97
+ '',
98
+ `示例: project_init(project_name="${project_name}", project_dir="${project_dir}", workflow="dev")`,
99
+ ].join('\n'),
100
+ },
101
+ ],
102
+ isError: true,
103
+ };
104
+ }
31
105
  // Load workflow definition
32
- const wf = await loadWorkflow(workflowsDir, workflowName);
106
+ const wf = await loadWorkflow(builtinDir, customDir, workflowName);
33
107
  // Register project (creates global data dirs + project source dir)
34
108
  await registerProject(project_name, project_dir, workflowName);
35
- // Initialize project state
36
- const state = await initProjectState(project_name, project_dir, wf, scale);
37
- // Build doc list based on scale
38
- const requiredDocs = Object.entries(wf.definition.docs)
39
- .filter(([, doc]) => {
40
- const s = doc.scale[scale];
41
- return s === 'full' || s === 'lite';
42
- })
43
- .map(([id, doc]) => `- ${doc.name} (${id})`)
44
- .join('\n');
45
- const optionalDocs = Object.entries(wf.definition.docs)
46
- .filter(([, doc]) => doc.scale[scale] === 'optional')
47
- .map(([id, doc]) => `- ${doc.name} (${id})`)
48
- .join('\n');
109
+ // Initialize project state (scale = null)
110
+ const state = await initProjectState(project_name, project_dir, wf);
49
111
  return {
50
112
  content: [
51
113
  {
52
114
  type: 'text',
53
115
  text: [
54
- `Project "${project_name}" initialized successfully.`,
116
+ `项目 "${project_name}" 初始化成功。`,
55
117
  ``,
56
- `Source directory: ${project_dir}`,
57
- `Workflow: ${wf.definition.name} (${wf.definition.description})`,
58
- `Scale: ${scale}`,
59
- `Current phase: ${state.currentPhase}`,
60
- `Available roles: ${Object.keys(wf.roles).join(', ')}`,
118
+ `源代码目录: ${project_dir}`,
119
+ `工作流: ${wf.definition.name} (${wf.definition.description})`,
120
+ `规模: (未设定)`,
121
+ `当前阶段: ${state.currentPhase}`,
122
+ `可用角色: ${Object.keys(wf.roles).join(', ')}`,
61
123
  ``,
62
- `Required documents:`,
63
- requiredDocs || '(none)',
64
- optionalDocs ? `\nOptional documents:\n${optionalDocs}` : '',
124
+ `下一步: 与用户沟通需求,编写 PRD,PRD 审批通过后调用 project_set_scale 设定项目规模。`,
65
125
  ].join('\n'),
66
126
  },
67
127
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"project-init.js","sourceRoot":"","sources":["../../src/tools/project-init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-init.js","sourceRoot":"","sources":["../../src/tools/project-init.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,14 @@
1
1
  /**
2
- * MCP Tool: report_dispatch
2
+ * MCP Tool: dispatch_report
3
3
  *
4
4
  * PM calls this tool to report dispatch status changes:
5
5
  * 1. After launching an agent: provide agent_session_id → creates/reuses session, marks dispatch running
6
6
  * 2. After agent finishes: provide status=completed/failed → updates dispatch, session goes idle/closed
7
7
  *
8
- * This is the single tool PM needs for all dispatch lifecycle management.
8
+ * Guards:
9
+ * - State machine: terminal states (completed/failed/cancelled) are irreversible
10
+ * - Valid transitions: dispatched→running/cancelled, running→completed/failed/cancelled
11
+ * - Completion check: warns if expectedOutputs docs are missing
9
12
  */
10
13
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
11
- export declare function registerReportDispatch(server: McpServer): void;
14
+ export declare function registerReportDispatch(server: McpServer, builtinDir: string, customDir: string): void;
@@ -1,18 +1,24 @@
1
1
  /**
2
- * MCP Tool: report_dispatch
2
+ * MCP Tool: dispatch_report
3
3
  *
4
4
  * PM calls this tool to report dispatch status changes:
5
5
  * 1. After launching an agent: provide agent_session_id → creates/reuses session, marks dispatch running
6
6
  * 2. After agent finishes: provide status=completed/failed → updates dispatch, session goes idle/closed
7
7
  *
8
- * This is the single tool PM needs for all dispatch lifecycle management.
8
+ * Guards:
9
+ * - State machine: terminal states (completed/failed/cancelled) are irreversible
10
+ * - Valid transitions: dispatched→running/cancelled, running→completed/failed/cancelled
11
+ * - Completion check: warns if expectedOutputs docs are missing
9
12
  */
10
13
  import { z } from 'zod';
11
- import { getDispatch, updateDispatch, createSession, updateSession, findSessionByAgentId, readSessions, } from '../core/dispatch.js';
12
- export function registerReportDispatch(server) {
13
- server.tool('report_dispatch', 'Report dispatch status after launching or completing a team member agent. Call with agent_session_id after launching to register the session. Call with status="completed" or "failed" when the agent finishes.', {
14
+ import { getDispatch, updateDispatch, createSession, updateSession, findSessionByAgentId, readSessions, isValidTransition, isTerminalStatus, } from '../core/dispatch.js';
15
+ import { listDocs } from '../core/docs.js';
16
+ import { readState } from '../core/state.js';
17
+ import { loadWorkflow } from '../core/workflow.js';
18
+ export function registerReportDispatch(server, builtinDir, customDir) {
19
+ server.tool('dispatch_report', 'Report dispatch status after launching or completing a team member agent. Call with agent_session_id after launching to register the session. Call with status="completed" or "failed" when the agent finishes.', {
14
20
  project_name: z.string().describe('Project name'),
15
- dispatch_id: z.string().describe('Dispatch ID returned by dispatch_role'),
21
+ dispatch_id: z.string().describe('Dispatch ID returned by role_dispatch'),
16
22
  status: z
17
23
  .enum(['running', 'completed', 'failed', 'cancelled'])
18
24
  .optional()
@@ -44,6 +50,21 @@ export function registerReportDispatch(server) {
44
50
  }
45
51
  const effectiveStatus = status ?? 'running';
46
52
  const results = [];
53
+ // Guard: state machine — reject invalid transitions
54
+ if (!isValidTransition(dispatch.status, effectiveStatus)) {
55
+ const reason = isTerminalStatus(dispatch.status)
56
+ ? `dispatch "${dispatch_id}" 已处于终态 "${dispatch.status}",无法转换到 "${effectiveStatus}"`
57
+ : `dispatch "${dispatch_id}" 当前状态 "${dispatch.status}" 不允许转换到 "${effectiveStatus}"`;
58
+ return {
59
+ content: [
60
+ {
61
+ type: 'text',
62
+ text: reason,
63
+ },
64
+ ],
65
+ isError: true,
66
+ };
67
+ }
47
68
  // Handle session registration (when agent_session_id is provided)
48
69
  let session = null;
49
70
  if (agent_session_id) {
@@ -83,10 +104,26 @@ export function registerReportDispatch(server) {
83
104
  }
84
105
  results.push(`Dispatch ${dispatch_id} → running`);
85
106
  }
107
+ // Completion check: warn if expectedOutputs are missing
108
+ if (effectiveStatus === 'completed' && dispatch.expectedOutputs.length > 0) {
109
+ const existingDocs = await listDocs(project_name);
110
+ const state = await readState(project_name);
111
+ const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
112
+ const missingOutputs = dispatch.expectedOutputs.filter((docId) => {
113
+ const docDef = wf.definition.docs[docId];
114
+ if (docDef?.external)
115
+ return false; // external docs not tracked
116
+ return !existingDocs.includes(docId);
117
+ });
118
+ if (missingOutputs.length > 0) {
119
+ results.push(`\n⚠ 预期产出文档缺失: ${missingOutputs.join(', ')}`);
120
+ results.push('请确认角色是否已通过 doc_write 提交了所有产出。');
121
+ }
122
+ }
86
123
  // Build response
87
124
  const nextStepHint = effectiveStatus === 'running'
88
- ? `\nNext: When the agent finishes, call report_dispatch with dispatch_id="${dispatch_id}" and status="completed" (or "failed").`
89
- : `\nNext: Call get_project_status to check overall progress and determine next steps.`;
125
+ ? `\nNext: When the agent finishes, call dispatch_report with dispatch_id="${dispatch_id}" and status="completed" (or "failed").`
126
+ : `\nNext: Call project_status to check overall progress and determine next steps.`;
90
127
  return {
91
128
  content: [
92
129
  {
@@ -1 +1 @@
1
- {"version":3,"file":"report-dispatch.js","sourceRoot":"","sources":["../../src/tools/report-dispatch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"report-dispatch.js","sourceRoot":"","sources":["../../src/tools/report-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACH,WAAW,EACX,cAAc,EACd,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,UAAkB,EAAE,SAAiB;IAC3F,MAAM,CAAC,IAAI,CACP,iBAAiB,EACjB,iNAAiN,EACjN;QACI,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACzE,MAAM,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;aACrD,QAAQ,EAAE;aACV,QAAQ,CAAC,2FAA2F,CAAC;QAC1G,gBAAgB,EAAE,CAAC;aACd,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACL,gHAAgH,CACnH;QACL,UAAU,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;aACtD,QAAQ,EAAE;aACV,QAAQ,CAAC,mCAAmC,CAAC;QAClD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;QAChG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;KAC9E,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QACvF,IAAI,CAAC;YACD,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO;oBACH,OAAO,EAAE;wBACL;4BACI,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,aAAa,WAAW,2BAA2B,YAAY,IAAI;yBAC5E;qBACJ;oBACD,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YAED,MAAM,eAAe,GAAG,MAAM,IAAI,SAAS,CAAC;YAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,oDAAoD;YACpD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC;gBACvD,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC5C,CAAC,CAAC,aAAa,WAAW,YAAY,QAAQ,CAAC,MAAM,YAAY,eAAe,GAAG;oBACnF,CAAC,CAAC,aAAa,WAAW,WAAW,QAAQ,CAAC,MAAM,aAAa,eAAe,GAAG,CAAC;gBACxF,OAAO;oBACH,OAAO,EAAE;wBACL;4BACI,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,MAAM;yBACf;qBACJ;oBACD,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YAED,kEAAkE;YAClE,IAAI,OAAO,GAAyB,IAAI,CAAC;YACzC,IAAI,gBAAgB,EAAE,CAAC;gBACnB,OAAO,GAAG,MAAM,sBAAsB,CAClC,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,UAAmC,EACnC,KAAK,CACR,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,EAAE,YAAY,gBAAgB,aAAa,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACnG,CAAC;YAED,4BAA4B;YAC5B,IACI,eAAe,KAAK,WAAW;gBAC/B,eAAe,KAAK,QAAQ;gBAC5B,eAAe,KAAK,WAAW,EACjC,CAAC;gBACC,0DAA0D;gBAC1D,MAAM,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE;oBAC5C,MAAM,EAAE,eAAe;oBACvB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5B,CAAC,CAAC;gBAEH,sDAAsD;gBACtD,MAAM,SAAS,GAAG,OAAO,EAAE,EAAE,IAAI,QAAQ,CAAC,SAAS,CAAC;gBACpD,IAAI,SAAS,EAAE,CAAC;oBACZ,MAAM,gBAAgB,GAAG,eAAe,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC3E,MAAM,aAAa,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;oBAC3E,OAAO,CAAC,IAAI,CAAC,WAAW,SAAS,MAAM,gBAAgB,EAAE,CAAC,CAAC;gBAC/D,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,YAAY,WAAW,MAAM,eAAe,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACJ,sDAAsD;gBACtD,MAAM,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE;oBAC5C,MAAM,EAAE,SAAS;oBACjB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5B,CAAC,CAAC;gBAEH,yBAAyB;gBACzB,MAAM,SAAS,GAAG,OAAO,EAAE,EAAE,IAAI,QAAQ,CAAC,SAAS,CAAC;gBACpD,IAAI,SAAS,EAAE,CAAC;oBACZ,MAAM,aAAa,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACvE,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,YAAY,WAAW,YAAY,CAAC,CAAC;YACtD,CAAC;YAED,wDAAwD;YACxD,IAAI,eAAe,KAAK,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzE,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;gBAC5C,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAErE,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;oBAC7D,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACzC,IAAI,MAAM,EAAE,QAAQ;wBAAE,OAAO,KAAK,CAAC,CAAC,4BAA4B;oBAChE,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACzC,CAAC,CAAC,CAAC;gBAEH,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,IAAI,CAAC,iBAAiB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC3D,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBAClD,CAAC;YACL,CAAC;YAED,iBAAiB;YACjB,MAAM,YAAY,GACd,eAAe,KAAK,SAAS;gBACzB,CAAC,CAAC,2EAA2E,WAAW,yCAAyC;gBACjI,CAAC,CAAC,iFAAiF,CAAC;YAE5F,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,sBAAsB,WAAW,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,YAAY,EAAE;qBACpF;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBACrE;iBACJ;gBACD,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,sBAAsB,CACjC,WAAmB,EACnB,QAAwB,EACxB,cAAsB,EACtB,SAAqB,EACrB,KAAc;IAEd,6EAA6E;IAC7E,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnE,IAAI,QAAQ,EAAE,CAAC;YACX,OAAO,MAAM,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE;gBACjD,cAAc;gBACd,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3B,MAAM,EAAE,QAAQ;aACnB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,6EAA6E;IAC7E,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC/F,IAAI,eAAe,EAAE,CAAC;QAClB,OAAO,MAAM,aAAa,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,EAAE;YACxD,MAAM,EAAE,QAAQ;YAChB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9B,CAAC,CAAC;IACP,CAAC;IAED,uBAAuB;IACvB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAClF,OAAO,MAAM,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * MCP Tool: project_set_scale
3
+ * Set the project scale after PRD approval. Scale is immutable once set.
4
+ */
5
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ export declare function registerSetScale(server: McpServer, builtinDir: string, customDir: string): void;
@@ -0,0 +1,92 @@
1
+ /**
2
+ * MCP Tool: project_set_scale
3
+ * Set the project scale after PRD approval. Scale is immutable once set.
4
+ */
5
+ import { z } from 'zod';
6
+ import { readState, setScale } from '../core/state.js';
7
+ import { loadWorkflow } from '../core/workflow.js';
8
+ import { readReviews } from '../core/reviews.js';
9
+ export function registerSetScale(server, builtinDir, customDir) {
10
+ server.tool('project_set_scale', 'Set the project scale after PRD approval. Scale determines which documents are required (full/lite/skip) and enables sequential mode for medium/large projects. Scale is immutable once set — if requirements change significantly, redo the PRD.', {
11
+ project_name: z.string().describe('项目名称'),
12
+ scale: z.enum(['small', 'medium', 'large']).describe('项目规模 (small/medium/large)'),
13
+ }, async ({ project_name, scale }) => {
14
+ try {
15
+ // Check project exists
16
+ const state = await readState(project_name);
17
+ // Guard: scale already set
18
+ if (state.scale !== null) {
19
+ return {
20
+ content: [
21
+ {
22
+ type: 'text',
23
+ text: `Scale 已设定为 "${state.scale}",不可更改。如需调整规模,请重新评估 PRD。`,
24
+ },
25
+ ],
26
+ isError: true,
27
+ };
28
+ }
29
+ // Guard: PRD must be approved
30
+ const reviews = await readReviews(project_name);
31
+ const prdReview = reviews['prd'];
32
+ if (!prdReview || prdReview.status !== 'approved') {
33
+ const prdStatus = prdReview ? prdReview.status : '未提交';
34
+ return {
35
+ content: [
36
+ {
37
+ type: 'text',
38
+ text: `无法设定 scale:PRD 尚未审批通过(当前状态: ${prdStatus})。请先完成 PRD 编写和审批,再设定项目规模。`,
39
+ },
40
+ ],
41
+ isError: true,
42
+ };
43
+ }
44
+ // Set scale
45
+ const updated = await setScale(project_name, scale);
46
+ // Build doc list based on scale
47
+ const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
48
+ const requiredDocs = Object.entries(wf.definition.docs)
49
+ .filter(([, doc]) => {
50
+ const s = doc.scale[scale];
51
+ return s === 'full' || s === 'lite';
52
+ })
53
+ .map(([id, doc]) => `- ${doc.name} (${id})`)
54
+ .join('\n');
55
+ const optionalDocs = Object.entries(wf.definition.docs)
56
+ .filter(([, doc]) => doc.scale[scale] === 'optional')
57
+ .map(([id, doc]) => `- ${doc.name} (${id})`)
58
+ .join('\n');
59
+ return {
60
+ content: [
61
+ {
62
+ type: 'text',
63
+ text: [
64
+ `项目 "${project_name}" 规模已设定为 "${scale}"。`,
65
+ ``,
66
+ `必需文档:`,
67
+ requiredDocs || '(无)',
68
+ optionalDocs ? `\n可选文档:\n${optionalDocs}` : '',
69
+ ``,
70
+ `当前阶段: ${updated.currentPhase}`,
71
+ scale !== 'small'
72
+ ? `\n注意: ${scale} 规模项目的 PRD、tech-design、task-breakdown 等文档将启用分步写入模式。`
73
+ : '',
74
+ ].join('\n'),
75
+ },
76
+ ],
77
+ };
78
+ }
79
+ catch (err) {
80
+ return {
81
+ content: [
82
+ {
83
+ type: 'text',
84
+ text: `Error: ${err instanceof Error ? err.message : String(err)}`,
85
+ },
86
+ ],
87
+ isError: true,
88
+ };
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=set-scale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set-scale.js","sourceRoot":"","sources":["../../src/tools/set-scale.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MCP Tool: setup_project
2
+ * MCP Tool: project_setup
3
3
  *
4
4
  * Inject Harmonia PM guidance into the host agent's config file (e.g. AGENTS.md).
5
5
  * This makes the host agent aware of Harmonia tools and the PM workflow.
@@ -1,17 +1,19 @@
1
1
  /**
2
- * MCP Tool: setup_project
2
+ * MCP Tool: project_setup
3
3
  *
4
4
  * Inject Harmonia PM guidance into the host agent's config file (e.g. AGENTS.md).
5
5
  * This makes the host agent aware of Harmonia tools and the PM workflow.
6
6
  */
7
7
  import { z } from 'zod';
8
8
  import { readState } from '../core/state.js';
9
+ import { getGlobalDir } from '../core/registry.js';
9
10
  import { detectHostAgent, injectPrompt } from '../setup/inject.js';
11
+ import { installHooks } from '../hooks/install.js';
10
12
  export function registerSetupProject(server) {
11
- server.tool('setup_project', "Inject Harmonia PM guidance into the host agent's config file (AGENTS.md / CLAUDE.md). Makes the host agent aware of all Harmonia tools and the PM workflow. Requires project_init to be called first. Idempotent — safe to call multiple times.", {
13
+ server.tool('project_setup', "Inject Harmonia PM guidance into the host agent's config file (AGENTS.md / CLAUDE.md). Makes the host agent aware of all Harmonia tools and the PM workflow. Requires project_init to be called first. Idempotent — safe to call multiple times.", {
12
14
  project_name: z.string().describe('Project name (must be initialized)'),
13
15
  agent_type: z
14
- .enum(['opencode', 'claude-code', 'codex'])
16
+ .enum(['opencode', 'claude-code', 'codex', 'openclaw'])
15
17
  .optional()
16
18
  .describe('Host agent type. If not specified, auto-detects based on project directory contents.'),
17
19
  }, async ({ project_name, agent_type }) => {
@@ -27,6 +29,27 @@ export function registerSetupProject(server) {
27
29
  workflow: state.workflow,
28
30
  scale: state.scale,
29
31
  });
32
+ // Install agent hooks (boundary guard + proactive reminders)
33
+ let hookStatus = '';
34
+ try {
35
+ const hookResult = await installHooks(detectedType, {
36
+ dataDir: getGlobalDir(),
37
+ projectName: state.projectName,
38
+ projectDir: state.projectDir,
39
+ });
40
+ if (hookResult.success) {
41
+ hookStatus = `Installed (${hookResult.filesWritten.length} files)`;
42
+ if (hookResult.warnings.length > 0) {
43
+ hookStatus += ` — warnings: ${hookResult.warnings.join('; ')}`;
44
+ }
45
+ }
46
+ else {
47
+ hookStatus = `Failed: ${hookResult.error ?? 'unknown error'}`;
48
+ }
49
+ }
50
+ catch (hookErr) {
51
+ hookStatus = `Error: ${hookErr instanceof Error ? hookErr.message : String(hookErr)}`;
52
+ }
30
53
  const action = result.created ? 'Created' : result.replaced ? 'Updated' : 'Appended to';
31
54
  return {
32
55
  content: [
@@ -51,9 +74,14 @@ export function registerSetupProject(server) {
51
74
  `- Team member dispatch guide`,
52
75
  `- Important rules for PM behavior`,
53
76
  ``,
77
+ `## Agent Hooks`,
78
+ `- Status: ${hookStatus}`,
79
+ `- Boundary guard: prevents PM from directly modifying code or running dev commands`,
80
+ `- Proactive reminders: dispatch timeout, idle phase, pending reviews`,
81
+ ``,
54
82
  `## Next Steps`,
55
83
  `The host agent will now follow the PM workflow automatically.`,
56
- `Start by calling \`get_project_status\` to see where the project stands.`,
84
+ `Start by calling \`project_status\` to see where the project stands.`,
57
85
  ].join('\n'),
58
86
  },
59
87
  ],
@@ -67,7 +95,7 @@ export function registerSetupProject(server) {
67
95
  content: [
68
96
  {
69
97
  type: 'text',
70
- text: `Project "${project_name}" not initialized. Call project_init first, then setup_project.`,
98
+ text: `Project "${project_name}" not initialized. Call project_init first, then project_setup.`,
71
99
  },
72
100
  ],
73
101
  isError: true,
@@ -1 +1 @@
1
- {"version":3,"file":"setup-project.js","sourceRoot":"","sources":["../../src/tools/setup-project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup-project.js","sourceRoot":"","sources":["../../src/tools/setup-project.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,12 @@
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 type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
7
- export declare function registerUpdatePhase(server: McpServer, workflowsDir: string): void;
12
+ export declare function registerUpdatePhase(server: McpServer, builtinDir: string, customDir: string): void;