skopix 2.0.4 → 2.0.6

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.
@@ -3481,7 +3481,7 @@ async function resolveUserSecretsEnv(userId, teamMode) {
3481
3481
  if (key === 'ANTHROPIC_API_KEY' && !env.CLAUDE_API_KEY) env.CLAUDE_API_KEY = value;
3482
3482
  } catch (err) {
3483
3483
  // Decryption failed - log and skip. Could happen if SKOPIX_SECRET_KEY changed since the value was encrypted.
3484
- console.error(`Failed to decrypt secret ${key} for user ${userId}: ${err.message}`);
3484
+ // Silently skip secrets that can't be decrypted (e.g. encrypted with old key)
3485
3485
  }
3486
3486
  }
3487
3487
  return env;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skopix",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "description": "Browser-based QA tool — record tests by using your app, replay them deterministically, generate Playwright code automatically",
5
5
  "main": "cli/index.js",
6
6
  "bin": {
@@ -5535,9 +5535,10 @@ function renderReSteps() {
5535
5535
  + '<button class="btn-icon" style="width:22px;height:22px;font-size:11px;color:#ef4444" title="Delete step" onclick="reStepDelete(' + i + ')">✕</button>'
5536
5536
  + '</div></div>'
5537
5537
  + (isAssert
5538
- ? '<div style="display:grid;grid-template-columns:1fr' + (s.assertType !== 'visible' ? ' 1fr' : '') + ';gap:6px">'
5538
+ ? '<div style="display:grid;grid-template-columns:1fr' + (s.assertType !== 'visible' ? ' 1fr' : '') + (s.assertType === 'attribute_contains' ? ' 1fr' : '') + ';gap:6px">'
5539
5539
  + '<div><div style="font-family:var(--mono);font-size:9px;color:var(--muted);margin-bottom:3px">SELECTOR (assertType: ' + escapeHtml(s.assertType||'') + ')</div>'
5540
5540
  + '<input class="form-input" type="text" value="' + sel + '" placeholder="CSS selector..." style="padding:4px 8px;font-size:11px;height:auto;font-family:var(--mono)" onchange="reEditorState.steps[' + i + '].stableSelector=this.value;reEditorState.steps[' + i + '].selector=this.value"></div>'
5541
+ + (s.assertType === 'attribute_contains' ? '<div><div style="font-family:var(--mono);font-size:9px;color:var(--muted);margin-bottom:3px">ATTRIBUTE</div><input class="form-input" type="text" value="' + escapeHtml(s.attribute||'title') + '" placeholder="e.g. fill, style, aria-label" style="padding:4px 8px;font-size:11px;height:auto;font-family:var(--mono)" onchange="reEditorState.steps[' + i + '].attribute=this.value"></div>' : '')
5541
5542
  + (s.assertType !== 'visible' ? '<div><div style="font-family:var(--mono);font-size:9px;color:var(--muted);margin-bottom:3px">EXPECTED</div><input class="form-input" type="text" value="' + val + '" style="padding:4px 8px;font-size:11px;height:auto" onchange="reEditorState.steps[' + i + '].value=this.value"></div>' : '')
5542
5543
  + '</div>'
5543
5544
  : '<div style="display:grid;grid-template-columns:1fr' + (s.action === 'type' || s.action === 'select' ? ' 1fr' : '') + ';gap:6px">'