@s_s/harmonia 1.1.1 → 1.3.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 +413 -205
- package/build/core/dispatch.d.ts +16 -13
- package/build/core/dispatch.js +38 -33
- package/build/core/dispatch.js.map +1 -1
- package/build/core/docs.d.ts +15 -11
- package/build/core/docs.js +24 -19
- package/build/core/docs.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/registry.d.ts +63 -6
- package/build/core/registry.js +109 -8
- package/build/core/registry.js.map +1 -1
- package/build/core/reviews.d.ts +9 -8
- package/build/core/reviews.js +22 -20
- package/build/core/reviews.js.map +1 -1
- package/build/core/state.d.ts +18 -10
- package/build/core/state.js +50 -27
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +8 -7
- package/build/core/steps.js +21 -19
- package/build/core/steps.js.map +1 -1
- package/build/core/types.d.ts +32 -1
- package/build/index.js +34 -3
- package/build/index.js.map +1 -1
- package/build/setup/templates.js +79 -3
- package/build/setup/templates.js.map +1 -1
- package/build/tools/approve-doc.js +9 -2
- package/build/tools/approve-doc.js.map +1 -1
- package/build/tools/dispatch-role.js +8 -4
- package/build/tools/dispatch-role.js.map +1 -1
- package/build/tools/doc-tools.js +100 -21
- package/build/tools/doc-tools.js.map +1 -1
- package/build/tools/get-project-status.js +108 -17
- package/build/tools/get-project-status.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 +13 -0
- package/build/tools/iteration-start.js +103 -0
- package/build/tools/iteration-start.js.map +1 -0
- package/build/tools/patch-start.d.ts +14 -0
- package/build/tools/patch-start.js +97 -0
- package/build/tools/patch-start.js.map +1 -0
- package/build/tools/project-init.d.ts +5 -1
- package/build/tools/project-init.js +28 -14
- package/build/tools/project-init.js.map +1 -1
- package/build/tools/report-dispatch.js +23 -19
- package/build/tools/report-dispatch.js.map +1 -1
- package/build/tools/set-scale.js +7 -4
- package/build/tools/set-scale.js.map +1 -1
- package/build/tools/update-phase.js +11 -7
- package/build/tools/update-phase.js.map +1 -1
- package/build/tools/utils.d.ts +34 -0
- package/build/tools/utils.js +61 -0
- package/build/tools/utils.js.map +1 -0
- package/package.json +1 -1
package/build/core/steps.d.ts
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Step state management — manages <
|
|
2
|
+
* Step state management — manages <context_dir>/steps.json
|
|
3
3
|
*
|
|
4
4
|
* Tracks which sequential steps have been completed for each document,
|
|
5
5
|
* supporting the P3 Sequential mode feature.
|
|
6
|
+
* All public functions accept an optional contextDir parameter.
|
|
6
7
|
*/
|
|
7
8
|
import type { DocStepState } from './types.js';
|
|
8
9
|
/**
|
|
9
|
-
* Read the steps state for a project.
|
|
10
|
+
* Read the steps state for a project context.
|
|
10
11
|
*/
|
|
11
|
-
export declare function readSteps(projectName: string): Promise<Record<string, DocStepState>>;
|
|
12
|
+
export declare function readSteps(projectName: string, iteration: number, contextDir?: string): Promise<Record<string, DocStepState>>;
|
|
12
13
|
/**
|
|
13
14
|
* Get the step state for a specific document.
|
|
14
15
|
*/
|
|
15
|
-
export declare function getDocStepState(projectName: string, docId: string): Promise<DocStepState | null>;
|
|
16
|
+
export declare function getDocStepState(projectName: string, iteration: number, docId: string, contextDir?: string): Promise<DocStepState | null>;
|
|
16
17
|
/**
|
|
17
18
|
* Get the set of completed step IDs for a document.
|
|
18
19
|
*/
|
|
@@ -23,12 +24,12 @@ export declare function getCompletedStepIds(state: DocStepState | null): Set<str
|
|
|
23
24
|
*
|
|
24
25
|
* @returns The updated DocStepState
|
|
25
26
|
*/
|
|
26
|
-
export declare function recordStepCompletion(projectName: string, docId: string, stepId: string, artifactPath: string, allStepIds: string[]): Promise<DocStepState>;
|
|
27
|
+
export declare function recordStepCompletion(projectName: string, iteration: number, docId: string, stepId: string, artifactPath: string, allStepIds: string[], contextDir?: string): Promise<DocStepState>;
|
|
27
28
|
/**
|
|
28
29
|
* Mark a document as finalized (all steps completed + final doc written).
|
|
29
30
|
*/
|
|
30
|
-
export declare function markFinalized(projectName: string, docId: string): Promise<DocStepState>;
|
|
31
|
+
export declare function markFinalized(projectName: string, iteration: number, docId: string, contextDir?: string): Promise<DocStepState>;
|
|
31
32
|
/**
|
|
32
33
|
* Check if a document's sequential process is finalized.
|
|
33
34
|
*/
|
|
34
|
-
export declare function isDocFinalized(projectName: string, docId: string): Promise<boolean>;
|
|
35
|
+
export declare function isDocFinalized(projectName: string, iteration: number, docId: string, contextDir?: string): Promise<boolean>;
|
package/build/core/steps.js
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Step state management — manages <
|
|
2
|
+
* Step state management — manages <context_dir>/steps.json
|
|
3
3
|
*
|
|
4
4
|
* Tracks which sequential steps have been completed for each document,
|
|
5
5
|
* supporting the P3 Sequential mode feature.
|
|
6
|
+
* All public functions accept an optional contextDir parameter.
|
|
6
7
|
*/
|
|
7
8
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
8
9
|
import { join, dirname } from 'node:path';
|
|
9
|
-
import {
|
|
10
|
+
import { getIterationDir } from './registry.js';
|
|
10
11
|
const STEPS_FILE = 'steps.json';
|
|
11
|
-
function stepsPath(projectName) {
|
|
12
|
-
|
|
12
|
+
function stepsPath(projectName, iteration, contextDir) {
|
|
13
|
+
const base = contextDir ?? getIterationDir(projectName, iteration);
|
|
14
|
+
return join(base, STEPS_FILE);
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
15
|
-
* Read the steps state for a project.
|
|
17
|
+
* Read the steps state for a project context.
|
|
16
18
|
*/
|
|
17
|
-
export async function readSteps(projectName) {
|
|
19
|
+
export async function readSteps(projectName, iteration, contextDir) {
|
|
18
20
|
try {
|
|
19
|
-
const content = await readFile(stepsPath(projectName), 'utf-8');
|
|
21
|
+
const content = await readFile(stepsPath(projectName, iteration, contextDir), 'utf-8');
|
|
20
22
|
const data = JSON.parse(content);
|
|
21
23
|
return data.docs ?? {};
|
|
22
24
|
}
|
|
@@ -27,8 +29,8 @@ export async function readSteps(projectName) {
|
|
|
27
29
|
/**
|
|
28
30
|
* Write steps state to disk.
|
|
29
31
|
*/
|
|
30
|
-
async function writeSteps(projectName, docs) {
|
|
31
|
-
const filePath = stepsPath(projectName);
|
|
32
|
+
async function writeSteps(projectName, iteration, docs, contextDir) {
|
|
33
|
+
const filePath = stepsPath(projectName, iteration, contextDir);
|
|
32
34
|
await mkdir(dirname(filePath), { recursive: true });
|
|
33
35
|
const data = { docs };
|
|
34
36
|
await writeFile(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
@@ -36,8 +38,8 @@ async function writeSteps(projectName, docs) {
|
|
|
36
38
|
/**
|
|
37
39
|
* Get the step state for a specific document.
|
|
38
40
|
*/
|
|
39
|
-
export async function getDocStepState(projectName, docId) {
|
|
40
|
-
const docs = await readSteps(projectName);
|
|
41
|
+
export async function getDocStepState(projectName, iteration, docId, contextDir) {
|
|
42
|
+
const docs = await readSteps(projectName, iteration, contextDir);
|
|
41
43
|
return docs[docId] ?? null;
|
|
42
44
|
}
|
|
43
45
|
/**
|
|
@@ -54,8 +56,8 @@ export function getCompletedStepIds(state) {
|
|
|
54
56
|
*
|
|
55
57
|
* @returns The updated DocStepState
|
|
56
58
|
*/
|
|
57
|
-
export async function recordStepCompletion(projectName, docId, stepId, artifactPath, allStepIds) {
|
|
58
|
-
const docs = await readSteps(projectName);
|
|
59
|
+
export async function recordStepCompletion(projectName, iteration, docId, stepId, artifactPath, allStepIds, contextDir) {
|
|
60
|
+
const docs = await readSteps(projectName, iteration, contextDir);
|
|
59
61
|
let state = docs[docId];
|
|
60
62
|
if (!state) {
|
|
61
63
|
state = {
|
|
@@ -86,28 +88,28 @@ export async function recordStepCompletion(projectName, docId, stepId, artifactP
|
|
|
86
88
|
};
|
|
87
89
|
state.completedSteps.push(record);
|
|
88
90
|
docs[docId] = state;
|
|
89
|
-
await writeSteps(projectName, docs);
|
|
91
|
+
await writeSteps(projectName, iteration, docs, contextDir);
|
|
90
92
|
return state;
|
|
91
93
|
}
|
|
92
94
|
/**
|
|
93
95
|
* Mark a document as finalized (all steps completed + final doc written).
|
|
94
96
|
*/
|
|
95
|
-
export async function markFinalized(projectName, docId) {
|
|
96
|
-
const docs = await readSteps(projectName);
|
|
97
|
+
export async function markFinalized(projectName, iteration, docId, contextDir) {
|
|
98
|
+
const docs = await readSteps(projectName, iteration, contextDir);
|
|
97
99
|
const state = docs[docId];
|
|
98
100
|
if (!state) {
|
|
99
101
|
throw new Error(`No step state found for document "${docId}"`);
|
|
100
102
|
}
|
|
101
103
|
state.finalized = true;
|
|
102
104
|
state.finalizedAt = new Date().toISOString();
|
|
103
|
-
await writeSteps(projectName, docs);
|
|
105
|
+
await writeSteps(projectName, iteration, docs, contextDir);
|
|
104
106
|
return state;
|
|
105
107
|
}
|
|
106
108
|
/**
|
|
107
109
|
* Check if a document's sequential process is finalized.
|
|
108
110
|
*/
|
|
109
|
-
export async function isDocFinalized(projectName, docId) {
|
|
110
|
-
const state = await getDocStepState(projectName, docId);
|
|
111
|
+
export async function isDocFinalized(projectName, iteration, docId, contextDir) {
|
|
112
|
+
const state = await getDocStepState(projectName, iteration, docId, contextDir);
|
|
111
113
|
return state?.finalized ?? false;
|
|
112
114
|
}
|
|
113
115
|
//# sourceMappingURL=steps.js.map
|
package/build/core/steps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/core/steps.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/core/steps.ts"],"names":[],"mappings":"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"}
|
package/build/core/types.d.ts
CHANGED
|
@@ -116,8 +116,9 @@ export interface LoadedWorkflow {
|
|
|
116
116
|
definition: WorkflowDefinition;
|
|
117
117
|
roles: Record<string, RoleDefinition>;
|
|
118
118
|
}
|
|
119
|
-
export type PhaseStatus = 'pending' | 'in_progress' | 'completed' | 'blocked' | 'review';
|
|
119
|
+
export type PhaseStatus = 'pending' | 'in_progress' | 'completed' | 'blocked' | 'review' | 'skipped';
|
|
120
120
|
export type ProjectScale = 'small' | 'medium' | 'large';
|
|
121
|
+
export type ContextType = 'iteration' | 'patch';
|
|
121
122
|
export interface PhaseState {
|
|
122
123
|
id: string;
|
|
123
124
|
status: PhaseStatus;
|
|
@@ -132,6 +133,10 @@ export interface ProjectState {
|
|
|
132
133
|
projectDir: string;
|
|
133
134
|
/** Workflow name, e.g. "dev" */
|
|
134
135
|
workflow: string;
|
|
136
|
+
/** Context type: "iteration" for full iterations, "patch" for lightweight patches */
|
|
137
|
+
type: ContextType;
|
|
138
|
+
/** Iteration or patch number this state belongs to */
|
|
139
|
+
iteration: number;
|
|
135
140
|
/** Project scale determined by PM (null until set via project_set_scale) */
|
|
136
141
|
scale: ProjectScale | null;
|
|
137
142
|
/** Current phase id */
|
|
@@ -256,3 +261,29 @@ export interface DocStepState {
|
|
|
256
261
|
/** Finalized at timestamp */
|
|
257
262
|
finalizedAt?: string;
|
|
258
263
|
}
|
|
264
|
+
export type IssueStatus = 'open' | 'closed';
|
|
265
|
+
export type IssueSource = 'test' | 'user-feedback';
|
|
266
|
+
export interface IssueResolvedBy {
|
|
267
|
+
type: ContextType;
|
|
268
|
+
number: number;
|
|
269
|
+
}
|
|
270
|
+
export interface Issue {
|
|
271
|
+
/** Auto-generated ID, e.g. "issue-1" */
|
|
272
|
+
id: string;
|
|
273
|
+
/** Short title */
|
|
274
|
+
title: string;
|
|
275
|
+
/** Detailed description */
|
|
276
|
+
description: string;
|
|
277
|
+
/** Where this issue was discovered */
|
|
278
|
+
source: IssueSource;
|
|
279
|
+
/** Which iteration this issue relates to */
|
|
280
|
+
iteration: number;
|
|
281
|
+
/** How this issue was resolved (set when closing) */
|
|
282
|
+
resolvedBy?: IssueResolvedBy;
|
|
283
|
+
/** Current status */
|
|
284
|
+
status: IssueStatus;
|
|
285
|
+
/** When this issue was created */
|
|
286
|
+
createdAt: string;
|
|
287
|
+
/** When this issue was closed */
|
|
288
|
+
closedAt?: string;
|
|
289
|
+
}
|
package/build/index.js
CHANGED
|
@@ -28,14 +28,39 @@ if (subcommand === 'setup') {
|
|
|
28
28
|
process.exit(1);
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
|
+
else if (subcommand === 'unregister') {
|
|
32
|
+
// CLI mode — unregister a project from the registry
|
|
33
|
+
const args = process.argv.slice(3);
|
|
34
|
+
const keepData = args.includes('--keep-data');
|
|
35
|
+
const projectName = args.find((a) => !a.startsWith('--'));
|
|
36
|
+
if (!projectName) {
|
|
37
|
+
console.error('Usage: harmonia unregister <project_name> [--keep-data]');
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const { getProject, unregisterProject } = await import('./core/registry.js');
|
|
41
|
+
const entry = await getProject(projectName);
|
|
42
|
+
if (!entry) {
|
|
43
|
+
console.error(`Project "${projectName}" not found in registry.`);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
await unregisterProject(projectName, keepData);
|
|
47
|
+
if (keepData) {
|
|
48
|
+
console.log(`Project "${projectName}" unregistered. Data files were kept.`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(`Project "${projectName}" unregistered. Data directory has been deleted.`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
31
54
|
else if (subcommand === '--help' || subcommand === '-h') {
|
|
32
55
|
console.log(`
|
|
33
56
|
Harmonia — Multi-agent orchestration MCP server
|
|
34
57
|
|
|
35
58
|
Usage:
|
|
36
|
-
harmonia
|
|
37
|
-
harmonia setup
|
|
38
|
-
harmonia
|
|
59
|
+
harmonia Start MCP stdio server
|
|
60
|
+
harmonia setup Inject PM prompt + install hooks in current directory
|
|
61
|
+
harmonia unregister <name> Remove project from registry and delete data (default)
|
|
62
|
+
harmonia unregister <name> --keep-data Remove from registry but keep data files
|
|
63
|
+
harmonia --help Show this help message
|
|
39
64
|
|
|
40
65
|
Setup options:
|
|
41
66
|
--agent <type> opencode | claude-code | codex | openclaw (default: auto-detect)
|
|
@@ -62,6 +87,7 @@ else {
|
|
|
62
87
|
const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
|
|
63
88
|
const { getGlobalDir } = await import('./core/registry.js');
|
|
64
89
|
const { registerProjectInit } = await import('./tools/project-init.js');
|
|
90
|
+
const { registerIterationStart } = await import('./tools/iteration-start.js');
|
|
65
91
|
const { registerSetScale } = await import('./tools/set-scale.js');
|
|
66
92
|
const { registerGetRolePrompt } = await import('./tools/get-role-prompt.js');
|
|
67
93
|
const { registerUpdatePhase } = await import('./tools/update-phase.js');
|
|
@@ -71,6 +97,8 @@ else {
|
|
|
71
97
|
const { registerOverrideTools } = await import('./tools/override-tools.js');
|
|
72
98
|
const { registerDispatchRole } = await import('./tools/dispatch-role.js');
|
|
73
99
|
const { registerReportDispatch } = await import('./tools/report-dispatch.js');
|
|
100
|
+
const { registerPatchStart } = await import('./tools/patch-start.js');
|
|
101
|
+
const { registerIssueTools } = await import('./tools/issue-tools.js');
|
|
74
102
|
// Custom workflows directory: <data_dir>/.workflows
|
|
75
103
|
const CUSTOM_WORKFLOWS_DIR = join(getGlobalDir(), '.workflows');
|
|
76
104
|
const server = new McpServer({
|
|
@@ -79,6 +107,7 @@ else {
|
|
|
79
107
|
});
|
|
80
108
|
// Register all tools
|
|
81
109
|
registerProjectInit(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
110
|
+
registerIterationStart(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
82
111
|
registerSetScale(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
83
112
|
registerGetRolePrompt(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
84
113
|
registerUpdatePhase(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
@@ -88,6 +117,8 @@ else {
|
|
|
88
117
|
registerOverrideTools(server);
|
|
89
118
|
registerDispatchRole(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
90
119
|
registerReportDispatch(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
120
|
+
registerPatchStart(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
121
|
+
registerIssueTools(server);
|
|
91
122
|
// Connect via stdio
|
|
92
123
|
const transport = new StdioServerTransport();
|
|
93
124
|
await server.connect(transport);
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,iEAAiE;AACjE,MAAM,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;AAE1E,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;IACzB,wCAAwC;IACxC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACpE,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;KAAM,IAAI,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/setup/templates.js
CHANGED
|
@@ -24,8 +24,15 @@ Harmonia is managing the project workflow. You are the central coordinator — t
|
|
|
24
24
|
|
|
25
25
|
1. **Check for existing projects**: Call \`project_status()\` (no params) to list registered projects
|
|
26
26
|
2. **If resuming**: Call \`project_status(project_name)\` to see current state and next steps
|
|
27
|
-
3. **If new project**: Talk to user, then call \`project_init(project_name, project_dir)\` to register
|
|
28
|
-
4. **
|
|
27
|
+
3. **If new project**: Talk to user, then call \`project_init(project_name, project_dir)\` to register, followed by \`iteration_start(project_name)\` to begin the first iteration
|
|
28
|
+
4. **If starting a new iteration on an existing project**: Call \`iteration_start(project_name)\` — this creates a fresh iteration with clean phases and documents
|
|
29
|
+
5. **After PRD approved**: Call \`project_set_scale(project_name, scale)\` to set project scale
|
|
30
|
+
|
|
31
|
+
### Project Init vs Iteration Start
|
|
32
|
+
|
|
33
|
+
- **\`project_init\`** — One-time registration. Creates the project entry in the registry. Does NOT create any iteration data.
|
|
34
|
+
- **\`iteration_start\`** — Creates a new iteration (iter-1, iter-2, ...) with fresh state, phases, and docs directory. Must be called after \`project_init\` before any other tools will work.
|
|
35
|
+
- For existing projects that have completed all phases, \`project_status\` will suggest calling \`iteration_start\` to begin the next iteration.
|
|
29
36
|
|
|
30
37
|
### Your Responsibilities
|
|
31
38
|
|
|
@@ -155,6 +162,75 @@ When \`doc_write\` returns "REVIEW REQUIRED":
|
|
|
155
162
|
1. **Always check status first** — start each session with \`project_status()\` to understand where you are
|
|
156
163
|
2. **Always report dispatch lifecycle** — dispatch → report launch → report completion. Never skip dispatch_report.
|
|
157
164
|
3. **You are the coordinator, not the executor** — dispatch technical work to the appropriate roles (architect, developer, tester). Harmonia enforces this via hooks and guards.
|
|
158
|
-
4. **Always check scale** — use \`project_status(project_name)\` to check scale before deciding which documents to produce
|
|
165
|
+
4. **Always check scale** — use \`project_status(project_name)\` to check scale before deciding which documents to produce
|
|
166
|
+
|
|
167
|
+
### Patch Workflow
|
|
168
|
+
|
|
169
|
+
Patches are lightweight fix cycles for bug fixes and small improvements. Unlike full iterations, patches skip the clarify and design phases, and scale is fixed to small.
|
|
170
|
+
|
|
171
|
+
#### When to Use Patches
|
|
172
|
+
|
|
173
|
+
- Bug fixes found during testing or user feedback
|
|
174
|
+
- Small improvements that don't need full requirements/design
|
|
175
|
+
- Issues tracked via \`issue_create\`
|
|
176
|
+
|
|
177
|
+
#### Starting a Patch
|
|
178
|
+
|
|
179
|
+
\`\`\`
|
|
180
|
+
patch_start(project_name, description="fix login timeout", issue_id="issue-1")
|
|
181
|
+
\`\`\`
|
|
182
|
+
|
|
183
|
+
This:
|
|
184
|
+
- Creates a \`patch-N/\` directory
|
|
185
|
+
- Skips clarify and design phases
|
|
186
|
+
- Sets scale to small
|
|
187
|
+
- Switches the active context to the patch
|
|
188
|
+
|
|
189
|
+
#### Patch Phases
|
|
190
|
+
|
|
191
|
+
Patches start directly at the develop phase:
|
|
192
|
+
1. **develop** — Fix the issue, write code
|
|
193
|
+
2. **test** — Verify the fix
|
|
194
|
+
3. **deliver** — Close out the patch
|
|
195
|
+
|
|
196
|
+
#### After Patch Completion
|
|
197
|
+
|
|
198
|
+
- Close the related issue: \`issue_update(project_name, issue_id, status="closed", resolved_by_type="patch", resolved_by_number=N)\`
|
|
199
|
+
- Start another patch or switch back to iteration with \`iteration_start\`
|
|
200
|
+
|
|
201
|
+
### Issue Management
|
|
202
|
+
|
|
203
|
+
Issues track problems discovered during testing or from user feedback. They exist at the project level (not per-iteration).
|
|
204
|
+
|
|
205
|
+
#### Creating Issues
|
|
206
|
+
|
|
207
|
+
\`\`\`
|
|
208
|
+
issue_create(project_name, title="Login timeout on slow networks", description="...", source="test", iteration=1)
|
|
209
|
+
\`\`\`
|
|
210
|
+
|
|
211
|
+
Sources: \`test\` (found during testing) or \`user-feedback\` (reported by users).
|
|
212
|
+
|
|
213
|
+
#### Tracking Issues
|
|
214
|
+
|
|
215
|
+
- \`issue_list(project_name)\` — View all issues
|
|
216
|
+
- \`issue_list(project_name, status="open")\` — View open issues only
|
|
217
|
+
- \`issue_update(project_name, issue_id, status="closed", resolved_by_type="patch", resolved_by_number=1)\` — Close with resolution
|
|
218
|
+
|
|
219
|
+
#### Workflow Integration
|
|
220
|
+
|
|
221
|
+
- \`project_status\` shows open issue count and suggests \`patch_start\` when there are unresolved issues
|
|
222
|
+
- When testing reveals bugs, use \`issue_create\` to track them
|
|
223
|
+
- Use \`patch_start\` with \`issue_id\` to link patches to issues
|
|
224
|
+
|
|
225
|
+
### Cross-Context Document Access
|
|
226
|
+
|
|
227
|
+
Use the optional \`context\` parameter on \`doc_read\` and \`doc_list\` to access documents from any iteration or patch:
|
|
228
|
+
|
|
229
|
+
\`\`\`
|
|
230
|
+
doc_read(project_name, "prd", context="iter-1") // Read PRD from iteration 1
|
|
231
|
+
doc_list(project_name, context="patch-2") // List docs from patch 2
|
|
232
|
+
\`\`\`
|
|
233
|
+
|
|
234
|
+
This is useful when working in a patch but needing to reference the original iteration's documents.`;
|
|
159
235
|
}
|
|
160
236
|
//# sourceMappingURL=templates.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/setup/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC5B,OAAO
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/setup/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oGAwNyF,CAAC;AACrG,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { resolveReview, getPendingReviews } from '../core/reviews.js';
|
|
7
|
+
import { resolveActive, isError } from './utils.js';
|
|
7
8
|
export function registerApproveDoc(server) {
|
|
8
9
|
server.tool('doc_approve', 'Approve or reject a document pending review. Call this after the user has reviewed the document and confirmed (or requested changes).', {
|
|
9
10
|
project_name: z.string().describe('Project name'),
|
|
@@ -12,8 +13,11 @@ export function registerApproveDoc(server) {
|
|
|
12
13
|
comment: z.string().optional().describe('Optional comment — user feedback or reason for rejection'),
|
|
13
14
|
}, async ({ project_name, doc_id, approved, comment }) => {
|
|
14
15
|
try {
|
|
16
|
+
const ctx = await resolveActive(project_name);
|
|
17
|
+
if (isError(ctx))
|
|
18
|
+
return ctx;
|
|
15
19
|
const status = approved ? 'approved' : 'rejected';
|
|
16
|
-
const review = await resolveReview(project_name, doc_id, status, comment);
|
|
20
|
+
const review = await resolveReview(project_name, ctx.number, doc_id, status, comment);
|
|
17
21
|
if (approved) {
|
|
18
22
|
return {
|
|
19
23
|
content: [
|
|
@@ -54,7 +58,10 @@ export function registerApproveDoc(server) {
|
|
|
54
58
|
server.tool('review_list', 'List all documents currently pending user review.', {
|
|
55
59
|
project_name: z.string().describe('Project name'),
|
|
56
60
|
}, async ({ project_name }) => {
|
|
57
|
-
const
|
|
61
|
+
const ctx = await resolveActive(project_name);
|
|
62
|
+
if (isError(ctx))
|
|
63
|
+
return ctx;
|
|
64
|
+
const pending = await getPendingReviews(project_name, ctx.number);
|
|
58
65
|
if (pending.length === 0) {
|
|
59
66
|
return {
|
|
60
67
|
content: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approve-doc.js","sourceRoot":"","sources":["../../src/tools/approve-doc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"approve-doc.js","sourceRoot":"","sources":["../../src/tools/approve-doc.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ import { readState } from '../core/state.js';
|
|
|
18
18
|
import { readDoc } from '../core/docs.js';
|
|
19
19
|
import { getMergedOverrides, resolveRoleConfig } from '../core/overrides.js';
|
|
20
20
|
import { createDispatch, findIdleSession } from '../core/dispatch.js';
|
|
21
|
+
import { resolveActive, isError } from './utils.js';
|
|
21
22
|
/**
|
|
22
23
|
* Build override instructions to inject into the role prompt.
|
|
23
24
|
*/
|
|
@@ -94,8 +95,11 @@ export function registerDispatchRole(server, builtinDir, customDir) {
|
|
|
94
95
|
.describe("Document IDs to include as input for the team member. If not specified, automatically uses the current phase's input docs."),
|
|
95
96
|
}, async ({ project_name, role, task_brief, input_doc_ids }) => {
|
|
96
97
|
try {
|
|
98
|
+
const ctx = await resolveActive(project_name);
|
|
99
|
+
if (isError(ctx))
|
|
100
|
+
return ctx;
|
|
97
101
|
// Load project state and workflow
|
|
98
|
-
const state = await readState(project_name);
|
|
102
|
+
const state = await readState(project_name, ctx.number, ctx.dir);
|
|
99
103
|
const wf = await loadWorkflow(builtinDir, customDir, state.workflow);
|
|
100
104
|
// Validate role exists
|
|
101
105
|
const roleDef = wf.roles[role];
|
|
@@ -154,7 +158,7 @@ export function registerDispatchRole(server, builtinDir, customDir) {
|
|
|
154
158
|
if (docDef?.external)
|
|
155
159
|
continue; // external outputs not stored as docs
|
|
156
160
|
try {
|
|
157
|
-
inputDocs[docId] = await readDoc(project_name, docId);
|
|
161
|
+
inputDocs[docId] = await readDoc(project_name, ctx.number, docId, ctx.dir);
|
|
158
162
|
}
|
|
159
163
|
catch {
|
|
160
164
|
missingDocs.push(docId);
|
|
@@ -165,9 +169,9 @@ export function registerDispatchRole(server, builtinDir, customDir) {
|
|
|
165
169
|
// Resolve expected outputs for this dispatch
|
|
166
170
|
const expectedOutputs = resolveExpectedOutputs(currentPhase, wf.definition, state.scale);
|
|
167
171
|
// Check for reusable idle session
|
|
168
|
-
const idleSession = await findIdleSession(project_name, role);
|
|
172
|
+
const idleSession = await findIdleSession(project_name, ctx.number, role, ctx.dir);
|
|
169
173
|
// Create dispatch record
|
|
170
|
-
const dispatch = await createDispatch(project_name, role, task_brief, expectedOutputs, idleSession?.id);
|
|
174
|
+
const dispatch = await createDispatch(project_name, ctx.number, role, task_brief, expectedOutputs, idleSession?.id, ctx.dir);
|
|
171
175
|
// Build session guidance
|
|
172
176
|
const sessionGuidance = buildSessionGuidance(idleSession, roleDef.frontmatter.session, roleConfig.agent);
|
|
173
177
|
// Build human-readable summary for the agent
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"dispatch-role.js","sourceRoot":"","sources":["../../src/tools/dispatch-role.ts"],"names":[],"mappings":"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"}
|