@s_s/harmonia 1.1.1 → 1.2.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 +413 -205
- package/build/core/dispatch.d.ts +11 -11
- package/build/core/dispatch.js +33 -33
- package/build/core/dispatch.js.map +1 -1
- package/build/core/docs.d.ts +11 -11
- package/build/core/docs.js +19 -19
- package/build/core/docs.js.map +1 -1
- package/build/core/registry.d.ts +29 -6
- package/build/core/registry.js +50 -8
- package/build/core/registry.js.map +1 -1
- package/build/core/reviews.d.ts +8 -8
- package/build/core/reviews.js +20 -20
- package/build/core/reviews.js.map +1 -1
- package/build/core/state.d.ts +12 -12
- package/build/core/state.js +24 -23
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +7 -7
- package/build/core/steps.js +19 -19
- package/build/core/steps.js.map +1 -1
- package/build/core/types.d.ts +2 -0
- package/build/index.js +30 -3
- package/build/index.js.map +1 -1
- package/build/setup/templates.js +9 -2
- package/build/setup/templates.js.map +1 -1
- package/build/tools/approve-doc.js +31 -2
- package/build/tools/approve-doc.js.map +1 -1
- package/build/tools/dispatch-role.js +19 -4
- package/build/tools/dispatch-role.js.map +1 -1
- package/build/tools/doc-tools.js +59 -16
- package/build/tools/doc-tools.js.map +1 -1
- package/build/tools/get-project-status.js +61 -15
- package/build/tools/get-project-status.js.map +1 -1
- package/build/tools/iteration-start.d.ts +13 -0
- package/build/tools/iteration-start.js +98 -0
- package/build/tools/iteration-start.js.map +1 -0
- package/build/tools/project-init.d.ts +5 -1
- package/build/tools/project-init.js +30 -14
- package/build/tools/project-init.js.map +1 -1
- package/build/tools/report-dispatch.js +30 -15
- package/build/tools/report-dispatch.js.map +1 -1
- package/build/tools/set-scale.js +18 -3
- package/build/tools/set-scale.js.map +1 -1
- package/build/tools/update-phase.js +20 -5
- package/build/tools/update-phase.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP Tool: project_init
|
|
3
|
-
*
|
|
3
|
+
* Register a new Harmonia project in the global registry.
|
|
4
|
+
*
|
|
5
|
+
* This tool ONLY registers the project — it does NOT create iteration directories
|
|
6
|
+
* or initialize state. After registration, call `iteration_start` to begin the
|
|
7
|
+
* first iteration.
|
|
4
8
|
*
|
|
5
9
|
* Supports an optional `workflow` parameter. When multiple workflows are
|
|
6
10
|
* available and none is specified, returns an error with the available list
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP Tool: project_init
|
|
3
|
-
*
|
|
3
|
+
* Register a new Harmonia project in the global registry.
|
|
4
|
+
*
|
|
5
|
+
* This tool ONLY registers the project — it does NOT create iteration directories
|
|
6
|
+
* or initialize state. After registration, call `iteration_start` to begin the
|
|
7
|
+
* first iteration.
|
|
4
8
|
*
|
|
5
9
|
* Supports an optional `workflow` parameter. When multiple workflows are
|
|
6
10
|
* available and none is specified, returns an error with the available list
|
|
@@ -8,10 +12,9 @@
|
|
|
8
12
|
*/
|
|
9
13
|
import { z } from 'zod';
|
|
10
14
|
import { loadWorkflow, listWorkflows } from '../core/workflow.js';
|
|
11
|
-
import { initProjectState, readState } from '../core/state.js';
|
|
12
15
|
import { registerProject, getProject } from '../core/registry.js';
|
|
13
16
|
export function registerProjectInit(server, builtinDir, customDir) {
|
|
14
|
-
server.tool('project_init',
|
|
17
|
+
server.tool('project_init', 'Register a new Harmonia project. Creates the project entry in the global registry and the project source directory. Does NOT start an iteration — call iteration_start after registration to begin the first iteration.', {
|
|
15
18
|
project_name: z
|
|
16
19
|
.string()
|
|
17
20
|
.regex(/^[a-z0-9][a-z0-9-]*[a-z0-9]$/, 'project_name 只允许小写字母、数字和短横线,且不能以短横线开头或结尾')
|
|
@@ -27,15 +30,32 @@ export function registerProjectInit(server, builtinDir, customDir) {
|
|
|
27
30
|
.optional()
|
|
28
31
|
.describe('工作流名称(如 dev)。只有一个可用工作流时自动选中;多个时必须指定。'),
|
|
29
32
|
}, async ({ project_name, project_dir, workflow }) => {
|
|
30
|
-
// Check if already
|
|
33
|
+
// Check if already registered
|
|
31
34
|
const existing = await getProject(project_name);
|
|
32
35
|
if (existing) {
|
|
33
|
-
const
|
|
36
|
+
const iterInfo = existing.currentIteration > 0
|
|
37
|
+
? `当前迭代: iter-${existing.currentIteration} (共 ${existing.totalIterations} 轮)`
|
|
38
|
+
: '尚未开始迭代';
|
|
34
39
|
return {
|
|
35
40
|
content: [
|
|
36
41
|
{
|
|
37
42
|
type: 'text',
|
|
38
|
-
text:
|
|
43
|
+
text: [
|
|
44
|
+
`项目 "${project_name}" 已注册。`,
|
|
45
|
+
``,
|
|
46
|
+
`源代码目录: ${existing.dir}`,
|
|
47
|
+
`工作流: ${existing.workflow}`,
|
|
48
|
+
`${iterInfo}`,
|
|
49
|
+
``,
|
|
50
|
+
existing.currentIteration > 0
|
|
51
|
+
? `如需查看当前状态,请调用 project_status(project_name="${project_name}")。`
|
|
52
|
+
: `请调用 iteration_start(project_name="${project_name}") 开始第一轮迭代。`,
|
|
53
|
+
existing.currentIteration > 0
|
|
54
|
+
? `如需开始新一轮迭代,请调用 iteration_start(project_name="${project_name}")。`
|
|
55
|
+
: '',
|
|
56
|
+
]
|
|
57
|
+
.filter(Boolean)
|
|
58
|
+
.join('\n'),
|
|
39
59
|
},
|
|
40
60
|
],
|
|
41
61
|
};
|
|
@@ -102,26 +122,22 @@ export function registerProjectInit(server, builtinDir, customDir) {
|
|
|
102
122
|
isError: true,
|
|
103
123
|
};
|
|
104
124
|
}
|
|
105
|
-
// Load workflow definition
|
|
125
|
+
// Load workflow definition (validate it loads correctly)
|
|
106
126
|
const wf = await loadWorkflow(builtinDir, customDir, workflowName);
|
|
107
|
-
// Register project (creates global data
|
|
127
|
+
// Register project (creates global data dir + project source dir)
|
|
108
128
|
await registerProject(project_name, project_dir, workflowName);
|
|
109
|
-
// Initialize project state (scale = null)
|
|
110
|
-
const state = await initProjectState(project_name, project_dir, wf);
|
|
111
129
|
return {
|
|
112
130
|
content: [
|
|
113
131
|
{
|
|
114
132
|
type: 'text',
|
|
115
133
|
text: [
|
|
116
|
-
`项目 "${project_name}"
|
|
134
|
+
`项目 "${project_name}" 注册成功。`,
|
|
117
135
|
``,
|
|
118
136
|
`源代码目录: ${project_dir}`,
|
|
119
137
|
`工作流: ${wf.definition.name} (${wf.definition.description})`,
|
|
120
|
-
`规模: (未设定)`,
|
|
121
|
-
`当前阶段: ${state.currentPhase}`,
|
|
122
138
|
`可用角色: ${Object.keys(wf.roles).join(', ')}`,
|
|
123
139
|
``,
|
|
124
|
-
`下一步:
|
|
140
|
+
`下一步: 调用 iteration_start(project_name="${project_name}") 开始第一轮迭代。`,
|
|
125
141
|
].join('\n'),
|
|
126
142
|
},
|
|
127
143
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-init.js","sourceRoot":"","sources":["../../src/tools/project-init.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"project-init.js","sourceRoot":"","sources":["../../src/tools/project-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import { getDispatch, updateDispatch, createSession, updateSession, findSessionB
|
|
|
15
15
|
import { listDocs } from '../core/docs.js';
|
|
16
16
|
import { readState } from '../core/state.js';
|
|
17
17
|
import { loadWorkflow } from '../core/workflow.js';
|
|
18
|
+
import { getProject } from '../core/registry.js';
|
|
18
19
|
export function registerReportDispatch(server, builtinDir, customDir) {
|
|
19
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.', {
|
|
20
21
|
project_name: z.string().describe('Project name'),
|
|
@@ -35,8 +36,22 @@ export function registerReportDispatch(server, builtinDir, customDir) {
|
|
|
35
36
|
note: z.string().optional().describe('Optional note (e.g. failure reason)'),
|
|
36
37
|
}, async ({ project_name, dispatch_id, status, agent_session_id, agent_type, label, note }) => {
|
|
37
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;
|
|
38
53
|
// Load the dispatch record
|
|
39
|
-
const dispatch = await getDispatch(project_name, dispatch_id);
|
|
54
|
+
const dispatch = await getDispatch(project_name, iteration, dispatch_id);
|
|
40
55
|
if (!dispatch) {
|
|
41
56
|
return {
|
|
42
57
|
content: [
|
|
@@ -68,7 +83,7 @@ export function registerReportDispatch(server, builtinDir, customDir) {
|
|
|
68
83
|
// Handle session registration (when agent_session_id is provided)
|
|
69
84
|
let session = null;
|
|
70
85
|
if (agent_session_id) {
|
|
71
|
-
session = await resolveOrCreateSession(project_name, dispatch, agent_session_id, agent_type, label);
|
|
86
|
+
session = await resolveOrCreateSession(project_name, iteration, dispatch, agent_session_id, agent_type, label);
|
|
72
87
|
results.push(`Session: ${session.id} (agent: ${agent_session_id}, status: ${session.status})`);
|
|
73
88
|
}
|
|
74
89
|
// Handle status transitions
|
|
@@ -76,7 +91,7 @@ export function registerReportDispatch(server, builtinDir, customDir) {
|
|
|
76
91
|
effectiveStatus === 'failed' ||
|
|
77
92
|
effectiveStatus === 'cancelled') {
|
|
78
93
|
// Terminal states: update dispatch and transition session
|
|
79
|
-
await updateDispatch(project_name, dispatch_id, {
|
|
94
|
+
await updateDispatch(project_name, iteration, dispatch_id, {
|
|
80
95
|
status: effectiveStatus,
|
|
81
96
|
...(session ? { sessionId: session.id } : {}),
|
|
82
97
|
...(note ? { note } : {}),
|
|
@@ -85,14 +100,14 @@ export function registerReportDispatch(server, builtinDir, customDir) {
|
|
|
85
100
|
const sessionId = session?.id ?? dispatch.sessionId;
|
|
86
101
|
if (sessionId) {
|
|
87
102
|
const newSessionStatus = effectiveStatus === 'completed' ? 'idle' : 'lost';
|
|
88
|
-
await updateSession(project_name, sessionId, { status: newSessionStatus });
|
|
103
|
+
await updateSession(project_name, iteration, sessionId, { status: newSessionStatus });
|
|
89
104
|
results.push(`Session ${sessionId} → ${newSessionStatus}`);
|
|
90
105
|
}
|
|
91
106
|
results.push(`Dispatch ${dispatch_id} → ${effectiveStatus}`);
|
|
92
107
|
}
|
|
93
108
|
else {
|
|
94
109
|
// Running: update dispatch status + associate session
|
|
95
|
-
await updateDispatch(project_name, dispatch_id, {
|
|
110
|
+
await updateDispatch(project_name, iteration, dispatch_id, {
|
|
96
111
|
status: 'running',
|
|
97
112
|
...(session ? { sessionId: session.id } : {}),
|
|
98
113
|
...(note ? { note } : {}),
|
|
@@ -100,14 +115,14 @@ export function registerReportDispatch(server, builtinDir, customDir) {
|
|
|
100
115
|
// Mark session as active
|
|
101
116
|
const sessionId = session?.id ?? dispatch.sessionId;
|
|
102
117
|
if (sessionId) {
|
|
103
|
-
await updateSession(project_name, sessionId, { status: 'active' });
|
|
118
|
+
await updateSession(project_name, iteration, sessionId, { status: 'active' });
|
|
104
119
|
}
|
|
105
120
|
results.push(`Dispatch ${dispatch_id} → running`);
|
|
106
121
|
}
|
|
107
122
|
// Completion check: warn if expectedOutputs are missing
|
|
108
123
|
if (effectiveStatus === 'completed' && dispatch.expectedOutputs.length > 0) {
|
|
109
|
-
const existingDocs = await listDocs(project_name);
|
|
110
|
-
const state = await readState(project_name);
|
|
124
|
+
const existingDocs = await listDocs(project_name, iteration);
|
|
125
|
+
const state = await readState(project_name, iteration);
|
|
111
126
|
const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
|
|
112
127
|
const missingOutputs = dispatch.expectedOutputs.filter((docId) => {
|
|
113
128
|
const docDef = wf.definition.docs[docId];
|
|
@@ -149,13 +164,13 @@ export function registerReportDispatch(server, builtinDir, customDir) {
|
|
|
149
164
|
/**
|
|
150
165
|
* Resolve an existing session by agent session ID, or create a new one.
|
|
151
166
|
*/
|
|
152
|
-
async function resolveOrCreateSession(projectName, dispatch, agentSessionId, agentType, label) {
|
|
167
|
+
async function resolveOrCreateSession(projectName, iteration, dispatch, agentSessionId, agentType, label) {
|
|
153
168
|
// If the dispatch already has a session, update it with the agent session ID
|
|
154
169
|
if (dispatch.sessionId) {
|
|
155
|
-
const sessions = await readSessions(projectName);
|
|
170
|
+
const sessions = await readSessions(projectName, iteration);
|
|
156
171
|
const existing = sessions.find((s) => s.id === dispatch.sessionId);
|
|
157
172
|
if (existing) {
|
|
158
|
-
return await updateSession(projectName, existing.id, {
|
|
173
|
+
return await updateSession(projectName, iteration, existing.id, {
|
|
159
174
|
agentSessionId,
|
|
160
175
|
...(agentType ? { agentType } : {}),
|
|
161
176
|
...(label ? { label } : {}),
|
|
@@ -164,16 +179,16 @@ async function resolveOrCreateSession(projectName, dispatch, agentSessionId, age
|
|
|
164
179
|
}
|
|
165
180
|
}
|
|
166
181
|
// Check if a session with this agent session ID already exists for this role
|
|
167
|
-
const existingByAgent = await findSessionByAgentId(projectName, dispatch.role, agentSessionId);
|
|
182
|
+
const existingByAgent = await findSessionByAgentId(projectName, iteration, dispatch.role, agentSessionId);
|
|
168
183
|
if (existingByAgent) {
|
|
169
|
-
return await updateSession(projectName, existingByAgent.id, {
|
|
184
|
+
return await updateSession(projectName, iteration, existingByAgent.id, {
|
|
170
185
|
status: 'active',
|
|
171
186
|
...(agentType ? { agentType } : {}),
|
|
172
187
|
...(label ? { label } : {}),
|
|
173
188
|
});
|
|
174
189
|
}
|
|
175
190
|
// Create a new session
|
|
176
|
-
const session = await createSession(projectName, dispatch.role, agentType, label);
|
|
177
|
-
return await updateSession(projectName, session.id, { agentSessionId });
|
|
191
|
+
const session = await createSession(projectName, iteration, dispatch.role, agentType, label);
|
|
192
|
+
return await updateSession(projectName, iteration, session.id, { agentSessionId });
|
|
178
193
|
}
|
|
179
194
|
//# sourceMappingURL=report-dispatch.js.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"file":"report-dispatch.js","sourceRoot":"","sources":["../../src/tools/report-dispatch.ts"],"names":[],"mappings":"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"}
|
package/build/tools/set-scale.js
CHANGED
|
@@ -6,14 +6,29 @@ import { z } from 'zod';
|
|
|
6
6
|
import { readState, setScale } from '../core/state.js';
|
|
7
7
|
import { loadWorkflow } from '../core/workflow.js';
|
|
8
8
|
import { readReviews } from '../core/reviews.js';
|
|
9
|
+
import { getProject } from '../core/registry.js';
|
|
9
10
|
export function registerSetScale(server, builtinDir, customDir) {
|
|
10
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.', {
|
|
11
12
|
project_name: z.string().describe('项目名称'),
|
|
12
13
|
scale: z.enum(['small', 'medium', 'large']).describe('项目规模 (small/medium/large)'),
|
|
13
14
|
}, async ({ project_name, scale }) => {
|
|
14
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;
|
|
15
30
|
// Check project exists
|
|
16
|
-
const state = await readState(project_name);
|
|
31
|
+
const state = await readState(project_name, iteration);
|
|
17
32
|
// Guard: scale already set
|
|
18
33
|
if (state.scale !== null) {
|
|
19
34
|
return {
|
|
@@ -27,7 +42,7 @@ export function registerSetScale(server, builtinDir, customDir) {
|
|
|
27
42
|
};
|
|
28
43
|
}
|
|
29
44
|
// Guard: PRD must be approved
|
|
30
|
-
const reviews = await readReviews(project_name);
|
|
45
|
+
const reviews = await readReviews(project_name, iteration);
|
|
31
46
|
const prdReview = reviews['prd'];
|
|
32
47
|
if (!prdReview || prdReview.status !== 'approved') {
|
|
33
48
|
const prdStatus = prdReview ? prdReview.status : '未提交';
|
|
@@ -42,7 +57,7 @@ export function registerSetScale(server, builtinDir, customDir) {
|
|
|
42
57
|
};
|
|
43
58
|
}
|
|
44
59
|
// Set scale
|
|
45
|
-
const updated = await setScale(project_name, scale);
|
|
60
|
+
const updated = await setScale(project_name, iteration, scale);
|
|
46
61
|
// Build doc list based on scale
|
|
47
62
|
const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
|
|
48
63
|
const requiredDocs = Object.entries(wf.definition.docs)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-scale.js","sourceRoot":"","sources":["../../src/tools/set-scale.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,UAAkB,EAAE,SAAiB;IACrF,MAAM,CAAC,IAAI,CACP,mBAAmB,EACnB,mPAAmP,EACnP;QACI,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACzC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;KACpF,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE;QAC9B,IAAI,CAAC;YACD,uBAAuB;YACvB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"set-scale.js","sourceRoot":"","sources":["../../src/tools/set-scale.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import { listDocs } from '../core/docs.js';
|
|
|
15
15
|
import { readReviews } from '../core/reviews.js';
|
|
16
16
|
import { readDispatches } from '../core/dispatch.js';
|
|
17
17
|
import { getMergedOverrides, resolveDocReview } from '../core/overrides.js';
|
|
18
|
+
import { getProject } from '../core/registry.js';
|
|
18
19
|
export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
19
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.', {
|
|
20
21
|
project_name: z.string().describe('Project name'),
|
|
@@ -24,11 +25,25 @@ export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
|
24
25
|
force: z.boolean().optional().describe('Force completion even if outputs are missing (default: false)'),
|
|
25
26
|
}, async ({ project_name, phase_id, status, blocked_reason, force }) => {
|
|
26
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;
|
|
27
42
|
// ── Completion guards ──
|
|
28
43
|
if (status === 'completed' && !force) {
|
|
29
|
-
const currentState = await readState(project_name);
|
|
44
|
+
const currentState = await readState(project_name, iteration);
|
|
30
45
|
const wf = await loadWorkflow(builtinDir, customDir, currentState.workflow);
|
|
31
|
-
const existingDocs = await listDocs(project_name);
|
|
46
|
+
const existingDocs = await listDocs(project_name, iteration);
|
|
32
47
|
const phaseDef = wf.definition.phases.find((p) => p.id === phase_id);
|
|
33
48
|
const phaseIndex = wf.definition.phases.findIndex((p) => p.id === phase_id);
|
|
34
49
|
const guardErrors = [];
|
|
@@ -67,7 +82,7 @@ export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
|
67
82
|
}
|
|
68
83
|
// Guard 3: Docs requiring review must be approved
|
|
69
84
|
const overrides = await getMergedOverrides(project_name);
|
|
70
|
-
const reviews = await readReviews(project_name);
|
|
85
|
+
const reviews = await readReviews(project_name, iteration);
|
|
71
86
|
const unapprovedDocs = phaseDef.outputs.filter((o) => {
|
|
72
87
|
const docDef = wf.definition.docs[o];
|
|
73
88
|
if (!docDef)
|
|
@@ -88,7 +103,7 @@ export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
|
88
103
|
}
|
|
89
104
|
}
|
|
90
105
|
// Guard 4: No active dispatches
|
|
91
|
-
const dispatches = await readDispatches(project_name);
|
|
106
|
+
const dispatches = await readDispatches(project_name, iteration);
|
|
92
107
|
const activeDispatches = dispatches.filter((d) => d.status === 'dispatched' || d.status === 'running');
|
|
93
108
|
if (activeDispatches.length > 0) {
|
|
94
109
|
const activeList = activeDispatches.map((d) => `${d.id} (${d.role}, ${d.status})`).join(', ');
|
|
@@ -112,7 +127,7 @@ export function registerUpdatePhase(server, builtinDir, customDir) {
|
|
|
112
127
|
};
|
|
113
128
|
}
|
|
114
129
|
}
|
|
115
|
-
const state = await updatePhaseStatus(project_name, phase_id, status, blocked_reason);
|
|
130
|
+
const state = await updatePhaseStatus(project_name, iteration, phase_id, status, blocked_reason);
|
|
116
131
|
const phasesSummary = state.phases
|
|
117
132
|
.map((p) => {
|
|
118
133
|
const marker = p.id === state.currentPhase ? ' <-- current' : '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-phase.js","sourceRoot":"","sources":["../../src/tools/update-phase.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"update-phase.js","sourceRoot":"","sources":["../../src/tools/update-phase.ts"],"names":[],"mappings":"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"}
|