{"record":{"id":"ad95607ef66b470d","repo":"jackwener/OpenCLI","slug":"no-installed-skills","errorCode":null,"errorMessage":"No installed skills.","messagePattern":"No installed skills\\.","errorType":"exception","errorClass":"EmptyResultError","httpStatus":null,"severity":"warning","filePath":"clis/trae-solo/skill-fs.js","lineNumber":78,"sourceCode":"});\n\n// -------- skill-fs-installed --------\ncli({\n    site: 'trae-solo',\n    name: 'skill-fs-installed',\n    access: 'read',\n    description: 'List INSTALLED Trae SOLO skills (managedSkills entry in ~/.trae/skill-config.json).',\n    domain: 'localhost',\n    browser: false,\n    strategy: Strategy.LOCAL,\n    args: [],\n    columns: ['Index', 'Name', 'Description', 'Source'],\n    func: async () => {\n        const cfg = readSkillConfig();\n        const managed = cfg.managedSkills || {};\n        const rows = Object.entries(managed);\n        if (!rows.length) {\n            throw new EmptyResultError('trae-solo skill-fs-installed', 'No installed skills.');\n        }\n        return rows.map(([name, source], i) => ({\n            Index: i + 1,\n            Name: name,\n            Description: '',\n            Source: source,\n        }));\n    },\n});\n\n// -------- skill-fs-show --------\ncli({\n    site: 'trae-solo',\n    name: 'skill-fs-show',\n    access: 'read',\n    description: 'Print a skill\\'s SKILL.md content + on-disk path.',\n    domain: 'localhost',\n    browser: false,","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/trae-solo/skill-fs.js#L60-L96","documentation":"Thrown as an EmptyResultError when the skill config's managedSkills map (cfg.managedSkills) is missing or empty. The 'installed' command lists skills recorded in trae's skill configuration file; with no managed entries there are no rows.","triggerScenarios":"Running trae-solo skill-fs-installed when no skills were installed through the managed flow, the skill config file was deleted/reset, or readSkillConfig() returns a config without a managedSkills key.","commonSituations":"Fresh environment before any install; user installed skills manually by copying folders (bypassing the managed registry); config file corrupted or replaced by an older trae version with a different schema.","solutions":["Install skills via the managed install command so they are registered in the skill config.","Manually add entries to the config's managedSkills object, e.g. { \"my-skill\": \"marketplace\" }.","Verify the skill config file path exists and was not reset; restore from backup if needed.","If skills exist on disk but aren't listed, they were installed out-of-band — reinstall via the CLI to register them."],"exampleFix":"// before (skill config)\n{}\n// after\n{ \"managedSkills\": { \"my-skill\": \"marketplace\" } }","handlingStrategy":"validation","validationCode":"const fs = require('fs');\nfunction hasManagedSkills(configPath) {\n  if (!fs.existsSync(configPath)) return false;\n  const cfg = JSON.parse(fs.readFileSync(configPath, 'utf-8'));\n  return cfg && typeof cfg.managedSkills === 'object' && Object.keys(cfg.managedSkills).length > 0;\n}","typeGuard":"function hasManagedSkillsCfg(cfg) {\n  return cfg != null && typeof cfg.managedSkills === 'object' && Object.keys(cfg.managedSkills || {}).length > 0;\n}","tryCatchPattern":"try {\n  const rows = await skillFsInstalled();\n} catch (e) {\n  if (e instanceof EmptyResultError && /No installed skills/.test(e.message)) {\n    // fall back to scanning the skills dir or prompt install\n  } else throw e;\n}","preventionTips":["Install skills via the managed CLI flow so they are registered.","Don't hand-edit or delete the skill config file.","If you copy skill folders manually, also register them in managedSkills.","Check the registry before scripting anything that depends on installed skills."],"tags":["empty-result","config","skills"],"backgroundTag":"empty-registry-result","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}