@s_s/harmonia 1.1.1 → 1.2.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 +11 -11
- package/build/core/dispatch.js +33 -33
- package/build/core/dispatch.js.map +1 -1
- package/build/core/docs.d.ts +11 -11
- package/build/core/docs.js +19 -19
- package/build/core/docs.js.map +1 -1
- package/build/core/registry.d.ts +29 -6
- package/build/core/registry.js +50 -8
- package/build/core/registry.js.map +1 -1
- package/build/core/reviews.d.ts +8 -8
- package/build/core/reviews.js +20 -20
- package/build/core/reviews.js.map +1 -1
- package/build/core/state.d.ts +12 -12
- package/build/core/state.js +24 -23
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +7 -7
- package/build/core/steps.js +19 -19
- package/build/core/steps.js.map +1 -1
- package/build/core/types.d.ts +2 -0
- package/build/index.js +30 -3
- package/build/index.js.map +1 -1
- package/build/setup/templates.js +9 -2
- package/build/setup/templates.js.map +1 -1
- package/build/tools/approve-doc.js +31 -2
- package/build/tools/approve-doc.js.map +1 -1
- package/build/tools/dispatch-role.js +19 -4
- package/build/tools/dispatch-role.js.map +1 -1
- package/build/tools/doc-tools.js +59 -16
- package/build/tools/doc-tools.js.map +1 -1
- package/build/tools/get-project-status.js +61 -15
- package/build/tools/get-project-status.js.map +1 -1
- package/build/tools/iteration-start.d.ts +13 -0
- package/build/tools/iteration-start.js +98 -0
- package/build/tools/iteration-start.js.map +1 -0
- package/build/tools/project-init.d.ts +5 -1
- package/build/tools/project-init.js +30 -14
- package/build/tools/project-init.js.map +1 -1
- package/build/tools/report-dispatch.js +30 -15
- package/build/tools/report-dispatch.js.map +1 -1
- package/build/tools/set-scale.js +18 -3
- package/build/tools/set-scale.js.map +1 -1
- package/build/tools/update-phase.js +20 -5
- package/build/tools/update-phase.js.map +1 -1
- package/package.json +1 -1
package/build/core/reviews.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Document review state management — <data_dir>/<project_name>/reviews.json
|
|
2
|
+
* Document review state management — <data_dir>/<project_name>/iter-<n>/reviews.json
|
|
3
3
|
*
|
|
4
4
|
* Tracks which documents are pending review, approved, or rejected.
|
|
5
5
|
*/
|
|
6
6
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
7
7
|
import { join, dirname } from 'node:path';
|
|
8
|
-
import {
|
|
8
|
+
import { getIterationDir } from './registry.js';
|
|
9
9
|
const REVIEWS_FILE = 'reviews.json';
|
|
10
|
-
function reviewsPath(projectName) {
|
|
11
|
-
return join(
|
|
10
|
+
function reviewsPath(projectName, iteration) {
|
|
11
|
+
return join(getIterationDir(projectName, iteration), REVIEWS_FILE);
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* Read the reviews state for a project.
|
|
14
|
+
* Read the reviews state for a project iteration.
|
|
15
15
|
*/
|
|
16
|
-
export async function readReviews(projectName) {
|
|
16
|
+
export async function readReviews(projectName, iteration) {
|
|
17
17
|
try {
|
|
18
|
-
const content = await readFile(reviewsPath(projectName), 'utf-8');
|
|
18
|
+
const content = await readFile(reviewsPath(projectName, iteration), 'utf-8');
|
|
19
19
|
const data = JSON.parse(content);
|
|
20
20
|
return data.docs ?? {};
|
|
21
21
|
}
|
|
@@ -26,8 +26,8 @@ export async function readReviews(projectName) {
|
|
|
26
26
|
/**
|
|
27
27
|
* Write reviews state to disk.
|
|
28
28
|
*/
|
|
29
|
-
async function writeReviews(projectName, docs) {
|
|
30
|
-
const filePath = reviewsPath(projectName);
|
|
29
|
+
async function writeReviews(projectName, iteration, docs) {
|
|
30
|
+
const filePath = reviewsPath(projectName, iteration);
|
|
31
31
|
await mkdir(dirname(filePath), { recursive: true });
|
|
32
32
|
const data = { docs };
|
|
33
33
|
await writeFile(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
@@ -35,22 +35,22 @@ async function writeReviews(projectName, docs) {
|
|
|
35
35
|
/**
|
|
36
36
|
* Submit a document for review. Sets status to "pending".
|
|
37
37
|
*/
|
|
38
|
-
export async function submitForReview(projectName, docId) {
|
|
39
|
-
const reviews = await readReviews(projectName);
|
|
38
|
+
export async function submitForReview(projectName, iteration, docId) {
|
|
39
|
+
const reviews = await readReviews(projectName, iteration);
|
|
40
40
|
const state = {
|
|
41
41
|
docId,
|
|
42
42
|
status: 'pending',
|
|
43
43
|
submittedAt: new Date().toISOString(),
|
|
44
44
|
};
|
|
45
45
|
reviews[docId] = state;
|
|
46
|
-
await writeReviews(projectName, reviews);
|
|
46
|
+
await writeReviews(projectName, iteration, reviews);
|
|
47
47
|
return state;
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
50
|
* Approve or reject a document review.
|
|
51
51
|
*/
|
|
52
|
-
export async function resolveReview(projectName, docId, status, comment) {
|
|
53
|
-
const reviews = await readReviews(projectName);
|
|
52
|
+
export async function resolveReview(projectName, iteration, docId, status, comment) {
|
|
53
|
+
const reviews = await readReviews(projectName, iteration);
|
|
54
54
|
const existing = reviews[docId];
|
|
55
55
|
if (!existing) {
|
|
56
56
|
throw new Error(`No review pending for document "${docId}". Submit it for review first.`);
|
|
@@ -63,21 +63,21 @@ export async function resolveReview(projectName, docId, status, comment) {
|
|
|
63
63
|
if (comment) {
|
|
64
64
|
existing.comment = comment;
|
|
65
65
|
}
|
|
66
|
-
await writeReviews(projectName, reviews);
|
|
66
|
+
await writeReviews(projectName, iteration, reviews);
|
|
67
67
|
return existing;
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
70
|
* Get the review state for a specific document.
|
|
71
71
|
*/
|
|
72
|
-
export async function getDocReview(projectName, docId) {
|
|
73
|
-
const reviews = await readReviews(projectName);
|
|
72
|
+
export async function getDocReview(projectName, iteration, docId) {
|
|
73
|
+
const reviews = await readReviews(projectName, iteration);
|
|
74
74
|
return reviews[docId] ?? null;
|
|
75
75
|
}
|
|
76
76
|
/**
|
|
77
|
-
* Get all pending reviews for a project.
|
|
77
|
+
* Get all pending reviews for a project iteration.
|
|
78
78
|
*/
|
|
79
|
-
export async function getPendingReviews(projectName) {
|
|
80
|
-
const reviews = await readReviews(projectName);
|
|
79
|
+
export async function getPendingReviews(projectName, iteration) {
|
|
80
|
+
const reviews = await readReviews(projectName, iteration);
|
|
81
81
|
return Object.values(reviews).filter((r) => r.status === 'pending');
|
|
82
82
|
}
|
|
83
83
|
//# sourceMappingURL=reviews.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviews.js","sourceRoot":"","sources":["../../src/core/reviews.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"reviews.js","sourceRoot":"","sources":["../../src/core/reviews.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,YAAY,GAAG,cAAc,CAAC;AAMpC,SAAS,WAAW,CAAC,WAAmB,EAAE,SAAiB;IACvD,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,YAAY,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,SAAiB;IACpE,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;QAChD,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACvB,WAAmB,EACnB,SAAiB,EACjB,IAAoC;IAEpC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAgB,EAAE,IAAI,EAAE,CAAC;IACnC,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB,EAAE,SAAiB,EAAE,KAAa;IACvF,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAmB;QAC1B,KAAK;QACL,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACvB,MAAM,YAAY,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,WAAmB,EACnB,SAAiB,EACjB,KAAa,EACb,MAA+B,EAC/B,OAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAEhC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,gCAAgC,CAAC,CAAC;IAC9F,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,uBAAuB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,CAAC;IAED,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,OAAO,EAAE,CAAC;QACV,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED,MAAM,YAAY,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,WAAmB,EACnB,SAAiB,EACjB,KAAa;IAEb,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1D,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB,EAAE,SAAiB;IAC1E,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AACxE,CAAC"}
|
package/build/core/state.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project state management — manages <data_dir>/<project_name>/state.json
|
|
2
|
+
* Project state management — manages <data_dir>/<project_name>/iter-<n>/state.json
|
|
3
3
|
*/
|
|
4
4
|
import type { PhaseStatus, ProjectScale, ProjectState, LoadedWorkflow } from './types.js';
|
|
5
5
|
/**
|
|
@@ -9,28 +9,28 @@ export declare class ScaleNotSetError extends Error {
|
|
|
9
9
|
constructor(projectName: string);
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
* Initialize a new project state file.
|
|
13
|
-
* Note: directory creation
|
|
12
|
+
* Initialize a new project state file for a specific iteration.
|
|
13
|
+
* Note: directory creation is handled by registry.startIteration().
|
|
14
14
|
* This only writes the state.json.
|
|
15
15
|
*/
|
|
16
|
-
export declare function initProjectState(projectName: string, projectDir: string, workflow: LoadedWorkflow): Promise<ProjectState>;
|
|
16
|
+
export declare function initProjectState(projectName: string, projectDir: string, workflow: LoadedWorkflow, iteration: number): Promise<ProjectState>;
|
|
17
17
|
/**
|
|
18
|
-
* Read the current project state.
|
|
18
|
+
* Read the current project state for a specific iteration.
|
|
19
19
|
*/
|
|
20
|
-
export declare function readState(projectName: string): Promise<ProjectState>;
|
|
20
|
+
export declare function readState(projectName: string, iteration: number): Promise<ProjectState>;
|
|
21
21
|
/**
|
|
22
|
-
* Write project state to disk.
|
|
22
|
+
* Write project state to disk for a specific iteration.
|
|
23
23
|
*/
|
|
24
|
-
export declare function writeState(projectName: string, state: ProjectState): Promise<void>;
|
|
24
|
+
export declare function writeState(projectName: string, iteration: number, state: ProjectState): Promise<void>;
|
|
25
25
|
/**
|
|
26
26
|
* Update a specific phase's status.
|
|
27
27
|
*/
|
|
28
|
-
export declare function updatePhaseStatus(projectName: string, phaseId: string, status: PhaseStatus, blockedReason?: string): Promise<ProjectState>;
|
|
28
|
+
export declare function updatePhaseStatus(projectName: string, iteration: number, phaseId: string, status: PhaseStatus, blockedReason?: string): Promise<ProjectState>;
|
|
29
29
|
/**
|
|
30
|
-
* Check if a project state file exists.
|
|
30
|
+
* Check if a project state file exists for a specific iteration.
|
|
31
31
|
*/
|
|
32
|
-
export declare function projectStateExists(projectName: string): Promise<boolean>;
|
|
32
|
+
export declare function projectStateExists(projectName: string, iteration: number): Promise<boolean>;
|
|
33
33
|
/**
|
|
34
34
|
* Set the project scale. Scale is immutable once set.
|
|
35
35
|
*/
|
|
36
|
-
export declare function setScale(projectName: string, scale: ProjectScale): Promise<ProjectState>;
|
|
36
|
+
export declare function setScale(projectName: string, iteration: number, scale: ProjectScale): Promise<ProjectState>;
|
package/build/core/state.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Project state management — manages <data_dir>/<project_name>/state.json
|
|
2
|
+
* Project state management — manages <data_dir>/<project_name>/iter-<n>/state.json
|
|
3
3
|
*/
|
|
4
4
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
5
5
|
import { join, dirname } from 'node:path';
|
|
6
|
-
import {
|
|
6
|
+
import { getIterationDir } from './registry.js';
|
|
7
7
|
/**
|
|
8
8
|
* Error thrown when a tool requires scale but it hasn't been set yet.
|
|
9
9
|
*/
|
|
@@ -14,15 +14,15 @@ export class ScaleNotSetError extends Error {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
const STATE_FILE = 'state.json';
|
|
17
|
-
function statePath(projectName) {
|
|
18
|
-
return join(
|
|
17
|
+
function statePath(projectName, iteration) {
|
|
18
|
+
return join(getIterationDir(projectName, iteration), STATE_FILE);
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
|
-
* Initialize a new project state file.
|
|
22
|
-
* Note: directory creation
|
|
21
|
+
* Initialize a new project state file for a specific iteration.
|
|
22
|
+
* Note: directory creation is handled by registry.startIteration().
|
|
23
23
|
* This only writes the state.json.
|
|
24
24
|
*/
|
|
25
|
-
export async function initProjectState(projectName, projectDir, workflow) {
|
|
25
|
+
export async function initProjectState(projectName, projectDir, workflow, iteration) {
|
|
26
26
|
const now = new Date().toISOString();
|
|
27
27
|
const phases = workflow.definition.phases;
|
|
28
28
|
const firstPhaseId = phases[0]?.id ?? '';
|
|
@@ -30,6 +30,7 @@ export async function initProjectState(projectName, projectDir, workflow) {
|
|
|
30
30
|
projectName,
|
|
31
31
|
projectDir,
|
|
32
32
|
workflow: workflow.definition.name,
|
|
33
|
+
iteration,
|
|
33
34
|
scale: null,
|
|
34
35
|
currentPhase: firstPhaseId,
|
|
35
36
|
phases: phases.map((p, i) => ({
|
|
@@ -40,21 +41,21 @@ export async function initProjectState(projectName, projectDir, workflow) {
|
|
|
40
41
|
createdAt: now,
|
|
41
42
|
updatedAt: now,
|
|
42
43
|
};
|
|
43
|
-
await writeState(projectName, state);
|
|
44
|
+
await writeState(projectName, iteration, state);
|
|
44
45
|
return state;
|
|
45
46
|
}
|
|
46
47
|
/**
|
|
47
|
-
* Read the current project state.
|
|
48
|
+
* Read the current project state for a specific iteration.
|
|
48
49
|
*/
|
|
49
|
-
export async function readState(projectName) {
|
|
50
|
-
const content = await readFile(statePath(projectName), 'utf-8');
|
|
50
|
+
export async function readState(projectName, iteration) {
|
|
51
|
+
const content = await readFile(statePath(projectName, iteration), 'utf-8');
|
|
51
52
|
return JSON.parse(content);
|
|
52
53
|
}
|
|
53
54
|
/**
|
|
54
|
-
* Write project state to disk.
|
|
55
|
+
* Write project state to disk for a specific iteration.
|
|
55
56
|
*/
|
|
56
|
-
export async function writeState(projectName, state) {
|
|
57
|
-
const filePath = statePath(projectName);
|
|
57
|
+
export async function writeState(projectName, iteration, state) {
|
|
58
|
+
const filePath = statePath(projectName, iteration);
|
|
58
59
|
await mkdir(dirname(filePath), { recursive: true });
|
|
59
60
|
state.updatedAt = new Date().toISOString();
|
|
60
61
|
await writeFile(filePath, JSON.stringify(state, null, 2) + '\n', 'utf-8');
|
|
@@ -62,8 +63,8 @@ export async function writeState(projectName, state) {
|
|
|
62
63
|
/**
|
|
63
64
|
* Update a specific phase's status.
|
|
64
65
|
*/
|
|
65
|
-
export async function updatePhaseStatus(projectName, phaseId, status, blockedReason) {
|
|
66
|
-
const state = await readState(projectName);
|
|
66
|
+
export async function updatePhaseStatus(projectName, iteration, phaseId, status, blockedReason) {
|
|
67
|
+
const state = await readState(projectName, iteration);
|
|
67
68
|
const phase = state.phases.find((p) => p.id === phaseId);
|
|
68
69
|
if (!phase) {
|
|
69
70
|
throw new Error(`Phase "${phaseId}" not found in project state`);
|
|
@@ -94,15 +95,15 @@ export async function updatePhaseStatus(projectName, phaseId, status, blockedRea
|
|
|
94
95
|
state.currentPhase = next.id;
|
|
95
96
|
}
|
|
96
97
|
}
|
|
97
|
-
await writeState(projectName, state);
|
|
98
|
+
await writeState(projectName, iteration, state);
|
|
98
99
|
return state;
|
|
99
100
|
}
|
|
100
101
|
/**
|
|
101
|
-
* Check if a project state file exists.
|
|
102
|
+
* Check if a project state file exists for a specific iteration.
|
|
102
103
|
*/
|
|
103
|
-
export async function projectStateExists(projectName) {
|
|
104
|
+
export async function projectStateExists(projectName, iteration) {
|
|
104
105
|
try {
|
|
105
|
-
await readFile(statePath(projectName), 'utf-8');
|
|
106
|
+
await readFile(statePath(projectName, iteration), 'utf-8');
|
|
106
107
|
return true;
|
|
107
108
|
}
|
|
108
109
|
catch {
|
|
@@ -112,13 +113,13 @@ export async function projectStateExists(projectName) {
|
|
|
112
113
|
/**
|
|
113
114
|
* Set the project scale. Scale is immutable once set.
|
|
114
115
|
*/
|
|
115
|
-
export async function setScale(projectName, scale) {
|
|
116
|
-
const state = await readState(projectName);
|
|
116
|
+
export async function setScale(projectName, iteration, scale) {
|
|
117
|
+
const state = await readState(projectName, iteration);
|
|
117
118
|
if (state.scale !== null) {
|
|
118
119
|
throw new Error(`Scale 已设定为 "${state.scale}",不可更改。如需调整规模,请重新评估 PRD。`);
|
|
119
120
|
}
|
|
120
121
|
state.scale = scale;
|
|
121
|
-
await writeState(projectName, state);
|
|
122
|
+
await writeState(projectName, iteration, state);
|
|
122
123
|
return state;
|
|
123
124
|
}
|
|
124
125
|
//# sourceMappingURL=state.js.map
|
package/build/core/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"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"}
|
package/build/core/steps.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Step state management — manages <data_dir>/<project_name>/steps.json
|
|
2
|
+
* Step state management — manages <data_dir>/<project_name>/iter-<n>/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
6
|
*/
|
|
7
7
|
import type { DocStepState } from './types.js';
|
|
8
8
|
/**
|
|
9
|
-
* Read the steps state for a project.
|
|
9
|
+
* Read the steps state for a project iteration.
|
|
10
10
|
*/
|
|
11
|
-
export declare function readSteps(projectName: string): Promise<Record<string, DocStepState>>;
|
|
11
|
+
export declare function readSteps(projectName: string, iteration: number): Promise<Record<string, DocStepState>>;
|
|
12
12
|
/**
|
|
13
13
|
* Get the step state for a specific document.
|
|
14
14
|
*/
|
|
15
|
-
export declare function getDocStepState(projectName: string, docId: string): Promise<DocStepState | null>;
|
|
15
|
+
export declare function getDocStepState(projectName: string, iteration: number, docId: string): Promise<DocStepState | null>;
|
|
16
16
|
/**
|
|
17
17
|
* Get the set of completed step IDs for a document.
|
|
18
18
|
*/
|
|
@@ -23,12 +23,12 @@ export declare function getCompletedStepIds(state: DocStepState | null): Set<str
|
|
|
23
23
|
*
|
|
24
24
|
* @returns The updated DocStepState
|
|
25
25
|
*/
|
|
26
|
-
export declare function recordStepCompletion(projectName: string, docId: string, stepId: string, artifactPath: string, allStepIds: string[]): Promise<DocStepState>;
|
|
26
|
+
export declare function recordStepCompletion(projectName: string, iteration: number, docId: string, stepId: string, artifactPath: string, allStepIds: string[]): Promise<DocStepState>;
|
|
27
27
|
/**
|
|
28
28
|
* Mark a document as finalized (all steps completed + final doc written).
|
|
29
29
|
*/
|
|
30
|
-
export declare function markFinalized(projectName: string, docId: string): Promise<DocStepState>;
|
|
30
|
+
export declare function markFinalized(projectName: string, iteration: number, docId: string): Promise<DocStepState>;
|
|
31
31
|
/**
|
|
32
32
|
* Check if a document's sequential process is finalized.
|
|
33
33
|
*/
|
|
34
|
-
export declare function isDocFinalized(projectName: string, docId: string): Promise<boolean>;
|
|
34
|
+
export declare function isDocFinalized(projectName: string, iteration: number, docId: string): Promise<boolean>;
|
package/build/core/steps.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Step state management — manages <data_dir>/<project_name>/steps.json
|
|
2
|
+
* Step state management — manages <data_dir>/<project_name>/iter-<n>/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
6
|
*/
|
|
7
7
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
8
8
|
import { join, dirname } from 'node:path';
|
|
9
|
-
import {
|
|
9
|
+
import { getIterationDir } from './registry.js';
|
|
10
10
|
const STEPS_FILE = 'steps.json';
|
|
11
|
-
function stepsPath(projectName) {
|
|
12
|
-
return join(
|
|
11
|
+
function stepsPath(projectName, iteration) {
|
|
12
|
+
return join(getIterationDir(projectName, iteration), STEPS_FILE);
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
|
-
* Read the steps state for a project.
|
|
15
|
+
* Read the steps state for a project iteration.
|
|
16
16
|
*/
|
|
17
|
-
export async function readSteps(projectName) {
|
|
17
|
+
export async function readSteps(projectName, iteration) {
|
|
18
18
|
try {
|
|
19
|
-
const content = await readFile(stepsPath(projectName), 'utf-8');
|
|
19
|
+
const content = await readFile(stepsPath(projectName, iteration), 'utf-8');
|
|
20
20
|
const data = JSON.parse(content);
|
|
21
21
|
return data.docs ?? {};
|
|
22
22
|
}
|
|
@@ -27,8 +27,8 @@ export async function readSteps(projectName) {
|
|
|
27
27
|
/**
|
|
28
28
|
* Write steps state to disk.
|
|
29
29
|
*/
|
|
30
|
-
async function writeSteps(projectName, docs) {
|
|
31
|
-
const filePath = stepsPath(projectName);
|
|
30
|
+
async function writeSteps(projectName, iteration, docs) {
|
|
31
|
+
const filePath = stepsPath(projectName, iteration);
|
|
32
32
|
await mkdir(dirname(filePath), { recursive: true });
|
|
33
33
|
const data = { docs };
|
|
34
34
|
await writeFile(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
@@ -36,8 +36,8 @@ async function writeSteps(projectName, docs) {
|
|
|
36
36
|
/**
|
|
37
37
|
* Get the step state for a specific document.
|
|
38
38
|
*/
|
|
39
|
-
export async function getDocStepState(projectName, docId) {
|
|
40
|
-
const docs = await readSteps(projectName);
|
|
39
|
+
export async function getDocStepState(projectName, iteration, docId) {
|
|
40
|
+
const docs = await readSteps(projectName, iteration);
|
|
41
41
|
return docs[docId] ?? null;
|
|
42
42
|
}
|
|
43
43
|
/**
|
|
@@ -54,8 +54,8 @@ export function getCompletedStepIds(state) {
|
|
|
54
54
|
*
|
|
55
55
|
* @returns The updated DocStepState
|
|
56
56
|
*/
|
|
57
|
-
export async function recordStepCompletion(projectName, docId, stepId, artifactPath, allStepIds) {
|
|
58
|
-
const docs = await readSteps(projectName);
|
|
57
|
+
export async function recordStepCompletion(projectName, iteration, docId, stepId, artifactPath, allStepIds) {
|
|
58
|
+
const docs = await readSteps(projectName, iteration);
|
|
59
59
|
let state = docs[docId];
|
|
60
60
|
if (!state) {
|
|
61
61
|
state = {
|
|
@@ -86,28 +86,28 @@ export async function recordStepCompletion(projectName, docId, stepId, artifactP
|
|
|
86
86
|
};
|
|
87
87
|
state.completedSteps.push(record);
|
|
88
88
|
docs[docId] = state;
|
|
89
|
-
await writeSteps(projectName, docs);
|
|
89
|
+
await writeSteps(projectName, iteration, docs);
|
|
90
90
|
return state;
|
|
91
91
|
}
|
|
92
92
|
/**
|
|
93
93
|
* Mark a document as finalized (all steps completed + final doc written).
|
|
94
94
|
*/
|
|
95
|
-
export async function markFinalized(projectName, docId) {
|
|
96
|
-
const docs = await readSteps(projectName);
|
|
95
|
+
export async function markFinalized(projectName, iteration, docId) {
|
|
96
|
+
const docs = await readSteps(projectName, iteration);
|
|
97
97
|
const state = docs[docId];
|
|
98
98
|
if (!state) {
|
|
99
99
|
throw new Error(`No step state found for document "${docId}"`);
|
|
100
100
|
}
|
|
101
101
|
state.finalized = true;
|
|
102
102
|
state.finalizedAt = new Date().toISOString();
|
|
103
|
-
await writeSteps(projectName, docs);
|
|
103
|
+
await writeSteps(projectName, iteration, docs);
|
|
104
104
|
return state;
|
|
105
105
|
}
|
|
106
106
|
/**
|
|
107
107
|
* Check if a document's sequential process is finalized.
|
|
108
108
|
*/
|
|
109
|
-
export async function isDocFinalized(projectName, docId) {
|
|
110
|
-
const state = await getDocStepState(projectName, docId);
|
|
109
|
+
export async function isDocFinalized(projectName, iteration, docId) {
|
|
110
|
+
const state = await getDocStepState(projectName, iteration, docId);
|
|
111
111
|
return state?.finalized ?? false;
|
|
112
112
|
}
|
|
113
113
|
//# 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;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,
|
|
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
|
@@ -132,6 +132,8 @@ export interface ProjectState {
|
|
|
132
132
|
projectDir: string;
|
|
133
133
|
/** Workflow name, e.g. "dev" */
|
|
134
134
|
workflow: string;
|
|
135
|
+
/** Iteration number this state belongs to */
|
|
136
|
+
iteration: number;
|
|
135
137
|
/** Project scale determined by PM (null until set via project_set_scale) */
|
|
136
138
|
scale: ProjectScale | null;
|
|
137
139
|
/** Current phase id */
|
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');
|
|
@@ -79,6 +105,7 @@ else {
|
|
|
79
105
|
});
|
|
80
106
|
// Register all tools
|
|
81
107
|
registerProjectInit(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
108
|
+
registerIterationStart(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
82
109
|
registerSetScale(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
83
110
|
registerGetRolePrompt(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
|
84
111
|
registerUpdatePhase(server, BUILTIN_WORKFLOWS_DIR, CUSTOM_WORKFLOWS_DIR);
|
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
|
|
|
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2HAmJgH,CAAC;AAC5H,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { resolveReview, getPendingReviews } from '../core/reviews.js';
|
|
7
|
+
import { getProject } from '../core/registry.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,22 @@ 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
|
+
// Resolve current iteration
|
|
17
|
+
const entry = await getProject(project_name);
|
|
18
|
+
if (!entry || entry.currentIteration === 0) {
|
|
19
|
+
return {
|
|
20
|
+
content: [
|
|
21
|
+
{
|
|
22
|
+
type: 'text',
|
|
23
|
+
text: `项目 "${project_name}" 未找到或尚未开始迭代。`,
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
isError: true,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const iteration = entry.currentIteration;
|
|
15
30
|
const status = approved ? 'approved' : 'rejected';
|
|
16
|
-
const review = await resolveReview(project_name, doc_id, status, comment);
|
|
31
|
+
const review = await resolveReview(project_name, iteration, doc_id, status, comment);
|
|
17
32
|
if (approved) {
|
|
18
33
|
return {
|
|
19
34
|
content: [
|
|
@@ -54,7 +69,21 @@ export function registerApproveDoc(server) {
|
|
|
54
69
|
server.tool('review_list', 'List all documents currently pending user review.', {
|
|
55
70
|
project_name: z.string().describe('Project name'),
|
|
56
71
|
}, async ({ project_name }) => {
|
|
57
|
-
|
|
72
|
+
// Resolve current iteration
|
|
73
|
+
const entry = await getProject(project_name);
|
|
74
|
+
if (!entry || entry.currentIteration === 0) {
|
|
75
|
+
return {
|
|
76
|
+
content: [
|
|
77
|
+
{
|
|
78
|
+
type: 'text',
|
|
79
|
+
text: `项目 "${project_name}" 未找到或尚未开始迭代。`,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
isError: true,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
const iteration = entry.currentIteration;
|
|
86
|
+
const pending = await getPendingReviews(project_name, iteration);
|
|
58
87
|
if (pending.length === 0) {
|
|
59
88
|
return {
|
|
60
89
|
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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"}
|