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,325 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Collector for BYAN v2.0
|
|
3
|
+
* Collects and manages system metrics (counters, gauges, timings)
|
|
4
|
+
*
|
|
5
|
+
* @module observability/metrics/metrics-collector
|
|
6
|
+
* @version 2.0.0-HYPER-MVP
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Metrics Collector - Records and tracks system metrics
|
|
11
|
+
*
|
|
12
|
+
* @class MetricsCollector
|
|
13
|
+
* @example
|
|
14
|
+
* const metrics = new MetricsCollector();
|
|
15
|
+
* metrics.increment('api.calls', { endpoint: '/chat' });
|
|
16
|
+
* metrics.recordDuration('request.duration', 150);
|
|
17
|
+
*/
|
|
18
|
+
class MetricsCollector {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.metrics = new Map();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Record a metric with a specific value
|
|
25
|
+
*
|
|
26
|
+
* @param {string} name - Metric name
|
|
27
|
+
* @param {number} value - Metric value
|
|
28
|
+
* @param {Object} [tags={}] - Optional tags for filtering
|
|
29
|
+
* @returns {void}
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* metrics.recordMetric('memory.usage', 1024, { unit: 'MB', service: 'api' });
|
|
33
|
+
*/
|
|
34
|
+
recordMetric(name, value, tags = {}) {
|
|
35
|
+
if (!name || typeof name !== 'string') {
|
|
36
|
+
throw new Error('Metric name must be a non-empty string');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (typeof value !== 'number') {
|
|
40
|
+
throw new Error('Metric value must be a number');
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (isNaN(value)) {
|
|
44
|
+
throw new Error('Metric value cannot be NaN');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const key = this._generateKey(name, tags);
|
|
48
|
+
|
|
49
|
+
this.metrics.set(key, {
|
|
50
|
+
name,
|
|
51
|
+
value,
|
|
52
|
+
tags: { ...tags },
|
|
53
|
+
timestamp: new Date().toISOString(),
|
|
54
|
+
type: 'gauge',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Increment a counter metric
|
|
60
|
+
*
|
|
61
|
+
* @param {string} name - Metric name
|
|
62
|
+
* @param {Object} [tags={}] - Optional tags
|
|
63
|
+
* @param {number} [delta=1] - Increment amount
|
|
64
|
+
* @returns {void}
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* metrics.increment('api.calls', { endpoint: '/chat' });
|
|
68
|
+
* metrics.increment('cache.hits', {}, 5); // Increment by 5
|
|
69
|
+
*/
|
|
70
|
+
increment(name, tags = {}, delta = 1) {
|
|
71
|
+
if (!name || typeof name !== 'string') {
|
|
72
|
+
throw new Error('Metric name must be a non-empty string');
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (typeof delta !== 'number') {
|
|
76
|
+
throw new Error('Delta must be a number');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const key = this._generateKey(name, tags);
|
|
80
|
+
const existing = this.metrics.get(key);
|
|
81
|
+
|
|
82
|
+
if (existing) {
|
|
83
|
+
this.metrics.set(key, {
|
|
84
|
+
...existing,
|
|
85
|
+
value: existing.value + delta,
|
|
86
|
+
timestamp: new Date().toISOString(),
|
|
87
|
+
});
|
|
88
|
+
} else {
|
|
89
|
+
this.metrics.set(key, {
|
|
90
|
+
name,
|
|
91
|
+
value: delta,
|
|
92
|
+
tags: { ...tags },
|
|
93
|
+
timestamp: new Date().toISOString(),
|
|
94
|
+
type: 'counter',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Decrement a counter metric
|
|
101
|
+
*
|
|
102
|
+
* @param {string} name - Metric name
|
|
103
|
+
* @param {Object} [tags={}] - Optional tags
|
|
104
|
+
* @param {number} [delta=1] - Decrement amount
|
|
105
|
+
* @returns {void}
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* metrics.decrement('active.connections', { server: 'main' });
|
|
109
|
+
*/
|
|
110
|
+
decrement(name, tags = {}, delta = 1) {
|
|
111
|
+
this.increment(name, tags, -delta);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Record a duration/timing metric
|
|
116
|
+
*
|
|
117
|
+
* @param {string} name - Metric name
|
|
118
|
+
* @param {number} durationMs - Duration in milliseconds
|
|
119
|
+
* @param {Object} [tags={}] - Optional tags
|
|
120
|
+
* @returns {void}
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* metrics.recordDuration('request.duration', 150, { status: '200' });
|
|
124
|
+
*/
|
|
125
|
+
recordDuration(name, durationMs, tags = {}) {
|
|
126
|
+
if (!name || typeof name !== 'string') {
|
|
127
|
+
throw new Error('Metric name must be a non-empty string');
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (typeof durationMs !== 'number') {
|
|
131
|
+
throw new Error('Duration must be a number');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (durationMs < 0) {
|
|
135
|
+
throw new Error('Duration cannot be negative');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const key = this._generateKey(name, tags);
|
|
139
|
+
|
|
140
|
+
this.metrics.set(key, {
|
|
141
|
+
name,
|
|
142
|
+
value: durationMs,
|
|
143
|
+
tags: { ...tags },
|
|
144
|
+
timestamp: new Date().toISOString(),
|
|
145
|
+
type: 'timing',
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Generate unique key for metric with tags
|
|
151
|
+
*
|
|
152
|
+
* @private
|
|
153
|
+
* @param {string} name - Metric name
|
|
154
|
+
* @param {Object} tags - Tags
|
|
155
|
+
* @returns {string} Unique key
|
|
156
|
+
*/
|
|
157
|
+
_generateKey(name, tags) {
|
|
158
|
+
if (Object.keys(tags).length === 0) {
|
|
159
|
+
return name;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const sortedTags = Object.keys(tags)
|
|
163
|
+
.sort()
|
|
164
|
+
.map((key) => `${key}:${tags[key]}`)
|
|
165
|
+
.join(',');
|
|
166
|
+
|
|
167
|
+
return `${name}[${sortedTags}]`;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Get all metrics
|
|
172
|
+
*
|
|
173
|
+
* @returns {Object} All metrics as key-value pairs
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* const allMetrics = metrics.getMetrics();
|
|
177
|
+
* Object.entries(allMetrics).forEach(([key, metric]) => {
|
|
178
|
+
* console.log(`${key}: ${metric.value}`);
|
|
179
|
+
* });
|
|
180
|
+
*/
|
|
181
|
+
getMetrics() {
|
|
182
|
+
const result = {};
|
|
183
|
+
|
|
184
|
+
for (const [key, value] of this.metrics.entries()) {
|
|
185
|
+
result[key] = { ...value };
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return result;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Get a specific metric
|
|
193
|
+
*
|
|
194
|
+
* @param {string} name - Metric name
|
|
195
|
+
* @param {Object} [tags={}] - Optional tags
|
|
196
|
+
* @returns {Object|null} Metric or null if not found
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* const apiCalls = metrics.getMetric('api.calls', { endpoint: '/chat' });
|
|
200
|
+
* console.log(`API calls: ${apiCalls.value}`);
|
|
201
|
+
*/
|
|
202
|
+
getMetric(name, tags = {}) {
|
|
203
|
+
const key = this._generateKey(name, tags);
|
|
204
|
+
const metric = this.metrics.get(key);
|
|
205
|
+
|
|
206
|
+
return metric ? { ...metric } : null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Get metrics filtered by name prefix
|
|
211
|
+
*
|
|
212
|
+
* @param {string} prefix - Name prefix
|
|
213
|
+
* @returns {Object} Filtered metrics
|
|
214
|
+
*
|
|
215
|
+
* @example
|
|
216
|
+
* const apiMetrics = metrics.getMetricsByPrefix('api.');
|
|
217
|
+
* // Returns all metrics starting with 'api.'
|
|
218
|
+
*/
|
|
219
|
+
getMetricsByPrefix(prefix) {
|
|
220
|
+
const result = {};
|
|
221
|
+
|
|
222
|
+
for (const [key, value] of this.metrics.entries()) {
|
|
223
|
+
if (value.name.startsWith(prefix)) {
|
|
224
|
+
result[key] = { ...value };
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return result;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Get metrics filtered by type
|
|
233
|
+
*
|
|
234
|
+
* @param {string} type - Metric type (gauge, counter, timing)
|
|
235
|
+
* @returns {Object} Filtered metrics
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* const counters = metrics.getMetricsByType('counter');
|
|
239
|
+
*/
|
|
240
|
+
getMetricsByType(type) {
|
|
241
|
+
const result = {};
|
|
242
|
+
|
|
243
|
+
for (const [key, value] of this.metrics.entries()) {
|
|
244
|
+
if (value.type === type) {
|
|
245
|
+
result[key] = { ...value };
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Clear all metrics
|
|
254
|
+
*
|
|
255
|
+
* @returns {void}
|
|
256
|
+
*
|
|
257
|
+
* @example
|
|
258
|
+
* metrics.clear(); // Remove all metrics
|
|
259
|
+
*/
|
|
260
|
+
clear() {
|
|
261
|
+
this.metrics.clear();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Get metrics count
|
|
266
|
+
*
|
|
267
|
+
* @returns {number} Number of metrics
|
|
268
|
+
*/
|
|
269
|
+
count() {
|
|
270
|
+
return this.metrics.size;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Reset a specific metric to zero
|
|
275
|
+
*
|
|
276
|
+
* @param {string} name - Metric name
|
|
277
|
+
* @param {Object} [tags={}] - Optional tags
|
|
278
|
+
* @returns {boolean} True if metric was reset, false if not found
|
|
279
|
+
*
|
|
280
|
+
* @example
|
|
281
|
+
* metrics.resetMetric('api.calls', { endpoint: '/chat' });
|
|
282
|
+
*/
|
|
283
|
+
resetMetric(name, tags = {}) {
|
|
284
|
+
const key = this._generateKey(name, tags);
|
|
285
|
+
const existing = this.metrics.get(key);
|
|
286
|
+
|
|
287
|
+
if (existing) {
|
|
288
|
+
this.metrics.set(key, {
|
|
289
|
+
...existing,
|
|
290
|
+
value: 0,
|
|
291
|
+
timestamp: new Date().toISOString(),
|
|
292
|
+
});
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Get summary statistics
|
|
301
|
+
*
|
|
302
|
+
* @returns {Object} Summary stats
|
|
303
|
+
*
|
|
304
|
+
* @example
|
|
305
|
+
* const stats = metrics.getStats();
|
|
306
|
+
* // { total: 10, byType: { counter: 5, gauge: 3, timing: 2 } }
|
|
307
|
+
*/
|
|
308
|
+
getStats() {
|
|
309
|
+
const byType = {};
|
|
310
|
+
|
|
311
|
+
for (const metric of this.metrics.values()) {
|
|
312
|
+
if (!byType[metric.type]) {
|
|
313
|
+
byType[metric.type] = 0;
|
|
314
|
+
}
|
|
315
|
+
byType[metric.type]++;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
return {
|
|
319
|
+
total: this.metrics.size,
|
|
320
|
+
byType,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
module.exports = { MetricsCollector };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Switch BYAN Installer to v2.0
|
|
3
|
+
# This script updates package.json to use the new v2.0 installer
|
|
4
|
+
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
RED='\033[0;31m'
|
|
8
|
+
GREEN='\033[0;32m'
|
|
9
|
+
YELLOW='\033[1;33m'
|
|
10
|
+
BLUE='\033[0;34m'
|
|
11
|
+
NC='\033[0m'
|
|
12
|
+
|
|
13
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
14
|
+
|
|
15
|
+
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
|
16
|
+
echo -e "${BLUE}║ Switch to BYAN v2.0 Installer ║${NC}"
|
|
17
|
+
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
|
|
18
|
+
echo ""
|
|
19
|
+
|
|
20
|
+
cd "${SCRIPT_DIR}"
|
|
21
|
+
|
|
22
|
+
# Check if package.json exists
|
|
23
|
+
if [ ! -f "package.json" ]; then
|
|
24
|
+
echo -e "${RED}✗ package.json not found in ${SCRIPT_DIR}${NC}"
|
|
25
|
+
exit 1
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
# Backup original
|
|
29
|
+
echo -e "${YELLOW}[1/4] Creating backup...${NC}"
|
|
30
|
+
cp package.json package.json.backup
|
|
31
|
+
echo -e "${GREEN}✓ Backup created: package.json.backup${NC}"
|
|
32
|
+
|
|
33
|
+
# Show current version
|
|
34
|
+
echo ""
|
|
35
|
+
echo -e "${YELLOW}[2/4] Current configuration:${NC}"
|
|
36
|
+
CURRENT_VERSION=$(grep '"version"' package.json | head -1 | cut -d'"' -f4)
|
|
37
|
+
CURRENT_BIN=$(grep '"create-byan-agent"' package.json | head -1 | cut -d'"' -f4)
|
|
38
|
+
echo " Version: ${CURRENT_VERSION}"
|
|
39
|
+
echo " Binary: ${CURRENT_BIN}"
|
|
40
|
+
|
|
41
|
+
# Update package.json
|
|
42
|
+
echo ""
|
|
43
|
+
echo -e "${YELLOW}[3/4] Updating to v2.0...${NC}"
|
|
44
|
+
|
|
45
|
+
# Use Node.js to safely update JSON
|
|
46
|
+
node -e "
|
|
47
|
+
const fs = require('fs');
|
|
48
|
+
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
|
|
49
|
+
|
|
50
|
+
// Update version
|
|
51
|
+
pkg.version = '2.0.0-alpha.1';
|
|
52
|
+
|
|
53
|
+
// Update description
|
|
54
|
+
pkg.description = 'NPX installer for BYAN v2.0 - Agent creators with v2.0 runtime support';
|
|
55
|
+
|
|
56
|
+
// Update bin
|
|
57
|
+
pkg.bin['create-byan-agent'] = 'bin/create-byan-agent-v2.js';
|
|
58
|
+
|
|
59
|
+
// Write back
|
|
60
|
+
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2) + '\n', 'utf8');
|
|
61
|
+
console.log('✓ package.json updated');
|
|
62
|
+
"
|
|
63
|
+
|
|
64
|
+
if [ $? -eq 0 ]; then
|
|
65
|
+
echo -e "${GREEN}✓ package.json updated successfully${NC}"
|
|
66
|
+
else
|
|
67
|
+
echo -e "${RED}✗ Failed to update package.json${NC}"
|
|
68
|
+
echo -e "${YELLOW}Restoring backup...${NC}"
|
|
69
|
+
mv package.json.backup package.json
|
|
70
|
+
exit 1
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# Verify changes
|
|
74
|
+
echo ""
|
|
75
|
+
echo -e "${YELLOW}[4/4] Verifying changes...${NC}"
|
|
76
|
+
NEW_VERSION=$(grep '"version"' package.json | head -1 | cut -d'"' -f4)
|
|
77
|
+
NEW_BIN=$(grep '"create-byan-agent"' package.json | head -1 | cut -d'"' -f4)
|
|
78
|
+
echo " New Version: ${NEW_VERSION}"
|
|
79
|
+
echo " New Binary: ${NEW_BIN}"
|
|
80
|
+
|
|
81
|
+
# Check if v2 installer exists
|
|
82
|
+
if [ -f "bin/create-byan-agent-v2.js" ]; then
|
|
83
|
+
echo -e "${GREEN}✓ v2.0 installer found${NC}"
|
|
84
|
+
else
|
|
85
|
+
echo -e "${RED}✗ v2.0 installer not found: bin/create-byan-agent-v2.js${NC}"
|
|
86
|
+
exit 1
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# Set executable permissions
|
|
90
|
+
chmod +x bin/create-byan-agent-v2.js
|
|
91
|
+
echo -e "${GREEN}✓ Executable permissions set${NC}"
|
|
92
|
+
|
|
93
|
+
# Summary
|
|
94
|
+
echo ""
|
|
95
|
+
echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}"
|
|
96
|
+
echo -e "${GREEN}║ ✅ Successfully switched to v2.0 installer ║${NC}"
|
|
97
|
+
echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}"
|
|
98
|
+
echo ""
|
|
99
|
+
|
|
100
|
+
echo -e "${BLUE}Changes made:${NC}"
|
|
101
|
+
echo " • Version: ${CURRENT_VERSION} → ${NEW_VERSION}"
|
|
102
|
+
echo " • Binary: ${CURRENT_BIN} → ${NEW_BIN}"
|
|
103
|
+
echo " • Backup: package.json.backup (preserved)"
|
|
104
|
+
echo ""
|
|
105
|
+
|
|
106
|
+
echo -e "${YELLOW}Next steps:${NC}"
|
|
107
|
+
echo " 1. Test the installer locally:"
|
|
108
|
+
echo " ${BLUE}cd /tmp && mkdir test-project && cd test-project && git init${NC}"
|
|
109
|
+
echo " ${BLUE}node ${SCRIPT_DIR}/bin/create-byan-agent-v2.js${NC}"
|
|
110
|
+
echo ""
|
|
111
|
+
echo " 2. Commit the changes:"
|
|
112
|
+
echo " ${BLUE}git add package.json${NC}"
|
|
113
|
+
echo " ${BLUE}git commit -m 'feat: upgrade to BYAN v2.0 installer'${NC}"
|
|
114
|
+
echo ""
|
|
115
|
+
echo " 3. Publish to npm (alpha):"
|
|
116
|
+
echo " ${BLUE}npm publish --tag alpha${NC}"
|
|
117
|
+
echo ""
|
|
118
|
+
echo " 4. Test installation:"
|
|
119
|
+
echo " ${BLUE}npx create-byan-agent@alpha${NC}"
|
|
120
|
+
echo ""
|
|
121
|
+
|
|
122
|
+
echo -e "${YELLOW}To rollback:${NC}"
|
|
123
|
+
echo " ${BLUE}cp package.json.backup package.json${NC}"
|
|
124
|
+
echo ""
|
|
125
|
+
|
|
126
|
+
echo -e "${GREEN}Ready to deploy! 🚀${NC}"
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Test script for create-byan-agent
|
|
3
|
+
# Tests the fixed Chalk compatibility
|
|
4
|
+
|
|
5
|
+
set -e # Exit on error
|
|
6
|
+
|
|
7
|
+
echo "🧪 Testing create-byan-agent installer..."
|
|
8
|
+
echo ""
|
|
9
|
+
|
|
10
|
+
# Colors
|
|
11
|
+
GREEN='\033[0;32m'
|
|
12
|
+
RED='\033[0;31m'
|
|
13
|
+
BLUE='\033[0;34m'
|
|
14
|
+
NC='\033[0m' # No Color
|
|
15
|
+
|
|
16
|
+
# Test directory
|
|
17
|
+
TEST_DIR="/tmp/byan-test-$(date +%s)"
|
|
18
|
+
INSTALL_DIR="/home/yan/conception/install"
|
|
19
|
+
|
|
20
|
+
# Clean up function
|
|
21
|
+
cleanup() {
|
|
22
|
+
echo ""
|
|
23
|
+
echo "🧹 Cleaning up..."
|
|
24
|
+
rm -rf "$TEST_DIR"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
trap cleanup EXIT
|
|
28
|
+
|
|
29
|
+
# Create test directory
|
|
30
|
+
echo "📁 Creating test directory: $TEST_DIR"
|
|
31
|
+
mkdir -p "$TEST_DIR"
|
|
32
|
+
cd "$TEST_DIR"
|
|
33
|
+
|
|
34
|
+
# Test 1: Check dependencies
|
|
35
|
+
echo ""
|
|
36
|
+
echo "📦 Test 1: Checking package.json dependencies..."
|
|
37
|
+
cd "$INSTALL_DIR"
|
|
38
|
+
|
|
39
|
+
CHALK_VERSION=$(node -p "require('./package.json').dependencies.chalk")
|
|
40
|
+
INQUIRER_VERSION=$(node -p "require('./package.json').dependencies.inquirer")
|
|
41
|
+
ORA_VERSION=$(node -p "require('./package.json').dependencies.ora")
|
|
42
|
+
|
|
43
|
+
echo " • chalk: $CHALK_VERSION"
|
|
44
|
+
echo " • inquirer: $INQUIRER_VERSION"
|
|
45
|
+
echo " • ora: $ORA_VERSION"
|
|
46
|
+
|
|
47
|
+
if [[ "$CHALK_VERSION" == "^4.1.2" ]]; then
|
|
48
|
+
echo -e "${GREEN}✅ Chalk version correct (CommonJS compatible)${NC}"
|
|
49
|
+
else
|
|
50
|
+
echo -e "${RED}❌ Chalk version incorrect: $CHALK_VERSION${NC}"
|
|
51
|
+
exit 1
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
if [[ "$INQUIRER_VERSION" == "^8.2.5" ]]; then
|
|
55
|
+
echo -e "${GREEN}✅ Inquirer version correct (CommonJS compatible)${NC}"
|
|
56
|
+
else
|
|
57
|
+
echo -e "${RED}❌ Inquirer version incorrect: $INQUIRER_VERSION${NC}"
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
if [[ "$ORA_VERSION" == "^5.4.1" ]]; then
|
|
62
|
+
echo -e "${GREEN}✅ Ora version correct (CommonJS compatible)${NC}"
|
|
63
|
+
else
|
|
64
|
+
echo -e "${RED}❌ Ora version incorrect: $ORA_VERSION${NC}"
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
# Test 2: Check node_modules
|
|
69
|
+
echo ""
|
|
70
|
+
echo "📚 Test 2: Checking installed packages..."
|
|
71
|
+
|
|
72
|
+
if [ -d "$INSTALL_DIR/node_modules/chalk" ]; then
|
|
73
|
+
INSTALLED_CHALK=$(node -p "require('$INSTALL_DIR/node_modules/chalk/package.json').version")
|
|
74
|
+
echo " • Installed chalk: v$INSTALLED_CHALK"
|
|
75
|
+
|
|
76
|
+
if [[ "$INSTALLED_CHALK" =~ ^4\. ]]; then
|
|
77
|
+
echo -e "${GREEN}✅ Chalk v4.x installed${NC}"
|
|
78
|
+
else
|
|
79
|
+
echo -e "${RED}❌ Wrong chalk version installed: v$INSTALLED_CHALK${NC}"
|
|
80
|
+
exit 1
|
|
81
|
+
fi
|
|
82
|
+
else
|
|
83
|
+
echo -e "${RED}❌ Chalk not installed${NC}"
|
|
84
|
+
exit 1
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# Test 3: Version flag
|
|
88
|
+
echo ""
|
|
89
|
+
echo "🏷️ Test 3: Testing --version flag..."
|
|
90
|
+
VERSION_OUTPUT=$(node "$INSTALL_DIR/bin/create-byan-agent.js" --version 2>&1)
|
|
91
|
+
echo " Output: $VERSION_OUTPUT"
|
|
92
|
+
|
|
93
|
+
if [[ "$VERSION_OUTPUT" == "1.0.0" ]]; then
|
|
94
|
+
echo -e "${GREEN}✅ Version command works${NC}"
|
|
95
|
+
else
|
|
96
|
+
echo -e "${RED}❌ Version command failed${NC}"
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
# Test 4: Help flag
|
|
101
|
+
echo ""
|
|
102
|
+
echo "❓ Test 4: Testing --help flag..."
|
|
103
|
+
HELP_OUTPUT=$(node "$INSTALL_DIR/bin/create-byan-agent.js" --help 2>&1)
|
|
104
|
+
|
|
105
|
+
if echo "$HELP_OUTPUT" | grep -q "Install BYAN"; then
|
|
106
|
+
echo -e "${GREEN}✅ Help command works${NC}"
|
|
107
|
+
else
|
|
108
|
+
echo -e "${RED}❌ Help command failed${NC}"
|
|
109
|
+
echo "$HELP_OUTPUT"
|
|
110
|
+
exit 1
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
# Test 5: Chalk import works
|
|
114
|
+
echo ""
|
|
115
|
+
echo "🎨 Test 5: Testing Chalk import in script..."
|
|
116
|
+
TEST_CHALK_SCRIPT="$TEST_DIR/test-chalk.js"
|
|
117
|
+
|
|
118
|
+
cat > "$TEST_CHALK_SCRIPT" << 'EOF'
|
|
119
|
+
const chalk = require('chalk');
|
|
120
|
+
|
|
121
|
+
// Test that chalk methods exist and are functions
|
|
122
|
+
const tests = [
|
|
123
|
+
{ name: 'chalk.blue', fn: chalk.blue },
|
|
124
|
+
{ name: 'chalk.green', fn: chalk.green },
|
|
125
|
+
{ name: 'chalk.red', fn: chalk.red },
|
|
126
|
+
{ name: 'chalk.yellow', fn: chalk.yellow },
|
|
127
|
+
{ name: 'chalk.gray', fn: chalk.gray },
|
|
128
|
+
{ name: 'chalk.bold', fn: chalk.bold }
|
|
129
|
+
];
|
|
130
|
+
|
|
131
|
+
let allPass = true;
|
|
132
|
+
|
|
133
|
+
tests.forEach(test => {
|
|
134
|
+
if (typeof test.fn !== 'function') {
|
|
135
|
+
console.error(`❌ ${test.name} is not a function`);
|
|
136
|
+
allPass = false;
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
if (allPass) {
|
|
141
|
+
console.log('✅ All chalk methods are functions');
|
|
142
|
+
console.log(chalk.blue('✅ Chalk.blue works!'));
|
|
143
|
+
console.log(chalk.green('✅ Chalk.green works!'));
|
|
144
|
+
console.log(chalk.bold('✅ Chalk.bold works!'));
|
|
145
|
+
} else {
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
EOF
|
|
149
|
+
|
|
150
|
+
cd "$TEST_DIR"
|
|
151
|
+
npm init -y > /dev/null 2>&1
|
|
152
|
+
npm install chalk@4.1.2 > /dev/null 2>&1
|
|
153
|
+
|
|
154
|
+
CHALK_TEST_OUTPUT=$(node "$TEST_CHALK_SCRIPT" 2>&1)
|
|
155
|
+
echo "$CHALK_TEST_OUTPUT"
|
|
156
|
+
|
|
157
|
+
if echo "$CHALK_TEST_OUTPUT" | grep -q "All chalk methods are functions"; then
|
|
158
|
+
echo -e "${GREEN}✅ Chalk import and methods work correctly${NC}"
|
|
159
|
+
else
|
|
160
|
+
echo -e "${RED}❌ Chalk import failed${NC}"
|
|
161
|
+
exit 1
|
|
162
|
+
fi
|
|
163
|
+
|
|
164
|
+
# Test 6: Simulate banner rendering
|
|
165
|
+
echo ""
|
|
166
|
+
echo "🎨 Test 6: Testing banner rendering..."
|
|
167
|
+
BANNER_TEST="$TEST_DIR/test-banner.js"
|
|
168
|
+
|
|
169
|
+
cat > "$BANNER_TEST" << 'EOF'
|
|
170
|
+
const chalk = require('chalk');
|
|
171
|
+
|
|
172
|
+
const banner = `
|
|
173
|
+
${chalk.blue('╔════════════════════════════════════════════════════════════╗')}
|
|
174
|
+
${chalk.blue('║')} ${chalk.blue('║')}
|
|
175
|
+
${chalk.blue('║')} ${chalk.bold('🏗️ BYAN INSTALLER v1.0.0')} ${chalk.blue('║')}
|
|
176
|
+
${chalk.blue('║')} ${chalk.gray('Builder of YAN - Agent Creator')} ${chalk.blue('║')}
|
|
177
|
+
${chalk.blue('║')} ${chalk.blue('║')}
|
|
178
|
+
${chalk.blue('╚════════════════════════════════════════════════════════════╝')}
|
|
179
|
+
`;
|
|
180
|
+
|
|
181
|
+
console.log(banner);
|
|
182
|
+
console.log('✅ Banner rendered successfully');
|
|
183
|
+
EOF
|
|
184
|
+
|
|
185
|
+
BANNER_OUTPUT=$(node "$BANNER_TEST" 2>&1)
|
|
186
|
+
|
|
187
|
+
if echo "$BANNER_OUTPUT" | grep -q "Banner rendered successfully"; then
|
|
188
|
+
echo -e "${GREEN}✅ Banner renders without errors${NC}"
|
|
189
|
+
else
|
|
190
|
+
echo -e "${RED}❌ Banner rendering failed${NC}"
|
|
191
|
+
echo "$BANNER_OUTPUT"
|
|
192
|
+
exit 1
|
|
193
|
+
fi
|
|
194
|
+
|
|
195
|
+
# Final summary
|
|
196
|
+
echo ""
|
|
197
|
+
echo "═══════════════════════════════════════════════════════════"
|
|
198
|
+
echo -e "${GREEN}🎉 ALL TESTS PASSED!${NC}"
|
|
199
|
+
echo "═══════════════════════════════════════════════════════════"
|
|
200
|
+
echo ""
|
|
201
|
+
echo "Summary:"
|
|
202
|
+
echo " ✅ Package.json dependencies correct"
|
|
203
|
+
echo " ✅ CommonJS-compatible versions installed"
|
|
204
|
+
echo " ✅ --version flag works"
|
|
205
|
+
echo " ✅ --help flag works"
|
|
206
|
+
echo " ✅ Chalk import works correctly"
|
|
207
|
+
echo " ✅ Banner renders without errors"
|
|
208
|
+
echo ""
|
|
209
|
+
echo -e "${BLUE}🏗️ create-byan-agent is ready for use!${NC}"
|
|
210
|
+
echo ""
|