jackwener/OpenCLI · warning · EmptyResultError

No skills found under ~/.trae/skills/.

Error message

No skills found under ~/.trae/skills/.

What it means

Thrown as an EmptyResultError when the ~/.trae/skills/ directory contains no qualifying skill folders. The lister only counts directories that do not start with '_' and each must yield a parseable SKILL.md row; zero directories means nothing to display.

Source

Thrown at clis/trae-solo/skill-fs.js:51

    access: 'read',
    description: 'List all Trae SOLO skills present on disk under ~/.trae/skills/. Reads SKILL.md front-matter for descriptions. Works while Trae is closed.',
    domain: 'localhost',
    browser: false,
    strategy: Strategy.LOCAL,
    args: [
        { name: 'limit', type: 'int', required: false, default: 200, help: 'Max rows' },
    ],
    columns: ['Index', 'Name', 'Description', 'Source'],
    func: async (args) => {
        assertReadable(TRAE_SKILLS_DIR, '~/.trae/skills');
        const dirs = fs.readdirSync(TRAE_SKILLS_DIR).filter((n) => {
            const full = path.join(TRAE_SKILLS_DIR, n);
            return fs.statSync(full).isDirectory() && !n.startsWith('_');
        });
        const rows = dirs.map((d) => parseSkillMd(path.join(TRAE_SKILLS_DIR, d)));
        const limit = Number.isInteger(args.limit) && args.limit > 0 ? args.limit : 200;
        if (!rows.length) {
            throw new EmptyResultError('trae-solo skill-fs-list', 'No skills found under ~/.trae/skills/.');
        }
        return rows.slice(0, limit).map((r, i) => ({
            Index: i + 1,
            Name: r.name,
            Description: (r.description || '').slice(0, 120),
            Source: '',
        }));
    },
});

// -------- skill-fs-installed --------
cli({
    site: 'trae-solo',
    name: 'skill-fs-installed',
    access: 'read',
    description: 'List INSTALLED Trae SOLO skills (managedSkills entry in ~/.trae/skill-config.json).',
    domain: 'localhost',
    browser: false,

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Install at least one skill so a folder with SKILL.md exists under ~/.trae/skills/.
  2. Verify ~/.trae/skills/ exists: ls ~/.trae/skills/ — create it and install skills if missing.
  3. Check that skill folders are directories (not zips/files) and are not prefixed with '_'.
  4. If running in a container/CI, confirm HOME resolves to the profile that actually has the skills.

Example fix

# before
ls ~/.trae/skills/  # empty
# after
mkdir -p ~/.trae/skills/my-skill && echo '---\nname: my-skill\ndescription: demo\n---' > ~/.trae/skills/my-skill/SKILL.md
Defensive patterns

Strategy: validation

Validate before calling

const fs = require('fs'), path = require('path'), os = require('os');
function skillsDirHasSkills() {
  const dir = path.join(os.homedir(), '.trae', 'skills');
  if (!fs.existsSync(dir)) return false;
  return fs.readdirSync(dir).some(n => n[0] !== '_' && fs.statSync(path.join(dir, n)).isDirectory());
}

Type guard

function hasSkillDirs(entries) {
  return Array.isArray(entries) && entries.some(n => typeof n === 'string' && !n.startsWith('_'));
}

Try / catch

try {
  const rows = await skillFsList();
} catch (e) {
  if (e instanceof EmptyResultError && /No skills found/.test(e.message)) {
    // install a skill or point the user at the install flow
  } else throw e;
}

Prevention

When it happens

Trigger: Running trae-solo skill-fs-list when ~/.trae/skills/ does not exist, is empty, contains only files (not directories), or only underscore-prefixed dirs like _template.

Common situations: Fresh trae install with no skills installed; TRAE_SKILLS_DIR pointing at the wrong home directory (e.g. under a different USER profile or container); user renamed skills folders with a leading underscore.

Related errors


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