@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/schema.d.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Artifact schema loader and validator.
|
|
3
3
|
*
|
|
4
4
|
* Loads schema definitions from the resolved workflow directory's schemas/ subdirectory
|
|
5
|
-
* and validates
|
|
5
|
+
* and validates artifact content against them before writing.
|
|
6
6
|
*/
|
|
7
|
-
import type {
|
|
7
|
+
import type { ArtifactSchema } from './types.js';
|
|
8
8
|
/**
|
|
9
|
-
* Load
|
|
10
|
-
* Returns undefined if no schema file exists for this
|
|
9
|
+
* Load an artifact schema from the workflow's schemas directory.
|
|
10
|
+
* Returns undefined if no schema file exists for this artifact_id.
|
|
11
11
|
*
|
|
12
12
|
* For step schemas, pass a composite id like "prd.requirements".
|
|
13
13
|
*/
|
|
14
|
-
export declare function
|
|
15
|
-
export interface
|
|
14
|
+
export declare function loadArtifactSchema(workflowsDir: string, workflowName: string, artifactId: string): Promise<ArtifactSchema | undefined>;
|
|
15
|
+
export interface ArtifactValidationError {
|
|
16
16
|
/** Error type */
|
|
17
17
|
type: 'missing_section' | 'missing_html_tag' | 'content_too_short' | 'empty_content' | 'missing_json_field' | 'invalid_json' | 'wrong_json_type' | 'json_array_too_short';
|
|
18
18
|
/** Human-readable message */
|
|
@@ -20,19 +20,47 @@ export interface ValidationError {
|
|
|
20
20
|
}
|
|
21
21
|
export interface ValidationResult {
|
|
22
22
|
valid: boolean;
|
|
23
|
-
errors:
|
|
23
|
+
errors: ArtifactValidationError[];
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
* Validate
|
|
26
|
+
* Validate artifact content against a schema.
|
|
27
27
|
*
|
|
28
|
-
* @param content -
|
|
28
|
+
* @param content - Artifact content (markdown, HTML, or JSON)
|
|
29
29
|
* @param schema - Schema definition
|
|
30
|
-
* @param
|
|
31
|
-
* @param
|
|
32
|
-
* @param isJson - Whether the document is JSON format (for step artifacts)
|
|
30
|
+
* @param isHtml - Whether the artifact is HTML format
|
|
31
|
+
* @param isJson - Whether the artifact is JSON format (for step artifacts)
|
|
33
32
|
*/
|
|
34
|
-
export declare function
|
|
33
|
+
export declare function validateArtifact(content: string, schema: ArtifactSchema, isHtml?: boolean, isJson?: boolean): ValidationResult;
|
|
34
|
+
/**
|
|
35
|
+
* Step schema entry for formatSchemaGuidance.
|
|
36
|
+
* Each entry pairs a step definition with its loaded schema (if any).
|
|
37
|
+
*/
|
|
38
|
+
export interface StepSchemaEntry {
|
|
39
|
+
step: {
|
|
40
|
+
id: string;
|
|
41
|
+
name: string;
|
|
42
|
+
format: 'json' | 'md';
|
|
43
|
+
description: string;
|
|
44
|
+
};
|
|
45
|
+
schema: ArtifactSchema | undefined;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Format an artifact schema into human-readable writing guidance.
|
|
49
|
+
*
|
|
50
|
+
* Used by:
|
|
51
|
+
* - role_dispatch: inject Artifact Requirements into the dispatch data package
|
|
52
|
+
* - artifact_schema tool: return guidance on demand for coordinator
|
|
53
|
+
*
|
|
54
|
+
* @param artifactId Artifact ID (e.g. "prd", "tech-design")
|
|
55
|
+
* @param artifactDef Artifact definition from workflow.json
|
|
56
|
+
* @param schema Main artifact schema (may be undefined if no schema file exists)
|
|
57
|
+
* @param stepSchemas Step schemas (only relevant when artifact has steps)
|
|
58
|
+
*/
|
|
59
|
+
export declare function formatSchemaGuidance(artifactId: string, artifactDef: {
|
|
60
|
+
name: string;
|
|
61
|
+
format?: 'md' | 'html' | 'json';
|
|
62
|
+
}, schema: ArtifactSchema | undefined, stepSchemas?: StepSchemaEntry[]): string;
|
|
35
63
|
/**
|
|
36
64
|
* Format validation errors into a human-readable string for tool response.
|
|
37
65
|
*/
|
|
38
|
-
export declare function formatValidationErrors(errors:
|
|
66
|
+
export declare function formatValidationErrors(errors: ArtifactValidationError[]): string;
|
package/build/core/schema.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Artifact schema loader and validator.
|
|
3
3
|
*
|
|
4
4
|
* Loads schema definitions from the resolved workflow directory's schemas/ subdirectory
|
|
5
|
-
* and validates
|
|
5
|
+
* and validates artifact content against them before writing.
|
|
6
6
|
*/
|
|
7
7
|
import { readFile } from 'node:fs/promises';
|
|
8
8
|
import { join } from 'node:path';
|
|
9
|
-
import { resolveWorkflowDir } from './
|
|
9
|
+
import { resolveWorkflowDir } from './plugin.js';
|
|
10
10
|
// ─── Schema Loading ───
|
|
11
11
|
/**
|
|
12
|
-
* Load
|
|
13
|
-
* Returns undefined if no schema file exists for this
|
|
12
|
+
* Load an artifact schema from the workflow's schemas directory.
|
|
13
|
+
* Returns undefined if no schema file exists for this artifact_id.
|
|
14
14
|
*
|
|
15
15
|
* For step schemas, pass a composite id like "prd.requirements".
|
|
16
16
|
*/
|
|
17
|
-
export async function
|
|
18
|
-
const workflowDir = await resolveWorkflowDir(
|
|
19
|
-
const schemaPath = join(workflowDir, 'schemas', `${
|
|
17
|
+
export async function loadArtifactSchema(workflowsDir, workflowName, artifactId) {
|
|
18
|
+
const workflowDir = await resolveWorkflowDir(workflowsDir, workflowName);
|
|
19
|
+
const schemaPath = join(workflowDir, 'schemas', `${artifactId}.json`);
|
|
20
20
|
try {
|
|
21
21
|
const raw = await readFile(schemaPath, 'utf-8');
|
|
22
22
|
return JSON.parse(raw);
|
|
@@ -69,15 +69,14 @@ function sectionPresent(section, headings) {
|
|
|
69
69
|
return false;
|
|
70
70
|
}
|
|
71
71
|
/**
|
|
72
|
-
* Validate
|
|
72
|
+
* Validate artifact content against a schema.
|
|
73
73
|
*
|
|
74
|
-
* @param content -
|
|
74
|
+
* @param content - Artifact content (markdown, HTML, or JSON)
|
|
75
75
|
* @param schema - Schema definition
|
|
76
|
-
* @param
|
|
77
|
-
* @param
|
|
78
|
-
* @param isJson - Whether the document is JSON format (for step artifacts)
|
|
76
|
+
* @param isHtml - Whether the artifact is HTML format
|
|
77
|
+
* @param isJson - Whether the artifact is JSON format (for step artifacts)
|
|
79
78
|
*/
|
|
80
|
-
export function
|
|
79
|
+
export function validateArtifact(content, schema, isHtml = false, isJson = false) {
|
|
81
80
|
const errors = [];
|
|
82
81
|
// Empty content check
|
|
83
82
|
const trimmed = content.trim();
|
|
@@ -98,9 +97,7 @@ export function validateDoc(content, schema, scale, isHtml = false, isJson = fal
|
|
|
98
97
|
if (schema.sections && !isHtml && !isJson) {
|
|
99
98
|
const headings = extractHeadings(content);
|
|
100
99
|
for (const section of schema.sections) {
|
|
101
|
-
|
|
102
|
-
const isRequired = scale !== null ? section.required[scale] : false;
|
|
103
|
-
if (isRequired && !sectionPresent(section, headings)) {
|
|
100
|
+
if (section.required && !sectionPresent(section, headings)) {
|
|
104
101
|
const aliasList = section.aliases?.length ? `(或: ${section.aliases.join(', ')})` : '';
|
|
105
102
|
errors.push({
|
|
106
103
|
type: 'missing_section',
|
|
@@ -136,9 +133,7 @@ export function validateDoc(content, schema, scale, isHtml = false, isJson = fal
|
|
|
136
133
|
}
|
|
137
134
|
if (parsed) {
|
|
138
135
|
for (const fieldDef of schema.jsonFields) {
|
|
139
|
-
|
|
140
|
-
const isRequired = scale !== null ? fieldDef.required[scale] : false;
|
|
141
|
-
if (!isRequired)
|
|
136
|
+
if (!fieldDef.required)
|
|
142
137
|
continue;
|
|
143
138
|
const value = parsed[fieldDef.field];
|
|
144
139
|
if (value === undefined || value === null) {
|
|
@@ -174,6 +169,115 @@ export function validateDoc(content, schema, scale, isHtml = false, isJson = fal
|
|
|
174
169
|
errors,
|
|
175
170
|
};
|
|
176
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Format an artifact schema into human-readable writing guidance.
|
|
174
|
+
*
|
|
175
|
+
* Used by:
|
|
176
|
+
* - role_dispatch: inject Artifact Requirements into the dispatch data package
|
|
177
|
+
* - artifact_schema tool: return guidance on demand for coordinator
|
|
178
|
+
*
|
|
179
|
+
* @param artifactId Artifact ID (e.g. "prd", "tech-design")
|
|
180
|
+
* @param artifactDef Artifact definition from workflow.json
|
|
181
|
+
* @param schema Main artifact schema (may be undefined if no schema file exists)
|
|
182
|
+
* @param stepSchemas Step schemas (only relevant when artifact has steps)
|
|
183
|
+
*/
|
|
184
|
+
export function formatSchemaGuidance(artifactId, artifactDef, schema, stepSchemas) {
|
|
185
|
+
const lines = [];
|
|
186
|
+
lines.push(`## 文档要求: ${artifactDef.name} (${artifactId})`);
|
|
187
|
+
lines.push('');
|
|
188
|
+
// Format
|
|
189
|
+
const format = artifactDef.format === 'html' ? 'HTML' : artifactDef.format === 'json' ? 'JSON' : 'Markdown';
|
|
190
|
+
lines.push(`格式: ${format}`);
|
|
191
|
+
// Min length
|
|
192
|
+
if (schema?.minLength) {
|
|
193
|
+
lines.push(`最小长度: ${schema.minLength} 字符`);
|
|
194
|
+
}
|
|
195
|
+
// Guidance
|
|
196
|
+
if (schema?.guidance) {
|
|
197
|
+
lines.push(`内容指引: ${schema.guidance}`);
|
|
198
|
+
}
|
|
199
|
+
// Required sections (markdown docs)
|
|
200
|
+
if (schema?.sections) {
|
|
201
|
+
const required = schema.sections.filter((s) => s.required);
|
|
202
|
+
if (required.length > 0) {
|
|
203
|
+
lines.push('');
|
|
204
|
+
lines.push('### 必需章节');
|
|
205
|
+
for (const section of required) {
|
|
206
|
+
// Strip leading ## from heading for display
|
|
207
|
+
const heading = section.heading.replace(/^#+\s*/, '');
|
|
208
|
+
lines.push(`- ${heading}`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// Required HTML tags
|
|
213
|
+
if (schema?.htmlTags && schema.htmlTags.length > 0) {
|
|
214
|
+
lines.push('');
|
|
215
|
+
lines.push('### 必需 HTML 标签');
|
|
216
|
+
for (const tag of schema.htmlTags) {
|
|
217
|
+
lines.push(`- <${tag}>`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Required JSON fields (for top-level JSON docs without steps)
|
|
221
|
+
if (schema?.jsonFields) {
|
|
222
|
+
const required = schema.jsonFields.filter((f) => f.required);
|
|
223
|
+
if (required.length > 0) {
|
|
224
|
+
lines.push('');
|
|
225
|
+
lines.push('### 必需 JSON 字段');
|
|
226
|
+
for (const field of required) {
|
|
227
|
+
let desc = `- ${field.field}`;
|
|
228
|
+
if (field.type)
|
|
229
|
+
desc += ` (${field.type})`;
|
|
230
|
+
if (field.minItems)
|
|
231
|
+
desc += `, ≥${field.minItems} 项`;
|
|
232
|
+
lines.push(desc);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Step schemas
|
|
237
|
+
if (stepSchemas && stepSchemas.length > 0) {
|
|
238
|
+
lines.push('');
|
|
239
|
+
lines.push('### 分步写入');
|
|
240
|
+
for (let i = 0; i < stepSchemas.length; i++) {
|
|
241
|
+
const { step, schema: stepSchema } = stepSchemas[i];
|
|
242
|
+
const formatLabel = step.format === 'json' ? 'JSON 格式' : 'Markdown 格式';
|
|
243
|
+
lines.push(`${i + 1}. ${step.id}(${step.name})— ${formatLabel}`);
|
|
244
|
+
if (stepSchema) {
|
|
245
|
+
// Step-level required JSON fields
|
|
246
|
+
if (stepSchema.jsonFields) {
|
|
247
|
+
const reqFields = stepSchema.jsonFields.filter((f) => f.required);
|
|
248
|
+
if (reqFields.length > 0) {
|
|
249
|
+
const fieldDescs = reqFields.map((f) => {
|
|
250
|
+
let d = f.field;
|
|
251
|
+
if (f.type)
|
|
252
|
+
d += ` (${f.type})`;
|
|
253
|
+
if (f.minItems)
|
|
254
|
+
d += `, ≥${f.minItems} 项`;
|
|
255
|
+
return d;
|
|
256
|
+
});
|
|
257
|
+
lines.push(` 必需字段: ${fieldDescs.join(', ')}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Step-level required sections
|
|
261
|
+
if (stepSchema.sections) {
|
|
262
|
+
const reqSections = stepSchema.sections.filter((s) => s.required);
|
|
263
|
+
if (reqSections.length > 0) {
|
|
264
|
+
const sectionNames = reqSections.map((s) => s.heading.replace(/^#+\s*/, ''));
|
|
265
|
+
lines.push(` 必需章节: ${sectionNames.join(', ')}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Step-level min length
|
|
269
|
+
if (stepSchema.minLength) {
|
|
270
|
+
lines.push(` 最小长度: ${stepSchema.minLength} 字符`);
|
|
271
|
+
}
|
|
272
|
+
// Step-level guidance
|
|
273
|
+
if (stepSchema.guidance) {
|
|
274
|
+
lines.push(` 指引: ${stepSchema.guidance}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return lines.join('\n');
|
|
280
|
+
}
|
|
177
281
|
/**
|
|
178
282
|
* Format validation errors into a human-readable string for tool response.
|
|
179
283
|
*/
|
package/build/core/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"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"}
|
package/build/core/state.d.ts
CHANGED
|
@@ -1,44 +1,43 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Workflow state management — manages state.json within iteration/patch directories.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* resolved from `getIterationDir(projectName, iteration)` for backward compatibility.
|
|
4
|
+
* Rewritten for the new node-based architecture. State now tracks individual
|
|
5
|
+
* workflow nodes instead of linear phases.
|
|
7
6
|
*/
|
|
8
|
-
import type { ContextType,
|
|
7
|
+
import type { ContextType, WorkflowState, WorkflowPlugin, NodeState } from './types.js';
|
|
9
8
|
/**
|
|
10
|
-
*
|
|
11
|
-
*/
|
|
12
|
-
export declare class ScaleNotSetError extends Error {
|
|
13
|
-
constructor(projectName: string);
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Initialize a new project state file.
|
|
9
|
+
* Initialize a new workflow state file.
|
|
17
10
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* scale is set to "small" automatically.
|
|
11
|
+
* Creates initial NodeState records for all nodes in the workflow definition.
|
|
12
|
+
* All nodes start as 'pending'.
|
|
21
13
|
*
|
|
22
|
-
* @param contextDir -
|
|
14
|
+
* @param contextDir - Directory containing state.json
|
|
23
15
|
*/
|
|
24
|
-
export declare function
|
|
16
|
+
export declare function initWorkflowState(projectName: string, projectDir: string, workflow: WorkflowPlugin, iteration: number, type?: ContextType, contextDir?: string): Promise<WorkflowState>;
|
|
25
17
|
/**
|
|
26
|
-
* Read the current
|
|
18
|
+
* Read the current workflow state.
|
|
27
19
|
*/
|
|
28
|
-
export declare function readState(projectName: string, iteration: number, contextDir?: string): Promise<
|
|
20
|
+
export declare function readState(projectName: string, iteration: number, contextDir?: string): Promise<WorkflowState>;
|
|
29
21
|
/**
|
|
30
|
-
* Write
|
|
22
|
+
* Write workflow state to disk.
|
|
31
23
|
*/
|
|
32
|
-
export declare function writeState(projectName: string, iteration: number, state:
|
|
24
|
+
export declare function writeState(projectName: string, iteration: number, state: WorkflowState, contextDir?: string): Promise<void>;
|
|
33
25
|
/**
|
|
34
|
-
* Update a specific
|
|
26
|
+
* Update a specific node's state. Reads current state, applies the partial update,
|
|
27
|
+
* and writes back.
|
|
28
|
+
*
|
|
29
|
+
* @returns The updated full WorkflowState
|
|
35
30
|
*/
|
|
36
|
-
export declare function
|
|
31
|
+
export declare function updateNodeState(projectName: string, iteration: number, nodeId: string, update: Partial<NodeState>, contextDir?: string): Promise<WorkflowState>;
|
|
37
32
|
/**
|
|
38
|
-
*
|
|
33
|
+
* Persist engine-computed state changes. After the workflow engine computes
|
|
34
|
+
* a new state (via computeNextAction or startWorkflow), call this to persist it.
|
|
35
|
+
*
|
|
36
|
+
* This is the preferred way to save state changes from the engine,
|
|
37
|
+
* as it replaces the entire state atomically.
|
|
39
38
|
*/
|
|
40
|
-
export declare function
|
|
39
|
+
export declare function persistState(projectName: string, iteration: number, state: WorkflowState, contextDir?: string): Promise<void>;
|
|
41
40
|
/**
|
|
42
|
-
*
|
|
41
|
+
* Check if a workflow state file exists.
|
|
43
42
|
*/
|
|
44
|
-
export declare function
|
|
43
|
+
export declare function stateExists(projectName: string, iteration: number, contextDir?: string): Promise<boolean>;
|
package/build/core/state.js
CHANGED
|
@@ -1,64 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Workflow state management — manages state.json within iteration/patch directories.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* resolved from `getIterationDir(projectName, iteration)` for backward compatibility.
|
|
4
|
+
* Rewritten for the new node-based architecture. State now tracks individual
|
|
5
|
+
* workflow nodes instead of linear phases.
|
|
7
6
|
*/
|
|
8
7
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
9
8
|
import { join, dirname } from 'node:path';
|
|
10
|
-
import {
|
|
11
|
-
/**
|
|
12
|
-
* Error thrown when a tool requires scale but it hasn't been set yet.
|
|
13
|
-
*/
|
|
14
|
-
export class ScaleNotSetError extends Error {
|
|
15
|
-
constructor(projectName) {
|
|
16
|
-
super(`项目 "${projectName}" 尚未设定 scale。请先完成 PRD 审批,然后调用 project_set_scale 设定项目规模。`);
|
|
17
|
-
this.name = 'ScaleNotSetError';
|
|
18
|
-
}
|
|
19
|
-
}
|
|
9
|
+
import { initNodeStates } from './workflow-engine.js';
|
|
20
10
|
const STATE_FILE = 'state.json';
|
|
21
|
-
function resolveDir(projectName, iteration, contextDir) {
|
|
22
|
-
return contextDir ?? getIterationDir(projectName, iteration);
|
|
23
|
-
}
|
|
24
11
|
function statePath(projectName, iteration, contextDir) {
|
|
25
|
-
return join(
|
|
12
|
+
return join(contextDir, STATE_FILE);
|
|
26
13
|
}
|
|
27
|
-
/** Phases to skip in patch mode (clarify and design) */
|
|
28
|
-
const PATCH_SKIP_PHASES = new Set(['clarify', 'design']);
|
|
29
14
|
/**
|
|
30
|
-
* Initialize a new
|
|
15
|
+
* Initialize a new workflow state file.
|
|
31
16
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* scale is set to "small" automatically.
|
|
17
|
+
* Creates initial NodeState records for all nodes in the workflow definition.
|
|
18
|
+
* All nodes start as 'pending'.
|
|
35
19
|
*
|
|
36
|
-
* @param contextDir -
|
|
20
|
+
* @param contextDir - Directory containing state.json
|
|
37
21
|
*/
|
|
38
|
-
export async function
|
|
22
|
+
export async function initWorkflowState(projectName, projectDir, workflow, iteration, type = 'iteration', contextDir) {
|
|
39
23
|
const now = new Date().toISOString();
|
|
40
|
-
const
|
|
41
|
-
const isPatch = type === 'patch';
|
|
42
|
-
// Find the first non-skipped phase
|
|
43
|
-
const firstActiveIndex = isPatch ? phases.findIndex((p) => !PATCH_SKIP_PHASES.has(p.id)) : 0;
|
|
44
|
-
const firstPhaseId = phases[firstActiveIndex]?.id ?? phases[0]?.id ?? '';
|
|
24
|
+
const nodes = initNodeStates(workflow.definition);
|
|
45
25
|
const state = {
|
|
46
26
|
projectName,
|
|
47
27
|
projectDir,
|
|
48
28
|
workflow: workflow.definition.name,
|
|
49
29
|
type,
|
|
50
30
|
iteration,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
phases: phases.map((p, i) => {
|
|
54
|
-
if (isPatch && PATCH_SKIP_PHASES.has(p.id)) {
|
|
55
|
-
return { id: p.id, status: 'skipped' };
|
|
56
|
-
}
|
|
57
|
-
if (i === firstActiveIndex) {
|
|
58
|
-
return { id: p.id, status: 'in_progress', startedAt: now };
|
|
59
|
-
}
|
|
60
|
-
return { id: p.id, status: 'pending' };
|
|
61
|
-
}),
|
|
31
|
+
activeNodeId: null,
|
|
32
|
+
nodes,
|
|
62
33
|
createdAt: now,
|
|
63
34
|
updatedAt: now,
|
|
64
35
|
};
|
|
@@ -66,14 +37,14 @@ export async function initProjectState(projectName, projectDir, workflow, iterat
|
|
|
66
37
|
return state;
|
|
67
38
|
}
|
|
68
39
|
/**
|
|
69
|
-
* Read the current
|
|
40
|
+
* Read the current workflow state.
|
|
70
41
|
*/
|
|
71
42
|
export async function readState(projectName, iteration, contextDir) {
|
|
72
43
|
const content = await readFile(statePath(projectName, iteration, contextDir), 'utf-8');
|
|
73
44
|
return JSON.parse(content);
|
|
74
45
|
}
|
|
75
46
|
/**
|
|
76
|
-
* Write
|
|
47
|
+
* Write workflow state to disk.
|
|
77
48
|
*/
|
|
78
49
|
export async function writeState(projectName, iteration, state, contextDir) {
|
|
79
50
|
const filePath = statePath(projectName, iteration, contextDir);
|
|
@@ -82,48 +53,35 @@ export async function writeState(projectName, iteration, state, contextDir) {
|
|
|
82
53
|
await writeFile(filePath, JSON.stringify(state, null, 2) + '\n', 'utf-8');
|
|
83
54
|
}
|
|
84
55
|
/**
|
|
85
|
-
* 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
|
|
86
60
|
*/
|
|
87
|
-
export async function
|
|
61
|
+
export async function updateNodeState(projectName, iteration, nodeId, update, contextDir) {
|
|
88
62
|
const state = await readState(projectName, iteration, contextDir);
|
|
89
|
-
const
|
|
90
|
-
if (!
|
|
91
|
-
throw new Error(`
|
|
92
|
-
}
|
|
93
|
-
const now = new Date().toISOString();
|
|
94
|
-
phase.status = status;
|
|
95
|
-
if (status === 'in_progress' && !phase.startedAt) {
|
|
96
|
-
phase.startedAt = now;
|
|
97
|
-
}
|
|
98
|
-
if (status === 'completed') {
|
|
99
|
-
phase.completedAt = now;
|
|
100
|
-
delete phase.blockedReason;
|
|
101
|
-
}
|
|
102
|
-
if (status === 'blocked' && blockedReason) {
|
|
103
|
-
phase.blockedReason = blockedReason;
|
|
104
|
-
}
|
|
105
|
-
// If advancing to in_progress, update currentPhase
|
|
106
|
-
if (status === 'in_progress') {
|
|
107
|
-
state.currentPhase = phaseId;
|
|
108
|
-
}
|
|
109
|
-
// If completing a phase, auto-advance currentPhase to the next pending one
|
|
110
|
-
// (skip over phases that are already "skipped")
|
|
111
|
-
if (status === 'completed') {
|
|
112
|
-
const idx = state.phases.findIndex((p) => p.id === phaseId);
|
|
113
|
-
const next = state.phases.find((p, i) => i > idx && p.status === 'pending');
|
|
114
|
-
if (next) {
|
|
115
|
-
next.status = 'in_progress';
|
|
116
|
-
next.startedAt = now;
|
|
117
|
-
state.currentPhase = next.id;
|
|
118
|
-
}
|
|
63
|
+
const existing = state.nodes[nodeId];
|
|
64
|
+
if (!existing) {
|
|
65
|
+
throw new Error(`Node "${nodeId}" not found in workflow state for project "${projectName}"`);
|
|
119
66
|
}
|
|
67
|
+
state.nodes[nodeId] = { ...existing, ...update };
|
|
120
68
|
await writeState(projectName, iteration, state, contextDir);
|
|
121
69
|
return state;
|
|
122
70
|
}
|
|
123
71
|
/**
|
|
124
|
-
*
|
|
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.
|
|
77
|
+
*/
|
|
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.
|
|
125
83
|
*/
|
|
126
|
-
export async function
|
|
84
|
+
export async function stateExists(projectName, iteration, contextDir) {
|
|
127
85
|
try {
|
|
128
86
|
await readFile(statePath(projectName, iteration, contextDir), 'utf-8');
|
|
129
87
|
return true;
|
|
@@ -132,16 +90,4 @@ export async function projectStateExists(projectName, iteration, contextDir) {
|
|
|
132
90
|
return false;
|
|
133
91
|
}
|
|
134
92
|
}
|
|
135
|
-
/**
|
|
136
|
-
* Set the project scale. Scale is immutable once set.
|
|
137
|
-
*/
|
|
138
|
-
export async function setScale(projectName, iteration, scale, contextDir) {
|
|
139
|
-
const state = await readState(projectName, iteration, contextDir);
|
|
140
|
-
if (state.scale !== null) {
|
|
141
|
-
throw new Error(`Scale 已设定为 "${state.scale}",不可更改。如需调整规模,请重新评估 PRD。`);
|
|
142
|
-
}
|
|
143
|
-
state.scale = scale;
|
|
144
|
-
await writeState(projectName, iteration, state, contextDir);
|
|
145
|
-
return state;
|
|
146
|
-
}
|
|
147
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,35 +1,34 @@
|
|
|
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
|
-
import type {
|
|
7
|
+
import type { ArtifactStepState } from './types.js';
|
|
9
8
|
/**
|
|
10
9
|
* Read the steps state for a project context.
|
|
11
10
|
*/
|
|
12
|
-
export declare function readSteps(projectName: string, iteration: number, contextDir?: string): Promise<Record<string,
|
|
11
|
+
export declare function readSteps(projectName: string, iteration: number, contextDir?: string): Promise<Record<string, ArtifactStepState>>;
|
|
13
12
|
/**
|
|
14
|
-
* Get the step state for a specific
|
|
13
|
+
* Get the step state for a specific artifact.
|
|
15
14
|
*/
|
|
16
|
-
export declare function
|
|
15
|
+
export declare function getArtifactStepState(projectName: string, iteration: number, artifactId: string, contextDir?: string): Promise<ArtifactStepState | null>;
|
|
17
16
|
/**
|
|
18
|
-
* Get the set of completed step IDs for
|
|
17
|
+
* Get the set of completed step IDs for an artifact.
|
|
19
18
|
*/
|
|
20
|
-
export declare function getCompletedStepIds(state:
|
|
19
|
+
export declare function getCompletedStepIds(state: ArtifactStepState | null): Set<string>;
|
|
21
20
|
/**
|
|
22
21
|
* Record a step as completed. If the step was already completed,
|
|
23
22
|
* it is overwritten and all subsequent steps are cleared (rollback).
|
|
24
23
|
*
|
|
25
|
-
* @returns The updated
|
|
24
|
+
* @returns The updated ArtifactStepState
|
|
26
25
|
*/
|
|
27
|
-
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>;
|
|
28
27
|
/**
|
|
29
|
-
* Mark
|
|
28
|
+
* Mark an artifact as finalized (all steps completed + final artifact written).
|
|
30
29
|
*/
|
|
31
|
-
export declare function markFinalized(projectName: string, iteration: number,
|
|
30
|
+
export declare function markFinalized(projectName: string, iteration: number, artifactId: string, contextDir?: string): Promise<ArtifactStepState>;
|
|
32
31
|
/**
|
|
33
|
-
* Check if
|
|
32
|
+
* Check if an artifact's sequential process is finalized.
|
|
34
33
|
*/
|
|
35
|
-
export declare function
|
|
34
|
+
export declare function isArtifactFinalized(projectName: string, iteration: number, artifactId: string, contextDir?: string): Promise<boolean>;
|