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.
- package/install/bin/byan-cleanup.js +156 -0
- package/install/bin/byan-kanban.js +159 -0
- package/install/bin/byan-ledger.js +45 -0
- package/install/lib/cleanup/detector.js +154 -0
- package/install/lib/cleanup/executor.js +72 -0
- package/install/lib/subagent-generator.js +208 -0
- package/install/lib/token-ledger.js +131 -0
- package/install/templates/.claude/agents/bmad-bmad-master.md +14 -0
- package/install/templates/.claude/agents/bmad-bmb-agent-builder.md +14 -0
- package/install/templates/.claude/agents/bmad-bmb-module-builder.md +14 -0
- package/install/templates/.claude/agents/bmad-bmb-workflow-builder.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-analyst.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-architect.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-dev.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-pm.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-quick-flow-solo-dev.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-quinn.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-sm.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-tech-writer.md +14 -0
- package/install/templates/.claude/agents/bmad-bmm-ux-designer.md +14 -0
- package/install/templates/.claude/agents/bmad-byan-v2.md +14 -0
- package/install/templates/.claude/agents/bmad-byan.md +152 -0
- package/install/templates/.claude/agents/bmad-carmack.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-brainstorming-coach.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-creative-problem-solver.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-design-thinking-coach.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-innovation-strategist.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-presentation-master.md +14 -0
- package/install/templates/.claude/agents/bmad-cis-storyteller.md +14 -0
- package/install/templates/.claude/agents/bmad-claude.md +26 -0
- package/install/templates/.claude/agents/bmad-codex.md +26 -0
- package/install/templates/.claude/agents/bmad-compliance.md +68 -0
- package/install/templates/.claude/agents/bmad-drawio.md +25 -0
- package/install/templates/.claude/agents/bmad-expert-merise-agile.md +54 -0
- package/install/templates/.claude/agents/bmad-fact-checker.md +14 -0
- package/install/templates/.claude/agents/bmad-forgeron.md +14 -0
- package/install/templates/.claude/agents/bmad-hermes.md +59 -0
- package/install/templates/.claude/agents/bmad-marc.md +25 -0
- package/install/templates/.claude/agents/bmad-patnote.md +26 -0
- package/install/templates/.claude/agents/bmad-rachid.md +25 -0
- package/install/templates/.claude/agents/bmad-tao.md +14 -0
- package/install/templates/.claude/agents/bmad-tea-tea.md +14 -0
- package/install/templates/.claude/agents/bmad-yanstaller.md +47 -0
- package/install/templates/.claude/hooks/fact-check-absolutes.js +185 -0
- package/install/templates/.claude/hooks/fd-phase-guard.js +87 -0
- package/install/templates/.claude/hooks/fd-response-check.js +92 -0
- package/install/templates/.claude/hooks/lib/failure-detector.js +14 -0
- package/install/templates/.claude/hooks/pre-compact-save.js +148 -0
- package/install/templates/.claude/hooks/tool-failure-guard.js +6 -0
- package/install/templates/.claude/hooks/tool-transparency.js +4 -0
- package/install/templates/.claude/settings.json +23 -0
- package/install/templates/.claude/skills/byan-byan/SKILL.md +115 -163
- package/install/templates/.claude/skills/byan-orchestrate/SKILL.md +100 -0
- package/install/templates/.githooks/pre-commit +75 -0
- package/install/templates/_byan/mcp/byan-mcp-server/lib/copilot.js +148 -0
- package/install/templates/_byan/mcp/byan-mcp-server/lib/fd-state.js +163 -0
- package/install/templates/_byan/mcp/byan-mcp-server/lib/kanban.js +226 -0
- package/install/templates/_byan/mcp/byan-mcp-server/lib/peer-review.js +187 -0
- package/install/templates/_byan/mcp/byan-mcp-server/server.js +463 -0
- package/install/templates/detector.js +154 -0
- package/package.json +6 -7
- package/src/loadbalancer/capability-matrix.js +157 -0
- package/src/loadbalancer/config.js +141 -0
- package/src/loadbalancer/graceful-degradation.js +212 -0
- package/src/loadbalancer/health-probe.js +151 -0
- package/src/loadbalancer/hooks/claude-hooks.js +53 -0
- package/src/loadbalancer/hooks/copilot-hooks.js +74 -0
- package/src/loadbalancer/index.js +81 -0
- package/src/loadbalancer/loadbalancer.default.yaml +65 -0
- package/src/loadbalancer/loadbalancer.js +324 -0
- package/src/loadbalancer/mcp-server.js +304 -0
- package/src/loadbalancer/metrics.js +146 -0
- package/src/loadbalancer/native/claude-integration.js +64 -0
- package/src/loadbalancer/native/copilot-integration.js +59 -0
- package/src/loadbalancer/pressure-score.js +102 -0
- package/src/loadbalancer/providers/base-provider.js +80 -0
- package/src/loadbalancer/providers/byan-api-provider.js +132 -0
- package/src/loadbalancer/providers/claude-provider.js +113 -0
- package/src/loadbalancer/providers/copilot-provider.js +104 -0
- package/src/loadbalancer/rate-limit-tracker.js +216 -0
- package/src/loadbalancer/session-bridge.js +179 -0
- package/src/loadbalancer/state/db.js +211 -0
- package/src/loadbalancer/state/migrations/001-initial.sql +50 -0
- package/src/loadbalancer/tools/index.js +123 -0
- package/src/loadbalancer/velocity-estimator.js +147 -0
- package/update-byan-agent/bin/update-byan-agent.js +27 -2
- package/API-BYAN-V2.md +0 -741
- package/BMAD-QUICK-REFERENCE.md +0 -370
- package/CHANGELOG-v2.1.0.md +0 -371
- package/MIGRATION-v2.0-to-v2.1.md +0 -430
- package/README-BYAN-V2.md +0 -446
- 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
|
|
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');
|