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

  1. Install at least one skill in Trae so the installed list is non-empty.
  2. Ensure the Skills panel/tab is fully loaded before listing (retry or add a wait).
  3. If skills exist in the UI but still nothing, selectors likely broke after a Trae UI update — update the scraping selectors in skill.js.
  4. 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

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


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/edd9d7df0b66fe4d. Report an issue: GitHub.