Feat v0.7.2 package runners ci gate (#56)
All checks were successful
CI/CD / detect-changes (push) Successful in 4s
CI/CD / test-runners (push) Has been skipped
CI/CD / test-frontend (push) Successful in 6s
CI/CD / test-go-pg (push) Successful in 2m39s
CI/CD / test-sqlite (push) Successful in 2m55s
CI/CD / build-and-deploy (push) Successful in 29s

Co-authored-by: Jeffrey Smith <jasafpro@gmail.com>
Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
This commit was merged in pull request #56.
This commit is contained in:
2026-04-02 12:10:57 +00:00
committed by xcaliber
parent 829caa3b20
commit d6c7b21713
37 changed files with 1504 additions and 36 deletions

View File

@@ -127,11 +127,22 @@
});
}
// Runner dependency declarations.
// Stored here (not in manifests) to avoid the package system marking
// runners as dormant due to install-order timing during bundled install.
var RUNNER_REQUIRES = {
'notes-runner': ['notes'],
'chat-runner': ['chat', 'chat-core'],
'schedules-runner': ['schedules'],
'workflow-runner': ['content-approval'],
'renderer-runner': ['mermaid-renderer']
};
// Check requires for a runner
function checkRequires(runner) {
var requires = runner.manifest?.requires || runner.requires || [];
var requires = RUNNER_REQUIRES[runner.id] || runner.manifest?.requires || runner.requires || [];
if (!requires.length || !allPkgs) return { met: requires, missing: [] };
var installedIds = allPkgs.map(function (p) { return p.id; });
var installedIds = allPkgs.filter(function (p) { return p.enabled; }).map(function (p) { return p.id; });
var met = [], missing = [];
for (var i = 0; i < requires.length; i++) {
if (installedIds.indexOf(requires[i]) !== -1) met.push(requires[i]);
@@ -141,6 +152,14 @@
}
// Run all suites
// Post results to kernel API for CI consumption (fire-and-forget)
function postResults(runnerId, data) {
sw.api.post('/api/v1/admin/test-runners/results', {
runner_id: runnerId || 'all',
results: data
}).catch(function (e) { console.warn('[TestRunners] Failed to store results:', e.message); });
}
var runAll = useCallback(async function () {
if (running) return;
setRunning(true);
@@ -149,6 +168,7 @@
try {
var r = await sw.testing.run();
setResults(r);
postResults('all', r);
} catch (e) {
setError('Run failed: ' + e.message);
}
@@ -162,8 +182,13 @@
setRunning(true);
setRunningSuite(runner.id);
var prefix = runner.id === 'icd-test-runner' ? 'icd/' :
runner.id === 'sdk-test-runner' ? 'sdk/' : runner.id + '/';
// Map runner package ID to suite name prefix.
// ICD/SDK runners use 'icd/'/'sdk/' prefixes.
// Package runners use the package name they test: 'notes/', 'chat/', etc.
var prefix;
if (runner.id === 'icd-test-runner') prefix = 'icd/';
else if (runner.id === 'sdk-test-runner') prefix = 'sdk/';
else prefix = runner.id.replace(/-runner$/, '') + '/';
var suiteNames = sw.testing.suites().filter(function (n) { return n.indexOf(prefix) === 0; });
var allSuiteResults = [];
@@ -186,12 +211,14 @@
if (r.suites[0] && r.suites[0].status === 'skipped') summary.skipped++;
}
setResults({
var runnerResults = {
timestamp: new Date().toISOString(),
duration_ms: Math.round(performance.now() - start),
summary: summary,
suites: allSuiteResults
});
};
setResults(runnerResults);
postResults(runner.id, runnerResults);
setRunning(false);
setRunningSuite(null);
}, [running]);
@@ -299,7 +326,7 @@
<h2>Test Runners</h2>
${props.running
? html`<span class="ext-test-runners-running"><span class="ext-test-runners-spinner"></span> Running${props.runningSuite === 'all' ? ' all' : ''}...</span>`
: html`<button class="sw-btn sw-btn--primary" onClick=${props.onRunAll}>Run All (${props.suiteCount} suites)</button>`
: html`<button class="sw-btn sw-btn--primary" onClick=${props.onRunAll}>Run All</button> <span class="ext-test-runners-suite-count">${props.suiteCount} suites</span>`
}
${s ? html`
<div class="ext-test-runners-summary">
@@ -332,7 +359,8 @@
// Filter results for this runner's suites
var prefix = r.id === 'icd-test-runner' ? 'icd/' :
r.id === 'sdk-test-runner' ? 'sdk/' : r.id + '/';
r.id === 'sdk-test-runner' ? 'sdk/' :
r.id.replace(/-runner$/, '') + '/';
var runnerSuites = props.results?.suites?.filter(function (s) {
return s.name.indexOf(prefix) === 0;
}) || [];

View File

@@ -6,6 +6,6 @@
"route": "/s/test-runners",
"auth": "admin",
"layout": "single",
"version": "0.1.0",
"version": "0.2.0",
"description": "Run and view results from all installed test-runner packages."
}