@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.
- package/README.md +140 -392
- package/build/cli/setup.d.ts +4 -2
- package/build/cli/setup.js +44 -18
- package/build/cli/setup.js.map +1 -1
- package/build/core/action-registry.d.ts +36 -0
- package/build/core/action-registry.js +53 -0
- package/build/core/action-registry.js.map +1 -0
- package/build/core/artifacts.d.ts +66 -0
- package/build/core/artifacts.js +178 -0
- package/build/core/artifacts.js.map +1 -0
- package/build/core/dispatch.d.ts +18 -11
- package/build/core/dispatch.js +43 -33
- package/build/core/dispatch.js.map +1 -1
- package/build/core/issues.d.ts +37 -0
- package/build/core/issues.js +100 -0
- package/build/core/issues.js.map +1 -0
- package/build/core/overrides.d.ts +19 -26
- package/build/core/overrides.js +32 -98
- package/build/core/overrides.js.map +1 -1
- package/build/core/plugin.d.ts +86 -0
- package/build/core/plugin.js +332 -0
- package/build/core/plugin.js.map +1 -0
- package/build/core/registry.d.ts +36 -3
- package/build/core/registry.js +63 -5
- package/build/core/registry.js.map +1 -1
- package/build/core/reviews.d.ts +13 -13
- package/build/core/reviews.js +31 -32
- package/build/core/reviews.js.map +1 -1
- package/build/core/schema.d.ts +43 -15
- package/build/core/schema.js +124 -20
- package/build/core/schema.js.map +1 -1
- package/build/core/state.d.ts +29 -22
- package/build/core/state.js +49 -81
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +15 -15
- package/build/core/steps.js +32 -33
- package/build/core/steps.js.map +1 -1
- package/build/core/tree-utils.d.ts +52 -0
- package/build/core/tree-utils.js +226 -0
- package/build/core/tree-utils.js.map +1 -0
- package/build/core/types.d.ts +417 -117
- package/build/core/types.js +15 -1
- package/build/core/types.js.map +1 -1
- package/build/core/workflow-engine.d.ts +68 -0
- package/build/core/workflow-engine.js +821 -0
- package/build/core/workflow-engine.js.map +1 -0
- package/build/core/workflow-validator.d.ts +22 -0
- package/build/core/workflow-validator.js +489 -0
- package/build/core/workflow-validator.js.map +1 -0
- package/build/index.js +28 -25
- package/build/index.js.map +1 -1
- package/build/setup/inject.d.ts +4 -4
- package/build/setup/inject.js +6 -6
- package/build/setup/inject.js.map +1 -1
- package/build/setup/templates.d.ts +9 -7
- package/build/setup/templates.js +68 -103
- package/build/setup/templates.js.map +1 -1
- package/build/tools/artifact-approve.d.ts +8 -0
- package/build/tools/artifact-approve.js +94 -0
- package/build/tools/artifact-approve.js.map +1 -0
- package/build/tools/artifact-schema.d.ts +12 -0
- package/build/tools/artifact-schema.js +148 -0
- package/build/tools/artifact-schema.js.map +1 -0
- package/build/tools/artifact-tools.d.ts +18 -0
- package/build/tools/artifact-tools.js +465 -0
- package/build/tools/artifact-tools.js.map +1 -0
- package/build/tools/{report-dispatch.d.ts → dispatch-report.d.ts} +7 -3
- package/build/tools/dispatch-report.js +261 -0
- package/build/tools/dispatch-report.js.map +1 -0
- package/build/tools/engine-helpers.d.ts +41 -0
- package/build/tools/engine-helpers.js +182 -0
- package/build/tools/engine-helpers.js.map +1 -0
- package/build/tools/get-project-status.d.ts +6 -4
- package/build/tools/get-project-status.js +308 -246
- package/build/tools/get-project-status.js.map +1 -1
- package/build/tools/get-role-prompt.d.ts +1 -1
- package/build/tools/get-role-prompt.js +7 -41
- package/build/tools/get-role-prompt.js.map +1 -1
- package/build/tools/issue-tools.d.ts +10 -0
- package/build/tools/issue-tools.js +169 -0
- package/build/tools/issue-tools.js.map +1 -0
- package/build/tools/iteration-start.d.ts +7 -4
- package/build/tools/iteration-start.js +51 -20
- package/build/tools/iteration-start.js.map +1 -1
- package/build/tools/loop-done.d.ts +11 -0
- package/build/tools/loop-done.js +109 -0
- package/build/tools/loop-done.js.map +1 -0
- package/build/tools/patch-start.d.ts +16 -0
- package/build/tools/patch-start.js +122 -0
- package/build/tools/patch-start.js.map +1 -0
- package/build/tools/project-init.d.ts +5 -5
- package/build/tools/project-init.js +47 -18
- package/build/tools/project-init.js.map +1 -1
- package/build/tools/role-dispatch.d.ts +55 -0
- package/build/tools/role-dispatch.js +508 -0
- package/build/tools/role-dispatch.js.map +1 -0
- package/build/tools/utils.d.ts +40 -0
- package/build/tools/utils.js +97 -0
- package/build/tools/utils.js.map +1 -0
- package/package.json +1 -1
- package/{build/hooks/claude-code.js → workflows/dev/hooks/claude.js} +34 -23
- package/{build → workflows/dev}/hooks/content.js +27 -18
- package/workflows/dev/hooks/index.js +52 -0
- package/{build → workflows/dev}/hooks/openclaw.js +31 -20
- package/{build → workflows/dev}/hooks/opencode.js +31 -20
- package/workflows/dev/roles/architect.md +68 -28
- package/workflows/dev/roles/coordinator.md +103 -0
- package/workflows/dev/roles/developer.md +5 -5
- package/workflows/dev/roles/tester.md +19 -19
- package/workflows/dev/schemas/api-contract.json +42 -0
- package/workflows/dev/schemas/api-design.json +30 -13
- package/workflows/dev/schemas/data-model.json +20 -7
- package/workflows/dev/schemas/prd.completeness-check.json +6 -5
- package/workflows/dev/schemas/prd.draft.json +13 -5
- package/workflows/dev/schemas/prd.final.json +34 -11
- package/workflows/dev/schemas/prd.json +29 -11
- package/workflows/dev/schemas/prd.requirements.json +6 -5
- package/workflows/dev/schemas/prototype.json +6 -2
- package/workflows/dev/schemas/task-breakdown.coarse.json +4 -3
- package/workflows/dev/schemas/task-breakdown.dependencies.json +5 -4
- package/workflows/dev/schemas/task-breakdown.detailed.json +8 -3
- package/workflows/dev/schemas/task-breakdown.final.json +8 -3
- package/workflows/dev/schemas/task-breakdown.json +8 -3
- package/workflows/dev/schemas/tech-design.analysis.json +6 -5
- package/workflows/dev/schemas/tech-design.draft.json +14 -5
- package/workflows/dev/schemas/tech-design.final.json +39 -13
- package/workflows/dev/schemas/tech-design.json +34 -13
- package/workflows/dev/schemas/tech-design.research.json +21 -0
- package/workflows/dev/schemas/test-plan.json +17 -7
- package/workflows/dev/schemas/test-report.json +26 -9
- package/workflows/dev/schemas/user-stories.json +7 -3
- package/workflows/dev/tools/index.js +23 -0
- package/workflows/dev/workflow.json +234 -101
- package/build/core/docs.d.ts +0 -32
- package/build/core/docs.js +0 -91
- package/build/core/docs.js.map +0 -1
- package/build/core/workflow.d.ts +0 -33
- package/build/core/workflow.js +0 -140
- package/build/core/workflow.js.map +0 -1
- package/build/hooks/claude-code.d.ts +0 -20
- package/build/hooks/claude-code.js.map +0 -1
- package/build/hooks/content.d.ts +0 -43
- package/build/hooks/content.js.map +0 -1
- package/build/hooks/install.d.ts +0 -40
- package/build/hooks/install.js +0 -63
- package/build/hooks/install.js.map +0 -1
- package/build/hooks/openclaw.d.ts +0 -24
- package/build/hooks/openclaw.js.map +0 -1
- package/build/hooks/opencode.d.ts +0 -29
- package/build/hooks/opencode.js.map +0 -1
- package/build/tools/approve-doc.d.ts +0 -6
- package/build/tools/approve-doc.js +0 -108
- package/build/tools/approve-doc.js.map +0 -1
- package/build/tools/dispatch-role.d.ts +0 -16
- package/build/tools/dispatch-role.js +0 -277
- package/build/tools/dispatch-role.js.map +0 -1
- package/build/tools/doc-tools.d.ts +0 -16
- package/build/tools/doc-tools.js +0 -389
- package/build/tools/doc-tools.js.map +0 -1
- package/build/tools/override-tools.d.ts +0 -6
- package/build/tools/override-tools.js +0 -129
- package/build/tools/override-tools.js.map +0 -1
- package/build/tools/report-dispatch.js +0 -194
- package/build/tools/report-dispatch.js.map +0 -1
- package/build/tools/set-scale.d.ts +0 -6
- package/build/tools/set-scale.js +0 -107
- package/build/tools/set-scale.js.map +0 -1
- package/build/tools/setup-project.d.ts +0 -8
- package/build/tools/setup-project.js +0 -116
- package/build/tools/setup-project.js.map +0 -1
- package/build/tools/update-phase.d.ts +0 -12
- package/build/tools/update-phase.js +0 -159
- package/build/tools/update-phase.js.map +0 -1
- package/workflows/dev/roles/pm.md +0 -99
- package/workflows/dev/schemas/deploy.json +0 -20
- package/workflows/dev/schemas/fsd.json +0 -25
- package/workflows/dev/schemas/project-plan.json +0 -20
- package/workflows/dev/schemas/retrospective.json +0 -20
- package/workflows/dev/schemas/risk-assessment.json +0 -15
- package/workflows/dev/schemas/tech-design.api-contract.json +0 -20
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-done.js","sourceRoot":"","sources":["../../src/tools/loop-done.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,YAAoB;IACpE,MAAM,CAAC,IAAI,CACP,WAAW,EACX,+LAA+L,EAC/L;QACI,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QACjD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE;QAChC,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC;YAE7B,+CAA+C;YAC/C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAE5D,sCAAsC;YACtC,MAAM,IAAI,GAAG,cAAc,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,OAAO;oBACH,OAAO,EAAE;wBACL;4BACI,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,OAAO,yCAAyC;yBAClE;qBACJ;oBACD,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACvB,OAAO;oBACH,OAAO,EAAE;wBACL;4BACI,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,OAAO,UAAU,IAAI,CAAC,IAAI,sEAAsE;yBAClH;qBACJ;oBACD,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YAED,2BAA2B;YAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAA8B,CAAC;YACpE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC9C,OAAO;oBACH,OAAO,EAAE;wBACL;4BACI,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,OAAO,oCAAoC,SAAS,EAAE,MAAM,IAAI,SAAS,yCAAyC;yBACpI;qBACJ;oBACD,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YAED,+BAA+B;YAC/B,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO;oBACH,OAAO,EAAE;wBACL;4BACI,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,SAAS,OAAO,kDAAkD,SAAS,CAAC,gBAAgB,uDAAuD;yBAC5J;qBACJ;iBACJ,CAAC;YACN,CAAC;YAED,iDAAiD;YACjD,MAAM,YAAY,GAAG,MAAM,oBAAoB,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE;gBAC7E,IAAI,EAAE,WAAW;gBACjB,MAAM,EAAE,OAAO;aAClB,CAAC,CAAC;YAEH,MAAM,cAAc,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;YAE1E,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE;4BACF,SAAS,OAAO,2BAA2B;4BAC3C,sBAAsB,cAAc,CAAC,gBAAgB,EAAE;4BACvD,8EAA8E;4BAC9E,gBAAgB,CAAC,YAAY,CAAC,UAAU,CAAC;yBAC5C,CAAC,IAAI,CAAC,IAAI,CAAC;qBACf;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"}
|
|
@@ -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
|
|
6
|
-
*
|
|
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,
|
|
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
|
|
6
|
-
*
|
|
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 {
|
|
15
|
-
import {
|
|
16
|
-
|
|
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
|
|
37
|
-
?
|
|
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
|
-
|
|
52
|
+
`迭代: ${existing.totalIterations} 轮,补丁: ${existing.totalPatches} 个`,
|
|
53
|
+
`${contextInfo}`,
|
|
49
54
|
``,
|
|
50
|
-
existing.
|
|
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(
|
|
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(
|
|
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(
|
|
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":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,
|
|
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;
|