@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
|
@@ -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,20 +10,19 @@
|
|
|
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)
|
|
16
15
|
* │ ├── issues.json # project-level issue tracking (optional)
|
|
17
16
|
* │ ├── iter-1/
|
|
18
17
|
* │ │ ├── state.json
|
|
19
|
-
* │ │ ├──
|
|
18
|
+
* │ │ ├── artifacts/
|
|
20
19
|
* │ │ ├── reviews.json
|
|
21
20
|
* │ │ └── ...
|
|
22
21
|
* │ ├── iter-2/
|
|
23
22
|
* │ │ └── ...
|
|
24
23
|
* │ ├── patch-1/
|
|
25
24
|
* │ │ ├── state.json # type: "patch", clarify/design skipped
|
|
26
|
-
* │ │ ├──
|
|
25
|
+
* │ │ ├── artifacts/
|
|
27
26
|
* │ │ └── ...
|
|
28
27
|
* └── another-project/
|
|
29
28
|
* └── ...
|
|
@@ -99,7 +98,7 @@ export declare function unregisterProject(projectName: string, keepData?: boolea
|
|
|
99
98
|
export declare function getIterationDir(projectName: string, iteration: number): string;
|
|
100
99
|
/**
|
|
101
100
|
* Start a new iteration for a project.
|
|
102
|
-
* Creates the iteration directory (with
|
|
101
|
+
* Creates the iteration directory (with artifacts/ subdirectory) and updates the registry.
|
|
103
102
|
*
|
|
104
103
|
* @returns The new iteration number
|
|
105
104
|
*/
|
|
@@ -111,7 +110,7 @@ export declare function startIteration(projectName: string): Promise<number>;
|
|
|
111
110
|
export declare function getPatchDir(projectName: string, patch: number): string;
|
|
112
111
|
/**
|
|
113
112
|
* Start a new patch for a project.
|
|
114
|
-
* Creates the patch directory (with
|
|
113
|
+
* Creates the patch directory (with artifacts/ subdirectory) and updates the registry.
|
|
115
114
|
*
|
|
116
115
|
* @returns The new patch number
|
|
117
116
|
*/
|
package/build/core/registry.js
CHANGED
|
@@ -10,20 +10,19 @@
|
|
|
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)
|
|
16
15
|
* │ ├── issues.json # project-level issue tracking (optional)
|
|
17
16
|
* │ ├── iter-1/
|
|
18
17
|
* │ │ ├── state.json
|
|
19
|
-
* │ │ ├──
|
|
18
|
+
* │ │ ├── artifacts/
|
|
20
19
|
* │ │ ├── reviews.json
|
|
21
20
|
* │ │ └── ...
|
|
22
21
|
* │ ├── iter-2/
|
|
23
22
|
* │ │ └── ...
|
|
24
23
|
* │ ├── patch-1/
|
|
25
24
|
* │ │ ├── state.json # type: "patch", clarify/design skipped
|
|
26
|
-
* │ │ ├──
|
|
25
|
+
* │ │ ├── artifacts/
|
|
27
26
|
* │ │ └── ...
|
|
28
27
|
* └── another-project/
|
|
29
28
|
* └── ...
|
|
@@ -138,7 +137,7 @@ export function getIterationDir(projectName, iteration) {
|
|
|
138
137
|
}
|
|
139
138
|
/**
|
|
140
139
|
* Start a new iteration for a project.
|
|
141
|
-
* Creates the iteration directory (with
|
|
140
|
+
* Creates the iteration directory (with artifacts/ subdirectory) and updates the registry.
|
|
142
141
|
*
|
|
143
142
|
* @returns The new iteration number
|
|
144
143
|
*/
|
|
@@ -152,9 +151,9 @@ export async function startIteration(projectName) {
|
|
|
152
151
|
entry.currentIteration = newIteration;
|
|
153
152
|
entry.totalIterations = newIteration;
|
|
154
153
|
entry.activeContext = `iter-${newIteration}`;
|
|
155
|
-
// Create iteration directory with
|
|
154
|
+
// Create iteration directory with artifacts subdirectory
|
|
156
155
|
const iterDir = getIterationDir(projectName, newIteration);
|
|
157
|
-
await mkdir(join(iterDir, '
|
|
156
|
+
await mkdir(join(iterDir, 'artifacts'), { recursive: true });
|
|
158
157
|
await writeRegistry(registry);
|
|
159
158
|
return newIteration;
|
|
160
159
|
}
|
|
@@ -167,7 +166,7 @@ export function getPatchDir(projectName, patch) {
|
|
|
167
166
|
}
|
|
168
167
|
/**
|
|
169
168
|
* Start a new patch for a project.
|
|
170
|
-
* Creates the patch directory (with
|
|
169
|
+
* Creates the patch directory (with artifacts/ subdirectory) and updates the registry.
|
|
171
170
|
*
|
|
172
171
|
* @returns The new patch number
|
|
173
172
|
*/
|
|
@@ -181,9 +180,9 @@ export async function startPatch(projectName) {
|
|
|
181
180
|
entry.currentPatch = newPatch;
|
|
182
181
|
entry.totalPatches = newPatch;
|
|
183
182
|
entry.activeContext = `patch-${newPatch}`;
|
|
184
|
-
// Create patch directory with
|
|
183
|
+
// Create patch directory with artifacts subdirectory
|
|
185
184
|
const patchDir = getPatchDir(projectName, newPatch);
|
|
186
|
-
await mkdir(join(patchDir, '
|
|
185
|
+
await mkdir(join(patchDir, 'artifacts'), { recursive: true });
|
|
187
186
|
await writeRegistry(registry);
|
|
188
187
|
return newPatch;
|
|
189
188
|
}
|
|
@@ -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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"}
|
package/build/core/reviews.d.ts
CHANGED
|
@@ -1,27 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Artifact review state management — <context_dir>/reviews.json
|
|
3
3
|
*
|
|
4
|
-
* Tracks which
|
|
5
|
-
* All public functions accept an optional contextDir parameter.
|
|
4
|
+
* Tracks which artifacts are pending review, approved, or rejected.
|
|
6
5
|
*/
|
|
7
|
-
import type {
|
|
6
|
+
import type { ReviewState } from './types.js';
|
|
8
7
|
/**
|
|
9
8
|
* Read the reviews state for a project context.
|
|
10
9
|
*/
|
|
11
|
-
export declare function readReviews(projectName: string, iteration: number, contextDir?: string): Promise<Record<string,
|
|
10
|
+
export declare function readReviews(projectName: string, iteration: number, contextDir?: string): Promise<Record<string, ReviewState>>;
|
|
12
11
|
/**
|
|
13
|
-
* Submit
|
|
12
|
+
* Submit an artifact for review. Sets status to "pending".
|
|
14
13
|
*/
|
|
15
|
-
export declare function submitForReview(projectName: string, iteration: number,
|
|
14
|
+
export declare function submitForReview(projectName: string, iteration: number, artifactId: string, contextDir?: string): Promise<ReviewState>;
|
|
16
15
|
/**
|
|
17
|
-
* Approve or reject
|
|
16
|
+
* Approve or reject an artifact review.
|
|
18
17
|
*/
|
|
19
|
-
export declare function resolveReview(projectName: string, iteration: number,
|
|
18
|
+
export declare function resolveReview(projectName: string, iteration: number, artifactId: string, status: 'approved' | 'rejected', comment?: string, contextDir?: string): Promise<ReviewState>;
|
|
20
19
|
/**
|
|
21
|
-
* Get the review state for a specific
|
|
20
|
+
* Get the review state for a specific artifact.
|
|
22
21
|
*/
|
|
23
|
-
export declare function
|
|
22
|
+
export declare function getArtifactReview(projectName: string, iteration: number, artifactId: string, contextDir?: string): Promise<ReviewState | null>;
|
|
24
23
|
/**
|
|
25
24
|
* Get all pending reviews for a project context.
|
|
26
25
|
*/
|
|
27
|
-
export declare function getPendingReviews(projectName: string, iteration: number, contextDir?: string): Promise<
|
|
26
|
+
export declare function getPendingReviews(projectName: string, iteration: number, contextDir?: string): Promise<ReviewState[]>;
|
package/build/core/reviews.js
CHANGED
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Artifact review state management — <context_dir>/reviews.json
|
|
3
3
|
*
|
|
4
|
-
* Tracks which
|
|
5
|
-
* All public functions accept an optional contextDir parameter.
|
|
4
|
+
* Tracks which artifacts are pending review, approved, or rejected.
|
|
6
5
|
*/
|
|
7
6
|
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
8
7
|
import { join, dirname } from 'node:path';
|
|
9
|
-
import { getIterationDir } from './registry.js';
|
|
10
8
|
const REVIEWS_FILE = 'reviews.json';
|
|
11
9
|
function reviewsPath(projectName, iteration, contextDir) {
|
|
12
|
-
|
|
13
|
-
return join(base, REVIEWS_FILE);
|
|
10
|
+
return join(contextDir, REVIEWS_FILE);
|
|
14
11
|
}
|
|
15
12
|
/**
|
|
16
13
|
* Read the reviews state for a project context.
|
|
@@ -19,7 +16,7 @@ export async function readReviews(projectName, iteration, contextDir) {
|
|
|
19
16
|
try {
|
|
20
17
|
const content = await readFile(reviewsPath(projectName, iteration, contextDir), 'utf-8');
|
|
21
18
|
const data = JSON.parse(content);
|
|
22
|
-
return data.
|
|
19
|
+
return data.artifacts ?? {};
|
|
23
20
|
}
|
|
24
21
|
catch {
|
|
25
22
|
return {};
|
|
@@ -28,37 +25,37 @@ export async function readReviews(projectName, iteration, contextDir) {
|
|
|
28
25
|
/**
|
|
29
26
|
* Write reviews state to disk.
|
|
30
27
|
*/
|
|
31
|
-
async function writeReviews(projectName, iteration,
|
|
28
|
+
async function writeReviews(projectName, iteration, artifacts, contextDir) {
|
|
32
29
|
const filePath = reviewsPath(projectName, iteration, contextDir);
|
|
33
30
|
await mkdir(dirname(filePath), { recursive: true });
|
|
34
|
-
const data = {
|
|
31
|
+
const data = { artifacts };
|
|
35
32
|
await writeFile(filePath, JSON.stringify(data, null, 2) + '\n', 'utf-8');
|
|
36
33
|
}
|
|
37
34
|
/**
|
|
38
|
-
* Submit
|
|
35
|
+
* Submit an artifact for review. Sets status to "pending".
|
|
39
36
|
*/
|
|
40
|
-
export async function submitForReview(projectName, iteration,
|
|
37
|
+
export async function submitForReview(projectName, iteration, artifactId, contextDir) {
|
|
41
38
|
const reviews = await readReviews(projectName, iteration, contextDir);
|
|
42
39
|
const state = {
|
|
43
|
-
|
|
40
|
+
artifactId,
|
|
44
41
|
status: 'pending',
|
|
45
42
|
submittedAt: new Date().toISOString(),
|
|
46
43
|
};
|
|
47
|
-
reviews[
|
|
44
|
+
reviews[artifactId] = state;
|
|
48
45
|
await writeReviews(projectName, iteration, reviews, contextDir);
|
|
49
46
|
return state;
|
|
50
47
|
}
|
|
51
48
|
/**
|
|
52
|
-
* Approve or reject
|
|
49
|
+
* Approve or reject an artifact review.
|
|
53
50
|
*/
|
|
54
|
-
export async function resolveReview(projectName, iteration,
|
|
51
|
+
export async function resolveReview(projectName, iteration, artifactId, status, comment, contextDir) {
|
|
55
52
|
const reviews = await readReviews(projectName, iteration, contextDir);
|
|
56
|
-
const existing = reviews[
|
|
53
|
+
const existing = reviews[artifactId];
|
|
57
54
|
if (!existing) {
|
|
58
|
-
throw new Error(`No review pending for
|
|
55
|
+
throw new Error(`No review pending for artifact "${artifactId}". Submit it for review first.`);
|
|
59
56
|
}
|
|
60
57
|
if (existing.status !== 'pending') {
|
|
61
|
-
throw new Error(`
|
|
58
|
+
throw new Error(`Artifact "${artifactId}" review is already ${existing.status}.`);
|
|
62
59
|
}
|
|
63
60
|
existing.status = status;
|
|
64
61
|
existing.reviewedAt = new Date().toISOString();
|
|
@@ -69,11 +66,11 @@ export async function resolveReview(projectName, iteration, docId, status, comme
|
|
|
69
66
|
return existing;
|
|
70
67
|
}
|
|
71
68
|
/**
|
|
72
|
-
* Get the review state for a specific
|
|
69
|
+
* Get the review state for a specific artifact.
|
|
73
70
|
*/
|
|
74
|
-
export async function
|
|
71
|
+
export async function getArtifactReview(projectName, iteration, artifactId, contextDir) {
|
|
75
72
|
const reviews = await readReviews(projectName, iteration, contextDir);
|
|
76
|
-
return reviews[
|
|
73
|
+
return reviews[artifactId] ?? null;
|
|
77
74
|
}
|
|
78
75
|
/**
|
|
79
76
|
* Get all pending reviews for a project context.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reviews.js","sourceRoot":"","sources":["../../src/core/reviews.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"reviews.js","sourceRoot":"","sources":["../../src/core/reviews.ts"],"names":[],"mappings":"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"}
|