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.
Files changed (240) hide show
  1. package/API-BYAN-V2.md +741 -0
  2. package/BMAD-QUICK-REFERENCE.md +370 -0
  3. package/CHANGELOG-v2.1.0.md +371 -0
  4. package/LICENSE +1 -1
  5. package/MIGRATION-v2.0-to-v2.1.md +430 -0
  6. package/README-BYAN-V2.md +446 -0
  7. package/README.md +264 -201
  8. package/install/.eslintrc.js +20 -0
  9. package/install/.prettierrc +7 -0
  10. package/install/BUGFIX-CHALK.md +173 -0
  11. package/install/BUGFIX-DOCUMENTATION-INDEX.md +299 -0
  12. package/install/BUGFIX-PATH-RESOLUTION.md +293 -0
  13. package/install/BUGFIX-QUICKSTART.md +184 -0
  14. package/install/BUGFIX-SUMMARY.txt +91 -0
  15. package/install/BUGFIX-VISUAL-SUMMARY.md +253 -0
  16. package/install/DEPLOYMENT-GUIDE-V2.md +431 -0
  17. package/install/DOCS-INDEX.md +261 -0
  18. package/install/GUIDE-INSTALLATION-BYAN-SIMPLE.md +1083 -0
  19. package/install/INSTALLER-V2-CHANGES.md +472 -0
  20. package/install/LICENSE +21 -0
  21. package/install/PUBLICATION-CHECKLIST.md +265 -0
  22. package/install/PUBLISH-GUIDE.md +190 -0
  23. package/install/QUICKSTART.md +311 -0
  24. package/install/README-NPM-PUBLISH.md +298 -0
  25. package/install/README-NPM-SHORT.md +298 -0
  26. package/install/README-NPM.md +433 -0
  27. package/install/README-RACHID.md +302 -0
  28. package/install/README-V2-INDEX.md +306 -0
  29. package/install/README.md +298 -0
  30. package/install/RESUME-EXECUTIF-YAN.md +408 -0
  31. package/install/UPDATE-SUMMARY.md +205 -0
  32. package/install/__tests__/integration/detection-flow.test.js +154 -0
  33. package/install/__tests__/platforms/claude-code.test.js +175 -0
  34. package/install/__tests__/platforms/codex.test.js +80 -0
  35. package/install/__tests__/platforms/copilot-cli.test.js +118 -0
  36. package/install/__tests__/platforms/vscode.test.js +67 -0
  37. package/install/__tests__/utils/file-utils.test.js +87 -0
  38. package/install/__tests__/utils/git-detector.test.js +80 -0
  39. package/install/__tests__/utils/logger.test.js +83 -0
  40. package/install/__tests__/utils/node-detector.test.js +71 -0
  41. package/install/__tests__/utils/os-detector.test.js +63 -0
  42. package/install/__tests__/utils/yaml-utils.test.js +85 -0
  43. package/install/__tests__/yanstaller/detector.test.js +210 -0
  44. package/install/coverage/clover.xml +219 -0
  45. package/install/coverage/coverage-final.json +13 -0
  46. package/install/coverage/lcov-report/base.css +224 -0
  47. package/install/coverage/lcov-report/block-navigation.js +87 -0
  48. package/install/coverage/lcov-report/favicon.png +0 -0
  49. package/install/coverage/lcov-report/index.html +146 -0
  50. package/install/coverage/lcov-report/lib/errors.js.html +268 -0
  51. package/install/coverage/lcov-report/lib/exit-codes.js.html +247 -0
  52. package/install/coverage/lcov-report/lib/index.html +131 -0
  53. package/install/coverage/lcov-report/lib/platforms/claude-code.js.html +343 -0
  54. package/install/coverage/lcov-report/lib/platforms/codex.js.html +361 -0
  55. package/install/coverage/lcov-report/lib/platforms/copilot-cli.js.html +454 -0
  56. package/install/coverage/lcov-report/lib/platforms/index.html +176 -0
  57. package/install/coverage/lcov-report/lib/platforms/index.js.html +127 -0
  58. package/install/coverage/lcov-report/lib/platforms/vscode.js.html +238 -0
  59. package/install/coverage/lcov-report/lib/utils/config-loader.js.html +322 -0
  60. package/install/coverage/lcov-report/lib/utils/file-utils.js.html +397 -0
  61. package/install/coverage/lcov-report/lib/utils/git-detector.js.html +190 -0
  62. package/install/coverage/lcov-report/lib/utils/index.html +206 -0
  63. package/install/coverage/lcov-report/lib/utils/logger.js.html +277 -0
  64. package/install/coverage/lcov-report/lib/utils/node-detector.js.html +259 -0
  65. package/install/coverage/lcov-report/lib/utils/os-detector.js.html +307 -0
  66. package/install/coverage/lcov-report/lib/utils/yaml-utils.js.html +346 -0
  67. package/install/coverage/lcov-report/lib/yanstaller/backuper.js.html +409 -0
  68. package/install/coverage/lcov-report/lib/yanstaller/detector.js.html +508 -0
  69. package/install/coverage/lcov-report/lib/yanstaller/index.html +236 -0
  70. package/install/coverage/lcov-report/lib/yanstaller/index.js.html +364 -0
  71. package/install/coverage/lcov-report/lib/yanstaller/installer.js.html +505 -0
  72. package/install/coverage/lcov-report/lib/yanstaller/interviewer.js.html +349 -0
  73. package/install/coverage/lcov-report/lib/yanstaller/recommender.js.html +379 -0
  74. package/install/coverage/lcov-report/lib/yanstaller/troubleshooter.js.html +352 -0
  75. package/install/coverage/lcov-report/lib/yanstaller/validator.js.html +679 -0
  76. package/install/coverage/lcov-report/lib/yanstaller/wizard.js.html +412 -0
  77. package/install/coverage/lcov-report/platforms/claude-code.js.html +343 -0
  78. package/install/coverage/lcov-report/platforms/codex.js.html +361 -0
  79. package/install/coverage/lcov-report/platforms/copilot-cli.js.html +454 -0
  80. package/install/coverage/lcov-report/platforms/index.html +176 -0
  81. package/install/coverage/lcov-report/platforms/index.js.html +127 -0
  82. package/install/coverage/lcov-report/platforms/vscode.js.html +238 -0
  83. package/install/coverage/lcov-report/prettify.css +1 -0
  84. package/install/coverage/lcov-report/prettify.js +2 -0
  85. package/install/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  86. package/install/coverage/lcov-report/sorter.js +210 -0
  87. package/install/coverage/lcov-report/utils/file-utils.js.html +397 -0
  88. package/install/coverage/lcov-report/utils/git-detector.js.html +190 -0
  89. package/install/coverage/lcov-report/utils/index.html +191 -0
  90. package/install/coverage/lcov-report/utils/logger.js.html +277 -0
  91. package/install/coverage/lcov-report/utils/node-detector.js.html +259 -0
  92. package/install/coverage/lcov-report/utils/os-detector.js.html +307 -0
  93. package/install/coverage/lcov-report/utils/yaml-utils.js.html +346 -0
  94. package/install/coverage/lcov-report/yanstaller/detector.js.html +508 -0
  95. package/install/coverage/lcov-report/yanstaller/index.html +116 -0
  96. package/install/coverage/lcov.info +414 -0
  97. package/install/install.sh +239 -0
  98. package/install/jest.config.js +33 -0
  99. package/install/lib/errors.js +61 -0
  100. package/install/lib/exit-codes.js +54 -0
  101. package/install/lib/platforms/claude-code.js +86 -0
  102. package/install/lib/platforms/codex.js +92 -0
  103. package/install/lib/platforms/copilot-cli.js +123 -0
  104. package/install/lib/platforms/index.js +14 -0
  105. package/install/lib/platforms/vscode.js +51 -0
  106. package/install/lib/utils/config-loader.js +79 -0
  107. package/install/lib/utils/file-utils.js +104 -0
  108. package/install/lib/utils/git-detector.js +35 -0
  109. package/install/lib/utils/logger.js +64 -0
  110. package/install/lib/utils/node-detector.js +58 -0
  111. package/install/lib/utils/os-detector.js +74 -0
  112. package/install/lib/utils/yaml-utils.js +87 -0
  113. package/install/lib/yanstaller/backuper.js +108 -0
  114. package/install/lib/yanstaller/detector.js +141 -0
  115. package/install/lib/yanstaller/index.js +93 -0
  116. package/install/lib/yanstaller/installer.js +140 -0
  117. package/install/lib/yanstaller/interviewer.js +88 -0
  118. package/install/lib/yanstaller/recommender.js +98 -0
  119. package/install/lib/yanstaller/troubleshooter.js +89 -0
  120. package/install/lib/yanstaller/validator.js +198 -0
  121. package/install/lib/yanstaller/wizard.js +109 -0
  122. package/install/package-npm.json +55 -0
  123. package/install/package.json +63 -0
  124. package/install/src/byan-v2/context/copilot-context.js +79 -0
  125. package/install/src/byan-v2/context/session-state.js +98 -0
  126. package/install/src/byan-v2/dispatcher/complexity-scorer.js +232 -0
  127. package/install/src/byan-v2/dispatcher/local-executor.js +221 -0
  128. package/install/src/byan-v2/dispatcher/task-router.js +122 -0
  129. package/install/src/byan-v2/dispatcher/task-tool-interface-mock.js +134 -0
  130. package/install/src/byan-v2/dispatcher/task-tool-interface.js +123 -0
  131. package/install/src/byan-v2/generation/agent-profile-validator.js +113 -0
  132. package/install/src/byan-v2/generation/profile-template.js +113 -0
  133. package/install/src/byan-v2/generation/templates/default-agent.md +49 -0
  134. package/install/src/byan-v2/generation/templates/test-template.md +1 -0
  135. package/install/src/byan-v2/index.js +199 -0
  136. package/install/src/byan-v2/observability/error-tracker.js +105 -0
  137. package/install/src/byan-v2/observability/logger.js +154 -0
  138. package/install/src/byan-v2/observability/metrics-collector.js +194 -0
  139. package/install/src/byan-v2/orchestrator/analysis-state.js +268 -0
  140. package/install/src/byan-v2/orchestrator/generation-state.js +340 -0
  141. package/install/src/byan-v2/orchestrator/interview-state.js +271 -0
  142. package/install/src/byan-v2/orchestrator/state-machine.js +204 -0
  143. package/install/src/core/cache/cache.js +126 -0
  144. package/install/src/core/context/context.js +86 -0
  145. package/install/src/core/dispatcher/dispatcher.js +135 -0
  146. package/install/src/core/worker-pool/worker-pool.js +194 -0
  147. package/install/src/core/workflow/workflow-executor.js +220 -0
  148. package/install/src/index.js +139 -0
  149. package/install/src/observability/dashboard/dashboard.js +191 -0
  150. package/install/src/observability/logger/structured-logger.js +254 -0
  151. package/install/src/observability/metrics/metrics-collector.js +325 -0
  152. package/install/switch-to-v2.sh +126 -0
  153. package/install/test-chalk-fix.sh +210 -0
  154. package/install/test-installer-v2.sh +204 -0
  155. package/install/test-path-resolution.sh +200 -0
  156. package/package.json +53 -33
  157. package/src/byan-v2/context/copilot-context.js +79 -0
  158. package/src/byan-v2/context/session-state.js +98 -0
  159. package/src/byan-v2/data/mantras.json +852 -0
  160. package/src/byan-v2/dispatcher/complexity-scorer.js +232 -0
  161. package/src/byan-v2/dispatcher/five-whys-analyzer.js +310 -0
  162. package/src/byan-v2/dispatcher/local-executor.js +221 -0
  163. package/src/byan-v2/dispatcher/task-router.js +122 -0
  164. package/src/byan-v2/dispatcher/task-tool-interface-mock.js +134 -0
  165. package/src/byan-v2/dispatcher/task-tool-interface.js +123 -0
  166. package/src/byan-v2/generation/agent-profile-validator.js +113 -0
  167. package/src/byan-v2/generation/mantra-validator.js +416 -0
  168. package/src/byan-v2/generation/profile-template.js +113 -0
  169. package/src/byan-v2/generation/templates/default-agent.md +49 -0
  170. package/src/byan-v2/generation/templates/test-template.md +1 -0
  171. package/src/byan-v2/index.js +652 -0
  172. package/src/byan-v2/integration/voice-integration.js +295 -0
  173. package/src/byan-v2/observability/error-tracker.js +105 -0
  174. package/src/byan-v2/observability/logger.js +154 -0
  175. package/src/byan-v2/observability/metrics-collector.js +194 -0
  176. package/src/byan-v2/orchestrator/active-listener.js +541 -0
  177. package/src/byan-v2/orchestrator/analysis-state.js +268 -0
  178. package/src/byan-v2/orchestrator/generation-state.js +340 -0
  179. package/src/byan-v2/orchestrator/glossary-builder.js +431 -0
  180. package/src/byan-v2/orchestrator/interview-state.js +353 -0
  181. package/src/byan-v2/orchestrator/state-machine.js +253 -0
  182. package/src/core/cache/cache.js +126 -0
  183. package/src/core/context/context.js +86 -0
  184. package/src/core/dispatcher/dispatcher.js +135 -0
  185. package/src/core/worker-pool/worker-pool.js +194 -0
  186. package/src/core/workflow/workflow-executor.js +220 -0
  187. package/src/index.js +139 -0
  188. package/src/observability/dashboard/dashboard.js +191 -0
  189. package/src/observability/logger/structured-logger.js +254 -0
  190. package/src/observability/metrics/metrics-collector.js +325 -0
  191. package/templates/.github/agents/bmad-agent-test-dynamic.md +0 -21
  192. package/templates/.github/agents/franck.md +0 -379
  193. /package/{CHANGELOG.md → install/CHANGELOG.md} +0 -0
  194. /package/{bin → install/bin}/create-byan-agent-backup.js +0 -0
  195. /package/{bin → install/bin}/create-byan-agent-fixed.js +0 -0
  196. /package/{bin → install/bin}/create-byan-agent-v2.js +0 -0
  197. /package/{bin → install/bin}/create-byan-agent.js +0 -0
  198. /package/{templates → install/templates}/.github/agents/bmad-agent-bmad-master.md +0 -0
  199. /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-agent-builder.md +0 -0
  200. /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-module-builder.md +0 -0
  201. /package/{templates → install/templates}/.github/agents/bmad-agent-bmb-workflow-builder.md +0 -0
  202. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-analyst.md +0 -0
  203. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-architect.md +0 -0
  204. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-dev.md +0 -0
  205. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-pm.md +0 -0
  206. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-quick-flow-solo-dev.md +0 -0
  207. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-quinn.md +0 -0
  208. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-sm.md +0 -0
  209. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-tech-writer.md +0 -0
  210. /package/{templates → install/templates}/.github/agents/bmad-agent-bmm-ux-designer.md +0 -0
  211. /package/{templates → install/templates}/.github/agents/bmad-agent-byan-test.md +0 -0
  212. /package/{templates → install/templates}/.github/agents/bmad-agent-byan.md +0 -0
  213. /package/{templates → install/templates}/.github/agents/bmad-agent-carmack.md +0 -0
  214. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-brainstorming-coach.md +0 -0
  215. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-creative-problem-solver.md +0 -0
  216. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-design-thinking-coach.md +0 -0
  217. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-innovation-strategist.md +0 -0
  218. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-presentation-master.md +0 -0
  219. /package/{templates → install/templates}/.github/agents/bmad-agent-cis-storyteller.md +0 -0
  220. /package/{templates → install/templates}/.github/agents/bmad-agent-marc.md +0 -0
  221. /package/{templates → install/templates}/.github/agents/bmad-agent-patnote.md +0 -0
  222. /package/{templates → install/templates}/.github/agents/bmad-agent-rachid.md +0 -0
  223. /package/{templates → install/templates}/.github/agents/bmad-agent-tea-tea.md +0 -0
  224. /package/{templates → install/templates}/_bmad/bmb/agents/agent-builder.md +0 -0
  225. /package/{templates → install/templates}/_bmad/bmb/agents/byan-test.md +0 -0
  226. /package/{templates → install/templates}/_bmad/bmb/agents/byan.md +0 -0
  227. /package/{templates → install/templates}/_bmad/bmb/agents/marc.md +0 -0
  228. /package/{templates → install/templates}/_bmad/bmb/agents/module-builder.md +0 -0
  229. /package/{templates → install/templates}/_bmad/bmb/agents/patnote.md +0 -0
  230. /package/{templates → install/templates}/_bmad/bmb/agents/rachid.md +0 -0
  231. /package/{templates → install/templates}/_bmad/bmb/agents/workflow-builder.md +0 -0
  232. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/data/mantras.yaml +0 -0
  233. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/data/templates.yaml +0 -0
  234. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/delete-agent-workflow.md +0 -0
  235. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/edit-agent-workflow.md +0 -0
  236. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/interview-workflow.md +0 -0
  237. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/quick-create-workflow.md +0 -0
  238. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/templates/base-agent-template.md +0 -0
  239. /package/{templates → install/templates}/_bmad/bmb/workflows/byan/validate-agent-workflow.md +0 -0
  240. /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 ""