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
- Install at least one skill so a folder with SKILL.md exists under ~/.trae/skills/.
- Verify ~/.trae/skills/ exists: ls ~/.trae/skills/ — create it and install skills if missing.
- Check that skill folders are directories (not zips/files) and are not prefixed with '_'.
- 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
- Verify ~/.trae/skills/ exists and contains at least one skill folder with SKILL.md.
- Avoid underscore-prefixed names for real skills.
- Confirm HOME resolves correctly in containers/CI.
- Install skills through the CLI so the directory is populated.
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
- antigravity workspaces-list: No workspace storage.
- No installed skills.
- Skill "${name}" not found.
- No installed skills visible.
- No tasks on disk.
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/5d97c3fdc47634fa.
Report an issue: GitHub.