{"record":{"id":"edd9d7df0b66fe4d","repo":"jackwener/OpenCLI","slug":"no-installed-skills-visible","errorCode":null,"errorMessage":"No installed skills visible.","messagePattern":"No installed skills visible\\.","errorType":"exception","errorClass":"EmptyResultError","httpStatus":null,"severity":"warning","filePath":"clis/trae-solo/skill.js","lineNumber":88,"sourceCode":"        await ensureSkillsTab(page, installed ? 'Installed' : 'Skills Marketplace');\n\n        const items = await page.evaluate(`(function() {\n      const sel = ${installed ? \"'.installed-card'\" : \"'.marketplace-card-v2'\"};\n      const cards = Array.from(document.querySelectorAll(sel)).filter((c) => c.offsetParent);\n      return cards.map((c, i) => {\n        const logo = c.querySelector('.skill-logo-svg');\n        const name = (logo && logo.getAttribute('aria-label')) || '';\n        // Card text starts with the name; trim that off to get description.\n        const full = (c.innerText || '').replace(/\\\\s+/g, ' ').trim();\n        let desc = full;\n        if (name && desc.startsWith(name)) desc = desc.slice(name.length).trim();\n        return { index: i + 1, name: name || full.split(' ')[0], description: desc.slice(0, 200) };\n      });\n    })()`);\n        const limit = Number.isInteger(kwargs.limit) && kwargs.limit > 0 ? kwargs.limit : 100;\n        const rows = (items || []).slice(0, limit);\n        if (!rows.length) {\n            throw new EmptyResultError(\n                'trae-solo skill-list',\n                installed ? 'No installed skills visible.' : 'No marketplace skills visible.',\n            );\n        }\n        return rows.map((r) => ({ Index: r.index, Name: r.name, Description: r.description }));\n    },\n});\n\n// -------- skill-search --------\ncli({\n    site: 'trae-solo',\n    name: 'skill-search',\n    access: 'read',\n    description: 'Filter Skills Marketplace by keyword.',\n    domain: 'localhost',\n    strategy: Strategy.UI,\n    browser: true,\n    args: [","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/trae-solo/skill.js#L70-L106","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nawait skillList({ installed: true }) // immediately after opening the app\n// after\nawait waitForSkillsPanel(page); await skillList({ installed: true })","handlingStrategy":"try-catch","validationCode":"// wait until the skills panel has rendered items before listing\nawait page.waitForFunction(() => document.querySelectorAll('.skill-item, [class*=skill]').length > 0, { timeout: 10000 }).catch(() => {});","typeGuard":null,"tryCatchPattern":"try {\n  const rows = await skillList({ installed: true });\n} catch (e) {\n  if (e instanceof EmptyResultError && /No installed skills visible/.test(e.message)) {\n    // retry after a delay or surface 'no skills installed' to the user\n  } else throw e;\n}","preventionTips":["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."],"tags":["empty-result","ui-automation","skills"],"backgroundTag":"empty-scraped-result","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}