feat(vscode): add contribute CTA to marketplace (#9099)

Invites users to propose new skills, modes, or MCP servers via
github.com/Kilo-Org/kilo-marketplace. Shown as a subtle footer under
the card grid and inside the empty search-results state.
This commit is contained in:
Marius
2026-04-17 10:23:19 +02:00
committed by GitHub
parent cb0491eaa4
commit 49b283e72a
24 changed files with 107 additions and 3 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": minor
---
Add a "Contribute on GitHub" call-to-action in the Marketplace view so users can easily propose a new skill, mode, or MCP server. The CTA appears as a subtle footer below the card grid and inside the empty search-results state, linking to the `kilo-marketplace` repository.
+3 -1
View File
@@ -1,7 +1,7 @@
# Source Code Links
<!-- Auto-generated by script/extract-source-links.ts — DO NOT EDIT -->
<!-- 79 unique URLs extracted from extension and CLI source -->
<!-- 80 unique URLs extracted from extension and CLI source -->
- <https://api.apertis.ai/v1>
<!-- packages/opencode/src/provider/model-cache.ts -->
@@ -51,6 +51,8 @@
<!-- packages/opencode/src/lsp/server.ts -->
- <https://github.com/google-gemini/gemini-cli/blob/main/packages/core/src/utils/editCorrector.ts>
<!-- packages/opencode/src/tool/edit.ts -->
- <https://github.com/Kilo-Org/kilo-marketplace>
<!-- packages/kilo-vscode/webview-ui/src/components/marketplace/MarketplaceContribute.tsx -->
- <https://github.com/Kilo-Org/kilocode>
<!-- packages/kilo-vscode/webview-ui/src/components/settings/AboutKiloCodeTab.tsx -->
- <https://github.com/Kilo-Org/kilocode/issues/6986>
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "عدة جلسات تعمل وستتوقف",
"marketplace.warning.installAnyway": "تثبيت على أي حال",
"marketplace.warning.cancel": "إلغاء",
"marketplace.contribute.prompt": "هل تفتقد مهارة أو وضعًا أو خادم MCP؟",
"marketplace.contribute.cta": "ساهم على GitHub",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "Várias sessões estão em execução e serão interrompidas",
"marketplace.warning.installAnyway": "Instalar mesmo assim",
"marketplace.warning.cancel": "Cancelar",
"marketplace.contribute.prompt": "Está faltando uma skill, modo ou servidor MCP?",
"marketplace.contribute.cta": "Contribuir no GitHub",
}
+2
View File
@@ -74,4 +74,6 @@ export const dict = {
"marketplace.warning.busyMany": "Nekoliko sesija je pokrenuto i bit će prekinuto",
"marketplace.warning.installAnyway": "Instaliraj svejedno",
"marketplace.warning.cancel": "Otkaži",
"marketplace.contribute.prompt": "Nedostaje vještina, način rada ili MCP server?",
"marketplace.contribute.cta": "Doprinesi na GitHub-u",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "Flere sessioner kører og vil blive afbrudt",
"marketplace.warning.installAnyway": "Installer alligevel",
"marketplace.warning.cancel": "Annuller",
"marketplace.contribute.prompt": "Mangler du en skill, tilstand eller MCP-server?",
"marketplace.contribute.cta": "Bidrag på GitHub",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "Mehrere Sitzungen laufen und werden unterbrochen",
"marketplace.warning.installAnyway": "Trotzdem installieren",
"marketplace.warning.cancel": "Abbrechen",
"marketplace.contribute.prompt": "Fehlt ein Skill, Modus oder MCP-Server?",
"marketplace.contribute.cta": "Auf GitHub beitragen",
}
+2
View File
@@ -71,4 +71,6 @@ export const dict = {
"marketplace.warning.busyMany": "Several sessions are running and will be interrupted",
"marketplace.warning.installAnyway": "Install anyway",
"marketplace.warning.cancel": "Cancel",
"marketplace.contribute.prompt": "Missing a skill, mode, or MCP server?",
"marketplace.contribute.cta": "Contribute on GitHub",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "Varias sesiones están en ejecución y se interrumpirán",
"marketplace.warning.installAnyway": "Instalar de todas formas",
"marketplace.warning.cancel": "Cancelar",
"marketplace.contribute.prompt": "¿Falta una skill, modo o servidor MCP?",
"marketplace.contribute.cta": "Contribuir en GitHub",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "Plusieurs sessions sont en cours et seront interrompues",
"marketplace.warning.installAnyway": "Installer quand même",
"marketplace.warning.cancel": "Annuler",
"marketplace.contribute.prompt": "Il manque une skill, un mode ou un serveur MCP ?",
"marketplace.contribute.cta": "Contribuer sur GitHub",
}
+2
View File
@@ -67,4 +67,6 @@ export const dict = {
"marketplace.warning.busyMany": "複数のセッションが実行中で中断されます",
"marketplace.warning.installAnyway": "それでもインストール",
"marketplace.warning.cancel": "キャンセル",
"marketplace.contribute.prompt": "スキル、モード、MCP サーバーが見つかりませんか?",
"marketplace.contribute.cta": "GitHub で貢献する",
}
+2
View File
@@ -67,4 +67,6 @@ export const dict = {
"marketplace.warning.busyMany": "여러 세션이 실행 중이며 중단됩니다",
"marketplace.warning.installAnyway": "그래도 설치",
"marketplace.warning.cancel": "취소",
"marketplace.contribute.prompt": "스킬, 모드 또는 MCP 서버가 없나요?",
"marketplace.contribute.cta": "GitHub에서 기여하기",
}
+2
View File
@@ -71,4 +71,6 @@ export const dict = {
"marketplace.warning.busyMany": "Er zijn meerdere sessies actief en deze zullen worden onderbroken",
"marketplace.warning.installAnyway": "Toch installeren",
"marketplace.warning.cancel": "Annuleren",
"marketplace.contribute.prompt": "Mist er een skill, modus of MCP-server?",
"marketplace.contribute.cta": "Bijdragen op GitHub",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "Flere økter kjører og vil bli avbrutt",
"marketplace.warning.installAnyway": "Installer uansett",
"marketplace.warning.cancel": "Avbryt",
"marketplace.contribute.prompt": "Mangler du en skill, modus eller MCP-server?",
"marketplace.contribute.cta": "Bidra på GitHub",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "Kilka sesji jest uruchomionych i zostanie przerwanych",
"marketplace.warning.installAnyway": "Zainstaluj mimo to",
"marketplace.warning.cancel": "Anuluj",
"marketplace.contribute.prompt": "Brakuje skilla, trybu lub serwera MCP?",
"marketplace.contribute.cta": "Wnieś wkład na GitHubie",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "Несколько сеансов выполняются и будут прерваны",
"marketplace.warning.installAnyway": "Установить в любом случае",
"marketplace.warning.cancel": "Отмена",
"marketplace.contribute.prompt": "Не хватает навыка, режима или MCP-сервера?",
"marketplace.contribute.cta": "Внести вклад на GitHub",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "มีหลายเซสชันกำลังทำงานและจะถูกขัดจังหวะ",
"marketplace.warning.installAnyway": "ติดตั้งต่อไป",
"marketplace.warning.cancel": "ยกเลิก",
"marketplace.contribute.prompt": "ไม่พบทักษะ โหมด หรือเซิร์ฟเวอร์ MCP ที่ต้องการ?",
"marketplace.contribute.cta": "ร่วมสมทบบน GitHub",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "Birden fazla oturum çalışıyor ve kesintiye uğrayacak",
"marketplace.warning.installAnyway": "Yine de yükle",
"marketplace.warning.cancel": "İptal",
"marketplace.contribute.prompt": "Bir yetenek, mod veya MCP sunucusu mu eksik?",
"marketplace.contribute.cta": "GitHub'da katkıda bulun",
}
+2
View File
@@ -69,4 +69,6 @@ export const dict = {
"marketplace.warning.busyMany": "Виконується кілька сесій, їх буде перервано",
"marketplace.warning.installAnyway": "Встановити все одно",
"marketplace.warning.cancel": "Скасувати",
"marketplace.contribute.prompt": "Бракує навички, режиму або MCP-сервера?",
"marketplace.contribute.cta": "Зробити внесок на GitHub",
}
+2
View File
@@ -66,4 +66,6 @@ export const dict = {
"marketplace.warning.busyMany": "多个会话正在运行,将被中断",
"marketplace.warning.installAnyway": "仍然安装",
"marketplace.warning.cancel": "取消",
"marketplace.contribute.prompt": "缺少技能、模式或 MCP 服务器?",
"marketplace.contribute.cta": "在 GitHub 上贡献",
}
+2
View File
@@ -66,4 +66,6 @@ export const dict = {
"marketplace.warning.busyMany": "多個工作階段正在執行,將被中斷",
"marketplace.warning.installAnyway": "仍然安裝",
"marketplace.warning.cancel": "取消",
"marketplace.contribute.prompt": "缺少技能、模式或 MCP 伺服器?",
"marketplace.contribute.cta": "在 GitHub 上貢獻",
}
@@ -0,0 +1,19 @@
import { Button } from "@kilocode/kilo-ui/button"
import { useVSCode } from "../../context/vscode"
import { useLanguage } from "../../context/language"
const REPO_URL = "https://github.com/Kilo-Org/kilo-marketplace"
export const MarketplaceContribute = () => {
const vscode = useVSCode()
const { t } = useLanguage()
const open = () => vscode.postMessage({ type: "openExternal", url: REPO_URL })
return (
<div class="marketplace-contribute">
<span>{t("marketplace.contribute.prompt")}</span>
<Button variant="ghost" size="small" onClick={open}>
{t("marketplace.contribute.cta")}
</Button>
</div>
)
}
@@ -12,6 +12,7 @@ import type {
import { useLanguage } from "../../context/language"
import { isInstalled } from "./utils"
import { ItemCard } from "./ItemCard"
import { MarketplaceContribute } from "./MarketplaceContribute"
interface StatusOption {
value: string
@@ -124,7 +125,15 @@ export const MarketplaceListView = (props: Props) => {
</div>
}
>
<Show when={filtered().length > 0} fallback={<p class="marketplace-empty">{props.emptyMessage}</p>}>
<Show
when={filtered().length > 0}
fallback={
<div class="marketplace-empty">
<span class="marketplace-empty-message">{props.emptyMessage}</span>
<MarketplaceContribute />
</div>
}
>
<div class="marketplace-grid">
<For each={filtered()}>
{(item) => {
@@ -144,6 +153,7 @@ export const MarketplaceListView = (props: Props) => {
}}
</For>
</div>
<MarketplaceContribute />
</Show>
</Show>
</div>
@@ -77,9 +77,39 @@
}
.marketplace-empty {
display: flex;
flex-direction: column;
align-items: center;
gap: 12px;
padding: 32px 16px;
text-align: center;
color: var(--text-weak);
padding: 24px;
}
.marketplace-empty-message {
font-size: 13px;
}
/* Contribute CTA (footer + inside empty state) */
.marketplace-contribute {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
gap: 8px;
padding: 12px 0;
margin-top: 12px;
border-top: 1px solid var(--border-base, var(--vscode-widget-border, transparent));
color: var(--text-weak);
font-size: 12px;
}
/* Inside the empty state, drop the border — message is already the lead-in. */
.marketplace-empty .marketplace-contribute {
border-top: none;
margin-top: 0;
padding-top: 0;
}
/* Grid */