Skip to content

feat(marketplace): implement skills tab with MCP/modes placeholders#7122

Merged
markijbema merged 3 commits into
mainfrom
mark/marketplace-skills-only
Mar 16, 2026
Merged

feat(marketplace): implement skills tab with MCP/modes placeholders#7122
markijbema merged 3 commits into
mainfrom
mark/marketplace-skills-only

Conversation

@markijbema

@markijbema markijbema commented Mar 16, 2026

Copy link
Copy Markdown
Contributor

Summary

What's Included

Extension-Side Services (src/services/marketplace/):

  • API Client — fetches modes, MCPs, and skills from api.kilo.ai with 5-minute cache and retry logic
  • Installation Detection — scans config files + CLI skill data to determine installed items
  • Installer — handles skill tarball download/extract, MCP/mode config writes
  • Path Resolution — resolves config paths for project and global scopes

IPC Protocol:

  • fetchMarketplaceData / marketplaceData
  • installMarketplaceItem / marketplaceInstallResult
  • removeInstalledMarketplaceItem / marketplaceRemoveResult

Webview UI (webview-ui/src/components/marketplace/):

  • MarketplaceView — 3-tab UI (Skills, MCP Servers, Modes)
  • SkillsMarketplace — search + category filter + card grid
  • ItemCard — reusable card with install/remove actions
  • InstallModal — scope selection, parameter form, prerequisites
  • RemoveDialog — confirmation before removal

Other:

  • project-directory.ts — multi-root workspace directory resolution for standalone panels
  • yaml dependency for mode content parsing
  • Marketplace button now opens editor panel instead of sidebar view
CleanShot 2026-03-16 at 19 01 39

@markijbema markijbema force-pushed the mark/marketplace-skills-only branch from 1d47d70 to 51f82a4 Compare March 16, 2026 17:26
Adds the marketplace feature to the VS Code extension with the Skills tab fully functional and MCP Servers/Modes tabs as placeholders.

Backend: marketplace API client, installation detection, skill installer (MCP/mode install not yet implemented), path resolution.

IPC: fetchMarketplaceData, installMarketplaceItem, removeInstalledMarketplaceItem message types.

Webview: MarketplaceView with 3-tab UI, SkillsMarketplace with search and category filtering, ItemCard, InstallModal, RemoveDialog.

Marketplace opens as editor panel via SettingsEditorProvider with multi-root workspace project directory support.
Internationalize all hardcoded strings in marketplace components
using useLanguage() and add translations to kilo-i18n for all 16
supported locales: en, ar, br, bs, da, de, es, fr, ja, ko, no, pl,
ru, th, zh, zht.

27 translation keys added per locale covering tabs, search, card
actions, install modal, and remove dialog.
@markijbema markijbema force-pushed the mark/marketplace-skills-only branch from 7ac21e8 to ea4f5eb Compare March 16, 2026 17:51
The modal was transparent because it referenced non-existent CSS
variables (--bg-base, --fg-base, etc). Replace all instances with the
correct kilo-ui vscode-bridge variables (--background-base, --text-base,
--text-weak, --text-on-success-base, --text-on-critical-base, etc).
@markijbema markijbema marked this pull request as ready for review March 16, 2026 19:42
@markijbema markijbema merged commit 8077d65 into main Mar 16, 2026
15 of 16 checks passed
@markijbema markijbema deleted the mark/marketplace-skills-only branch March 16, 2026 19:42
await fs.writeFile(tarball, buffer)

await fs.mkdir(staging, { recursive: true })
await exec("tar", ["-xzf", tarball, "--strip-components=1", "-C", staging])

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CRITICAL: Untrusted tarball extraction can escape the staging directory

findEscapedPaths() runs only after tar -xzf has already materialized the archive. A crafted marketplace tarball can use ../ entries or link entries to write outside staging, so the malicious write happens before we ever validate it. Please validate archive entries before extraction or use an extractor that rejects path traversal, otherwise installing a skill can overwrite arbitrary files on the user's machine.

private async fetchCliSkills(): Promise<Array<{ name: string; location: string }> | undefined> {
if (!this.client) return undefined
try {
const dir = this.getWorkspaceDirectory()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Marketplace panels still read skills from workspaceFolders[0]

fetchMarketplaceData() passes a project-aware directory into the marketplace service, but this helper ignores it and always calls getWorkspaceDirectory(). In a multi-root workspace, opening the marketplace from repo B will still fetch skill state from repo A, so project installs/removals are shown against the wrong repo and newly installed skills in repo B will not appear until the extension is reloaded.

@kilo-code-bot

kilo-code-bot Bot commented Mar 16, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 1
SUGGESTION 0

Fix these issues in Kilo Cloud

Issue Details (click to expand)

CRITICAL

File Line Issue
packages/kilo-vscode/src/services/marketplace/installer.ts 72 Extracting marketplace tarballs with tar before validating entries allows path traversal writes outside the staging directory.

WARNING

File Line Issue
packages/kilo-vscode/src/KiloProvider.ts 1197 Standalone marketplace panels still resolve skills from workspaceFolders[0], so multi-root installs/removals can show the wrong repo state.
Other Observations (not in diff)

None.

Files Reviewed (39 files)
  • bun.lock
  • packages/kilo-i18n/src/ar.ts
  • packages/kilo-i18n/src/br.ts
  • packages/kilo-i18n/src/bs.ts
  • packages/kilo-i18n/src/da.ts
  • packages/kilo-i18n/src/de.ts
  • packages/kilo-i18n/src/en.ts
  • packages/kilo-i18n/src/es.ts
  • packages/kilo-i18n/src/fr.ts
  • packages/kilo-i18n/src/ja.ts
  • packages/kilo-i18n/src/ko.ts
  • packages/kilo-i18n/src/no.ts
  • packages/kilo-i18n/src/pl.ts
  • packages/kilo-i18n/src/ru.ts
  • packages/kilo-i18n/src/th.ts
  • packages/kilo-i18n/src/zh.ts
  • packages/kilo-i18n/src/zht.ts
  • packages/kilo-vscode/package.json
  • packages/kilo-vscode/src/KiloProvider.ts
  • packages/kilo-vscode/src/SettingsEditorProvider.ts
  • packages/kilo-vscode/src/extension.ts
  • packages/kilo-vscode/src/project-directory.ts
  • packages/kilo-vscode/src/services/marketplace/api.ts
  • packages/kilo-vscode/src/services/marketplace/detection.ts
  • packages/kilo-vscode/src/services/marketplace/index.ts
  • packages/kilo-vscode/src/services/marketplace/installer.ts
  • packages/kilo-vscode/src/services/marketplace/paths.ts
  • packages/kilo-vscode/src/services/marketplace/types.ts
  • packages/kilo-vscode/webview-ui/src/App.tsx
  • packages/kilo-vscode/webview-ui/src/components/marketplace/InstallModal.tsx
  • packages/kilo-vscode/webview-ui/src/components/marketplace/ItemCard.tsx
  • packages/kilo-vscode/webview-ui/src/components/marketplace/MarketplaceView.tsx
  • packages/kilo-vscode/webview-ui/src/components/marketplace/RemoveDialog.tsx
  • packages/kilo-vscode/webview-ui/src/components/marketplace/SkillsMarketplace.tsx
  • packages/kilo-vscode/webview-ui/src/components/marketplace/index.ts
  • packages/kilo-vscode/webview-ui/src/components/marketplace/marketplace.css
  • packages/kilo-vscode/webview-ui/src/components/marketplace/utils.ts
  • packages/kilo-vscode/webview-ui/src/types/marketplace.ts
  • packages/kilo-vscode/webview-ui/src/types/messages.ts

Reviewed by gpt-5.4-20260305 · 1,094,487 tokens

jliounis pushed a commit to jliounis/kilocode that referenced this pull request May 18, 2026
…s-only

feat(marketplace): implement skills tab with MCP/modes placeholders
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants