@s_s/harmonia 1.2.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.
Files changed (180) hide show
  1. package/README.md +140 -392
  2. package/build/cli/setup.d.ts +4 -2
  3. package/build/cli/setup.js +44 -18
  4. package/build/cli/setup.js.map +1 -1
  5. package/build/core/action-registry.d.ts +36 -0
  6. package/build/core/action-registry.js +53 -0
  7. package/build/core/action-registry.js.map +1 -0
  8. package/build/core/artifacts.d.ts +66 -0
  9. package/build/core/artifacts.js +178 -0
  10. package/build/core/artifacts.js.map +1 -0
  11. package/build/core/dispatch.d.ts +18 -11
  12. package/build/core/dispatch.js +43 -33
  13. package/build/core/dispatch.js.map +1 -1
  14. package/build/core/issues.d.ts +37 -0
  15. package/build/core/issues.js +100 -0
  16. package/build/core/issues.js.map +1 -0
  17. package/build/core/overrides.d.ts +19 -26
  18. package/build/core/overrides.js +32 -98
  19. package/build/core/overrides.js.map +1 -1
  20. package/build/core/plugin.d.ts +86 -0
  21. package/build/core/plugin.js +332 -0
  22. package/build/core/plugin.js.map +1 -0
  23. package/build/core/registry.d.ts +36 -3
  24. package/build/core/registry.js +63 -5
  25. package/build/core/registry.js.map +1 -1
  26. package/build/core/reviews.d.ts +13 -13
  27. package/build/core/reviews.js +31 -32
  28. package/build/core/reviews.js.map +1 -1
  29. package/build/core/schema.d.ts +43 -15
  30. package/build/core/schema.js +124 -20
  31. package/build/core/schema.js.map +1 -1
  32. package/build/core/state.d.ts +29 -22
  33. package/build/core/state.js +49 -81
  34. package/build/core/state.js.map +1 -1
  35. package/build/core/steps.d.ts +15 -15
  36. package/build/core/steps.js +32 -33
  37. package/build/core/steps.js.map +1 -1
  38. package/build/core/tree-utils.d.ts +52 -0
  39. package/build/core/tree-utils.js +226 -0
  40. package/build/core/tree-utils.js.map +1 -0
  41. package/build/core/types.d.ts +417 -117
  42. package/build/core/types.js +15 -1
  43. package/build/core/types.js.map +1 -1
  44. package/build/core/workflow-engine.d.ts +68 -0
  45. package/build/core/workflow-engine.js +821 -0
  46. package/build/core/workflow-engine.js.map +1 -0
  47. package/build/core/workflow-validator.d.ts +22 -0
  48. package/build/core/workflow-validator.js +489 -0
  49. package/build/core/workflow-validator.js.map +1 -0
  50. package/build/index.js +28 -25
  51. package/build/index.js.map +1 -1
  52. package/build/setup/inject.d.ts +4 -4
  53. package/build/setup/inject.js +6 -6
  54. package/build/setup/inject.js.map +1 -1
  55. package/build/setup/templates.d.ts +9 -7
  56. package/build/setup/templates.js +68 -103
  57. package/build/setup/templates.js.map +1 -1
  58. package/build/tools/artifact-approve.d.ts +8 -0
  59. package/build/tools/artifact-approve.js +94 -0
  60. package/build/tools/artifact-approve.js.map +1 -0
  61. package/build/tools/artifact-schema.d.ts +12 -0
  62. package/build/tools/artifact-schema.js +148 -0
  63. package/build/tools/artifact-schema.js.map +1 -0
  64. package/build/tools/artifact-tools.d.ts +18 -0
  65. package/build/tools/artifact-tools.js +465 -0
  66. package/build/tools/artifact-tools.js.map +1 -0
  67. package/build/tools/{report-dispatch.d.ts → dispatch-report.d.ts} +7 -3
  68. package/build/tools/dispatch-report.js +261 -0
  69. package/build/tools/dispatch-report.js.map +1 -0
  70. package/build/tools/engine-helpers.d.ts +41 -0
  71. package/build/tools/engine-helpers.js +182 -0
  72. package/build/tools/engine-helpers.js.map +1 -0
  73. package/build/tools/get-project-status.d.ts +6 -4
  74. package/build/tools/get-project-status.js +308 -246
  75. package/build/tools/get-project-status.js.map +1 -1
  76. package/build/tools/get-role-prompt.d.ts +1 -1
  77. package/build/tools/get-role-prompt.js +7 -41
  78. package/build/tools/get-role-prompt.js.map +1 -1
  79. package/build/tools/issue-tools.d.ts +10 -0
  80. package/build/tools/issue-tools.js +169 -0
  81. package/build/tools/issue-tools.js.map +1 -0
  82. package/build/tools/iteration-start.d.ts +7 -4
  83. package/build/tools/iteration-start.js +51 -20
  84. package/build/tools/iteration-start.js.map +1 -1
  85. package/build/tools/loop-done.d.ts +11 -0
  86. package/build/tools/loop-done.js +109 -0
  87. package/build/tools/loop-done.js.map +1 -0
  88. package/build/tools/patch-start.d.ts +16 -0
  89. package/build/tools/patch-start.js +122 -0
  90. package/build/tools/patch-start.js.map +1 -0
  91. package/build/tools/project-init.d.ts +5 -5
  92. package/build/tools/project-init.js +47 -18
  93. package/build/tools/project-init.js.map +1 -1
  94. package/build/tools/role-dispatch.d.ts +55 -0
  95. package/build/tools/role-dispatch.js +508 -0
  96. package/build/tools/role-dispatch.js.map +1 -0
  97. package/build/tools/utils.d.ts +40 -0
  98. package/build/tools/utils.js +97 -0
  99. package/build/tools/utils.js.map +1 -0
  100. package/package.json +1 -1
  101. package/{build/hooks/claude-code.js → workflows/dev/hooks/claude.js} +34 -23
  102. package/{build → workflows/dev}/hooks/content.js +27 -18
  103. package/workflows/dev/hooks/index.js +52 -0
  104. package/{build → workflows/dev}/hooks/openclaw.js +31 -20
  105. package/{build → workflows/dev}/hooks/opencode.js +31 -20
  106. package/workflows/dev/roles/architect.md +68 -28
  107. package/workflows/dev/roles/coordinator.md +103 -0
  108. package/workflows/dev/roles/developer.md +5 -5
  109. package/workflows/dev/roles/tester.md +19 -19
  110. package/workflows/dev/schemas/api-contract.json +42 -0
  111. package/workflows/dev/schemas/api-design.json +30 -13
  112. package/workflows/dev/schemas/data-model.json +20 -7
  113. package/workflows/dev/schemas/prd.completeness-check.json +6 -5
  114. package/workflows/dev/schemas/prd.draft.json +13 -5
  115. package/workflows/dev/schemas/prd.final.json +34 -11
  116. package/workflows/dev/schemas/prd.json +29 -11
  117. package/workflows/dev/schemas/prd.requirements.json +6 -5
  118. package/workflows/dev/schemas/prototype.json +6 -2
  119. package/workflows/dev/schemas/task-breakdown.coarse.json +4 -3
  120. package/workflows/dev/schemas/task-breakdown.dependencies.json +5 -4
  121. package/workflows/dev/schemas/task-breakdown.detailed.json +8 -3
  122. package/workflows/dev/schemas/task-breakdown.final.json +8 -3
  123. package/workflows/dev/schemas/task-breakdown.json +8 -3
  124. package/workflows/dev/schemas/tech-design.analysis.json +6 -5
  125. package/workflows/dev/schemas/tech-design.draft.json +14 -5
  126. package/workflows/dev/schemas/tech-design.final.json +39 -13
  127. package/workflows/dev/schemas/tech-design.json +34 -13
  128. package/workflows/dev/schemas/tech-design.research.json +21 -0
  129. package/workflows/dev/schemas/test-plan.json +17 -7
  130. package/workflows/dev/schemas/test-report.json +26 -9
  131. package/workflows/dev/schemas/user-stories.json +7 -3
  132. package/workflows/dev/tools/index.js +23 -0
  133. package/workflows/dev/workflow.json +234 -101
  134. package/build/core/docs.d.ts +0 -32
  135. package/build/core/docs.js +0 -91
  136. package/build/core/docs.js.map +0 -1
  137. package/build/core/workflow.d.ts +0 -33
  138. package/build/core/workflow.js +0 -140
  139. package/build/core/workflow.js.map +0 -1
  140. package/build/hooks/claude-code.d.ts +0 -20
  141. package/build/hooks/claude-code.js.map +0 -1
  142. package/build/hooks/content.d.ts +0 -43
  143. package/build/hooks/content.js.map +0 -1
  144. package/build/hooks/install.d.ts +0 -40
  145. package/build/hooks/install.js +0 -63
  146. package/build/hooks/install.js.map +0 -1
  147. package/build/hooks/openclaw.d.ts +0 -24
  148. package/build/hooks/openclaw.js.map +0 -1
  149. package/build/hooks/opencode.d.ts +0 -29
  150. package/build/hooks/opencode.js.map +0 -1
  151. package/build/tools/approve-doc.d.ts +0 -6
  152. package/build/tools/approve-doc.js +0 -108
  153. package/build/tools/approve-doc.js.map +0 -1
  154. package/build/tools/dispatch-role.d.ts +0 -16
  155. package/build/tools/dispatch-role.js +0 -277
  156. package/build/tools/dispatch-role.js.map +0 -1
  157. package/build/tools/doc-tools.d.ts +0 -16
  158. package/build/tools/doc-tools.js +0 -389
  159. package/build/tools/doc-tools.js.map +0 -1
  160. package/build/tools/override-tools.d.ts +0 -6
  161. package/build/tools/override-tools.js +0 -129
  162. package/build/tools/override-tools.js.map +0 -1
  163. package/build/tools/report-dispatch.js +0 -194
  164. package/build/tools/report-dispatch.js.map +0 -1
  165. package/build/tools/set-scale.d.ts +0 -6
  166. package/build/tools/set-scale.js +0 -107
  167. package/build/tools/set-scale.js.map +0 -1
  168. package/build/tools/setup-project.d.ts +0 -8
  169. package/build/tools/setup-project.js +0 -116
  170. package/build/tools/setup-project.js.map +0 -1
  171. package/build/tools/update-phase.d.ts +0 -12
  172. package/build/tools/update-phase.js +0 -159
  173. package/build/tools/update-phase.js.map +0 -1
  174. package/workflows/dev/roles/pm.md +0 -99
  175. package/workflows/dev/schemas/deploy.json +0 -20
  176. package/workflows/dev/schemas/fsd.json +0 -25
  177. package/workflows/dev/schemas/project-plan.json +0 -20
  178. package/workflows/dev/schemas/retrospective.json +0 -20
  179. package/workflows/dev/schemas/risk-assessment.json +0 -15
  180. package/workflows/dev/schemas/tech-design.api-contract.json +0 -20
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loop-done.js","sourceRoot":"","sources":["../../src/tools/loop-done.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * MCP Tool: patch_start
3
+ * Start a new patch for a registered project.
4
+ *
5
+ * Creates the patch directory (patch-N/), initializes state.json with
6
+ * node-based workflow state, type=patch.
7
+ * Optionally links to an issue via issue_id.
8
+ *
9
+ * After initialization, starts the workflow engine and returns initial nextAction.
10
+ *
11
+ * Guards:
12
+ * - Project must be registered (use project_init first)
13
+ * - At least one iteration must have been started (patches fix existing work)
14
+ */
15
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
16
+ export declare function registerPatchStart(server: McpServer, workflowsDir: string): void;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * MCP Tool: patch_start
3
+ * Start a new patch for a registered project.
4
+ *
5
+ * Creates the patch directory (patch-N/), initializes state.json with
6
+ * node-based workflow state, type=patch.
7
+ * Optionally links to an issue via issue_id.
8
+ *
9
+ * After initialization, starts the workflow engine and returns initial nextAction.
10
+ *
11
+ * Guards:
12
+ * - Project must be registered (use project_init first)
13
+ * - At least one iteration must have been started (patches fix existing work)
14
+ */
15
+ import { z } from 'zod';
16
+ import { getProject, startPatch, getPatchDir } from '../core/registry.js';
17
+ import { loadWorkflow } from '../core/plugin.js';
18
+ import { initWorkflowState, persistState } from '../core/state.js';
19
+ import { startWorkflow } from '../core/workflow-engine.js';
20
+ import { formatNextAction } from './engine-helpers.js';
21
+ export function registerPatchStart(server, workflowsDir) {
22
+ server.tool('patch_start', 'Start a new patch for a registered project. Patches are lightweight fix cycles for bug fixes and small improvements. Use this for resolving issues found during testing or from user feedback.', {
23
+ project_name: z.string().describe('项目名称'),
24
+ description: z.string().optional().describe('补丁描述(简要说明修复内容)'),
25
+ issue_id: z.string().optional().describe('关联的 issue ID(如果是修复某个 issue)'),
26
+ }, async ({ project_name, description, issue_id }) => {
27
+ try {
28
+ // Guard: project must be registered
29
+ const entry = await getProject(project_name);
30
+ if (!entry) {
31
+ return {
32
+ content: [
33
+ {
34
+ type: 'text',
35
+ text: `项目 "${project_name}" 未注册。请先调用 project_init 注册项目。`,
36
+ },
37
+ ],
38
+ isError: true,
39
+ };
40
+ }
41
+ // Guard: at least one iteration must exist (patches fix existing work)
42
+ if (entry.totalIterations === 0) {
43
+ return {
44
+ content: [
45
+ {
46
+ type: 'text',
47
+ text: [
48
+ `项目 "${project_name}" 尚未有任何迭代。`,
49
+ `补丁用于修复已有工作,请先调用 iteration_start 开始第一轮迭代。`,
50
+ ].join('\n'),
51
+ },
52
+ ],
53
+ isError: true,
54
+ };
55
+ }
56
+ // Start new patch (creates directory, updates registry)
57
+ const newPatch = await startPatch(project_name);
58
+ // Load workflow and initialize state in patch mode
59
+ const wf = await loadWorkflow(workflowsDir, entry.workflow);
60
+ const patchDir = getPatchDir(project_name, newPatch);
61
+ const state = await initWorkflowState(project_name, entry.dir, wf, newPatch, 'patch', patchDir);
62
+ // Persist patch metadata (issue_id, description)
63
+ if (issue_id || description) {
64
+ state.meta = {
65
+ ...(description ? { description } : {}),
66
+ ...(issue_id ? { issueId: issue_id } : {}),
67
+ };
68
+ await persistState(project_name, newPatch, state, patchDir);
69
+ }
70
+ // Start the workflow engine
71
+ const emptyGate = {
72
+ artifactExists: () => false,
73
+ artifactApproved: () => false,
74
+ artifactField: () => undefined,
75
+ };
76
+ const engineCtx = {
77
+ gate: emptyGate,
78
+ getRolePrompt: (role) => {
79
+ const roleDef = wf.roles[role];
80
+ return roleDef?.prompt ?? `Role "${role}" prompt not found`;
81
+ },
82
+ };
83
+ const result = startWorkflow(wf.definition, state, engineCtx);
84
+ await persistState(project_name, newPatch, result.state, patchDir);
85
+ const nextActionText = formatNextAction(result.nextAction);
86
+ const descLine = description ? `描述: ${description}` : '';
87
+ const issueLine = issue_id ? `关联 issue: ${issue_id}` : '';
88
+ return {
89
+ content: [
90
+ {
91
+ type: 'text',
92
+ text: [
93
+ `补丁 patch-${newPatch} 已开始。`,
94
+ ``,
95
+ `项目: ${project_name}`,
96
+ `源代码目录: ${entry.dir}`,
97
+ `工作流: ${wf.definition.name}`,
98
+ descLine,
99
+ issueLine,
100
+ ``,
101
+ nextActionText,
102
+ ]
103
+ .filter(Boolean)
104
+ .join('\n'),
105
+ },
106
+ ],
107
+ };
108
+ }
109
+ catch (err) {
110
+ return {
111
+ content: [
112
+ {
113
+ type: 'text',
114
+ text: `Error: ${err instanceof Error ? err.message : String(err)}`,
115
+ },
116
+ ],
117
+ isError: true,
118
+ };
119
+ }
120
+ });
121
+ }
122
+ //# sourceMappingURL=patch-start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patch-start.js","sourceRoot":"","sources":["../../src/tools/patch-start.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * MCP Tool: project_init
3
- * Register a new Harmonia project in the global registry.
3
+ * Register a new Harmonia project in the global registry and install workflow hooks.
4
4
  *
5
- * This tool ONLY registers the project it does NOT create iteration directories
6
- * or initialize state. After registration, call `iteration_start` to begin the
7
- * first iteration.
5
+ * This tool registers the project AND installs workflow-defined hooks for the
6
+ * detected agent. It does NOT create iteration directories or initialize state.
7
+ * After registration, call `iteration_start` to begin the first iteration.
8
8
  *
9
9
  * Supports an optional `workflow` parameter. When multiple workflows are
10
10
  * available and none is specified, returns an error with the available list
11
11
  * so the agent can re-call with a specific choice.
12
12
  */
13
13
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
14
- export declare function registerProjectInit(server: McpServer, builtinDir: string, customDir: string): void;
14
+ export declare function registerProjectInit(server: McpServer, workflowsDir: string): void;
@@ -1,19 +1,23 @@
1
1
  /**
2
2
  * MCP Tool: project_init
3
- * Register a new Harmonia project in the global registry.
3
+ * Register a new Harmonia project in the global registry and install workflow hooks.
4
4
  *
5
- * This tool ONLY registers the project it does NOT create iteration directories
6
- * or initialize state. After registration, call `iteration_start` to begin the
7
- * first iteration.
5
+ * This tool registers the project AND installs workflow-defined hooks for the
6
+ * detected agent. It does NOT create iteration directories or initialize state.
7
+ * After registration, call `iteration_start` to begin the first iteration.
8
8
  *
9
9
  * Supports an optional `workflow` parameter. When multiple workflows are
10
10
  * available and none is specified, returns an error with the available list
11
11
  * so the agent can re-call with a specific choice.
12
12
  */
13
13
  import { z } from 'zod';
14
- import { loadWorkflow, listWorkflows } from '../core/workflow.js';
15
- import { registerProject, getProject } from '../core/registry.js';
16
- export function registerProjectInit(server, builtinDir, customDir) {
14
+ import { createKit, defineHooks } from '@s_s/agent-kit';
15
+ import { loadWorkflow, listWorkflows } from '../core/plugin.js';
16
+ import { registerProject, getProject, getGlobalDir } from '../core/registry.js';
17
+ import { detectHostAgent } from '../setup/inject.js';
18
+ /** Shared kit instance for hook installation */
19
+ const kit = createKit('harmonia');
20
+ export function registerProjectInit(server, workflowsDir) {
17
21
  server.tool('project_init', 'Register a new Harmonia project. Creates the project entry in the global registry and the project source directory. Does NOT start an iteration — call iteration_start after registration to begin the first iteration.', {
18
22
  project_name: z
19
23
  .string()
@@ -33,9 +37,9 @@ export function registerProjectInit(server, builtinDir, customDir) {
33
37
  // Check if already registered
34
38
  const existing = await getProject(project_name);
35
39
  if (existing) {
36
- const iterInfo = existing.currentIteration > 0
37
- ? `当前迭代: iter-${existing.currentIteration} (共 ${existing.totalIterations} 轮)`
38
- : '尚未开始迭代';
40
+ const contextInfo = existing.activeContext
41
+ ? `活跃上下文: ${existing.activeContext}`
42
+ : '尚未开始迭代或补丁';
39
43
  return {
40
44
  content: [
41
45
  {
@@ -45,14 +49,12 @@ export function registerProjectInit(server, builtinDir, customDir) {
45
49
  ``,
46
50
  `源代码目录: ${existing.dir}`,
47
51
  `工作流: ${existing.workflow}`,
48
- `${iterInfo}`,
52
+ `迭代: ${existing.totalIterations} 轮,补丁: ${existing.totalPatches} 个`,
53
+ `${contextInfo}`,
49
54
  ``,
50
- existing.currentIteration > 0
55
+ existing.activeContext
51
56
  ? `如需查看当前状态,请调用 project_status(project_name="${project_name}")。`
52
57
  : `请调用 iteration_start(project_name="${project_name}") 开始第一轮迭代。`,
53
- existing.currentIteration > 0
54
- ? `如需开始新一轮迭代,请调用 iteration_start(project_name="${project_name}")。`
55
- : '',
56
58
  ]
57
59
  .filter(Boolean)
58
60
  .join('\n'),
@@ -61,7 +63,7 @@ export function registerProjectInit(server, builtinDir, customDir) {
61
63
  };
62
64
  }
63
65
  // Resolve workflow name
64
- const available = await listWorkflows(builtinDir, customDir);
66
+ const available = await listWorkflows(workflowsDir);
65
67
  if (available.length === 0) {
66
68
  return {
67
69
  content: [
@@ -99,7 +101,7 @@ export function registerProjectInit(server, builtinDir, customDir) {
99
101
  const descriptions = [];
100
102
  for (const name of available) {
101
103
  try {
102
- const wf = await loadWorkflow(builtinDir, customDir, name);
104
+ const wf = await loadWorkflow(workflowsDir, name);
103
105
  descriptions.push(`- ${name}: ${wf.definition.description}`);
104
106
  }
105
107
  catch {
@@ -123,9 +125,35 @@ export function registerProjectInit(server, builtinDir, customDir) {
123
125
  };
124
126
  }
125
127
  // Load workflow definition (validate it loads correctly)
126
- const wf = await loadWorkflow(builtinDir, customDir, workflowName);
128
+ const wf = await loadWorkflow(workflowsDir, workflowName);
127
129
  // Register project (creates global data dir + project source dir)
128
130
  await registerProject(project_name, project_dir, workflowName);
131
+ // Install workflow hooks if the plugin provides a hook creator
132
+ let hookMessage = '';
133
+ if (wf.hooks) {
134
+ try {
135
+ const agentType = await detectHostAgent(project_dir);
136
+ const context = {
137
+ defineHooks,
138
+ dataDir: getGlobalDir(),
139
+ projectName: project_name,
140
+ };
141
+ const hookSet = wf.hooks(agentType, context);
142
+ const hookResult = await kit.installHooks(agentType, hookSet);
143
+ if (hookResult.success) {
144
+ hookMessage = `\nHooks 已安装 (${hookResult.filesWritten.length} 个文件)`;
145
+ if (hookResult.warnings.length > 0) {
146
+ hookMessage += `\n警告: ${hookResult.warnings.join('; ')}`;
147
+ }
148
+ }
149
+ else {
150
+ hookMessage = `\n[warn] Hook 安装失败: ${hookResult.error ?? '未知错误'}`;
151
+ }
152
+ }
153
+ catch (err) {
154
+ hookMessage = `\n[warn] Hook 安装出错: ${err instanceof Error ? err.message : String(err)}`;
155
+ }
156
+ }
129
157
  return {
130
158
  content: [
131
159
  {
@@ -136,6 +164,7 @@ export function registerProjectInit(server, builtinDir, customDir) {
136
164
  `源代码目录: ${project_dir}`,
137
165
  `工作流: ${wf.definition.name} (${wf.definition.description})`,
138
166
  `可用角色: ${Object.keys(wf.roles).join(', ')}`,
167
+ hookMessage,
139
168
  ``,
140
169
  `下一步: 调用 iteration_start(project_name="${project_name}") 开始第一轮迭代。`,
141
170
  ].join('\n'),
@@ -1 +1 @@
1
- {"version":3,"file":"project-init.js","sourceRoot":"","sources":["../../src/tools/project-init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"project-init.js","sourceRoot":"","sources":["../../src/tools/project-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * MCP Tool: role_dispatch
3
+ *
4
+ * Prepare all data needed to hand off a task to a team member role.
5
+ * Returns: role prompt (with overrides injected), session guidance,
6
+ * input artifacts, task brief, and dispatch tracking info.
7
+ *
8
+ * Node-based architecture: validates against workflow node states.
9
+ * Accepts an optional node_id parameter to target a specific task node.
10
+ *
11
+ * Session/parallel behavior is enforced by Core:
12
+ * - session: none → never searches for idle sessions
13
+ * - session: persistent → searches for idle sessions, directs reuse
14
+ * - session: optional → searches for idle sessions, suggests reuse
15
+ * - parallel: true + running dispatch → forces new session
16
+ *
17
+ * Automatically:
18
+ * - Creates a dispatch record for tracking
19
+ * - Enforces session/parallel strategy from role frontmatter
20
+ * - Triggers a dispatch_requested engine event
21
+ * - Returns nextAction from the workflow engine
22
+ *
23
+ * This tool does NOT launch agents — it only prepares the data.
24
+ * The coordinator decides how to pass this to the team member.
25
+ */
26
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
27
+ import type { ArtifactIOContext } from '../core/artifacts.js';
28
+ import type { WorkflowPlugin } from '../core/types.js';
29
+ /**
30
+ * Get file extension from artifact definition format.
31
+ * - 'html' → '.html'
32
+ * - 'json' → '.json'
33
+ * - 'md' or undefined → '.md'
34
+ */
35
+ export declare function getFormatExtension(format?: 'md' | 'html' | 'json'): string;
36
+ /** A resolved input artifact reference */
37
+ export interface InputReference {
38
+ /** Artifact ID */
39
+ id: string;
40
+ /** Human-readable name from artifact definition */
41
+ name: string;
42
+ /** Resolved file path (managed) or directory path (unmanaged) */
43
+ path: string;
44
+ /** Whether this artifact was found on disk */
45
+ found: boolean;
46
+ }
47
+ /**
48
+ * Resolve an artifact ID to a name + path reference.
49
+ *
50
+ * - Managed artifacts: resolves to full file path via format → extension mapping
51
+ * - Unmanaged artifacts: resolves to the output directory
52
+ * - Unknown artifacts: returns not-found
53
+ */
54
+ export declare function resolveInputReference(artifactId: string, wf: WorkflowPlugin, ioCtx: ArtifactIOContext, existingArtifacts: Set<string>): InputReference;
55
+ export declare function registerDispatchRole(server: McpServer, workflowsDir: string): void;