@s_s/harmonia 1.2.0 → 1.3.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/build/core/dispatch.d.ts +14 -11
- package/build/core/dispatch.js +37 -32
- package/build/core/dispatch.js.map +1 -1
- package/build/core/docs.d.ts +15 -11
- package/build/core/docs.js +23 -18
- package/build/core/docs.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/registry.d.ts +34 -0
- package/build/core/registry.js +59 -0
- package/build/core/registry.js.map +1 -1
- package/build/core/reviews.d.ts +9 -8
- package/build/core/reviews.js +21 -19
- package/build/core/reviews.js.map +1 -1
- package/build/core/state.d.ts +22 -14
- package/build/core/state.js +52 -30
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +8 -7
- package/build/core/steps.js +20 -18
- package/build/core/steps.js.map +1 -1
- package/build/core/types.d.ts +31 -2
- package/build/index.js +4 -0
- package/build/index.js.map +1 -1
- package/build/setup/templates.js +70 -1
- package/build/setup/templates.js.map +1 -1
- package/build/tools/approve-doc.js +9 -31
- package/build/tools/approve-doc.js.map +1 -1
- package/build/tools/dispatch-role.js +8 -19
- package/build/tools/dispatch-role.js.map +1 -1
- package/build/tools/doc-tools.js +98 -62
- package/build/tools/doc-tools.js.map +1 -1
- package/build/tools/get-project-status.js +69 -24
- package/build/tools/get-project-status.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.js +9 -4
- package/build/tools/iteration-start.js.map +1 -1
- package/build/tools/patch-start.d.ts +14 -0
- package/build/tools/patch-start.js +97 -0
- package/build/tools/patch-start.js.map +1 -0
- package/build/tools/project-init.js +6 -8
- package/build/tools/project-init.js.map +1 -1
- package/build/tools/report-dispatch.js +21 -32
- package/build/tools/report-dispatch.js.map +1 -1
- package/build/tools/set-scale.js +7 -19
- package/build/tools/set-scale.js.map +1 -1
- package/build/tools/update-phase.js +11 -22
- package/build/tools/update-phase.js.map +1 -1
- package/build/tools/utils.d.ts +34 -0
- package/build/tools/utils.js +61 -0
- package/build/tools/utils.js.map +1 -0
- package/package.json +1 -1
package/build/core/steps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/core/steps.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/core/steps.ts"],"names":[],"mappings":"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"}
|
package/build/core/types.d.ts
CHANGED
|
@@ -116,8 +116,9 @@ export interface LoadedWorkflow {
|
|
|
116
116
|
definition: WorkflowDefinition;
|
|
117
117
|
roles: Record<string, RoleDefinition>;
|
|
118
118
|
}
|
|
119
|
-
export type PhaseStatus = 'pending' | 'in_progress' | 'completed' | 'blocked' | 'review';
|
|
119
|
+
export type PhaseStatus = 'pending' | 'in_progress' | 'completed' | 'blocked' | 'review' | 'skipped';
|
|
120
120
|
export type ProjectScale = 'small' | 'medium' | 'large';
|
|
121
|
+
export type ContextType = 'iteration' | 'patch';
|
|
121
122
|
export interface PhaseState {
|
|
122
123
|
id: string;
|
|
123
124
|
status: PhaseStatus;
|
|
@@ -132,7 +133,9 @@ export interface ProjectState {
|
|
|
132
133
|
projectDir: string;
|
|
133
134
|
/** Workflow name, e.g. "dev" */
|
|
134
135
|
workflow: string;
|
|
135
|
-
/**
|
|
136
|
+
/** Context type: "iteration" for full iterations, "patch" for lightweight patches */
|
|
137
|
+
type: ContextType;
|
|
138
|
+
/** Iteration or patch number this state belongs to */
|
|
136
139
|
iteration: number;
|
|
137
140
|
/** Project scale determined by PM (null until set via project_set_scale) */
|
|
138
141
|
scale: ProjectScale | null;
|
|
@@ -258,3 +261,29 @@ export interface DocStepState {
|
|
|
258
261
|
/** Finalized at timestamp */
|
|
259
262
|
finalizedAt?: string;
|
|
260
263
|
}
|
|
264
|
+
export type IssueStatus = 'open' | 'closed';
|
|
265
|
+
export type IssueSource = 'test' | 'user-feedback';
|
|
266
|
+
export interface IssueResolvedBy {
|
|
267
|
+
type: ContextType;
|
|
268
|
+
number: number;
|
|
269
|
+
}
|
|
270
|
+
export interface Issue {
|
|
271
|
+
/** Auto-generated ID, e.g. "issue-1" */
|
|
272
|
+
id: string;
|
|
273
|
+
/** Short title */
|
|
274
|
+
title: string;
|
|
275
|
+
/** Detailed description */
|
|
276
|
+
description: string;
|
|
277
|
+
/** Where this issue was discovered */
|
|
278
|
+
source: IssueSource;
|
|
279
|
+
/** Which iteration this issue relates to */
|
|
280
|
+
iteration: number;
|
|
281
|
+
/** How this issue was resolved (set when closing) */
|
|
282
|
+
resolvedBy?: IssueResolvedBy;
|
|
283
|
+
/** Current status */
|
|
284
|
+
status: IssueStatus;
|
|
285
|
+
/** When this issue was created */
|
|
286
|
+
createdAt: string;
|
|
287
|
+
/** When this issue was closed */
|
|
288
|
+
closedAt?: string;
|
|
289
|
+
}
|
package/build/index.js
CHANGED
|
@@ -97,6 +97,8 @@ else {
|
|
|
97
97
|
const { registerOverrideTools } = await import('./tools/override-tools.js');
|
|
98
98
|
const { registerDispatchRole } = await import('./tools/dispatch-role.js');
|
|
99
99
|
const { registerReportDispatch } = await import('./tools/report-dispatch.js');
|
|
100
|
+
const { registerPatchStart } = await import('./tools/patch-start.js');
|
|
101
|
+
const { registerIssueTools } = await import('./tools/issue-tools.js');
|
|
100
102
|
// Custom workflows directory: <data_dir>/.workflows
|
|
101
103
|
const CUSTOM_WORKFLOWS_DIR = join(getGlobalDir(), '.workflows');
|
|
102
104
|
const server = new McpServer({
|
|
@@ -115,6 +117,8 @@ else {
|
|
|
115
117
|
registerOverrideTools(server);
|
|
116
118
|
registerDispatchRole(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
117
119
|
registerReportDispatch(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
120
|
+
registerPatchStart(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
121
|
+
registerIssueTools(server);
|
|
118
122
|
// Connect via stdio
|
|
119
123
|
const transport = new StdioServerTransport();
|
|
120
124
|
await server.connect(transport);
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/setup/templates.js
CHANGED
|
@@ -162,6 +162,75 @@ When \`doc_write\` returns "REVIEW REQUIRED":
|
|
|
162
162
|
1. **Always check status first** — start each session with \`project_status()\` to understand where you are
|
|
163
163
|
2. **Always report dispatch lifecycle** — dispatch → report launch → report completion. Never skip dispatch_report.
|
|
164
164
|
3. **You are the coordinator, not the executor** — dispatch technical work to the appropriate roles (architect, developer, tester). Harmonia enforces this via hooks and guards.
|
|
165
|
-
4. **Always check scale** — use \`project_status(project_name)\` to check scale before deciding which documents to produce
|
|
165
|
+
4. **Always check scale** — use \`project_status(project_name)\` to check scale before deciding which documents to produce
|
|
166
|
+
|
|
167
|
+
### Patch Workflow
|
|
168
|
+
|
|
169
|
+
Patches are lightweight fix cycles for bug fixes and small improvements. Unlike full iterations, patches skip the clarify and design phases, and scale is fixed to small.
|
|
170
|
+
|
|
171
|
+
#### When to Use Patches
|
|
172
|
+
|
|
173
|
+
- Bug fixes found during testing or user feedback
|
|
174
|
+
- Small improvements that don't need full requirements/design
|
|
175
|
+
- Issues tracked via \`issue_create\`
|
|
176
|
+
|
|
177
|
+
#### Starting a Patch
|
|
178
|
+
|
|
179
|
+
\`\`\`
|
|
180
|
+
patch_start(project_name, description="fix login timeout", issue_id="issue-1")
|
|
181
|
+
\`\`\`
|
|
182
|
+
|
|
183
|
+
This:
|
|
184
|
+
- Creates a \`patch-N/\` directory
|
|
185
|
+
- Skips clarify and design phases
|
|
186
|
+
- Sets scale to small
|
|
187
|
+
- Switches the active context to the patch
|
|
188
|
+
|
|
189
|
+
#### Patch Phases
|
|
190
|
+
|
|
191
|
+
Patches start directly at the develop phase:
|
|
192
|
+
1. **develop** — Fix the issue, write code
|
|
193
|
+
2. **test** — Verify the fix
|
|
194
|
+
3. **deliver** — Close out the patch
|
|
195
|
+
|
|
196
|
+
#### After Patch Completion
|
|
197
|
+
|
|
198
|
+
- Close the related issue: \`issue_update(project_name, issue_id, status="closed", resolved_by_type="patch", resolved_by_number=N)\`
|
|
199
|
+
- Start another patch or switch back to iteration with \`iteration_start\`
|
|
200
|
+
|
|
201
|
+
### Issue Management
|
|
202
|
+
|
|
203
|
+
Issues track problems discovered during testing or from user feedback. They exist at the project level (not per-iteration).
|
|
204
|
+
|
|
205
|
+
#### Creating Issues
|
|
206
|
+
|
|
207
|
+
\`\`\`
|
|
208
|
+
issue_create(project_name, title="Login timeout on slow networks", description="...", source="test", iteration=1)
|
|
209
|
+
\`\`\`
|
|
210
|
+
|
|
211
|
+
Sources: \`test\` (found during testing) or \`user-feedback\` (reported by users).
|
|
212
|
+
|
|
213
|
+
#### Tracking Issues
|
|
214
|
+
|
|
215
|
+
- \`issue_list(project_name)\` — View all issues
|
|
216
|
+
- \`issue_list(project_name, status="open")\` — View open issues only
|
|
217
|
+
- \`issue_update(project_name, issue_id, status="closed", resolved_by_type="patch", resolved_by_number=1)\` — Close with resolution
|
|
218
|
+
|
|
219
|
+
#### Workflow Integration
|
|
220
|
+
|
|
221
|
+
- \`project_status\` shows open issue count and suggests \`patch_start\` when there are unresolved issues
|
|
222
|
+
- When testing reveals bugs, use \`issue_create\` to track them
|
|
223
|
+
- Use \`patch_start\` with \`issue_id\` to link patches to issues
|
|
224
|
+
|
|
225
|
+
### Cross-Context Document Access
|
|
226
|
+
|
|
227
|
+
Use the optional \`context\` parameter on \`doc_read\` and \`doc_list\` to access documents from any iteration or patch:
|
|
228
|
+
|
|
229
|
+
\`\`\`
|
|
230
|
+
doc_read(project_name, "prd", context="iter-1") // Read PRD from iteration 1
|
|
231
|
+
doc_list(project_name, context="patch-2") // List docs from patch 2
|
|
232
|
+
\`\`\`
|
|
233
|
+
|
|
234
|
+
This is useful when working in a patch but needing to reference the original iteration's documents.`;
|
|
166
235
|
}
|
|
167
236
|
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/setup/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC5B,OAAO
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/setup/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oGAwNyF,CAAC;AACrG,CAAC"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { resolveReview, getPendingReviews } from '../core/reviews.js';
|
|
7
|
-
import {
|
|
7
|
+
import { resolveActive, isError } from './utils.js';
|
|
8
8
|
export function registerApproveDoc(server) {
|
|
9
9
|
server.tool('doc_approve', 'Approve or reject a document pending review. Call this after the user has reviewed the document and confirmed (or requested changes).', {
|
|
10
10
|
project_name: z.string().describe('Project name'),
|
|
@@ -13,22 +13,11 @@ export function registerApproveDoc(server) {
|
|
|
13
13
|
comment: z.string().optional().describe('Optional comment — user feedback or reason for rejection'),
|
|
14
14
|
}, async ({ project_name, doc_id, approved, comment }) => {
|
|
15
15
|
try {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return {
|
|
20
|
-
content: [
|
|
21
|
-
{
|
|
22
|
-
type: 'text',
|
|
23
|
-
text: `项目 "${project_name}" 未找到或尚未开始迭代。`,
|
|
24
|
-
},
|
|
25
|
-
],
|
|
26
|
-
isError: true,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
const iteration = entry.currentIteration;
|
|
16
|
+
const ctx = await resolveActive(project_name);
|
|
17
|
+
if (isError(ctx))
|
|
18
|
+
return ctx;
|
|
30
19
|
const status = approved ? 'approved' : 'rejected';
|
|
31
|
-
const review = await resolveReview(project_name,
|
|
20
|
+
const review = await resolveReview(project_name, ctx.number, doc_id, status, comment);
|
|
32
21
|
if (approved) {
|
|
33
22
|
return {
|
|
34
23
|
content: [
|
|
@@ -69,21 +58,10 @@ export function registerApproveDoc(server) {
|
|
|
69
58
|
server.tool('review_list', 'List all documents currently pending user review.', {
|
|
70
59
|
project_name: z.string().describe('Project name'),
|
|
71
60
|
}, async ({ project_name }) => {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
content: [
|
|
77
|
-
{
|
|
78
|
-
type: 'text',
|
|
79
|
-
text: `项目 "${project_name}" 未找到或尚未开始迭代。`,
|
|
80
|
-
},
|
|
81
|
-
],
|
|
82
|
-
isError: true,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
const iteration = entry.currentIteration;
|
|
86
|
-
const pending = await getPendingReviews(project_name, iteration);
|
|
61
|
+
const ctx = await resolveActive(project_name);
|
|
62
|
+
if (isError(ctx))
|
|
63
|
+
return ctx;
|
|
64
|
+
const pending = await getPendingReviews(project_name, ctx.number);
|
|
87
65
|
if (pending.length === 0) {
|
|
88
66
|
return {
|
|
89
67
|
content: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve-doc.js","sourceRoot":"","sources":["../../src/tools/approve-doc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"approve-doc.js","sourceRoot":"","sources":["../../src/tools/approve-doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ import { readState } from '../core/state.js';
|
|
|
18
18
|
import { readDoc } from '../core/docs.js';
|
|
19
19
|
import { getMergedOverrides, resolveRoleConfig } from '../core/overrides.js';
|
|
20
20
|
import { createDispatch, findIdleSession } from '../core/dispatch.js';
|
|
21
|
-
import {
|
|
21
|
+
import { resolveActive, isError } from './utils.js';
|
|
22
22
|
/**
|
|
23
23
|
* Build override instructions to inject into the role prompt.
|
|
24
24
|
*/
|
|
@@ -95,22 +95,11 @@ export function registerDispatchRole(server, builtinDir, customDir) {
|
|
|
95
95
|
.describe("Document IDs to include as input for the team member. If not specified, automatically uses the current phase's input docs."),
|
|
96
96
|
}, async ({ project_name, role, task_brief, input_doc_ids }) => {
|
|
97
97
|
try {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
content: [
|
|
103
|
-
{
|
|
104
|
-
type: 'text',
|
|
105
|
-
text: `项目 "${project_name}" 未找到或尚未开始迭代。请先调用 iteration_start。`,
|
|
106
|
-
},
|
|
107
|
-
],
|
|
108
|
-
isError: true,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
const iteration = entry.currentIteration;
|
|
98
|
+
const ctx = await resolveActive(project_name);
|
|
99
|
+
if (isError(ctx))
|
|
100
|
+
return ctx;
|
|
112
101
|
// Load project state and workflow
|
|
113
|
-
const state = await readState(project_name,
|
|
102
|
+
const state = await readState(project_name, ctx.number, ctx.dir);
|
|
114
103
|
const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
|
|
115
104
|
// Validate role exists
|
|
116
105
|
const roleDef = wf.roles[role];
|
|
@@ -169,7 +158,7 @@ export function registerDispatchRole(server, builtinDir, customDir) {
|
|
|
169
158
|
if (docDef?.external)
|
|
170
159
|
continue; // external outputs not stored as docs
|
|
171
160
|
try {
|
|
172
|
-
inputDocs[docId] = await readDoc(project_name,
|
|
161
|
+
inputDocs[docId] = await readDoc(project_name, ctx.number, docId, ctx.dir);
|
|
173
162
|
}
|
|
174
163
|
catch {
|
|
175
164
|
missingDocs.push(docId);
|
|
@@ -180,9 +169,9 @@ export function registerDispatchRole(server, builtinDir, customDir) {
|
|
|
180
169
|
// Resolve expected outputs for this dispatch
|
|
181
170
|
const expectedOutputs = resolveExpectedOutputs(currentPhase, wf.definition, state.scale);
|
|
182
171
|
// Check for reusable idle session
|
|
183
|
-
const idleSession = await findIdleSession(project_name,
|
|
172
|
+
const idleSession = await findIdleSession(project_name, ctx.number, role, ctx.dir);
|
|
184
173
|
// Create dispatch record
|
|
185
|
-
const dispatch = await createDispatch(project_name,
|
|
174
|
+
const dispatch = await createDispatch(project_name, ctx.number, role, task_brief, expectedOutputs, idleSession?.id, ctx.dir);
|
|
186
175
|
// Build session guidance
|
|
187
176
|
const sessionGuidance = buildSessionGuidance(idleSession, roleDef.frontmatter.session, roleConfig.agent);
|
|
188
177
|
// Build human-readable summary for the agent
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch-role.js","sourceRoot":"","sources":["../../src/tools/dispatch-role.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"dispatch-role.js","sourceRoot":"","sources":["../../src/tools/dispatch-role.ts"],"names":[],"mappings":"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"}
|
package/build/tools/doc-tools.js
CHANGED
|
@@ -20,7 +20,8 @@ import { getMergedOverrides, resolveDocReview } from '../core/overrides.js';
|
|
|
20
20
|
import { submitForReview } from '../core/reviews.js';
|
|
21
21
|
import { loadDocSchema, validateDoc, formatValidationErrors } from '../core/schema.js';
|
|
22
22
|
import { getDocStepState, getCompletedStepIds, recordStepCompletion, markFinalized } from '../core/steps.js';
|
|
23
|
-
import {
|
|
23
|
+
import { resolveActive, isError } from './utils.js';
|
|
24
|
+
import { getProject, resolveContextDir } from '../core/registry.js';
|
|
24
25
|
/** Scales that activate sequential mode (medium and above) */
|
|
25
26
|
const SEQUENTIAL_SCALES = new Set(['medium', 'large']);
|
|
26
27
|
/**
|
|
@@ -42,22 +43,11 @@ export function registerDocTools(server, builtinDir, customDir) {
|
|
|
42
43
|
.optional()
|
|
43
44
|
.describe('Sequential step ID (required for docs with steps at medium/large scale). Use project_status to see available steps.'),
|
|
44
45
|
}, async ({ project_name, doc_id, content, step }) => {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return {
|
|
49
|
-
content: [
|
|
50
|
-
{
|
|
51
|
-
type: 'text',
|
|
52
|
-
text: `项目 "${project_name}" 未找到或尚未开始迭代。请先调用 iteration_start。`,
|
|
53
|
-
},
|
|
54
|
-
],
|
|
55
|
-
isError: true,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
const iteration = entry.currentIteration;
|
|
46
|
+
const ctx = await resolveActive(project_name);
|
|
47
|
+
if (isError(ctx))
|
|
48
|
+
return ctx;
|
|
59
49
|
// Load workflow to get doc definition (format, review defaults)
|
|
60
|
-
const state = await readState(project_name,
|
|
50
|
+
const state = await readState(project_name, ctx.number, ctx.dir);
|
|
61
51
|
const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
|
|
62
52
|
const docDef = wf.definition.docs[doc_id];
|
|
63
53
|
const isHtml = docDef?.format === 'html';
|
|
@@ -102,7 +92,7 @@ export function registerDocTools(server, builtinDir, customDir) {
|
|
|
102
92
|
}
|
|
103
93
|
// ─── Sequential Mode ───
|
|
104
94
|
if (isSequentialActive(docDef, state.scale)) {
|
|
105
|
-
return handleSequentialWrite(builtinDir, customDir, state.workflow, project_name,
|
|
95
|
+
return handleSequentialWrite(builtinDir, customDir, state.workflow, project_name, ctx.number, doc_id, content, step, docDef, state.scale, ctx.dir);
|
|
106
96
|
}
|
|
107
97
|
// ─── Normal Mode (no steps or small scale) ───
|
|
108
98
|
// If step was passed but sequential is not active, warn but proceed
|
|
@@ -126,12 +116,12 @@ export function registerDocTools(server, builtinDir, customDir) {
|
|
|
126
116
|
}
|
|
127
117
|
}
|
|
128
118
|
// Write the document with correct extension
|
|
129
|
-
const filePath = await writeDoc(project_name,
|
|
119
|
+
const filePath = await writeDoc(project_name, ctx.number, doc_id, content, docDef, ctx.dir);
|
|
130
120
|
// Check if review is required
|
|
131
121
|
const overrides = await getMergedOverrides(project_name);
|
|
132
122
|
const needsReview = docDef ? resolveDocReview(doc_id, docDef, overrides) : false;
|
|
133
123
|
if (needsReview) {
|
|
134
|
-
await submitForReview(project_name,
|
|
124
|
+
await submitForReview(project_name, ctx.number, doc_id, ctx.dir);
|
|
135
125
|
const docName = docDef?.name ?? doc_id;
|
|
136
126
|
return {
|
|
137
127
|
content: [
|
|
@@ -159,26 +149,50 @@ export function registerDocTools(server, builtinDir, customDir) {
|
|
|
159
149
|
],
|
|
160
150
|
};
|
|
161
151
|
});
|
|
162
|
-
server.tool('doc_read', 'Read a project document from the
|
|
152
|
+
server.tool('doc_read', 'Read a project document. By default reads from the active context. Use the optional `context` parameter (e.g. "iter-1", "patch-2") to read from a different context.', {
|
|
163
153
|
project_name: z.string().describe('Project name'),
|
|
164
154
|
doc_id: z.string().describe('Document ID to read'),
|
|
165
|
-
|
|
155
|
+
context: z
|
|
156
|
+
.string()
|
|
157
|
+
.optional()
|
|
158
|
+
.describe('Context to read from (e.g. "iter-1", "patch-2"). Defaults to active context.'),
|
|
159
|
+
}, async ({ project_name, doc_id, context }) => {
|
|
166
160
|
try {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if (
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
161
|
+
let contextNumber;
|
|
162
|
+
let contextDir;
|
|
163
|
+
if (context) {
|
|
164
|
+
// Cross-context read: resolve the specified context
|
|
165
|
+
const entry = await getProject(project_name);
|
|
166
|
+
if (!entry) {
|
|
167
|
+
return {
|
|
168
|
+
content: [{ type: 'text', text: `项目 "${project_name}" 未注册。` }],
|
|
169
|
+
isError: true,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const resolved = resolveContextDir(project_name, context);
|
|
173
|
+
if (!resolved) {
|
|
174
|
+
return {
|
|
175
|
+
content: [
|
|
176
|
+
{
|
|
177
|
+
type: 'text',
|
|
178
|
+
text: `无法解析上下文 "${context}"。格式示例: iter-1, patch-2`,
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
isError: true,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
contextNumber = resolved.number;
|
|
185
|
+
contextDir = resolved.dir;
|
|
179
186
|
}
|
|
180
|
-
|
|
181
|
-
|
|
187
|
+
else {
|
|
188
|
+
// Default: active context
|
|
189
|
+
const ctx = await resolveActive(project_name);
|
|
190
|
+
if (isError(ctx))
|
|
191
|
+
return ctx;
|
|
192
|
+
contextNumber = ctx.number;
|
|
193
|
+
contextDir = ctx.dir;
|
|
194
|
+
}
|
|
195
|
+
const docContent = await readDoc(project_name, contextNumber, doc_id, contextDir);
|
|
182
196
|
return {
|
|
183
197
|
content: [
|
|
184
198
|
{
|
|
@@ -200,37 +214,59 @@ export function registerDocTools(server, builtinDir, customDir) {
|
|
|
200
214
|
};
|
|
201
215
|
}
|
|
202
216
|
});
|
|
203
|
-
server.tool('doc_list', 'List all project documents
|
|
217
|
+
server.tool('doc_list', 'List all project documents. By default lists from the active context. Use the optional `context` parameter (e.g. "iter-1", "patch-2") to list from a different context.', {
|
|
204
218
|
project_name: z.string().describe('Project name'),
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
219
|
+
context: z
|
|
220
|
+
.string()
|
|
221
|
+
.optional()
|
|
222
|
+
.describe('Context to list from (e.g. "iter-1", "patch-2"). Defaults to active context.'),
|
|
223
|
+
}, async ({ project_name, context }) => {
|
|
224
|
+
let contextNumber;
|
|
225
|
+
let contextDir;
|
|
226
|
+
let contextLabel;
|
|
227
|
+
if (context) {
|
|
228
|
+
const entry = await getProject(project_name);
|
|
229
|
+
if (!entry) {
|
|
230
|
+
return {
|
|
231
|
+
content: [{ type: 'text', text: `项目 "${project_name}" 未注册。` }],
|
|
232
|
+
isError: true,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
const resolved = resolveContextDir(project_name, context);
|
|
236
|
+
if (!resolved) {
|
|
237
|
+
return {
|
|
238
|
+
content: [
|
|
239
|
+
{ type: 'text', text: `无法解析上下文 "${context}"。格式示例: iter-1, patch-2` },
|
|
240
|
+
],
|
|
241
|
+
isError: true,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
contextNumber = resolved.number;
|
|
245
|
+
contextDir = resolved.dir;
|
|
246
|
+
contextLabel = context;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
const ctx = await resolveActive(project_name);
|
|
250
|
+
if (isError(ctx))
|
|
251
|
+
return ctx;
|
|
252
|
+
contextNumber = ctx.number;
|
|
253
|
+
contextDir = ctx.dir;
|
|
254
|
+
contextLabel = ctx.activeContext;
|
|
218
255
|
}
|
|
219
|
-
const
|
|
220
|
-
const docs = await listDocs(project_name, iteration);
|
|
256
|
+
const docs = await listDocs(project_name, contextNumber, contextDir);
|
|
221
257
|
return {
|
|
222
258
|
content: [
|
|
223
259
|
{
|
|
224
260
|
type: 'text',
|
|
225
261
|
text: docs.length > 0
|
|
226
|
-
? `Documents:\n${docs.map((d) => `- ${d}`).join('\n')}`
|
|
227
|
-
:
|
|
262
|
+
? `Documents (${contextLabel}):\n${docs.map((d) => `- ${d}`).join('\n')}`
|
|
263
|
+
: `No documents found for ${contextLabel}.`,
|
|
228
264
|
},
|
|
229
265
|
],
|
|
230
266
|
};
|
|
231
267
|
});
|
|
232
268
|
}
|
|
233
|
-
async function handleSequentialWrite(builtinDir, customDir, workflowName, projectName, iteration, docId, content, step, docDef, scale) {
|
|
269
|
+
async function handleSequentialWrite(builtinDir, customDir, workflowName, projectName, iteration, docId, content, step, docDef, scale, contextDir) {
|
|
234
270
|
const steps = docDef.steps;
|
|
235
271
|
const stepIds = steps.map((s) => s.id);
|
|
236
272
|
const stepNames = steps.map((s) => `${s.id} (${s.name})`).join(', ');
|
|
@@ -266,7 +302,7 @@ async function handleSequentialWrite(builtinDir, customDir, workflowName, projec
|
|
|
266
302
|
};
|
|
267
303
|
}
|
|
268
304
|
const stepIndex = stepIds.indexOf(step);
|
|
269
|
-
const stepState = await getDocStepState(projectName, iteration, docId);
|
|
305
|
+
const stepState = await getDocStepState(projectName, iteration, docId, contextDir);
|
|
270
306
|
const completedIds = getCompletedStepIds(stepState);
|
|
271
307
|
// Guard: prerequisite steps must be completed (hard enforcement)
|
|
272
308
|
for (let i = 0; i < stepIndex; i++) {
|
|
@@ -302,13 +338,13 @@ async function handleSequentialWrite(builtinDir, customDir, workflowName, projec
|
|
|
302
338
|
}
|
|
303
339
|
}
|
|
304
340
|
// Write the step artifact
|
|
305
|
-
const artifactPath = await writeStepArtifact(projectName, iteration, docId, step, content, stepDef.format);
|
|
341
|
+
const artifactPath = await writeStepArtifact(projectName, iteration, docId, step, content, stepDef.format, contextDir);
|
|
306
342
|
// Record step completion (handles rollback if overwriting)
|
|
307
|
-
await recordStepCompletion(projectName, iteration, docId, step, artifactPath, stepIds);
|
|
343
|
+
await recordStepCompletion(projectName, iteration, docId, step, artifactPath, stepIds, contextDir);
|
|
308
344
|
const isLastStep = stepIndex === steps.length - 1;
|
|
309
345
|
if (isLastStep) {
|
|
310
346
|
// Auto-merge: validate against final doc schema, write formal doc, trigger review
|
|
311
|
-
return handleFinalStep(builtinDir, customDir, workflowName, projectName, iteration, docId, content, docDef, scale, stepDef);
|
|
347
|
+
return handleFinalStep(builtinDir, customDir, workflowName, projectName, iteration, docId, content, docDef, scale, stepDef, contextDir);
|
|
312
348
|
}
|
|
313
349
|
// Not the last step — return progress info
|
|
314
350
|
const nextStep = steps[stepIndex + 1];
|
|
@@ -326,7 +362,7 @@ async function handleSequentialWrite(builtinDir, customDir, workflowName, projec
|
|
|
326
362
|
],
|
|
327
363
|
};
|
|
328
364
|
}
|
|
329
|
-
async function handleFinalStep(builtinDir, customDir, workflowName, projectName, iteration, docId, content, docDef, scale, stepDef) {
|
|
365
|
+
async function handleFinalStep(builtinDir, customDir, workflowName, projectName, iteration, docId, content, docDef, scale, stepDef, contextDir) {
|
|
330
366
|
const isHtml = docDef.format === 'html';
|
|
331
367
|
// Validate against the final document schema (e.g. prd.json)
|
|
332
368
|
const finalSchema = await loadDocSchema(builtinDir, customDir, workflowName, docId);
|
|
@@ -351,14 +387,14 @@ async function handleFinalStep(builtinDir, customDir, workflowName, projectName,
|
|
|
351
387
|
}
|
|
352
388
|
}
|
|
353
389
|
// Write the formal document
|
|
354
|
-
const filePath = await writeDoc(projectName, iteration, docId, content, docDef);
|
|
390
|
+
const filePath = await writeDoc(projectName, iteration, docId, content, docDef, contextDir);
|
|
355
391
|
// Mark as finalized
|
|
356
|
-
await markFinalized(projectName, iteration, docId);
|
|
392
|
+
await markFinalized(projectName, iteration, docId, contextDir);
|
|
357
393
|
// Check if review is required
|
|
358
394
|
const overrides = await getMergedOverrides(projectName);
|
|
359
395
|
const needsReview = resolveDocReview(docId, docDef, overrides);
|
|
360
396
|
if (needsReview) {
|
|
361
|
-
await submitForReview(projectName, iteration, docId);
|
|
397
|
+
await submitForReview(projectName, iteration, docId, contextDir);
|
|
362
398
|
const docName = docDef.name ?? docId;
|
|
363
399
|
return {
|
|
364
400
|
content: [
|