{"record":{"id":"c7fff35c3134143e","repo":"davila7/claude-code-templates","slug":"could-not-analyze-skills","errorCode":null,"errorMessage":"Could not analyze skills:","messagePattern":"Could not analyze skills:","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"cli-tool/src/analytics/core/YearInReview2025.js","lineNumber":758,"sourceCode":"          });\n\n          // Only include 2025 skills\n          if (installedAt.getFullYear() === 2025) {\n            skillEvents.push({\n              name: item,\n              timestamp: installedAt\n            });\n          }\n        }\n      }\n\n      return {\n        skills: skills.sort((a, b) => b.installedAt - a.installedAt),\n        total: skills.length,\n        events: skillEvents.sort((a, b) => a.timestamp - b.timestamp)\n      };\n    } catch (error) {\n      console.warn('Could not analyze skills:', error.message);\n      return { skills: [], total: 0, events: [] };\n    }\n  }\n\n  /**\n   * Analyze installed MCPs\n   * @returns {Promise<Object>} MCPs data\n   */\n  async analyzeMCPs() {\n    const fs = require('fs-extra');\n    const os = require('os');\n    const path = require('path');\n\n    try {\n      const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');\n      if (!await fs.pathExists(settingsPath)) {\n        return { mcps: [], total: 0, events: [] };\n      }","sourceCodeStart":740,"sourceCodeEnd":776,"githubUrl":"https://github.com/davila7/claude-code-templates/blob/a0851ed10c7c60463dac8cfaaca124cf32d5804d/cli-tool/src/analytics/core/YearInReview2025.js#L740-L776","documentation":"YearInReview2025 skill analysis caught an error and returns empty skills data. Same degrade-gracefully pattern as the other analyzers: the report renders without the skills section.","triggerScenarios":"Scanning installed skills (~/.claude/skills or component skill dirs) for metadata/installedAt timestamps throws — missing fields, unreadable SKILL.md frontmatter, stat failures.","commonSituations":"Skills installed by older CLI versions lacking metadata; hand-copied skill folders without frontmatter; permission issues.","solutions":["Ignore — report continues without skills","Verify skill folders have valid frontmatter (name/description) if you want them counted","Fix permissions under the skills directory","Update CLI for newer skill format support"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"function validSkillDir(dir) {\n  return fs.existsSync(path.join(dir, 'SKILL.md'));\n}","typeGuard":"function isValidSkillMeta(m) {\n  return !!m && typeof m.name === 'string' && typeof m.description === 'string';\n}","tryCatchPattern":"try { return analyzeSkills(...); }\ncatch (error) { console.warn('Could not analyze skills:', error.message); return { skills: [], total: 0, events: [] }; }","preventionTips":["Give every custom skill folder a valid SKILL.md with name/description frontmatter","Install skills via the CLI so metadata/timestamps are recorded","Ignore blank skill sections in year-in-review output"],"tags":["year-in-review","skills","parsing"],"backgroundTag":"skill-metadata-parse-error","analyzedSha":"a0851ed10c7c60463dac8cfaaca124cf32d5804d","analyzedAt":"2026-08-28T14:11:56.058Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}