@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
package/build/core/state.js
CHANGED
|
@@ -1,125 +1,93 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Workflow state management — manages state.json within iteration/patch directories.
|
|
3
|
+
*
|
|
4
|
+
* Rewritten for the new node-based architecture. State now tracks individual
|
|
5
|
+
* workflow nodes instead of linear phases.
|
|
3
6
|
*/
|
|
4
7
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
5
8
|
import { join, dirname } from 'node:path';
|
|
6
|
-
import {
|
|
7
|
-
/**
|
|
8
|
-
* Error thrown when a tool requires scale but it hasn't been set yet.
|
|
9
|
-
*/
|
|
10
|
-
export class ScaleNotSetError extends Error {
|
|
11
|
-
constructor(projectName) {
|
|
12
|
-
super(`项目 "${projectName}" 尚未设定 scale。请先完成 PRD 审批,然后调用 project_set_scale 设定项目规模。`);
|
|
13
|
-
this.name = 'ScaleNotSetError';
|
|
14
|
-
}
|
|
15
|
-
}
|
|
9
|
+
import { initNodeStates } from './workflow-engine.js';
|
|
16
10
|
const STATE_FILE = 'state.json';
|
|
17
|
-
function statePath(projectName, iteration) {
|
|
18
|
-
return join(
|
|
11
|
+
function statePath(projectName, iteration, contextDir) {
|
|
12
|
+
return join(contextDir, STATE_FILE);
|
|
19
13
|
}
|
|
20
14
|
/**
|
|
21
|
-
* Initialize a new
|
|
22
|
-
*
|
|
23
|
-
*
|
|
15
|
+
* Initialize a new workflow state file.
|
|
16
|
+
*
|
|
17
|
+
* Creates initial NodeState records for all nodes in the workflow definition.
|
|
18
|
+
* All nodes start as 'pending'.
|
|
19
|
+
*
|
|
20
|
+
* @param contextDir - Directory containing state.json
|
|
24
21
|
*/
|
|
25
|
-
export async function
|
|
22
|
+
export async function initWorkflowState(projectName, projectDir, workflow, iteration, type = 'iteration', contextDir) {
|
|
26
23
|
const now = new Date().toISOString();
|
|
27
|
-
const
|
|
28
|
-
const firstPhaseId = phases[0]?.id ?? '';
|
|
24
|
+
const nodes = initNodeStates(workflow.definition);
|
|
29
25
|
const state = {
|
|
30
26
|
projectName,
|
|
31
27
|
projectDir,
|
|
32
28
|
workflow: workflow.definition.name,
|
|
29
|
+
type,
|
|
33
30
|
iteration,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
phases: phases.map((p, i) => ({
|
|
37
|
-
id: p.id,
|
|
38
|
-
status: i === 0 ? 'in_progress' : 'pending',
|
|
39
|
-
...(i === 0 ? { startedAt: now } : {}),
|
|
40
|
-
})),
|
|
31
|
+
activeNodeId: null,
|
|
32
|
+
nodes,
|
|
41
33
|
createdAt: now,
|
|
42
34
|
updatedAt: now,
|
|
43
35
|
};
|
|
44
|
-
await writeState(projectName, iteration, state);
|
|
36
|
+
await writeState(projectName, iteration, state, contextDir);
|
|
45
37
|
return state;
|
|
46
38
|
}
|
|
47
39
|
/**
|
|
48
|
-
* Read the current
|
|
40
|
+
* Read the current workflow state.
|
|
49
41
|
*/
|
|
50
|
-
export async function readState(projectName, iteration) {
|
|
51
|
-
const content = await readFile(statePath(projectName, iteration), 'utf-8');
|
|
42
|
+
export async function readState(projectName, iteration, contextDir) {
|
|
43
|
+
const content = await readFile(statePath(projectName, iteration, contextDir), 'utf-8');
|
|
52
44
|
return JSON.parse(content);
|
|
53
45
|
}
|
|
54
46
|
/**
|
|
55
|
-
* Write
|
|
47
|
+
* Write workflow state to disk.
|
|
56
48
|
*/
|
|
57
|
-
export async function writeState(projectName, iteration, state) {
|
|
58
|
-
const filePath = statePath(projectName, iteration);
|
|
49
|
+
export async function writeState(projectName, iteration, state, contextDir) {
|
|
50
|
+
const filePath = statePath(projectName, iteration, contextDir);
|
|
59
51
|
await mkdir(dirname(filePath), { recursive: true });
|
|
60
52
|
state.updatedAt = new Date().toISOString();
|
|
61
53
|
await writeFile(filePath, JSON.stringify(state, null, 2) + '\n', 'utf-8');
|
|
62
54
|
}
|
|
63
55
|
/**
|
|
64
|
-
* Update a specific
|
|
56
|
+
* Update a specific node's state. Reads current state, applies the partial update,
|
|
57
|
+
* and writes back.
|
|
58
|
+
*
|
|
59
|
+
* @returns The updated full WorkflowState
|
|
65
60
|
*/
|
|
66
|
-
export async function
|
|
67
|
-
const state = await readState(projectName, iteration);
|
|
68
|
-
const
|
|
69
|
-
if (!
|
|
70
|
-
throw new Error(`
|
|
71
|
-
}
|
|
72
|
-
const now = new Date().toISOString();
|
|
73
|
-
phase.status = status;
|
|
74
|
-
if (status === 'in_progress' && !phase.startedAt) {
|
|
75
|
-
phase.startedAt = now;
|
|
76
|
-
}
|
|
77
|
-
if (status === 'completed') {
|
|
78
|
-
phase.completedAt = now;
|
|
79
|
-
delete phase.blockedReason;
|
|
80
|
-
}
|
|
81
|
-
if (status === 'blocked' && blockedReason) {
|
|
82
|
-
phase.blockedReason = blockedReason;
|
|
83
|
-
}
|
|
84
|
-
// If advancing to in_progress, update currentPhase
|
|
85
|
-
if (status === 'in_progress') {
|
|
86
|
-
state.currentPhase = phaseId;
|
|
61
|
+
export async function updateNodeState(projectName, iteration, nodeId, update, contextDir) {
|
|
62
|
+
const state = await readState(projectName, iteration, contextDir);
|
|
63
|
+
const existing = state.nodes[nodeId];
|
|
64
|
+
if (!existing) {
|
|
65
|
+
throw new Error(`Node "${nodeId}" not found in workflow state for project "${projectName}"`);
|
|
87
66
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const idx = state.phases.findIndex((p) => p.id === phaseId);
|
|
91
|
-
const next = state.phases.find((p, i) => i > idx && p.status === 'pending');
|
|
92
|
-
if (next) {
|
|
93
|
-
next.status = 'in_progress';
|
|
94
|
-
next.startedAt = now;
|
|
95
|
-
state.currentPhase = next.id;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
await writeState(projectName, iteration, state);
|
|
67
|
+
state.nodes[nodeId] = { ...existing, ...update };
|
|
68
|
+
await writeState(projectName, iteration, state, contextDir);
|
|
99
69
|
return state;
|
|
100
70
|
}
|
|
101
71
|
/**
|
|
102
|
-
*
|
|
72
|
+
* Persist engine-computed state changes. After the workflow engine computes
|
|
73
|
+
* a new state (via computeNextAction or startWorkflow), call this to persist it.
|
|
74
|
+
*
|
|
75
|
+
* This is the preferred way to save state changes from the engine,
|
|
76
|
+
* as it replaces the entire state atomically.
|
|
103
77
|
*/
|
|
104
|
-
export async function
|
|
78
|
+
export async function persistState(projectName, iteration, state, contextDir) {
|
|
79
|
+
await writeState(projectName, iteration, state, contextDir);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Check if a workflow state file exists.
|
|
83
|
+
*/
|
|
84
|
+
export async function stateExists(projectName, iteration, contextDir) {
|
|
105
85
|
try {
|
|
106
|
-
await readFile(statePath(projectName, iteration), 'utf-8');
|
|
86
|
+
await readFile(statePath(projectName, iteration, contextDir), 'utf-8');
|
|
107
87
|
return true;
|
|
108
88
|
}
|
|
109
89
|
catch {
|
|
110
90
|
return false;
|
|
111
91
|
}
|
|
112
92
|
}
|
|
113
|
-
/**
|
|
114
|
-
* Set the project scale. Scale is immutable once set.
|
|
115
|
-
*/
|
|
116
|
-
export async function setScale(projectName, iteration, scale) {
|
|
117
|
-
const state = await readState(projectName, iteration);
|
|
118
|
-
if (state.scale !== null) {
|
|
119
|
-
throw new Error(`Scale 已设定为 "${state.scale}",不可更改。如需调整规模,请重新评估 PRD。`);
|
|
120
|
-
}
|
|
121
|
-
state.scale = scale;
|
|
122
|
-
await writeState(projectName, iteration, state);
|
|
123
|
-
return state;
|
|
124
|
-
}
|
|
125
93
|
//# 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
|
|
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,34 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Step state management — manages <
|
|
2
|
+
* Step state management — manages <context_dir>/steps.json
|
|
3
3
|
*
|
|
4
|
-
* Tracks which sequential steps have been completed for each
|
|
4
|
+
* Tracks which sequential steps have been completed for each artifact,
|
|
5
5
|
* supporting the P3 Sequential mode feature.
|
|
6
6
|
*/
|
|
7
|
-
import type {
|
|
7
|
+
import type { ArtifactStepState } from './types.js';
|
|
8
8
|
/**
|
|
9
|
-
* Read the steps state for a project
|
|
9
|
+
* Read the steps state for a project context.
|
|
10
10
|
*/
|
|
11
|
-
export declare function readSteps(projectName: string, iteration: number): Promise<Record<string,
|
|
11
|
+
export declare function readSteps(projectName: string, iteration: number, contextDir?: string): Promise<Record<string, ArtifactStepState>>;
|
|
12
12
|
/**
|
|
13
|
-
* Get the step state for a specific
|
|
13
|
+
* Get the step state for a specific artifact.
|
|
14
14
|
*/
|
|
15
|
-
export declare function
|
|
15
|
+
export declare function getArtifactStepState(projectName: string, iteration: number, artifactId: string, contextDir?: string): Promise<ArtifactStepState | null>;
|
|
16
16
|
/**
|
|
17
|
-
* Get the set of completed step IDs for
|
|
17
|
+
* Get the set of completed step IDs for an artifact.
|
|
18
18
|
*/
|
|
19
|
-
export declare function getCompletedStepIds(state:
|
|
19
|
+
export declare function getCompletedStepIds(state: ArtifactStepState | null): Set<string>;
|
|
20
20
|
/**
|
|
21
21
|
* Record a step as completed. If the step was already completed,
|
|
22
22
|
* it is overwritten and all subsequent steps are cleared (rollback).
|
|
23
23
|
*
|
|
24
|
-
* @returns The updated
|
|
24
|
+
* @returns The updated ArtifactStepState
|
|
25
25
|
*/
|
|
26
|
-
export declare function recordStepCompletion(projectName: string, iteration: number,
|
|
26
|
+
export declare function recordStepCompletion(projectName: string, iteration: number, artifactId: string, stepId: string, artifactPath: string, allStepIds: string[], contextDir?: string): Promise<ArtifactStepState>;
|
|
27
27
|
/**
|
|
28
|
-
* Mark
|
|
28
|
+
* Mark an artifact as finalized (all steps completed + final artifact written).
|
|
29
29
|
*/
|
|
30
|
-
export declare function markFinalized(projectName: string, iteration: number,
|
|
30
|
+
export declare function markFinalized(projectName: string, iteration: number, artifactId: string, contextDir?: string): Promise<ArtifactStepState>;
|
|
31
31
|
/**
|
|
32
|
-
* Check if
|
|
32
|
+
* Check if an artifact's sequential process is finalized.
|
|
33
33
|
*/
|
|
34
|
-
export declare function
|
|
34
|
+
export declare function isArtifactFinalized(projectName: string, iteration: number, artifactId: string, contextDir?: string): Promise<boolean>;
|
package/build/core/steps.js
CHANGED
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Step state management — manages <
|
|
2
|
+
* Step state management — manages <context_dir>/steps.json
|
|
3
3
|
*
|
|
4
|
-
* Tracks which sequential steps have been completed for each
|
|
4
|
+
* Tracks which sequential steps have been completed for each artifact,
|
|
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 { getIterationDir } from './registry.js';
|
|
10
9
|
const STEPS_FILE = 'steps.json';
|
|
11
|
-
function stepsPath(projectName, iteration) {
|
|
12
|
-
return join(
|
|
10
|
+
function stepsPath(projectName, iteration, contextDir) {
|
|
11
|
+
return join(contextDir, STEPS_FILE);
|
|
13
12
|
}
|
|
14
13
|
/**
|
|
15
|
-
* Read the steps state for a project
|
|
14
|
+
* Read the steps state for a project context.
|
|
16
15
|
*/
|
|
17
|
-
export async function readSteps(projectName, iteration) {
|
|
16
|
+
export async function readSteps(projectName, iteration, contextDir) {
|
|
18
17
|
try {
|
|
19
|
-
const content = await readFile(stepsPath(projectName, iteration), 'utf-8');
|
|
18
|
+
const content = await readFile(stepsPath(projectName, iteration, contextDir), 'utf-8');
|
|
20
19
|
const data = JSON.parse(content);
|
|
21
|
-
return data.
|
|
20
|
+
return data.artifacts ?? {};
|
|
22
21
|
}
|
|
23
22
|
catch {
|
|
24
23
|
return {};
|
|
@@ -27,21 +26,21 @@ export async function readSteps(projectName, iteration) {
|
|
|
27
26
|
/**
|
|
28
27
|
* Write steps state to disk.
|
|
29
28
|
*/
|
|
30
|
-
async function writeSteps(projectName, iteration,
|
|
31
|
-
const filePath = stepsPath(projectName, iteration);
|
|
29
|
+
async function writeSteps(projectName, iteration, artifacts, contextDir) {
|
|
30
|
+
const filePath = stepsPath(projectName, iteration, contextDir);
|
|
32
31
|
await mkdir(dirname(filePath), { recursive: true });
|
|
33
|
-
const data = {
|
|
32
|
+
const data = { artifacts };
|
|
34
33
|
await writeFile(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
35
34
|
}
|
|
36
35
|
/**
|
|
37
|
-
* Get the step state for a specific
|
|
36
|
+
* Get the step state for a specific artifact.
|
|
38
37
|
*/
|
|
39
|
-
export async function
|
|
40
|
-
const
|
|
41
|
-
return
|
|
38
|
+
export async function getArtifactStepState(projectName, iteration, artifactId, contextDir) {
|
|
39
|
+
const artifacts = await readSteps(projectName, iteration, contextDir);
|
|
40
|
+
return artifacts[artifactId] ?? null;
|
|
42
41
|
}
|
|
43
42
|
/**
|
|
44
|
-
* Get the set of completed step IDs for
|
|
43
|
+
* Get the set of completed step IDs for an artifact.
|
|
45
44
|
*/
|
|
46
45
|
export function getCompletedStepIds(state) {
|
|
47
46
|
if (!state)
|
|
@@ -52,14 +51,14 @@ export function getCompletedStepIds(state) {
|
|
|
52
51
|
* Record a step as completed. If the step was already completed,
|
|
53
52
|
* it is overwritten and all subsequent steps are cleared (rollback).
|
|
54
53
|
*
|
|
55
|
-
* @returns The updated
|
|
54
|
+
* @returns The updated ArtifactStepState
|
|
56
55
|
*/
|
|
57
|
-
export async function recordStepCompletion(projectName, iteration,
|
|
58
|
-
const
|
|
59
|
-
let state =
|
|
56
|
+
export async function recordStepCompletion(projectName, iteration, artifactId, stepId, artifactPath, allStepIds, contextDir) {
|
|
57
|
+
const artifacts = await readSteps(projectName, iteration, contextDir);
|
|
58
|
+
let state = artifacts[artifactId];
|
|
60
59
|
if (!state) {
|
|
61
60
|
state = {
|
|
62
|
-
|
|
61
|
+
artifactId,
|
|
63
62
|
completedSteps: [],
|
|
64
63
|
finalized: false,
|
|
65
64
|
};
|
|
@@ -85,29 +84,29 @@ export async function recordStepCompletion(projectName, iteration, docId, stepId
|
|
|
85
84
|
artifactPath,
|
|
86
85
|
};
|
|
87
86
|
state.completedSteps.push(record);
|
|
88
|
-
|
|
89
|
-
await writeSteps(projectName, iteration,
|
|
87
|
+
artifacts[artifactId] = state;
|
|
88
|
+
await writeSteps(projectName, iteration, artifacts, contextDir);
|
|
90
89
|
return state;
|
|
91
90
|
}
|
|
92
91
|
/**
|
|
93
|
-
* Mark
|
|
92
|
+
* Mark an artifact as finalized (all steps completed + final artifact written).
|
|
94
93
|
*/
|
|
95
|
-
export async function markFinalized(projectName, iteration,
|
|
96
|
-
const
|
|
97
|
-
const state =
|
|
94
|
+
export async function markFinalized(projectName, iteration, artifactId, contextDir) {
|
|
95
|
+
const artifacts = await readSteps(projectName, iteration, contextDir);
|
|
96
|
+
const state = artifacts[artifactId];
|
|
98
97
|
if (!state) {
|
|
99
|
-
throw new Error(`No step state found for
|
|
98
|
+
throw new Error(`No step state found for artifact "${artifactId}"`);
|
|
100
99
|
}
|
|
101
100
|
state.finalized = true;
|
|
102
101
|
state.finalizedAt = new Date().toISOString();
|
|
103
|
-
await writeSteps(projectName, iteration,
|
|
102
|
+
await writeSteps(projectName, iteration, artifacts, contextDir);
|
|
104
103
|
return state;
|
|
105
104
|
}
|
|
106
105
|
/**
|
|
107
|
-
* Check if
|
|
106
|
+
* Check if an artifact's sequential process is finalized.
|
|
108
107
|
*/
|
|
109
|
-
export async function
|
|
110
|
-
const state = await
|
|
108
|
+
export async function isArtifactFinalized(projectName, iteration, artifactId, contextDir) {
|
|
109
|
+
const state = await getArtifactStepState(projectName, iteration, artifactId, contextDir);
|
|
111
110
|
return state?.finalized ?? false;
|
|
112
111
|
}
|
|
113
112
|
//# 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;
|
|
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;AAG1C,MAAM,UAAU,GAAG,YAAY,CAAC;AAMhC,SAAS,SAAS,CAAC,WAAmB,EAAE,SAAiB,EAAE,UAAmB;IAC1E,OAAO,IAAI,CAAC,UAAW,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,WAAmB,EACnB,SAAiB,EACjB,UAAmB;IAEnB,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QACvF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;QAC9C,OAAO,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CACrB,WAAmB,EACnB,SAAiB,EACjB,SAA4C,EAC5C,UAAmB;IAEnB,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,IAAI,GAAc,EAAE,SAAS,EAAE,CAAC;IACtC,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,oBAAoB,CACtC,WAAmB,EACnB,SAAiB,EACjB,UAAkB,EAClB,UAAmB;IAEnB,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACtE,OAAO,SAAS,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA+B;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAC7B,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,WAAmB,EACnB,SAAiB,EACjB,UAAkB,EAClB,MAAc,EACd,YAAoB,EACpB,UAAoB,EACpB,UAAmB;IAEnB,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACtE,IAAI,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAElC,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,KAAK,GAAG;YACJ,UAAU;YACV,cAAc,EAAE,EAAE;YAClB,SAAS,EAAE,KAAK;SACnB,CAAC;IACN,CAAC;IAED,2DAA2D;IAC3D,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE7C,8EAA8E;IAC9E,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACjF,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;QACrB,2CAA2C;QAC3C,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACrD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO,IAAI,GAAG,SAAS,CAAC;QAC5B,CAAC,CAAC,CAAC;QACH,uBAAuB;QACvB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;QACxB,OAAO,KAAK,CAAC,WAAW,CAAC;IAC7B,CAAC;IAED,sBAAsB;IACtB,MAAM,MAAM,GAAuB;QAC/B,MAAM;QACN,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,YAAY;KACf,CAAC;IACF,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAElC,SAAS,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC;IAC9B,MAAM,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,WAAmB,EACnB,SAAiB,EACjB,UAAkB,EAClB,UAAmB;IAEnB,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAEpC,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,qCAAqC,UAAU,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE7C,MAAM,UAAU,CAAC,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAChE,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACrC,WAAmB,EACnB,SAAiB,EACjB,UAAkB,EAClB,UAAmB;IAEnB,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACzF,OAAO,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure node-tree traversal utilities.
|
|
3
|
+
*
|
|
4
|
+
* All functions here are pure (no side effects, no engine state dependency),
|
|
5
|
+
* and only depend on types from ./types.ts.
|
|
6
|
+
*
|
|
7
|
+
* Extracted from workflow-engine.ts, loop-done.ts, role-dispatch.ts,
|
|
8
|
+
* engine-helpers.ts, and workflow-validator.ts to eliminate duplication
|
|
9
|
+
* and avoid circular dependencies.
|
|
10
|
+
*/
|
|
11
|
+
import type { WorkflowNode, TaskNode } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Find a node by ID within a workflow tree.
|
|
14
|
+
* Returns null if not found.
|
|
15
|
+
*/
|
|
16
|
+
export declare function findNodeInTree(node: WorkflowNode, targetId: string): WorkflowNode | null;
|
|
17
|
+
/**
|
|
18
|
+
* Find the path from root to a specific node (inclusive on both ends).
|
|
19
|
+
* Returns null if node not found.
|
|
20
|
+
*/
|
|
21
|
+
export declare function findPathToNode(node: WorkflowNode, targetId: string): WorkflowNode[] | null;
|
|
22
|
+
/**
|
|
23
|
+
* Recursively collect all node IDs in a subtree.
|
|
24
|
+
*/
|
|
25
|
+
export declare function collectAllNodeIds(node: WorkflowNode, ids: Set<string>): void;
|
|
26
|
+
/**
|
|
27
|
+
* Find the parent of a node by its ID.
|
|
28
|
+
* Returns the parent node and the child's index, or null if not found.
|
|
29
|
+
*/
|
|
30
|
+
export declare function findParent(root: WorkflowNode, targetId: string, current?: WorkflowNode): {
|
|
31
|
+
parent: WorkflowNode;
|
|
32
|
+
childIndex: number;
|
|
33
|
+
} | null;
|
|
34
|
+
/**
|
|
35
|
+
* Collect all node IDs that come after a target node in execution order.
|
|
36
|
+
*
|
|
37
|
+
* "After" means:
|
|
38
|
+
* - Subsequent siblings (and their full subtrees) in the parent sequence
|
|
39
|
+
* - Any nodes that follow the parent in its grandparent sequence (recursively)
|
|
40
|
+
*
|
|
41
|
+
* For parallel nodes, subsequent siblings don't apply (they execute simultaneously).
|
|
42
|
+
*/
|
|
43
|
+
export declare function collectSubsequentNodeIds(root: WorkflowNode, targetId: string): Set<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Collect all task nodes from a workflow tree (recursive).
|
|
46
|
+
*/
|
|
47
|
+
export declare function collectTaskNodes(node: WorkflowNode): TaskNode[];
|
|
48
|
+
/**
|
|
49
|
+
* Find the nearest ancestor loop node for a given node ID.
|
|
50
|
+
* Returns the loop node ID if found, undefined otherwise.
|
|
51
|
+
*/
|
|
52
|
+
export declare function findAncestorLoopId(root: WorkflowNode, targetId: string): string | undefined;
|