All checks were successful
CI/CD / detect-changes (pull_request) Successful in 23s
CI/CD / test-frontend (pull_request) Successful in 26s
CI/CD / test-go-pg (pull_request) Successful in 2m35s
CI/CD / test-sqlite (pull_request) Successful in 3m19s
CI/CD / build-and-deploy (pull_request) Successful in 1m46s
sw.testing SDK module — structured test framework for surface runners: - suite/test registration, lifecycle hooks (beforeAll/afterAll/beforeEach/afterEach) - Assertion library (ok/eq/neq/gt/match/throws/status/shape/arrayOf) - Auto-cleanup via track(type, id) with LIFO deletion - Three result statuses: passed/failed/warned - Structured JSON results with timing, warnings, cleanup stats test-runner manifest type: - ValidateManifest accepts "test-runner" packages - Excluded from sidebar nav (extensionNavItems filters surface/full only) - DB migrations: SQLite 013, Postgres 014 (CHECK constraint) ICD runner migration (kernel-only): - Migrated from T.test()/T.assert() to sw.testing.suite() - Stripped extension-dependent tests (channels, notes, personas, etc.) - Kernel suites: smoke, crud, authz, security, providers, packaging, sdk - Deleted ui.js + css (rendering delegated to registry surface) SDK runner migration (kernel-only): - Migrated from T.dualTest()/T.domains to sw.testing.suite() - Stripped extension domains (belong in v0.7.2 package runners) - Kernel suites: misc, workflows, admin, packages, connections, deps, composition Runner registry surface (/s/test-runners): - Admin-only dashboard discovering test-runner packages - Run All / per-runner Run buttons, real-time results - Export Failures / Export Full Results (JSON download) - Dark mode styling using kernel CSS variables - Suite count polling for async runner script loading 141 passed, 0 failed on fresh minimal install. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
204 lines
5.1 KiB
CSS
204 lines
5.1 KiB
CSS
/* Test Runners — Registry Surface
|
|
Uses kernel CSS variables from variables.css (--bg-*, --border, --text-*, etc.) */
|
|
|
|
.ext-test-runners-root {
|
|
max-width: 1200px;
|
|
margin: 0 auto;
|
|
padding: var(--sp-6, 24px) var(--sp-4, 16px);
|
|
font-family: var(--font, system-ui, sans-serif);
|
|
color: var(--text, #e8e8ed);
|
|
}
|
|
|
|
/* ── Run All Bar ─────────────────────────────── */
|
|
|
|
.ext-test-runners-bar {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--sp-4, 16px);
|
|
margin-bottom: var(--sp-6, 24px);
|
|
padding: var(--sp-4, 16px);
|
|
background: var(--bg-raised, #222227);
|
|
border-radius: var(--radius-lg, 12px);
|
|
border: 1px solid var(--border, #2e2e35);
|
|
}
|
|
|
|
.ext-test-runners-bar h2 {
|
|
margin: 0;
|
|
font-size: 1.1rem;
|
|
font-weight: 600;
|
|
flex: 1;
|
|
color: var(--text, #e8e8ed);
|
|
}
|
|
|
|
.ext-test-runners-summary {
|
|
display: flex;
|
|
gap: var(--sp-3, 12px);
|
|
font-size: 0.85rem;
|
|
}
|
|
|
|
.ext-test-runners-stat {
|
|
padding: 2px 8px;
|
|
border-radius: var(--radius-sm, 4px);
|
|
font-weight: 500;
|
|
}
|
|
|
|
.ext-test-runners-stat--pass { background: var(--success-dim, rgba(34,197,94,0.2)); color: var(--success-light, #4ade80); }
|
|
.ext-test-runners-stat--fail { background: var(--danger-dim, rgba(239,68,68,0.2)); color: var(--danger-light, #f87171); }
|
|
.ext-test-runners-stat--warn { background: var(--warning-dim, rgba(234,179,8,0.2)); color: var(--warning-light, #fbbf24); }
|
|
.ext-test-runners-stat--skip { background: var(--bg-hover, #2a2a30); color: var(--text-3, #6b6b7b); }
|
|
|
|
/* ── Runner Cards ────────────────────────────── */
|
|
|
|
.ext-test-runners-grid {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--sp-4, 16px);
|
|
}
|
|
|
|
.ext-test-runners-card {
|
|
border: 1px solid var(--border, #2e2e35);
|
|
border-radius: var(--radius-lg, 12px);
|
|
padding: var(--sp-4, 16px);
|
|
background: var(--bg-surface, #18181b);
|
|
}
|
|
|
|
.ext-test-runners-card__header {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--sp-3, 12px);
|
|
margin-bottom: var(--sp-3, 12px);
|
|
}
|
|
|
|
.ext-test-runners-card__icon {
|
|
font-size: 1.5rem;
|
|
}
|
|
|
|
.ext-test-runners-card__title {
|
|
font-size: 1rem;
|
|
font-weight: 600;
|
|
flex: 1;
|
|
margin: 0;
|
|
color: var(--text, #e8e8ed);
|
|
}
|
|
|
|
.ext-test-runners-card__desc {
|
|
font-size: 0.85rem;
|
|
color: var(--text-2, #9898a8);
|
|
margin: 0 0 var(--sp-3, 12px) 0;
|
|
}
|
|
|
|
.ext-test-runners-card__requires {
|
|
font-size: 0.8rem;
|
|
color: var(--text-3, #6b6b7b);
|
|
margin-bottom: var(--sp-2, 8px);
|
|
}
|
|
|
|
.ext-test-runners-card__requires--missing {
|
|
color: var(--warning, #eab308);
|
|
}
|
|
|
|
/* ── Results Panel ───────────────────────────── */
|
|
|
|
.ext-test-runners-results {
|
|
margin-top: var(--sp-3, 12px);
|
|
border-top: 1px solid var(--border, #2e2e35);
|
|
padding-top: var(--sp-3, 12px);
|
|
}
|
|
|
|
.ext-test-runners-suite {
|
|
margin-bottom: var(--sp-3, 12px);
|
|
}
|
|
|
|
.ext-test-runners-suite__name {
|
|
font-weight: 600;
|
|
font-size: 0.9rem;
|
|
margin-bottom: var(--sp-1, 4px);
|
|
cursor: pointer;
|
|
user-select: none;
|
|
color: var(--text, #e8e8ed);
|
|
}
|
|
|
|
.ext-test-runners-suite__name:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.ext-test-runners-test {
|
|
display: flex;
|
|
align-items: baseline;
|
|
gap: var(--sp-2, 8px);
|
|
padding: 2px 0 2px var(--sp-4, 16px);
|
|
font-size: 0.85rem;
|
|
font-family: var(--mono, monospace);
|
|
}
|
|
|
|
.ext-test-runners-test__status {
|
|
width: 16px;
|
|
text-align: center;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.ext-test-runners-test__name {
|
|
flex: 1;
|
|
color: var(--text-2, #9898a8);
|
|
}
|
|
|
|
.ext-test-runners-test__time {
|
|
color: var(--text-3, #6b6b7b);
|
|
font-size: 0.8rem;
|
|
}
|
|
|
|
.ext-test-runners-test__detail {
|
|
color: var(--danger-light, #f87171);
|
|
font-size: 0.8rem;
|
|
padding-left: calc(var(--sp-4, 16px) + 24px);
|
|
word-break: break-word;
|
|
}
|
|
|
|
/* Status colors */
|
|
.ext-test-runners-status--passed { color: var(--success, #1dab51); }
|
|
.ext-test-runners-status--failed { color: var(--danger, #ef4444); }
|
|
.ext-test-runners-status--warned { color: var(--warning, #eab308); }
|
|
.ext-test-runners-status--skipped { color: var(--text-3, #6b6b7b); }
|
|
|
|
/* ── Loading / Empty ─────────────────────────── */
|
|
|
|
.ext-test-runners-loading,
|
|
.ext-test-runners-empty {
|
|
text-align: center;
|
|
padding: var(--sp-8, 32px);
|
|
color: var(--text-2, #9898a8);
|
|
}
|
|
|
|
/* ── Running indicator ───────────────────────── */
|
|
|
|
.ext-test-runners-running {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: var(--sp-2, 8px);
|
|
font-size: 0.85rem;
|
|
color: var(--text-2, #9898a8);
|
|
}
|
|
|
|
@keyframes ext-test-runners-spin {
|
|
to { transform: rotate(360deg); }
|
|
}
|
|
|
|
.ext-test-runners-spinner {
|
|
width: 14px;
|
|
height: 14px;
|
|
border: 2px solid var(--border, #2e2e35);
|
|
border-top-color: var(--accent, #6493ed);
|
|
border-radius: 50%;
|
|
animation: ext-test-runners-spin 0.8s linear infinite;
|
|
}
|
|
|
|
/* ── Export Bar ───────────────────────────────── */
|
|
|
|
.ext-test-runners-export {
|
|
display: flex;
|
|
gap: var(--sp-3, 12px);
|
|
margin-top: var(--sp-4, 16px);
|
|
padding-top: var(--sp-4, 16px);
|
|
border-top: 1px solid var(--border, #2e2e35);
|
|
}
|