@s_s/harmonia 1.2.0 → 1.4.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 +140 -392
- package/build/cli/setup.d.ts +4 -2
- package/build/cli/setup.js +44 -18
- package/build/cli/setup.js.map +1 -1
- package/build/core/action-registry.d.ts +36 -0
- package/build/core/action-registry.js +53 -0
- package/build/core/action-registry.js.map +1 -0
- package/build/core/artifacts.d.ts +66 -0
- package/build/core/artifacts.js +178 -0
- package/build/core/artifacts.js.map +1 -0
- package/build/core/dispatch.d.ts +18 -11
- package/build/core/dispatch.js +43 -33
- package/build/core/dispatch.js.map +1 -1
- package/build/core/issues.d.ts +37 -0
- package/build/core/issues.js +100 -0
- package/build/core/issues.js.map +1 -0
- package/build/core/overrides.d.ts +19 -26
- package/build/core/overrides.js +32 -98
- package/build/core/overrides.js.map +1 -1
- package/build/core/plugin.d.ts +86 -0
- package/build/core/plugin.js +332 -0
- package/build/core/plugin.js.map +1 -0
- package/build/core/registry.d.ts +36 -3
- package/build/core/registry.js +63 -5
- package/build/core/registry.js.map +1 -1
- package/build/core/reviews.d.ts +13 -13
- package/build/core/reviews.js +31 -32
- package/build/core/reviews.js.map +1 -1
- package/build/core/schema.d.ts +43 -15
- package/build/core/schema.js +124 -20
- package/build/core/schema.js.map +1 -1
- package/build/core/state.d.ts +29 -22
- package/build/core/state.js +49 -81
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +15 -15
- package/build/core/steps.js +32 -33
- package/build/core/steps.js.map +1 -1
- package/build/core/tree-utils.d.ts +52 -0
- package/build/core/tree-utils.js +226 -0
- package/build/core/tree-utils.js.map +1 -0
- package/build/core/types.d.ts +417 -117
- package/build/core/types.js +15 -1
- package/build/core/types.js.map +1 -1
- package/build/core/workflow-engine.d.ts +68 -0
- package/build/core/workflow-engine.js +821 -0
- package/build/core/workflow-engine.js.map +1 -0
- package/build/core/workflow-validator.d.ts +22 -0
- package/build/core/workflow-validator.js +489 -0
- package/build/core/workflow-validator.js.map +1 -0
- package/build/index.js +28 -25
- package/build/index.js.map +1 -1
- package/build/setup/inject.d.ts +4 -4
- package/build/setup/inject.js +6 -6
- package/build/setup/inject.js.map +1 -1
- package/build/setup/templates.d.ts +9 -7
- package/build/setup/templates.js +68 -103
- package/build/setup/templates.js.map +1 -1
- package/build/tools/artifact-approve.d.ts +8 -0
- package/build/tools/artifact-approve.js +94 -0
- package/build/tools/artifact-approve.js.map +1 -0
- package/build/tools/artifact-schema.d.ts +12 -0
- package/build/tools/artifact-schema.js +148 -0
- package/build/tools/artifact-schema.js.map +1 -0
- package/build/tools/artifact-tools.d.ts +18 -0
- package/build/tools/artifact-tools.js +465 -0
- package/build/tools/artifact-tools.js.map +1 -0
- package/build/tools/{report-dispatch.d.ts → dispatch-report.d.ts} +7 -3
- package/build/tools/dispatch-report.js +261 -0
- package/build/tools/dispatch-report.js.map +1 -0
- package/build/tools/engine-helpers.d.ts +41 -0
- package/build/tools/engine-helpers.js +182 -0
- package/build/tools/engine-helpers.js.map +1 -0
- package/build/tools/get-project-status.d.ts +6 -4
- package/build/tools/get-project-status.js +308 -246
- package/build/tools/get-project-status.js.map +1 -1
- package/build/tools/get-role-prompt.d.ts +1 -1
- package/build/tools/get-role-prompt.js +7 -41
- package/build/tools/get-role-prompt.js.map +1 -1
- package/build/tools/issue-tools.d.ts +10 -0
- package/build/tools/issue-tools.js +169 -0
- package/build/tools/issue-tools.js.map +1 -0
- package/build/tools/iteration-start.d.ts +7 -4
- package/build/tools/iteration-start.js +51 -20
- package/build/tools/iteration-start.js.map +1 -1
- package/build/tools/loop-done.d.ts +11 -0
- package/build/tools/loop-done.js +109 -0
- package/build/tools/loop-done.js.map +1 -0
- package/build/tools/patch-start.d.ts +16 -0
- package/build/tools/patch-start.js +122 -0
- package/build/tools/patch-start.js.map +1 -0
- package/build/tools/project-init.d.ts +5 -5
- package/build/tools/project-init.js +47 -18
- package/build/tools/project-init.js.map +1 -1
- package/build/tools/role-dispatch.d.ts +55 -0
- package/build/tools/role-dispatch.js +508 -0
- package/build/tools/role-dispatch.js.map +1 -0
- package/build/tools/utils.d.ts +40 -0
- package/build/tools/utils.js +97 -0
- package/build/tools/utils.js.map +1 -0
- package/package.json +1 -1
- package/{build/hooks/claude-code.js → workflows/dev/hooks/claude.js} +34 -23
- package/{build → workflows/dev}/hooks/content.js +27 -18
- package/workflows/dev/hooks/index.js +52 -0
- package/{build → workflows/dev}/hooks/openclaw.js +31 -20
- package/{build → workflows/dev}/hooks/opencode.js +31 -20
- package/workflows/dev/roles/architect.md +68 -28
- package/workflows/dev/roles/coordinator.md +103 -0
- package/workflows/dev/roles/developer.md +5 -5
- package/workflows/dev/roles/tester.md +19 -19
- package/workflows/dev/schemas/api-contract.json +42 -0
- package/workflows/dev/schemas/api-design.json +30 -13
- package/workflows/dev/schemas/data-model.json +20 -7
- package/workflows/dev/schemas/prd.completeness-check.json +6 -5
- package/workflows/dev/schemas/prd.draft.json +13 -5
- package/workflows/dev/schemas/prd.final.json +34 -11
- package/workflows/dev/schemas/prd.json +29 -11
- package/workflows/dev/schemas/prd.requirements.json +6 -5
- package/workflows/dev/schemas/prototype.json +6 -2
- package/workflows/dev/schemas/task-breakdown.coarse.json +4 -3
- package/workflows/dev/schemas/task-breakdown.dependencies.json +5 -4
- package/workflows/dev/schemas/task-breakdown.detailed.json +8 -3
- package/workflows/dev/schemas/task-breakdown.final.json +8 -3
- package/workflows/dev/schemas/task-breakdown.json +8 -3
- package/workflows/dev/schemas/tech-design.analysis.json +6 -5
- package/workflows/dev/schemas/tech-design.draft.json +14 -5
- package/workflows/dev/schemas/tech-design.final.json +39 -13
- package/workflows/dev/schemas/tech-design.json +34 -13
- package/workflows/dev/schemas/tech-design.research.json +21 -0
- package/workflows/dev/schemas/test-plan.json +17 -7
- package/workflows/dev/schemas/test-report.json +26 -9
- package/workflows/dev/schemas/user-stories.json +7 -3
- package/workflows/dev/tools/index.js +23 -0
- package/workflows/dev/workflow.json +234 -101
- package/build/core/docs.d.ts +0 -32
- package/build/core/docs.js +0 -91
- package/build/core/docs.js.map +0 -1
- package/build/core/workflow.d.ts +0 -33
- package/build/core/workflow.js +0 -140
- package/build/core/workflow.js.map +0 -1
- package/build/hooks/claude-code.d.ts +0 -20
- package/build/hooks/claude-code.js.map +0 -1
- package/build/hooks/content.d.ts +0 -43
- package/build/hooks/content.js.map +0 -1
- package/build/hooks/install.d.ts +0 -40
- package/build/hooks/install.js +0 -63
- package/build/hooks/install.js.map +0 -1
- package/build/hooks/openclaw.d.ts +0 -24
- package/build/hooks/openclaw.js.map +0 -1
- package/build/hooks/opencode.d.ts +0 -29
- package/build/hooks/opencode.js.map +0 -1
- package/build/tools/approve-doc.d.ts +0 -6
- package/build/tools/approve-doc.js +0 -108
- package/build/tools/approve-doc.js.map +0 -1
- package/build/tools/dispatch-role.d.ts +0 -16
- package/build/tools/dispatch-role.js +0 -277
- package/build/tools/dispatch-role.js.map +0 -1
- package/build/tools/doc-tools.d.ts +0 -16
- package/build/tools/doc-tools.js +0 -389
- package/build/tools/doc-tools.js.map +0 -1
- package/build/tools/override-tools.d.ts +0 -6
- package/build/tools/override-tools.js +0 -129
- package/build/tools/override-tools.js.map +0 -1
- package/build/tools/report-dispatch.js +0 -194
- package/build/tools/report-dispatch.js.map +0 -1
- package/build/tools/set-scale.d.ts +0 -6
- package/build/tools/set-scale.js +0 -107
- package/build/tools/set-scale.js.map +0 -1
- package/build/tools/setup-project.d.ts +0 -8
- package/build/tools/setup-project.js +0 -116
- package/build/tools/setup-project.js.map +0 -1
- package/build/tools/update-phase.d.ts +0 -12
- package/build/tools/update-phase.js +0 -159
- package/build/tools/update-phase.js.map +0 -1
- package/workflows/dev/roles/pm.md +0 -99
- package/workflows/dev/schemas/deploy.json +0 -20
- package/workflows/dev/schemas/fsd.json +0 -25
- package/workflows/dev/schemas/project-plan.json +0 -20
- package/workflows/dev/schemas/retrospective.json +0 -20
- package/workflows/dev/schemas/risk-assessment.json +0 -15
- package/workflows/dev/schemas/tech-design.api-contract.json +0 -20
|
@@ -1,194 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Tool: dispatch_report
|
|
3
|
-
*
|
|
4
|
-
* PM calls this tool to report dispatch status changes:
|
|
5
|
-
* 1. After launching an agent: provide agent_session_id → creates/reuses session, marks dispatch running
|
|
6
|
-
* 2. After agent finishes: provide status=completed/failed → updates dispatch, session goes idle/closed
|
|
7
|
-
*
|
|
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
|
|
12
|
-
*/
|
|
13
|
-
import { z } from 'zod';
|
|
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
|
-
import { getProject } from '../core/registry.js';
|
|
19
|
-
export function registerReportDispatch(server, builtinDir, customDir) {
|
|
20
|
-
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.', {
|
|
21
|
-
project_name: z.string().describe('Project name'),
|
|
22
|
-
dispatch_id: z.string().describe('Dispatch ID returned by role_dispatch'),
|
|
23
|
-
status: z
|
|
24
|
-
.enum(['running', 'completed', 'failed', 'cancelled'])
|
|
25
|
-
.optional()
|
|
26
|
-
.describe('New dispatch status. Omit when only registering agent_session_id (defaults to "running").'),
|
|
27
|
-
agent_session_id: z
|
|
28
|
-
.string()
|
|
29
|
-
.optional()
|
|
30
|
-
.describe('The actual session ID from the host agent (e.g. OpenCode session ID). Provide on first report after launching.'),
|
|
31
|
-
agent_type: z
|
|
32
|
-
.enum(['opencode', 'openclaw', 'claude-code', 'codex'])
|
|
33
|
-
.optional()
|
|
34
|
-
.describe('Agent type used for this dispatch'),
|
|
35
|
-
label: z.string().optional().describe('Optional label for the session (e.g. "dev-auth-module")'),
|
|
36
|
-
note: z.string().optional().describe('Optional note (e.g. failure reason)'),
|
|
37
|
-
}, async ({ project_name, dispatch_id, status, agent_session_id, agent_type, label, note }) => {
|
|
38
|
-
try {
|
|
39
|
-
// Resolve current iteration
|
|
40
|
-
const entry = await getProject(project_name);
|
|
41
|
-
if (!entry || entry.currentIteration === 0) {
|
|
42
|
-
return {
|
|
43
|
-
content: [
|
|
44
|
-
{
|
|
45
|
-
type: 'text',
|
|
46
|
-
text: `项目 "${project_name}" 未找到或尚未开始迭代。请先调用 iteration_start。`,
|
|
47
|
-
},
|
|
48
|
-
],
|
|
49
|
-
isError: true,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
const iteration = entry.currentIteration;
|
|
53
|
-
// Load the dispatch record
|
|
54
|
-
const dispatch = await getDispatch(project_name, iteration, dispatch_id);
|
|
55
|
-
if (!dispatch) {
|
|
56
|
-
return {
|
|
57
|
-
content: [
|
|
58
|
-
{
|
|
59
|
-
type: 'text',
|
|
60
|
-
text: `Dispatch "${dispatch_id}" not found in project "${project_name}".`,
|
|
61
|
-
},
|
|
62
|
-
],
|
|
63
|
-
isError: true,
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
const effectiveStatus = status ?? 'running';
|
|
67
|
-
const results = [];
|
|
68
|
-
// Guard: state machine — reject invalid transitions
|
|
69
|
-
if (!isValidTransition(dispatch.status, effectiveStatus)) {
|
|
70
|
-
const reason = isTerminalStatus(dispatch.status)
|
|
71
|
-
? `dispatch "${dispatch_id}" 已处于终态 "${dispatch.status}",无法转换到 "${effectiveStatus}"`
|
|
72
|
-
: `dispatch "${dispatch_id}" 当前状态 "${dispatch.status}" 不允许转换到 "${effectiveStatus}"`;
|
|
73
|
-
return {
|
|
74
|
-
content: [
|
|
75
|
-
{
|
|
76
|
-
type: 'text',
|
|
77
|
-
text: reason,
|
|
78
|
-
},
|
|
79
|
-
],
|
|
80
|
-
isError: true,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
// Handle session registration (when agent_session_id is provided)
|
|
84
|
-
let session = null;
|
|
85
|
-
if (agent_session_id) {
|
|
86
|
-
session = await resolveOrCreateSession(project_name, iteration, dispatch, agent_session_id, agent_type, label);
|
|
87
|
-
results.push(`Session: ${session.id} (agent: ${agent_session_id}, status: ${session.status})`);
|
|
88
|
-
}
|
|
89
|
-
// Handle status transitions
|
|
90
|
-
if (effectiveStatus === 'completed' ||
|
|
91
|
-
effectiveStatus === 'failed' ||
|
|
92
|
-
effectiveStatus === 'cancelled') {
|
|
93
|
-
// Terminal states: update dispatch and transition session
|
|
94
|
-
await updateDispatch(project_name, iteration, dispatch_id, {
|
|
95
|
-
status: effectiveStatus,
|
|
96
|
-
...(session ? { sessionId: session.id } : {}),
|
|
97
|
-
...(note ? { note } : {}),
|
|
98
|
-
});
|
|
99
|
-
// Transition session: completed → idle, failed → lost
|
|
100
|
-
const sessionId = session?.id ?? dispatch.sessionId;
|
|
101
|
-
if (sessionId) {
|
|
102
|
-
const newSessionStatus = effectiveStatus === 'completed' ? 'idle' : 'lost';
|
|
103
|
-
await updateSession(project_name, iteration, sessionId, { status: newSessionStatus });
|
|
104
|
-
results.push(`Session ${sessionId} → ${newSessionStatus}`);
|
|
105
|
-
}
|
|
106
|
-
results.push(`Dispatch ${dispatch_id} → ${effectiveStatus}`);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
// Running: update dispatch status + associate session
|
|
110
|
-
await updateDispatch(project_name, iteration, dispatch_id, {
|
|
111
|
-
status: 'running',
|
|
112
|
-
...(session ? { sessionId: session.id } : {}),
|
|
113
|
-
...(note ? { note } : {}),
|
|
114
|
-
});
|
|
115
|
-
// Mark session as active
|
|
116
|
-
const sessionId = session?.id ?? dispatch.sessionId;
|
|
117
|
-
if (sessionId) {
|
|
118
|
-
await updateSession(project_name, iteration, sessionId, { status: 'active' });
|
|
119
|
-
}
|
|
120
|
-
results.push(`Dispatch ${dispatch_id} → running`);
|
|
121
|
-
}
|
|
122
|
-
// Completion check: warn if expectedOutputs are missing
|
|
123
|
-
if (effectiveStatus === 'completed' && dispatch.expectedOutputs.length > 0) {
|
|
124
|
-
const existingDocs = await listDocs(project_name, iteration);
|
|
125
|
-
const state = await readState(project_name, iteration);
|
|
126
|
-
const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
|
|
127
|
-
const missingOutputs = dispatch.expectedOutputs.filter((docId) => {
|
|
128
|
-
const docDef = wf.definition.docs[docId];
|
|
129
|
-
if (docDef?.external)
|
|
130
|
-
return false; // external docs not tracked
|
|
131
|
-
return !existingDocs.includes(docId);
|
|
132
|
-
});
|
|
133
|
-
if (missingOutputs.length > 0) {
|
|
134
|
-
results.push(`\n⚠ 预期产出文档缺失: ${missingOutputs.join(', ')}`);
|
|
135
|
-
results.push('请确认角色是否已通过 doc_write 提交了所有产出。');
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// Build response
|
|
139
|
-
const nextStepHint = effectiveStatus === 'running'
|
|
140
|
-
? `\nNext: When the agent finishes, call dispatch_report with dispatch_id="${dispatch_id}" and status="completed" (or "failed").`
|
|
141
|
-
: `\nNext: Call project_status to check overall progress and determine next steps.`;
|
|
142
|
-
return {
|
|
143
|
-
content: [
|
|
144
|
-
{
|
|
145
|
-
type: 'text',
|
|
146
|
-
text: `# Report Dispatch: ${dispatch_id}\n\n${results.join('\n')}${nextStepHint}`,
|
|
147
|
-
},
|
|
148
|
-
],
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
catch (err) {
|
|
152
|
-
return {
|
|
153
|
-
content: [
|
|
154
|
-
{
|
|
155
|
-
type: 'text',
|
|
156
|
-
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
157
|
-
},
|
|
158
|
-
],
|
|
159
|
-
isError: true,
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Resolve an existing session by agent session ID, or create a new one.
|
|
166
|
-
*/
|
|
167
|
-
async function resolveOrCreateSession(projectName, iteration, dispatch, agentSessionId, agentType, label) {
|
|
168
|
-
// If the dispatch already has a session, update it with the agent session ID
|
|
169
|
-
if (dispatch.sessionId) {
|
|
170
|
-
const sessions = await readSessions(projectName, iteration);
|
|
171
|
-
const existing = sessions.find((s) => s.id === dispatch.sessionId);
|
|
172
|
-
if (existing) {
|
|
173
|
-
return await updateSession(projectName, iteration, existing.id, {
|
|
174
|
-
agentSessionId,
|
|
175
|
-
...(agentType ? { agentType } : {}),
|
|
176
|
-
...(label ? { label } : {}),
|
|
177
|
-
status: 'active',
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
// Check if a session with this agent session ID already exists for this role
|
|
182
|
-
const existingByAgent = await findSessionByAgentId(projectName, iteration, dispatch.role, agentSessionId);
|
|
183
|
-
if (existingByAgent) {
|
|
184
|
-
return await updateSession(projectName, iteration, existingByAgent.id, {
|
|
185
|
-
status: 'active',
|
|
186
|
-
...(agentType ? { agentType } : {}),
|
|
187
|
-
...(label ? { label } : {}),
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
// Create a new session
|
|
191
|
-
const session = await createSession(projectName, iteration, dispatch.role, agentType, label);
|
|
192
|
-
return await updateSession(projectName, iteration, session.id, { agentSessionId });
|
|
193
|
-
}
|
|
194
|
-
//# sourceMappingURL=report-dispatch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"report-dispatch.js","sourceRoot":"","sources":["../../src/tools/report-dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +0,0 @@
|
|
|
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;
|
package/build/tools/set-scale.js
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
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
|
-
import { getProject } from '../core/registry.js';
|
|
10
|
-
export function registerSetScale(server, builtinDir, customDir) {
|
|
11
|
-
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.', {
|
|
12
|
-
project_name: z.string().describe('项目名称'),
|
|
13
|
-
scale: z.enum(['small', 'medium', 'large']).describe('项目规模 (small/medium/large)'),
|
|
14
|
-
}, async ({ project_name, scale }) => {
|
|
15
|
-
try {
|
|
16
|
-
// Resolve current iteration
|
|
17
|
-
const entry = await getProject(project_name);
|
|
18
|
-
if (!entry || entry.currentIteration === 0) {
|
|
19
|
-
return {
|
|
20
|
-
content: [
|
|
21
|
-
{
|
|
22
|
-
type: 'text',
|
|
23
|
-
text: `项目 "${project_name}" 未找到或尚未开始迭代。请先调用 iteration_start。`,
|
|
24
|
-
},
|
|
25
|
-
],
|
|
26
|
-
isError: true,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
const iteration = entry.currentIteration;
|
|
30
|
-
// Check project exists
|
|
31
|
-
const state = await readState(project_name, iteration);
|
|
32
|
-
// Guard: scale already set
|
|
33
|
-
if (state.scale !== null) {
|
|
34
|
-
return {
|
|
35
|
-
content: [
|
|
36
|
-
{
|
|
37
|
-
type: 'text',
|
|
38
|
-
text: `Scale 已设定为 "${state.scale}",不可更改。如需调整规模,请重新评估 PRD。`,
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
isError: true,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
// Guard: PRD must be approved
|
|
45
|
-
const reviews = await readReviews(project_name, iteration);
|
|
46
|
-
const prdReview = reviews['prd'];
|
|
47
|
-
if (!prdReview || prdReview.status !== 'approved') {
|
|
48
|
-
const prdStatus = prdReview ? prdReview.status : '未提交';
|
|
49
|
-
return {
|
|
50
|
-
content: [
|
|
51
|
-
{
|
|
52
|
-
type: 'text',
|
|
53
|
-
text: `无法设定 scale:PRD 尚未审批通过(当前状态: ${prdStatus})。请先完成 PRD 编写和审批,再设定项目规模。`,
|
|
54
|
-
},
|
|
55
|
-
],
|
|
56
|
-
isError: true,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
// Set scale
|
|
60
|
-
const updated = await setScale(project_name, iteration, scale);
|
|
61
|
-
// Build doc list based on scale
|
|
62
|
-
const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
|
|
63
|
-
const requiredDocs = Object.entries(wf.definition.docs)
|
|
64
|
-
.filter(([, doc]) => {
|
|
65
|
-
const s = doc.scale[scale];
|
|
66
|
-
return s === 'full' || s === 'lite';
|
|
67
|
-
})
|
|
68
|
-
.map(([id, doc]) => `- ${doc.name} (${id})`)
|
|
69
|
-
.join('\n');
|
|
70
|
-
const optionalDocs = Object.entries(wf.definition.docs)
|
|
71
|
-
.filter(([, doc]) => doc.scale[scale] === 'optional')
|
|
72
|
-
.map(([id, doc]) => `- ${doc.name} (${id})`)
|
|
73
|
-
.join('\n');
|
|
74
|
-
return {
|
|
75
|
-
content: [
|
|
76
|
-
{
|
|
77
|
-
type: 'text',
|
|
78
|
-
text: [
|
|
79
|
-
`项目 "${project_name}" 规模已设定为 "${scale}"。`,
|
|
80
|
-
``,
|
|
81
|
-
`必需文档:`,
|
|
82
|
-
requiredDocs || '(无)',
|
|
83
|
-
optionalDocs ? `\n可选文档:\n${optionalDocs}` : '',
|
|
84
|
-
``,
|
|
85
|
-
`当前阶段: ${updated.currentPhase}`,
|
|
86
|
-
scale !== 'small'
|
|
87
|
-
? `\n注意: ${scale} 规模项目的 PRD、tech-design、task-breakdown 等文档将启用分步写入模式。`
|
|
88
|
-
: '',
|
|
89
|
-
].join('\n'),
|
|
90
|
-
},
|
|
91
|
-
],
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
catch (err) {
|
|
95
|
-
return {
|
|
96
|
-
content: [
|
|
97
|
-
{
|
|
98
|
-
type: 'text',
|
|
99
|
-
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
100
|
-
},
|
|
101
|
-
],
|
|
102
|
-
isError: true,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
//# sourceMappingURL=set-scale.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"set-scale.js","sourceRoot":"","sources":["../../src/tools/set-scale.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Tool: project_setup
|
|
3
|
-
*
|
|
4
|
-
* Inject Harmonia PM guidance into the host agent's config file (e.g. AGENTS.md).
|
|
5
|
-
* This makes the host agent aware of Harmonia tools and the PM workflow.
|
|
6
|
-
*/
|
|
7
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
-
export declare function registerSetupProject(server: McpServer): void;
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Tool: project_setup
|
|
3
|
-
*
|
|
4
|
-
* Inject Harmonia PM guidance into the host agent's config file (e.g. AGENTS.md).
|
|
5
|
-
* This makes the host agent aware of Harmonia tools and the PM workflow.
|
|
6
|
-
*/
|
|
7
|
-
import { z } from 'zod';
|
|
8
|
-
import { readState } from '../core/state.js';
|
|
9
|
-
import { getGlobalDir } from '../core/registry.js';
|
|
10
|
-
import { detectHostAgent, injectPrompt } from '../setup/inject.js';
|
|
11
|
-
import { installHooks } from '../hooks/install.js';
|
|
12
|
-
export function registerSetupProject(server) {
|
|
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.", {
|
|
14
|
-
project_name: z.string().describe('Project name (must be initialized)'),
|
|
15
|
-
agent_type: z
|
|
16
|
-
.enum(['opencode', 'claude-code', 'codex', 'openclaw'])
|
|
17
|
-
.optional()
|
|
18
|
-
.describe('Host agent type. If not specified, auto-detects based on project directory contents.'),
|
|
19
|
-
}, async ({ project_name, agent_type }) => {
|
|
20
|
-
try {
|
|
21
|
-
// Ensure project is initialized
|
|
22
|
-
const state = await readState(project_name);
|
|
23
|
-
// Detect or use specified agent type
|
|
24
|
-
const detectedType = agent_type ?? (await detectHostAgent(state.projectDir));
|
|
25
|
-
// Inject the prompt
|
|
26
|
-
const result = await injectPrompt(state.projectDir, detectedType, {
|
|
27
|
-
projectName: state.projectName,
|
|
28
|
-
projectDir: state.projectDir,
|
|
29
|
-
workflow: state.workflow,
|
|
30
|
-
scale: state.scale,
|
|
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
|
-
}
|
|
53
|
-
const action = result.created ? 'Created' : result.replaced ? 'Updated' : 'Appended to';
|
|
54
|
-
return {
|
|
55
|
-
content: [
|
|
56
|
-
{
|
|
57
|
-
type: 'text',
|
|
58
|
-
text: [
|
|
59
|
-
`# Setup Complete`,
|
|
60
|
-
``,
|
|
61
|
-
`${action} **${result.filePath}** with Harmonia PM guidance.`,
|
|
62
|
-
``,
|
|
63
|
-
`## Configuration`,
|
|
64
|
-
`- Agent type: ${detectedType}`,
|
|
65
|
-
`- Project: ${state.projectName}`,
|
|
66
|
-
`- Workflow: ${state.workflow}`,
|
|
67
|
-
`- Scale: ${state.scale}`,
|
|
68
|
-
``,
|
|
69
|
-
`## What was injected`,
|
|
70
|
-
`- Project Manager role definition and responsibilities`,
|
|
71
|
-
`- Full tool reference (${15} Harmonia tools)`,
|
|
72
|
-
`- Phase-by-phase workflow guide`,
|
|
73
|
-
`- Document review flow`,
|
|
74
|
-
`- Team member dispatch guide`,
|
|
75
|
-
`- Important rules for PM behavior`,
|
|
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
|
-
``,
|
|
82
|
-
`## Next Steps`,
|
|
83
|
-
`The host agent will now follow the PM workflow automatically.`,
|
|
84
|
-
`Start by calling \`project_status\` to see where the project stands.`,
|
|
85
|
-
].join('\n'),
|
|
86
|
-
},
|
|
87
|
-
],
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
catch (err) {
|
|
91
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
92
|
-
// Check if it's a "project not found" error
|
|
93
|
-
if (message.includes('ENOENT') || message.includes('not found')) {
|
|
94
|
-
return {
|
|
95
|
-
content: [
|
|
96
|
-
{
|
|
97
|
-
type: 'text',
|
|
98
|
-
text: `Project "${project_name}" not initialized. Call project_init first, then project_setup.`,
|
|
99
|
-
},
|
|
100
|
-
],
|
|
101
|
-
isError: true,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
content: [
|
|
106
|
-
{
|
|
107
|
-
type: 'text',
|
|
108
|
-
text: `Error: ${message}`,
|
|
109
|
-
},
|
|
110
|
-
],
|
|
111
|
-
isError: true,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
//# sourceMappingURL=setup-project.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup-project.js","sourceRoot":"","sources":["../../src/tools/setup-project.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Tool: phase_update
|
|
3
|
-
* Advance or update the status of a project phase.
|
|
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
|
|
10
|
-
*/
|
|
11
|
-
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
-
export declare function registerUpdatePhase(server: McpServer, builtinDir: string, customDir: string): void;
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Tool: phase_update
|
|
3
|
-
* Advance or update the status of a project phase.
|
|
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
|
|
10
|
-
*/
|
|
11
|
-
import { z } from 'zod';
|
|
12
|
-
import { readState, updatePhaseStatus } from '../core/state.js';
|
|
13
|
-
import { loadWorkflow } from '../core/workflow.js';
|
|
14
|
-
import { listDocs } from '../core/docs.js';
|
|
15
|
-
import { readReviews } from '../core/reviews.js';
|
|
16
|
-
import { readDispatches } from '../core/dispatch.js';
|
|
17
|
-
import { getMergedOverrides, resolveDocReview } from '../core/overrides.js';
|
|
18
|
-
import { getProject } from '../core/registry.js';
|
|
19
|
-
export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
20
|
-
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.', {
|
|
21
|
-
project_name: z.string().describe('Project name'),
|
|
22
|
-
phase_id: z.string().describe('Phase ID to update (e.g. clarify, design, develop, test, deliver)'),
|
|
23
|
-
status: z.enum(['pending', 'in_progress', 'completed', 'blocked']).describe('New status for the phase'),
|
|
24
|
-
blocked_reason: z.string().optional().describe("Reason for blocking (required when status is 'blocked')"),
|
|
25
|
-
force: z.boolean().optional().describe('Force completion even if outputs are missing (default: false)'),
|
|
26
|
-
}, async ({ project_name, phase_id, status, blocked_reason, force }) => {
|
|
27
|
-
try {
|
|
28
|
-
// Resolve current iteration
|
|
29
|
-
const entry = await getProject(project_name);
|
|
30
|
-
if (!entry || entry.currentIteration === 0) {
|
|
31
|
-
return {
|
|
32
|
-
content: [
|
|
33
|
-
{
|
|
34
|
-
type: 'text',
|
|
35
|
-
text: `项目 "${project_name}" 未找到或尚未开始迭代。请先调用 iteration_start。`,
|
|
36
|
-
},
|
|
37
|
-
],
|
|
38
|
-
isError: true,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
const iteration = entry.currentIteration;
|
|
42
|
-
// ── Completion guards ──
|
|
43
|
-
if (status === 'completed' && !force) {
|
|
44
|
-
const currentState = await readState(project_name, iteration);
|
|
45
|
-
const wf = await loadWorkflow(builtinDir, customDir, currentState.workflow);
|
|
46
|
-
const existingDocs = await listDocs(project_name, iteration);
|
|
47
|
-
const phaseDef = wf.definition.phases.find((p) => p.id === phase_id);
|
|
48
|
-
const phaseIndex = wf.definition.phases.findIndex((p) => p.id === phase_id);
|
|
49
|
-
const guardErrors = [];
|
|
50
|
-
// Guard 0: Scale must be set before completing any phase
|
|
51
|
-
if (currentState.scale === null) {
|
|
52
|
-
guardErrors.push('Scale 尚未设定。请先调用 project_set_scale 设定项目规模。');
|
|
53
|
-
}
|
|
54
|
-
// Guard 1: Prior phases must all be completed
|
|
55
|
-
if (phaseIndex > 0) {
|
|
56
|
-
const priorPhases = wf.definition.phases.slice(0, phaseIndex);
|
|
57
|
-
const incompletePriors = priorPhases.filter((pp) => {
|
|
58
|
-
const ps = currentState.phases.find((s) => s.id === pp.id);
|
|
59
|
-
return !ps || ps.status !== 'completed';
|
|
60
|
-
});
|
|
61
|
-
if (incompletePriors.length > 0) {
|
|
62
|
-
guardErrors.push(`前序阶段未完成: ${incompletePriors.map((p) => p.id).join(', ')}`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// Guard 2 & 3 require scale to be set
|
|
66
|
-
if (currentState.scale !== null && phaseDef) {
|
|
67
|
-
const scale = currentState.scale;
|
|
68
|
-
// Guard 2: Required doc outputs must exist
|
|
69
|
-
const missingDocOutputs = phaseDef.outputs.filter((o) => {
|
|
70
|
-
const docDef = wf.definition.docs[o];
|
|
71
|
-
if (!docDef)
|
|
72
|
-
return false;
|
|
73
|
-
if (docDef.external)
|
|
74
|
-
return false;
|
|
75
|
-
const scaleVal = docDef.scale[scale];
|
|
76
|
-
if (scaleVal === 'skip' || scaleVal === 'optional')
|
|
77
|
-
return false;
|
|
78
|
-
return !existingDocs.includes(o);
|
|
79
|
-
});
|
|
80
|
-
if (missingDocOutputs.length > 0) {
|
|
81
|
-
guardErrors.push(`缺少必需文档产出: ${missingDocOutputs.join(', ')}`);
|
|
82
|
-
}
|
|
83
|
-
// Guard 3: Docs requiring review must be approved
|
|
84
|
-
const overrides = await getMergedOverrides(project_name);
|
|
85
|
-
const reviews = await readReviews(project_name, iteration);
|
|
86
|
-
const unapprovedDocs = phaseDef.outputs.filter((o) => {
|
|
87
|
-
const docDef = wf.definition.docs[o];
|
|
88
|
-
if (!docDef)
|
|
89
|
-
return false;
|
|
90
|
-
if (docDef.external)
|
|
91
|
-
return false;
|
|
92
|
-
const scaleVal = docDef.scale[scale];
|
|
93
|
-
if (scaleVal === 'skip' || scaleVal === 'optional')
|
|
94
|
-
return false;
|
|
95
|
-
const needsReview = resolveDocReview(o, docDef, overrides);
|
|
96
|
-
if (!needsReview)
|
|
97
|
-
return false;
|
|
98
|
-
const reviewState = reviews[o];
|
|
99
|
-
return !reviewState || reviewState.status !== 'approved';
|
|
100
|
-
});
|
|
101
|
-
if (unapprovedDocs.length > 0) {
|
|
102
|
-
guardErrors.push(`文档待审核或未通过: ${unapprovedDocs.join(', ')}`);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
// Guard 4: No active dispatches
|
|
106
|
-
const dispatches = await readDispatches(project_name, iteration);
|
|
107
|
-
const activeDispatches = dispatches.filter((d) => d.status === 'dispatched' || d.status === 'running');
|
|
108
|
-
if (activeDispatches.length > 0) {
|
|
109
|
-
const activeList = activeDispatches.map((d) => `${d.id} (${d.role}, ${d.status})`).join(', ');
|
|
110
|
-
guardErrors.push(`存在进行中的 dispatch: ${activeList}`);
|
|
111
|
-
}
|
|
112
|
-
if (guardErrors.length > 0) {
|
|
113
|
-
return {
|
|
114
|
-
content: [
|
|
115
|
-
{
|
|
116
|
-
type: 'text',
|
|
117
|
-
text: [
|
|
118
|
-
`无法完成阶段 "${phase_id}":`,
|
|
119
|
-
'',
|
|
120
|
-
...guardErrors.map((e) => `- ${e}`),
|
|
121
|
-
'',
|
|
122
|
-
'请先解决以上问题,或使用 force=true 强制完成。',
|
|
123
|
-
].join('\n'),
|
|
124
|
-
},
|
|
125
|
-
],
|
|
126
|
-
isError: true,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
const state = await updatePhaseStatus(project_name, iteration, phase_id, status, blocked_reason);
|
|
131
|
-
const phasesSummary = state.phases
|
|
132
|
-
.map((p) => {
|
|
133
|
-
const marker = p.id === state.currentPhase ? ' <-- current' : '';
|
|
134
|
-
return ` ${p.id}: ${p.status}${p.blockedReason ? ` (${p.blockedReason})` : ''}${marker}`;
|
|
135
|
-
})
|
|
136
|
-
.join('\n');
|
|
137
|
-
return {
|
|
138
|
-
content: [
|
|
139
|
-
{
|
|
140
|
-
type: 'text',
|
|
141
|
-
text: `Phase "${phase_id}" updated to "${status}".\n\nProject phases:\n${phasesSummary}`,
|
|
142
|
-
},
|
|
143
|
-
],
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
catch (err) {
|
|
147
|
-
return {
|
|
148
|
-
content: [
|
|
149
|
-
{
|
|
150
|
-
type: 'text',
|
|
151
|
-
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
152
|
-
},
|
|
153
|
-
],
|
|
154
|
-
isError: true,
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=update-phase.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"update-phase.js","sourceRoot":"","sources":["../../src/tools/update-phase.ts"],"names":[],"mappings":"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"}
|