@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.
- 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 +18 -11
- package/build/core/dispatch.js +43 -33
- package/build/core/dispatch.js.map +1 -1
- package/build/core/issues.d.ts +37 -0
- package/build/core/issues.js +100 -0
- package/build/core/issues.js.map +1 -0
- 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 +36 -3
- package/build/core/registry.js +63 -5
- package/build/core/registry.js.map +1 -1
- package/build/core/reviews.d.ts +13 -13
- package/build/core/reviews.js +31 -32
- 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 +29 -22
- package/build/core/state.js +49 -81
- package/build/core/state.js.map +1 -1
- package/build/core/steps.d.ts +15 -15
- package/build/core/steps.js +32 -33
- 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 +417 -117
- 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 +28 -25
- 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 -103
- package/build/setup/templates.js.map +1 -1
- package/build/tools/artifact-approve.d.ts +8 -0
- package/build/tools/artifact-approve.js +94 -0
- 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/dispatch-report.js +261 -0
- 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 +308 -246
- 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/issue-tools.d.ts +10 -0
- package/build/tools/issue-tools.js +169 -0
- package/build/tools/issue-tools.js.map +1 -0
- package/build/tools/iteration-start.d.ts +7 -4
- package/build/tools/iteration-start.js +51 -20
- 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 +16 -0
- package/build/tools/patch-start.js +122 -0
- package/build/tools/patch-start.js.map +1 -0
- package/build/tools/project-init.d.ts +5 -5
- package/build/tools/project-init.js +47 -18
- 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 +40 -0
- package/build/tools/utils.js +97 -0
- package/build/tools/utils.js.map +1 -0
- 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 -32
- package/build/core/docs.js +0 -91
- 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 +0 -108
- 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 -277
- 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 -389
- 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 +0 -194
- 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 -107
- 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 -159
- 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 +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[]>;
|
|
@@ -0,0 +1,332 @@
|
|
|
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 { readFile, readdir, access } from 'node:fs/promises';
|
|
20
|
+
import { join, parse } from 'node:path';
|
|
21
|
+
import * as YAML from 'yaml';
|
|
22
|
+
import { validateWorkflow } from './workflow-validator.js';
|
|
23
|
+
// ─── Errors ───
|
|
24
|
+
export class PluginLoadError extends Error {
|
|
25
|
+
constructor(pluginPath, reason) {
|
|
26
|
+
super(`Failed to load plugin from "${pluginPath}": ${reason}`);
|
|
27
|
+
this.name = 'PluginLoadError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export class PluginValidationError extends Error {
|
|
31
|
+
errors;
|
|
32
|
+
constructor(pluginPath, errors) {
|
|
33
|
+
const summary = errors.map((e) => ` - [${e.type}] ${e.message}`).join('\n');
|
|
34
|
+
super(`Workflow validation failed for "${pluginPath}":\n${summary}`);
|
|
35
|
+
this.name = 'PluginValidationError';
|
|
36
|
+
this.errors = errors;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export class WorkflowNotFoundError extends Error {
|
|
40
|
+
constructor(name, searched) {
|
|
41
|
+
const dirs = searched.map((d) => ` - ${d}`).join('\n');
|
|
42
|
+
super(`工作流 "${name}" 不存在。已搜索:\n${dirs}`);
|
|
43
|
+
this.name = 'WorkflowNotFoundError';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// ─── Internal helpers ───
|
|
47
|
+
async function fileExists(path) {
|
|
48
|
+
try {
|
|
49
|
+
await access(path);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse a role markdown file.
|
|
58
|
+
* Format: YAML frontmatter (---\n...\n---) followed by markdown prompt.
|
|
59
|
+
*/
|
|
60
|
+
function parseRoleFile(id, content) {
|
|
61
|
+
const fmRegex = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/;
|
|
62
|
+
const match = content.match(fmRegex);
|
|
63
|
+
if (!match) {
|
|
64
|
+
return {
|
|
65
|
+
id,
|
|
66
|
+
frontmatter: { session: 'none', parallel: false },
|
|
67
|
+
prompt: content.trim(),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const yamlBlock = match[1];
|
|
71
|
+
const prompt = match[2].trim();
|
|
72
|
+
const parsed = YAML.parse(yamlBlock);
|
|
73
|
+
const fm = parsed ?? {};
|
|
74
|
+
const capabilities = Array.isArray(fm.capabilities) ? fm.capabilities : undefined;
|
|
75
|
+
const frontmatter = {
|
|
76
|
+
session: fm.session ?? 'none',
|
|
77
|
+
parallel: fm.parallel ?? false,
|
|
78
|
+
...(fm.model ? { model: fm.model } : {}),
|
|
79
|
+
...(fm.agent ? { agent: fm.agent } : {}),
|
|
80
|
+
...(capabilities ? { capabilities } : {}),
|
|
81
|
+
};
|
|
82
|
+
return { id, frontmatter, prompt };
|
|
83
|
+
}
|
|
84
|
+
// ─── Loading Steps ───
|
|
85
|
+
/**
|
|
86
|
+
* Load workflow definition from workflow.json.
|
|
87
|
+
* Also extracts artifact definitions from the 'artifacts' field.
|
|
88
|
+
*/
|
|
89
|
+
async function loadDefinition(pluginPath) {
|
|
90
|
+
const workflowJsonPath = join(pluginPath, 'workflow.json');
|
|
91
|
+
if (!(await fileExists(workflowJsonPath))) {
|
|
92
|
+
throw new PluginLoadError(pluginPath, 'workflow.json not found');
|
|
93
|
+
}
|
|
94
|
+
const content = await readFile(workflowJsonPath, 'utf-8');
|
|
95
|
+
const raw = JSON.parse(content);
|
|
96
|
+
// Extract artifact definitions (not part of WorkflowDefinition type)
|
|
97
|
+
const artifactDefinitions = {};
|
|
98
|
+
if (raw.artifacts && typeof raw.artifacts === 'object') {
|
|
99
|
+
for (const [id, def] of Object.entries(raw.artifacts)) {
|
|
100
|
+
artifactDefinitions[id] = def;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Build WorkflowDefinition (without artifacts — that's plugin-level)
|
|
104
|
+
const definition = {
|
|
105
|
+
name: raw.name,
|
|
106
|
+
description: raw.description,
|
|
107
|
+
version: raw.version,
|
|
108
|
+
author: raw.author,
|
|
109
|
+
coordinator: raw.coordinator,
|
|
110
|
+
root: raw.root,
|
|
111
|
+
floatingNodes: raw.floatingNodes,
|
|
112
|
+
};
|
|
113
|
+
return { definition, artifactDefinitions };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Load role definitions from roles/ directory.
|
|
117
|
+
*/
|
|
118
|
+
async function loadRoles(pluginPath) {
|
|
119
|
+
const rolesDir = join(pluginPath, 'roles');
|
|
120
|
+
const roles = {};
|
|
121
|
+
try {
|
|
122
|
+
const files = await readdir(rolesDir);
|
|
123
|
+
for (const file of files) {
|
|
124
|
+
if (!file.endsWith('.md'))
|
|
125
|
+
continue;
|
|
126
|
+
const roleId = parse(file).name;
|
|
127
|
+
const content = await readFile(join(rolesDir, file), 'utf-8');
|
|
128
|
+
roles[roleId] = parseRoleFile(roleId, content);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
// roles/ directory not found is normal; file parse errors should be logged
|
|
133
|
+
if (err.code !== 'ENOENT') {
|
|
134
|
+
console.warn(`[harmonia] Warning: failed to load roles from ${rolesDir}:`, err);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return roles;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Load artifact schemas from schemas/ directory.
|
|
141
|
+
* Schema files are named: <artifactId>.json or <artifactId>.<stepId>.json
|
|
142
|
+
*/
|
|
143
|
+
async function loadSchemas(pluginPath) {
|
|
144
|
+
const schemasDir = join(pluginPath, 'schemas');
|
|
145
|
+
const schemas = {};
|
|
146
|
+
try {
|
|
147
|
+
const files = await readdir(schemasDir);
|
|
148
|
+
for (const file of files) {
|
|
149
|
+
if (!file.endsWith('.json'))
|
|
150
|
+
continue;
|
|
151
|
+
const schemaId = parse(file).name; // e.g., "prd" or "prd.draft"
|
|
152
|
+
const content = await readFile(join(schemasDir, file), 'utf-8');
|
|
153
|
+
schemas[schemaId] = JSON.parse(content);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch (err) {
|
|
157
|
+
// schemas/ directory not found is normal; parse errors should be logged
|
|
158
|
+
if (err.code !== 'ENOENT') {
|
|
159
|
+
console.warn(`[harmonia] Warning: failed to load schemas from ${schemasDir}:`, err);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return schemas;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Try to load actions from tools/index.js (optional).
|
|
166
|
+
* The module should export a registerActions function.
|
|
167
|
+
*/
|
|
168
|
+
async function loadActions(pluginPath) {
|
|
169
|
+
const toolsPath = join(pluginPath, 'tools', 'index.js');
|
|
170
|
+
if (!(await fileExists(toolsPath))) {
|
|
171
|
+
return {};
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
const mod = await import(toolsPath);
|
|
175
|
+
if (typeof mod.registerActions === 'function') {
|
|
176
|
+
const actions = {};
|
|
177
|
+
mod.registerActions({
|
|
178
|
+
register: (name, handler) => {
|
|
179
|
+
actions[name] = handler;
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
return actions;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
console.warn(`[harmonia] Warning: failed to load actions from ${toolsPath}:`, err);
|
|
187
|
+
}
|
|
188
|
+
return {};
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Try to load hook creator from hooks/index.js (optional).
|
|
192
|
+
* The module should export a createHooks function.
|
|
193
|
+
*/
|
|
194
|
+
async function loadHookCreator(pluginPath) {
|
|
195
|
+
const hooksPath = join(pluginPath, 'hooks', 'index.js');
|
|
196
|
+
if (!(await fileExists(hooksPath))) {
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
const mod = await import(hooksPath);
|
|
201
|
+
if (typeof mod.createHooks === 'function') {
|
|
202
|
+
return mod.createHooks;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
console.warn(`[harmonia] Warning: failed to load hooks from ${hooksPath}:`, err);
|
|
207
|
+
}
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
// ─── Public API ───
|
|
211
|
+
/**
|
|
212
|
+
* Load a workflow plugin from a directory.
|
|
213
|
+
*
|
|
214
|
+
* Full loading flow:
|
|
215
|
+
* 1. Read workflow.json → parse definition + artifact definitions
|
|
216
|
+
* 2. Validate the workflow definition (static analysis)
|
|
217
|
+
* 3. Load roles from roles/
|
|
218
|
+
* 4. Load schemas from schemas/
|
|
219
|
+
* 5. Optionally load actions from tools/index.js
|
|
220
|
+
* 6. Optionally load hook creator from hooks/index.js
|
|
221
|
+
*
|
|
222
|
+
* @param pluginPath - Absolute path to the plugin directory
|
|
223
|
+
* @param config - Optional plugin configuration
|
|
224
|
+
* @param skipValidation - Skip workflow validation (for testing)
|
|
225
|
+
*/
|
|
226
|
+
export async function loadPlugin(pluginPath, config, skipValidation = false) {
|
|
227
|
+
// Step 1: Load definition
|
|
228
|
+
const { definition, artifactDefinitions } = await loadDefinition(pluginPath);
|
|
229
|
+
// Step 2: Load roles
|
|
230
|
+
const roles = await loadRoles(pluginPath);
|
|
231
|
+
// Step 3: Validate (using role IDs for reference checking)
|
|
232
|
+
if (!skipValidation) {
|
|
233
|
+
const roleIds = new Set(Object.keys(roles));
|
|
234
|
+
const errors = validateWorkflow(definition, roleIds, artifactDefinitions);
|
|
235
|
+
if (errors.length > 0) {
|
|
236
|
+
throw new PluginValidationError(pluginPath, errors);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Step 4: Load schemas
|
|
240
|
+
const artifactSchemas = await loadSchemas(pluginPath);
|
|
241
|
+
// Step 5: Load actions (optional)
|
|
242
|
+
const actions = await loadActions(pluginPath);
|
|
243
|
+
// Step 6: Load hook creator (optional)
|
|
244
|
+
const hooks = await loadHookCreator(pluginPath);
|
|
245
|
+
return {
|
|
246
|
+
name: definition.name,
|
|
247
|
+
definition,
|
|
248
|
+
roles,
|
|
249
|
+
artifactSchemas,
|
|
250
|
+
artifactDefinitions,
|
|
251
|
+
actions,
|
|
252
|
+
hooks,
|
|
253
|
+
config,
|
|
254
|
+
pluginDir: pluginPath,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Discover registered plugins from a config.json file.
|
|
259
|
+
*
|
|
260
|
+
* Config format:
|
|
261
|
+
* ```json
|
|
262
|
+
* {
|
|
263
|
+
* "workflows": {
|
|
264
|
+
* "dev": { "path": "/path/to/dev/plugin" },
|
|
265
|
+
* "custom": { "path": "/path/to/custom", "config": { ... } }
|
|
266
|
+
* }
|
|
267
|
+
* }
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
export async function discoverPlugins(configPath) {
|
|
271
|
+
if (!(await fileExists(configPath))) {
|
|
272
|
+
return [];
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const content = await readFile(configPath, 'utf-8');
|
|
276
|
+
const config = JSON.parse(content);
|
|
277
|
+
if (!config.workflows || typeof config.workflows !== 'object') {
|
|
278
|
+
return [];
|
|
279
|
+
}
|
|
280
|
+
return Object.entries(config.workflows).map(([name, entry]) => ({
|
|
281
|
+
name,
|
|
282
|
+
path: entry.path,
|
|
283
|
+
config: entry.config,
|
|
284
|
+
}));
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
return [];
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// ─── Workflow resolution ───
|
|
291
|
+
/**
|
|
292
|
+
* Resolve the actual directory for a workflow name.
|
|
293
|
+
* Searches only the single workflows directory (<data_dir>/harmonia/.workflows/).
|
|
294
|
+
*/
|
|
295
|
+
export async function resolveWorkflowDir(workflowsDir, name) {
|
|
296
|
+
const workflowPath = join(workflowsDir, name, 'workflow.json');
|
|
297
|
+
if (await fileExists(workflowPath)) {
|
|
298
|
+
return join(workflowsDir, name);
|
|
299
|
+
}
|
|
300
|
+
throw new WorkflowNotFoundError(name, [join(workflowsDir, name)]);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Load a single workflow by name.
|
|
304
|
+
* Delegates to loadPlugin() internally.
|
|
305
|
+
*
|
|
306
|
+
* @param workflowsDir - Workflows directory (<data_dir>/harmonia/.workflows)
|
|
307
|
+
* @param name - Workflow name (directory name)
|
|
308
|
+
*/
|
|
309
|
+
export async function loadWorkflow(workflowsDir, name) {
|
|
310
|
+
const workflowDir = await resolveWorkflowDir(workflowsDir, name);
|
|
311
|
+
return loadPlugin(workflowDir, undefined, false);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* List all available workflow names from the workflows directory.
|
|
315
|
+
*
|
|
316
|
+
* @param workflowsDir - Workflows directory (<data_dir>/harmonia/.workflows)
|
|
317
|
+
*/
|
|
318
|
+
export async function listWorkflows(workflowsDir) {
|
|
319
|
+
const names = [];
|
|
320
|
+
try {
|
|
321
|
+
const entries = await readdir(workflowsDir, { withFileTypes: true });
|
|
322
|
+
for (const e of entries) {
|
|
323
|
+
if (e.isDirectory())
|
|
324
|
+
names.push(e.name);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
// workflows dir doesn't exist yet — that's fine
|
|
329
|
+
}
|
|
330
|
+
return names.sort();
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/core/plugin.ts"],"names":[],"mappings":"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"}
|
package/build/core/registry.d.ts
CHANGED
|
@@ -10,16 +10,20 @@
|
|
|
10
10
|
* Structure:
|
|
11
11
|
* <data_dir>/
|
|
12
12
|
* ├── registry.json # { projects: { "my-app": { dir: "/path/to/src", ... } } }
|
|
13
|
-
* ├── overrides.json # global overrides (optional)
|
|
14
13
|
* ├── my-app/
|
|
15
14
|
* │ ├── overrides.json # project-level overrides (optional)
|
|
15
|
+
* │ ├── issues.json # project-level issue tracking (optional)
|
|
16
16
|
* │ ├── iter-1/
|
|
17
17
|
* │ │ ├── state.json
|
|
18
|
-
* │ │ ├──
|
|
18
|
+
* │ │ ├── artifacts/
|
|
19
19
|
* │ │ ├── reviews.json
|
|
20
20
|
* │ │ └── ...
|
|
21
21
|
* │ ├── iter-2/
|
|
22
22
|
* │ │ └── ...
|
|
23
|
+
* │ ├── patch-1/
|
|
24
|
+
* │ │ ├── state.json # type: "patch", clarify/design skipped
|
|
25
|
+
* │ │ ├── artifacts/
|
|
26
|
+
* │ │ └── ...
|
|
23
27
|
* └── another-project/
|
|
24
28
|
* └── ...
|
|
25
29
|
*/
|
|
@@ -34,6 +38,12 @@ export interface ProjectEntry {
|
|
|
34
38
|
currentIteration: number;
|
|
35
39
|
/** Total number of iterations created so far */
|
|
36
40
|
totalIterations: number;
|
|
41
|
+
/** Currently active patch number (starts at 1, 0 means no patch started yet) */
|
|
42
|
+
currentPatch: number;
|
|
43
|
+
/** Total number of patches created so far */
|
|
44
|
+
totalPatches: number;
|
|
45
|
+
/** Active context identifier, e.g. "iter-1" or "patch-2". Empty string means no context. */
|
|
46
|
+
activeContext: string;
|
|
37
47
|
}
|
|
38
48
|
export interface Registry {
|
|
39
49
|
projects: Record<string, ProjectEntry>;
|
|
@@ -88,8 +98,31 @@ export declare function unregisterProject(projectName: string, keepData?: boolea
|
|
|
88
98
|
export declare function getIterationDir(projectName: string, iteration: number): string;
|
|
89
99
|
/**
|
|
90
100
|
* Start a new iteration for a project.
|
|
91
|
-
* Creates the iteration directory (with
|
|
101
|
+
* Creates the iteration directory (with artifacts/ subdirectory) and updates the registry.
|
|
92
102
|
*
|
|
93
103
|
* @returns The new iteration number
|
|
94
104
|
*/
|
|
95
105
|
export declare function startIteration(projectName: string): Promise<number>;
|
|
106
|
+
/**
|
|
107
|
+
* Get the patch directory for a specific project patch.
|
|
108
|
+
* Pure path concatenation — does NOT check if the directory exists.
|
|
109
|
+
*/
|
|
110
|
+
export declare function getPatchDir(projectName: string, patch: number): string;
|
|
111
|
+
/**
|
|
112
|
+
* Start a new patch for a project.
|
|
113
|
+
* Creates the patch directory (with artifacts/ subdirectory) and updates the registry.
|
|
114
|
+
*
|
|
115
|
+
* @returns The new patch number
|
|
116
|
+
*/
|
|
117
|
+
export declare function startPatch(projectName: string): Promise<number>;
|
|
118
|
+
/**
|
|
119
|
+
* Resolve the active context directory for a project.
|
|
120
|
+
* Parses activeContext string (e.g. "iter-1", "patch-2") into an absolute path.
|
|
121
|
+
*
|
|
122
|
+
* @returns { dir: string, type: 'iteration' | 'patch', number: number } or null if no active context
|
|
123
|
+
*/
|
|
124
|
+
export declare function resolveContextDir(projectName: string, activeContext: string): {
|
|
125
|
+
dir: string;
|
|
126
|
+
type: 'iteration' | 'patch';
|
|
127
|
+
number: number;
|
|
128
|
+
} | null;
|
package/build/core/registry.js
CHANGED
|
@@ -10,16 +10,20 @@
|
|
|
10
10
|
* Structure:
|
|
11
11
|
* <data_dir>/
|
|
12
12
|
* ├── registry.json # { projects: { "my-app": { dir: "/path/to/src", ... } } }
|
|
13
|
-
* ├── overrides.json # global overrides (optional)
|
|
14
13
|
* ├── my-app/
|
|
15
14
|
* │ ├── overrides.json # project-level overrides (optional)
|
|
15
|
+
* │ ├── issues.json # project-level issue tracking (optional)
|
|
16
16
|
* │ ├── iter-1/
|
|
17
17
|
* │ │ ├── state.json
|
|
18
|
-
* │ │ ├──
|
|
18
|
+
* │ │ ├── artifacts/
|
|
19
19
|
* │ │ ├── reviews.json
|
|
20
20
|
* │ │ └── ...
|
|
21
21
|
* │ ├── iter-2/
|
|
22
22
|
* │ │ └── ...
|
|
23
|
+
* │ ├── patch-1/
|
|
24
|
+
* │ │ ├── state.json # type: "patch", clarify/design skipped
|
|
25
|
+
* │ │ ├── artifacts/
|
|
26
|
+
* │ │ └── ...
|
|
23
27
|
* └── another-project/
|
|
24
28
|
* └── ...
|
|
25
29
|
*/
|
|
@@ -84,6 +88,9 @@ export async function registerProject(projectName, projectDir, workflow) {
|
|
|
84
88
|
createdAt: new Date().toISOString(),
|
|
85
89
|
currentIteration: 0,
|
|
86
90
|
totalIterations: 0,
|
|
91
|
+
currentPatch: 0,
|
|
92
|
+
totalPatches: 0,
|
|
93
|
+
activeContext: '',
|
|
87
94
|
};
|
|
88
95
|
// Create project data directory under global dir
|
|
89
96
|
const dataDir = getProjectDataDir(projectName);
|
|
@@ -130,7 +137,7 @@ export function getIterationDir(projectName, iteration) {
|
|
|
130
137
|
}
|
|
131
138
|
/**
|
|
132
139
|
* Start a new iteration for a project.
|
|
133
|
-
* Creates the iteration directory (with
|
|
140
|
+
* Creates the iteration directory (with artifacts/ subdirectory) and updates the registry.
|
|
134
141
|
*
|
|
135
142
|
* @returns The new iteration number
|
|
136
143
|
*/
|
|
@@ -143,10 +150,61 @@ export async function startIteration(projectName) {
|
|
|
143
150
|
const newIteration = entry.totalIterations + 1;
|
|
144
151
|
entry.currentIteration = newIteration;
|
|
145
152
|
entry.totalIterations = newIteration;
|
|
146
|
-
|
|
153
|
+
entry.activeContext = `iter-${newIteration}`;
|
|
154
|
+
// Create iteration directory with artifacts subdirectory
|
|
147
155
|
const iterDir = getIterationDir(projectName, newIteration);
|
|
148
|
-
await mkdir(join(iterDir, '
|
|
156
|
+
await mkdir(join(iterDir, 'artifacts'), { recursive: true });
|
|
149
157
|
await writeRegistry(registry);
|
|
150
158
|
return newIteration;
|
|
151
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Get the patch directory for a specific project patch.
|
|
162
|
+
* Pure path concatenation — does NOT check if the directory exists.
|
|
163
|
+
*/
|
|
164
|
+
export function getPatchDir(projectName, patch) {
|
|
165
|
+
return join(getProjectDataDir(projectName), `patch-${patch}`);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Start a new patch for a project.
|
|
169
|
+
* Creates the patch directory (with artifacts/ subdirectory) and updates the registry.
|
|
170
|
+
*
|
|
171
|
+
* @returns The new patch number
|
|
172
|
+
*/
|
|
173
|
+
export async function startPatch(projectName) {
|
|
174
|
+
const registry = await readRegistry();
|
|
175
|
+
const entry = registry.projects[projectName];
|
|
176
|
+
if (!entry) {
|
|
177
|
+
throw new Error(`Project "${projectName}" not found in registry.`);
|
|
178
|
+
}
|
|
179
|
+
const newPatch = entry.totalPatches + 1;
|
|
180
|
+
entry.currentPatch = newPatch;
|
|
181
|
+
entry.totalPatches = newPatch;
|
|
182
|
+
entry.activeContext = `patch-${newPatch}`;
|
|
183
|
+
// Create patch directory with artifacts subdirectory
|
|
184
|
+
const patchDir = getPatchDir(projectName, newPatch);
|
|
185
|
+
await mkdir(join(patchDir, 'artifacts'), { recursive: true });
|
|
186
|
+
await writeRegistry(registry);
|
|
187
|
+
return newPatch;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Resolve the active context directory for a project.
|
|
191
|
+
* Parses activeContext string (e.g. "iter-1", "patch-2") into an absolute path.
|
|
192
|
+
*
|
|
193
|
+
* @returns { dir: string, type: 'iteration' | 'patch', number: number } or null if no active context
|
|
194
|
+
*/
|
|
195
|
+
export function resolveContextDir(projectName, activeContext) {
|
|
196
|
+
if (!activeContext)
|
|
197
|
+
return null;
|
|
198
|
+
const iterMatch = activeContext.match(/^iter-(\d+)$/);
|
|
199
|
+
if (iterMatch) {
|
|
200
|
+
const num = parseInt(iterMatch[1], 10);
|
|
201
|
+
return { dir: getIterationDir(projectName, num), type: 'iteration', number: num };
|
|
202
|
+
}
|
|
203
|
+
const patchMatch = activeContext.match(/^patch-(\d+)$/);
|
|
204
|
+
if (patchMatch) {
|
|
205
|
+
const num = parseInt(patchMatch[1], 10);
|
|
206
|
+
return { dir: getPatchDir(projectName, num), type: 'patch', number: num };
|
|
207
|
+
}
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
152
210
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"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"}
|