@s_s/harmonia 1.0.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 +3 -0
- package/build/core/dispatch.d.ts +38 -0
- package/build/core/dispatch.js +156 -0
- package/build/core/dispatch.js.map +1 -0
- package/build/core/docs.d.ts +19 -0
- package/build/core/docs.js +59 -0
- package/build/core/docs.js.map +1 -0
- package/build/core/overrides.d.ts +62 -0
- package/build/core/overrides.js +206 -0
- package/build/core/overrides.js.map +1 -0
- package/build/core/registry.d.ts +72 -0
- package/build/core/registry.js +121 -0
- package/build/core/registry.js.map +1 -0
- package/build/core/reviews.d.ts +26 -0
- package/build/core/reviews.js +83 -0
- package/build/core/reviews.js.map +1 -0
- package/build/core/state.d.ts +26 -0
- package/build/core/state.js +103 -0
- package/build/core/state.js.map +1 -0
- package/build/core/types.d.ts +181 -0
- package/build/core/types.js +6 -0
- package/build/core/types.js.map +1 -0
- package/build/core/workflow.d.ts +13 -0
- package/build/core/workflow.js +63 -0
- package/build/core/workflow.js.map +1 -0
- package/build/index.d.ts +15 -0
- package/build/index.js +57 -0
- package/build/index.js.map +1 -0
- package/build/setup/inject.d.ts +34 -0
- package/build/setup/inject.js +115 -0
- package/build/setup/inject.js.map +1 -0
- package/build/setup/templates.d.ts +21 -0
- package/build/setup/templates.js +177 -0
- package/build/setup/templates.js.map +1 -0
- package/build/tools/approve-doc.d.ts +6 -0
- package/build/tools/approve-doc.js +79 -0
- package/build/tools/approve-doc.js.map +1 -0
- package/build/tools/dispatch-role.d.ts +16 -0
- package/build/tools/dispatch-role.js +232 -0
- package/build/tools/dispatch-role.js.map +1 -0
- package/build/tools/doc-tools.d.ts +8 -0
- package/build/tools/doc-tools.js +102 -0
- package/build/tools/doc-tools.js.map +1 -0
- package/build/tools/get-project-status.d.ts +8 -0
- package/build/tools/get-project-status.js +230 -0
- package/build/tools/get-project-status.js.map +1 -0
- package/build/tools/get-role-prompt.d.ts +7 -0
- package/build/tools/get-role-prompt.js +95 -0
- package/build/tools/get-role-prompt.js.map +1 -0
- package/build/tools/override-tools.d.ts +6 -0
- package/build/tools/override-tools.js +129 -0
- package/build/tools/override-tools.js.map +1 -0
- package/build/tools/project-init.d.ts +6 -0
- package/build/tools/project-init.js +71 -0
- package/build/tools/project-init.js.map +1 -0
- package/build/tools/report-dispatch.d.ts +11 -0
- package/build/tools/report-dispatch.js +142 -0
- package/build/tools/report-dispatch.js.map +1 -0
- package/build/tools/setup-project.d.ts +8 -0
- package/build/tools/setup-project.js +88 -0
- package/build/tools/setup-project.js.map +1 -0
- package/build/tools/update-phase.d.ts +7 -0
- package/build/tools/update-phase.js +79 -0
- package/build/tools/update-phase.js.map +1 -0
- package/package.json +51 -0
- package/workflows/dev/roles/architect.md +66 -0
- package/workflows/dev/roles/developer.md +44 -0
- package/workflows/dev/roles/pm.md +99 -0
- package/workflows/dev/roles/tester.md +44 -0
- package/workflows/dev/workflow.json +134 -0
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: dispatch_role
|
|
3
|
+
*
|
|
4
|
+
* Prepare all data needed to hand off a task to a team member role.
|
|
5
|
+
* Returns: role prompt (with overrides injected), frontmatter config,
|
|
6
|
+
* input documents, task brief, and dispatch tracking info.
|
|
7
|
+
*
|
|
8
|
+
* Automatically:
|
|
9
|
+
* - Creates a dispatch record for tracking
|
|
10
|
+
* - Searches for reusable idle sessions and provides guidance
|
|
11
|
+
*
|
|
12
|
+
* This tool does NOT launch agents — it only prepares the data.
|
|
13
|
+
* The host agent (PM) decides how to pass this to the team member.
|
|
14
|
+
*/
|
|
15
|
+
import { z } from 'zod';
|
|
16
|
+
import { loadWorkflow } from '../core/workflow.js';
|
|
17
|
+
import { readState } from '../core/state.js';
|
|
18
|
+
import { readDoc } from '../core/docs.js';
|
|
19
|
+
import { getMergedOverrides, resolveRoleConfig } from '../core/overrides.js';
|
|
20
|
+
import { createDispatch, findIdleSession } from '../core/dispatch.js';
|
|
21
|
+
/**
|
|
22
|
+
* Build override instructions to inject into the role prompt.
|
|
23
|
+
*/
|
|
24
|
+
function buildOverrideSection(roleId, overrides) {
|
|
25
|
+
const roleOverrides = overrides.roles?.[roleId]?.capabilities;
|
|
26
|
+
if (!roleOverrides || Object.keys(roleOverrides).length === 0) {
|
|
27
|
+
return '';
|
|
28
|
+
}
|
|
29
|
+
const lines = [
|
|
30
|
+
'',
|
|
31
|
+
'## Enhanced Capabilities',
|
|
32
|
+
'',
|
|
33
|
+
'The following capabilities have been configured to use external tools.',
|
|
34
|
+
'Use the specified tool instead of built-in behavior for these actions.',
|
|
35
|
+
'',
|
|
36
|
+
];
|
|
37
|
+
for (const [capId, override] of Object.entries(roleOverrides)) {
|
|
38
|
+
const o = override;
|
|
39
|
+
const toolRef = o.type === 'mcp' && o.server
|
|
40
|
+
? `\`${o.server}\` MCP server's \`${o.tool}\` tool`
|
|
41
|
+
: `\`${o.tool}\` skill tool`;
|
|
42
|
+
let instruction = `- **${capId}**: Use ${toolRef}`;
|
|
43
|
+
if (o.params && Object.keys(o.params).length > 0) {
|
|
44
|
+
const paramStr = Object.entries(o.params)
|
|
45
|
+
.map(([k, v]) => `${k}: ${JSON.stringify(v)}`)
|
|
46
|
+
.join(', ');
|
|
47
|
+
instruction += ` with fixed parameters: ${paramStr}`;
|
|
48
|
+
}
|
|
49
|
+
if (o.notes) {
|
|
50
|
+
instruction += `. Note: ${o.notes}`;
|
|
51
|
+
}
|
|
52
|
+
lines.push(instruction);
|
|
53
|
+
}
|
|
54
|
+
return lines.join('\n');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Find the current phase definition from the workflow.
|
|
58
|
+
*/
|
|
59
|
+
function findCurrentPhase(phases, currentPhaseId) {
|
|
60
|
+
return phases.find((p) => p.id === currentPhaseId);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Resolve expected output doc IDs for a dispatch.
|
|
64
|
+
* Uses the current phase's outputs, filtering out external, scale-skipped, and optional docs.
|
|
65
|
+
*/
|
|
66
|
+
function resolveExpectedOutputs(currentPhase, workflowDef, scale) {
|
|
67
|
+
if (!currentPhase)
|
|
68
|
+
return [];
|
|
69
|
+
return currentPhase.outputs.filter((docId) => {
|
|
70
|
+
const docDef = workflowDef.docs[docId];
|
|
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 true;
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
export function registerDispatchRole(server, workflowsDir) {
|
|
82
|
+
server.tool('dispatch_role', "Prepare all data needed to dispatch a task to a team member. Returns the role's prompt (with capability overrides), configuration, input documents, task brief, and a dispatch tracking ID. Automatically searches for reusable sessions and provides guidance. Does NOT launch agents — you (PM) decide how to pass this to the team member. After launching, call report_dispatch to register the session.", {
|
|
83
|
+
project_name: z.string().describe('Project name'),
|
|
84
|
+
role: z.string().describe('Role ID to dispatch (e.g. architect, developer, tester)'),
|
|
85
|
+
task_brief: z
|
|
86
|
+
.string()
|
|
87
|
+
.describe('Task description for the team member — what they need to do, which tasks from the breakdown, specific instructions, etc.'),
|
|
88
|
+
input_doc_ids: z
|
|
89
|
+
.array(z.string())
|
|
90
|
+
.optional()
|
|
91
|
+
.describe("Document IDs to include as input for the team member. If not specified, automatically uses the current phase's input docs."),
|
|
92
|
+
}, async ({ project_name, role, task_brief, input_doc_ids }) => {
|
|
93
|
+
try {
|
|
94
|
+
// Load project state and workflow
|
|
95
|
+
const state = await readState(project_name);
|
|
96
|
+
const wf = await loadWorkflow(workflowsDir, state.workflow);
|
|
97
|
+
// Validate role exists
|
|
98
|
+
const roleDef = wf.roles[role];
|
|
99
|
+
if (!roleDef) {
|
|
100
|
+
const available = Object.keys(wf.roles).join(', ');
|
|
101
|
+
return {
|
|
102
|
+
content: [
|
|
103
|
+
{
|
|
104
|
+
type: 'text',
|
|
105
|
+
text: `Role "${role}" not found. Available: ${available}`,
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
isError: true,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Get merged overrides
|
|
112
|
+
const overrides = await getMergedOverrides(project_name);
|
|
113
|
+
// Build the full prompt with overrides injected
|
|
114
|
+
const overrideSection = buildOverrideSection(role, overrides);
|
|
115
|
+
const fullPrompt = overrideSection ? `${roleDef.prompt}\n${overrideSection}` : roleDef.prompt;
|
|
116
|
+
// Determine input docs
|
|
117
|
+
const currentPhase = findCurrentPhase(wf.definition.phases, state.currentPhase);
|
|
118
|
+
const docIds = input_doc_ids ?? currentPhase?.inputs ?? [];
|
|
119
|
+
// Read input documents (skip external docs like "code" — not managed by write_doc)
|
|
120
|
+
const inputDocs = {};
|
|
121
|
+
const missingDocs = [];
|
|
122
|
+
for (const docId of docIds) {
|
|
123
|
+
const docDef = wf.definition.docs[docId];
|
|
124
|
+
if (docDef?.external)
|
|
125
|
+
continue; // external outputs not stored as docs
|
|
126
|
+
try {
|
|
127
|
+
inputDocs[docId] = await readDoc(project_name, docId);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
missingDocs.push(docId);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Resolve agent/model overrides
|
|
134
|
+
const roleConfig = resolveRoleConfig(role, overrides);
|
|
135
|
+
// Resolve expected outputs for this dispatch
|
|
136
|
+
const expectedOutputs = resolveExpectedOutputs(currentPhase, wf.definition, state.scale);
|
|
137
|
+
// Check for reusable idle session
|
|
138
|
+
const idleSession = await findIdleSession(project_name, role);
|
|
139
|
+
// Create dispatch record
|
|
140
|
+
const dispatch = await createDispatch(project_name, role, task_brief, expectedOutputs, idleSession?.id);
|
|
141
|
+
// Build session guidance
|
|
142
|
+
const sessionGuidance = buildSessionGuidance(idleSession, roleDef.frontmatter.session, roleConfig.agent);
|
|
143
|
+
// Build human-readable summary for the agent
|
|
144
|
+
const agentLine = roleConfig.agent ? `\n- Agent: ${roleConfig.agent}` : '';
|
|
145
|
+
const modelDisplay = roleConfig.model ?? roleDef.frontmatter.model;
|
|
146
|
+
const summary = [
|
|
147
|
+
`# Dispatch: ${role}`,
|
|
148
|
+
``,
|
|
149
|
+
`## Dispatch Tracking`,
|
|
150
|
+
`- Dispatch ID: \`${dispatch.id}\``,
|
|
151
|
+
`- Status: ${dispatch.status}`,
|
|
152
|
+
``,
|
|
153
|
+
`## Session Guidance`,
|
|
154
|
+
sessionGuidance,
|
|
155
|
+
``,
|
|
156
|
+
`## Task Brief`,
|
|
157
|
+
task_brief,
|
|
158
|
+
``,
|
|
159
|
+
`## Configuration`,
|
|
160
|
+
`- Model: ${modelDisplay}`,
|
|
161
|
+
`- Session: ${roleDef.frontmatter.session}`,
|
|
162
|
+
`- Parallel: ${roleDef.frontmatter.parallel}${agentLine}`,
|
|
163
|
+
``,
|
|
164
|
+
`## Project Context`,
|
|
165
|
+
`- Project: ${project_name}`,
|
|
166
|
+
`- Directory: ${state.projectDir}`,
|
|
167
|
+
`- Scale: ${state.scale}`,
|
|
168
|
+
`- Current phase: ${state.currentPhase}`,
|
|
169
|
+
``,
|
|
170
|
+
`## Input Documents (${Object.keys(inputDocs).length}${missingDocs.length > 0 ? `, ${missingDocs.length} missing` : ''})`,
|
|
171
|
+
];
|
|
172
|
+
for (const [docId, content] of Object.entries(inputDocs)) {
|
|
173
|
+
summary.push(``, `### ${docId}`, ``, content);
|
|
174
|
+
}
|
|
175
|
+
if (missingDocs.length > 0) {
|
|
176
|
+
summary.push(``, `### Missing Documents`, ...missingDocs.map((d) => `- ${d}`));
|
|
177
|
+
}
|
|
178
|
+
summary.push(``, `## Next Step`, `After launching the agent, call \`report_dispatch\` with dispatch_id="${dispatch.id}" and the agent's session ID.`, `When the agent finishes, call \`report_dispatch\` again with status="completed" (or "failed").`, ``, `## Role Prompt`, ``, fullPrompt);
|
|
179
|
+
return {
|
|
180
|
+
content: [
|
|
181
|
+
{
|
|
182
|
+
type: 'text',
|
|
183
|
+
text: summary.join('\n'),
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
return {
|
|
190
|
+
content: [
|
|
191
|
+
{
|
|
192
|
+
type: 'text',
|
|
193
|
+
text: `Error: ${err instanceof Error ? err.message : String(err)}`,
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
isError: true,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Build session guidance text based on whether an idle session exists.
|
|
203
|
+
*/
|
|
204
|
+
function buildSessionGuidance(idleSession, sessionType, agentOverride) {
|
|
205
|
+
if (idleSession) {
|
|
206
|
+
const agentId = idleSession.agentSessionId
|
|
207
|
+
? `Agent session ID: \`${idleSession.agentSessionId}\``
|
|
208
|
+
: 'Agent session ID: not recorded';
|
|
209
|
+
const label = idleSession.label ? ` (${idleSession.label})` : '';
|
|
210
|
+
return [
|
|
211
|
+
`**Reusable session found**: ${idleSession.id}${label}`,
|
|
212
|
+
`- ${agentId}`,
|
|
213
|
+
`- Agent type: ${idleSession.agentType ?? 'unknown'}`,
|
|
214
|
+
`- Last active: ${idleSession.lastActiveAt}`,
|
|
215
|
+
``,
|
|
216
|
+
`**Action**: Resume this session instead of launching a new agent.`,
|
|
217
|
+
idleSession.agentSessionId
|
|
218
|
+
? `Use \`--resume ${idleSession.agentSessionId}\` or \`--session ${idleSession.agentSessionId}\` to restore the conversation.`
|
|
219
|
+
: `Note: No agent session ID was recorded for this session. You may need to launch a new agent.`,
|
|
220
|
+
].join('\n');
|
|
221
|
+
}
|
|
222
|
+
return [
|
|
223
|
+
`**No reusable session found** for this role.`,
|
|
224
|
+
`Session type: ${sessionType}`,
|
|
225
|
+
``,
|
|
226
|
+
`**Action**: Launch a new agent for this role.`,
|
|
227
|
+
agentOverride ? `Configured agent type: ${agentOverride}` : '',
|
|
228
|
+
]
|
|
229
|
+
.filter(Boolean)
|
|
230
|
+
.join('\n');
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=dispatch-role.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch-role.js","sourceRoot":"","sources":["../../src/tools/dispatch-role.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tools: write_doc / read_doc / list_docs
|
|
3
|
+
* Read and write project documents under <data_dir>/<project_name>/docs/
|
|
4
|
+
*
|
|
5
|
+
* write_doc checks review configuration and auto-submits for review if needed.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerDocTools(server: McpServer, workflowsDir: string): void;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tools: write_doc / read_doc / list_docs
|
|
3
|
+
* Read and write project documents under <data_dir>/<project_name>/docs/
|
|
4
|
+
*
|
|
5
|
+
* write_doc checks review configuration and auto-submits for review if needed.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { writeDoc, readDoc, listDocs } from '../core/docs.js';
|
|
9
|
+
import { readState } from '../core/state.js';
|
|
10
|
+
import { loadWorkflow } from '../core/workflow.js';
|
|
11
|
+
import { getMergedOverrides, resolveDocReview } from '../core/overrides.js';
|
|
12
|
+
import { submitForReview } from '../core/reviews.js';
|
|
13
|
+
export function registerDocTools(server, workflowsDir) {
|
|
14
|
+
server.tool('write_doc', 'Write or update a project document. Automatically checks review configuration — if review is required, the document is submitted for user approval and you MUST present it to the user for confirmation before proceeding.', {
|
|
15
|
+
project_name: z.string().describe('Project name'),
|
|
16
|
+
doc_id: z
|
|
17
|
+
.string()
|
|
18
|
+
.describe('Document ID (e.g. prd, user-stories, fsd, prototype, tech-design, task-breakdown, etc.)'),
|
|
19
|
+
content: z.string().describe('Document content (markdown or HTML depending on doc type)'),
|
|
20
|
+
}, async ({ project_name, doc_id, content }) => {
|
|
21
|
+
// Load workflow to get doc definition (format, review defaults)
|
|
22
|
+
const state = await readState(project_name);
|
|
23
|
+
const wf = await loadWorkflow(workflowsDir, state.workflow);
|
|
24
|
+
const docDef = wf.definition.docs[doc_id];
|
|
25
|
+
// Write the document with correct extension
|
|
26
|
+
const filePath = await writeDoc(project_name, doc_id, content, docDef);
|
|
27
|
+
// Check if review is required
|
|
28
|
+
const overrides = await getMergedOverrides(project_name);
|
|
29
|
+
const needsReview = docDef ? resolveDocReview(doc_id, docDef, overrides) : false;
|
|
30
|
+
if (needsReview) {
|
|
31
|
+
await submitForReview(project_name, doc_id);
|
|
32
|
+
const docName = docDef?.name ?? doc_id;
|
|
33
|
+
return {
|
|
34
|
+
content: [
|
|
35
|
+
{
|
|
36
|
+
type: 'text',
|
|
37
|
+
text: [
|
|
38
|
+
`Document "${doc_id}" (${docName}) written to ${filePath}`,
|
|
39
|
+
``,
|
|
40
|
+
`** REVIEW REQUIRED **`,
|
|
41
|
+
`This document requires user approval before the workflow can proceed.`,
|
|
42
|
+
`Please present the document content to the user and ask for their confirmation.`,
|
|
43
|
+
`After user approval, call approve_doc with project_name="${project_name}" and doc_id="${doc_id}".`,
|
|
44
|
+
`If the user requests changes, revise the document and call write_doc again.`,
|
|
45
|
+
].join('\n'),
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: 'text',
|
|
54
|
+
text: `Document "${doc_id}" written to ${filePath}`,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
});
|
|
59
|
+
server.tool('read_doc', 'Read a project document from the project docs directory.', {
|
|
60
|
+
project_name: z.string().describe('Project name'),
|
|
61
|
+
doc_id: z.string().describe('Document ID to read'),
|
|
62
|
+
}, async ({ project_name, doc_id }) => {
|
|
63
|
+
try {
|
|
64
|
+
const docContent = await readDoc(project_name, doc_id);
|
|
65
|
+
return {
|
|
66
|
+
content: [
|
|
67
|
+
{
|
|
68
|
+
type: 'text',
|
|
69
|
+
text: docContent,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return {
|
|
76
|
+
content: [
|
|
77
|
+
{
|
|
78
|
+
type: 'text',
|
|
79
|
+
text: `Document "${doc_id}" not found. Use list_docs to see available documents.`,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
isError: true,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
server.tool('list_docs', 'List all project documents in the project docs directory.', {
|
|
87
|
+
project_name: z.string().describe('Project name'),
|
|
88
|
+
}, async ({ project_name }) => {
|
|
89
|
+
const docs = await listDocs(project_name);
|
|
90
|
+
return {
|
|
91
|
+
content: [
|
|
92
|
+
{
|
|
93
|
+
type: 'text',
|
|
94
|
+
text: docs.length > 0
|
|
95
|
+
? `Documents:\n${docs.map((d) => `- ${d}`).join('\n')}`
|
|
96
|
+
: 'No documents found. Initialize a project first with project_init.',
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=doc-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doc-tools.js","sourceRoot":"","sources":["../../src/tools/doc-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: get_project_status
|
|
3
|
+
* Read the current project status with rich context for PM decision-making.
|
|
4
|
+
* Includes phase progress, documents, pending reviews, dispatch records,
|
|
5
|
+
* active sessions, and intelligent next-step suggestions.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
export declare function registerGetProjectStatus(server: McpServer, workflowsDir: string): void;
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: get_project_status
|
|
3
|
+
* Read the current project status with rich context for PM decision-making.
|
|
4
|
+
* Includes phase progress, documents, pending reviews, dispatch records,
|
|
5
|
+
* active sessions, and intelligent next-step suggestions.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { readState } from '../core/state.js';
|
|
9
|
+
import { loadWorkflow } from '../core/workflow.js';
|
|
10
|
+
import { listDocs } from '../core/docs.js';
|
|
11
|
+
import { readReviews } from '../core/reviews.js';
|
|
12
|
+
import { getMergedOverrides } from '../core/overrides.js';
|
|
13
|
+
import { readDispatches, readSessions } from '../core/dispatch.js';
|
|
14
|
+
/**
|
|
15
|
+
* Derive next-step suggestions based on current project state, including dispatch awareness.
|
|
16
|
+
*/
|
|
17
|
+
function deriveNextSteps(state, wf, existingDocs, pendingReviews, dispatches, sessions) {
|
|
18
|
+
const suggestions = [];
|
|
19
|
+
const currentPhaseDef = wf.definition.phases.find((p) => p.id === state.currentPhase);
|
|
20
|
+
if (!currentPhaseDef)
|
|
21
|
+
return ['Unknown phase — check project state.'];
|
|
22
|
+
// If there are pending reviews, those block progress
|
|
23
|
+
if (pendingReviews.length > 0) {
|
|
24
|
+
const docNames = pendingReviews.map((r) => r.docId).join(', ');
|
|
25
|
+
suggestions.push(`Review pending documents: ${docNames}. Present them to the user and call approve_doc after user feedback.`);
|
|
26
|
+
}
|
|
27
|
+
// Check dispatch states — find dispatches that need attention
|
|
28
|
+
const activeDispatches = dispatches.filter((d) => d.status === 'dispatched' || d.status === 'running');
|
|
29
|
+
const dispatchedNotRunning = dispatches.filter((d) => d.status === 'dispatched');
|
|
30
|
+
const runningDispatches = dispatches.filter((d) => d.status === 'running');
|
|
31
|
+
const failedDispatches = dispatches.filter((d) => d.status === 'failed');
|
|
32
|
+
if (dispatchedNotRunning.length > 0) {
|
|
33
|
+
for (const d of dispatchedNotRunning) {
|
|
34
|
+
suggestions.push(`Dispatch ${d.id} (${d.role}) is created but not yet launched. Launch the agent and call report_dispatch to register it.`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (runningDispatches.length > 0) {
|
|
38
|
+
for (const d of runningDispatches) {
|
|
39
|
+
const session = sessions.find((s) => s.id === d.sessionId);
|
|
40
|
+
const agentInfo = session?.agentSessionId ? ` (agent session: ${session.agentSessionId})` : '';
|
|
41
|
+
suggestions.push(`Dispatch ${d.id} (${d.role}) is running${agentInfo}. Check if the agent has finished, then call report_dispatch with status="completed" or "failed".`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (failedDispatches.length > 0) {
|
|
45
|
+
for (const d of failedDispatches) {
|
|
46
|
+
const reason = d.note ? ` Reason: ${d.note}` : '';
|
|
47
|
+
suggestions.push(`Dispatch ${d.id} (${d.role}) failed.${reason} Consider re-dispatching with dispatch_role.`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// Check which phase outputs are still missing
|
|
51
|
+
// Skip external outputs (e.g. "code"), docs that are "skip", and "optional" docs at the current scale
|
|
52
|
+
const missingOutputs = currentPhaseDef.outputs.filter((o) => {
|
|
53
|
+
const docDef = wf.definition.docs[o];
|
|
54
|
+
if (docDef?.external)
|
|
55
|
+
return false;
|
|
56
|
+
const scaleVal = docDef?.scale[state.scale];
|
|
57
|
+
if (scaleVal === 'skip' || scaleVal === 'optional')
|
|
58
|
+
return false;
|
|
59
|
+
return !existingDocs.includes(o);
|
|
60
|
+
});
|
|
61
|
+
if (missingOutputs.length > 0) {
|
|
62
|
+
// Only suggest dispatching if there are no active dispatches already covering this
|
|
63
|
+
const alreadyDispatched = activeDispatches.length > 0;
|
|
64
|
+
const nonPmRoles = currentPhaseDef.roles.filter((r) => r !== 'pm');
|
|
65
|
+
if (nonPmRoles.length > 0 && !alreadyDispatched) {
|
|
66
|
+
suggestions.push(`Dispatch ${nonPmRoles.join(', ')} to produce: ${missingOutputs.join(', ')}. Use dispatch_role to prepare task data.`);
|
|
67
|
+
}
|
|
68
|
+
else if (nonPmRoles.length === 0) {
|
|
69
|
+
suggestions.push(`Produce remaining documents: ${missingOutputs.join(', ')}. Use write_doc for each.`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (pendingReviews.length === 0 && activeDispatches.length === 0) {
|
|
73
|
+
// All outputs exist, no pending reviews, no active dispatches — can advance
|
|
74
|
+
suggestions.push(`All outputs for "${currentPhaseDef.name}" are complete. Advance with: update_phase(project_name, "${state.currentPhase}", "completed")`);
|
|
75
|
+
}
|
|
76
|
+
// Check for lost sessions
|
|
77
|
+
const lostSessions = sessions.filter((s) => s.status === 'lost');
|
|
78
|
+
if (lostSessions.length > 0) {
|
|
79
|
+
for (const s of lostSessions) {
|
|
80
|
+
suggestions.push(`Session ${s.id} (${s.role}) is marked as lost. The agent may have crashed. Consider re-dispatching this role.`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// If no suggestions yet, provide a generic one
|
|
84
|
+
if (suggestions.length === 0) {
|
|
85
|
+
suggestions.push(`Continue working on the "${currentPhaseDef.name}" phase.`);
|
|
86
|
+
}
|
|
87
|
+
return suggestions;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Format a dispatch record for display.
|
|
91
|
+
*/
|
|
92
|
+
function formatDispatch(d, sessions) {
|
|
93
|
+
const statusIcon = d.status === 'completed'
|
|
94
|
+
? '✓'
|
|
95
|
+
: d.status === 'running'
|
|
96
|
+
? '→'
|
|
97
|
+
: d.status === 'failed'
|
|
98
|
+
? '✗'
|
|
99
|
+
: d.status === 'cancelled'
|
|
100
|
+
? '—'
|
|
101
|
+
: '○';
|
|
102
|
+
const session = sessions.find((s) => s.id === d.sessionId);
|
|
103
|
+
const sessionInfo = session?.agentSessionId ? ` session:${session.agentSessionId}` : '';
|
|
104
|
+
const note = d.note ? ` (${d.note})` : '';
|
|
105
|
+
const brief = d.taskBrief.length > 60 ? d.taskBrief.slice(0, 57) + '...' : d.taskBrief;
|
|
106
|
+
return ` ${statusIcon} ${d.id} ${d.role.padEnd(12)} [${d.status}] ${brief}${sessionInfo}${note}`;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Format a session record for display.
|
|
110
|
+
*/
|
|
111
|
+
function formatSession(s) {
|
|
112
|
+
const agentInfo = s.agentSessionId ? `agent:${s.agentSessionId}` : 'no agent ID';
|
|
113
|
+
const label = s.label ? ` (${s.label})` : '';
|
|
114
|
+
const agentType = s.agentType ? ` via ${s.agentType}` : '';
|
|
115
|
+
return ` ${s.id} ${s.role.padEnd(12)} [${s.status}] ${agentInfo}${agentType}${label}`;
|
|
116
|
+
}
|
|
117
|
+
export function registerGetProjectStatus(server, workflowsDir) {
|
|
118
|
+
server.tool('get_project_status', 'Get the current project status including phase progress, documents, pending reviews, dispatch records, active sessions, and next-step suggestions.', {
|
|
119
|
+
project_name: z.string().describe('Project name'),
|
|
120
|
+
}, async ({ project_name }) => {
|
|
121
|
+
try {
|
|
122
|
+
const state = await readState(project_name);
|
|
123
|
+
const wf = await loadWorkflow(workflowsDir, state.workflow);
|
|
124
|
+
const docs = await listDocs(project_name);
|
|
125
|
+
const reviews = await readReviews(project_name);
|
|
126
|
+
const overrides = await getMergedOverrides(project_name);
|
|
127
|
+
const dispatches = await readDispatches(project_name);
|
|
128
|
+
const sessions = await readSessions(project_name);
|
|
129
|
+
// Phase summary
|
|
130
|
+
const phasesSummary = state.phases
|
|
131
|
+
.map((p) => {
|
|
132
|
+
const def = wf.definition.phases.find((pd) => pd.id === p.id);
|
|
133
|
+
const marker = p.id === state.currentPhase ? ' <-- current' : '';
|
|
134
|
+
const name = def ? ` (${def.name})` : '';
|
|
135
|
+
return ` ${p.id}${name}: ${p.status}${p.blockedReason ? ` [blocked: ${p.blockedReason}]` : ''}${marker}`;
|
|
136
|
+
})
|
|
137
|
+
.join('\n');
|
|
138
|
+
const currentPhaseDef = wf.definition.phases.find((p) => p.id === state.currentPhase);
|
|
139
|
+
// Categorize documents
|
|
140
|
+
const pendingReviews = Object.values(reviews).filter((r) => r.status === 'pending');
|
|
141
|
+
// Build pending reviews section
|
|
142
|
+
const pendingSection = pendingReviews.length > 0
|
|
143
|
+
? pendingReviews
|
|
144
|
+
.map((r) => `- ${r.docId} (submitted: ${r.submittedAt.split('T')[0]})`)
|
|
145
|
+
.join('\n')
|
|
146
|
+
: '(none)';
|
|
147
|
+
// Build documents section with status
|
|
148
|
+
const docsSection = docs.length > 0
|
|
149
|
+
? docs
|
|
150
|
+
.map((d) => {
|
|
151
|
+
const review = reviews[d];
|
|
152
|
+
if (!review)
|
|
153
|
+
return `- ${d}`;
|
|
154
|
+
return `- ${d} [${review.status}]`;
|
|
155
|
+
})
|
|
156
|
+
.join('\n')
|
|
157
|
+
: '(none yet)';
|
|
158
|
+
// Build sessions section
|
|
159
|
+
const activeSessions = sessions.filter((s) => s.status !== 'closed');
|
|
160
|
+
const sessionsSection = activeSessions.length > 0 ? activeSessions.map((s) => formatSession(s)).join('\n') : '(none)';
|
|
161
|
+
// Build dispatches section
|
|
162
|
+
const dispatchesSection = dispatches.length > 0 ? dispatches.map((d) => formatDispatch(d, sessions)).join('\n') : '(none)';
|
|
163
|
+
// Derive next steps (now dispatch-aware)
|
|
164
|
+
const nextSteps = deriveNextSteps(state, wf, docs, pendingReviews, dispatches, sessions);
|
|
165
|
+
return {
|
|
166
|
+
content: [
|
|
167
|
+
{
|
|
168
|
+
type: 'text',
|
|
169
|
+
text: [
|
|
170
|
+
`# Project Status: ${state.projectName}`,
|
|
171
|
+
``,
|
|
172
|
+
`Source directory: ${state.projectDir}`,
|
|
173
|
+
`Workflow: ${state.workflow}`,
|
|
174
|
+
`Scale: ${state.scale}`,
|
|
175
|
+
`Created: ${state.createdAt}`,
|
|
176
|
+
`Updated: ${state.updatedAt}`,
|
|
177
|
+
``,
|
|
178
|
+
`## Phases`,
|
|
179
|
+
phasesSummary,
|
|
180
|
+
``,
|
|
181
|
+
`## Current Phase`,
|
|
182
|
+
currentPhaseDef
|
|
183
|
+
? `${currentPhaseDef.name} (${currentPhaseDef.id}): ${currentPhaseDef.description}`
|
|
184
|
+
: 'Unknown',
|
|
185
|
+
currentPhaseDef?.roles ? `Roles: ${currentPhaseDef.roles.join(', ')}` : '',
|
|
186
|
+
currentPhaseDef?.outputs
|
|
187
|
+
? `Expected outputs: ${currentPhaseDef.outputs
|
|
188
|
+
.filter((o) => {
|
|
189
|
+
const d = wf.definition.docs[o];
|
|
190
|
+
if (!d)
|
|
191
|
+
return true;
|
|
192
|
+
const sv = d.scale[state.scale];
|
|
193
|
+
return sv !== 'skip' && sv !== 'optional';
|
|
194
|
+
})
|
|
195
|
+
.join(', ')}`
|
|
196
|
+
: '',
|
|
197
|
+
``,
|
|
198
|
+
`## Sessions`,
|
|
199
|
+
sessionsSection,
|
|
200
|
+
``,
|
|
201
|
+
`## Dispatches`,
|
|
202
|
+
dispatchesSection,
|
|
203
|
+
``,
|
|
204
|
+
`## Pending Reviews`,
|
|
205
|
+
pendingSection,
|
|
206
|
+
``,
|
|
207
|
+
`## Documents`,
|
|
208
|
+
docsSection,
|
|
209
|
+
``,
|
|
210
|
+
`## Next Steps`,
|
|
211
|
+
nextSteps.map((s, i) => `${i + 1}. ${s}`).join('\n'),
|
|
212
|
+
].join('\n'),
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
return {
|
|
219
|
+
content: [
|
|
220
|
+
{
|
|
221
|
+
type: 'text',
|
|
222
|
+
text: 'Project not initialized. Use project_init to get started.',
|
|
223
|
+
},
|
|
224
|
+
],
|
|
225
|
+
isError: true,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=get-project-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-project-status.js","sourceRoot":"","sources":["../../src/tools/get-project-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool: get_role_prompt
|
|
3
|
+
* Retrieve the prompt and configuration for a specific role,
|
|
4
|
+
* with capability overrides injected into the prompt.
|
|
5
|
+
*/
|
|
6
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
export declare function registerGetRolePrompt(server: McpServer, workflowsDir: string): void;
|