@s_s/harmonia 1.3.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 +6 -2
- package/build/core/dispatch.js +12 -7
- package/build/core/dispatch.js.map +1 -1
- 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 +4 -5
- package/build/core/registry.js +8 -9
- package/build/core/registry.js.map +1 -1
- package/build/core/reviews.d.ts +11 -12
- package/build/core/reviews.js +18 -21
- 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 +26 -27
- package/build/core/state.js +36 -90
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +13 -14
- package/build/core/steps.js +26 -29
- 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 +389 -118
- 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 +25 -26
- 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 -172
- package/build/setup/templates.js.map +1 -1
- package/build/tools/artifact-approve.d.ts +8 -0
- package/build/tools/{approve-doc.js → artifact-approve.js} +24 -16
- 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/{report-dispatch.js → dispatch-report.js} +106 -28
- 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 +265 -248
- 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/iteration-start.d.ts +7 -4
- package/build/tools/iteration-start.js +45 -19
- 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 +4 -2
- package/build/tools/patch-start.js +36 -11
- package/build/tools/patch-start.js.map +1 -1
- package/build/tools/project-init.d.ts +5 -5
- package/build/tools/project-init.js +41 -10
- 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 +6 -0
- package/build/tools/utils.js +36 -0
- package/build/tools/utils.js.map +1 -1
- 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 -36
- package/build/core/docs.js +0 -96
- 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.map +0 -1
- package/build/tools/dispatch-role.d.ts +0 -16
- package/build/tools/dispatch-role.js +0 -266
- 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 -425
- 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.map +0 -1
- package/build/tools/set-scale.d.ts +0 -6
- package/build/tools/set-scale.js +0 -95
- 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 -148
- 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
package/build/tools/set-scale.js
DELETED
|
@@ -1,95 +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 { resolveActive, isError } from './utils.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
|
-
const ctx = await resolveActive(project_name);
|
|
17
|
-
if (isError(ctx))
|
|
18
|
-
return ctx;
|
|
19
|
-
const state = await readState(project_name, ctx.number, ctx.dir);
|
|
20
|
-
// Guard: scale already set
|
|
21
|
-
if (state.scale !== null) {
|
|
22
|
-
return {
|
|
23
|
-
content: [
|
|
24
|
-
{
|
|
25
|
-
type: 'text',
|
|
26
|
-
text: `Scale 已设定为 "${state.scale}",不可更改。如需调整规模,请重新评估 PRD。`,
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
isError: true,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
// Guard: PRD must be approved
|
|
33
|
-
const reviews = await readReviews(project_name, ctx.number, ctx.dir);
|
|
34
|
-
const prdReview = reviews['prd'];
|
|
35
|
-
if (!prdReview || prdReview.status !== 'approved') {
|
|
36
|
-
const prdStatus = prdReview ? prdReview.status : '未提交';
|
|
37
|
-
return {
|
|
38
|
-
content: [
|
|
39
|
-
{
|
|
40
|
-
type: 'text',
|
|
41
|
-
text: `无法设定 scale:PRD 尚未审批通过(当前状态: ${prdStatus})。请先完成 PRD 编写和审批,再设定项目规模。`,
|
|
42
|
-
},
|
|
43
|
-
],
|
|
44
|
-
isError: true,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
// Set scale
|
|
48
|
-
const updated = await setScale(project_name, ctx.number, scale, ctx.dir);
|
|
49
|
-
// Build doc list based on scale
|
|
50
|
-
const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
|
|
51
|
-
const requiredDocs = Object.entries(wf.definition.docs)
|
|
52
|
-
.filter(([, doc]) => {
|
|
53
|
-
const s = doc.scale[scale];
|
|
54
|
-
return s === 'full' || s === 'lite';
|
|
55
|
-
})
|
|
56
|
-
.map(([id, doc]) => `- ${doc.name} (${id})`)
|
|
57
|
-
.join('\n');
|
|
58
|
-
const optionalDocs = Object.entries(wf.definition.docs)
|
|
59
|
-
.filter(([, doc]) => doc.scale[scale] === 'optional')
|
|
60
|
-
.map(([id, doc]) => `- ${doc.name} (${id})`)
|
|
61
|
-
.join('\n');
|
|
62
|
-
return {
|
|
63
|
-
content: [
|
|
64
|
-
{
|
|
65
|
-
type: 'text',
|
|
66
|
-
text: [
|
|
67
|
-
`项目 "${project_name}" 规模已设定为 "${scale}"。`,
|
|
68
|
-
``,
|
|
69
|
-
`必需文档:`,
|
|
70
|
-
requiredDocs || '(无)',
|
|
71
|
-
optionalDocs ? `\n可选文档:\n${optionalDocs}` : '',
|
|
72
|
-
``,
|
|
73
|
-
`当前阶段: ${updated.currentPhase}`,
|
|
74
|
-
scale !== 'small'
|
|
75
|
-
? `\n注意: ${scale} 规模项目的 PRD、tech-design、task-breakdown 等文档将启用分步写入模式。`
|
|
76
|
-
: '',
|
|
77
|
-
].join('\n'),
|
|
78
|
-
},
|
|
79
|
-
],
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
catch (err) {
|
|
83
|
-
return {
|
|
84
|
-
content: [
|
|
85
|
-
{
|
|
86
|
-
type: 'text',
|
|
87
|
-
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
88
|
-
},
|
|
89
|
-
],
|
|
90
|
-
isError: true,
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
//# 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,148 +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 { resolveActive, isError } from './utils.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
|
-
const ctx = await resolveActive(project_name);
|
|
29
|
-
if (isError(ctx))
|
|
30
|
-
return ctx;
|
|
31
|
-
// ── Completion guards ──
|
|
32
|
-
if (status === 'completed' && !force) {
|
|
33
|
-
const currentState = await readState(project_name, ctx.number, ctx.dir);
|
|
34
|
-
const wf = await loadWorkflow(builtinDir, customDir, currentState.workflow);
|
|
35
|
-
const existingDocs = await listDocs(project_name, ctx.number, ctx.dir);
|
|
36
|
-
const phaseDef = wf.definition.phases.find((p) => p.id === phase_id);
|
|
37
|
-
const phaseIndex = wf.definition.phases.findIndex((p) => p.id === phase_id);
|
|
38
|
-
const guardErrors = [];
|
|
39
|
-
// Guard 0: Scale must be set before completing any phase
|
|
40
|
-
if (currentState.scale === null) {
|
|
41
|
-
guardErrors.push('Scale 尚未设定。请先调用 project_set_scale 设定项目规模。');
|
|
42
|
-
}
|
|
43
|
-
// Guard 1: Prior phases must all be completed (skipped counts as completed)
|
|
44
|
-
if (phaseIndex > 0) {
|
|
45
|
-
const priorPhases = wf.definition.phases.slice(0, phaseIndex);
|
|
46
|
-
const incompletePriors = priorPhases.filter((pp) => {
|
|
47
|
-
const ps = currentState.phases.find((s) => s.id === pp.id);
|
|
48
|
-
return !ps || (ps.status !== 'completed' && ps.status !== 'skipped');
|
|
49
|
-
});
|
|
50
|
-
if (incompletePriors.length > 0) {
|
|
51
|
-
guardErrors.push(`前序阶段未完成: ${incompletePriors.map((p) => p.id).join(', ')}`);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
// Guard 2 & 3 require scale to be set
|
|
55
|
-
if (currentState.scale !== null && phaseDef) {
|
|
56
|
-
const scale = currentState.scale;
|
|
57
|
-
// Guard 2: Required doc outputs must exist
|
|
58
|
-
const missingDocOutputs = phaseDef.outputs.filter((o) => {
|
|
59
|
-
const docDef = wf.definition.docs[o];
|
|
60
|
-
if (!docDef)
|
|
61
|
-
return false;
|
|
62
|
-
if (docDef.external)
|
|
63
|
-
return false;
|
|
64
|
-
const scaleVal = docDef.scale[scale];
|
|
65
|
-
if (scaleVal === 'skip' || scaleVal === 'optional')
|
|
66
|
-
return false;
|
|
67
|
-
return !existingDocs.includes(o);
|
|
68
|
-
});
|
|
69
|
-
if (missingDocOutputs.length > 0) {
|
|
70
|
-
guardErrors.push(`缺少必需文档产出: ${missingDocOutputs.join(', ')}`);
|
|
71
|
-
}
|
|
72
|
-
// Guard 3: Docs requiring review must be approved
|
|
73
|
-
const overrides = await getMergedOverrides(project_name);
|
|
74
|
-
const reviews = await readReviews(project_name, ctx.number, ctx.dir);
|
|
75
|
-
const unapprovedDocs = phaseDef.outputs.filter((o) => {
|
|
76
|
-
const docDef = wf.definition.docs[o];
|
|
77
|
-
if (!docDef)
|
|
78
|
-
return false;
|
|
79
|
-
if (docDef.external)
|
|
80
|
-
return false;
|
|
81
|
-
const scaleVal = docDef.scale[scale];
|
|
82
|
-
if (scaleVal === 'skip' || scaleVal === 'optional')
|
|
83
|
-
return false;
|
|
84
|
-
const needsReview = resolveDocReview(o, docDef, overrides);
|
|
85
|
-
if (!needsReview)
|
|
86
|
-
return false;
|
|
87
|
-
const reviewState = reviews[o];
|
|
88
|
-
return !reviewState || reviewState.status !== 'approved';
|
|
89
|
-
});
|
|
90
|
-
if (unapprovedDocs.length > 0) {
|
|
91
|
-
guardErrors.push(`文档待审核或未通过: ${unapprovedDocs.join(', ')}`);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// Guard 4: No active dispatches
|
|
95
|
-
const dispatches = await readDispatches(project_name, ctx.number, ctx.dir);
|
|
96
|
-
const activeDispatches = dispatches.filter((d) => d.status === 'dispatched' || d.status === 'running');
|
|
97
|
-
if (activeDispatches.length > 0) {
|
|
98
|
-
const activeList = activeDispatches.map((d) => `${d.id} (${d.role}, ${d.status})`).join(', ');
|
|
99
|
-
guardErrors.push(`存在进行中的 dispatch: ${activeList}`);
|
|
100
|
-
}
|
|
101
|
-
if (guardErrors.length > 0) {
|
|
102
|
-
return {
|
|
103
|
-
content: [
|
|
104
|
-
{
|
|
105
|
-
type: 'text',
|
|
106
|
-
text: [
|
|
107
|
-
`无法完成阶段 "${phase_id}":`,
|
|
108
|
-
'',
|
|
109
|
-
...guardErrors.map((e) => `- ${e}`),
|
|
110
|
-
'',
|
|
111
|
-
'请先解决以上问题,或使用 force=true 强制完成。',
|
|
112
|
-
].join('\n'),
|
|
113
|
-
},
|
|
114
|
-
],
|
|
115
|
-
isError: true,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
const state = await updatePhaseStatus(project_name, ctx.number, phase_id, status, blocked_reason, ctx.dir);
|
|
120
|
-
const phasesSummary = state.phases
|
|
121
|
-
.map((p) => {
|
|
122
|
-
const marker = p.id === state.currentPhase ? ' <-- current' : '';
|
|
123
|
-
return ` ${p.id}: ${p.status}${p.blockedReason ? ` (${p.blockedReason})` : ''}${marker}`;
|
|
124
|
-
})
|
|
125
|
-
.join('\n');
|
|
126
|
-
return {
|
|
127
|
-
content: [
|
|
128
|
-
{
|
|
129
|
-
type: 'text',
|
|
130
|
-
text: `Phase "${phase_id}" updated to "${status}".\n\nProject phases:\n${phasesSummary}`,
|
|
131
|
-
},
|
|
132
|
-
],
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
catch (err) {
|
|
136
|
-
return {
|
|
137
|
-
content: [
|
|
138
|
-
{
|
|
139
|
-
type: 'text',
|
|
140
|
-
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
141
|
-
},
|
|
142
|
-
],
|
|
143
|
-
isError: true,
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
//# 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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"}
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
model: medium
|
|
3
|
-
session: none
|
|
4
|
-
parallel: false
|
|
5
|
-
capabilities:
|
|
6
|
-
- id: clarify-requirements
|
|
7
|
-
description: 与用户沟通,理解和澄清需求
|
|
8
|
-
- id: assess-scale
|
|
9
|
-
description: 评估项目规模(small/medium/large)
|
|
10
|
-
- id: write-prd
|
|
11
|
-
description: 撰写产品需求文档
|
|
12
|
-
doc: prd
|
|
13
|
-
- id: write-user-stories
|
|
14
|
-
description: 撰写用户故事和验收标准
|
|
15
|
-
doc: user-stories
|
|
16
|
-
- id: write-fsd
|
|
17
|
-
description: 撰写功能规格文档
|
|
18
|
-
doc: fsd
|
|
19
|
-
- id: write-prototype
|
|
20
|
-
description: 创建高保真 HTML 原型
|
|
21
|
-
doc: prototype
|
|
22
|
-
- id: write-project-plan
|
|
23
|
-
description: 撰写项目计划
|
|
24
|
-
doc: project-plan
|
|
25
|
-
- id: dispatch-tasks
|
|
26
|
-
description: 将任务分派给开发者
|
|
27
|
-
- id: track-progress
|
|
28
|
-
description: 跟踪项目进度和阶段状态
|
|
29
|
-
- id: accept-deliver
|
|
30
|
-
description: 验收成果并输出复盘记录
|
|
31
|
-
doc: retrospective
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
# PM(项目经理)
|
|
35
|
-
|
|
36
|
-
你是项目经理,负责整个项目的生命周期管理。你是用户与开发团队之间的桥梁。
|
|
37
|
-
|
|
38
|
-
## 核心职责
|
|
39
|
-
|
|
40
|
-
### 需求澄清
|
|
41
|
-
|
|
42
|
-
- 与用户沟通,理解原始需求
|
|
43
|
-
- 提出澄清问题,消除模糊点
|
|
44
|
-
- 确认需求范围、优先级、约束条件
|
|
45
|
-
- 输出需求文档(PRD)和用户故事
|
|
46
|
-
|
|
47
|
-
### 项目规模评估
|
|
48
|
-
|
|
49
|
-
- 根据功能点数量、技术复杂度、集成需求等维度评估项目规模(小/中/大)
|
|
50
|
-
- 根据规模裁剪文档集——小项目不需要所有文档,避免过度设计
|
|
51
|
-
- 裁剪规则参考 workflow.json 中的 docs.scale 配置
|
|
52
|
-
|
|
53
|
-
### 文档产出
|
|
54
|
-
|
|
55
|
-
- **PRD**:产品需求文档,描述需求范围、功能点、约束条件
|
|
56
|
-
- **用户故事**:用户视角的功能描述 + 验收标准
|
|
57
|
-
- **功能规格(FSD)**:系统行为的精确描述——输入/输出/业务规则/校验逻辑/错误处理(中大型项目)
|
|
58
|
-
- **高保真原型**:HTML 格式的可交互原型,展示页面布局、交互流程、状态反馈(中大型项目)
|
|
59
|
-
- **项目计划**:阶段划分、里程碑、时间估算(中大型项目)
|
|
60
|
-
|
|
61
|
-
### 进度跟踪
|
|
62
|
-
|
|
63
|
-
- 跟踪每个阶段的状态(未开始/进行中/已完成/阻塞)
|
|
64
|
-
- 识别阻塞项,协调解决
|
|
65
|
-
- 向用户同步进度
|
|
66
|
-
|
|
67
|
-
### 任务分派
|
|
68
|
-
|
|
69
|
-
- 根据架构师的任务拆解,将任务分派给开发者
|
|
70
|
-
- 管理任务的依赖关系,按序调度
|
|
71
|
-
- 处理用户的中途修改意见,传达给相关角色
|
|
72
|
-
|
|
73
|
-
### 验收交付
|
|
74
|
-
|
|
75
|
-
- 收集测试报告和开发成果
|
|
76
|
-
- 对照用户故事和验收标准进行验收
|
|
77
|
-
- 确认需求满足后交付给用户
|
|
78
|
-
- 输出复盘记录
|
|
79
|
-
|
|
80
|
-
## 文档审核流程
|
|
81
|
-
|
|
82
|
-
某些文档需要用户审核确认后才能继续流程。当 doc_write 工具返回"REVIEW REQUIRED"提示时:
|
|
83
|
-
|
|
84
|
-
1. **展示文档**:将完整的文档内容展示给用户
|
|
85
|
-
2. **等待确认**:询问用户是否认可,或是否需要修改
|
|
86
|
-
3. **处理反馈**:
|
|
87
|
-
- 用户认可 → 调用 doc_approve 工具,然后继续流程
|
|
88
|
-
- 用户要求修改 → 根据反馈修改文档,重新调用 doc_write
|
|
89
|
-
- 用户拒绝 → 调用 doc_approve(approved=false)并附上用户的反馈
|
|
90
|
-
|
|
91
|
-
**不要跳过审核流程。** 未经用户确认的文档不应作为后续阶段的输入。
|
|
92
|
-
|
|
93
|
-
## 行为规则
|
|
94
|
-
|
|
95
|
-
1. **用户沟通优先**:你是唯一直接与用户对话的角色,其他角色通过你中转
|
|
96
|
-
2. **文档驱动**:每个阶段的产出必须落地为文档,通过 doc_write 工具写入
|
|
97
|
-
3. **状态可见**:每次阶段变更都更新 state.json
|
|
98
|
-
4. **裁剪优先**:小项目不要生成不必要的文档,保持精简
|
|
99
|
-
5. **不越权**:不要替架构师做技术决策,不要替开发者写代码
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"sections": [
|
|
3
|
-
{
|
|
4
|
-
"heading": "## 部署环境",
|
|
5
|
-
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
-
"aliases": ["## Deployment Environment", "## 环境要求", "## 运行环境"]
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
"heading": "## 部署步骤",
|
|
10
|
-
"required": { "small": true, "medium": true, "large": true },
|
|
11
|
-
"aliases": ["## Deployment Steps", "## 部署流程", "## 安装步骤"]
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"heading": "## 配置说明",
|
|
15
|
-
"required": { "small": false, "medium": true, "large": true },
|
|
16
|
-
"aliases": ["## Configuration", "## 环境配置", "## 配置项"]
|
|
17
|
-
}
|
|
18
|
-
],
|
|
19
|
-
"minLength": 100
|
|
20
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"sections": [
|
|
3
|
-
{
|
|
4
|
-
"heading": "## 功能概述",
|
|
5
|
-
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
-
"aliases": ["## Feature Overview", "## 功能说明"]
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
"heading": "## 功能规格",
|
|
10
|
-
"required": { "small": true, "medium": true, "large": true },
|
|
11
|
-
"aliases": ["## Functional Specifications", "## 详细规格", "## 功能详情"]
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"heading": "## 交互流程",
|
|
15
|
-
"required": { "small": false, "medium": true, "large": true },
|
|
16
|
-
"aliases": ["## Interaction Flow", "## 用户流程", "## 交互设计"]
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
"heading": "## 边界条件",
|
|
20
|
-
"required": { "small": false, "medium": false, "large": true },
|
|
21
|
-
"aliases": ["## Edge Cases", "## 边界情况", "## 异常处理"]
|
|
22
|
-
}
|
|
23
|
-
],
|
|
24
|
-
"minLength": 200
|
|
25
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"sections": [
|
|
3
|
-
{
|
|
4
|
-
"heading": "## 项目计划",
|
|
5
|
-
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
-
"aliases": ["## Project Plan", "## 计划概述"]
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
"heading": "## 里程碑",
|
|
10
|
-
"required": { "small": false, "medium": true, "large": true },
|
|
11
|
-
"aliases": ["## Milestones", "## 关键节点"]
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"heading": "## 时间安排",
|
|
15
|
-
"required": { "small": false, "medium": true, "large": true },
|
|
16
|
-
"aliases": ["## Timeline", "## 排期", "## 时间线"]
|
|
17
|
-
}
|
|
18
|
-
],
|
|
19
|
-
"minLength": 100
|
|
20
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"sections": [
|
|
3
|
-
{
|
|
4
|
-
"heading": "## 项目总结",
|
|
5
|
-
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
-
"aliases": ["## Summary", "## 总结", "## 项目概要"]
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
"heading": "## 经验教训",
|
|
10
|
-
"required": { "small": false, "medium": true, "large": true },
|
|
11
|
-
"aliases": ["## Lessons Learned", "## 收获与反思"]
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
"heading": "## 改进建议",
|
|
15
|
-
"required": { "small": false, "medium": false, "large": true },
|
|
16
|
-
"aliases": ["## Improvements", "## 后续改进", "## 待改进"]
|
|
17
|
-
}
|
|
18
|
-
],
|
|
19
|
-
"minLength": 50
|
|
20
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"sections": [
|
|
3
|
-
{
|
|
4
|
-
"heading": "## 风险项",
|
|
5
|
-
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
-
"aliases": ["## Risks", "## 风险列表", "## 风险清单"]
|
|
7
|
-
},
|
|
8
|
-
{
|
|
9
|
-
"heading": "## 缓解措施",
|
|
10
|
-
"required": { "small": false, "medium": true, "large": true },
|
|
11
|
-
"aliases": ["## Mitigation", "## 应对策略", "## 缓解方案"]
|
|
12
|
-
}
|
|
13
|
-
],
|
|
14
|
-
"minLength": 100
|
|
15
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"jsonFields": [
|
|
3
|
-
{
|
|
4
|
-
"field": "endpoints",
|
|
5
|
-
"required": { "small": true, "medium": true, "large": true },
|
|
6
|
-
"type": "array",
|
|
7
|
-
"minItems": 1
|
|
8
|
-
},
|
|
9
|
-
{
|
|
10
|
-
"field": "dataModels",
|
|
11
|
-
"required": { "small": false, "medium": true, "large": true },
|
|
12
|
-
"type": "array"
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"field": "errorCodes",
|
|
16
|
-
"required": { "small": false, "medium": false, "large": true },
|
|
17
|
-
"type": "array"
|
|
18
|
-
}
|
|
19
|
-
]
|
|
20
|
-
}
|