@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.
Files changed (180) 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 +18 -11
  12. package/build/core/dispatch.js +43 -33
  13. package/build/core/dispatch.js.map +1 -1
  14. package/build/core/issues.d.ts +37 -0
  15. package/build/core/issues.js +100 -0
  16. package/build/core/issues.js.map +1 -0
  17. package/build/core/overrides.d.ts +19 -26
  18. package/build/core/overrides.js +32 -98
  19. package/build/core/overrides.js.map +1 -1
  20. package/build/core/plugin.d.ts +86 -0
  21. package/build/core/plugin.js +332 -0
  22. package/build/core/plugin.js.map +1 -0
  23. package/build/core/registry.d.ts +36 -3
  24. package/build/core/registry.js +63 -5
  25. package/build/core/registry.js.map +1 -1
  26. package/build/core/reviews.d.ts +13 -13
  27. package/build/core/reviews.js +31 -32
  28. package/build/core/reviews.js.map +1 -1
  29. package/build/core/schema.d.ts +43 -15
  30. package/build/core/schema.js +124 -20
  31. package/build/core/schema.js.map +1 -1
  32. package/build/core/state.d.ts +29 -22
  33. package/build/core/state.js +49 -81
  34. package/build/core/state.js.map +1 -1
  35. package/build/core/steps.d.ts +15 -15
  36. package/build/core/steps.js +32 -33
  37. package/build/core/steps.js.map +1 -1
  38. package/build/core/tree-utils.d.ts +52 -0
  39. package/build/core/tree-utils.js +226 -0
  40. package/build/core/tree-utils.js.map +1 -0
  41. package/build/core/types.d.ts +417 -117
  42. package/build/core/types.js +15 -1
  43. package/build/core/types.js.map +1 -1
  44. package/build/core/workflow-engine.d.ts +68 -0
  45. package/build/core/workflow-engine.js +821 -0
  46. package/build/core/workflow-engine.js.map +1 -0
  47. package/build/core/workflow-validator.d.ts +22 -0
  48. package/build/core/workflow-validator.js +489 -0
  49. package/build/core/workflow-validator.js.map +1 -0
  50. package/build/index.js +28 -25
  51. package/build/index.js.map +1 -1
  52. package/build/setup/inject.d.ts +4 -4
  53. package/build/setup/inject.js +6 -6
  54. package/build/setup/inject.js.map +1 -1
  55. package/build/setup/templates.d.ts +9 -7
  56. package/build/setup/templates.js +68 -103
  57. package/build/setup/templates.js.map +1 -1
  58. package/build/tools/artifact-approve.d.ts +8 -0
  59. package/build/tools/artifact-approve.js +94 -0
  60. package/build/tools/artifact-approve.js.map +1 -0
  61. package/build/tools/artifact-schema.d.ts +12 -0
  62. package/build/tools/artifact-schema.js +148 -0
  63. package/build/tools/artifact-schema.js.map +1 -0
  64. package/build/tools/artifact-tools.d.ts +18 -0
  65. package/build/tools/artifact-tools.js +465 -0
  66. package/build/tools/artifact-tools.js.map +1 -0
  67. package/build/tools/{report-dispatch.d.ts → dispatch-report.d.ts} +7 -3
  68. package/build/tools/dispatch-report.js +261 -0
  69. package/build/tools/dispatch-report.js.map +1 -0
  70. package/build/tools/engine-helpers.d.ts +41 -0
  71. package/build/tools/engine-helpers.js +182 -0
  72. package/build/tools/engine-helpers.js.map +1 -0
  73. package/build/tools/get-project-status.d.ts +6 -4
  74. package/build/tools/get-project-status.js +308 -246
  75. package/build/tools/get-project-status.js.map +1 -1
  76. package/build/tools/get-role-prompt.d.ts +1 -1
  77. package/build/tools/get-role-prompt.js +7 -41
  78. package/build/tools/get-role-prompt.js.map +1 -1
  79. package/build/tools/issue-tools.d.ts +10 -0
  80. package/build/tools/issue-tools.js +169 -0
  81. package/build/tools/issue-tools.js.map +1 -0
  82. package/build/tools/iteration-start.d.ts +7 -4
  83. package/build/tools/iteration-start.js +51 -20
  84. package/build/tools/iteration-start.js.map +1 -1
  85. package/build/tools/loop-done.d.ts +11 -0
  86. package/build/tools/loop-done.js +109 -0
  87. package/build/tools/loop-done.js.map +1 -0
  88. package/build/tools/patch-start.d.ts +16 -0
  89. package/build/tools/patch-start.js +122 -0
  90. package/build/tools/patch-start.js.map +1 -0
  91. package/build/tools/project-init.d.ts +5 -5
  92. package/build/tools/project-init.js +47 -18
  93. package/build/tools/project-init.js.map +1 -1
  94. package/build/tools/role-dispatch.d.ts +55 -0
  95. package/build/tools/role-dispatch.js +508 -0
  96. package/build/tools/role-dispatch.js.map +1 -0
  97. package/build/tools/utils.d.ts +40 -0
  98. package/build/tools/utils.js +97 -0
  99. package/build/tools/utils.js.map +1 -0
  100. package/package.json +1 -1
  101. package/{build/hooks/claude-code.js → workflows/dev/hooks/claude.js} +34 -23
  102. package/{build → workflows/dev}/hooks/content.js +27 -18
  103. package/workflows/dev/hooks/index.js +52 -0
  104. package/{build → workflows/dev}/hooks/openclaw.js +31 -20
  105. package/{build → workflows/dev}/hooks/opencode.js +31 -20
  106. package/workflows/dev/roles/architect.md +68 -28
  107. package/workflows/dev/roles/coordinator.md +103 -0
  108. package/workflows/dev/roles/developer.md +5 -5
  109. package/workflows/dev/roles/tester.md +19 -19
  110. package/workflows/dev/schemas/api-contract.json +42 -0
  111. package/workflows/dev/schemas/api-design.json +30 -13
  112. package/workflows/dev/schemas/data-model.json +20 -7
  113. package/workflows/dev/schemas/prd.completeness-check.json +6 -5
  114. package/workflows/dev/schemas/prd.draft.json +13 -5
  115. package/workflows/dev/schemas/prd.final.json +34 -11
  116. package/workflows/dev/schemas/prd.json +29 -11
  117. package/workflows/dev/schemas/prd.requirements.json +6 -5
  118. package/workflows/dev/schemas/prototype.json +6 -2
  119. package/workflows/dev/schemas/task-breakdown.coarse.json +4 -3
  120. package/workflows/dev/schemas/task-breakdown.dependencies.json +5 -4
  121. package/workflows/dev/schemas/task-breakdown.detailed.json +8 -3
  122. package/workflows/dev/schemas/task-breakdown.final.json +8 -3
  123. package/workflows/dev/schemas/task-breakdown.json +8 -3
  124. package/workflows/dev/schemas/tech-design.analysis.json +6 -5
  125. package/workflows/dev/schemas/tech-design.draft.json +14 -5
  126. package/workflows/dev/schemas/tech-design.final.json +39 -13
  127. package/workflows/dev/schemas/tech-design.json +34 -13
  128. package/workflows/dev/schemas/tech-design.research.json +21 -0
  129. package/workflows/dev/schemas/test-plan.json +17 -7
  130. package/workflows/dev/schemas/test-report.json +26 -9
  131. package/workflows/dev/schemas/user-stories.json +7 -3
  132. package/workflows/dev/tools/index.js +23 -0
  133. package/workflows/dev/workflow.json +234 -101
  134. package/build/core/docs.d.ts +0 -32
  135. package/build/core/docs.js +0 -91
  136. package/build/core/docs.js.map +0 -1
  137. package/build/core/workflow.d.ts +0 -33
  138. package/build/core/workflow.js +0 -140
  139. package/build/core/workflow.js.map +0 -1
  140. package/build/hooks/claude-code.d.ts +0 -20
  141. package/build/hooks/claude-code.js.map +0 -1
  142. package/build/hooks/content.d.ts +0 -43
  143. package/build/hooks/content.js.map +0 -1
  144. package/build/hooks/install.d.ts +0 -40
  145. package/build/hooks/install.js +0 -63
  146. package/build/hooks/install.js.map +0 -1
  147. package/build/hooks/openclaw.d.ts +0 -24
  148. package/build/hooks/openclaw.js.map +0 -1
  149. package/build/hooks/opencode.d.ts +0 -29
  150. package/build/hooks/opencode.js.map +0 -1
  151. package/build/tools/approve-doc.d.ts +0 -6
  152. package/build/tools/approve-doc.js +0 -108
  153. package/build/tools/approve-doc.js.map +0 -1
  154. package/build/tools/dispatch-role.d.ts +0 -16
  155. package/build/tools/dispatch-role.js +0 -277
  156. package/build/tools/dispatch-role.js.map +0 -1
  157. package/build/tools/doc-tools.d.ts +0 -16
  158. package/build/tools/doc-tools.js +0 -389
  159. package/build/tools/doc-tools.js.map +0 -1
  160. package/build/tools/override-tools.d.ts +0 -6
  161. package/build/tools/override-tools.js +0 -129
  162. package/build/tools/override-tools.js.map +0 -1
  163. package/build/tools/report-dispatch.js +0 -194
  164. package/build/tools/report-dispatch.js.map +0 -1
  165. package/build/tools/set-scale.d.ts +0 -6
  166. package/build/tools/set-scale.js +0 -107
  167. package/build/tools/set-scale.js.map +0 -1
  168. package/build/tools/setup-project.d.ts +0 -8
  169. package/build/tools/setup-project.js +0 -116
  170. package/build/tools/setup-project.js.map +0 -1
  171. package/build/tools/update-phase.d.ts +0 -12
  172. package/build/tools/update-phase.js +0 -159
  173. package/build/tools/update-phase.js.map +0 -1
  174. package/workflows/dev/roles/pm.md +0 -99
  175. package/workflows/dev/schemas/deploy.json +0 -20
  176. package/workflows/dev/schemas/fsd.json +0 -25
  177. package/workflows/dev/schemas/project-plan.json +0 -20
  178. package/workflows/dev/schemas/retrospective.json +0 -20
  179. package/workflows/dev/schemas/risk-assessment.json +0 -15
  180. package/workflows/dev/schemas/tech-design.api-contract.json +0 -20
@@ -1,125 +1,93 @@
1
1
  /**
2
- * Project state management — manages <data_dir>/<project_name>/iter-<n>/state.json
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 { getIterationDir } from './registry.js';
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(getIterationDir(projectName, iteration), STATE_FILE);
11
+ function statePath(projectName, iteration, contextDir) {
12
+ return join(contextDir, STATE_FILE);
19
13
  }
20
14
  /**
21
- * Initialize a new project state file for a specific iteration.
22
- * Note: directory creation is handled by registry.startIteration().
23
- * This only writes the state.json.
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 initProjectState(projectName, projectDir, workflow, iteration) {
22
+ export async function initWorkflowState(projectName, projectDir, workflow, iteration, type = 'iteration', contextDir) {
26
23
  const now = new Date().toISOString();
27
- const phases = workflow.definition.phases;
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
- scale: null,
35
- currentPhase: firstPhaseId,
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 project state for a specific iteration.
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 project state to disk for a specific iteration.
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 phase's status.
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 updatePhaseStatus(projectName, iteration, phaseId, status, blockedReason) {
67
- const state = await readState(projectName, iteration);
68
- const phase = state.phases.find((p) => p.id === phaseId);
69
- if (!phase) {
70
- throw new Error(`Phase "${phaseId}" not found in project state`);
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
- // If completing a phase, auto-advance currentPhase to the next pending one
89
- if (status === 'completed') {
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
- * Check if a project state file exists for a specific iteration.
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 projectStateExists(projectName, iteration) {
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
@@ -1 +1 @@
1
- {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/core/state.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,34 @@
1
1
  /**
2
- * Step state management — manages <data_dir>/<project_name>/iter-<n>/steps.json
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
6
  */
7
- import type { DocStepState } from './types.js';
7
+ import type { ArtifactStepState } from './types.js';
8
8
  /**
9
- * Read the steps state for a project iteration.
9
+ * Read the steps state for a project context.
10
10
  */
11
- export declare function readSteps(projectName: string, iteration: number): Promise<Record<string, DocStepState>>;
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 document.
13
+ * Get the step state for a specific artifact.
14
14
  */
15
- export declare function getDocStepState(projectName: string, iteration: number, docId: string): Promise<DocStepState | null>;
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 a document.
17
+ * Get the set of completed step IDs for an artifact.
18
18
  */
19
- export declare function getCompletedStepIds(state: DocStepState | null): Set<string>;
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 DocStepState
24
+ * @returns The updated ArtifactStepState
25
25
  */
26
- export declare function recordStepCompletion(projectName: string, iteration: number, docId: string, stepId: string, artifactPath: string, allStepIds: string[]): Promise<DocStepState>;
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 a document as finalized (all steps completed + final doc written).
28
+ * Mark an artifact as finalized (all steps completed + final artifact written).
29
29
  */
30
- export declare function markFinalized(projectName: string, iteration: number, docId: string): Promise<DocStepState>;
30
+ export declare function markFinalized(projectName: string, iteration: number, artifactId: string, contextDir?: string): Promise<ArtifactStepState>;
31
31
  /**
32
- * Check if a document's sequential process is finalized.
32
+ * Check if an artifact's sequential process is finalized.
33
33
  */
34
- export declare function isDocFinalized(projectName: string, iteration: number, docId: string): Promise<boolean>;
34
+ export declare function isArtifactFinalized(projectName: string, iteration: number, artifactId: string, contextDir?: string): Promise<boolean>;
@@ -1,24 +1,23 @@
1
1
  /**
2
- * Step state management — manages <data_dir>/<project_name>/iter-<n>/steps.json
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
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(getIterationDir(projectName, iteration), STEPS_FILE);
10
+ function stepsPath(projectName, iteration, contextDir) {
11
+ return join(contextDir, STEPS_FILE);
13
12
  }
14
13
  /**
15
- * Read the steps state for a project iteration.
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.docs ?? {};
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, docs) {
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 = { docs };
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 document.
36
+ * Get the step state for a specific artifact.
38
37
  */
39
- export async function getDocStepState(projectName, iteration, docId) {
40
- const docs = await readSteps(projectName, iteration);
41
- 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;
42
41
  }
43
42
  /**
44
- * Get the set of completed step IDs for a document.
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 DocStepState
54
+ * @returns The updated ArtifactStepState
56
55
  */
57
- export async function recordStepCompletion(projectName, iteration, docId, stepId, artifactPath, allStepIds) {
58
- const docs = await readSteps(projectName, iteration);
59
- 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];
60
59
  if (!state) {
61
60
  state = {
62
- docId,
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
- docs[docId] = state;
89
- await writeSteps(projectName, iteration, docs);
87
+ artifacts[artifactId] = state;
88
+ await writeSteps(projectName, iteration, artifacts, contextDir);
90
89
  return state;
91
90
  }
92
91
  /**
93
- * Mark a document as finalized (all steps completed + final doc written).
92
+ * Mark an artifact as finalized (all steps completed + final artifact written).
94
93
  */
95
- export async function markFinalized(projectName, iteration, docId) {
96
- const docs = await readSteps(projectName, iteration);
97
- 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];
98
97
  if (!state) {
99
- throw new Error(`No step state found for document "${docId}"`);
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, docs);
102
+ await writeSteps(projectName, iteration, artifacts, contextDir);
104
103
  return state;
105
104
  }
106
105
  /**
107
- * Check if a document's sequential process is finalized.
106
+ * Check if an artifact's sequential process is finalized.
108
107
  */
109
- export async function isDocFinalized(projectName, iteration, docId) {
110
- const state = await getDocStepState(projectName, iteration, docId);
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
@@ -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":"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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;