@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.
Files changed (172) hide show
  1. package/README.md +140 -392
  2. package/build/cli/setup.d.ts +4 -2
  3. package/build/cli/setup.js +44 -18
  4. package/build/cli/setup.js.map +1 -1
  5. package/build/core/action-registry.d.ts +36 -0
  6. package/build/core/action-registry.js +53 -0
  7. package/build/core/action-registry.js.map +1 -0
  8. package/build/core/artifacts.d.ts +66 -0
  9. package/build/core/artifacts.js +178 -0
  10. package/build/core/artifacts.js.map +1 -0
  11. package/build/core/dispatch.d.ts +6 -2
  12. package/build/core/dispatch.js +12 -7
  13. package/build/core/dispatch.js.map +1 -1
  14. package/build/core/overrides.d.ts +19 -26
  15. package/build/core/overrides.js +32 -98
  16. package/build/core/overrides.js.map +1 -1
  17. package/build/core/plugin.d.ts +86 -0
  18. package/build/core/plugin.js +332 -0
  19. package/build/core/plugin.js.map +1 -0
  20. package/build/core/registry.d.ts +4 -5
  21. package/build/core/registry.js +8 -9
  22. package/build/core/registry.js.map +1 -1
  23. package/build/core/reviews.d.ts +11 -12
  24. package/build/core/reviews.js +18 -21
  25. package/build/core/reviews.js.map +1 -1
  26. package/build/core/schema.d.ts +43 -15
  27. package/build/core/schema.js +124 -20
  28. package/build/core/schema.js.map +1 -1
  29. package/build/core/state.d.ts +26 -27
  30. package/build/core/state.js +36 -90
  31. package/build/core/state.js.map +1 -1
  32. package/build/core/steps.d.ts +13 -14
  33. package/build/core/steps.js +26 -29
  34. package/build/core/steps.js.map +1 -1
  35. package/build/core/tree-utils.d.ts +52 -0
  36. package/build/core/tree-utils.js +226 -0
  37. package/build/core/tree-utils.js.map +1 -0
  38. package/build/core/types.d.ts +389 -118
  39. package/build/core/types.js +15 -1
  40. package/build/core/types.js.map +1 -1
  41. package/build/core/workflow-engine.d.ts +68 -0
  42. package/build/core/workflow-engine.js +821 -0
  43. package/build/core/workflow-engine.js.map +1 -0
  44. package/build/core/workflow-validator.d.ts +22 -0
  45. package/build/core/workflow-validator.js +489 -0
  46. package/build/core/workflow-validator.js.map +1 -0
  47. package/build/index.js +25 -26
  48. package/build/index.js.map +1 -1
  49. package/build/setup/inject.d.ts +4 -4
  50. package/build/setup/inject.js +6 -6
  51. package/build/setup/inject.js.map +1 -1
  52. package/build/setup/templates.d.ts +9 -7
  53. package/build/setup/templates.js +68 -172
  54. package/build/setup/templates.js.map +1 -1
  55. package/build/tools/artifact-approve.d.ts +8 -0
  56. package/build/tools/{approve-doc.js → artifact-approve.js} +24 -16
  57. package/build/tools/artifact-approve.js.map +1 -0
  58. package/build/tools/artifact-schema.d.ts +12 -0
  59. package/build/tools/artifact-schema.js +148 -0
  60. package/build/tools/artifact-schema.js.map +1 -0
  61. package/build/tools/artifact-tools.d.ts +18 -0
  62. package/build/tools/artifact-tools.js +465 -0
  63. package/build/tools/artifact-tools.js.map +1 -0
  64. package/build/tools/{report-dispatch.d.ts → dispatch-report.d.ts} +7 -3
  65. package/build/tools/{report-dispatch.js → dispatch-report.js} +106 -28
  66. package/build/tools/dispatch-report.js.map +1 -0
  67. package/build/tools/engine-helpers.d.ts +41 -0
  68. package/build/tools/engine-helpers.js +182 -0
  69. package/build/tools/engine-helpers.js.map +1 -0
  70. package/build/tools/get-project-status.d.ts +6 -4
  71. package/build/tools/get-project-status.js +265 -248
  72. package/build/tools/get-project-status.js.map +1 -1
  73. package/build/tools/get-role-prompt.d.ts +1 -1
  74. package/build/tools/get-role-prompt.js +7 -41
  75. package/build/tools/get-role-prompt.js.map +1 -1
  76. package/build/tools/iteration-start.d.ts +7 -4
  77. package/build/tools/iteration-start.js +45 -19
  78. package/build/tools/iteration-start.js.map +1 -1
  79. package/build/tools/loop-done.d.ts +11 -0
  80. package/build/tools/loop-done.js +109 -0
  81. package/build/tools/loop-done.js.map +1 -0
  82. package/build/tools/patch-start.d.ts +4 -2
  83. package/build/tools/patch-start.js +36 -11
  84. package/build/tools/patch-start.js.map +1 -1
  85. package/build/tools/project-init.d.ts +5 -5
  86. package/build/tools/project-init.js +41 -10
  87. package/build/tools/project-init.js.map +1 -1
  88. package/build/tools/role-dispatch.d.ts +55 -0
  89. package/build/tools/role-dispatch.js +508 -0
  90. package/build/tools/role-dispatch.js.map +1 -0
  91. package/build/tools/utils.d.ts +6 -0
  92. package/build/tools/utils.js +36 -0
  93. package/build/tools/utils.js.map +1 -1
  94. package/package.json +1 -1
  95. package/{build/hooks/claude-code.js → workflows/dev/hooks/claude.js} +34 -23
  96. package/{build → workflows/dev}/hooks/content.js +27 -18
  97. package/workflows/dev/hooks/index.js +52 -0
  98. package/{build → workflows/dev}/hooks/openclaw.js +31 -20
  99. package/{build → workflows/dev}/hooks/opencode.js +31 -20
  100. package/workflows/dev/roles/architect.md +68 -28
  101. package/workflows/dev/roles/coordinator.md +103 -0
  102. package/workflows/dev/roles/developer.md +5 -5
  103. package/workflows/dev/roles/tester.md +19 -19
  104. package/workflows/dev/schemas/api-contract.json +42 -0
  105. package/workflows/dev/schemas/api-design.json +30 -13
  106. package/workflows/dev/schemas/data-model.json +20 -7
  107. package/workflows/dev/schemas/prd.completeness-check.json +6 -5
  108. package/workflows/dev/schemas/prd.draft.json +13 -5
  109. package/workflows/dev/schemas/prd.final.json +34 -11
  110. package/workflows/dev/schemas/prd.json +29 -11
  111. package/workflows/dev/schemas/prd.requirements.json +6 -5
  112. package/workflows/dev/schemas/prototype.json +6 -2
  113. package/workflows/dev/schemas/task-breakdown.coarse.json +4 -3
  114. package/workflows/dev/schemas/task-breakdown.dependencies.json +5 -4
  115. package/workflows/dev/schemas/task-breakdown.detailed.json +8 -3
  116. package/workflows/dev/schemas/task-breakdown.final.json +8 -3
  117. package/workflows/dev/schemas/task-breakdown.json +8 -3
  118. package/workflows/dev/schemas/tech-design.analysis.json +6 -5
  119. package/workflows/dev/schemas/tech-design.draft.json +14 -5
  120. package/workflows/dev/schemas/tech-design.final.json +39 -13
  121. package/workflows/dev/schemas/tech-design.json +34 -13
  122. package/workflows/dev/schemas/tech-design.research.json +21 -0
  123. package/workflows/dev/schemas/test-plan.json +17 -7
  124. package/workflows/dev/schemas/test-report.json +26 -9
  125. package/workflows/dev/schemas/user-stories.json +7 -3
  126. package/workflows/dev/tools/index.js +23 -0
  127. package/workflows/dev/workflow.json +234 -101
  128. package/build/core/docs.d.ts +0 -36
  129. package/build/core/docs.js +0 -96
  130. package/build/core/docs.js.map +0 -1
  131. package/build/core/workflow.d.ts +0 -33
  132. package/build/core/workflow.js +0 -140
  133. package/build/core/workflow.js.map +0 -1
  134. package/build/hooks/claude-code.d.ts +0 -20
  135. package/build/hooks/claude-code.js.map +0 -1
  136. package/build/hooks/content.d.ts +0 -43
  137. package/build/hooks/content.js.map +0 -1
  138. package/build/hooks/install.d.ts +0 -40
  139. package/build/hooks/install.js +0 -63
  140. package/build/hooks/install.js.map +0 -1
  141. package/build/hooks/openclaw.d.ts +0 -24
  142. package/build/hooks/openclaw.js.map +0 -1
  143. package/build/hooks/opencode.d.ts +0 -29
  144. package/build/hooks/opencode.js.map +0 -1
  145. package/build/tools/approve-doc.d.ts +0 -6
  146. package/build/tools/approve-doc.js.map +0 -1
  147. package/build/tools/dispatch-role.d.ts +0 -16
  148. package/build/tools/dispatch-role.js +0 -266
  149. package/build/tools/dispatch-role.js.map +0 -1
  150. package/build/tools/doc-tools.d.ts +0 -16
  151. package/build/tools/doc-tools.js +0 -425
  152. package/build/tools/doc-tools.js.map +0 -1
  153. package/build/tools/override-tools.d.ts +0 -6
  154. package/build/tools/override-tools.js +0 -129
  155. package/build/tools/override-tools.js.map +0 -1
  156. package/build/tools/report-dispatch.js.map +0 -1
  157. package/build/tools/set-scale.d.ts +0 -6
  158. package/build/tools/set-scale.js +0 -95
  159. package/build/tools/set-scale.js.map +0 -1
  160. package/build/tools/setup-project.d.ts +0 -8
  161. package/build/tools/setup-project.js +0 -116
  162. package/build/tools/setup-project.js.map +0 -1
  163. package/build/tools/update-phase.d.ts +0 -12
  164. package/build/tools/update-phase.js +0 -148
  165. package/build/tools/update-phase.js.map +0 -1
  166. package/workflows/dev/roles/pm.md +0 -99
  167. package/workflows/dev/schemas/deploy.json +0 -20
  168. package/workflows/dev/schemas/fsd.json +0 -25
  169. package/workflows/dev/schemas/project-plan.json +0 -20
  170. package/workflows/dev/schemas/retrospective.json +0 -20
  171. package/workflows/dev/schemas/risk-assessment.json +0 -15
  172. package/workflows/dev/schemas/tech-design.api-contract.json +0 -20
@@ -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 document,
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
- const base = contextDir ?? getIterationDir(projectName, iteration);
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.docs ?? {};
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, docs, contextDir) {
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 = { docs };
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 document.
36
+ * Get the step state for a specific artifact.
40
37
  */
41
- export async function getDocStepState(projectName, iteration, docId, contextDir) {
42
- const docs = await readSteps(projectName, iteration, contextDir);
43
- return docs[docId] ?? null;
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 a document.
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 DocStepState
54
+ * @returns The updated ArtifactStepState
58
55
  */
59
- export async function recordStepCompletion(projectName, iteration, docId, stepId, artifactPath, allStepIds, contextDir) {
60
- const docs = await readSteps(projectName, iteration, contextDir);
61
- let state = docs[docId];
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
- docId,
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
- docs[docId] = state;
91
- await writeSteps(projectName, iteration, docs, contextDir);
87
+ artifacts[artifactId] = state;
88
+ await writeSteps(projectName, iteration, artifacts, contextDir);
92
89
  return state;
93
90
  }
94
91
  /**
95
- * Mark a document as finalized (all steps completed + final doc written).
92
+ * Mark an artifact as finalized (all steps completed + final artifact written).
96
93
  */
97
- export async function markFinalized(projectName, iteration, docId, contextDir) {
98
- const docs = await readSteps(projectName, iteration, contextDir);
99
- const state = docs[docId];
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 document "${docId}"`);
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, docs, contextDir);
102
+ await writeSteps(projectName, iteration, artifacts, contextDir);
106
103
  return state;
107
104
  }
108
105
  /**
109
- * Check if a document's sequential process is finalized.
106
+ * Check if an artifact's sequential process is finalized.
110
107
  */
111
- export async function isDocFinalized(projectName, iteration, docId, contextDir) {
112
- const state = await getDocStepState(projectName, iteration, docId, contextDir);
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
@@ -1 +1 @@
1
- {"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/core/steps.ts"],"names":[],"mappings":"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"}
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;
@@ -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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"}