{"record":{"id":"31fca95692477db8","repo":"Fission-AI/OpenSpec","slug":"openspec-update-failed-for-failedtools-map-too","errorCode":null,"errorMessage":"OpenSpec update failed for: ${failedTools.map((tool) => tool.name).join(', ')}","messagePattern":"OpenSpec update failed for: (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/core/update.ts","lineNumber":504,"sourceCode":"    }\n\n    console.log();\n    const affectedToolIds = [...new Set([...newlyConfiguredTools, ...updatedToolIds])];\n    const shouldRestartIde = affectedToolIds.some((toolId) => {\n      const tool = AI_TOOLS.find((candidate) => candidate.value === toolId);\n      return Boolean(\n        tool?.requiresIdeRestart &&\n        (\n          shouldGenerateCommandsForTool(toolId, delivery) ||\n          shouldGenerateSkillsForTool(toolId, delivery)\n        )\n      );\n    });\n    if (shouldRestartIde) {\n      console.log(chalk.dim('Restart your IDE for changes to take effect.'));\n    }\n    if (failedTools.length > 0) {\n      throw new Error(`OpenSpec update failed for: ${failedTools.map((tool) => tool.name).join(', ')}`);\n    }\n  }\n\n  private async syncCopilotCloudFiles(projectPath: string, configuredTools: string[]): Promise<void> {\n    try {\n      if (includesGitHubCopilot(configuredTools)) {\n        // Cloud files are opt-in (see cloud-agent.ts). `update` never prompts,\n        // so it only refreshes files the user has already opted into (via\n        // `openspec init` or a `githubCopilot.cloudAgent: true` config), or that\n        // a pre-opt-in project already has. Opting in is a deliberate init/config\n        // step, never a silent side effect of running update.\n        if (await isCopilotCloudEnabled(projectPath)) {\n          await writeCopilotCloudFiles(projectPath);\n          const collisions = await findUnmanagedCloudFiles(projectPath);\n          if (collisions.length > 0) {\n            console.log(\n              chalk.dim(\n                `Left your existing ${collisions.join(' and ')} untouched — add the OpenSpec ` +","sourceCodeStart":486,"sourceCodeEnd":522,"githubUrl":"https://github.com/Fission-AI/OpenSpec/blob/6926ccb18afa4ff621112813e9968334576ee11a/src/core/update.ts#L486-L522","documentation":"Error \"OpenSpec update failed for: ${failedTools.map((tool) => tool.name).join(', ')}\" thrown in Fission-AI/OpenSpec.","triggerScenarios":"Thrown at src/core/update.ts:504 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6926ccb18afa4ff621112813e9968334576ee11a","analyzedAt":"2026-08-25T12:29:45.729Z","schemaVersion":2},"datasetVersion":"2026-08-25T16:17:27.014Z"}