jackwener/OpenCLI · warning · EmptyResultError
No installed skills visible.
Error message
No installed skills visible.
What it means
Thrown as an EmptyResultError when the in-app skills list (scraped from the Trae UI via page.evaluate) returns zero rows. When the 'installed' filter is active the message is 'No installed skills visible.' — the UI panel rendered but listed no installed skills.
Source
Thrown at clis/trae-solo/skill.js:88
await ensureSkillsTab(page, installed ? 'Installed' : 'Skills Marketplace');
const items = await page.evaluate(`(function() {
const sel = ${installed ? "'.installed-card'" : "'.marketplace-card-v2'"};
const cards = Array.from(document.querySelectorAll(sel)).filter((c) => c.offsetParent);
return cards.map((c, i) => {
const logo = c.querySelector('.skill-logo-svg');
const name = (logo && logo.getAttribute('aria-label')) || '';
// Card text starts with the name; trim that off to get description.
const full = (c.innerText || '').replace(/\\s+/g, ' ').trim();
let desc = full;
if (name && desc.startsWith(name)) desc = desc.slice(name.length).trim();
return { index: i + 1, name: name || full.split(' ')[0], description: desc.slice(0, 200) };
});
})()`);
const limit = Number.isInteger(kwargs.limit) && kwargs.limit > 0 ? kwargs.limit : 100;
const rows = (items || []).slice(0, limit);
if (!rows.length) {
throw new EmptyResultError(
'trae-solo skill-list',
installed ? 'No installed skills visible.' : 'No marketplace skills visible.',
);
}
return rows.map((r) => ({ Index: r.index, Name: r.name, Description: r.description }));
},
});
// -------- skill-search --------
cli({
site: 'trae-solo',
name: 'skill-search',
access: 'read',
description: 'Filter Skills Marketplace by keyword.',
domain: 'localhost',
strategy: Strategy.UI,
browser: true,
args: [View on GitHub (pinned to 49907e53dc)
Solutions
- Install at least one skill in Trae so the installed list is non-empty.
- Ensure the Skills panel/tab is fully loaded before listing (retry or add a wait).
- If skills exist in the UI but still nothing, selectors likely broke after a Trae UI update — update the scraping selectors in skill.js.
- Drop the installed filter to check whether the marketplace list works, isolating the issue.
Example fix
// before
await skillList({ installed: true }) // immediately after opening the app
// after
await waitForSkillsPanel(page); await skillList({ installed: true }) Defensive patterns
Strategy: try-catch
Validate before calling
// wait until the skills panel has rendered items before listing
await page.waitForFunction(() => document.querySelectorAll('.skill-item, [class*=skill]').length > 0, { timeout: 10000 }).catch(() => {}); Try / catch
try {
const rows = await skillList({ installed: true });
} catch (e) {
if (e instanceof EmptyResultError && /No installed skills visible/.test(e.message)) {
// retry after a delay or surface 'no skills installed' to the user
} else throw e;
} Prevention
- Ensure at least one skill is installed in Trae before listing.
- Give the UI time to render before scraping.
- After Trae updates, re-check that list selectors still match the DOM.
- Confirm the attached window/workspace is the one with skills.
When it happens
Trigger: Running trae-solo skill-list with installed=true when the Trae window shows no installed skills — none installed, the Skills panel failed to render its list, or the DOM selectors changed so items parse to an empty array.
Common situations: Fresh Trae install with no skills; UI updated and selectors no longer match the skill list markup; the Skills tab content not yet loaded when evaluate ran; wrong workspace/window attached.
Related errors
- No Codex projects matched "${kwargs.project}". / No Codex pr
- Model dropdown opened but no options detected.
- qoder history
- No items in tab '${tabLabel}'.
- No skills found under ~/.trae/skills/.
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/edd9d7df0b66fe4d.
Report an issue: GitHub.