create-byan-agent 2.0.1 → 2.1.1
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/API-BYAN-V2.md +741 -0
- package/BMAD-QUICK-REFERENCE.md +370 -0
- package/CHANGELOG-v2.1.0.md +371 -0
- package/LICENSE +1 -1
- package/MIGRATION-v2.0-to-v2.1.md +430 -0
- package/README-BYAN-V2.md +446 -0
- package/README.md +264 -201
- package/install/.eslintrc.js +20 -0
- package/install/.prettierrc +7 -0
- package/install/BUGFIX-CHALK.md +173 -0
- package/install/BUGFIX-DOCUMENTATION-INDEX.md +299 -0
- package/install/BUGFIX-PATH-RESOLUTION.md +293 -0
- package/install/BUGFIX-QUICKSTART.md +184 -0
- package/install/BUGFIX-SUMMARY.txt +91 -0
- package/install/BUGFIX-VISUAL-SUMMARY.md +253 -0
- package/install/DEPLOYMENT-GUIDE-V2.md +431 -0
- package/install/DOCS-INDEX.md +261 -0
- package/install/GUIDE-INSTALLATION-BYAN-SIMPLE.md +1083 -0
- package/install/INSTALLER-V2-CHANGES.md +472 -0
- package/install/LICENSE +21 -0
- package/install/PUBLICATION-CHECKLIST.md +265 -0
- package/install/PUBLISH-GUIDE.md +190 -0
- package/install/QUICKSTART.md +311 -0
- package/install/README-NPM-PUBLISH.md +298 -0
- package/install/README-NPM-SHORT.md +298 -0
- package/install/README-NPM.md +433 -0
- package/install/README-RACHID.md +302 -0
- package/install/README-V2-INDEX.md +306 -0
- package/install/README.md +298 -0
- package/install/RESUME-EXECUTIF-YAN.md +408 -0
- package/install/UPDATE-SUMMARY.md +205 -0
- package/install/__tests__/integration/detection-flow.test.js +154 -0
- package/install/__tests__/platforms/claude-code.test.js +175 -0
- package/install/__tests__/platforms/codex.test.js +80 -0
- package/install/__tests__/platforms/copilot-cli.test.js +118 -0
- package/install/__tests__/platforms/vscode.test.js +67 -0
- package/install/__tests__/utils/file-utils.test.js +87 -0
- package/install/__tests__/utils/git-detector.test.js +80 -0
- package/install/__tests__/utils/logger.test.js +83 -0
- package/install/__tests__/utils/node-detector.test.js +71 -0
- package/install/__tests__/utils/os-detector.test.js +63 -0
- package/install/__tests__/utils/yaml-utils.test.js +85 -0
- package/install/__tests__/yanstaller/detector.test.js +210 -0
- package/install/coverage/clover.xml +219 -0
- package/install/coverage/coverage-final.json +13 -0
- package/install/coverage/lcov-report/base.css +224 -0
- package/install/coverage/lcov-report/block-navigation.js +87 -0
- package/install/coverage/lcov-report/favicon.png +0 -0
- package/install/coverage/lcov-report/index.html +146 -0
- package/install/coverage/lcov-report/lib/errors.js.html +268 -0
- package/install/coverage/lcov-report/lib/exit-codes.js.html +247 -0
- package/install/coverage/lcov-report/lib/index.html +131 -0
- package/install/coverage/lcov-report/lib/platforms/claude-code.js.html +343 -0
- package/install/coverage/lcov-report/lib/platforms/codex.js.html +361 -0
- package/install/coverage/lcov-report/lib/platforms/copilot-cli.js.html +454 -0
- package/install/coverage/lcov-report/lib/platforms/index.html +176 -0
- package/install/coverage/lcov-report/lib/platforms/index.js.html +127 -0
- package/install/coverage/lcov-report/lib/platforms/vscode.js.html +238 -0
- package/install/coverage/lcov-report/lib/utils/config-loader.js.html +322 -0
- package/install/coverage/lcov-report/lib/utils/file-utils.js.html +397 -0
- package/install/coverage/lcov-report/lib/utils/git-detector.js.html +190 -0
- package/install/coverage/lcov-report/lib/utils/index.html +206 -0
- package/install/coverage/lcov-report/lib/utils/logger.js.html +277 -0
- package/install/coverage/lcov-report/lib/utils/node-detector.js.html +259 -0
- package/install/coverage/lcov-report/lib/utils/os-detector.js.html +307 -0
- package/install/coverage/lcov-report/lib/utils/yaml-utils.js.html +346 -0
- package/install/coverage/lcov-report/lib/yanstaller/backuper.js.html +409 -0
- package/install/coverage/lcov-report/lib/yanstaller/detector.js.html +508 -0
- package/install/coverage/lcov-report/lib/yanstaller/index.html +236 -0
- package/install/coverage/lcov-report/lib/yanstaller/index.js.html +364 -0
- package/install/coverage/lcov-report/lib/yanstaller/installer.js.html +505 -0
- package/install/coverage/lcov-report/lib/yanstaller/interviewer.js.html +349 -0
- package/install/coverage/lcov-report/lib/yanstaller/recommender.js.html +379 -0
- package/install/coverage/lcov-report/lib/yanstaller/troubleshooter.js.html +352 -0
- package/install/coverage/lcov-report/lib/yanstaller/validator.js.html +679 -0
- package/install/coverage/lcov-report/lib/yanstaller/wizard.js.html +412 -0
- package/install/coverage/lcov-report/platforms/claude-code.js.html +343 -0
- package/install/coverage/lcov-report/platforms/codex.js.html +361 -0
- package/install/coverage/lcov-report/platforms/copilot-cli.js.html +454 -0
- package/install/coverage/lcov-report/platforms/index.html +176 -0
- package/install/coverage/lcov-report/platforms/index.js.html +127 -0
- package/install/coverage/lcov-report/platforms/vscode.js.html +238 -0
- package/install/coverage/lcov-report/prettify.css +1 -0
- package/install/coverage/lcov-report/prettify.js +2 -0
- package/install/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/install/coverage/lcov-report/sorter.js +210 -0
- package/install/coverage/lcov-report/utils/file-utils.js.html +397 -0
- package/install/coverage/lcov-report/utils/git-detector.js.html +190 -0
- package/install/coverage/lcov-report/utils/index.html +191 -0
- package/install/coverage/lcov-report/utils/logger.js.html +277 -0
- package/install/coverage/lcov-report/utils/node-detector.js.html +259 -0
- package/install/coverage/lcov-report/utils/os-detector.js.html +307 -0
- package/install/coverage/lcov-report/utils/yaml-utils.js.html +346 -0
- package/install/coverage/lcov-report/yanstaller/detector.js.html +508 -0
- package/install/coverage/lcov-report/yanstaller/index.html +116 -0
- package/install/coverage/lcov.info +414 -0
- package/install/install.sh +239 -0
- package/install/jest.config.js +33 -0
- package/install/lib/errors.js +61 -0
- package/install/lib/exit-codes.js +54 -0
- package/install/lib/platforms/claude-code.js +86 -0
- package/install/lib/platforms/codex.js +92 -0
- package/install/lib/platforms/copilot-cli.js +123 -0
- package/install/lib/platforms/index.js +14 -0
- package/install/lib/platforms/vscode.js +51 -0
- package/install/lib/utils/config-loader.js +79 -0
- package/install/lib/utils/file-utils.js +104 -0
- package/install/lib/utils/git-detector.js +35 -0
- package/install/lib/utils/logger.js +64 -0
- package/install/lib/utils/node-detector.js +58 -0
- package/install/lib/utils/os-detector.js +74 -0
- package/install/lib/utils/yaml-utils.js +87 -0
- package/install/lib/yanstaller/backuper.js +108 -0
- package/install/lib/yanstaller/detector.js +141 -0
- package/install/lib/yanstaller/index.js +93 -0
- package/install/lib/yanstaller/installer.js +140 -0
- package/install/lib/yanstaller/interviewer.js +88 -0
- package/install/lib/yanstaller/recommender.js +98 -0
- package/install/lib/yanstaller/troubleshooter.js +89 -0
- package/install/lib/yanstaller/validator.js +198 -0
- package/install/lib/yanstaller/wizard.js +109 -0
- package/install/package-npm.json +55 -0
- package/install/package.json +63 -0
- package/install/src/byan-v2/context/copilot-context.js +79 -0
- package/install/src/byan-v2/context/session-state.js +98 -0
- package/install/src/byan-v2/dispatcher/complexity-scorer.js +232 -0
- package/install/src/byan-v2/dispatcher/local-executor.js +221 -0
- package/install/src/byan-v2/dispatcher/task-router.js +122 -0
- package/install/src/byan-v2/dispatcher/task-tool-interface-mock.js +134 -0
- package/install/src/byan-v2/dispatcher/task-tool-interface.js +123 -0
- package/install/src/byan-v2/generation/agent-profile-validator.js +113 -0
- package/install/src/byan-v2/generation/profile-template.js +113 -0
- package/install/src/byan-v2/generation/templates/default-agent.md +49 -0
- package/install/src/byan-v2/generation/templates/test-template.md +1 -0
- package/install/src/byan-v2/index.js +199 -0
- package/install/src/byan-v2/observability/error-tracker.js +105 -0
- package/install/src/byan-v2/observability/logger.js +154 -0
- package/install/src/byan-v2/observability/metrics-collector.js +194 -0
- package/install/src/byan-v2/orchestrator/analysis-state.js +268 -0
- package/install/src/byan-v2/orchestrator/generation-state.js +340 -0
- package/install/src/byan-v2/orchestrator/interview-state.js +271 -0
- package/install/src/byan-v2/orchestrator/state-machine.js +204 -0
- package/install/src/core/cache/cache.js +126 -0
- package/install/src/core/context/context.js +86 -0
- package/install/src/core/dispatcher/dispatcher.js +135 -0
- package/install/src/core/worker-pool/worker-pool.js +194 -0
- package/install/src/core/workflow/workflow-executor.js +220 -0
- package/install/src/index.js +139 -0
- package/install/src/observability/dashboard/dashboard.js +191 -0
- package/install/src/observability/logger/structured-logger.js +254 -0
- package/install/src/observability/metrics/metrics-collector.js +325 -0
- package/install/switch-to-v2.sh +126 -0
- package/install/test-chalk-fix.sh +210 -0
- package/install/test-installer-v2.sh +204 -0
- package/install/test-path-resolution.sh +200 -0
- package/package.json +53 -33
- package/src/byan-v2/context/copilot-context.js +79 -0
- package/src/byan-v2/context/session-state.js +98 -0
- package/src/byan-v2/data/mantras.json +852 -0
- package/src/byan-v2/dispatcher/complexity-scorer.js +232 -0
- package/src/byan-v2/dispatcher/five-whys-analyzer.js +310 -0
- package/src/byan-v2/dispatcher/local-executor.js +221 -0
- package/src/byan-v2/dispatcher/task-router.js +122 -0
- package/src/byan-v2/dispatcher/task-tool-interface-mock.js +134 -0
- package/src/byan-v2/dispatcher/task-tool-interface.js +123 -0
- package/src/byan-v2/generation/agent-profile-validator.js +113 -0
- package/src/byan-v2/generation/mantra-validator.js +416 -0
- package/src/byan-v2/generation/profile-template.js +113 -0
- package/src/byan-v2/generation/templates/default-agent.md +49 -0
- package/src/byan-v2/generation/templates/test-template.md +1 -0
- package/src/byan-v2/index.js +652 -0
- package/src/byan-v2/integration/voice-integration.js +295 -0
- package/src/byan-v2/observability/error-tracker.js +105 -0
- package/src/byan-v2/observability/logger.js +154 -0
- package/src/byan-v2/observability/metrics-collector.js +194 -0
- package/src/byan-v2/orchestrator/active-listener.js +541 -0
- package/src/byan-v2/orchestrator/analysis-state.js +268 -0
- package/src/byan-v2/orchestrator/generation-state.js +340 -0
- package/src/byan-v2/orchestrator/glossary-builder.js +431 -0
- package/src/byan-v2/orchestrator/interview-state.js +353 -0
- package/src/byan-v2/orchestrator/state-machine.js +253 -0
- package/src/core/cache/cache.js +126 -0
- package/src/core/context/context.js +86 -0
- package/src/core/dispatcher/dispatcher.js +135 -0
- package/src/core/worker-pool/worker-pool.js +194 -0
- package/src/core/workflow/workflow-executor.js +220 -0
- package/src/index.js +139 -0
- package/src/observability/dashboard/dashboard.js +191 -0
- package/src/observability/logger/structured-logger.js +254 -0
- package/src/observability/metrics/metrics-collector.js +325 -0
- package/templates/.github/agents/bmad-agent-test-dynamic.md +0 -21
- package/templates/.github/agents/franck.md +0 -379
- /package/{CHANGELOG.md → install/CHANGELOG.md} +0 -0
- /package/{bin → install/bin}/create-byan-agent-backup.js +0 -0
- /package/{bin → install/bin}/create-byan-agent-fixed.js +0 -0
- /package/{bin → install/bin}/create-byan-agent-v2.js +0 -0
- /package/{bin → install/bin}/create-byan-agent.js +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmad-master.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-agent-builder.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-module-builder.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-workflow-builder.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-analyst.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-architect.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-dev.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-pm.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-quick-flow-solo-dev.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-quinn.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-sm.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-tech-writer.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-ux-designer.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-byan-test.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-byan.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-carmack.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-brainstorming-coach.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-creative-problem-solver.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-design-thinking-coach.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-innovation-strategist.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-presentation-master.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-cis-storyteller.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-marc.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-patnote.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-rachid.md +0 -0
- /package/{templates → install/templates}/.github/agents/bmad-agent-tea-tea.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/agent-builder.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/byan-test.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/byan.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/marc.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/module-builder.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/patnote.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/rachid.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/agents/workflow-builder.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/data/mantras.yaml +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/data/templates.yaml +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/delete-agent-workflow.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/edit-agent-workflow.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/interview-workflow.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/quick-create-workflow.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/templates/base-agent-template.md +0 -0
- /package/{templates → install/templates}/_bmad/bmb/workflows/byan/validate-agent-workflow.md +0 -0
- /package/{templates → install/templates}/_bmad/core/agents/carmack.md +0 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Executor for BYAN v2.0
|
|
3
|
+
* Executes declarative YAML workflows with sequential step execution
|
|
4
|
+
*
|
|
5
|
+
* @module core/workflow/workflow-executor
|
|
6
|
+
* @version 2.0.0-HYPER-MVP
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Workflow Executor - Orchestrates multi-step workflows
|
|
11
|
+
*
|
|
12
|
+
* @class WorkflowExecutor
|
|
13
|
+
* @example
|
|
14
|
+
* const executor = new WorkflowExecutor();
|
|
15
|
+
* const result = await executor.executeWorkflow(workflow);
|
|
16
|
+
*/
|
|
17
|
+
class WorkflowExecutor {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.currentWorkflow = null;
|
|
20
|
+
this.status = 'idle';
|
|
21
|
+
this.results = [];
|
|
22
|
+
this.isPaused = false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Execute a workflow with sequential steps
|
|
27
|
+
*
|
|
28
|
+
* @param {Object} workflow - Workflow configuration
|
|
29
|
+
* @param {string} workflow.name - Workflow name
|
|
30
|
+
* @param {Array<Object>} workflow.steps - Array of steps
|
|
31
|
+
* @returns {Promise<Object>} Execution result
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* const result = await executor.executeWorkflow({
|
|
35
|
+
* name: 'test-workflow',
|
|
36
|
+
* steps: [
|
|
37
|
+
* { id: 'step1', action: 'task1' },
|
|
38
|
+
* { id: 'step2', action: 'task2' }
|
|
39
|
+
* ]
|
|
40
|
+
* });
|
|
41
|
+
*/
|
|
42
|
+
async executeWorkflow(workflow) {
|
|
43
|
+
if (!workflow) {
|
|
44
|
+
throw new Error('Workflow is required');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!workflow.name) {
|
|
48
|
+
throw new Error('Workflow name is required');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!Array.isArray(workflow.steps) || workflow.steps.length === 0) {
|
|
52
|
+
throw new Error('Workflow must have at least one step');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
this.currentWorkflow = workflow;
|
|
56
|
+
this.status = 'running';
|
|
57
|
+
this.results = [];
|
|
58
|
+
this.isPaused = false;
|
|
59
|
+
|
|
60
|
+
const startTime = Date.now();
|
|
61
|
+
let stepsCompleted = 0;
|
|
62
|
+
let hasError = false;
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
for (const step of workflow.steps) {
|
|
66
|
+
if (this.isPaused) {
|
|
67
|
+
this.status = 'paused';
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
paused: true,
|
|
71
|
+
stepsCompleted,
|
|
72
|
+
message: 'Workflow paused',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Validate step
|
|
77
|
+
if (!step.id) {
|
|
78
|
+
throw new Error('Step id is required');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Execute step (stub simulation)
|
|
82
|
+
const stepStartTime = Date.now();
|
|
83
|
+
const stepResult = await this._executeStep(step);
|
|
84
|
+
const stepDuration = Date.now() - stepStartTime;
|
|
85
|
+
|
|
86
|
+
this.results.push({
|
|
87
|
+
stepId: step.id,
|
|
88
|
+
action: step.action,
|
|
89
|
+
duration: stepDuration,
|
|
90
|
+
result: stepResult,
|
|
91
|
+
timestamp: new Date().toISOString(),
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
stepsCompleted++;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const totalDuration = Date.now() - startTime;
|
|
98
|
+
this.status = 'completed';
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
success: true,
|
|
102
|
+
workflowName: workflow.name,
|
|
103
|
+
stepsCompleted,
|
|
104
|
+
totalSteps: workflow.steps.length,
|
|
105
|
+
duration: totalDuration,
|
|
106
|
+
results: this.results,
|
|
107
|
+
timestamp: new Date().toISOString(),
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
} catch (error) {
|
|
111
|
+
this.status = 'error';
|
|
112
|
+
hasError = true;
|
|
113
|
+
|
|
114
|
+
return {
|
|
115
|
+
success: false,
|
|
116
|
+
workflowName: workflow.name,
|
|
117
|
+
stepsCompleted,
|
|
118
|
+
totalSteps: workflow.steps.length,
|
|
119
|
+
error: error.message,
|
|
120
|
+
results: this.results,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Execute a single step (stub implementation)
|
|
127
|
+
*
|
|
128
|
+
* @private
|
|
129
|
+
* @param {Object} step - Step configuration
|
|
130
|
+
* @returns {Promise<Object>} Step result
|
|
131
|
+
*/
|
|
132
|
+
async _executeStep(step) {
|
|
133
|
+
// Simulate async execution
|
|
134
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
status: 'completed',
|
|
138
|
+
action: step.action,
|
|
139
|
+
output: `Result of ${step.action}`,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Get current execution status
|
|
145
|
+
*
|
|
146
|
+
* @returns {Object} Status information
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* const status = executor.getExecutionStatus();
|
|
150
|
+
* console.log(status.status); // 'idle' | 'running' | 'paused' | 'completed' | 'error'
|
|
151
|
+
*/
|
|
152
|
+
getExecutionStatus() {
|
|
153
|
+
return {
|
|
154
|
+
status: this.status,
|
|
155
|
+
currentWorkflow: this.currentWorkflow?.name || null,
|
|
156
|
+
stepsCompleted: this.results.length,
|
|
157
|
+
totalSteps: this.currentWorkflow?.steps?.length || 0,
|
|
158
|
+
isPaused: this.isPaused,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Pause workflow execution
|
|
164
|
+
*
|
|
165
|
+
* @returns {void}
|
|
166
|
+
*
|
|
167
|
+
* @example
|
|
168
|
+
* executor.pause();
|
|
169
|
+
*/
|
|
170
|
+
pause() {
|
|
171
|
+
if (this.status === 'running') {
|
|
172
|
+
this.isPaused = true;
|
|
173
|
+
this.status = 'paused';
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Resume workflow execution
|
|
179
|
+
*
|
|
180
|
+
* @returns {void}
|
|
181
|
+
*
|
|
182
|
+
* @example
|
|
183
|
+
* executor.resume();
|
|
184
|
+
*/
|
|
185
|
+
resume() {
|
|
186
|
+
if (this.status === 'paused') {
|
|
187
|
+
this.isPaused = false;
|
|
188
|
+
this.status = 'running';
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Get workflow execution results
|
|
194
|
+
*
|
|
195
|
+
* @returns {Array<Object>} Array of step results
|
|
196
|
+
*
|
|
197
|
+
* @example
|
|
198
|
+
* const results = executor.getResults();
|
|
199
|
+
* results.forEach(result => {
|
|
200
|
+
* console.log(`Step ${result.stepId}: ${result.result.status}`);
|
|
201
|
+
* });
|
|
202
|
+
*/
|
|
203
|
+
getResults() {
|
|
204
|
+
return [...this.results];
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Reset executor to initial state
|
|
209
|
+
*
|
|
210
|
+
* @returns {void}
|
|
211
|
+
*/
|
|
212
|
+
reset() {
|
|
213
|
+
this.currentWorkflow = null;
|
|
214
|
+
this.status = 'idle';
|
|
215
|
+
this.results = [];
|
|
216
|
+
this.isPaused = false;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
module.exports = { WorkflowExecutor };
|
package/src/index.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BYAN v2.0 - Entry Point
|
|
3
|
+
*
|
|
4
|
+
* Architecture 4 Pilliers:
|
|
5
|
+
* - Agent: Expertise (modèles puissants)
|
|
6
|
+
* - Context: State management hiérarchique
|
|
7
|
+
* - Workflow: Orchestration déclarative
|
|
8
|
+
* - Worker: Exécution simple (modèles légers)
|
|
9
|
+
*
|
|
10
|
+
* @module byan-v2
|
|
11
|
+
* @version 2.0.0-alpha.1
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
// Core Components
|
|
15
|
+
const ContextLayer = require('./core/context/context');
|
|
16
|
+
const SimpleCache = require('./core/cache/cache');
|
|
17
|
+
const EconomicDispatcher = require('./core/dispatcher/dispatcher');
|
|
18
|
+
const { WorkerPool, Worker } = require('./core/worker-pool/worker-pool');
|
|
19
|
+
const { WorkflowExecutor } = require('./core/workflow/workflow-executor');
|
|
20
|
+
|
|
21
|
+
// Observability Components
|
|
22
|
+
const { StructuredLogger } = require('./observability/logger/structured-logger');
|
|
23
|
+
const { MetricsCollector } = require('./observability/metrics/metrics-collector');
|
|
24
|
+
const { printDashboard, generateSummary } = require('./observability/dashboard/dashboard');
|
|
25
|
+
|
|
26
|
+
// Dashboard wrapper class for easy integration
|
|
27
|
+
class Dashboard {
|
|
28
|
+
constructor(metrics, logger = null, workerPool = null) {
|
|
29
|
+
this.metrics = metrics;
|
|
30
|
+
this.logger = logger;
|
|
31
|
+
this.workerPool = workerPool;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
render() {
|
|
35
|
+
return printDashboard({
|
|
36
|
+
metrics: this.metrics.getMetrics(),
|
|
37
|
+
logs: this.logger ? this.logger.getLogs() : [],
|
|
38
|
+
workers: this.workerPool ? this.workerPool.workers.map((w, i) => ({ id: w.id, status: w.status })) : [],
|
|
39
|
+
status: { version: '2.0.0-alpha.1' }
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
renderSummary() {
|
|
44
|
+
return generateSummary({
|
|
45
|
+
metrics: this.metrics.getStats ? this.metrics.getStats() : {},
|
|
46
|
+
logs: this.logger ? this.logger.getStats() : {}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Factory function pour initialiser BYAN v2.0
|
|
53
|
+
*
|
|
54
|
+
* @param {Object} [options={}] - Options de configuration
|
|
55
|
+
* @param {number} [options.workerCount=2] - Nombre de workers
|
|
56
|
+
* @param {number} [options.cacheMaxSize=50] - Taille max cache (MB)
|
|
57
|
+
* @param {Object} [options.loggerOptions] - Options pour logger
|
|
58
|
+
* @returns {Object} Instance BYAN v2.0 configurée
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* const byan = createByanInstance({ workerCount: 2 });
|
|
62
|
+
* await byan.executeWorkflow('_byan/workflows/create-agent/workflow.yaml');
|
|
63
|
+
*/
|
|
64
|
+
function createByanInstance(options = {}) {
|
|
65
|
+
const {
|
|
66
|
+
workerCount = 2,
|
|
67
|
+
cacheMaxSize = 50,
|
|
68
|
+
loggerOptions = {}
|
|
69
|
+
} = options;
|
|
70
|
+
|
|
71
|
+
// Initialize core components
|
|
72
|
+
const cache = new SimpleCache({ maxSizeMB: cacheMaxSize });
|
|
73
|
+
const contextLayer = new ContextLayer(); // Note: Current implementation doesn't use cache yet
|
|
74
|
+
const logger = new StructuredLogger(loggerOptions);
|
|
75
|
+
const metrics = new MetricsCollector();
|
|
76
|
+
const workerPool = new WorkerPool(workerCount);
|
|
77
|
+
const dashboard = new Dashboard(metrics, logger, workerPool);
|
|
78
|
+
const dispatcher = new EconomicDispatcher(workerPool);
|
|
79
|
+
const workflowExecutor = new WorkflowExecutor(contextLayer, dispatcher, logger);
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
// Core
|
|
83
|
+
contextLayer,
|
|
84
|
+
cache,
|
|
85
|
+
dispatcher,
|
|
86
|
+
workerPool,
|
|
87
|
+
workflowExecutor,
|
|
88
|
+
|
|
89
|
+
// Observability
|
|
90
|
+
logger,
|
|
91
|
+
metrics,
|
|
92
|
+
dashboard,
|
|
93
|
+
|
|
94
|
+
// Convenience methods
|
|
95
|
+
async executeWorkflow(workflowPath, contextId = null) {
|
|
96
|
+
let context = {};
|
|
97
|
+
if (contextId) {
|
|
98
|
+
context = await contextLayer.loadContext('story', contextId);
|
|
99
|
+
}
|
|
100
|
+
return workflowExecutor.execute(workflowPath, context);
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
async loadContext(level, id = null) {
|
|
104
|
+
return contextLayer.loadContext(level, id);
|
|
105
|
+
},
|
|
106
|
+
|
|
107
|
+
getMetrics() {
|
|
108
|
+
return metrics.getMetrics();
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
showDashboard() {
|
|
112
|
+
return dashboard.render();
|
|
113
|
+
},
|
|
114
|
+
|
|
115
|
+
async shutdown() {
|
|
116
|
+
await workerPool.shutdown();
|
|
117
|
+
logger.info('BYAN v2.0 shutdown complete');
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Named exports (pour usage avancé)
|
|
123
|
+
module.exports = {
|
|
124
|
+
// Factory
|
|
125
|
+
createByanInstance,
|
|
126
|
+
|
|
127
|
+
// Core Components
|
|
128
|
+
ContextLayer,
|
|
129
|
+
SimpleCache,
|
|
130
|
+
EconomicDispatcher,
|
|
131
|
+
WorkerPool,
|
|
132
|
+
Worker,
|
|
133
|
+
WorkflowExecutor,
|
|
134
|
+
|
|
135
|
+
// Observability
|
|
136
|
+
StructuredLogger,
|
|
137
|
+
MetricsCollector,
|
|
138
|
+
Dashboard
|
|
139
|
+
};
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard for BYAN v2.0
|
|
3
|
+
* Provides formatted console output for system status, metrics, and logs
|
|
4
|
+
*
|
|
5
|
+
* @module observability/dashboard/dashboard
|
|
6
|
+
* @version 2.0.0-HYPER-MVP
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Print dashboard to console with formatted output
|
|
11
|
+
*
|
|
12
|
+
* @param {Object} data - Dashboard data
|
|
13
|
+
* @param {Object} [data.metrics={}] - Metrics from MetricsCollector
|
|
14
|
+
* @param {Array} [data.logs=[]] - Recent logs from StructuredLogger
|
|
15
|
+
* @param {Array} [data.workers=[]] - Active workers
|
|
16
|
+
* @param {Object} [data.status={}] - System status
|
|
17
|
+
* @returns {string} Formatted dashboard output
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const output = printDashboard({
|
|
21
|
+
* metrics: metricsCollector.getMetrics(),
|
|
22
|
+
* logs: logger.getLogs().slice(-5),
|
|
23
|
+
* workers: pool.getActiveWorkers(),
|
|
24
|
+
* status: { uptime: 3600, version: '2.0.0' }
|
|
25
|
+
* });
|
|
26
|
+
* console.log(output);
|
|
27
|
+
*/
|
|
28
|
+
function printDashboard(data = {}) {
|
|
29
|
+
// Handle null data
|
|
30
|
+
if (!data) {
|
|
31
|
+
data = {};
|
|
32
|
+
}
|
|
33
|
+
const { metrics = {}, logs = [], workers = [], status = {} } = data;
|
|
34
|
+
|
|
35
|
+
const lines = [];
|
|
36
|
+
|
|
37
|
+
// Header
|
|
38
|
+
lines.push('╔═══════════════════════════════════════════════════════════╗');
|
|
39
|
+
lines.push('║ BYAN v2.0 Dashboard ║');
|
|
40
|
+
lines.push('╚═══════════════════════════════════════════════════════════╝');
|
|
41
|
+
lines.push('');
|
|
42
|
+
|
|
43
|
+
// Status Section
|
|
44
|
+
lines.push('┌─ Status ──────────────────────────────────────────────────┐');
|
|
45
|
+
if (Object.keys(status).length > 0) {
|
|
46
|
+
Object.entries(status).forEach(([key, value]) => {
|
|
47
|
+
lines.push(`│ ${_padRight(key, 15)}: ${value}`);
|
|
48
|
+
});
|
|
49
|
+
} else {
|
|
50
|
+
lines.push('│ No status information available');
|
|
51
|
+
}
|
|
52
|
+
lines.push('└───────────────────────────────────────────────────────────┘');
|
|
53
|
+
lines.push('');
|
|
54
|
+
|
|
55
|
+
// Metrics Section
|
|
56
|
+
lines.push('┌─ Metrics ─────────────────────────────────────────────────┐');
|
|
57
|
+
const metricsArray = Object.entries(metrics);
|
|
58
|
+
if (metricsArray.length > 0) {
|
|
59
|
+
metricsArray.slice(0, 10).forEach(([key, metric]) => {
|
|
60
|
+
const displayKey = key.length > 30 ? key.substring(0, 27) + '...' : key;
|
|
61
|
+
const displayValue = _formatMetricValue(metric.value);
|
|
62
|
+
lines.push(`│ ${_padRight(displayKey, 30)}: ${displayValue}`);
|
|
63
|
+
});
|
|
64
|
+
if (metricsArray.length > 10) {
|
|
65
|
+
lines.push(`│ ... and ${metricsArray.length - 10} more metrics`);
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
lines.push('│ No metrics available');
|
|
69
|
+
}
|
|
70
|
+
lines.push('└───────────────────────────────────────────────────────────┘');
|
|
71
|
+
lines.push('');
|
|
72
|
+
|
|
73
|
+
// Recent Logs Section
|
|
74
|
+
lines.push('┌─ Recent Logs ─────────────────────────────────────────────┐');
|
|
75
|
+
if (logs.length > 0) {
|
|
76
|
+
logs.slice(-5).forEach((log) => {
|
|
77
|
+
const level = _padRight(`[${log.level.toUpperCase()}]`, 8);
|
|
78
|
+
const message = log.message.length > 40 ? log.message.substring(0, 37) + '...' : log.message;
|
|
79
|
+
lines.push(`│ ${level} ${message}`);
|
|
80
|
+
});
|
|
81
|
+
} else {
|
|
82
|
+
lines.push('│ No recent logs');
|
|
83
|
+
}
|
|
84
|
+
lines.push('└───────────────────────────────────────────────────────────┘');
|
|
85
|
+
lines.push('');
|
|
86
|
+
|
|
87
|
+
// Workers Section
|
|
88
|
+
lines.push('┌─ Workers ─────────────────────────────────────────────────┐');
|
|
89
|
+
if (workers.length > 0) {
|
|
90
|
+
workers.forEach((worker) => {
|
|
91
|
+
const id = _padRight(`Worker ${worker.id}`, 15);
|
|
92
|
+
const status = worker.status || 'unknown';
|
|
93
|
+
lines.push(`│ ${id}: ${status}`);
|
|
94
|
+
});
|
|
95
|
+
} else {
|
|
96
|
+
lines.push('│ No active workers');
|
|
97
|
+
}
|
|
98
|
+
lines.push('└───────────────────────────────────────────────────────────┘');
|
|
99
|
+
|
|
100
|
+
return lines.join('\n');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Pad string to right with spaces
|
|
105
|
+
*
|
|
106
|
+
* @private
|
|
107
|
+
* @param {string} str - String to pad
|
|
108
|
+
* @param {number} length - Target length
|
|
109
|
+
* @returns {string} Padded string
|
|
110
|
+
*/
|
|
111
|
+
function _padRight(str, length) {
|
|
112
|
+
const s = String(str);
|
|
113
|
+
return s.length >= length ? s : s + ' '.repeat(length - s.length);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Format metric value for display
|
|
118
|
+
*
|
|
119
|
+
* @private
|
|
120
|
+
* @param {number} value - Metric value
|
|
121
|
+
* @returns {string} Formatted value
|
|
122
|
+
*/
|
|
123
|
+
function _formatMetricValue(value) {
|
|
124
|
+
if (typeof value !== 'number') {
|
|
125
|
+
return String(value);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Format large numbers with separators
|
|
129
|
+
if (value >= 1000) {
|
|
130
|
+
return value.toLocaleString();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Format decimals
|
|
134
|
+
if (value % 1 !== 0) {
|
|
135
|
+
return value.toFixed(2);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
return String(value);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Generate summary dashboard
|
|
143
|
+
*
|
|
144
|
+
* @param {Object} data - Dashboard data
|
|
145
|
+
* @returns {string} Summary output
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* const summary = generateSummary({
|
|
149
|
+
* metrics: metricsCollector.getStats(),
|
|
150
|
+
* logs: logger.getStats()
|
|
151
|
+
* });
|
|
152
|
+
*/
|
|
153
|
+
function generateSummary(data = {}) {
|
|
154
|
+
// Handle null data
|
|
155
|
+
if (!data) {
|
|
156
|
+
data = {};
|
|
157
|
+
}
|
|
158
|
+
const { metrics = {}, logs = {} } = data;
|
|
159
|
+
|
|
160
|
+
const lines = [];
|
|
161
|
+
|
|
162
|
+
lines.push('═══ BYAN v2.0 Summary ═══');
|
|
163
|
+
lines.push('');
|
|
164
|
+
|
|
165
|
+
if (metrics.total !== undefined) {
|
|
166
|
+
lines.push(`Metrics: ${metrics.total} total`);
|
|
167
|
+
if (metrics.byType) {
|
|
168
|
+
Object.entries(metrics.byType).forEach(([type, count]) => {
|
|
169
|
+
lines.push(` - ${type}: ${count}`);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
lines.push('');
|
|
175
|
+
|
|
176
|
+
if (logs.debug !== undefined || logs.info !== undefined) {
|
|
177
|
+
const totalLogs = (logs.debug || 0) + (logs.info || 0) + (logs.warn || 0) + (logs.error || 0);
|
|
178
|
+
lines.push(`Logs: ${totalLogs} total`);
|
|
179
|
+
lines.push(` - debug: ${logs.debug || 0}`);
|
|
180
|
+
lines.push(` - info: ${logs.info || 0}`);
|
|
181
|
+
lines.push(` - warn: ${logs.warn || 0}`);
|
|
182
|
+
lines.push(` - error: ${logs.error || 0}`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return lines.join('\n');
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
module.exports = {
|
|
189
|
+
printDashboard,
|
|
190
|
+
generateSummary,
|
|
191
|
+
};
|