NousResearch/hermes-agent · error

"${result.extensionId}" does not contribute any color themes

Error message

"${result.extensionId}" does not contribute any color themes.

What it means

Thrown by buildThemeFromMarketplace when a successfully downloaded VS Code Marketplace extension contributes zero color themes (result.themes is empty). The installer expects the extension manifest to list at least one theme contribution; an extension that ships icons, snippets, or language packs only produces an empty array and this error.

Source

Thrown at apps/desktop/src/themes/install.ts:40

  const { theme } = convertVscodeColorTheme(raw, opts)

  return installUserTheme(theme)
}

/**
 * Fold every color theme an extension contributes into ONE desktop theme family.
 *
 * Many extensions ship a light *and* a dark variant (GitHub, Solarized, Winter
 * is Coming…). Rather than install them as separate flat entries — which made
 * the light/dark toggle a no-op and let "install in dark mode" land on the light
 * variant — we map the first light variant onto `colors` and the first dark
 * variant onto `darkColors`. The result is a single picker entry whose light/dark
 * toggle switches between the real variants. A single-variant extension fills
 * both slots with its one palette (the toggle is a no-op, as it must be).
 */
export function buildThemeFromMarketplace(result: DesktopMarketplaceThemeResult): DesktopTheme {
  if (!result.themes.length) {
    throw new Error(`"${result.extensionId}" does not contribute any color themes.`)
  }

  const variants = result.themes.map(file => {
    const raw = parseVscodeTheme(file.contents)
    const label = file.label || raw.name || result.displayName
    const { mode, theme } = convertVscodeColorTheme(raw, { label, source: result.extensionId })

    return { mode, palette: theme.colors, terminal: theme.terminal }
  })

  const fallback = variants[0]
  const light = variants.find(variant => variant.mode === 'light') ?? fallback
  const dark = variants.find(variant => variant.mode === 'dark') ?? fallback

  // The terminal ANSI palette tracks the painted variant the same way colors do
  // (light → terminal, dark → darkTerminal); each falls back to the other so a
  // single-variant import still themes the terminal in both modes.
  const terminal = light.terminal ?? dark.terminal

View on GitHub (pinned to c896c09c42)

Solutions

  1. Verify on the Marketplace page that the extension actually ships color themes (not just icon themes or tools).
  2. Use the exact publisher.extension id of a known color theme (e.g. 'GitHub.github-vscode-theme').
  3. If the extension should have themes, check the fetchMarketplace result — the API response may be truncated or the manifest unreadable; retry after app update.
Defensive patterns

Strategy: validation

Validate before calling

function isColorThemeExtension(result: DesktopMarketplaceThemeResult): boolean {
  return Array.isArray(result.themes) && result.themes.length > 0
}

Type guard

function hasThemes(result: DesktopMarketplaceThemeResult): result is DesktopMarketplaceThemeResult & { themes: [ThemeFile, ...ThemeFile[]] } {
  return result.themes.length > 0
}

Try / catch

try {
  await installVscodeThemeFromMarketplace(id)
} catch (e) {
  if (e instanceof Error && e.message.includes('does not contribute any color themes'))
    showHint('Pick an extension that ships color themes')
  else throw e
}

Prevention

When it happens

Trigger: installVscodeThemeFromMarketplace(id) with a valid 'publisher.extension' id for an extension whose package.json has no contributes.themes entries (or whose themes the fetcher could not read).

Common situations: Installing an icon theme (e.g. Material Icon Theme) or a product extension (Prettier, ESLint) by id, mistaking it for a color theme; or a Marketplace metadata change that drops theme contribution info.

Related errors


AI-assisted analysis of NousResearch/hermes-agent@c896c09c42 (2026-08-14). Data as JSON: /api/errors/c580191d1883d2d5. Report an issue: GitHub.