diff --git a/.changeset/skills-tab-agent-behaviour.md b/.changeset/skills-tab-agent-behaviour.md new file mode 100644 index 00000000000..c7076cc438d --- /dev/null +++ b/.changeset/skills-tab-agent-behaviour.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Add Skills tab to Agent Behaviour settings for viewing and managing installed skills diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index fd5ee93f425..59caa2731c0 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1957,6 +1957,11 @@ export class ClineProvider }) } } + + async postSkillsDataToWebview() { + const skills = this.skillsManager?.getAllSkills() ?? [] + this.postMessageToWebview({ type: "skillsData", skills }) + } // kilocode_change end /** diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index ef462358adf..c9f0b169257 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2924,6 +2924,13 @@ export const webviewMessageHandler = async ( break } + // kilocode_change start + case "refreshSkills": { + await provider.postSkillsDataToWebview() + break + } + // kilocode_change end + case "toggleRule": { if (message.rulePath && typeof message.enabled === "boolean" && typeof message.isGlobal === "boolean") { await toggleRule( @@ -3684,6 +3691,19 @@ export const webviewMessageHandler = async ( if (marketplaceManager && message.mpItem && message.mpInstallOptions) { try { await marketplaceManager.removeInstalledMarketplaceItem(message.mpItem, message.mpInstallOptions) + + // kilocode_change start: Force skills refresh after skill deletion + // If the removed item is a skill, force a refresh of the SkillsManager + // to ensure the cache is updated before sending data to the webview + if (message.mpItem.type === "skill") { + const skillsManager = provider.getSkillsManager() + if (skillsManager) { + await skillsManager.discoverSkills() + } + await provider.postSkillsDataToWebview() + } + // kilocode_change end + await provider.postStateToWebview() // Send success message to webview diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 7d8206d041c..5ae776219bc 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -164,6 +164,7 @@ export interface ExtensionMessage { | "indexCleared" | "codebaseIndexConfig" | "rulesData" // kilocode_change + | "skillsData" // kilocode_change | "marketplaceInstallResult" | "marketplaceRemoveResult" | "marketplaceData" @@ -313,6 +314,7 @@ export interface ExtensionMessage { localRules?: ClineRulesToggles globalWorkflows?: ClineRulesToggles localWorkflows?: ClineRulesToggles + skills?: Array<{ name: string; description: string; path: string; source: "global" | "project"; mode?: string }> // kilocode_change marketplaceItems?: MarketplaceItem[] organizationMcps?: MarketplaceItem[] marketplaceInstalledMetadata?: MarketplaceInstalledMetadata @@ -745,6 +747,7 @@ export interface WebviewMessage { | "requestModes" | "switchMode" | "debugSetting" + | "refreshSkills" // kilocode_change text?: string editedMessageContent?: string tab?: "settings" | "history" | "mcp" | "modes" | "chat" | "marketplace" | "cloud" diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index 28fa4068bba..043d0ddf9f2 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -188,6 +188,7 @@ export interface WebviewMessage { | "condense" // kilocode_change | "toggleWorkflow" // kilocode_change | "refreshRules" // kilocode_change + | "refreshSkills" // kilocode_change | "toggleRule" // kilocode_change | "createRuleFile" // kilocode_change | "deleteRuleFile" // kilocode_change diff --git a/webview-ui/src/components/kilocode/rules/KiloRulesToggleModal.tsx b/webview-ui/src/components/kilocode/rules/KiloRulesToggleModal.tsx index e41709e6c4e..77968f4e3ab 100644 --- a/webview-ui/src/components/kilocode/rules/KiloRulesToggleModal.tsx +++ b/webview-ui/src/components/kilocode/rules/KiloRulesToggleModal.tsx @@ -9,6 +9,7 @@ import BottomButton from "../BottomButton" import KiloRulesWorkflowsView from "./KiloRulesWorkflowsView" import ModesView from "@src/components/modes/ModesView" import McpView from "@src/components/mcp/McpView" +import InstalledSkillsView from "@src/components/kilocode/settings/InstalledSkillsView" const KiloRulesToggleModal: React.FC = () => { const { t } = useTranslation() @@ -18,6 +19,7 @@ const KiloRulesToggleModal: React.FC = () => { t("kilocode:rules.agentBehaviourTypes.workflows"), t("kilocode:rules.agentBehaviourTypes.mcps"), t("kilocode:rules.agentBehaviourTypes.modes"), + t("kilocode:rules.agentBehaviourTypes.skills"), ].join(", ") const [isVisible, setIsVisible] = useState(false) @@ -26,7 +28,7 @@ const KiloRulesToggleModal: React.FC = () => { const { width: viewportWidth, height: viewportHeight } = useWindowSize() const [arrowPosition, setArrowPosition] = useState(0) const [menuPosition, setMenuPosition] = useState(0) - const [currentView, setCurrentView] = useState<"modes" | "mcp" | "rule" | "workflow">("rule") + const [currentView, setCurrentView] = useState<"modes" | "mcp" | "rule" | "workflow" | "skills">("rule") useClickAway(modalRef, () => { setIsVisible(false) @@ -109,6 +111,11 @@ const KiloRulesToggleModal: React.FC = () => { onClick={() => setCurrentView("workflow")}> {t("kilocode:rules.tabs.workflows")} + setCurrentView("skills")}> + {t("kilocode:settings.sections.skills")} + @@ -124,6 +131,7 @@ const KiloRulesToggleModal: React.FC = () => { {currentView === "mcp" && {}} />} {currentView === "rule" && } {currentView === "workflow" && } + {currentView === "skills" && } )} diff --git a/webview-ui/src/components/kilocode/settings/AgentBehaviourView.tsx b/webview-ui/src/components/kilocode/settings/AgentBehaviourView.tsx index 411c4a5fdcb..f993597025e 100644 --- a/webview-ui/src/components/kilocode/settings/AgentBehaviourView.tsx +++ b/webview-ui/src/components/kilocode/settings/AgentBehaviourView.tsx @@ -8,6 +8,7 @@ import { Section } from "@src/components/settings/Section" import ModesView from "@src/components/modes/ModesView" import McpView from "@src/components/mcp/McpView" import KiloRulesWorkflowsView from "@src/components/kilocode/rules/KiloRulesWorkflowsView" +import InstalledSkillsView from "@src/components/kilocode/settings/InstalledSkillsView" const StyledTabButton = styled.button<{ isActive: boolean }>` background: none; @@ -40,7 +41,7 @@ const TabButton = ({ ) const AgentBehaviourView = () => { - const [activeTab, setActiveTab] = useState<"modes" | "mcp" | "rules" | "workflows">("modes") + const [activeTab, setActiveTab] = useState<"modes" | "mcp" | "rules" | "workflows" | "skills">("modes") const { t } = useAppTranslation() return ( @@ -73,6 +74,9 @@ const AgentBehaviourView = () => { setActiveTab("workflows")}> {t("kilocode:rules.tabs.workflows")} + setActiveTab("skills")}> + {t("kilocode:settings.sections.skills")} + {/* Content */} @@ -81,6 +85,7 @@ const AgentBehaviourView = () => { {activeTab === "mcp" && {}} />} {activeTab === "rules" && } {activeTab === "workflows" && } + {activeTab === "skills" && } diff --git a/webview-ui/src/components/kilocode/settings/InstalledSkillsView.tsx b/webview-ui/src/components/kilocode/settings/InstalledSkillsView.tsx new file mode 100644 index 00000000000..cbc5b7cf824 --- /dev/null +++ b/webview-ui/src/components/kilocode/settings/InstalledSkillsView.tsx @@ -0,0 +1,190 @@ +// kilocode_change - new file +import { useState, useEffect } from "react" +import { useTranslation } from "react-i18next" +import { VSCodeLink } from "@vscode/webview-ui-toolkit/react" + +import { vscode } from "@/utils/vscode" +import { + Button, + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription, + DialogFooter, +} from "@src/components/ui" + +interface SkillMetadata { + name: string + description: string + path: string + source: "global" | "project" + mode?: string +} + +const InstalledSkillsView = () => { + const { t } = useTranslation() + const [skills, setSkills] = useState([]) + const [skillToDelete, setSkillToDelete] = useState(null) + + useEffect(() => { + // Request skills data on mount + vscode.postMessage({ type: "refreshSkills" }) + }, []) + + useEffect(() => { + const handleMessage = (event: MessageEvent) => { + const message = event.data + if (message.type === "skillsData") { + setSkills(message.skills ?? []) + } + } + + window.addEventListener("message", handleMessage) + return () => window.removeEventListener("message", handleMessage) + }, []) + + const handleDelete = (skill: SkillMetadata) => { + setSkillToDelete(skill) + } + + const confirmDelete = () => { + if (!skillToDelete) return + + vscode.postMessage({ + type: "removeInstalledMarketplaceItem", + mpItem: { + type: "skill", + id: skillToDelete.name, + name: skillToDelete.name, + description: skillToDelete.description, + category: "", + githubUrl: "", + content: "", + displayName: skillToDelete.name, + displayCategory: "", + }, + mpInstallOptions: { target: skillToDelete.source }, + }) + setSkillToDelete(null) + } + + const globalSkills = skills.filter((s) => s.source === "global") + const projectSkills = skills.filter((s) => s.source === "project") + + return ( +
+
+

+ {t("kilocode:skills.description")}{" "} + + {t("kilocode:docs")} + +

+
+ + {skills.length === 0 ? ( +
+ {t("kilocode:skills.noSkills")} +
+ ) : ( + <> + {/* Project Skills */} + {projectSkills.length > 0 && ( + + )} + + {/* Global Skills */} + {globalSkills.length > 0 && ( + + )} + + )} + + {/* Delete Confirmation Dialog */} + !open && setSkillToDelete(null)}> + + + {t("kilocode:skills.deleteDialog.title")} + + {t("kilocode:skills.deleteDialog.description", { skillName: skillToDelete?.name })} + + + + + + + + +
+ ) +} + +interface SkillsSectionProps { + title: string + skills: SkillMetadata[] + onDelete: (skill: SkillMetadata) => void +} + +const SkillsSection = ({ title, skills, onDelete }: SkillsSectionProps) => { + return ( +
+

{title}

+
+ {skills.map((skill) => ( + + ))} +
+
+ ) +} + +interface SkillRowProps { + skill: SkillMetadata + onDelete: (skill: SkillMetadata) => void +} + +const SkillRow = ({ skill, onDelete }: SkillRowProps) => { + return ( +
+
+
+ {skill.name} + {skill.mode && ( + + {skill.mode} + + )} +
+
{skill.description}
+
+ +
+ ) +} + +export default InstalledSkillsView diff --git a/webview-ui/src/components/kilocode/settings/__tests__/InstalledSkillsView.spec.tsx b/webview-ui/src/components/kilocode/settings/__tests__/InstalledSkillsView.spec.tsx new file mode 100644 index 00000000000..81947d445b9 --- /dev/null +++ b/webview-ui/src/components/kilocode/settings/__tests__/InstalledSkillsView.spec.tsx @@ -0,0 +1,386 @@ +// kilocode_change - new file +import { render, screen, fireEvent, act } from "@testing-library/react" +import { describe, expect, it, vi, beforeEach, afterEach } from "vitest" +import React from "react" + +// Mock react-i18next +vi.mock("react-i18next", () => ({ + useTranslation: () => ({ + t: (key: string, params?: Record) => { + if (params?.skillName) { + return key.replace("{{skillName}}", params.skillName) + } + return key + }, + }), +})) + +// Mock the vscode module - use vi.hoisted to ensure the mock is available before module loading +const { mockPostMessage } = vi.hoisted(() => ({ + mockPostMessage: vi.fn(), +})) + +vi.mock("@/utils/vscode", () => ({ + vscode: { + postMessage: mockPostMessage, + }, +})) + +// Import after mocks are set up +import InstalledSkillsView from "../InstalledSkillsView" + +// Mock VSCode webview-ui-toolkit components +vi.mock("@vscode/webview-ui-toolkit/react", () => ({ + VSCodeLink: ({ children, href }: any) => ( + + {children} + + ), +})) + +// Mock the UI components +vi.mock("@src/components/ui", () => ({ + Button: ({ children, onClick, variant, size, style }: any) => ( + + ), + Dialog: ({ children, open, onOpenChange }: any) => ( +
onOpenChange?.(false)}> + {open && children} +
+ ), + DialogContent: ({ children }: any) =>
{children}
, + DialogHeader: ({ children }: any) =>
{children}
, + DialogTitle: ({ children }: any) =>

{children}

, + DialogDescription: ({ children }: any) =>

{children}

, + DialogFooter: ({ children }: any) =>
{children}
, +})) + +describe("InstalledSkillsView", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + + afterEach(() => { + vi.restoreAllMocks() + }) + + it("renders without errors", () => { + expect(() => render()).not.toThrow() + }) + + it("requests skills data on mount", () => { + render() + + expect(mockPostMessage).toHaveBeenCalledWith({ type: "refreshSkills" }) + }) + + it("displays no skills message when skills list is empty", () => { + render() + + expect(screen.getByText("kilocode:skills.noSkills")).toBeInTheDocument() + }) + + it("displays skills when skillsData message is received", async () => { + render() + + // Simulate receiving skills data + await act(async () => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "skillsData", + skills: [ + { + name: "test-skill", + description: "A test skill", + path: "/path/to/skill", + source: "project", + }, + ], + }, + }), + ) + }) + + expect(screen.getByText("test-skill")).toBeInTheDocument() + expect(screen.getByText("A test skill")).toBeInTheDocument() + }) + + it("groups skills by source (project and global)", async () => { + render() + + // Simulate receiving skills data with both project and global skills + await act(async () => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "skillsData", + skills: [ + { + name: "project-skill", + description: "A project skill", + path: "/path/to/project/skill", + source: "project", + }, + { + name: "global-skill", + description: "A global skill", + path: "/path/to/global/skill", + source: "global", + }, + ], + }, + }), + ) + }) + + expect(screen.getByText("kilocode:skills.projectSkills")).toBeInTheDocument() + expect(screen.getByText("kilocode:skills.globalSkills")).toBeInTheDocument() + expect(screen.getByText("project-skill")).toBeInTheDocument() + expect(screen.getByText("global-skill")).toBeInTheDocument() + }) + + it("displays mode badge when skill has a mode", async () => { + render() + + await act(async () => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "skillsData", + skills: [ + { + name: "mode-skill", + description: "A skill with mode", + path: "/path/to/skill", + source: "project", + mode: "code", + }, + ], + }, + }), + ) + }) + + expect(screen.getByText("code")).toBeInTheDocument() + }) + + it("opens delete confirmation dialog when delete button is clicked", async () => { + render() + + await act(async () => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "skillsData", + skills: [ + { + name: "skill-to-delete", + description: "A skill to delete", + path: "/path/to/skill", + source: "project", + }, + ], + }, + }), + ) + }) + + // Find and click the delete button (trash icon) + const deleteButton = screen.getByRole("button") + fireEvent.click(deleteButton) + + // Check that dialog is open + expect(screen.getByTestId("dialog-title")).toHaveTextContent("kilocode:skills.deleteDialog.title") + // The description contains the skill name via the translation key + expect(screen.getByTestId("dialog-description")).toHaveTextContent("kilocode:skills.deleteDialog.description") + }) + + it("sends removeInstalledMarketplaceItem message when delete is confirmed", async () => { + render() + + await act(async () => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "skillsData", + skills: [ + { + name: "skill-to-delete", + description: "A skill to delete", + path: "/path/to/skill", + source: "project", + }, + ], + }, + }), + ) + }) + + // Click delete button to open dialog + const deleteButton = screen.getByRole("button") + fireEvent.click(deleteButton) + + // Clear the mock to only track the delete message + mockPostMessage.mockClear() + + // Find and click the confirm delete button in the dialog + const confirmButton = screen.getByText("kilocode:skills.deleteDialog.delete") + fireEvent.click(confirmButton) + + expect(mockPostMessage).toHaveBeenCalledWith({ + type: "removeInstalledMarketplaceItem", + mpItem: { + type: "skill", + id: "skill-to-delete", + name: "skill-to-delete", + description: "A skill to delete", + category: "", + githubUrl: "", + content: "", + displayName: "skill-to-delete", + displayCategory: "", + }, + mpInstallOptions: { target: "project" }, + }) + }) + + it("closes dialog when cancel button is clicked", async () => { + render() + + await act(async () => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "skillsData", + skills: [ + { + name: "skill-to-delete", + description: "A skill to delete", + path: "/path/to/skill", + source: "project", + }, + ], + }, + }), + ) + }) + + // Click delete button to open dialog + const deleteButton = screen.getByRole("button") + fireEvent.click(deleteButton) + + // Verify dialog is open + expect(screen.getByTestId("dialog-title")).toBeInTheDocument() + + // Click cancel button + const cancelButton = screen.getByText("kilocode:skills.deleteDialog.cancel") + fireEvent.click(cancelButton) + + // Dialog should be closed (data-open should be false) + const dialog = screen.getByTestId("dialog") + expect(dialog).toHaveAttribute("data-open", "false") + }) + + it("renders documentation link", () => { + render() + + const link = screen.getByTestId("vscode-link") + expect(link).toHaveAttribute("href", "https://kilo.ai/docs/features/skills") + }) + + it("handles empty skills array in skillsData message", async () => { + render() + + await act(async () => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "skillsData", + skills: [], + }, + }), + ) + }) + + expect(screen.getByText("kilocode:skills.noSkills")).toBeInTheDocument() + }) + + it("handles skillsData message with undefined skills", async () => { + render() + + await act(async () => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "skillsData", + skills: undefined, + }, + }), + ) + }) + + expect(screen.getByText("kilocode:skills.noSkills")).toBeInTheDocument() + }) + + it("only shows project section when there are only project skills", async () => { + render() + + await act(async () => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "skillsData", + skills: [ + { + name: "project-skill", + description: "A project skill", + path: "/path/to/skill", + source: "project", + }, + ], + }, + }), + ) + }) + + expect(screen.getByText("kilocode:skills.projectSkills")).toBeInTheDocument() + expect(screen.queryByText("kilocode:skills.globalSkills")).not.toBeInTheDocument() + }) + + it("only shows global section when there are only global skills", async () => { + render() + + await act(async () => { + window.dispatchEvent( + new MessageEvent("message", { + data: { + type: "skillsData", + skills: [ + { + name: "global-skill", + description: "A global skill", + path: "/path/to/skill", + source: "global", + }, + ], + }, + }), + ) + }) + + expect(screen.queryByText("kilocode:skills.projectSkills")).not.toBeInTheDocument() + expect(screen.getByText("kilocode:skills.globalSkills")).toBeInTheDocument() + }) + + it("cleans up message listener on unmount", () => { + const removeEventListenerSpy = vi.spyOn(window, "removeEventListener") + + const { unmount } = render() + unmount() + + expect(removeEventListenerSpy).toHaveBeenCalledWith("message", expect.any(Function)) + }) +}) diff --git a/webview-ui/src/i18n/locales/ar/kilocode.json b/webview-ui/src/i18n/locales/ar/kilocode.json index 3efe9536cdb..c6a25267485 100644 --- a/webview-ui/src/i18n/locales/ar/kilocode.json +++ b/webview-ui/src/i18n/locales/ar/kilocode.json @@ -35,7 +35,8 @@ "settings": { "sections": { "mcp": "خوادم MCP", - "agentBehaviour": "سلوك الوكيل" + "agentBehaviour": "سلوك الوكيل", + "skills": "المهارات" }, "codeIndex": { "embeddingBatchSizeLabel": "حجم دفعة التضمين", @@ -150,7 +151,8 @@ "rules": "القواعد", "workflows": "سير العمل", "mcps": "MCPs", - "modes": "الأوضاع" + "modes": "الأوضاع", + "skills": "المهارات" }, "ariaLabel": "قواعد Kilo Code", "tabs": { @@ -362,5 +364,17 @@ "description": "حدد جهاز الميكروفون لتحويل الكلام إلى نص", "refresh": "تحديث" } + }, + "skills": { + "description": "توفر المهارات تعليمات متخصصة لمهام محددة. يتم تطبيقها تلقائيًا عندما تكون ذات صلة بطلبك.", + "noSkills": "لا توجد مهارات مثبتة", + "projectSkills": "مهارات المشروع", + "globalSkills": "المهارات العامة", + "deleteDialog": { + "title": "حذف المهارة", + "description": "هل أنت متأكد أنك تريد حذف المهارة \"{{skillName}}\"؟ لا يمكن التراجع عن هذا الإجراء.", + "cancel": "إلغاء", + "delete": "حذف" + } } } diff --git a/webview-ui/src/i18n/locales/ca/kilocode.json b/webview-ui/src/i18n/locales/ca/kilocode.json index 8e37d88196a..7a812aba222 100644 --- a/webview-ui/src/i18n/locales/ca/kilocode.json +++ b/webview-ui/src/i18n/locales/ca/kilocode.json @@ -32,7 +32,8 @@ "settings": { "sections": { "mcp": "Servidors MCP", - "agentBehaviour": "Comportament de l'Agent" + "agentBehaviour": "Comportament de l'Agent", + "skills": "Habilitats" }, "provider": { "account": "Compte de Kilo Code", @@ -141,7 +142,8 @@ "rules": "Regles", "workflows": "Fluxos de Treball", "mcps": "MCPs", - "modes": "Modes" + "modes": "Modes", + "skills": "Habilitats" }, "ariaLabel": "Regles de Kilo Code", "tabs": { @@ -362,5 +364,17 @@ "noDevices": "No s'han trobat dispositius de micròfon", "refresh": "Actualitza" } + }, + "skills": { + "description": "Les habilitats proporcionen instruccions especialitzades per a tasques específiques. S'apliquen automàticament quan són rellevants per a la teva sol·licitud.", + "noSkills": "No hi ha habilitats instal·lades", + "projectSkills": "Habilitats del Projecte", + "globalSkills": "Habilitats Globals", + "deleteDialog": { + "title": "Eliminar Habilitat", + "description": "Estàs segur que vols eliminar l'habilitat \"{{skillName}}\"? Aquesta acció no es pot desfer.", + "cancel": "Cancel·lar", + "delete": "Eliminar" + } } } diff --git a/webview-ui/src/i18n/locales/cs/kilocode.json b/webview-ui/src/i18n/locales/cs/kilocode.json index 4dba4ca4a6f..194791235d1 100644 --- a/webview-ui/src/i18n/locales/cs/kilocode.json +++ b/webview-ui/src/i18n/locales/cs/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "MCP servery", - "agentBehaviour": "Chování agenta" + "agentBehaviour": "Chování agenta", + "skills": "Dovednosti" }, "provider": { "account": "Účet Kilo Code", @@ -148,7 +149,8 @@ "rules": "Pravidla", "workflows": "Pracovní postupy", "mcps": "MCP", - "modes": "Režimy" + "modes": "Režimy", + "skills": "Dovednosti" }, "ariaLabel": "Kilo Code Rules", "tabs": { @@ -361,5 +363,17 @@ "refresh": "Obnovit", "noDevices": "Nebyla nalezena žádná zařízení mikrofonu" } + }, + "skills": { + "description": "Dovednosti poskytují specializované instrukce pro konkrétní úkoly. Jsou automaticky aplikovány, když jsou relevantní pro tvůj požadavek.", + "noSkills": "Žádné dovednosti nainstalovány", + "projectSkills": "Dovednosti projektu", + "globalSkills": "Globální dovednosti", + "deleteDialog": { + "title": "Smazat dovednost", + "description": "Opravdu chceš smazat dovednost \"{{skillName}}\"? Tuto akci nelze vrátit zpět.", + "cancel": "Zrušit", + "delete": "Smazat" + } } } diff --git a/webview-ui/src/i18n/locales/de/kilocode.json b/webview-ui/src/i18n/locales/de/kilocode.json index 4f88418c86b..6aed965e38a 100644 --- a/webview-ui/src/i18n/locales/de/kilocode.json +++ b/webview-ui/src/i18n/locales/de/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "MCP-Server", - "agentBehaviour": "Agentenverhalten" + "agentBehaviour": "Agentenverhalten", + "skills": "Skills" }, "provider": { "account": "Kilo Code Konto", @@ -148,7 +149,8 @@ "rules": "Regeln", "workflows": "Workflows", "mcps": "MCPs", - "modes": "Modi" + "modes": "Modi", + "skills": "Skills" }, "ariaLabel": "Kilo Code Regeln", "tabs": { @@ -361,5 +363,17 @@ "noDevices": "Keine Mikrofongeräte gefunden", "refresh": "Aktualisieren" } + }, + "skills": { + "description": "Skills bieten spezialisierte Anweisungen für bestimmte Aufgaben. Sie werden automatisch angewendet, wenn sie für deine Anfrage relevant sind.", + "noSkills": "Keine Skills installiert", + "projectSkills": "Projekt-Skills", + "globalSkills": "Globale Skills", + "deleteDialog": { + "title": "Skill löschen", + "description": "Bist du sicher, dass du den Skill \"{{skillName}}\" löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden.", + "cancel": "Abbrechen", + "delete": "Löschen" + } } } diff --git a/webview-ui/src/i18n/locales/en/kilocode.json b/webview-ui/src/i18n/locales/en/kilocode.json index 902d5af8245..1c2f66b8be5 100644 --- a/webview-ui/src/i18n/locales/en/kilocode.json +++ b/webview-ui/src/i18n/locales/en/kilocode.json @@ -47,7 +47,8 @@ "settings": { "sections": { "mcp": "MCP Servers", - "agentBehaviour": "Agent Behaviour" + "agentBehaviour": "Agent Behaviour", + "skills": "Skills" }, "provider": { "account": "Kilo Code Account", @@ -155,7 +156,8 @@ "rules": "Rules", "workflows": "Workflows", "mcps": "MCPs", - "modes": "Modes" + "modes": "Modes", + "skills": "Skills" }, "ariaLabel": "Kilo Code Rules", "tabs": { @@ -360,5 +362,17 @@ "noDevices": "No microphone devices found", "refresh": "Refresh" } + }, + "skills": { + "description": "Skills provide specialized instructions for specific tasks. They are automatically applied when relevant to your request.", + "noSkills": "No skills installed", + "projectSkills": "Project Skills", + "globalSkills": "Global Skills", + "deleteDialog": { + "title": "Delete Skill", + "description": "Are you sure you want to delete the skill \"{{skillName}}\"? This action cannot be undone.", + "cancel": "Cancel", + "delete": "Delete" + } } } diff --git a/webview-ui/src/i18n/locales/es/kilocode.json b/webview-ui/src/i18n/locales/es/kilocode.json index 1f765fc763b..ea931f3c02e 100644 --- a/webview-ui/src/i18n/locales/es/kilocode.json +++ b/webview-ui/src/i18n/locales/es/kilocode.json @@ -32,7 +32,8 @@ "settings": { "sections": { "mcp": "Servidores MCP", - "agentBehaviour": "Comportamiento del Agente" + "agentBehaviour": "Comportamiento del Agente", + "skills": "Habilidades" }, "provider": { "account": "Cuenta de Kilo Code", @@ -148,7 +149,8 @@ "rules": "Reglas", "workflows": "Flujos de Trabajo", "mcps": "MCPs", - "modes": "Modos" + "modes": "Modos", + "skills": "Habilidades" }, "ariaLabel": "Reglas de Kilo Code", "tabs": { @@ -361,5 +363,17 @@ "refresh": "Actualizar", "noDevices": "No se encontraron dispositivos de micrófono" } + }, + "skills": { + "description": "Las habilidades proporcionan instrucciones especializadas para tareas específicas. Se aplican automáticamente cuando son relevantes para tu solicitud.", + "noSkills": "No hay habilidades instaladas", + "projectSkills": "Habilidades del Proyecto", + "globalSkills": "Habilidades Globales", + "deleteDialog": { + "title": "Eliminar Habilidad", + "description": "¿Estás seguro de que quieres eliminar la habilidad \"{{skillName}}\"? Esta acción no se puede deshacer.", + "cancel": "Cancelar", + "delete": "Eliminar" + } } } diff --git a/webview-ui/src/i18n/locales/fr/kilocode.json b/webview-ui/src/i18n/locales/fr/kilocode.json index f8b6afc35cf..43db93a0bc6 100644 --- a/webview-ui/src/i18n/locales/fr/kilocode.json +++ b/webview-ui/src/i18n/locales/fr/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "Serveurs MCP", - "agentBehaviour": "Comportement de l'Agent" + "agentBehaviour": "Comportement de l'Agent", + "skills": "Compétences" }, "provider": { "account": "Compte Kilo Code", @@ -155,7 +156,8 @@ "rules": "Règles", "workflows": "Flux de Travail", "mcps": "MCPs", - "modes": "Modes" + "modes": "Modes", + "skills": "Compétences" }, "ariaLabel": "Règles Kilo Code", "tabs": { @@ -361,5 +363,17 @@ "defaultOption": "Paramètre par défaut du système", "refresh": "Actualiser" } + }, + "skills": { + "description": "Les compétences fournissent des instructions spécialisées pour des tâches spécifiques. Elles sont automatiquement appliquées lorsqu'elles sont pertinentes pour ta demande.", + "noSkills": "Aucune compétence installée", + "projectSkills": "Compétences du Projet", + "globalSkills": "Compétences Globales", + "deleteDialog": { + "title": "Supprimer la Compétence", + "description": "Es-tu sûr de vouloir supprimer la compétence \"{{skillName}}\" ? Cette action est irréversible.", + "cancel": "Annuler", + "delete": "Supprimer" + } } } diff --git a/webview-ui/src/i18n/locales/hi/kilocode.json b/webview-ui/src/i18n/locales/hi/kilocode.json index 4145019e0be..a9571381c93 100644 --- a/webview-ui/src/i18n/locales/hi/kilocode.json +++ b/webview-ui/src/i18n/locales/hi/kilocode.json @@ -32,7 +32,8 @@ "settings": { "sections": { "mcp": "MCP सर्वर", - "agentBehaviour": "एजेंट व्यवहार" + "agentBehaviour": "एजेंट व्यवहार", + "skills": "कौशल" }, "provider": { "account": "Kilo Code खाता", @@ -141,7 +142,8 @@ "rules": "नियम", "workflows": "वर्कफ़्लो", "mcps": "MCPs", - "modes": "मोड्स" + "modes": "मोड्स", + "skills": "कौशल" }, "ariaLabel": "Kilo Code नियम", "tabs": { @@ -361,5 +363,17 @@ "noDevices": "कोई माइक्रोफ़ोन डिवाइस नहीं मिला", "refresh": "रीफ़्रेश" } + }, + "skills": { + "description": "कौशल विशिष्ट कार्यों के लिए विशेष निर्देश प्रदान करते हैं। जब तुम्हारे अनुरोध से संबंधित हों तो ये स्वचालित रूप से लागू होते हैं।", + "noSkills": "कोई कौशल इंस्टॉल नहीं है", + "projectSkills": "प्रोजेक्ट कौशल", + "globalSkills": "वैश्विक कौशल", + "deleteDialog": { + "title": "कौशल हटाएं", + "description": "क्या तुम वाकई \"{{skillName}}\" कौशल को हटाना चाहते हो? यह क्रिया पूर्ववत नहीं की जा सकती।", + "cancel": "रद्द करें", + "delete": "हटाएं" + } } } diff --git a/webview-ui/src/i18n/locales/id/kilocode.json b/webview-ui/src/i18n/locales/id/kilocode.json index d7fddbd5240..562cac22a74 100644 --- a/webview-ui/src/i18n/locales/id/kilocode.json +++ b/webview-ui/src/i18n/locales/id/kilocode.json @@ -32,7 +32,8 @@ "settings": { "sections": { "mcp": "Server MCP", - "agentBehaviour": "Perilaku Agen" + "agentBehaviour": "Perilaku Agen", + "skills": "Skill" }, "provider": { "account": "Akun Kilo Code", @@ -141,7 +142,8 @@ "rules": "Aturan", "workflows": "Alur Kerja", "mcps": "MCPs", - "modes": "Mode" + "modes": "Mode", + "skills": "Skill" }, "ariaLabel": "Aturan Kilo Code", "tabs": { @@ -361,5 +363,17 @@ "loading": "Memuat perangkat mikrofon...", "refresh": "Segarkan" } + }, + "skills": { + "description": "Skill menyediakan instruksi khusus untuk tugas-tugas tertentu. Skill diterapkan secara otomatis saat relevan dengan permintaan kamu.", + "noSkills": "Tidak ada skill yang terinstal", + "projectSkills": "Skill Proyek", + "globalSkills": "Skill Global", + "deleteDialog": { + "title": "Hapus Skill", + "description": "Apakah kamu yakin ingin menghapus skill \"{{skillName}}\"? Tindakan ini tidak dapat dibatalkan.", + "cancel": "Batal", + "delete": "Hapus" + } } } diff --git a/webview-ui/src/i18n/locales/it/kilocode.json b/webview-ui/src/i18n/locales/it/kilocode.json index 1de65f1e0ef..3a6833091c4 100644 --- a/webview-ui/src/i18n/locales/it/kilocode.json +++ b/webview-ui/src/i18n/locales/it/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "Server MCP", - "agentBehaviour": "Comportamento dell'Agente" + "agentBehaviour": "Comportamento dell'Agente", + "skills": "Competenze" }, "provider": { "account": "Account Kilo Code", @@ -148,7 +149,8 @@ "rules": "Regole", "workflows": "Flussi di Lavoro", "mcps": "MCPs", - "modes": "Modalità" + "modes": "Modalità", + "skills": "Competenze" }, "ariaLabel": "Regole di Kilo Code", "tabs": { @@ -362,5 +364,17 @@ "defaultOption": "Impostazione predefinita del sistema", "description": "Seleziona il dispositivo microfono per il riconoscimento vocale" } + }, + "skills": { + "description": "Le competenze forniscono istruzioni specializzate per compiti specifici. Vengono applicate automaticamente quando sono pertinenti alla tua richiesta.", + "noSkills": "Nessuna competenza installata", + "projectSkills": "Competenze del Progetto", + "globalSkills": "Competenze Globali", + "deleteDialog": { + "title": "Elimina Competenza", + "description": "Sei sicuro di voler eliminare la competenza \"{{skillName}}\"? Questa azione non può essere annullata.", + "cancel": "Annulla", + "delete": "Elimina" + } } } diff --git a/webview-ui/src/i18n/locales/ja/kilocode.json b/webview-ui/src/i18n/locales/ja/kilocode.json index dd78fb13d47..b5cb437adcf 100644 --- a/webview-ui/src/i18n/locales/ja/kilocode.json +++ b/webview-ui/src/i18n/locales/ja/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "MCPサーバー", - "agentBehaviour": "エージェントの動作" + "agentBehaviour": "エージェントの動作", + "skills": "スキル" }, "provider": { "account": "Kilo Code アカウント", @@ -155,7 +156,8 @@ "rules": "ルール", "workflows": "ワークフロー", "mcps": "MCP", - "modes": "モード" + "modes": "モード", + "skills": "スキル" }, "ariaLabel": "Kilo Codeルール", "tabs": { @@ -362,5 +364,17 @@ "noDevices": "マイクデバイスが見つかりません", "refresh": "更新" } + }, + "skills": { + "description": "スキルは特定のタスクに対する専門的な指示を提供します。リクエストに関連する場合、自動的に適用されます。", + "noSkills": "スキルがインストールされていません", + "projectSkills": "プロジェクトスキル", + "globalSkills": "グローバルスキル", + "deleteDialog": { + "title": "スキルを削除", + "description": "スキル「{{skillName}}」を削除してもよろしいですか?この操作は元に戻せません。", + "cancel": "キャンセル", + "delete": "削除" + } } } diff --git a/webview-ui/src/i18n/locales/ko/kilocode.json b/webview-ui/src/i18n/locales/ko/kilocode.json index 1b006716482..350d270046d 100644 --- a/webview-ui/src/i18n/locales/ko/kilocode.json +++ b/webview-ui/src/i18n/locales/ko/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "MCP 서버", - "agentBehaviour": "에이전트 동작" + "agentBehaviour": "에이전트 동작", + "skills": "스킬" }, "provider": { "account": "Kilo Code 계정", @@ -155,7 +156,8 @@ "rules": "규칙", "workflows": "워크플로우", "mcps": "MCPs", - "modes": "모드" + "modes": "모드", + "skills": "스킬" }, "ariaLabel": "Kilo Code 규칙", "tabs": { @@ -361,5 +363,17 @@ "noDevices": "마이크 장치가 발견되지 않음", "refresh": "새로 고침" } + }, + "skills": { + "description": "스킬은 특정 작업에 대한 전문 지침을 제공합니다. 요청과 관련이 있을 때 자동으로 적용됩니다.", + "noSkills": "설치된 스킬 없음", + "projectSkills": "프로젝트 스킬", + "globalSkills": "전역 스킬", + "deleteDialog": { + "title": "스킬 삭제", + "description": "\"{{skillName}}\" 스킬을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.", + "cancel": "취소", + "delete": "삭제" + } } } diff --git a/webview-ui/src/i18n/locales/nl/kilocode.json b/webview-ui/src/i18n/locales/nl/kilocode.json index 555e9250c67..fd6ec68d23d 100644 --- a/webview-ui/src/i18n/locales/nl/kilocode.json +++ b/webview-ui/src/i18n/locales/nl/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "MCP-servers", - "agentBehaviour": "Agentgedrag" + "agentBehaviour": "Agentgedrag", + "skills": "Skills" }, "provider": { "account": "Kilo Code Account", @@ -154,7 +155,8 @@ "rules": "Regels", "workflows": "Workflows", "mcps": "MCP's", - "modes": "Modi" + "modes": "Modi", + "skills": "Skills" }, "ariaLabel": "Kilo Code Regels", "tabs": { @@ -360,5 +362,17 @@ "noDevices": "Geen microfoonapparaten gevonden", "refresh": "Vernieuwen" } + }, + "skills": { + "description": "Skills bieden gespecialiseerde instructies voor specifieke taken. Ze worden automatisch toegepast wanneer ze relevant zijn voor je verzoek.", + "noSkills": "Geen skills geïnstalleerd", + "projectSkills": "Project Skills", + "globalSkills": "Globale Skills", + "deleteDialog": { + "title": "Skill Verwijderen", + "description": "Weet je zeker dat je de skill \"{{skillName}}\" wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt.", + "cancel": "Annuleren", + "delete": "Verwijderen" + } } } diff --git a/webview-ui/src/i18n/locales/pl/kilocode.json b/webview-ui/src/i18n/locales/pl/kilocode.json index 69a00d8b2e4..0e789c257d5 100644 --- a/webview-ui/src/i18n/locales/pl/kilocode.json +++ b/webview-ui/src/i18n/locales/pl/kilocode.json @@ -32,7 +32,8 @@ "settings": { "sections": { "mcp": "Serwery MCP", - "agentBehaviour": "Zachowanie agenta" + "agentBehaviour": "Zachowanie agenta", + "skills": "Umiejętności" }, "provider": { "account": "Konto Kilo Code", @@ -148,7 +149,8 @@ "rules": "Reguły", "workflows": "Przepływy Pracy", "mcps": "MCPs", - "modes": "Tryby" + "modes": "Tryby", + "skills": "Umiejętności" }, "ariaLabel": "Reguły Kilo Code", "tabs": { @@ -362,5 +364,17 @@ "refresh": "Odśwież", "noDevices": "Nie znaleziono urządzeń mikrofonowych" } + }, + "skills": { + "description": "Umiejętności dostarczają specjalistyczne instrukcje dla konkretnych zadań. Są automatycznie stosowane, gdy są istotne dla twojego zapytania.", + "noSkills": "Brak zainstalowanych umiejętności", + "projectSkills": "Umiejętności Projektu", + "globalSkills": "Umiejętności Globalne", + "deleteDialog": { + "title": "Usuń Umiejętność", + "description": "Czy na pewno chcesz usunąć umiejętność \"{{skillName}}\"? Tej akcji nie można cofnąć.", + "cancel": "Anuluj", + "delete": "Usuń" + } } } diff --git a/webview-ui/src/i18n/locales/pt-BR/kilocode.json b/webview-ui/src/i18n/locales/pt-BR/kilocode.json index 463573dda87..08f95d5499e 100644 --- a/webview-ui/src/i18n/locales/pt-BR/kilocode.json +++ b/webview-ui/src/i18n/locales/pt-BR/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "Servidores MCP", - "agentBehaviour": "Comportamento do Agente" + "agentBehaviour": "Comportamento do Agente", + "skills": "Habilidades" }, "provider": { "account": "Conta Kilo Code", @@ -148,7 +149,8 @@ "rules": "Regras", "workflows": "Fluxos de Trabalho", "mcps": "MCPs", - "modes": "Modos" + "modes": "Modos", + "skills": "Habilidades" }, "ariaLabel": "Regras do Kilo Code", "tabs": { @@ -361,5 +363,17 @@ "noDevices": "Nenhum dispositivo de microfone encontrado", "refresh": "Atualizar" } + }, + "skills": { + "description": "As habilidades fornecem instruções especializadas para tarefas específicas. Elas são aplicadas automaticamente quando relevantes para sua solicitação.", + "noSkills": "Nenhuma habilidade instalada", + "projectSkills": "Habilidades do Projeto", + "globalSkills": "Habilidades Globais", + "deleteDialog": { + "title": "Excluir Habilidade", + "description": "Tem certeza de que deseja excluir a habilidade \"{{skillName}}\"? Esta ação não pode ser desfeita.", + "cancel": "Cancelar", + "delete": "Excluir" + } } } diff --git a/webview-ui/src/i18n/locales/ru/kilocode.json b/webview-ui/src/i18n/locales/ru/kilocode.json index 34174bbc986..41cae44bf4e 100644 --- a/webview-ui/src/i18n/locales/ru/kilocode.json +++ b/webview-ui/src/i18n/locales/ru/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "MCP Серверы", - "agentBehaviour": "Поведение агента" + "agentBehaviour": "Поведение агента", + "skills": "Навыки" }, "provider": { "account": "Аккаунт Kilo Code", @@ -148,7 +149,8 @@ "rules": "Правила", "workflows": "Рабочие процессы", "mcps": "MCP", - "modes": "Режимы" + "modes": "Режимы", + "skills": "Навыки" }, "ariaLabel": "Правила Kilo Code", "tabs": { @@ -362,5 +364,17 @@ "noDevices": "Микрофонные устройства не найдены", "defaultOption": "Системные настройки по умолчанию" } + }, + "skills": { + "description": "Навыки предоставляют специализированные инструкции для конкретных задач. Они автоматически применяются, когда это актуально для твоего запроса.", + "noSkills": "Навыки не установлены", + "projectSkills": "Навыки проекта", + "globalSkills": "Глобальные навыки", + "deleteDialog": { + "title": "Удалить навык", + "description": "Ты уверен, что хочешь удалить навык «{{skillName}}»? Это действие нельзя отменить.", + "cancel": "Отмена", + "delete": "Удалить" + } } } diff --git a/webview-ui/src/i18n/locales/th/kilocode.json b/webview-ui/src/i18n/locales/th/kilocode.json index 9706fea1f2d..a7e6512ee23 100644 --- a/webview-ui/src/i18n/locales/th/kilocode.json +++ b/webview-ui/src/i18n/locales/th/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "MCP Servers", - "agentBehaviour": "พฤติกรรมของตัวแทน" + "agentBehaviour": "พฤติกรรมของตัวแทน", + "skills": "ทักษะ" }, "contextManagement": { "allowVeryLargeReads": { @@ -155,7 +156,8 @@ "rules": "กฎ", "workflows": "เวิร์กโฟลว์", "mcps": "MCPs", - "modes": "โหมด" + "modes": "โหมด", + "skills": "ทักษะ" }, "ariaLabel": "Kilo Code Rules", "tabs": { @@ -361,5 +363,17 @@ "noDevices": "ไม่พบอุปกรณ์ไมโครโฟน", "refresh": "รีเฟรช" } + }, + "skills": { + "description": "ทักษะให้คำแนะนำเฉพาะทางสำหรับงานเฉพาะ ทักษะจะถูกนำไปใช้โดยอัตโนมัติเมื่อเกี่ยวข้องกับคำขอของคุณ", + "noSkills": "ยังไม่มีทักษะที่ติดตั้ง", + "projectSkills": "ทักษะโปรเจกต์", + "globalSkills": "ทักษะทั่วไป", + "deleteDialog": { + "title": "ลบทักษะ", + "description": "คุณแน่ใจหรือไม่ว่าต้องการลบทักษะ \"{{skillName}}\"? การกระทำนี้ไม่สามารถยกเลิกได้", + "cancel": "ยกเลิก", + "delete": "ลบ" + } } } diff --git a/webview-ui/src/i18n/locales/tr/kilocode.json b/webview-ui/src/i18n/locales/tr/kilocode.json index 8fb26e27f5b..e9a55ce6a73 100644 --- a/webview-ui/src/i18n/locales/tr/kilocode.json +++ b/webview-ui/src/i18n/locales/tr/kilocode.json @@ -32,7 +32,8 @@ "settings": { "sections": { "mcp": "MCP Sunucuları", - "agentBehaviour": "Ajan Davranışı" + "agentBehaviour": "Ajan Davranışı", + "skills": "Beceriler" }, "contextManagement": { "allowVeryLargeReads": { @@ -148,7 +149,8 @@ "rules": "Kurallar", "workflows": "İş Akışları", "mcps": "MCP'ler", - "modes": "Modlar" + "modes": "Modlar", + "skills": "Beceriler" }, "ariaLabel": "Kilo Code Kuralları", "tabs": { @@ -361,5 +363,17 @@ "loading": "Mikrofon cihazları yükleniyor...", "refresh": "Yenile" } + }, + "skills": { + "description": "Beceriler, belirli görevler için özel talimatlar sağlar. İsteğinle ilgili olduğunda otomatik olarak uygulanırlar.", + "noSkills": "Yüklü beceri yok", + "projectSkills": "Proje Becerileri", + "globalSkills": "Global Beceriler", + "deleteDialog": { + "title": "Beceriyi Sil", + "description": "\"{{skillName}}\" becerisini silmek istediğinden emin misin? Bu işlem geri alınamaz.", + "cancel": "İptal", + "delete": "Sil" + } } } diff --git a/webview-ui/src/i18n/locales/uk/kilocode.json b/webview-ui/src/i18n/locales/uk/kilocode.json index 139a6ce3c8e..cab6a20f707 100644 --- a/webview-ui/src/i18n/locales/uk/kilocode.json +++ b/webview-ui/src/i18n/locales/uk/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "MCP сервери", - "agentBehaviour": "Поведінка агента" + "agentBehaviour": "Поведінка агента", + "skills": "Навички" }, "contextManagement": { "allowVeryLargeReads": { @@ -155,7 +156,8 @@ "rules": "Правила", "workflows": "Робочі процеси", "mcps": "MCP", - "modes": "Режими" + "modes": "Режими", + "skills": "Навички" }, "ariaLabel": "Kilo Code Rules", "tabs": { @@ -361,5 +363,17 @@ "refresh": "Оновити", "noDevices": "Не знайдено пристроїв мікрофона" } + }, + "skills": { + "description": "Навички надають спеціалізовані інструкції для конкретних завдань. Вони автоматично застосовуються, коли відповідають твоєму запиту.", + "noSkills": "Навички не встановлено", + "projectSkills": "Навички проєкту", + "globalSkills": "Глобальні навички", + "deleteDialog": { + "title": "Видалити навичку", + "description": "Ти впевнений, що хочеш видалити навичку \"{{skillName}}\"? Цю дію неможливо скасувати.", + "cancel": "Скасувати", + "delete": "Видалити" + } } } diff --git a/webview-ui/src/i18n/locales/vi/kilocode.json b/webview-ui/src/i18n/locales/vi/kilocode.json index 084e14b6d3d..63c40811d4e 100644 --- a/webview-ui/src/i18n/locales/vi/kilocode.json +++ b/webview-ui/src/i18n/locales/vi/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "Máy chủ MCP", - "agentBehaviour": "Hành vi của Agent" + "agentBehaviour": "Hành vi của Agent", + "skills": "Kỹ năng" }, "contextManagement": { "allowVeryLargeReads": { @@ -148,7 +149,8 @@ "rules": "Quy tắc", "workflows": "Quy trình làm việc", "mcps": "MCPs", - "modes": "Chế độ" + "modes": "Chế độ", + "skills": "Kỹ năng" }, "ariaLabel": "Quy tắc Kilo Code", "tabs": { @@ -362,5 +364,17 @@ "description": "Chọn thiết bị microphone cho chuyển giọng nói thành văn bản", "refresh": "Làm mới" } + }, + "skills": { + "description": "Kỹ năng cung cấp hướng dẫn chuyên biệt cho các tác vụ cụ thể. Chúng được tự động áp dụng khi liên quan đến yêu cầu của bạn.", + "noSkills": "Chưa cài đặt kỹ năng nào", + "projectSkills": "Kỹ năng Dự án", + "globalSkills": "Kỹ năng Toàn cầu", + "deleteDialog": { + "title": "Xóa Kỹ năng", + "description": "Bạn có chắc chắn muốn xóa kỹ năng \"{{skillName}}\"? Hành động này không thể hoàn tác.", + "cancel": "Hủy", + "delete": "Xóa" + } } } diff --git a/webview-ui/src/i18n/locales/zh-CN/kilocode.json b/webview-ui/src/i18n/locales/zh-CN/kilocode.json index 042cac0aae4..217f8cb1369 100644 --- a/webview-ui/src/i18n/locales/zh-CN/kilocode.json +++ b/webview-ui/src/i18n/locales/zh-CN/kilocode.json @@ -39,7 +39,8 @@ "settings": { "sections": { "mcp": "MCP 服务器", - "agentBehaviour": "代理行为" + "agentBehaviour": "代理行为", + "skills": "技能" }, "contextManagement": { "allowVeryLargeReads": { @@ -155,7 +156,8 @@ "rules": "规则", "workflows": "工作流", "mcps": "MCP", - "modes": "模式" + "modes": "模式", + "skills": "技能" }, "ariaLabel": "Kilo Code 规则", "tabs": { @@ -362,5 +364,17 @@ "noDevices": "未找到麦克风设备", "refresh": "刷新" } + }, + "skills": { + "description": "技能为特定任务提供专业指导。当与你的请求相关时,它们会自动应用。", + "noSkills": "未安装技能", + "projectSkills": "项目技能", + "globalSkills": "全局技能", + "deleteDialog": { + "title": "删除技能", + "description": "确定要删除技能 \"{{skillName}}\" 吗?此操作不可逆。", + "cancel": "取消", + "delete": "删除" + } } } diff --git a/webview-ui/src/i18n/locales/zh-TW/kilocode.json b/webview-ui/src/i18n/locales/zh-TW/kilocode.json index 2bcad5134f6..7b370b88186 100644 --- a/webview-ui/src/i18n/locales/zh-TW/kilocode.json +++ b/webview-ui/src/i18n/locales/zh-TW/kilocode.json @@ -34,7 +34,8 @@ "settings": { "sections": { "mcp": "MCP 伺服器", - "agentBehaviour": "代理行為" + "agentBehaviour": "代理行為", + "skills": "技能" }, "contextManagement": { "allowVeryLargeReads": { @@ -150,7 +151,8 @@ "rules": "規則", "workflows": "工作流程", "mcps": "MCP", - "modes": "模式" + "modes": "模式", + "skills": "技能" }, "ariaLabel": "Kilo Code 規則", "tabs": { @@ -361,5 +363,17 @@ "defaultOption": "系統預設", "noDevices": "找不到麥克風設備" } + }, + "skills": { + "description": "技能為特定任務提供專業指導。當與你的請求相關時,它們會自動套用。", + "noSkills": "尚未安裝任何技能", + "projectSkills": "專案技能", + "globalSkills": "全域技能", + "deleteDialog": { + "title": "刪除技能", + "description": "確定要刪除技能「{{skillName}}」嗎?此操作無法復原。", + "cancel": "取消", + "delete": "刪除" + } } } diff --git a/webview-ui/tsconfig.json b/webview-ui/tsconfig.json index 33e108c9a5e..966ae3edd6b 100644 --- a/webview-ui/tsconfig.json +++ b/webview-ui/tsconfig.json @@ -26,5 +26,6 @@ "@roo/*": ["../src/shared/*"] } }, - "include": ["src", "../src/shared", "vitest.setup.ts"] + "include": ["src", "../src/shared", "vitest.setup.ts"], + "exclude": ["../src/shared/kilocode/cli-sessions/extension"] }