create-byan-agent 2.9.4 → 2.9.5

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 (92) hide show
  1. package/install/bin/byan-cleanup.js +156 -0
  2. package/install/bin/byan-kanban.js +159 -0
  3. package/install/bin/byan-ledger.js +45 -0
  4. package/install/lib/cleanup/detector.js +154 -0
  5. package/install/lib/cleanup/executor.js +72 -0
  6. package/install/lib/subagent-generator.js +208 -0
  7. package/install/lib/token-ledger.js +131 -0
  8. package/install/templates/.claude/agents/bmad-bmad-master.md +14 -0
  9. package/install/templates/.claude/agents/bmad-bmb-agent-builder.md +14 -0
  10. package/install/templates/.claude/agents/bmad-bmb-module-builder.md +14 -0
  11. package/install/templates/.claude/agents/bmad-bmb-workflow-builder.md +14 -0
  12. package/install/templates/.claude/agents/bmad-bmm-analyst.md +14 -0
  13. package/install/templates/.claude/agents/bmad-bmm-architect.md +14 -0
  14. package/install/templates/.claude/agents/bmad-bmm-dev.md +14 -0
  15. package/install/templates/.claude/agents/bmad-bmm-pm.md +14 -0
  16. package/install/templates/.claude/agents/bmad-bmm-quick-flow-solo-dev.md +14 -0
  17. package/install/templates/.claude/agents/bmad-bmm-quinn.md +14 -0
  18. package/install/templates/.claude/agents/bmad-bmm-sm.md +14 -0
  19. package/install/templates/.claude/agents/bmad-bmm-tech-writer.md +14 -0
  20. package/install/templates/.claude/agents/bmad-bmm-ux-designer.md +14 -0
  21. package/install/templates/.claude/agents/bmad-byan-v2.md +14 -0
  22. package/install/templates/.claude/agents/bmad-byan.md +152 -0
  23. package/install/templates/.claude/agents/bmad-carmack.md +14 -0
  24. package/install/templates/.claude/agents/bmad-cis-brainstorming-coach.md +14 -0
  25. package/install/templates/.claude/agents/bmad-cis-creative-problem-solver.md +14 -0
  26. package/install/templates/.claude/agents/bmad-cis-design-thinking-coach.md +14 -0
  27. package/install/templates/.claude/agents/bmad-cis-innovation-strategist.md +14 -0
  28. package/install/templates/.claude/agents/bmad-cis-presentation-master.md +14 -0
  29. package/install/templates/.claude/agents/bmad-cis-storyteller.md +14 -0
  30. package/install/templates/.claude/agents/bmad-claude.md +26 -0
  31. package/install/templates/.claude/agents/bmad-codex.md +26 -0
  32. package/install/templates/.claude/agents/bmad-compliance.md +68 -0
  33. package/install/templates/.claude/agents/bmad-drawio.md +25 -0
  34. package/install/templates/.claude/agents/bmad-expert-merise-agile.md +54 -0
  35. package/install/templates/.claude/agents/bmad-fact-checker.md +14 -0
  36. package/install/templates/.claude/agents/bmad-forgeron.md +14 -0
  37. package/install/templates/.claude/agents/bmad-hermes.md +59 -0
  38. package/install/templates/.claude/agents/bmad-marc.md +25 -0
  39. package/install/templates/.claude/agents/bmad-patnote.md +26 -0
  40. package/install/templates/.claude/agents/bmad-rachid.md +25 -0
  41. package/install/templates/.claude/agents/bmad-tao.md +14 -0
  42. package/install/templates/.claude/agents/bmad-tea-tea.md +14 -0
  43. package/install/templates/.claude/agents/bmad-yanstaller.md +47 -0
  44. package/install/templates/.claude/hooks/fact-check-absolutes.js +185 -0
  45. package/install/templates/.claude/hooks/fd-phase-guard.js +87 -0
  46. package/install/templates/.claude/hooks/fd-response-check.js +92 -0
  47. package/install/templates/.claude/hooks/lib/failure-detector.js +14 -0
  48. package/install/templates/.claude/hooks/pre-compact-save.js +148 -0
  49. package/install/templates/.claude/hooks/tool-failure-guard.js +6 -0
  50. package/install/templates/.claude/hooks/tool-transparency.js +4 -0
  51. package/install/templates/.claude/settings.json +23 -0
  52. package/install/templates/.claude/skills/byan-byan/SKILL.md +115 -163
  53. package/install/templates/.claude/skills/byan-orchestrate/SKILL.md +100 -0
  54. package/install/templates/.githooks/pre-commit +75 -0
  55. package/install/templates/_byan/mcp/byan-mcp-server/lib/copilot.js +148 -0
  56. package/install/templates/_byan/mcp/byan-mcp-server/lib/fd-state.js +163 -0
  57. package/install/templates/_byan/mcp/byan-mcp-server/lib/kanban.js +226 -0
  58. package/install/templates/_byan/mcp/byan-mcp-server/lib/peer-review.js +187 -0
  59. package/install/templates/_byan/mcp/byan-mcp-server/server.js +463 -0
  60. package/install/templates/detector.js +154 -0
  61. package/package.json +6 -7
  62. package/src/loadbalancer/capability-matrix.js +157 -0
  63. package/src/loadbalancer/config.js +141 -0
  64. package/src/loadbalancer/graceful-degradation.js +212 -0
  65. package/src/loadbalancer/health-probe.js +151 -0
  66. package/src/loadbalancer/hooks/claude-hooks.js +53 -0
  67. package/src/loadbalancer/hooks/copilot-hooks.js +74 -0
  68. package/src/loadbalancer/index.js +81 -0
  69. package/src/loadbalancer/loadbalancer.default.yaml +65 -0
  70. package/src/loadbalancer/loadbalancer.js +324 -0
  71. package/src/loadbalancer/mcp-server.js +304 -0
  72. package/src/loadbalancer/metrics.js +146 -0
  73. package/src/loadbalancer/native/claude-integration.js +64 -0
  74. package/src/loadbalancer/native/copilot-integration.js +59 -0
  75. package/src/loadbalancer/pressure-score.js +102 -0
  76. package/src/loadbalancer/providers/base-provider.js +80 -0
  77. package/src/loadbalancer/providers/byan-api-provider.js +132 -0
  78. package/src/loadbalancer/providers/claude-provider.js +113 -0
  79. package/src/loadbalancer/providers/copilot-provider.js +104 -0
  80. package/src/loadbalancer/rate-limit-tracker.js +216 -0
  81. package/src/loadbalancer/session-bridge.js +179 -0
  82. package/src/loadbalancer/state/db.js +211 -0
  83. package/src/loadbalancer/state/migrations/001-initial.sql +50 -0
  84. package/src/loadbalancer/tools/index.js +123 -0
  85. package/src/loadbalancer/velocity-estimator.js +147 -0
  86. package/update-byan-agent/bin/update-byan-agent.js +27 -2
  87. package/API-BYAN-V2.md +0 -741
  88. package/BMAD-QUICK-REFERENCE.md +0 -370
  89. package/CHANGELOG-v2.1.0.md +0 -371
  90. package/MIGRATION-v2.0-to-v2.1.md +0 -430
  91. package/README-BYAN-V2.md +0 -446
  92. package/TEST-GUIDE-v2.3.2.md +0 -161
@@ -0,0 +1,147 @@
1
+ /**
2
+ * VelocityEstimator — Sliding Window Request Rate
3
+ *
4
+ * Tracks request timestamps in a sliding window to calculate:
5
+ * - Current velocity (requests/minute)
6
+ * - Trend (accelerating / stable / decelerating)
7
+ * - ETA to a configurable threshold (minutes until likely rate limit)
8
+ *
9
+ * Emits 'threshold_warning' when velocity exceeds configured threshold.
10
+ */
11
+
12
+ const { EventEmitter } = require('events');
13
+
14
+ const TREND = {
15
+ ACCELERATING: 'accelerating',
16
+ STABLE: 'stable',
17
+ DECELERATING: 'decelerating',
18
+ IDLE: 'idle',
19
+ };
20
+
21
+ class VelocityEstimator extends EventEmitter {
22
+ /**
23
+ * @param {string} provider
24
+ * @param {object} opts
25
+ * @param {number} [opts.windowMs=120000] - Sliding window for velocity calc (default 2min)
26
+ * @param {number} [opts.warningThresholdPerMin=10] - Emit warning above this req/min
27
+ * @param {number} [opts.maxRequestsBeforeLimit=30] - Estimated provider limit per window for ETA
28
+ * @param {number} [opts.trendSplitRatio=0.5] - Split point for trend calc (first half vs second half)
29
+ */
30
+ constructor(provider, opts = {}) {
31
+ super();
32
+ this.provider = provider;
33
+ this.windowMs = opts.windowMs || 120000;
34
+ this.warningThreshold = opts.warningThresholdPerMin || 10;
35
+ this.maxRequestsBeforeLimit = opts.maxRequestsBeforeLimit || 30;
36
+ this.trendSplitRatio = opts.trendSplitRatio || 0.5;
37
+
38
+ this.timestamps = [];
39
+ this.warningEmitted = false;
40
+ }
41
+
42
+ recordRequest() {
43
+ const now = Date.now();
44
+ this.timestamps.push(now);
45
+ this._prune(now);
46
+
47
+ const velocity = this.getVelocity();
48
+ if (velocity >= this.warningThreshold && !this.warningEmitted) {
49
+ this.warningEmitted = true;
50
+ this.emit('threshold_warning', {
51
+ provider: this.provider,
52
+ velocity,
53
+ threshold: this.warningThreshold,
54
+ });
55
+ } else if (velocity < this.warningThreshold * 0.8) {
56
+ this.warningEmitted = false;
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Current requests per minute in the sliding window.
62
+ */
63
+ getVelocity() {
64
+ const now = Date.now();
65
+ this._prune(now);
66
+ if (this.timestamps.length < 2) return 0;
67
+
68
+ const windowSpanMs = now - this.timestamps[0];
69
+ if (windowSpanMs < 1000) return 0; // min 1s span to avoid burst spikes
70
+
71
+ return (this.timestamps.length / windowSpanMs) * 60000;
72
+ }
73
+
74
+ /**
75
+ * Compare first-half velocity vs second-half velocity.
76
+ */
77
+ getTrend() {
78
+ const now = Date.now();
79
+ this._prune(now);
80
+ if (this.timestamps.length < 4) return TREND.IDLE;
81
+
82
+ const splitTime = now - (this.windowMs * this.trendSplitRatio);
83
+ const firstHalf = this.timestamps.filter(t => t < splitTime);
84
+ const secondHalf = this.timestamps.filter(t => t >= splitTime);
85
+
86
+ if (firstHalf.length === 0 || secondHalf.length === 0) return TREND.STABLE;
87
+
88
+ const firstSpan = splitTime - (now - this.windowMs);
89
+ const secondSpan = now - splitTime;
90
+
91
+ const firstRate = firstSpan > 0 ? (firstHalf.length / firstSpan) * 60000 : 0;
92
+ const secondRate = secondSpan > 0 ? (secondHalf.length / secondSpan) * 60000 : 0;
93
+
94
+ const ratio = firstRate > 0 ? secondRate / firstRate : 1;
95
+
96
+ if (ratio > 1.25) return TREND.ACCELERATING;
97
+ if (ratio < 0.75) return TREND.DECELERATING;
98
+ return TREND.STABLE;
99
+ }
100
+
101
+ /**
102
+ * Estimated minutes until rate limit at current velocity.
103
+ * Returns Infinity if velocity is 0 or negligible.
104
+ */
105
+ getEtaMinutes() {
106
+ const velocity = this.getVelocity();
107
+ if (velocity < 0.1) return Infinity;
108
+
109
+ const remaining = Math.max(0, this.maxRequestsBeforeLimit - this.timestamps.length);
110
+ return remaining / velocity;
111
+ }
112
+
113
+ /**
114
+ * Full snapshot for consumption by PressureScore / lb_quota.
115
+ */
116
+ getSnapshot() {
117
+ return {
118
+ provider: this.provider,
119
+ velocity: Math.round(this.getVelocity() * 100) / 100,
120
+ trend: this.getTrend(),
121
+ etaMinutes: Math.round(this.getEtaMinutes() * 10) / 10,
122
+ requestsInWindow: this.timestamps.length,
123
+ windowMs: this.windowMs,
124
+ maxRequestsBeforeLimit: this.maxRequestsBeforeLimit,
125
+ warningThreshold: this.warningThreshold,
126
+ };
127
+ }
128
+
129
+ reset() {
130
+ this.timestamps = [];
131
+ this.warningEmitted = false;
132
+ }
133
+
134
+ destroy() {
135
+ this.reset();
136
+ this.removeAllListeners();
137
+ }
138
+
139
+ _prune(now) {
140
+ const cutoff = now - this.windowMs;
141
+ while (this.timestamps.length > 0 && this.timestamps[0] < cutoff) {
142
+ this.timestamps.shift();
143
+ }
144
+ }
145
+ }
146
+
147
+ module.exports = { VelocityEstimator, TREND };
@@ -146,13 +146,38 @@ program
146
146
  });
147
147
 
148
148
  // Copy _byan from node_modules to project root
149
- const nodeModulesByan = path.join(installPath, 'node_modules', 'create-byan-agent', '_byan');
149
+ const pkgRoot = path.join(installPath, 'node_modules', 'create-byan-agent');
150
+ const nodeModulesByan = path.join(pkgRoot, '_byan');
150
151
  if (fs.existsSync(nodeModulesByan)) {
151
152
  copyRecursive(nodeModulesByan, byanDir);
152
153
  } else {
153
154
  throw new Error('_byan directory not found in npm package');
154
155
  }
155
-
156
+
157
+ // Also refresh .github/agents/ from templates (Copilot stubs)
158
+ const ghAgentsSrc = path.join(pkgRoot, 'install', 'templates', '.github', 'agents');
159
+ const ghAgentsDst = path.join(installPath, '.github', 'agents');
160
+ if (fs.existsSync(ghAgentsSrc)) {
161
+ if (fs.existsSync(ghAgentsDst)) {
162
+ fs.rmSync(ghAgentsDst, { recursive: true, force: true });
163
+ }
164
+ fs.mkdirSync(path.dirname(ghAgentsDst), { recursive: true });
165
+ copyRecursive(ghAgentsSrc, ghAgentsDst);
166
+ }
167
+
168
+ // Refresh Claude Code native (.claude/hooks, .claude/skills,
169
+ // .claude/agents, .claude/settings.json, .mcp.json, _byan/mcp/)
170
+ try {
171
+ const setupModule = path.join(pkgRoot, 'install', 'lib', 'claude-native-setup.js');
172
+ if (fs.existsSync(setupModule)) {
173
+ // eslint-disable-next-line import/no-dynamic-require, global-require
174
+ const { setupClaudeNative } = require(setupModule);
175
+ await setupClaudeNative(installPath, { installDeps: true, quiet: false });
176
+ }
177
+ } catch (e) {
178
+ console.warn(chalk.yellow(` ⚠ Claude native refresh skipped: ${e.message}`));
179
+ }
180
+
156
181
  updateSpinner.succeed('Derniere version installee');
157
182
  } catch (error) {
158
183
  updateSpinner.fail('Erreur installation');