viberadar 0.3.210 → 0.3.211

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.
@@ -1786,6 +1786,9 @@ let loadVusDraft = 10;
1786
1786
  let loadDurationDraft = '30s';
1787
1787
  let loadDataDirDraft = '';
1788
1788
  let loadResultDirDraft = '';
1789
+ let loadExecutionModeDraft = 'auto';
1790
+ let loadVusEnvNameDraft = 'SMOKE_VUS';
1791
+ let loadDurationEnvNameDraft = 'SMOKE_DURATION';
1789
1792
  let loadView = 'library'; // 'library' | 'editor'
1790
1793
 
1791
1794
  function toggleObsHint(id) {
@@ -7763,16 +7766,25 @@ function applyLoadConfigToFields(cfg) {
7763
7766
  loadDurationDraft = cfg.duration || loadDurationDraft;
7764
7767
  loadDataDirDraft = cfg.dataDir || loadDataDirDraft;
7765
7768
  loadResultDirDraft = cfg.resultDir || loadResultDirDraft;
7769
+ loadExecutionModeDraft = cfg.executionMode || loadExecutionModeDraft;
7770
+ loadVusEnvNameDraft = cfg.vusEnvName || loadVusEnvNameDraft;
7771
+ loadDurationEnvNameDraft = cfg.durationEnvName || loadDurationEnvNameDraft;
7766
7772
  const baseEl = document.getElementById('loadBaseUrl');
7767
7773
  const vusEl = document.getElementById('loadVus');
7768
7774
  const durEl = document.getElementById('loadDuration');
7769
7775
  const dataEl = document.getElementById('loadDataDir');
7770
7776
  const resultEl = document.getElementById('loadResultDir');
7777
+ const modeEl = document.getElementById('loadExecutionMode');
7778
+ const vusEnvEl = document.getElementById('loadVusEnvName');
7779
+ const durationEnvEl = document.getElementById('loadDurationEnvName');
7771
7780
  if (baseEl) baseEl.value = loadBaseUrlDraft;
7772
7781
  if (vusEl) vusEl.value = loadVusDraft;
7773
7782
  if (durEl) durEl.value = loadDurationDraft;
7774
7783
  if (dataEl) dataEl.value = loadDataDirDraft;
7775
7784
  if (resultEl) resultEl.value = loadResultDirDraft;
7785
+ if (modeEl) modeEl.value = loadExecutionModeDraft;
7786
+ if (vusEnvEl) vusEnvEl.value = loadVusEnvNameDraft;
7787
+ if (durationEnvEl) durationEnvEl.value = loadDurationEnvNameDraft;
7776
7788
  }
7777
7789
 
7778
7790
  function renderLoad(c) {
@@ -7902,6 +7914,25 @@ function renderLoad(c) {
7902
7914
  </div>
7903
7915
  </div>
7904
7916
  <div class="load-config-hint">VUs и Duration применяются через CLI k6 и переопределяют значения из <code>export const options</code>. Base URL доступен в скрипте как <code>__ENV.BASE_URL</code>.</div>
7917
+ <div class="load-config-row" style="margin-top:8px">
7918
+ <div class="load-config-field">
7919
+ <label>Execution</label>
7920
+ <select id="loadExecutionMode" style="width:150px">
7921
+ <option value="auto" ${loadExecutionModeDraft === 'auto' ? 'selected' : ''}>Auto</option>
7922
+ <option value="cli" ${loadExecutionModeDraft === 'cli' ? 'selected' : ''}>CLI override</option>
7923
+ <option value="script" ${loadExecutionModeDraft === 'script' ? 'selected' : ''}>Script scenarios</option>
7924
+ </select>
7925
+ </div>
7926
+ <div class="load-config-field">
7927
+ <label>VUs env</label>
7928
+ <input id="loadVusEnvName" type="text" value="${escapeHtml(loadVusEnvNameDraft)}" style="width:130px" placeholder="SMOKE_VUS" />
7929
+ </div>
7930
+ <div class="load-config-field">
7931
+ <label>Duration env</label>
7932
+ <input id="loadDurationEnvName" type="text" value="${escapeHtml(loadDurationEnvNameDraft)}" style="width:150px" placeholder="SMOKE_DURATION" />
7933
+ </div>
7934
+ </div>
7935
+ <div class="load-config-hint">Auto: если скрипт содержит <code>options.scenarios</code>, VibeRadar не передаёт <code>--vus/--duration</code>, а кладёт значения в env-переменные, например <code>SMOKE_VUS</code> и <code>SMOKE_DURATION</code>.</div>
7905
7936
  <div class="load-config-row" style="margin-top:8px">
7906
7937
  <div class="load-config-field" style="flex:1;min-width:260px">
7907
7938
  <label>Data dir / file <span style="color:var(--dim);font-weight:400">(для <code>open('./users.csv')</code> и локальных lib)</span></label>
@@ -8004,11 +8035,17 @@ function renderLoad(c) {
8004
8035
  const durationInput = document.getElementById('loadDuration');
8005
8036
  const dataInput = document.getElementById('loadDataDir');
8006
8037
  const resultInput = document.getElementById('loadResultDir');
8038
+ const modeInput = document.getElementById('loadExecutionMode');
8039
+ const vusEnvInput = document.getElementById('loadVusEnvName');
8040
+ const durationEnvInput = document.getElementById('loadDurationEnvName');
8007
8041
  if (baseInput) baseInput.addEventListener('input', () => { loadBaseUrlDraft = baseInput.value || 'http://localhost:5000'; });
8008
8042
  if (vusInput) vusInput.addEventListener('input', () => { loadVusDraft = parseInt(vusInput.value || '10', 10) || 10; });
8009
8043
  if (durationInput) durationInput.addEventListener('input', () => { loadDurationDraft = durationInput.value || '30s'; });
8010
8044
  if (dataInput) dataInput.addEventListener('input', () => { loadDataDirDraft = dataInput.value || ''; });
8011
8045
  if (resultInput) resultInput.addEventListener('input', () => { loadResultDirDraft = resultInput.value || ''; });
8046
+ if (modeInput) modeInput.addEventListener('change', () => { loadExecutionModeDraft = modeInput.value || 'auto'; });
8047
+ if (vusEnvInput) vusEnvInput.addEventListener('input', () => { loadVusEnvNameDraft = vusEnvInput.value || 'SMOKE_VUS'; });
8048
+ if (durationEnvInput) durationEnvInput.addEventListener('input', () => { loadDurationEnvNameDraft = durationEnvInput.value || 'SMOKE_DURATION'; });
8012
8049
 
8013
8050
  // Feature selector auto-generates script
8014
8051
  const featSel = document.getElementById('loadFeature');
@@ -8048,6 +8085,9 @@ function loadOpenScript(name) {
8048
8085
  if (s.duration) loadDurationDraft = s.duration;
8049
8086
  loadDataDirDraft = s.dataDir || loadDataDirDraft;
8050
8087
  loadResultDirDraft = s.resultDir || loadResultDirDraft;
8088
+ loadExecutionModeDraft = s.executionMode || loadExecutionModeDraft;
8089
+ loadVusEnvNameDraft = s.vusEnvName || loadVusEnvNameDraft;
8090
+ loadDurationEnvNameDraft = s.durationEnvName || loadDurationEnvNameDraft;
8051
8091
  loadView = 'editor';
8052
8092
  renderContent();
8053
8093
  }
@@ -8078,12 +8118,19 @@ async function runLoadTest() {
8078
8118
  const scriptName = (document.getElementById('loadScriptName')?.value || loadScriptNameDraft || 'Новый тест').trim();
8079
8119
  const dataDir = (document.getElementById('loadDataDir')?.value || loadDataDirDraft || '').trim();
8080
8120
  const resultDir = (document.getElementById('loadResultDir')?.value || loadResultDirDraft || '').trim();
8121
+ const executionModeRaw = (document.getElementById('loadExecutionMode')?.value || loadExecutionModeDraft || 'auto').trim();
8122
+ const executionMode = executionModeRaw === 'auto' ? undefined : executionModeRaw;
8123
+ const vusEnvName = (document.getElementById('loadVusEnvName')?.value || loadVusEnvNameDraft || 'SMOKE_VUS').trim();
8124
+ const durationEnvName = (document.getElementById('loadDurationEnvName')?.value || loadDurationEnvNameDraft || 'SMOKE_DURATION').trim();
8081
8125
  loadBaseUrlDraft = baseUrl;
8082
8126
  loadVusDraft = vus;
8083
8127
  loadDurationDraft = duration;
8084
8128
  loadScriptNameDraft = scriptName;
8085
8129
  loadDataDirDraft = dataDir;
8086
8130
  loadResultDirDraft = resultDir;
8131
+ loadExecutionModeDraft = executionModeRaw;
8132
+ loadVusEnvNameDraft = vusEnvName;
8133
+ loadDurationEnvNameDraft = durationEnvName;
8087
8134
 
8088
8135
  loadLogLines = [];
8089
8136
  loadBuckets = [];
@@ -8095,7 +8142,7 @@ async function runLoadTest() {
8095
8142
  const r = await fetch('/api/load/run', {
8096
8143
  method: 'POST',
8097
8144
  headers: { 'Content-Type': 'application/json' },
8098
- body: JSON.stringify({ script, vus, duration, baseUrl, scriptName, dataDir, resultDir, envVars }),
8145
+ body: JSON.stringify({ script, vus, duration, baseUrl, scriptName, dataDir, resultDir, executionMode, vusEnvName, durationEnvName, envVars }),
8099
8146
  });
8100
8147
  const d = await r.json();
8101
8148
  if (!r.ok) { alert('Ошибка запуска: ' + (d.error || r.status)); return; }
@@ -8176,7 +8223,7 @@ ${featureList || '(нет данных)'}
8176
8223
  **Шаг 2 — составь k6 скрипт.**
8177
8224
  Требования:
8178
8225
  1. Валидный JavaScript для k6 (import from 'k6/http', 'k6', 'k6/data')
8179
- 2. VUs и duration задаёт VibeRadar через CLI, поэтому не хардкодь нагрузку как единственный источник истины; если добавляешь \`export const options\`, оставь там только thresholds/summaryTrendStats или безопасные дефолты
8226
+ 2. Можно использовать \`options.scenarios\`; тогда VibeRadar в Auto-режиме не будет передавать \`--vus/--duration\`, а прокинет значения UI в \`__ENV.SMOKE_VUS\` и \`__ENV.SMOKE_DURATION\`
8180
8227
  3. \`export default function() { ... }\` с проверками \`check()\`
8181
8228
  4. Base URL бери из \`__ENV.BASE_URL || '${baseUrl}'\`
8182
8229
  5. Если нужна авторизация — добавь заголовок Authorization (Bearer-токен как переменную __ENV.TOKEN)
@@ -8297,17 +8344,23 @@ async function loadSaveScript() {
8297
8344
  const duration = (document.getElementById('loadDuration')?.value || loadDurationDraft || '30s').trim();
8298
8345
  const dataDir = (document.getElementById('loadDataDir')?.value || loadDataDirDraft || '').trim();
8299
8346
  const resultDir = (document.getElementById('loadResultDir')?.value || loadResultDirDraft || '').trim();
8347
+ const executionMode = (document.getElementById('loadExecutionMode')?.value || loadExecutionModeDraft || 'auto').trim();
8348
+ const vusEnvName = (document.getElementById('loadVusEnvName')?.value || loadVusEnvNameDraft || 'SMOKE_VUS').trim();
8349
+ const durationEnvName = (document.getElementById('loadDurationEnvName')?.value || loadDurationEnvNameDraft || 'SMOKE_DURATION').trim();
8300
8350
  loadScriptNameDraft = name;
8301
8351
  loadBaseUrlDraft = baseUrl;
8302
8352
  loadVusDraft = vus;
8303
8353
  loadDurationDraft = duration;
8304
8354
  loadDataDirDraft = dataDir;
8305
8355
  loadResultDirDraft = resultDir;
8356
+ loadExecutionModeDraft = executionMode;
8357
+ loadVusEnvNameDraft = vusEnvName;
8358
+ loadDurationEnvNameDraft = durationEnvName;
8306
8359
  try {
8307
8360
  const r = await fetch('/api/load/scripts', {
8308
8361
  method: 'POST',
8309
8362
  headers: { 'Content-Type': 'application/json' },
8310
- body: JSON.stringify({ name, script, baseUrl, vus, duration, dataDir, resultDir }),
8363
+ body: JSON.stringify({ name, script, baseUrl, vus, duration, dataDir, resultDir, executionMode, vusEnvName, durationEnvName }),
8311
8364
  });
8312
8365
  if (!r.ok) { const d = await r.json().catch(() => ({})); alert('Ошибка: ' + (d.error || r.status)); return; }
8313
8366
  await loadRefreshScripts();
@@ -8327,6 +8380,9 @@ async function loadLoadScript(name) {
8327
8380
  if (s.duration) loadDurationDraft = s.duration;
8328
8381
  loadDataDirDraft = s.dataDir || loadDataDirDraft;
8329
8382
  loadResultDirDraft = s.resultDir || loadResultDirDraft;
8383
+ loadExecutionModeDraft = s.executionMode || loadExecutionModeDraft;
8384
+ loadVusEnvNameDraft = s.vusEnvName || loadVusEnvNameDraft;
8385
+ loadDurationEnvNameDraft = s.durationEnvName || loadDurationEnvNameDraft;
8330
8386
  const ta = document.getElementById('loadScriptEditor');
8331
8387
  if (ta) { ta.value = s.script; ta.style.borderColor = 'var(--blue)'; setTimeout(() => { ta.style.borderColor = ''; }, 1500); }
8332
8388
  const nameEl = document.getElementById('loadScriptName');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "viberadar",
3
- "version": "0.3.210",
3
+ "version": "0.3.211",
4
4
  "description": "Live module map with test coverage for vibecoding projects",
5
5
  "main": "./dist/cli.js",
6
6
  "bin": {