@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
|
@@ -1,62 +1,55 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Override configuration —
|
|
2
|
+
* Override configuration — two-layer system: project overrides > workflow defaults.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Project-level overrides are stored in:
|
|
5
|
+
* <data_dir>/<project_name>/overrides.json
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Workflow defaults come from the workflow definition (artifactDefinitions, roles).
|
|
8
|
+
* The override system lets users customize per-project settings without modifying
|
|
9
|
+
* the workflow definition itself.
|
|
9
10
|
*/
|
|
10
|
-
import type { CapabilityOverride,
|
|
11
|
-
/**
|
|
12
|
-
* Read global overrides (<data_dir>/overrides.json).
|
|
13
|
-
*/
|
|
14
|
-
export declare function readGlobalOverrides(): Promise<OverrideConfig>;
|
|
11
|
+
import type { CapabilityOverride, ArtifactDefinition, OverrideConfig } from './types.js';
|
|
15
12
|
/**
|
|
16
13
|
* Read project-level overrides (<data_dir>/<project_name>/overrides.json).
|
|
17
14
|
*/
|
|
18
15
|
export declare function readProjectOverrides(projectName: string): Promise<OverrideConfig>;
|
|
19
|
-
/**
|
|
20
|
-
* Write global overrides.
|
|
21
|
-
*/
|
|
22
|
-
export declare function writeGlobalOverrides(config: OverrideConfig): Promise<void>;
|
|
23
16
|
/**
|
|
24
17
|
* Write project-level overrides.
|
|
25
18
|
*/
|
|
26
19
|
export declare function writeProjectOverrides(projectName: string, config: OverrideConfig): Promise<void>;
|
|
27
20
|
/**
|
|
28
|
-
* Get the
|
|
29
|
-
*
|
|
21
|
+
* Get the override config for a project.
|
|
22
|
+
* Returns the project-level overrides directly — no global merge.
|
|
30
23
|
*/
|
|
31
24
|
export declare function getMergedOverrides(projectName: string): Promise<OverrideConfig>;
|
|
32
25
|
/**
|
|
33
|
-
* Resolve whether a specific
|
|
26
|
+
* Resolve whether a specific artifact requires review.
|
|
34
27
|
*
|
|
35
|
-
* Priority: project override >
|
|
28
|
+
* Priority: project override > workflow default
|
|
36
29
|
*/
|
|
37
|
-
export declare function
|
|
30
|
+
export declare function resolveArtifactReview(artifactId: string, artifactDef: ArtifactDefinition, overrides: OverrideConfig): boolean;
|
|
38
31
|
/**
|
|
39
32
|
* Resolve the capability override for a specific role + capability.
|
|
40
33
|
* Returns null if no override is configured.
|
|
41
34
|
*/
|
|
42
35
|
export declare function resolveCapabilityOverride(roleId: string, capabilityId: string, overrides: OverrideConfig): CapabilityOverride | null;
|
|
43
36
|
/**
|
|
44
|
-
* Set a single role capability override at project
|
|
37
|
+
* Set a single role capability override at project level.
|
|
45
38
|
*/
|
|
46
|
-
export declare function setCapabilityOverride(
|
|
39
|
+
export declare function setCapabilityOverride(projectName: string, roleId: string, capabilityId: string, override: CapabilityOverride): Promise<void>;
|
|
47
40
|
/**
|
|
48
|
-
* Set review override for a specific
|
|
41
|
+
* Set review override for a specific artifact at project level.
|
|
49
42
|
*/
|
|
50
|
-
export declare function setReviewOverride(
|
|
43
|
+
export declare function setReviewOverride(projectName: string, artifactId: string, enabled: boolean): Promise<void>;
|
|
51
44
|
/**
|
|
52
45
|
* Resolve the agent/model configuration for a role.
|
|
53
|
-
* Returns { agent, model } from the
|
|
46
|
+
* Returns { agent, model } from the overrides, or undefined fields if not set.
|
|
54
47
|
*/
|
|
55
48
|
export declare function resolveRoleConfig(roleId: string, overrides: OverrideConfig): {
|
|
56
49
|
agent?: string;
|
|
57
50
|
model?: string;
|
|
58
51
|
};
|
|
59
52
|
/**
|
|
60
|
-
* Set agent/model config for a role at project
|
|
53
|
+
* Set agent/model config for a role at project level.
|
|
61
54
|
*/
|
|
62
|
-
export declare function setRoleAgentConfig(
|
|
55
|
+
export declare function setRoleAgentConfig(projectName: string, roleId: string, agent?: string, model?: string): Promise<void>;
|
package/build/core/overrides.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Override configuration —
|
|
2
|
+
* Override configuration — two-layer system: project overrides > workflow defaults.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Project-level overrides are stored in:
|
|
5
|
+
* <data_dir>/<project_name>/overrides.json
|
|
5
6
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
7
|
+
* Workflow defaults come from the workflow definition (artifactDefinitions, roles).
|
|
8
|
+
* The override system lets users customize per-project settings without modifying
|
|
9
|
+
* the workflow definition itself.
|
|
9
10
|
*/
|
|
10
11
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
11
12
|
import { join, dirname } from 'node:path';
|
|
12
|
-
import {
|
|
13
|
+
import { getProjectDataDir } from './registry.js';
|
|
13
14
|
const OVERRIDES_FILE = 'overrides.json';
|
|
14
15
|
/**
|
|
15
16
|
* Read an override config file. Returns empty config if file doesn't exist.
|
|
@@ -23,12 +24,6 @@ async function readOverrideFile(filePath) {
|
|
|
23
24
|
return {};
|
|
24
25
|
}
|
|
25
26
|
}
|
|
26
|
-
/**
|
|
27
|
-
* Read global overrides (<data_dir>/overrides.json).
|
|
28
|
-
*/
|
|
29
|
-
export async function readGlobalOverrides() {
|
|
30
|
-
return readOverrideFile(join(getGlobalDir(), OVERRIDES_FILE));
|
|
31
|
-
}
|
|
32
27
|
/**
|
|
33
28
|
* Read project-level overrides (<data_dir>/<project_name>/overrides.json).
|
|
34
29
|
*/
|
|
@@ -42,12 +37,6 @@ async function writeOverrideFile(filePath, config) {
|
|
|
42
37
|
await mkdir(dirname(filePath), { recursive: true });
|
|
43
38
|
await writeFile(filePath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
44
39
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Write global overrides.
|
|
47
|
-
*/
|
|
48
|
-
export async function writeGlobalOverrides(config) {
|
|
49
|
-
await writeOverrideFile(join(getGlobalDir(), OVERRIDES_FILE), config);
|
|
50
|
-
}
|
|
51
40
|
/**
|
|
52
41
|
* Write project-level overrides.
|
|
53
42
|
*/
|
|
@@ -55,63 +44,23 @@ export async function writeProjectOverrides(projectName, config) {
|
|
|
55
44
|
await writeOverrideFile(join(getProjectDataDir(projectName), OVERRIDES_FILE), config);
|
|
56
45
|
}
|
|
57
46
|
/**
|
|
58
|
-
*
|
|
59
|
-
|
|
60
|
-
function mergeConfigs(lower, higher) {
|
|
61
|
-
const merged = {};
|
|
62
|
-
// Merge review: higher wins entirely if present
|
|
63
|
-
if (higher.review !== undefined) {
|
|
64
|
-
merged.review = higher.review;
|
|
65
|
-
}
|
|
66
|
-
else if (lower.review !== undefined) {
|
|
67
|
-
merged.review = lower.review;
|
|
68
|
-
}
|
|
69
|
-
// Merge roles: deep merge per role (agent, model, capabilities)
|
|
70
|
-
const lowerRoles = lower.roles ?? {};
|
|
71
|
-
const higherRoles = higher.roles ?? {};
|
|
72
|
-
const allRoleIds = new Set([...Object.keys(lowerRoles), ...Object.keys(higherRoles)]);
|
|
73
|
-
if (allRoleIds.size > 0) {
|
|
74
|
-
merged.roles = {};
|
|
75
|
-
for (const roleId of allRoleIds) {
|
|
76
|
-
const lo = lowerRoles[roleId] ?? {};
|
|
77
|
-
const hi = higherRoles[roleId] ?? {};
|
|
78
|
-
merged.roles[roleId] = {
|
|
79
|
-
...lo,
|
|
80
|
-
...hi,
|
|
81
|
-
// Deep merge capabilities
|
|
82
|
-
capabilities: {
|
|
83
|
-
...(lo.capabilities ?? {}),
|
|
84
|
-
...(hi.capabilities ?? {}),
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
// Clean up empty capabilities
|
|
88
|
-
if (Object.keys(merged.roles[roleId].capabilities).length === 0) {
|
|
89
|
-
delete merged.roles[roleId].capabilities;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return merged;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Get the fully merged override config for a project.
|
|
97
|
-
* Priority: project > global
|
|
47
|
+
* Get the override config for a project.
|
|
48
|
+
* Returns the project-level overrides directly — no global merge.
|
|
98
49
|
*/
|
|
99
50
|
export async function getMergedOverrides(projectName) {
|
|
100
|
-
|
|
101
|
-
const project = await readProjectOverrides(projectName);
|
|
102
|
-
return mergeConfigs(global, project);
|
|
51
|
+
return readProjectOverrides(projectName);
|
|
103
52
|
}
|
|
104
53
|
/**
|
|
105
|
-
* Resolve whether a specific
|
|
54
|
+
* Resolve whether a specific artifact requires review.
|
|
106
55
|
*
|
|
107
|
-
* Priority: project override >
|
|
56
|
+
* Priority: project override > workflow default
|
|
108
57
|
*/
|
|
109
|
-
export function
|
|
58
|
+
export function resolveArtifactReview(artifactId, artifactDef, overrides) {
|
|
110
59
|
const review = overrides.review;
|
|
111
|
-
// Override is a per-
|
|
60
|
+
// Override is a per-artifact record
|
|
112
61
|
if (typeof review === 'object' && review !== null) {
|
|
113
|
-
if (
|
|
114
|
-
return review[
|
|
62
|
+
if (artifactId in review) {
|
|
63
|
+
return review[artifactId];
|
|
115
64
|
}
|
|
116
65
|
// Not mentioned in override, fall through to workflow default
|
|
117
66
|
}
|
|
@@ -120,7 +69,7 @@ export function resolveDocReview(docId, docDef, overrides) {
|
|
|
120
69
|
return review;
|
|
121
70
|
}
|
|
122
71
|
// No override — use workflow default
|
|
123
|
-
return
|
|
72
|
+
return artifactDef.review ?? false;
|
|
124
73
|
}
|
|
125
74
|
/**
|
|
126
75
|
* Resolve the capability override for a specific role + capability.
|
|
@@ -130,10 +79,10 @@ export function resolveCapabilityOverride(roleId, capabilityId, overrides) {
|
|
|
130
79
|
return overrides.roles?.[roleId]?.capabilities?.[capabilityId] ?? null;
|
|
131
80
|
}
|
|
132
81
|
/**
|
|
133
|
-
* Set a single role capability override at project
|
|
82
|
+
* Set a single role capability override at project level.
|
|
134
83
|
*/
|
|
135
|
-
export async function setCapabilityOverride(
|
|
136
|
-
const config =
|
|
84
|
+
export async function setCapabilityOverride(projectName, roleId, capabilityId, override) {
|
|
85
|
+
const config = await readProjectOverrides(projectName);
|
|
137
86
|
if (!config.roles) {
|
|
138
87
|
config.roles = {};
|
|
139
88
|
}
|
|
@@ -144,33 +93,23 @@ export async function setCapabilityOverride(scope, projectName, roleId, capabili
|
|
|
144
93
|
config.roles[roleId].capabilities = {};
|
|
145
94
|
}
|
|
146
95
|
config.roles[roleId].capabilities[capabilityId] = override;
|
|
147
|
-
|
|
148
|
-
await writeGlobalOverrides(config);
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
await writeProjectOverrides(projectName, config);
|
|
152
|
-
}
|
|
96
|
+
await writeProjectOverrides(projectName, config);
|
|
153
97
|
}
|
|
154
98
|
/**
|
|
155
|
-
* Set review override for a specific
|
|
99
|
+
* Set review override for a specific artifact at project level.
|
|
156
100
|
*/
|
|
157
|
-
export async function setReviewOverride(
|
|
158
|
-
const config =
|
|
159
|
-
// Ensure review is a per-
|
|
101
|
+
export async function setReviewOverride(projectName, artifactId, enabled) {
|
|
102
|
+
const config = await readProjectOverrides(projectName);
|
|
103
|
+
// Ensure review is a per-artifact record
|
|
160
104
|
if (typeof config.review !== 'object' || config.review === null) {
|
|
161
105
|
config.review = {};
|
|
162
106
|
}
|
|
163
|
-
config.review[
|
|
164
|
-
|
|
165
|
-
await writeGlobalOverrides(config);
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
await writeProjectOverrides(projectName, config);
|
|
169
|
-
}
|
|
107
|
+
config.review[artifactId] = enabled;
|
|
108
|
+
await writeProjectOverrides(projectName, config);
|
|
170
109
|
}
|
|
171
110
|
/**
|
|
172
111
|
* Resolve the agent/model configuration for a role.
|
|
173
|
-
* Returns { agent, model } from the
|
|
112
|
+
* Returns { agent, model } from the overrides, or undefined fields if not set.
|
|
174
113
|
*/
|
|
175
114
|
export function resolveRoleConfig(roleId, overrides) {
|
|
176
115
|
const role = overrides.roles?.[roleId];
|
|
@@ -182,10 +121,10 @@ export function resolveRoleConfig(roleId, overrides) {
|
|
|
182
121
|
};
|
|
183
122
|
}
|
|
184
123
|
/**
|
|
185
|
-
* Set agent/model config for a role at project
|
|
124
|
+
* Set agent/model config for a role at project level.
|
|
186
125
|
*/
|
|
187
|
-
export async function setRoleAgentConfig(
|
|
188
|
-
const config =
|
|
126
|
+
export async function setRoleAgentConfig(projectName, roleId, agent, model) {
|
|
127
|
+
const config = await readProjectOverrides(projectName);
|
|
189
128
|
if (!config.roles) {
|
|
190
129
|
config.roles = {};
|
|
191
130
|
}
|
|
@@ -196,11 +135,6 @@ export async function setRoleAgentConfig(scope, projectName, roleId, agent, mode
|
|
|
196
135
|
config.roles[roleId].agent = agent;
|
|
197
136
|
if (model)
|
|
198
137
|
config.roles[roleId].model = model;
|
|
199
|
-
|
|
200
|
-
await writeGlobalOverrides(config);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
await writeProjectOverrides(projectName, config);
|
|
204
|
-
}
|
|
138
|
+
await writeProjectOverrides(projectName, config);
|
|
205
139
|
}
|
|
206
140
|
//# sourceMappingURL=overrides.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/core/overrides.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"overrides.js","sourceRoot":"","sources":["../../src/core/overrides.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin system — discovery, loading, and registration of workflow plugins.
|
|
3
|
+
*
|
|
4
|
+
* A workflow plugin is a directory containing:
|
|
5
|
+
* workflow.json — Node tree definition + artifact definitions
|
|
6
|
+
* roles/*.md — Role prompts with YAML frontmatter
|
|
7
|
+
* schemas/*.json — Artifact schemas for validation
|
|
8
|
+
* hooks/index.js — Optional, exports createHooks()
|
|
9
|
+
* tools/index.js — Optional, exports registerActions()
|
|
10
|
+
*
|
|
11
|
+
* Loading flow:
|
|
12
|
+
* 1. Read workflow.json → parse node tree + artifact definitions
|
|
13
|
+
* 2. Validate via workflow-validator
|
|
14
|
+
* 3. Scan roles/ → parse role files
|
|
15
|
+
* 4. Scan schemas/ → load artifact schemas
|
|
16
|
+
* 5. If tools/index.js exists → dynamic import, register actions
|
|
17
|
+
* 6. If hooks/index.js exists → record hook creator (not executed yet)
|
|
18
|
+
*/
|
|
19
|
+
import type { WorkflowPlugin, PluginEntry } from './types.js';
|
|
20
|
+
export declare class PluginLoadError extends Error {
|
|
21
|
+
constructor(pluginPath: string, reason: string);
|
|
22
|
+
}
|
|
23
|
+
export declare class PluginValidationError extends Error {
|
|
24
|
+
errors: {
|
|
25
|
+
type: string;
|
|
26
|
+
message: string;
|
|
27
|
+
nodeId?: string;
|
|
28
|
+
}[];
|
|
29
|
+
constructor(pluginPath: string, errors: {
|
|
30
|
+
type: string;
|
|
31
|
+
message: string;
|
|
32
|
+
nodeId?: string;
|
|
33
|
+
}[]);
|
|
34
|
+
}
|
|
35
|
+
export declare class WorkflowNotFoundError extends Error {
|
|
36
|
+
constructor(name: string, searched: string[]);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Load a workflow plugin from a directory.
|
|
40
|
+
*
|
|
41
|
+
* Full loading flow:
|
|
42
|
+
* 1. Read workflow.json → parse definition + artifact definitions
|
|
43
|
+
* 2. Validate the workflow definition (static analysis)
|
|
44
|
+
* 3. Load roles from roles/
|
|
45
|
+
* 4. Load schemas from schemas/
|
|
46
|
+
* 5. Optionally load actions from tools/index.js
|
|
47
|
+
* 6. Optionally load hook creator from hooks/index.js
|
|
48
|
+
*
|
|
49
|
+
* @param pluginPath - Absolute path to the plugin directory
|
|
50
|
+
* @param config - Optional plugin configuration
|
|
51
|
+
* @param skipValidation - Skip workflow validation (for testing)
|
|
52
|
+
*/
|
|
53
|
+
export declare function loadPlugin(pluginPath: string, config?: unknown, skipValidation?: boolean): Promise<WorkflowPlugin>;
|
|
54
|
+
/**
|
|
55
|
+
* Discover registered plugins from a config.json file.
|
|
56
|
+
*
|
|
57
|
+
* Config format:
|
|
58
|
+
* ```json
|
|
59
|
+
* {
|
|
60
|
+
* "workflows": {
|
|
61
|
+
* "dev": { "path": "/path/to/dev/plugin" },
|
|
62
|
+
* "custom": { "path": "/path/to/custom", "config": { ... } }
|
|
63
|
+
* }
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function discoverPlugins(configPath: string): Promise<PluginEntry[]>;
|
|
68
|
+
/**
|
|
69
|
+
* Resolve the actual directory for a workflow name.
|
|
70
|
+
* Searches only the single workflows directory (<data_dir>/harmonia/.workflows/).
|
|
71
|
+
*/
|
|
72
|
+
export declare function resolveWorkflowDir(workflowsDir: string, name: string): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* Load a single workflow by name.
|
|
75
|
+
* Delegates to loadPlugin() internally.
|
|
76
|
+
*
|
|
77
|
+
* @param workflowsDir - Workflows directory (<data_dir>/harmonia/.workflows)
|
|
78
|
+
* @param name - Workflow name (directory name)
|
|
79
|
+
*/
|
|
80
|
+
export declare function loadWorkflow(workflowsDir: string, name: string): Promise<WorkflowPlugin>;
|
|
81
|
+
/**
|
|
82
|
+
* List all available workflow names from the workflows directory.
|
|
83
|
+
*
|
|
84
|
+
* @param workflowsDir - Workflows directory (<data_dir>/harmonia/.workflows)
|
|
85
|
+
*/
|
|
86
|
+
export declare function listWorkflows(workflowsDir: string): Promise<string[]>;
|