@s_s/harmonia 1.3.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 +6 -2
- package/build/core/dispatch.js +12 -7
- package/build/core/dispatch.js.map +1 -1
- 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 +4 -5
- package/build/core/registry.js +8 -9
- package/build/core/registry.js.map +1 -1
- package/build/core/reviews.d.ts +11 -12
- package/build/core/reviews.js +18 -21
- 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 +26 -27
- package/build/core/state.js +36 -90
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +13 -14
- package/build/core/steps.js +26 -29
- 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 +389 -118
- 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 +25 -26
- 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 -172
- package/build/setup/templates.js.map +1 -1
- package/build/tools/artifact-approve.d.ts +8 -0
- package/build/tools/{approve-doc.js → artifact-approve.js} +24 -16
- 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/{report-dispatch.js → dispatch-report.js} +106 -28
- 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 +265 -248
- 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/iteration-start.d.ts +7 -4
- package/build/tools/iteration-start.js +45 -19
- 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 +4 -2
- package/build/tools/patch-start.js +36 -11
- package/build/tools/patch-start.js.map +1 -1
- package/build/tools/project-init.d.ts +5 -5
- package/build/tools/project-init.js +41 -10
- 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 +6 -0
- package/build/tools/utils.js +36 -0
- package/build/tools/utils.js.map +1 -1
- 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 -36
- package/build/core/docs.js +0 -96
- 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.map +0 -1
- package/build/tools/dispatch-role.d.ts +0 -16
- package/build/tools/dispatch-role.js +0 -266
- 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 -425
- 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.map +0 -1
- package/build/tools/set-scale.d.ts +0 -6
- package/build/tools/set-scale.js +0 -95
- 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 -148
- 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/steps.js
CHANGED
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
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
|
-
* All public functions accept an optional contextDir parameter.
|
|
7
6
|
*/
|
|
8
7
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
9
8
|
import { join, dirname } from 'node:path';
|
|
10
|
-
import { getIterationDir } from './registry.js';
|
|
11
9
|
const STEPS_FILE = 'steps.json';
|
|
12
10
|
function stepsPath(projectName, iteration, contextDir) {
|
|
13
|
-
|
|
14
|
-
return join(base, STEPS_FILE);
|
|
11
|
+
return join(contextDir, STEPS_FILE);
|
|
15
12
|
}
|
|
16
13
|
/**
|
|
17
14
|
* Read the steps state for a project context.
|
|
@@ -20,7 +17,7 @@ export async function readSteps(projectName, iteration, contextDir) {
|
|
|
20
17
|
try {
|
|
21
18
|
const content = await readFile(stepsPath(projectName, iteration, contextDir), 'utf-8');
|
|
22
19
|
const data = JSON.parse(content);
|
|
23
|
-
return data.
|
|
20
|
+
return data.artifacts ?? {};
|
|
24
21
|
}
|
|
25
22
|
catch {
|
|
26
23
|
return {};
|
|
@@ -29,21 +26,21 @@ export async function readSteps(projectName, iteration, contextDir) {
|
|
|
29
26
|
/**
|
|
30
27
|
* Write steps state to disk.
|
|
31
28
|
*/
|
|
32
|
-
async function writeSteps(projectName, iteration,
|
|
29
|
+
async function writeSteps(projectName, iteration, artifacts, contextDir) {
|
|
33
30
|
const filePath = stepsPath(projectName, iteration, contextDir);
|
|
34
31
|
await mkdir(dirname(filePath), { recursive: true });
|
|
35
|
-
const data = {
|
|
32
|
+
const data = { artifacts };
|
|
36
33
|
await writeFile(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
37
34
|
}
|
|
38
35
|
/**
|
|
39
|
-
* Get the step state for a specific
|
|
36
|
+
* Get the step state for a specific artifact.
|
|
40
37
|
*/
|
|
41
|
-
export async function
|
|
42
|
-
const
|
|
43
|
-
return
|
|
38
|
+
export async function getArtifactStepState(projectName, iteration, artifactId, contextDir) {
|
|
39
|
+
const artifacts = await readSteps(projectName, iteration, contextDir);
|
|
40
|
+
return artifacts[artifactId] ?? null;
|
|
44
41
|
}
|
|
45
42
|
/**
|
|
46
|
-
* Get the set of completed step IDs for
|
|
43
|
+
* Get the set of completed step IDs for an artifact.
|
|
47
44
|
*/
|
|
48
45
|
export function getCompletedStepIds(state) {
|
|
49
46
|
if (!state)
|
|
@@ -54,14 +51,14 @@ export function getCompletedStepIds(state) {
|
|
|
54
51
|
* Record a step as completed. If the step was already completed,
|
|
55
52
|
* it is overwritten and all subsequent steps are cleared (rollback).
|
|
56
53
|
*
|
|
57
|
-
* @returns The updated
|
|
54
|
+
* @returns The updated ArtifactStepState
|
|
58
55
|
*/
|
|
59
|
-
export async function recordStepCompletion(projectName, iteration,
|
|
60
|
-
const
|
|
61
|
-
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];
|
|
62
59
|
if (!state) {
|
|
63
60
|
state = {
|
|
64
|
-
|
|
61
|
+
artifactId,
|
|
65
62
|
completedSteps: [],
|
|
66
63
|
finalized: false,
|
|
67
64
|
};
|
|
@@ -87,29 +84,29 @@ export async function recordStepCompletion(projectName, iteration, docId, stepId
|
|
|
87
84
|
artifactPath,
|
|
88
85
|
};
|
|
89
86
|
state.completedSteps.push(record);
|
|
90
|
-
|
|
91
|
-
await writeSteps(projectName, iteration,
|
|
87
|
+
artifacts[artifactId] = state;
|
|
88
|
+
await writeSteps(projectName, iteration, artifacts, contextDir);
|
|
92
89
|
return state;
|
|
93
90
|
}
|
|
94
91
|
/**
|
|
95
|
-
* Mark
|
|
92
|
+
* Mark an artifact as finalized (all steps completed + final artifact written).
|
|
96
93
|
*/
|
|
97
|
-
export async function markFinalized(projectName, iteration,
|
|
98
|
-
const
|
|
99
|
-
const state =
|
|
94
|
+
export async function markFinalized(projectName, iteration, artifactId, contextDir) {
|
|
95
|
+
const artifacts = await readSteps(projectName, iteration, contextDir);
|
|
96
|
+
const state = artifacts[artifactId];
|
|
100
97
|
if (!state) {
|
|
101
|
-
throw new Error(`No step state found for
|
|
98
|
+
throw new Error(`No step state found for artifact "${artifactId}"`);
|
|
102
99
|
}
|
|
103
100
|
state.finalized = true;
|
|
104
101
|
state.finalizedAt = new Date().toISOString();
|
|
105
|
-
await writeSteps(projectName, iteration,
|
|
102
|
+
await writeSteps(projectName, iteration, artifacts, contextDir);
|
|
106
103
|
return state;
|
|
107
104
|
}
|
|
108
105
|
/**
|
|
109
|
-
* Check if
|
|
106
|
+
* Check if an artifact's sequential process is finalized.
|
|
110
107
|
*/
|
|
111
|
-
export async function
|
|
112
|
-
const state = await
|
|
108
|
+
export async function isArtifactFinalized(projectName, iteration, artifactId, contextDir) {
|
|
109
|
+
const state = await getArtifactStepState(projectName, iteration, artifactId, contextDir);
|
|
113
110
|
return state?.finalized ?? false;
|
|
114
111
|
}
|
|
115
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
|
|
1
|
+
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/core/steps.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
@@ -0,0 +1,226 @@
|
|
|
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
|
+
/**
|
|
12
|
+
* Find a node by ID within a workflow tree.
|
|
13
|
+
* Returns null if not found.
|
|
14
|
+
*/
|
|
15
|
+
export function findNodeInTree(node, targetId) {
|
|
16
|
+
if (node.id === targetId)
|
|
17
|
+
return node;
|
|
18
|
+
switch (node.type) {
|
|
19
|
+
case 'sequence':
|
|
20
|
+
case 'parallel':
|
|
21
|
+
for (const child of node.children) {
|
|
22
|
+
const found = findNodeInTree(child, targetId);
|
|
23
|
+
if (found)
|
|
24
|
+
return found;
|
|
25
|
+
}
|
|
26
|
+
break;
|
|
27
|
+
case 'gate': {
|
|
28
|
+
const passResult = findNodeInTree(node.pass, targetId);
|
|
29
|
+
if (passResult)
|
|
30
|
+
return passResult;
|
|
31
|
+
if ('type' in node.fail) {
|
|
32
|
+
const failResult = findNodeInTree(node.fail, targetId);
|
|
33
|
+
if (failResult)
|
|
34
|
+
return failResult;
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case 'loop': {
|
|
39
|
+
const bodyResult = findNodeInTree(node.body, targetId);
|
|
40
|
+
if (bodyResult)
|
|
41
|
+
return bodyResult;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Find the path from root to a specific node (inclusive on both ends).
|
|
49
|
+
* Returns null if node not found.
|
|
50
|
+
*/
|
|
51
|
+
export function findPathToNode(node, targetId) {
|
|
52
|
+
if (node.id === targetId)
|
|
53
|
+
return [node];
|
|
54
|
+
switch (node.type) {
|
|
55
|
+
case 'sequence':
|
|
56
|
+
case 'parallel':
|
|
57
|
+
for (const child of node.children) {
|
|
58
|
+
const path = findPathToNode(child, targetId);
|
|
59
|
+
if (path)
|
|
60
|
+
return [node, ...path];
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
case 'gate': {
|
|
64
|
+
const passPath = findPathToNode(node.pass, targetId);
|
|
65
|
+
if (passPath)
|
|
66
|
+
return [node, ...passPath];
|
|
67
|
+
if ('type' in node.fail) {
|
|
68
|
+
const failPath = findPathToNode(node.fail, targetId);
|
|
69
|
+
if (failPath)
|
|
70
|
+
return [node, ...failPath];
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case 'loop': {
|
|
75
|
+
const bodyPath = findPathToNode(node.body, targetId);
|
|
76
|
+
if (bodyPath)
|
|
77
|
+
return [node, ...bodyPath];
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Recursively collect all node IDs in a subtree.
|
|
85
|
+
*/
|
|
86
|
+
export function collectAllNodeIds(node, ids) {
|
|
87
|
+
ids.add(node.id);
|
|
88
|
+
switch (node.type) {
|
|
89
|
+
case 'sequence':
|
|
90
|
+
case 'parallel':
|
|
91
|
+
for (const child of node.children) {
|
|
92
|
+
collectAllNodeIds(child, ids);
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
case 'gate':
|
|
96
|
+
collectAllNodeIds(node.pass, ids);
|
|
97
|
+
if ('type' in node.fail) {
|
|
98
|
+
collectAllNodeIds(node.fail, ids);
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
case 'loop':
|
|
102
|
+
collectAllNodeIds(node.body, ids);
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Find the parent of a node by its ID.
|
|
108
|
+
* Returns the parent node and the child's index, or null if not found.
|
|
109
|
+
*/
|
|
110
|
+
export function findParent(root, targetId, current) {
|
|
111
|
+
const node = current ?? root;
|
|
112
|
+
switch (node.type) {
|
|
113
|
+
case 'sequence':
|
|
114
|
+
case 'parallel':
|
|
115
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
116
|
+
if (node.children[i].id === targetId) {
|
|
117
|
+
return { parent: node, childIndex: i };
|
|
118
|
+
}
|
|
119
|
+
const found = findParent(root, targetId, node.children[i]);
|
|
120
|
+
if (found)
|
|
121
|
+
return found;
|
|
122
|
+
}
|
|
123
|
+
break;
|
|
124
|
+
case 'gate':
|
|
125
|
+
if (node.pass.id === targetId) {
|
|
126
|
+
return { parent: node, childIndex: 0 };
|
|
127
|
+
}
|
|
128
|
+
const passResult = findParent(root, targetId, node.pass);
|
|
129
|
+
if (passResult)
|
|
130
|
+
return passResult;
|
|
131
|
+
if ('type' in node.fail) {
|
|
132
|
+
const failNode = node.fail;
|
|
133
|
+
if (failNode.id === targetId) {
|
|
134
|
+
return { parent: node, childIndex: 1 };
|
|
135
|
+
}
|
|
136
|
+
const failResult = findParent(root, targetId, failNode);
|
|
137
|
+
if (failResult)
|
|
138
|
+
return failResult;
|
|
139
|
+
}
|
|
140
|
+
break;
|
|
141
|
+
case 'loop':
|
|
142
|
+
if (node.body.id === targetId) {
|
|
143
|
+
return { parent: node, childIndex: 0 };
|
|
144
|
+
}
|
|
145
|
+
const loopResult = findParent(root, targetId, node.body);
|
|
146
|
+
if (loopResult)
|
|
147
|
+
return loopResult;
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Collect all node IDs that come after a target node in execution order.
|
|
154
|
+
*
|
|
155
|
+
* "After" means:
|
|
156
|
+
* - Subsequent siblings (and their full subtrees) in the parent sequence
|
|
157
|
+
* - Any nodes that follow the parent in its grandparent sequence (recursively)
|
|
158
|
+
*
|
|
159
|
+
* For parallel nodes, subsequent siblings don't apply (they execute simultaneously).
|
|
160
|
+
*/
|
|
161
|
+
export function collectSubsequentNodeIds(root, targetId) {
|
|
162
|
+
const result = new Set();
|
|
163
|
+
// Find the path from root to the target
|
|
164
|
+
const path = findPathToNode(root, targetId);
|
|
165
|
+
if (!path || path.length === 0)
|
|
166
|
+
return result;
|
|
167
|
+
// Walk up the path, collecting subsequent siblings at each level
|
|
168
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
169
|
+
const parent = path[i];
|
|
170
|
+
const child = path[i + 1];
|
|
171
|
+
if (parent.type === 'sequence') {
|
|
172
|
+
const childIndex = parent.children.findIndex((c) => c.id === child.id);
|
|
173
|
+
// Collect all children after the one on our path
|
|
174
|
+
for (let j = childIndex + 1; j < parent.children.length; j++) {
|
|
175
|
+
collectAllNodeIds(parent.children[j], result);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// For gate nodes, if our path goes through pass, we don't need to collect fail
|
|
179
|
+
// because fail is an alternative path, not a subsequent one.
|
|
180
|
+
// For parallel nodes, siblings are concurrent not subsequent — don't reset.
|
|
181
|
+
}
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Collect all task nodes from a workflow tree (recursive).
|
|
186
|
+
*/
|
|
187
|
+
export function collectTaskNodes(node) {
|
|
188
|
+
const tasks = [];
|
|
189
|
+
switch (node.type) {
|
|
190
|
+
case 'task':
|
|
191
|
+
tasks.push(node);
|
|
192
|
+
break;
|
|
193
|
+
case 'sequence':
|
|
194
|
+
case 'parallel':
|
|
195
|
+
for (const child of node.children) {
|
|
196
|
+
tasks.push(...collectTaskNodes(child));
|
|
197
|
+
}
|
|
198
|
+
break;
|
|
199
|
+
case 'gate':
|
|
200
|
+
tasks.push(...collectTaskNodes(node.pass));
|
|
201
|
+
if ('type' in node.fail) {
|
|
202
|
+
tasks.push(...collectTaskNodes(node.fail));
|
|
203
|
+
}
|
|
204
|
+
break;
|
|
205
|
+
case 'loop':
|
|
206
|
+
tasks.push(...collectTaskNodes(node.body));
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
return tasks;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Find the nearest ancestor loop node for a given node ID.
|
|
213
|
+
* Returns the loop node ID if found, undefined otherwise.
|
|
214
|
+
*/
|
|
215
|
+
export function findAncestorLoopId(root, targetId) {
|
|
216
|
+
const path = findPathToNode(root, targetId);
|
|
217
|
+
if (!path)
|
|
218
|
+
return undefined;
|
|
219
|
+
// Walk backwards through ancestors (excluding the target itself)
|
|
220
|
+
for (let i = path.length - 2; i >= 0; i--) {
|
|
221
|
+
if (path[i].type === 'loop')
|
|
222
|
+
return path[i].id;
|
|
223
|
+
}
|
|
224
|
+
return undefined;
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=tree-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-utils.js","sourceRoot":"","sources":["../../src/core/tree-utils.ts"],"names":[],"mappings":"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"}
|