@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.
Files changed (70) hide show
  1. package/README.md +3 -0
  2. package/build/core/dispatch.d.ts +38 -0
  3. package/build/core/dispatch.js +156 -0
  4. package/build/core/dispatch.js.map +1 -0
  5. package/build/core/docs.d.ts +19 -0
  6. package/build/core/docs.js +59 -0
  7. package/build/core/docs.js.map +1 -0
  8. package/build/core/overrides.d.ts +62 -0
  9. package/build/core/overrides.js +206 -0
  10. package/build/core/overrides.js.map +1 -0
  11. package/build/core/registry.d.ts +72 -0
  12. package/build/core/registry.js +121 -0
  13. package/build/core/registry.js.map +1 -0
  14. package/build/core/reviews.d.ts +26 -0
  15. package/build/core/reviews.js +83 -0
  16. package/build/core/reviews.js.map +1 -0
  17. package/build/core/state.d.ts +26 -0
  18. package/build/core/state.js +103 -0
  19. package/build/core/state.js.map +1 -0
  20. package/build/core/types.d.ts +181 -0
  21. package/build/core/types.js +6 -0
  22. package/build/core/types.js.map +1 -0
  23. package/build/core/workflow.d.ts +13 -0
  24. package/build/core/workflow.js +63 -0
  25. package/build/core/workflow.js.map +1 -0
  26. package/build/index.d.ts +15 -0
  27. package/build/index.js +57 -0
  28. package/build/index.js.map +1 -0
  29. package/build/setup/inject.d.ts +34 -0
  30. package/build/setup/inject.js +115 -0
  31. package/build/setup/inject.js.map +1 -0
  32. package/build/setup/templates.d.ts +21 -0
  33. package/build/setup/templates.js +177 -0
  34. package/build/setup/templates.js.map +1 -0
  35. package/build/tools/approve-doc.d.ts +6 -0
  36. package/build/tools/approve-doc.js +79 -0
  37. package/build/tools/approve-doc.js.map +1 -0
  38. package/build/tools/dispatch-role.d.ts +16 -0
  39. package/build/tools/dispatch-role.js +232 -0
  40. package/build/tools/dispatch-role.js.map +1 -0
  41. package/build/tools/doc-tools.d.ts +8 -0
  42. package/build/tools/doc-tools.js +102 -0
  43. package/build/tools/doc-tools.js.map +1 -0
  44. package/build/tools/get-project-status.d.ts +8 -0
  45. package/build/tools/get-project-status.js +230 -0
  46. package/build/tools/get-project-status.js.map +1 -0
  47. package/build/tools/get-role-prompt.d.ts +7 -0
  48. package/build/tools/get-role-prompt.js +95 -0
  49. package/build/tools/get-role-prompt.js.map +1 -0
  50. package/build/tools/override-tools.d.ts +6 -0
  51. package/build/tools/override-tools.js +129 -0
  52. package/build/tools/override-tools.js.map +1 -0
  53. package/build/tools/project-init.d.ts +6 -0
  54. package/build/tools/project-init.js +71 -0
  55. package/build/tools/project-init.js.map +1 -0
  56. package/build/tools/report-dispatch.d.ts +11 -0
  57. package/build/tools/report-dispatch.js +142 -0
  58. package/build/tools/report-dispatch.js.map +1 -0
  59. package/build/tools/setup-project.d.ts +8 -0
  60. package/build/tools/setup-project.js +88 -0
  61. package/build/tools/setup-project.js.map +1 -0
  62. package/build/tools/update-phase.d.ts +7 -0
  63. package/build/tools/update-phase.js +79 -0
  64. package/build/tools/update-phase.js.map +1 -0
  65. package/package.json +51 -0
  66. package/workflows/dev/roles/architect.md +66 -0
  67. package/workflows/dev/roles/developer.md +44 -0
  68. package/workflows/dev/roles/pm.md +99 -0
  69. package/workflows/dev/roles/tester.md +44 -0
  70. 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":"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;AAStE;;GAEG;AACH,SAAS,oBAAoB,CAAC,MAAc,EAAE,SAAyB;IACnE,MAAM,aAAa,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAC9D,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAa;QACpB,EAAE;QACF,0BAA0B;QAC1B,EAAE;QACF,wEAAwE;QACxE,wEAAwE;QACxE,EAAE;KACL,CAAC;IAEF,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5D,MAAM,CAAC,GAAG,QAA8B,CAAC;QACzC,MAAM,OAAO,GACT,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM;YACxB,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,qBAAqB,CAAC,CAAC,IAAI,SAAS;YACnD,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,eAAe,CAAC;QAErC,IAAI,WAAW,GAAG,OAAO,KAAK,WAAW,OAAO,EAAE,CAAC;QAEnD,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;iBACpC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC7C,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,WAAW,IAAI,2BAA2B,QAAQ,EAAE,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;YACV,WAAW,IAAI,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC;QACxC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAyB,EAAE,cAAsB;IACvE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAC3B,YAAyC,EACzC,WAA+B,EAC/B,KAAmB;IAEnB,IAAI,CAAC,YAAY;QAAE,OAAO,EAAE,CAAC;IAC7B,OAAO,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,MAAM,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,UAAU;YAAE,OAAO,KAAK,CAAC;QACjE,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,YAAoB;IACxE,MAAM,CAAC,IAAI,CACP,eAAe,EACf,8YAA8Y,EAC9Y;QACI,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;QACpF,UAAU,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,CACL,0HAA0H,CAC7H;QACL,aAAa,EAAE,CAAC;aACX,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CACL,4HAA4H,CAC/H;KACR,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE;QACxD,IAAI,CAAC;YACD,kCAAkC;YAClC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;YAC5C,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE5D,uBAAuB;YACvB,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnD,OAAO;oBACH,OAAO,EAAE;wBACL;4BACI,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,IAAI,2BAA2B,SAAS,EAAE;yBAC5D;qBACJ;oBACD,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YAED,uBAAuB;YACvB,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC;YAEzD,gDAAgD;YAChD,MAAM,eAAe,GAAG,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YAE9F,uBAAuB;YACvB,MAAM,YAAY,GAAG,gBAAgB,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YAChF,MAAM,MAAM,GAAG,aAAa,IAAI,YAAY,EAAE,MAAM,IAAI,EAAE,CAAC;YAE3D,mFAAmF;YACnF,MAAM,SAAS,GAA2B,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAa,EAAE,CAAC;YACjC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzC,IAAI,MAAM,EAAE,QAAQ;oBAAE,SAAS,CAAC,sCAAsC;gBACtE,IAAI,CAAC;oBACD,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBAC1D,CAAC;gBAAC,MAAM,CAAC;oBACL,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;YACL,CAAC;YAED,gCAAgC;YAChC,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAEtD,6CAA6C;YAC7C,MAAM,eAAe,GAAG,sBAAsB,CAAC,YAAY,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAEzF,kCAAkC;YAClC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YAE9D,yBAAyB;YACzB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;YAExG,yBAAyB;YACzB,MAAM,eAAe,GAAG,oBAAoB,CACxC,WAAW,EACX,OAAO,CAAC,WAAW,CAAC,OAAO,EAC3B,UAAU,CAAC,KAAK,CACnB,CAAC;YAEF,6CAA6C;YAC7C,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3E,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;YACnE,MAAM,OAAO,GAAG;gBACZ,eAAe,IAAI,EAAE;gBACrB,EAAE;gBACF,sBAAsB;gBACtB,oBAAoB,QAAQ,CAAC,EAAE,IAAI;gBACnC,aAAa,QAAQ,CAAC,MAAM,EAAE;gBAC9B,EAAE;gBACF,qBAAqB;gBACrB,eAAe;gBACf,EAAE;gBACF,eAAe;gBACf,UAAU;gBACV,EAAE;gBACF,kBAAkB;gBAClB,YAAY,YAAY,EAAE;gBAC1B,cAAc,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE;gBAC3C,eAAe,OAAO,CAAC,WAAW,CAAC,QAAQ,GAAG,SAAS,EAAE;gBACzD,EAAE;gBACF,oBAAoB;gBACpB,cAAc,YAAY,EAAE;gBAC5B,gBAAgB,KAAK,CAAC,UAAU,EAAE;gBAClC,YAAY,KAAK,CAAC,KAAK,EAAE;gBACzB,oBAAoB,KAAK,CAAC,YAAY,EAAE;gBACxC,EAAE;gBACF,uBAAuB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG;aAC5H,CAAC;YAEF,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YAClD,CAAC;YAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,uBAAuB,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACnF,CAAC;YAED,OAAO,CAAC,IAAI,CACR,EAAE,EACF,cAAc,EACd,yEAAyE,QAAQ,CAAC,EAAE,+BAA+B,EACnH,gGAAgG,EAChG,EAAE,EACF,gBAAgB,EAChB,EAAE,EACF,UAAU,CACb,CAAC;YAEF,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;qBAC3B;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;qBACrE;iBACJ;gBACD,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CACzB,WAAwD,EACxD,WAAmB,EACnB,aAAsB;IAEtB,IAAI,WAAW,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc;YACtC,CAAC,CAAC,uBAAuB,WAAW,CAAC,cAAc,IAAI;YACvD,CAAC,CAAC,gCAAgC,CAAC;QACvC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO;YACH,+BAA+B,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE;YACvD,KAAK,OAAO,EAAE;YACd,iBAAiB,WAAW,CAAC,SAAS,IAAI,SAAS,EAAE;YACrD,kBAAkB,WAAW,CAAC,YAAY,EAAE;YAC5C,EAAE;YACF,mEAAmE;YACnE,WAAW,CAAC,cAAc;gBACtB,CAAC,CAAC,kBAAkB,WAAW,CAAC,cAAc,qBAAqB,WAAW,CAAC,cAAc,iCAAiC;gBAC9H,CAAC,CAAC,8FAA8F;SACvG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,OAAO;QACH,8CAA8C;QAC9C,iBAAiB,WAAW,EAAE;QAC9B,EAAE;QACF,+CAA+C;QAC/C,aAAa,CAAC,CAAC,CAAC,0BAA0B,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE;KACjE;SACI,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC"}
@@ -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;