{"record":{"id":"29b29418efc792a6","repo":"davila7/claude-code-templates","slug":"failed-to-load-summary-29b294","errorCode":null,"errorMessage":"Failed to load summary","messagePattern":"Failed to load summary","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"cli-tool/src/skill-dashboard.js","lineNumber":455,"sourceCode":"    });\n\n    this.app.get('/api/summary', async (req, res) => {\n      try {\n        await this.loadSkillsData();\n        const personalCount = this.skills.filter(s => s.source === 'Personal').length;\n        const projectCount = this.skills.filter(s => s.source === 'Project').length;\n        const pluginCount = this.skills.filter(s => s.source === 'Plugin').length;\n\n        res.json({\n          total: this.skills.length,\n          personal: personalCount,\n          project: projectCount,\n          plugin: pluginCount,\n          timestamp: new Date().toISOString()\n        });\n      } catch (error) {\n        console.error('Error loading summary:', error);\n        res.status(500).json({ error: 'Failed to load summary' });\n      }\n    });\n\n    // Main route\n    this.app.get('/', (req, res) => {\n      res.sendFile(path.join(__dirname, 'skill-dashboard-web', 'index.html'));\n    });\n  }\n\n  async startServer() {\n    return new Promise((resolve, reject) => {\n      const tryPort = (port) => {\n        this.httpServer = this.app.listen(port, async () => {\n          this.port = port;\n          console.log(chalk.green(`🎯 Skills dashboard started at http://localhost:${this.port}`));\n          resolve();\n        }).on('error', (err) => {\n          if (err.code === 'EADDRINUSE') {","sourceCodeStart":437,"sourceCodeEnd":473,"githubUrl":"https://github.com/davila7/claude-code-templates/blob/a0851ed10c7c60463dac8cfaaca124cf32d5804d/cli-tool/src/skill-dashboard.js#L437-L473","documentation":"HTTP 500 from the teams/skill dashboard GET /api/summary when this.loadSkillsData() (or summary computation) throws while scanning skill directories.","triggerScenarios":"GET /api/summary while a skill directory is unreadable, a skills path is missing, or the scan routine throws on unexpected content.","commonSituations":"Skills directory deleted or moved after dashboard start; permission problems in ~/.claude/skills; malformed skill metadata during scan.","solutions":["Check server console 'Error loading summary:' for root cause","Verify skills directories exist and are readable","Restart the dashboard to rescan"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { const s = await getSummary(); } catch { await delay(1000); retryOnce(); }","preventionTips":["Keep skills directories present and readable","Restart dashboard after moving skill folders"],"tags":["http-500","skill-dashboard","express"],"backgroundTag":"http-500-internal-server-error","analyzedSha":"a0851ed10c7c60463dac8cfaaca124cf32d5804d","analyzedAt":"2026-08-28T14:11:56.058Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}