From ed5fc5a45fb7dca6437d0aff67bc6b651c7505d5 Mon Sep 17 00:00:00 2001 From: Sylwester Liljegren Date: Sun, 14 Jun 2026 15:08:01 +0200 Subject: [PATCH 01/25] feat(vscode): add filesystem validation protocol for file links Add a validateFiles request/response round-trip between the webview and the extension so the webview can confirm which inline code-span candidates are real files before promoting them to clickable links. The extension stat-checks candidate paths (new file-links.ts) and replies with the subset that exist. Routing lives in editor-actions alongside the other editor open actions, and openFile now falls back to a workspace filename search (single match opens, multiple prompts) with a "File not found" warning when a clicked path cannot be resolved. --- packages/kilo-vscode/src/KiloProvider.ts | 1 + .../src/kilo-provider/editor-actions.ts | 68 +++++++++++++++---- .../src/kilo-provider/file-links.ts | 22 ++++++ packages/kilo-vscode/webview-ui/src/App.tsx | 30 ++++++++ .../src/types/messages/extension-messages.ts | 7 ++ .../src/types/messages/webview-messages.ts | 7 ++ packages/ui/src/context/data.tsx | 4 ++ 7 files changed, 126 insertions(+), 13 deletions(-) create mode 100644 packages/kilo-vscode/src/kilo-provider/file-links.ts diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index b117b8c14ee..9d995106609 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -1233,6 +1233,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper dir: () => this.getWorkspaceDirectory(this.currentSession?.id), diff: this.diffVirtualProvider, storage: this.extensionContext?.globalStorageUri, + post: (msg) => this.postMessage(msg), }) } diff --git a/packages/kilo-vscode/src/kilo-provider/editor-actions.ts b/packages/kilo-vscode/src/kilo-provider/editor-actions.ts index 1c55c65ec6b..d5dfd072db8 100644 --- a/packages/kilo-vscode/src/kilo-provider/editor-actions.ts +++ b/packages/kilo-vscode/src/kilo-provider/editor-actions.ts @@ -1,6 +1,7 @@ import * as vscode from "vscode" import { buildPreviewPath, getPreviewCommand, getPreviewDir, parseImage, trimEntries } from "../image-preview" import { isAbsolutePath } from "../path-utils" +import { validateFiles } from "./file-links" import type { DiffVirtualFile, DiffVirtualProvider } from "../DiffVirtualProvider" type EditorOpenMessage = { @@ -73,6 +74,7 @@ export function handleEditorAction( dir: () => string diff?: DiffVirtualProvider storage?: vscode.Uri + post?: (msg: unknown) => void }, ): boolean { if (message.type === "openFile") { @@ -83,6 +85,17 @@ export function handleEditorAction( if (message.content) openContent(message.content, message.language) return true } + if (message.type === "validateFiles") { + const id = (message as { id?: string }).id + const paths = (message as { paths?: string[] }).paths + if (id && paths && opts.post) { + validateFiles(opts.dir(), paths).then( + (existing) => opts.post!({ type: "validateFilesResult", id, existing }), + (err) => console.error("[Kilo New] KiloProvider: validateFiles failed:", err), + ) + } + return true + } if (message.type === "openExternal") { openExternal(message.url) return true @@ -105,6 +118,46 @@ function openContent(content: string, language?: string): void { ) } +function show(uri: vscode.Uri, line?: number, column?: number): void { + vscode.workspace.openTextDocument(uri).then( + (doc) => { + const options: vscode.TextDocumentShowOptions = { preview: true } + if (line !== undefined && line > 0) { + const col = column !== undefined && column > 0 ? column - 1 : 0 + const pos = new vscode.Position(line - 1, col) + options.selection = new vscode.Range(pos, pos) + } + vscode.window.showTextDocument(doc, options) + }, + (err) => console.error("[Kilo New] KiloProvider: Failed to open file:", uri.fsPath, err), + ) +} + +/** + * Fallback when the exact path does not exist: search the workspace by filename. + * Opens the file directly on a single match, prompts on multiple, warns on none. + */ +function findFallback(filePath: string, line?: number, column?: number): void { + const name = filePath.split(/[\\/]/).pop() || filePath + Promise.resolve(vscode.workspace.findFiles(`**/${name}`, "**/node_modules/**", 5)).then( + (matches) => { + if (matches.length === 1) { + show(matches[0], line, column) + return + } + if (matches.length > 1) { + const items = matches.map((m) => ({ label: vscode.workspace.asRelativePath(m), uri: m })) + vscode.window.showQuickPick(items, { placeHolder: `Multiple matches for "${name}"` }).then((pick) => { + if (pick) show(pick.uri, line, column) + }) + return + } + vscode.window.showWarningMessage(`File not found: ${filePath}`) + }, + (err: unknown) => console.error("[Kilo New] KiloProvider: findFiles failed:", err), + ) +} + function openFile(dir: string, filePath: string, line?: number, column?: number): void { const uri = isAbsolutePath(filePath) ? vscode.Uri.file(filePath) : vscode.Uri.joinPath(vscode.Uri.file(dir), filePath) vscode.workspace.fs.stat(uri).then( @@ -113,19 +166,8 @@ function openFile(dir: string, filePath: string, line?: number, column?: number) vscode.commands.executeCommand("revealInExplorer", uri) return } - vscode.workspace.openTextDocument(uri).then( - (doc) => { - const options: vscode.TextDocumentShowOptions = { preview: true } - if (line !== undefined && line > 0) { - const col = column !== undefined && column > 0 ? column - 1 : 0 - const pos = new vscode.Position(line - 1, col) - options.selection = new vscode.Range(pos, pos) - } - vscode.window.showTextDocument(doc, options) - }, - (err) => console.error("[Kilo New] KiloProvider: Failed to open file:", uri.fsPath, err), - ) + show(uri, line, column) }, - (err) => console.error("[Kilo New] KiloProvider: Path does not exist:", uri.fsPath, err), + () => findFallback(filePath, line, column), ) } diff --git a/packages/kilo-vscode/src/kilo-provider/file-links.ts b/packages/kilo-vscode/src/kilo-provider/file-links.ts new file mode 100644 index 00000000000..738e9f89e2b --- /dev/null +++ b/packages/kilo-vscode/src/kilo-provider/file-links.ts @@ -0,0 +1,22 @@ +import * as vscode from "vscode" +import { isAbsolutePath } from "../path-utils" + +/** + * Stat-check candidate paths and return which ones are actual files (not directories). + * + * The webview marks every inline code span as a file-link candidate; this confirms + * which of those candidates resolve to a real file so the webview can promote them + * to clickable links and leave the rest as plain code. + */ +export function validateFiles(root: string, paths: string[]): Promise { + const resolve = (p: string) => + isAbsolutePath(p) ? vscode.Uri.file(p) : vscode.Uri.joinPath(vscode.Uri.file(root), p) + return Promise.all( + paths.map((p) => + Promise.resolve(vscode.workspace.fs.stat(resolve(p))).then( + (s) => (s.type & vscode.FileType.File ? p : null), + () => null, + ), + ), + ).then((r) => r.filter((x): x is string => x !== null)) +} diff --git a/packages/kilo-vscode/webview-ui/src/App.tsx b/packages/kilo-vscode/webview-ui/src/App.tsx index 26f775a8bf5..3208ee4852e 100644 --- a/packages/kilo-vscode/webview-ui/src/App.tsx +++ b/packages/kilo-vscode/webview-ui/src/App.tsx @@ -149,6 +149,35 @@ export const DataBridge: Component<{ children: any }> = (props) => { vscode.postMessage({ type: "openContent", content, language }) } + // File existence validation for code span candidates + const pending = new Map void>() + const counter = { n: 0 } + const validateFiles = (paths: string[]): Promise => { + const id = `vf-${++counter.n}` + return new Promise((resolve) => { + pending.set(id, resolve) + vscode.postMessage({ type: "validateFiles", id, paths }) + setTimeout(() => { + if (pending.has(id)) { + pending.delete(id) + resolve([]) + } + }, 3000) + }) + } + const handler = (event: MessageEvent) => { + const msg = event.data + if (msg?.type === "validateFilesResult" && msg.id) { + const cb = pending.get(msg.id) + if (cb) { + pending.delete(msg.id) + cb(msg.existing ?? []) + } + } + } + onMount(() => window.addEventListener("message", handler)) + onCleanup(() => window.removeEventListener("message", handler)) + const directory = () => { const dir = server.workspaceDirectory() if (!dir) return "" @@ -167,6 +196,7 @@ export const DataBridge: Component<{ children: any }> = (props) => { onOpenDiff={openDiff} onOpenUrl={openUrl} onOpenContent={openContent} + onValidateFiles={validateFiles} > {props.children} diff --git a/packages/kilo-vscode/webview-ui/src/types/messages/extension-messages.ts b/packages/kilo-vscode/webview-ui/src/types/messages/extension-messages.ts index 95d64f15dcb..e9f8d2fd410 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages/extension-messages.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages/extension-messages.ts @@ -962,6 +962,12 @@ export interface RemoteStatusMessage { connected: boolean } +export interface ValidateFilesResultMessage { + type: "validateFilesResult" + id: string + existing: string[] +} + export type ExtensionMessage = | ReadyMessage | FontSizeChangedMessage @@ -1108,3 +1114,4 @@ export type ExtensionMessage = | ExtensionDataReadyMessage | TelemetryStateMessage | RemoteStatusMessage + | ValidateFilesResultMessage diff --git a/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts b/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts index ee7ffcc40c0..1ad9b654d49 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts @@ -142,6 +142,12 @@ export interface OpenContentRequest { language?: string } +export interface ValidateFilesRequest { + type: "validateFiles" + id: string + paths: string[] +} + export interface CancelLoginRequest { type: "cancelLogin" } @@ -1107,6 +1113,7 @@ export type WebviewMessage = | OpenAgentManagerRequest | OpenAdvancedWorktreeRequest | OpenFileRequest + | ValidateFilesRequest | CancelLoginRequest | SetOrganizationRequest | WebviewReadyRequest diff --git a/packages/ui/src/context/data.tsx b/packages/ui/src/context/data.tsx index dbb2ccb908e..08e82f4f4e3 100644 --- a/packages/ui/src/context/data.tsx +++ b/packages/ui/src/context/data.tsx @@ -48,6 +48,8 @@ export type OpenDiffFn = (diff: { export type OpenUrlFn = (url: string) => void export type OpenContentFn = (content: string, language?: string) => void // kilocode_change + +export type ValidateFilesFn = (paths: string[]) => Promise // kilocode_change // kilocode_change end export const { use: useData, provider: DataProvider } = createSimpleContext({ @@ -61,6 +63,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({ onOpenDiff?: OpenDiffFn // kilocode_change onOpenUrl?: OpenUrlFn // kilocode_change onOpenContent?: OpenContentFn // kilocode_change + onValidateFiles?: ValidateFilesFn // kilocode_change }) => { return { get store() { @@ -75,6 +78,7 @@ export const { use: useData, provider: DataProvider } = createSimpleContext({ openDiff: props.onOpenDiff, // kilocode_change openUrl: props.onOpenUrl, // kilocode_change openContent: props.onOpenContent, // kilocode_change + validateFiles: props.onValidateFiles, // kilocode_change } }, }) From 81aad79f98c51c0eee95a9ec2794292a77475559 Mon Sep 17 00:00:00 2001 From: Sylwester Liljegren Date: Sun, 14 Jun 2026 23:46:37 +0200 Subject: [PATCH 02/25] fix(vscode): harden file-link fallback and type validateFiles message Address kilo-code-bot review on #11218: - escape glob metacharacters in the workspace filename search so names like [id].tsx / [...slug].tsx resolve instead of falling through to the "File not found" warning - add rejection handlers to showTextDocument (in show()) and showQuickPick so VS Code API errors surface instead of being silently swallowed - type the validateFiles message fields on the handleEditorAction parameter instead of inline casts --- .../src/kilo-provider/editor-actions.ts | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/kilo-vscode/src/kilo-provider/editor-actions.ts b/packages/kilo-vscode/src/kilo-provider/editor-actions.ts index d5dfd072db8..535c74faecd 100644 --- a/packages/kilo-vscode/src/kilo-provider/editor-actions.ts +++ b/packages/kilo-vscode/src/kilo-provider/editor-actions.ts @@ -69,6 +69,8 @@ export function handleEditorAction( initialDiffStyle?: unknown dataUrl?: string filename?: string + id?: string + paths?: string[] }, opts: { dir: () => string @@ -86,11 +88,12 @@ export function handleEditorAction( return true } if (message.type === "validateFiles") { - const id = (message as { id?: string }).id - const paths = (message as { paths?: string[] }).paths + const id = message.id + const paths = message.paths if (id && paths && opts.post) { + const post = opts.post validateFiles(opts.dir(), paths).then( - (existing) => opts.post!({ type: "validateFilesResult", id, existing }), + (existing) => post({ type: "validateFilesResult", id, existing }), (err) => console.error("[Kilo New] KiloProvider: validateFiles failed:", err), ) } @@ -127,7 +130,9 @@ function show(uri: vscode.Uri, line?: number, column?: number): void { const pos = new vscode.Position(line - 1, col) options.selection = new vscode.Range(pos, pos) } - vscode.window.showTextDocument(doc, options) + vscode.window + .showTextDocument(doc, options) + .then(undefined, (err) => console.error("[Kilo New] KiloProvider: Failed to show document:", uri.fsPath, err)) }, (err) => console.error("[Kilo New] KiloProvider: Failed to open file:", uri.fsPath, err), ) @@ -139,7 +144,9 @@ function show(uri: vscode.Uri, line?: number, column?: number): void { */ function findFallback(filePath: string, line?: number, column?: number): void { const name = filePath.split(/[\\/]/).pop() || filePath - Promise.resolve(vscode.workspace.findFiles(`**/${name}`, "**/node_modules/**", 5)).then( + // Escape glob metacharacters so filenames like `[id].tsx` or `[...slug].tsx` resolve correctly. + const escaped = name.replace(/[\[\]{}?*!()]/g, "\\$&") + Promise.resolve(vscode.workspace.findFiles(`**/${escaped}`, "**/node_modules/**", 5)).then( (matches) => { if (matches.length === 1) { show(matches[0], line, column) @@ -147,9 +154,12 @@ function findFallback(filePath: string, line?: number, column?: number): void { } if (matches.length > 1) { const items = matches.map((m) => ({ label: vscode.workspace.asRelativePath(m), uri: m })) - vscode.window.showQuickPick(items, { placeHolder: `Multiple matches for "${name}"` }).then((pick) => { - if (pick) show(pick.uri, line, column) - }) + vscode.window.showQuickPick(items, { placeHolder: `Multiple matches for "${name}"` }).then( + (pick) => { + if (pick) show(pick.uri, line, column) + }, + (err) => console.error("[Kilo New] KiloProvider: showQuickPick failed:", err), + ) return } vscode.window.showWarningMessage(`File not found: ${filePath}`) From d497be6311b46503ccf8724305971e764e80f2ee Mon Sep 17 00:00:00 2001 From: Sylwester Liljegren Date: Thu, 18 Jun 2026 20:15:49 +0200 Subject: [PATCH 03/25] fix(vscode): scope file-link validation and fallback to the session root Address markijbema review on #11218: - validateFiles now rejects candidates that resolve outside the session root (absolute paths elsewhere, UNC paths, ../ traversal) before any fs.stat, so auto-validated model output can't probe arbitrary host paths - the openFile dead-link fallback searches the session dir via a RelativePattern instead of the whole opened workspace, so it can't cross into another worktree/branch - use VS Code-compatible bracket glob escaping (`[id].tsx` -> `[[]id[]].tsx`) so dynamic-route filenames resolve instead of falling through Adds focused unit tests for the new vscode-free `contains` and `escapeGlob` helpers in path-utils. --- .../src/kilo-provider/editor-actions.ts | 19 ++++---- .../src/kilo-provider/file-links.ts | 25 +++++----- packages/kilo-vscode/src/path-utils.ts | 28 +++++++++++ .../kilo-vscode/tests/unit/path-utils.test.ts | 46 ++++++++++++++++++- 4 files changed, 98 insertions(+), 20 deletions(-) diff --git a/packages/kilo-vscode/src/kilo-provider/editor-actions.ts b/packages/kilo-vscode/src/kilo-provider/editor-actions.ts index 535c74faecd..c92ede42873 100644 --- a/packages/kilo-vscode/src/kilo-provider/editor-actions.ts +++ b/packages/kilo-vscode/src/kilo-provider/editor-actions.ts @@ -1,6 +1,6 @@ import * as vscode from "vscode" import { buildPreviewPath, getPreviewCommand, getPreviewDir, parseImage, trimEntries } from "../image-preview" -import { isAbsolutePath } from "../path-utils" +import { escapeGlob, isAbsolutePath } from "../path-utils" import { validateFiles } from "./file-links" import type { DiffVirtualFile, DiffVirtualProvider } from "../DiffVirtualProvider" @@ -139,14 +139,17 @@ function show(uri: vscode.Uri, line?: number, column?: number): void { } /** - * Fallback when the exact path does not exist: search the workspace by filename. - * Opens the file directly on a single match, prompts on multiple, warns on none. + * Fallback when the exact path does not exist: search the session directory by + * filename. Opens the file directly on a single match, prompts on multiple, + * warns on none. The search is scoped to `dir` (the active session's directory) + * via a RelativePattern so it can't cross into another worktree/branch. */ -function findFallback(filePath: string, line?: number, column?: number): void { +function findFallback(dir: string, filePath: string, line?: number, column?: number): void { const name = filePath.split(/[\\/]/).pop() || filePath - // Escape glob metacharacters so filenames like `[id].tsx` or `[...slug].tsx` resolve correctly. - const escaped = name.replace(/[\[\]{}?*!()]/g, "\\$&") - Promise.resolve(vscode.workspace.findFiles(`**/${escaped}`, "**/node_modules/**", 5)).then( + // VS Code globs don't honor backslash escapes, so bracket-escape metacharacters + // (e.g. `[id].tsx`) instead — otherwise such names never match. + const pattern = new vscode.RelativePattern(vscode.Uri.file(dir), `**/${escapeGlob(name)}`) + Promise.resolve(vscode.workspace.findFiles(pattern, "**/node_modules/**", 5)).then( (matches) => { if (matches.length === 1) { show(matches[0], line, column) @@ -178,6 +181,6 @@ function openFile(dir: string, filePath: string, line?: number, column?: number) } show(uri, line, column) }, - () => findFallback(filePath, line, column), + () => findFallback(dir, filePath, line, column), ) } diff --git a/packages/kilo-vscode/src/kilo-provider/file-links.ts b/packages/kilo-vscode/src/kilo-provider/file-links.ts index 738e9f89e2b..b4a6a2551a5 100644 --- a/packages/kilo-vscode/src/kilo-provider/file-links.ts +++ b/packages/kilo-vscode/src/kilo-provider/file-links.ts @@ -1,5 +1,5 @@ import * as vscode from "vscode" -import { isAbsolutePath } from "../path-utils" +import { contains, isAbsolutePath } from "../path-utils" /** * Stat-check candidate paths and return which ones are actual files (not directories). @@ -7,16 +7,19 @@ import { isAbsolutePath } from "../path-utils" * The webview marks every inline code span as a file-link candidate; this confirms * which of those candidates resolve to a real file so the webview can promote them * to clickable links and leave the rest as plain code. + * + * Candidates that resolve outside the session `root` (absolute paths elsewhere, + * UNC paths, or `../` traversal) are rejected without touching the filesystem, so + * auto-validated model output can't probe arbitrary host paths. */ export function validateFiles(root: string, paths: string[]): Promise { - const resolve = (p: string) => - isAbsolutePath(p) ? vscode.Uri.file(p) : vscode.Uri.joinPath(vscode.Uri.file(root), p) - return Promise.all( - paths.map((p) => - Promise.resolve(vscode.workspace.fs.stat(resolve(p))).then( - (s) => (s.type & vscode.FileType.File ? p : null), - () => null, - ), - ), - ).then((r) => r.filter((x): x is string => x !== null)) + const check = (p: string): Promise => { + if (!contains(root, p)) return Promise.resolve(null) + const uri = isAbsolutePath(p) ? vscode.Uri.file(p) : vscode.Uri.joinPath(vscode.Uri.file(root), p) + return Promise.resolve(vscode.workspace.fs.stat(uri)).then( + (s) => (s.type & vscode.FileType.File ? p : null), + () => null, + ) + } + return Promise.all(paths.map(check)).then((r) => r.filter((x): x is string => x !== null)) } diff --git a/packages/kilo-vscode/src/path-utils.ts b/packages/kilo-vscode/src/path-utils.ts index 856a76038a2..ab3f829abb4 100644 --- a/packages/kilo-vscode/src/path-utils.ts +++ b/packages/kilo-vscode/src/path-utils.ts @@ -1,3 +1,5 @@ +import * as path from "node:path" + /** * Check whether a file path is absolute. * @@ -25,3 +27,29 @@ export function isAbsolutePath(filePath: string): boolean { return true return false } + +/** + * Whether `candidate` resolves to a location inside `root`. + * + * Rejects UNC candidates, absolute paths outside the root, and `../` traversal + * that escapes the root. Used to keep filesystem probes scoped to the trusted + * session directory so model-generated paths can't reach arbitrary host files. + */ +export function contains(root: string, candidate: string): boolean { + if (!root || !candidate) return false + // UNC candidates can trigger outbound filesystem requests on Windows — never allow them. + if (candidate.startsWith("\\\\") || candidate.startsWith("//")) return false + const base = path.resolve(root) + const rel = path.relative(base, path.resolve(base, candidate)) + return rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel) +} + +/** + * Escape glob metacharacters so a literal filename can be embedded in a VS Code + * glob pattern. VS Code globs do not honor backslash escapes, so each special + * character is wrapped in a single-character bracket expression — e.g. + * `[id].tsx` becomes `[[]id[]].tsx`. + */ +export function escapeGlob(name: string): string { + return name.replace(/[*?{}[\]]/g, (c) => (c === "]" ? "[]]" : `[${c}]`)) +} diff --git a/packages/kilo-vscode/tests/unit/path-utils.test.ts b/packages/kilo-vscode/tests/unit/path-utils.test.ts index 517e89eded9..0c9dfc3082d 100644 --- a/packages/kilo-vscode/tests/unit/path-utils.test.ts +++ b/packages/kilo-vscode/tests/unit/path-utils.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "bun:test" -import { isAbsolutePath } from "../../src/path-utils" +import { contains, escapeGlob, isAbsolutePath } from "../../src/path-utils" describe("isAbsolutePath", () => { // ── Unix absolute paths ────────────────────────────────────────────── @@ -163,3 +163,47 @@ describe("isAbsolutePath", () => { }) }) }) + +describe("contains", () => { + it("accepts relative paths inside the root", () => { + expect(contains("/work", "src/a.ts")).toBe(true) + expect(contains("/work", "./src/a.ts")).toBe(true) + expect(contains("/work", "a.ts")).toBe(true) + }) + + it("rejects parent traversal that escapes the root", () => { + expect(contains("/work", "../etc/passwd")).toBe(false) + expect(contains("/work", "../../secret.ts")).toBe(false) + }) + + it("rejects absolute paths outside the root", () => { + expect(contains("/work", "/etc/passwd")).toBe(false) + }) + + it("rejects UNC candidates", () => { + expect(contains("/work", "\\\\server\\share\\file.ts")).toBe(false) + expect(contains("/work", "//server/share/file.ts")).toBe(false) + }) + + it("rejects empty inputs", () => { + expect(contains("", "a.ts")).toBe(false) + expect(contains("/work", "")).toBe(false) + }) +}) + +describe("escapeGlob", () => { + it("bracket-escapes dynamic-route filenames", () => { + expect(escapeGlob("[id].tsx")).toBe("[[]id[]].tsx") + expect(escapeGlob("[...slug].tsx")).toBe("[[]...slug[]].tsx") + }) + + it("escapes wildcard and brace metacharacters", () => { + expect(escapeGlob("a*b?.ts")).toBe("a[*]b[?].ts") + expect(escapeGlob("{x,y}.ts")).toBe("[{]x,y[}].ts") + }) + + it("leaves ordinary filenames unchanged", () => { + expect(escapeGlob("index.ts")).toBe("index.ts") + expect(escapeGlob("file-path.test.ts")).toBe("file-path.test.ts") + }) +}) From c2076c8429199f1de2aa645501f1fb577525b4c8 Mon Sep 17 00:00:00 2001 From: Sylwester Liljegren Date: Thu, 18 Jun 2026 20:26:03 +0200 Subject: [PATCH 04/25] fix(vscode): resolve real path before validating file-link containment Address kilo-code-bot review on #11218: contains() is purely lexical, so a checked-in symlink (e.g. root/link -> /etc) would pass the check and let validateFiles stat an external target. validateFiles now resolves each candidate's real path (symlinks included) and requires it to stay inside the real session root before any stat, on top of the existing lexical pre-check that still rejects UNC / absolute-outside / ../ without touching the disk. --- .../src/kilo-provider/file-links.ts | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/packages/kilo-vscode/src/kilo-provider/file-links.ts b/packages/kilo-vscode/src/kilo-provider/file-links.ts index b4a6a2551a5..d038005bea3 100644 --- a/packages/kilo-vscode/src/kilo-provider/file-links.ts +++ b/packages/kilo-vscode/src/kilo-provider/file-links.ts @@ -1,5 +1,7 @@ +import { realpath } from "node:fs/promises" +import * as path from "node:path" import * as vscode from "vscode" -import { contains, isAbsolutePath } from "../path-utils" +import { contains } from "../path-utils" /** * Stat-check candidate paths and return which ones are actual files (not directories). @@ -8,18 +10,31 @@ import { contains, isAbsolutePath } from "../path-utils" * which of those candidates resolve to a real file so the webview can promote them * to clickable links and leave the rest as plain code. * - * Candidates that resolve outside the session `root` (absolute paths elsewhere, - * UNC paths, or `../` traversal) are rejected without touching the filesystem, so - * auto-validated model output can't probe arbitrary host paths. + * Containment is enforced twice so auto-validated model output can't probe host + * files outside the session `root`: + * 1. a lexical check rejects absolute paths elsewhere, UNC paths, and `../` + * traversal before touching the filesystem at all; + * 2. the candidate's real path (symlinks resolved) must still be inside the + * real root, so a checked-in symlink can't escape the root either. */ export function validateFiles(root: string, paths: string[]): Promise { - const check = (p: string): Promise => { - if (!contains(root, p)) return Promise.resolve(null) - const uri = isAbsolutePath(p) ? vscode.Uri.file(p) : vscode.Uri.joinPath(vscode.Uri.file(root), p) - return Promise.resolve(vscode.workspace.fs.stat(uri)).then( - (s) => (s.type & vscode.FileType.File ? p : null), - () => null, - ) - } - return Promise.all(paths.map(check)).then((r) => r.filter((x): x is string => x !== null)) + return Promise.resolve(realpath(root)).then( + (realRoot) => { + const check = (p: string): Promise => { + if (!contains(root, p)) return Promise.resolve(null) + return Promise.resolve(realpath(path.resolve(root, p))).then( + (real) => { + if (!contains(realRoot, real)) return null + return Promise.resolve(vscode.workspace.fs.stat(vscode.Uri.file(real))).then( + (s) => (s.type & vscode.FileType.File ? p : null), + () => null, + ) + }, + () => null, + ) + } + return Promise.all(paths.map(check)).then((r) => r.filter((x): x is string => x !== null)) + }, + () => [], + ) } From 1b6dcf7457ea1ec64fd1372463873ccd7b16e7e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Uruchurtu?= Date: Tue, 23 Jun 2026 18:54:41 -0600 Subject: [PATCH 05/25] docs: remove root translated readmes --- README.ar.md | 181 -------------------------------------------------- README.bn.md | 177 ------------------------------------------------ README.br.md | 177 ------------------------------------------------ README.bs.md | 177 ------------------------------------------------ README.da.md | 177 ------------------------------------------------ README.de.md | 177 ------------------------------------------------ README.es.md | 177 ------------------------------------------------ README.fr.md | 177 ------------------------------------------------ README.gr.md | 177 ------------------------------------------------ README.it.md | 177 ------------------------------------------------ README.ja.md | 177 ------------------------------------------------ README.ko.md | 177 ------------------------------------------------ README.md | 6 +- README.no.md | 177 ------------------------------------------------ README.pl.md | 177 ------------------------------------------------ README.ru.md | 177 ------------------------------------------------ README.th.md | 177 ------------------------------------------------ README.tr.md | 177 ------------------------------------------------ README.uk.md | 177 ------------------------------------------------ README.vi.md | 177 ------------------------------------------------ README.zh.md | 177 ------------------------------------------------ README.zht.md | 177 ------------------------------------------------ 22 files changed, 1 insertion(+), 3726 deletions(-) delete mode 100644 README.ar.md delete mode 100644 README.bn.md delete mode 100644 README.br.md delete mode 100644 README.bs.md delete mode 100644 README.da.md delete mode 100644 README.de.md delete mode 100644 README.es.md delete mode 100644 README.fr.md delete mode 100644 README.gr.md delete mode 100644 README.it.md delete mode 100644 README.ja.md delete mode 100644 README.ko.md delete mode 100644 README.no.md delete mode 100644 README.pl.md delete mode 100644 README.ru.md delete mode 100644 README.th.md delete mode 100644 README.tr.md delete mode 100644 README.uk.md delete mode 100644 README.vi.md delete mode 100644 README.zh.md delete mode 100644 README.zht.md diff --git a/README.ar.md b/README.ar.md deleted file mode 100644 index 9fcfe6acd8b..00000000000 --- a/README.ar.md +++ /dev/null @@ -1,181 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -
- -

- Kilo Code logo -

- -

وكيل برمجة مفتوح المصدر للبناء باستخدام الذكاء الاصطناعي في VS Code أو JetBrains أو CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code هو وكيل برمجة بالذكاء الاصطناعي يعمل معك أينما تعمل: [VS Code](https://kilo.ai/landing/vs-code) و[JetBrains](https://kilo.ai/features/jetbrains-native) و[CLI](https://kilo.ai/cli). إنه مفتوح المصدر وبتسعير مفتوح. يمكنك الاختيار من بين أكثر من 500 نموذج، والتبديل بينها أثناء المهمة، ودفع سعر مزود النموذج من دون أي هامش إضافي. لا تحتاج إلى مفاتيح API للبدء. - -### التثبيت - -اختر المكان الذي تريد تشغيل Kilo فيه. - -
-VS Code - -
- -ثبّت [إضافة Kilo Code](vscode:extension/kilocode.kilo-code) مباشرة، أو احصل عليها من [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). أنشئ حسابًا وستحصل على إمكانية الوصول إلى أكثر من 500 نموذج، بما في ذلك GPT-5.5 وClaude Opus 4.7 وClaude Sonnet 4.6 وGemini 3.1 Pro Preview، كلها بسعر المزود. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -بعد ذلك شغّل `kilo` في أي مجلد مشروع للبدء. - -
- -
-JetBrains - -
- -ثبّت [إضافة Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) من JetBrains Marketplace، أو ابحث عن "Kilo Code" في `Settings → Plugins` داخل أي JetBrains IDE. - -
- -
-Cloud Agent - -
- -شغّل Kilo من الويب، من دون جهاز محلي، على [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-مراجعات الكود - -
- -أعدّ مراجعات كود آلية بالذكاء الاصطناعي لطلبات السحب الخاصة بك على [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -شغّل وكيل الذكاء الاصطناعي الدائم لديك على [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-تثبيت CLI من GitHub Releases (ملفات ثنائية) - -نزّل أحدث ملف ثنائي من [صفحة Releases](https://github.com/Kilo-Org/kilocode/releases). - -| المنصة | الملف | -|---|---| -| Windows (معظم أجهزة PC) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -ملاحظات: `x64-baseline` هو بناء توافق للمعالجات القديمة التي لا تدعم AVX. `musl` هو البناء المرتبط ثابتًا لـ Alpine أو صور Docker البسيطة من دون glibc. `kilo-vscode-*.vsix` هو حزمة إضافة VS Code وليس CLI. أرشيفات `Source code` مخصصة للبناء من المصدر. - -
- -### Agents - -يأتي Kilo مع agents متخصصة يمكنك التبديل بينها حسب المهمة. يمكنك أيضًا إنشاء agents مخصصة خاصة بك. - -- **Code** - الافتراضي. ينفذ الكود ويعدّله من اللغة الطبيعية. -- **Plan** - يصمم البنية ويكتب خطط التنفيذ قبل كتابة أي كود. -- **Ask** - يجيب عن الأسئلة حول قاعدة الكود من دون تعديل الملفات. -- **Debug** - يستكشف المشكلات ويتتبعها. -- **Review** - يراجع تغييراتك ويكشف مشكلات الأداء والأمان والأسلوب وتغطية الاختبارات. - -تعرّف أكثر على [agents وagents المخصصة](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### ما الذي يفعله - -- **توليد الكود** من اللغة الطبيعية عبر ملفات متعددة. -- **إكمال تلقائي داخل السطر** مع اقتراحات ghost-text والضغط على Tab للقبول. -- **فحص ذاتي** لكي يراجع الوكيل عمله ويصححه. -- **تحكم في الطرفية والمتصفح** لتشغيل الأوامر وأتمتة الويب. -- **سوق MCP** للعثور على خوادم MCP وربطها لتوسيع قدرات الوكيل. -- **أكثر من 500 نموذج** مع التبديل أثناء المهمة، لتطابق زمن الاستجابة والتكلفة والاستدلال مع العمل. - -### الوضع المستقل (CI/CD) - -شغّل `kilo run` مع `--auto` للعمل بشكل مستقل بالكامل ومن دون prompts، وهو مصمم لخطوط CI/CD: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -يعطّل `--auto` كل مطالبات الأذونات ويسمح للوكيل بتنفيذ أي إجراء من دون تأكيد. استخدمه فقط في بيئات موثوقة. - -### التوثيق - -لإعدادات التكوين وكل ما عدا ذلك، راجع [التوثيق](https://kilo.ai/docs). - -### المساهمة - -نرحب بمساهمات المطورين والكتّاب والجميع. ابدأ بـ [Contributing Guide](/CONTRIBUTING.md) لإعداد البيئة ومعايير الكود وكيفية فتح pull request. راجع [RELEASING.md](RELEASING.md) لعملية إصدار إضافة VS Code وCLI، و[packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) لإضافة JetBrains. - -يرجى قراءة [Code of Conduct](/CODE_OF_CONDUCT.md) قبل المشاركة. - -### الترخيص - -MIT. يمكنك استخدام هذا الكود وتعديله وتوزيعه، بما في ذلك تجاريًا، ما دمت تحتفظ بإشعارات النسبة والترخيص. راجع [License](/LICENSE). - -### FAQ - -
-من أين جاء Kilo CLI؟ - -Kilo CLI هو fork من [OpenCode](https://github.com/Kilo-Org/kilocode)، وتم تحسينه للعمل داخل منصة Kilo agentic engineering. - -
- ---- - -**انضم إلى المجتمع** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) - -
diff --git a/README.bn.md b/README.bn.md deleted file mode 100644 index 99442c354eb..00000000000 --- a/README.bn.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

VS Code, JetBrains বা CLI-তে AI দিয়ে তৈরি করার জন্য ওপেন সোর্স কোডিং এজেন্ট।

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code হলো একটি AI কোডিং এজেন্ট যা আপনি যেখানে কাজ করেন সেখানেই কাজ করে: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) এবং [CLI](https://kilo.ai/cli)। এটি ওপেন সোর্স এবং খোলা মূল্যনীতির। আপনি 500টির বেশি মডেল থেকে বেছে নিতে পারেন, কাজের মাঝখানে মডেল বদলাতে পারেন এবং কোনো অতিরিক্ত চার্জ ছাড়াই মডেল প্রদানকারীর রেট পরিশোধ করেন। শুরু করতে API key দরকার নেই। - -### ইনস্টলেশন - -আপনি কোথায় Kilo চালাতে চান তা বেছে নিন। - -
-VS Code - -
- -[Kilo Code extension](vscode:extension/kilocode.kilo-code) সরাসরি ইনস্টল করুন, অথবা [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) থেকে নিন। একটি অ্যাকাউন্ট তৈরি করলে GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 এবং Gemini 3.1 Pro Preview সহ 500টির বেশি মডেলে প্রদানকারীর দামে অ্যাক্সেস পাবেন। - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -তারপর শুরু করতে যেকোনো প্রজেক্ট ডিরেক্টরিতে `kilo` চালান। - -
- -
-JetBrains - -
- -JetBrains Marketplace থেকে [Kilo Code plugin](https://plugins.jetbrains.com/plugin/28350-kilo-code) ইনস্টল করুন, অথবা যেকোনো JetBrains IDE-তে `Settings → Plugins`-এ "Kilo Code" খুঁজুন। - -
- -
-Cloud Agent - -
- -লোকাল মেশিন ছাড়াই ওয়েব থেকে [app.kilo.ai/cloud](https://app.kilo.ai/cloud)-এ Kilo চালান। - -
- -
-Code Reviews - -
- -[app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews)-এ আপনার pull request-এ স্বয়ংক্রিয় AI code review সেট আপ করুন। - -
- -
-KiloClaw - -
- -[app.kilo.ai/claw](https://app.kilo.ai/claw)-এ আপনার always-on AI agent চালু করুন। - -
- -
-GitHub Releases থেকে CLI ইনস্টল করুন (বাইনারি) - -[Releases page](https://github.com/Kilo-Org/kilocode/releases) থেকে সর্বশেষ বাইনারি ডাউনলোড করুন। - -| প্ল্যাটফর্ম | Asset | -|---|---| -| Windows (বেশিরভাগ PC) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -নোট: `x64-baseline` হলো AVX ছাড়া পুরোনো CPU-এর জন্য compatibility build। `musl` হলো Alpine বা glibc ছাড়া minimal Docker image-এর জন্য statically linked build। `kilo-vscode-*.vsix` হলো VS Code extension package, CLI নয়। `Source code` archive source থেকে build করার জন্য। - -
- -### Agents - -Kilo বিশেষায়িত agents সহ আসে, কাজ অনুযায়ী আপনি এগুলোর মধ্যে বদলাতে পারেন। আপনি নিজের custom agents-ও বানাতে পারেন। - -- **Code** - ডিফল্ট। প্রাকৃতিক ভাষা থেকে কোড implement এবং edit করে। -- **Plan** - কোনো কোড লেখার আগে architecture design করে এবং implementation plan লেখে। -- **Ask** - কোনো ফাইল না ছুঁয়ে আপনার codebase সম্পর্কে প্রশ্নের উত্তর দেয়। -- **Debug** - সমস্যা troubleshoot এবং trace করে। -- **Review** - আপনার পরিবর্তন review করে এবং performance, security, style ও test coverage-এর সমস্যা তুলে ধরে। - -[agents এবং custom agents](https://kilo.ai/docs/code-with-ai/agents/using-agents) সম্পর্কে আরও জানুন। - -### এটি কী করে - -- প্রাকৃতিক ভাষা থেকে একাধিক ফাইলে **code generation**। -- ghost-text suggestion এবং Tab দিয়ে accept করার **inline autocomplete**। -- agent যেন নিজের কাজ review ও correct করে তার জন্য **self-checking**। -- command চালানো এবং web automate করার জন্য **terminal ও browser control**। -- agent-এর ক্ষমতা বাড়ায় এমন MCP server খুঁজে ও যুক্ত করার জন্য **MCP marketplace**। -- latency, cost এবং reasoning কাজের সাথে মেলাতে mid-task switching সহ **500টির বেশি model**। - -### Autonomous Mode (CI/CD) - -CI/CD pipeline-এর জন্য prompts ছাড়া পুরোপুরি autonomous operation পেতে `kilo run`-এর সাথে `--auto` ব্যবহার করুন: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` সব permission prompt বন্ধ করে এবং agent-কে confirmation ছাড়া যেকোনো action execute করতে দেয়। শুধু trusted environment-এ ব্যবহার করুন। - -### ডকুমেন্টেশন - -Configuration এবং বাকি সবকিছুর জন্য [docs](https://kilo.ai/docs) দেখুন। - -### Contributing - -Developer, writer এবং সবাইকে contribution-এর জন্য স্বাগতম। environment setup, coding standard এবং pull request খোলার পদ্ধতির জন্য [Contributing Guide](/CONTRIBUTING.md) দিয়ে শুরু করুন। VS Code extension এবং CLI release process-এর জন্য [RELEASING.md](RELEASING.md), এবং JetBrains plugin-এর জন্য [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) দেখুন। - -অংশ নেওয়ার আগে আমাদের [Code of Conduct](/CODE_OF_CONDUCT.md) পড়ুন। - -### License - -MIT। attribution এবং license notice রেখে আপনি এই code ব্যবহার, পরিবর্তন এবং distribute করতে পারেন, commercial ব্যবহারসহ। [License](/LICENSE) দেখুন। - -### FAQ - -
-Kilo CLI কোথা থেকে এসেছে? - -Kilo CLI হলো [OpenCode](https://github.com/Kilo-Org/kilocode)-এর একটি fork, Kilo agentic engineering platform-এর মধ্যে কাজ করার জন্য উন্নত করা হয়েছে। - -
- ---- - -**কমিউনিটিতে যোগ দিন** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.br.md b/README.br.md deleted file mode 100644 index 8623e7e5782..00000000000 --- a/README.br.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

O agente de programação open source para criar com IA no VS Code, JetBrains ou CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code é um agente de programação com IA que acompanha você em todos os lugares onde trabalha: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) e [CLI](https://kilo.ai/cli). É open source e tem preços abertos. Você escolhe entre mais de 500 modelos, alterna entre eles no meio da tarefa e paga a tarifa do provedor do modelo sem acréscimo. Não são necessárias chaves de API para começar. - -### Instalação - -Escolha onde você quer executar o Kilo. - -
-VS Code - -
- -Instale a [extensão Kilo Code](vscode:extension/kilocode.kilo-code) diretamente ou baixe pelo [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Crie uma conta e você terá acesso a mais de 500 modelos, incluindo GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 e Gemini 3.1 Pro Preview, todos com preço do provedor. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Depois execute `kilo` em qualquer diretório de projeto para começar. - -
- -
-JetBrains - -
- -Instale o [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) pelo JetBrains Marketplace ou procure por "Kilo Code" em `Settings → Plugins` dentro de qualquer IDE JetBrains. - -
- -
-Cloud Agent - -
- -Execute o Kilo pela web, sem máquina local, em [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Revisões de código - -
- -Configure revisões automáticas de código com IA nos seus pull requests em [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Inicie seu agente de IA sempre ativo em [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Instalar a CLI pelo GitHub Releases (binários) - -Baixe o binário mais recente na [página de Releases](https://github.com/Kilo-Org/kilocode/releases). - -| Plataforma | Asset | -|---|---| -| Windows (a maioria dos PCs) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Notas: `x64-baseline` é uma build de compatibilidade para CPUs antigas sem AVX. `musl` é a build com link estático para Alpine ou imagens Docker mínimas sem glibc. `kilo-vscode-*.vsix` é o pacote da extensão VS Code, não a CLI. Arquivos `Source code` são para compilar a partir do código-fonte. - -
- -### Agents - -Kilo vem com agents especializados para você alternar dependendo da tarefa. Você também pode criar seus próprios agents personalizados. - -- **Code** - O padrão. Implementa e edita código a partir de linguagem natural. -- **Plan** - Desenha a arquitetura e escreve planos de implementação antes de qualquer código ser escrito. -- **Ask** - Responde perguntas sobre sua base de código sem tocar nos arquivos. -- **Debug** - Soluciona e rastreia problemas. -- **Review** - Revisa suas mudanças e aponta problemas de performance, segurança, estilo e cobertura de testes. - -Saiba mais sobre [agents e agents personalizados](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### O que ele faz - -- **Geração de código** a partir de linguagem natural, em vários arquivos. -- **Autocomplete inline** com sugestões ghost-text e Tab para aceitar. -- **Autoverificação** para que o agente revise e corrija o próprio trabalho. -- **Controle de terminal e navegador** para executar comandos e automatizar a web. -- **Marketplace MCP** para encontrar e conectar servidores MCP que ampliam o que o agente pode fazer. -- **Mais de 500 modelos** com alternância no meio da tarefa, para combinar latência, custo e raciocínio com o trabalho. - -### Modo autônomo (CI/CD) - -Execute `kilo run` com `--auto` para operação totalmente autônoma e sem prompts, criada para pipelines CI/CD: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` desativa todos os prompts de permissão e permite que o agente execute qualquer ação sem confirmação. Use apenas em ambientes confiáveis. - -### Documentação - -Para configuração e todo o resto, consulte a [documentação](https://kilo.ai/docs). - -### Contribuindo - -Contribuições são bem-vindas de desenvolvedores, escritores e qualquer pessoa. Comece pelo [Contributing Guide](/CONTRIBUTING.md) para configurar o ambiente, conhecer os padrões de código e abrir um pull request. Consulte [RELEASING.md](RELEASING.md) para o processo de release da extensão VS Code e da CLI, e [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) para o plugin JetBrains. - -Leia nosso [Code of Conduct](/CODE_OF_CONDUCT.md) antes de participar. - -### Licença - -MIT. Você pode usar, modificar e distribuir este código, inclusive comercialmente, desde que mantenha os avisos de atribuição e licença. Consulte [License](/LICENSE). - -### FAQ - -
-De onde veio o Kilo CLI? - -Kilo CLI é um fork do [OpenCode](https://github.com/Kilo-Org/kilocode), aprimorado para funcionar dentro da plataforma de engenharia agêntica da Kilo. - -
- ---- - -**Participe da comunidade** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.bs.md b/README.bs.md deleted file mode 100644 index da2780f9fd9..00000000000 --- a/README.bs.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

Open source agent za kodiranje s AI-jem u VS Codeu, JetBrainsu ili CLI-ju.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code je AI agent za kodiranje koji vas prati svugdje gdje radite: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) i [CLI](https://kilo.ai/cli). Open source je i ima otvorene cijene. Birate između više od 500 modela, mijenjate ih usred zadatka i plaćate cijenu pružaoca modela bez dodatne marže. API ključevi nisu potrebni za početak. - -### Instalacija - -Odaberite gdje želite pokrenuti Kilo. - -
-VS Code - -
- -Instalirajte [Kilo Code ekstenziju](vscode:extension/kilocode.kilo-code) direktno ili je preuzmite sa [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Kreirajte račun i imat ćete pristup za više od 500 modela, uključujući GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 i Gemini 3.1 Pro Preview, sve po cijenama pružaoca. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Zatim pokrenite `kilo` u bilo kojem direktoriju projekta. - -
- -
-JetBrains - -
- -Instalirajte [Kilo Code plugin](https://plugins.jetbrains.com/plugin/28350-kilo-code) sa JetBrains Marketplacea ili potražite "Kilo Code" u `Settings → Plugins` unutar bilo kojeg JetBrains IDE-a. - -
- -
-Cloud Agent - -
- -Pokrenite Kilo s weba, bez lokalne mašine, na [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Pregledi koda - -
- -Postavite automatske AI preglede koda na svojim pull requestovima na [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Pokrenite svog uvijek aktivnog AI agenta na [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Instalirajte CLI iz GitHub Releases (binarne datoteke) - -Preuzmite najnoviju binarnu datoteku sa [Releases stranice](https://github.com/Kilo-Org/kilocode/releases). - -| Platforma | Asset | -|---|---| -| Windows (većina PC računara) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Napomene: `x64-baseline` je kompatibilna verzija za starije CPU-e bez AVX-a. `musl` je statički linkovana verzija za Alpine ili minimalne Docker slike bez glibc-a. `kilo-vscode-*.vsix` je paket VS Code ekstenzije, ne CLI. `Source code` arhive služe za build iz izvornog koda. - -
- -### Agents - -Kilo dolazi sa specijaliziranim agents koje mijenjate zavisno od zadatka. Možete napraviti i vlastite prilagođene agents. - -- **Code** - Zadani. Implementira i uređuje kod iz prirodnog jezika. -- **Plan** - Dizajnira arhitekturu i piše implementacijske planove prije pisanja koda. -- **Ask** - Odgovara na pitanja o codebaseu bez mijenjanja datoteka. -- **Debug** - Rješava i prati probleme. -- **Review** - Pregleda vaše promjene i pronalazi probleme u performansama, sigurnosti, stilu i pokrivenosti testovima. - -Saznajte više o [agents i prilagođenim agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Šta radi - -- **Generisanje koda** iz prirodnog jezika, kroz više datoteka. -- **Inline autocomplete** sa ghost-text prijedlozima i Tab za prihvatanje. -- **Samoprovjera** kako bi agent pregledao i ispravio vlastiti rad. -- **Kontrola terminala i browsera** za pokretanje komandi i automatizaciju weba. -- **MCP marketplace** za pronalaženje i povezivanje MCP servera koji proširuju mogućnosti agenta. -- **Više od 500 modela** sa prebacivanjem usred zadatka, da uskladite latenciju, cijenu i rezonovanje s poslom. - -### Autonomni način rada (CI/CD) - -Pokrenite `kilo run` s `--auto` za potpuno autonoman rad bez promptova, napravljen za CI/CD pipelineove: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` isključuje sve upite za dozvole i dopušta agentu da izvrši bilo koju radnju bez potvrde. Koristite samo u pouzdanim okruženjima. - -### Dokumentacija - -Za konfiguraciju i sve ostalo posjetite [dokumentaciju](https://kilo.ai/docs). - -### Doprinos - -Doprinosi su dobrodošli od developera, pisaca i svih ostalih. Počnite sa [Contributing Guide](/CONTRIBUTING.md) za podešavanje okruženja, standarde kodiranja i otvaranje pull requesta. Pogledajte [RELEASING.md](RELEASING.md) za proces izdavanja VS Code ekstenzije i CLI-ja, te [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) za JetBrains plugin. - -Prije uključivanja pročitajte naš [Code of Conduct](/CODE_OF_CONDUCT.md). - -### Licenca - -MIT. Možete koristiti, mijenjati i distribuirati ovaj kod, uključujući komercijalno, dok god zadržite atribuciju i obavijesti o licenci. Pogledajte [License](/LICENSE). - -### FAQ - -
-Odakle dolazi Kilo CLI? - -Kilo CLI je fork [OpenCode](https://github.com/Kilo-Org/kilocode), poboljšan za rad unutar Kilo agentic engineering platforme. - -
- ---- - -**Pridružite se zajednici** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.da.md b/README.da.md deleted file mode 100644 index d901484cf50..00000000000 --- a/README.da.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

Den open source-kodeagent til at bygge med AI i VS Code, JetBrains eller CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code er en AI-kodeagent, der møder dig overalt, hvor du arbejder: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) og [CLI](https://kilo.ai/cli). Den er open source med åben prissætning. Du vælger mellem mere end 500 modeller, skifter mellem dem midt i en opgave og betaler modeludbyderens pris uden tillæg. Ingen API-nøgler kræves for at komme i gang. - -### Installation - -Vælg, hvor du vil køre Kilo. - -
-VS Code - -
- -Installer [Kilo Code-udvidelsen](vscode:extension/kilocode.kilo-code) direkte, eller hent den fra [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Opret en konto, og du får adgang til mere end 500 modeller, herunder GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 og Gemini 3.1 Pro Preview, alle til udbyderpris. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Kør derefter `kilo` i en vilkårlig projektmappe for at starte. - -
- -
-JetBrains - -
- -Installer [Kilo Code-pluginet](https://plugins.jetbrains.com/plugin/28350-kilo-code) fra JetBrains Marketplace, eller søg efter "Kilo Code" i `Settings → Plugins` i en JetBrains IDE. - -
- -
-Cloud Agent - -
- -Kør Kilo fra webben, uden lokal maskine, på [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Kodegennemgange - -
- -Opsæt automatiske AI-kodegennemgange på dine pull requests på [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Start din altid aktive AI-agent på [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Installer CLI fra GitHub Releases (binære filer) - -Download den nyeste binære fil fra [Releases-siden](https://github.com/Kilo-Org/kilocode/releases). - -| Platform | Asset | -|---|---| -| Windows (de fleste pc'er) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Bemærk: `x64-baseline` er en kompatibilitetsbuild til ældre CPU'er uden AVX. `musl` er den statisk linkede build til Alpine eller minimale Docker-images uden glibc. `kilo-vscode-*.vsix` er VS Code-udvidelsespakken, ikke CLI'en. `Source code`-arkiver er til at bygge fra kildekode. - -
- -### Agents - -Kilo leveres med specialiserede agents, som du kan skifte mellem afhængigt af opgaven. Du kan også bygge dine egne brugerdefinerede agents. - -- **Code** - Standard. Implementerer og redigerer kode fra naturligt sprog. -- **Plan** - Designer arkitektur og skriver implementeringsplaner, før der skrives kode. -- **Ask** - Besvarer spørgsmål om din kodebase uden at ændre filer. -- **Debug** - Fejlfinder og sporer problemer. -- **Review** - Gennemgår dine ændringer og finder problemer med ydeevne, sikkerhed, stil og testdækning. - -Læs mere om [agents og brugerdefinerede agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Hvad den gør - -- **Kodegenerering** fra naturligt sprog på tværs af flere filer. -- **Inline-autocomplete** med ghost-text-forslag og Tab for at acceptere. -- **Selvkontrol**, så agenten gennemgår og retter sit eget arbejde. -- **Terminal- og browserkontrol** til at køre kommandoer og automatisere webben. -- **MCP-markedsplads** til at finde og tilslutte MCP-servere, der udvider agentens muligheder. -- **Mere end 500 modeller** med skift midt i opgaven, så du kan matche latenstid, pris og ræsonnement til arbejdet. - -### Autonom tilstand (CI/CD) - -Kør `kilo run` med `--auto` for fuldt autonom drift uden prompts, bygget til CI/CD-pipelines: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` deaktiverer alle tilladelsesprompts og lader agenten udføre enhver handling uden bekræftelse. Brug det kun i betroede miljøer. - -### Dokumentation - -For konfiguration og alt andet, se [dokumentationen](https://kilo.ai/docs). - -### Bidrag - -Bidrag er velkomne fra udviklere, forfattere og alle andre. Start med [Contributing Guide](/CONTRIBUTING.md) for miljøopsætning, kodestandarder og hvordan du åbner en pull request. Se [RELEASING.md](RELEASING.md) for releaseprocessen for VS Code-udvidelsen og CLI'en, og [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) for JetBrains-pluginet. - -Læs venligst vores [Code of Conduct](/CODE_OF_CONDUCT.md), før du deltager. - -### Licens - -MIT. Du kan bruge, ændre og distribuere denne kode, også kommercielt, så længe du beholder attribution og licensmeddelelser. Se [License](/LICENSE). - -### FAQ - -
-Hvor kommer Kilo CLI fra? - -Kilo CLI er en fork af [OpenCode](https://github.com/Kilo-Org/kilocode), forbedret til at fungere i Kilo agentic engineering-platformen. - -
- ---- - -**Deltag i fællesskabet** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.de.md b/README.de.md deleted file mode 100644 index 1baf7ea3b1e..00000000000 --- a/README.de.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

Der Open-Source-Coding-Agent zum Entwickeln mit KI in VS Code, JetBrains oder der CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code ist ein KI-Coding-Agent, der überall dort arbeitet, wo du arbeitest: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) und die [CLI](https://kilo.ai/cli). Es ist Open Source mit transparenter Preisgestaltung. Du wählst aus über 500 Modellen, wechselst sie mitten in einer Aufgabe und zahlst den Tarif des Modellanbieters ohne Aufschlag. Zum Start sind keine API-Schlüssel erforderlich. - -### Installation - -Wähle aus, wo du Kilo ausführen möchtest. - -
-VS Code - -
- -Installiere die [Kilo Code-Erweiterung](vscode:extension/kilocode.kilo-code) direkt oder lade sie aus dem [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Erstelle ein Konto und erhalte Zugriff auf über 500 Modelle, darunter GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 und Gemini 3.1 Pro Preview, alle zu Anbieterpreisen. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Führe anschließend `kilo` in einem beliebigen Projektverzeichnis aus. - -
- -
-JetBrains - -
- -Installiere das [Kilo Code-Plugin](https://plugins.jetbrains.com/plugin/28350-kilo-code) aus dem JetBrains Marketplace oder suche in einer JetBrains-IDE unter `Settings → Plugins` nach "Kilo Code". - -
- -
-Cloud Agent - -
- -Führe Kilo im Web aus, ohne lokalen Rechner, unter [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Code Reviews - -
- -Richte automatisierte KI-Code-Reviews für deine Pull Requests unter [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) ein. - -
- -
-KiloClaw - -
- -Starte deinen ständig aktiven KI-Agenten unter [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-CLI aus GitHub Releases installieren (Binärdateien) - -Lade die neueste Binärdatei von der [Releases-Seite](https://github.com/Kilo-Org/kilocode/releases) herunter. - -| Plattform | Asset | -|---|---| -| Windows (die meisten PCs) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Hinweise: `x64-baseline` ist ein Kompatibilitäts-Build für ältere CPUs ohne AVX. `musl` ist der statisch gelinkte Build für Alpine oder minimale Docker-Images ohne glibc. `kilo-vscode-*.vsix` ist das VS Code-Erweiterungspaket, nicht die CLI. `Source code`-Archive dienen dem Bauen aus dem Quellcode. - -
- -### Agents - -Kilo wird mit spezialisierten Agents ausgeliefert, zwischen denen du je nach Aufgabe wechselst. Du kannst auch eigene Agents erstellen. - -- **Code** - Standard. Implementiert und bearbeitet Code aus natürlicher Sprache. -- **Plan** - Entwirft Architektur und schreibt Implementierungspläne, bevor Code geschrieben wird. -- **Ask** - Beantwortet Fragen zu deiner Codebasis, ohne Dateien zu ändern. -- **Debug** - Untersucht und verfolgt Probleme. -- **Review** - Prüft deine Änderungen und findet Probleme bei Performance, Sicherheit, Stil und Testabdeckung. - -Mehr erfahren über [Agents und benutzerdefinierte Agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Funktionen - -- **Codegenerierung** aus natürlicher Sprache über mehrere Dateien hinweg. -- **Inline-Autocomplete** mit Ghost-Text-Vorschlägen und Tab zum Übernehmen. -- **Selbstprüfung**, damit der Agent seine eigene Arbeit prüft und korrigiert. -- **Terminal- und Browsersteuerung**, um Befehle auszuführen und das Web zu automatisieren. -- **MCP-Marktplatz**, um MCP-Server zu finden und einzubinden, die den Agent erweitern. -- **Über 500 Modelle** mit Wechsel während einer Aufgabe, damit du Latenz, Kosten und Reasoning passend zur Aufgabe wählst. - -### Autonomer Modus (CI/CD) - -Führe `kilo run` mit `--auto` für vollständig autonomen Betrieb ohne Prompts aus, geeignet für CI/CD-Pipelines: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` deaktiviert alle Berechtigungsabfragen und erlaubt dem Agent, jede Aktion ohne Bestätigung auszuführen. Verwende es nur in vertrauenswürdigen Umgebungen. - -### Dokumentation - -Für Konfiguration und alles Weitere lies die [Dokumentation](https://kilo.ai/docs). - -### Mitwirken - -Beiträge von Entwicklerinnen, Autoren und allen anderen sind willkommen. Beginne mit dem [Contributing Guide](/CONTRIBUTING.md) für Einrichtung, Coding-Standards und Pull Requests. Siehe [RELEASING.md](RELEASING.md) für den Release-Prozess der VS Code-Erweiterung und CLI sowie [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) für das JetBrains-Plugin. - -Bitte lies unseren [Code of Conduct](/CODE_OF_CONDUCT.md), bevor du mitwirkst. - -### Lizenz - -MIT. Du darfst diesen Code verwenden, ändern und verbreiten, auch kommerziell, solange du die Attribution und Lizenzhinweise beibehältst. Siehe [License](/LICENSE). - -### FAQ - -
-Woher stammt Kilo CLI? - -Kilo CLI ist ein Fork von [OpenCode](https://github.com/Kilo-Org/kilocode), erweitert für die Kilo-Agentic-Engineering-Plattform. - -
- ---- - -**Tritt der Community bei** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.es.md b/README.es.md deleted file mode 100644 index 0d267ee238c..00000000000 --- a/README.es.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

El agente de programación de código abierto para construir con IA en VS Code, JetBrains o la CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code es un agente de programación con IA que te acompaña en todos los lugares donde trabajas: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) y la [CLI](https://kilo.ai/cli). Es de código abierto y tiene precios abiertos. Puedes elegir entre más de 500 modelos, cambiar entre ellos a mitad de una tarea y pagar la tarifa del proveedor del modelo sin recargos. No necesitas claves de API para empezar. - -### Instalación - -Elige dónde quieres ejecutar Kilo. - -
-VS Code - -
- -Instala directamente la [extensión Kilo Code](vscode:extension/kilocode.kilo-code), o descárgala desde [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Crea una cuenta y tendrás acceso a más de 500 modelos, incluidos GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 y Gemini 3.1 Pro Preview, todos con precios del proveedor. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Luego ejecuta `kilo` en cualquier directorio de proyecto para empezar. - -
- -
-JetBrains - -
- -Instala el [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) desde JetBrains Marketplace, o busca "Kilo Code" en `Settings → Plugins` dentro de cualquier IDE de JetBrains. - -
- -
-Cloud Agent - -
- -Ejecuta Kilo desde la web, sin necesitar una máquina local, en [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Revisiones de código - -
- -Configura revisiones automáticas de código con IA en tus pull requests en [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Activa tu agente de IA siempre disponible en [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Instalar la CLI desde GitHub Releases (binarios) - -Descarga el binario más reciente desde la [página de Releases](https://github.com/Kilo-Org/kilocode/releases). - -| Plataforma | Recurso | -|---|---| -| Windows (la mayoría de PCs) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Notas: `x64-baseline` es una compilación de compatibilidad para CPUs antiguas sin AVX. `musl` es la compilación enlazada estáticamente para Alpine o imágenes Docker mínimas sin glibc. `kilo-vscode-*.vsix` es el paquete de extensión de VS Code, no la CLI. Los archivos `Source code` son para compilar desde el código fuente. - -
- -### Agents - -Kilo incluye agents especializados entre los que puedes cambiar según la tarea. También puedes crear tus propios agents personalizados. - -- **Code** - El predeterminado. Implementa y edita código a partir de lenguaje natural. -- **Plan** - Diseña la arquitectura y escribe planes de implementación antes de que se escriba código. -- **Ask** - Responde preguntas sobre tu base de código sin tocar archivos. -- **Debug** - Diagnostica y rastrea problemas. -- **Review** - Revisa tus cambios y detecta problemas de rendimiento, seguridad, estilo y cobertura de pruebas. - -Más información sobre [agents y agents personalizados](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Qué hace - -- **Generación de código** desde lenguaje natural, en varios archivos. -- **Autocompletado en línea** con sugerencias ghost-text y Tab para aceptar. -- **Autoverificación** para que el agente revise y corrija su propio trabajo. -- **Control de terminal y navegador** para ejecutar comandos y automatizar la web. -- **Marketplace MCP** para encontrar y conectar servidores MCP que amplían lo que el agente puede hacer. -- **Más de 500 modelos** con cambio a mitad de tarea, para ajustar latencia, costo y razonamiento al trabajo. - -### Modo autónomo (CI/CD) - -Ejecuta `kilo run` con `--auto` para operar de forma totalmente autónoma y sin prompts, pensado para pipelines CI/CD: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` desactiva todos los prompts de permisos y permite que el agente ejecute cualquier acción sin confirmación. Úsalo solo en entornos de confianza. - -### Documentación - -Para configuración y todo lo demás, consulta la [documentación](https://kilo.ai/docs). - -### Contribuir - -Las contribuciones de desarrolladores, escritores y cualquier persona son bienvenidas. Empieza con la [Guía de contribución](/CONTRIBUTING.md) para la configuración del entorno, los estándares de código y cómo abrir un pull request. Consulta [RELEASING.md](RELEASING.md) para el proceso de lanzamiento de la extensión de VS Code y la CLI, y [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) para el plugin de JetBrains. - -Lee nuestro [Código de conducta](/CODE_OF_CONDUCT.md) antes de participar. - -### Licencia - -MIT. Puedes usar, modificar y distribuir este código, incluso comercialmente, siempre que conserves los avisos de atribución y licencia. Consulta [License](/LICENSE). - -### FAQ - -
-¿De dónde viene Kilo CLI? - -Kilo CLI es un fork de [OpenCode](https://github.com/Kilo-Org/kilocode), mejorado para funcionar dentro de la plataforma de ingeniería agéntica de Kilo. - -
- ---- - -**Únete a la comunidad** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.fr.md b/README.fr.md deleted file mode 100644 index 82e8228cb16..00000000000 --- a/README.fr.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

L'agent de codage open source pour construire avec l'IA dans VS Code, JetBrains ou la CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code est un agent de codage avec IA qui vous accompagne partout où vous travaillez : [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) et la [CLI](https://kilo.ai/cli). Il est open source avec une tarification ouverte. Vous choisissez parmi plus de 500 modèles, vous pouvez en changer en cours de tâche et vous payez le tarif du fournisseur du modèle sans majoration. Aucune clé API n'est nécessaire pour commencer. - -### Installation - -Choisissez où vous voulez exécuter Kilo. - -
-VS Code - -
- -Installez directement l'[extension Kilo Code](vscode:extension/kilocode.kilo-code), ou récupérez-la sur le [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Créez un compte et vous aurez accès à plus de 500 modèles, dont GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 et Gemini 3.1 Pro Preview, tous au prix fournisseur. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Exécutez ensuite `kilo` dans n'importe quel répertoire de projet pour commencer. - -
- -
-JetBrains - -
- -Installez le [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) depuis JetBrains Marketplace, ou recherchez "Kilo Code" dans `Settings → Plugins` dans n'importe quel IDE JetBrains. - -
- -
-Cloud Agent - -
- -Exécutez Kilo depuis le web, sans machine locale, sur [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Revues de code - -
- -Configurez des revues de code IA automatisées sur vos pull requests à l'adresse [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Lancez votre agent IA toujours actif sur [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Installer la CLI depuis GitHub Releases (binaires) - -Téléchargez le dernier binaire depuis la [page des releases](https://github.com/Kilo-Org/kilocode/releases). - -| Plateforme | Fichier | -|---|---| -| Windows (la plupart des PC) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Notes : `x64-baseline` est une build de compatibilité pour les anciens processeurs sans AVX. `musl` est la build liée statiquement pour Alpine ou les images Docker minimales sans glibc. `kilo-vscode-*.vsix` est le paquet de l'extension VS Code, pas la CLI. Les archives `Source code` servent à compiler depuis les sources. - -
- -### Agents - -Kilo inclut des agents spécialisés entre lesquels vous pouvez basculer selon la tâche. Vous pouvez aussi créer vos propres agents personnalisés. - -- **Code** - Par défaut. Implémente et modifie le code à partir du langage naturel. -- **Plan** - Conçoit l'architecture et rédige des plans d'implémentation avant l'écriture du code. -- **Ask** - Répond aux questions sur votre base de code sans modifier les fichiers. -- **Debug** - Diagnostique et trace les problèmes. -- **Review** - Examine vos changements et signale les problèmes de performance, sécurité, style et couverture de tests. - -En savoir plus sur les [agents et agents personnalisés](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Fonctionnalités - -- **Génération de code** en langage naturel, sur plusieurs fichiers. -- **Autocomplétion en ligne** avec suggestions ghost-text et Tab pour accepter. -- **Auto-vérification** pour que l'agent relise et corrige son propre travail. -- **Contrôle du terminal et du navigateur** pour exécuter des commandes et automatiser le web. -- **Marketplace MCP** pour trouver et connecter des serveurs MCP qui étendent les capacités de l'agent. -- **Plus de 500 modèles** avec changement en cours de tâche, pour adapter latence, coût et raisonnement au travail. - -### Mode autonome (CI/CD) - -Exécutez `kilo run` avec `--auto` pour un fonctionnement entièrement autonome sans prompts, conçu pour les pipelines CI/CD : - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` désactive toutes les demandes d'autorisation et permet à l'agent d'exécuter n'importe quelle action sans confirmation. Utilisez-le uniquement dans des environnements de confiance. - -### Documentation - -Pour la configuration et tout le reste, consultez la [documentation](https://kilo.ai/docs). - -### Contribuer - -Les contributions des développeurs, rédacteurs et de toute personne intéressée sont les bienvenues. Commencez par le [guide de contribution](/CONTRIBUTING.md) pour la configuration de l'environnement, les standards de code et l'ouverture d'une pull request. Consultez [RELEASING.md](RELEASING.md) pour le processus de release de l'extension VS Code et de la CLI, et [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) pour le plugin JetBrains. - -Veuillez lire notre [Code de conduite](/CODE_OF_CONDUCT.md) avant de participer. - -### Licence - -MIT. Vous pouvez utiliser, modifier et distribuer ce code, y compris commercialement, tant que vous conservez les mentions d'attribution et de licence. Voir [License](/LICENSE). - -### FAQ - -
-D'où vient Kilo CLI ? - -Kilo CLI est un fork d'[OpenCode](https://github.com/Kilo-Org/kilocode), amélioré pour fonctionner au sein de la plateforme d'ingénierie agentique Kilo. - -
- ---- - -**Rejoindre la communauté** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.gr.md b/README.gr.md deleted file mode 100644 index 5de645c5b9f..00000000000 --- a/README.gr.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

Ο open source agent προγραμματισμού για δημιουργία με AI σε VS Code, JetBrains ή CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Το Kilo Code είναι ένας AI agent προγραμματισμού που σας συναντά παντού όπου εργάζεστε: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) και [CLI](https://kilo.ai/cli). Είναι open source με ανοιχτή τιμολόγηση. Επιλέγετε από περισσότερα από 500 μοντέλα, αλλάζετε μεταξύ τους στη μέση μιας εργασίας και πληρώνετε την τιμή του παρόχου του μοντέλου χωρίς προσαύξηση. Δεν απαιτούνται API keys για να ξεκινήσετε. - -### Εγκατάσταση - -Επιλέξτε πού θέλετε να εκτελέσετε το Kilo. - -
-VS Code - -
- -Εγκαταστήστε απευθείας την [επέκταση Kilo Code](vscode:extension/kilocode.kilo-code) ή κατεβάστε τη από το [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Δημιουργήστε λογαριασμό και θα έχετε πρόσβαση σε περισσότερα από 500 μοντέλα, όπως GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 και Gemini 3.1 Pro Preview, όλα στην τιμή του παρόχου. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Στη συνέχεια εκτελέστε `kilo` σε οποιονδήποτε κατάλογο έργου για να ξεκινήσετε. - -
- -
-JetBrains - -
- -Εγκαταστήστε το [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) από το JetBrains Marketplace ή αναζητήστε "Kilo Code" στο `Settings → Plugins` σε οποιοδήποτε JetBrains IDE. - -
- -
-Cloud Agent - -
- -Εκτελέστε το Kilo από τον ιστό, χωρίς τοπικό μηχάνημα, στο [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Code Reviews - -
- -Ρυθμίστε αυτοματοποιημένα AI code reviews στα pull requests σας στο [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Εκκινήστε τον πάντα ενεργό AI agent σας στο [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Εγκατάσταση CLI από GitHub Releases (binaries) - -Κατεβάστε το πιο πρόσφατο binary από τη [σελίδα Releases](https://github.com/Kilo-Org/kilocode/releases). - -| Πλατφόρμα | Asset | -|---|---| -| Windows (οι περισσότεροι υπολογιστές) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Σημειώσεις: Το `x64-baseline` είναι build συμβατότητας για παλαιότερους CPU χωρίς AVX. Το `musl` είναι το στατικά συνδεδεμένο build για Alpine ή ελάχιστες Docker images χωρίς glibc. Το `kilo-vscode-*.vsix` είναι το πακέτο επέκτασης VS Code, όχι το CLI. Τα αρχεία `Source code` είναι για build από τον πηγαίο κώδικα. - -
- -### Agents - -Το Kilo περιλαμβάνει εξειδικευμένους agents ανάμεσα στους οποίους αλλάζετε ανάλογα με την εργασία. Μπορείτε επίσης να δημιουργήσετε τους δικούς σας custom agents. - -- **Code** - Ο προεπιλεγμένος. Υλοποιεί και επεξεργάζεται κώδικα από φυσική γλώσσα. -- **Plan** - Σχεδιάζει αρχιτεκτονική και γράφει πλάνα υλοποίησης πριν γραφτεί κώδικας. -- **Ask** - Απαντά σε ερωτήσεις για το codebase σας χωρίς να πειράζει αρχεία. -- **Debug** - Αντιμετωπίζει και εντοπίζει προβλήματα. -- **Review** - Ελέγχει τις αλλαγές σας και εντοπίζει ζητήματα απόδοσης, ασφάλειας, στυλ και κάλυψης δοκιμών. - -Μάθετε περισσότερα για τους [agents και custom agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Τι κάνει - -- **Παραγωγή κώδικα** από φυσική γλώσσα, σε πολλά αρχεία. -- **Inline autocomplete** με ghost-text προτάσεις και Tab για αποδοχή. -- **Αυτοέλεγχος** ώστε ο agent να ελέγχει και να διορθώνει τη δουλειά του. -- **Έλεγχος terminal και browser** για εκτέλεση εντολών και αυτοματοποίηση του web. -- **MCP marketplace** για εύρεση και σύνδεση MCP servers που επεκτείνουν τις δυνατότητες του agent. -- **Περισσότερα από 500 μοντέλα** με αλλαγή στη μέση της εργασίας, ώστε να ταιριάζετε latency, κόστος και reasoning στη δουλειά. - -### Αυτόνομη λειτουργία (CI/CD) - -Εκτελέστε `kilo run` με `--auto` για πλήρως αυτόνομη λειτουργία χωρίς prompts, σχεδιασμένη για CI/CD pipelines: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -Το `--auto` απενεργοποιεί όλα τα prompts αδειών και επιτρέπει στον agent να εκτελεί οποιαδήποτε ενέργεια χωρίς επιβεβαίωση. Χρησιμοποιήστε το μόνο σε αξιόπιστα περιβάλλοντα. - -### Τεκμηρίωση - -Για ρυθμίσεις και όλα τα υπόλοιπα, δείτε την [τεκμηρίωση](https://kilo.ai/docs). - -### Συνεισφορά - -Οι συνεισφορές είναι ευπρόσδεκτες από developers, writers και όλους. Ξεκινήστε με τον [Contributing Guide](/CONTRIBUTING.md) για ρύθμιση περιβάλλοντος, πρότυπα κώδικα και άνοιγμα pull request. Δείτε το [RELEASING.md](RELEASING.md) για τη διαδικασία release της επέκτασης VS Code και του CLI, και το [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) για το JetBrains plugin. - -Παρακαλούμε διαβάστε τον [Code of Conduct](/CODE_OF_CONDUCT.md) πριν συμμετάσχετε. - -### Άδεια - -MIT. Μπορείτε να χρησιμοποιήσετε, να τροποποιήσετε και να διανείμετε αυτόν τον κώδικα, ακόμη και εμπορικά, αρκεί να διατηρήσετε τις αναφορές απόδοσης και άδειας. Δείτε [License](/LICENSE). - -### FAQ - -
-Από πού προήλθε το Kilo CLI; - -Το Kilo CLI είναι fork του [OpenCode](https://github.com/Kilo-Org/kilocode), βελτιωμένο για να λειτουργεί μέσα στην Kilo agentic engineering platform. - -
- ---- - -**Γίνετε μέλος της κοινότητας** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.it.md b/README.it.md deleted file mode 100644 index 43c6258f530..00000000000 --- a/README.it.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

L'agente di coding open source per creare con l'IA in VS Code, JetBrains o nella CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code è un agente di coding con IA che ti segue ovunque lavori: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) e la [CLI](https://kilo.ai/cli). È open source con prezzi trasparenti. Puoi scegliere tra oltre 500 modelli, passare da uno all'altro durante un'attività e pagare la tariffa del provider del modello senza ricarichi. Non servono chiavi API per iniziare. - -### Installazione - -Scegli dove vuoi eseguire Kilo. - -
-VS Code - -
- -Installa direttamente l'[estensione Kilo Code](vscode:extension/kilocode.kilo-code), oppure scaricala dal [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Crea un account e avrai accesso a oltre 500 modelli, inclusi GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 e Gemini 3.1 Pro Preview, tutti al prezzo del provider. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Poi esegui `kilo` in qualsiasi directory di progetto per iniziare. - -
- -
-JetBrains - -
- -Installa il [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) dal JetBrains Marketplace, oppure cerca "Kilo Code" in `Settings → Plugins` dentro qualsiasi IDE JetBrains. - -
- -
-Cloud Agent - -
- -Esegui Kilo dal web, senza una macchina locale, su [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Revisioni del codice - -
- -Configura revisioni automatiche del codice con IA sulle tue pull request su [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Avvia il tuo agente IA sempre attivo su [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Installare la CLI da GitHub Releases (binari) - -Scarica il binario più recente dalla [pagina Releases](https://github.com/Kilo-Org/kilocode/releases). - -| Piattaforma | Asset | -|---|---| -| Windows (la maggior parte dei PC) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Note: `x64-baseline` è una build di compatibilità per CPU più vecchie senza AVX. `musl` è la build collegata staticamente per Alpine o immagini Docker minimali senza glibc. `kilo-vscode-*.vsix` è il pacchetto dell'estensione VS Code, non la CLI. Gli archivi `Source code` servono per compilare dai sorgenti. - -
- -### Agents - -Kilo include agents specializzati tra cui puoi passare in base all'attività. Puoi anche creare agents personalizzati. - -- **Code** - Predefinito. Implementa e modifica codice da linguaggio naturale. -- **Plan** - Progetta l'architettura e scrive piani di implementazione prima che venga scritto codice. -- **Ask** - Risponde a domande sulla tua codebase senza modificare file. -- **Debug** - Risolve e traccia problemi. -- **Review** - Revisiona le modifiche e segnala problemi di performance, sicurezza, stile e copertura dei test. - -Scopri di più su [agents e agents personalizzati](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Cosa fa - -- **Generazione di codice** da linguaggio naturale, su più file. -- **Autocompletamento inline** con suggerimenti ghost-text e Tab per accettare. -- **Autoverifica** così l'agente rivede e corregge il proprio lavoro. -- **Controllo di terminale e browser** per eseguire comandi e automatizzare il web. -- **Marketplace MCP** per trovare e collegare server MCP che estendono ciò che l'agente può fare. -- **Oltre 500 modelli** con cambio durante l'attività, per adattare latenza, costo e ragionamento al lavoro. - -### Modalità autonoma (CI/CD) - -Esegui `kilo run` con `--auto` per un funzionamento completamente autonomo senza prompt, pensato per pipeline CI/CD: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` disabilita tutti i prompt di autorizzazione e consente all'agente di eseguire qualsiasi azione senza conferma. Usalo solo in ambienti attendibili. - -### Documentazione - -Per configurazione e tutto il resto, consulta la [documentazione](https://kilo.ai/docs). - -### Contribuire - -Sono benvenuti contributi da sviluppatori, autori e chiunque altro. Inizia dalla [Guida al contributo](/CONTRIBUTING.md) per configurazione dell'ambiente, standard di codice e apertura di una pull request. Consulta [RELEASING.md](RELEASING.md) per il processo di rilascio dell'estensione VS Code e della CLI, e [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) per il plugin JetBrains. - -Leggi il nostro [Codice di condotta](/CODE_OF_CONDUCT.md) prima di partecipare. - -### Licenza - -MIT. Puoi usare, modificare e distribuire questo codice, anche commercialmente, purché mantieni le note di attribuzione e licenza. Vedi [License](/LICENSE). - -### FAQ - -
-Da dove viene Kilo CLI? - -Kilo CLI è un fork di [OpenCode](https://github.com/Kilo-Org/kilocode), migliorato per funzionare nella piattaforma di ingegneria agentica Kilo. - -
- ---- - -**Unisciti alla community** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.ja.md b/README.ja.md deleted file mode 100644 index 9bab7e59f6d..00000000000 --- a/README.ja.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

VS Code、JetBrains、CLI で AI を使って開発するためのオープンソースのコーディングエージェント。

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code は、[VS Code](https://kilo.ai/landing/vs-code)、[JetBrains](https://kilo.ai/features/jetbrains-native)、[CLI](https://kilo.ai/cli) など、あなたが作業する場所で使える AI コーディングエージェントです。オープンソースで、透明な価格体系を採用しています。500 以上のモデルから選択し、タスクの途中で切り替え、追加料金なしでモデルプロバイダーの料金を支払います。開始に API キーは不要です。 - -### インストール - -Kilo を実行する場所を選んでください。 - -
-VS Code - -
- -[Kilo Code 拡張機能](vscode:extension/kilocode.kilo-code)を直接インストールするか、[VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) から入手してください。アカウントを作成すると、GPT-5.5、Claude Opus 4.7、Claude Sonnet 4.6、Gemini 3.1 Pro Preview を含む 500 以上のモデルを、すべてプロバイダー価格で利用できます。 - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -その後、任意のプロジェクトディレクトリで `kilo` を実行して開始します。 - -
- -
-JetBrains - -
- -JetBrains Marketplace から [Kilo Code プラグイン](https://plugins.jetbrains.com/plugin/28350-kilo-code)をインストールするか、任意の JetBrains IDE の `Settings → Plugins` で "Kilo Code" を検索してください。 - -
- -
-Cloud Agent - -
- -ローカルマシンなしで、Web から [app.kilo.ai/cloud](https://app.kilo.ai/cloud) で Kilo を実行できます。 - -
- -
-コードレビュー - -
- -[app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) で pull request に自動 AI コードレビューを設定できます。 - -
- -
-KiloClaw - -
- -[app.kilo.ai/claw](https://app.kilo.ai/claw) で常時稼働する AI エージェントを起動できます。 - -
- -
-GitHub Releases から CLI をインストールする(バイナリ) - -[Releases ページ](https://github.com/Kilo-Org/kilocode/releases)から最新のバイナリをダウンロードしてください。 - -| プラットフォーム | アセット | -|---|---| -| Windows(ほとんどの PC) | `kilo-windows-x64.zip` | -| macOS(Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS(Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -注: `x64-baseline` は AVX のない古い CPU 向けの互換ビルドです。`musl` は Alpine や glibc のない最小 Docker イメージ向けの静的リンクビルドです。`kilo-vscode-*.vsix` は VS Code 拡張機能パッケージであり、CLI ではありません。`Source code` アーカイブはソースからビルドするためのものです。 - -
- -### Agents - -Kilo には、タスクに応じて切り替えられる特化型 agents が含まれています。独自のカスタム agents も作成できます。 - -- **Code** - デフォルト。自然言語からコードを実装、編集します。 -- **Plan** - コードを書く前にアーキテクチャを設計し、実装計画を作成します。 -- **Ask** - ファイルを変更せずにコードベースに関する質問に答えます。 -- **Debug** - 問題のトラブルシューティングと追跡を行います。 -- **Review** - 変更をレビューし、パフォーマンス、セキュリティ、スタイル、テストカバレッジの問題を検出します。 - -[agents とカスタム agents](https://kilo.ai/docs/code-with-ai/agents/using-agents) について詳しく学べます。 - -### 機能 - -- 自然言語から複数ファイルにわたる **コード生成**。 -- ghost-text 提案と Tab での受け入れに対応した **インライン補完**。 -- エージェントが自分の作業をレビューして修正する **セルフチェック**。 -- コマンド実行と Web 自動化のための **ターミナルとブラウザ制御**。 -- エージェントの機能を拡張する MCP サーバーを見つけて接続する **MCP マーケットプレイス**。 -- レイテンシ、コスト、推論能力を作業に合わせるため、タスク途中の切り替えに対応した **500 以上のモデル**。 - -### 自律モード(CI/CD) - -CI/CD パイプライン向けに、プロンプトなしで完全自律動作させるには `kilo run` に `--auto` を指定します。 - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` はすべての権限プロンプトを無効にし、エージェントが確認なしで任意の操作を実行できるようにします。信頼できる環境でのみ使用してください。 - -### ドキュメント - -設定やその他の内容については、[ドキュメント](https://kilo.ai/docs)をご覧ください。 - -### コントリビューション - -開発者、ライター、その他すべての方からのコントリビューションを歓迎します。環境設定、コーディング標準、pull request の作成方法については [Contributing Guide](/CONTRIBUTING.md) から始めてください。VS Code 拡張機能と CLI のリリース手順は [RELEASING.md](RELEASING.md)、JetBrains プラグインについては [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) を参照してください。 - -参加する前に [Code of Conduct](/CODE_OF_CONDUCT.md) を確認してください。 - -### ライセンス - -MIT。帰属表示とライセンス通知を保持する限り、商用利用を含め、このコードを使用、変更、配布できます。[License](/LICENSE) を参照してください。 - -### FAQ - -
-Kilo CLI はどこから来たのですか? - -Kilo CLI は [OpenCode](https://github.com/Kilo-Org/kilocode) の fork であり、Kilo agentic engineering プラットフォーム内で動作するように強化されています。 - -
- ---- - -**コミュニティに参加** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.ko.md b/README.ko.md deleted file mode 100644 index 9f328bfb829..00000000000 --- a/README.ko.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

VS Code, JetBrains 또는 CLI에서 AI로 개발하기 위한 오픈 소스 코딩 에이전트입니다.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code는 [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native), [CLI](https://kilo.ai/cli) 등 작업하는 모든 곳에서 사용할 수 있는 AI 코딩 에이전트입니다. 오픈 소스이며 투명한 가격 정책을 제공합니다. 500개 이상의 모델 중에서 선택하고, 작업 중간에 모델을 전환하며, 추가 요금 없이 모델 제공업체의 요금만 지불합니다. 시작할 때 API 키가 필요하지 않습니다. - -### 설치 - -Kilo를 실행할 위치를 선택하세요. - -
-VS Code - -
- -[Kilo Code 확장](vscode:extension/kilocode.kilo-code)을 직접 설치하거나 [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code)에서 설치하세요. 계정을 만들면 GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6, Gemini 3.1 Pro Preview를 포함한 500개 이상의 모델을 제공업체 가격으로 사용할 수 있습니다. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -그런 다음 아무 프로젝트 디렉터리에서 `kilo`를 실행해 시작하세요. - -
- -
-JetBrains - -
- -JetBrains Marketplace에서 [Kilo Code 플러그인](https://plugins.jetbrains.com/plugin/28350-kilo-code)을 설치하거나, JetBrains IDE의 `Settings → Plugins`에서 "Kilo Code"를 검색하세요. - -
- -
-Cloud Agent - -
- -로컬 머신 없이 웹에서 [app.kilo.ai/cloud](https://app.kilo.ai/cloud)로 Kilo를 실행하세요. - -
- -
-코드 리뷰 - -
- -[app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews)에서 pull request에 자동 AI 코드 리뷰를 설정하세요. - -
- -
-KiloClaw - -
- -[app.kilo.ai/claw](https://app.kilo.ai/claw)에서 항상 켜져 있는 AI 에이전트를 시작하세요. - -
- -
-GitHub Releases에서 CLI 설치하기(바이너리) - -[Releases 페이지](https://github.com/Kilo-Org/kilocode/releases)에서 최신 바이너리를 다운로드하세요. - -| 플랫폼 | 에셋 | -|---|---| -| Windows(대부분의 PC) | `kilo-windows-x64.zip` | -| macOS(Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS(Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -참고: `x64-baseline`은 AVX가 없는 구형 CPU용 호환 빌드입니다. `musl`은 Alpine 또는 glibc가 없는 최소 Docker 이미지용 정적 링크 빌드입니다. `kilo-vscode-*.vsix`는 CLI가 아니라 VS Code 확장 패키지입니다. `Source code` 아카이브는 소스에서 빌드할 때 사용합니다. - -
- -### Agents - -Kilo에는 작업에 따라 전환할 수 있는 특화된 agents가 포함되어 있습니다. 사용자 지정 agents도 만들 수 있습니다. - -- **Code** - 기본값입니다. 자연어로 코드를 구현하고 편집합니다. -- **Plan** - 코드가 작성되기 전에 아키텍처를 설계하고 구현 계획을 작성합니다. -- **Ask** - 파일을 변경하지 않고 코드베이스에 대한 질문에 답합니다. -- **Debug** - 문제를 해결하고 추적합니다. -- **Review** - 변경 사항을 검토하고 성능, 보안, 스타일, 테스트 커버리지 문제를 찾아냅니다. - -[agents와 사용자 지정 agents](https://kilo.ai/docs/code-with-ai/agents/using-agents)에 대해 더 알아보세요. - -### 기능 - -- 여러 파일에 걸친 자연어 기반 **코드 생성**. -- ghost-text 제안과 Tab 수락을 지원하는 **인라인 자동완성**. -- 에이전트가 자신의 작업을 검토하고 수정하는 **자체 점검**. -- 명령 실행과 웹 자동화를 위한 **터미널 및 브라우저 제어**. -- 에이전트 기능을 확장하는 MCP 서버를 찾고 연결하는 **MCP 마켓플레이스**. -- 지연 시간, 비용, 추론 능력을 작업에 맞출 수 있는 작업 중 전환 지원 **500개 이상의 모델**. - -### 자율 모드(CI/CD) - -CI/CD 파이프라인용으로 프롬프트 없이 완전 자율 실행하려면 `kilo run`에 `--auto`를 사용하세요. - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto`는 모든 권한 프롬프트를 비활성화하고 에이전트가 확인 없이 모든 작업을 실행할 수 있게 합니다. 신뢰할 수 있는 환경에서만 사용하세요. - -### 문서 - -설정과 기타 모든 내용은 [문서](https://kilo.ai/docs)를 참조하세요. - -### 기여 - -개발자, 작성자 등 누구나 기여할 수 있습니다. 환경 설정, 코딩 표준, pull request 여는 방법은 [Contributing Guide](/CONTRIBUTING.md)에서 시작하세요. VS Code 확장과 CLI 릴리스 절차는 [RELEASING.md](RELEASING.md)를, JetBrains 플러그인은 [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md)를 참조하세요. - -참여하기 전에 [Code of Conduct](/CODE_OF_CONDUCT.md)를 읽어 주세요. - -### 라이선스 - -MIT. 저작자 표시와 라이선스 고지를 유지하는 한, 상업적 사용을 포함해 이 코드를 사용, 수정, 배포할 수 있습니다. [License](/LICENSE)를 참조하세요. - -### FAQ - -
-Kilo CLI는 어디에서 왔나요? - -Kilo CLI는 [OpenCode](https://github.com/Kilo-Org/kilocode)의 fork이며, Kilo agentic engineering 플랫폼에서 작동하도록 강화되었습니다. - -
- ---- - -**커뮤니티 참여** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.md b/README.md index f61baf7c88a..5fa853fb440 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,3 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

-

Kilo Code logo

@@ -168,7 +164,7 @@ MIT. You're free to use, modify, and distribute this code, including commerciall
Where did Kilo CLI come from? -Kilo CLI is a fork of [OpenCode](https://github.com/Kilo-Org/kilocode), enhanced to work within the Kilo agentic engineering platform. +Kilo CLI is a fork of [OpenCode](https://github.com/anomalyco/opencode), enhanced to work within the Kilo agentic engineering platform.
diff --git a/README.no.md b/README.no.md deleted file mode 100644 index ca6b7847e06..00000000000 --- a/README.no.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

Den åpne kildekodeagenten for å bygge med AI i VS Code, JetBrains eller CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code er en AI-kodeagent som møter deg overalt du jobber: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) og [CLI](https://kilo.ai/cli). Den er åpen kildekode med åpen prising. Du velger blant mer enn 500 modeller, bytter mellom dem midt i en oppgave og betaler modellleverandørens pris uten påslag. Ingen API-nøkler kreves for å starte. - -### Installasjon - -Velg hvor du vil kjøre Kilo. - -
-VS Code - -
- -Installer [Kilo Code-utvidelsen](vscode:extension/kilocode.kilo-code) direkte, eller hent den fra [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Opprett en konto, og du får tilgang til mer enn 500 modeller, inkludert GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 og Gemini 3.1 Pro Preview, alle til leverandørpris. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Kjør deretter `kilo` i en prosjektmappe for å starte. - -
- -
-JetBrains - -
- -Installer [Kilo Code-pluginen](https://plugins.jetbrains.com/plugin/28350-kilo-code) fra JetBrains Marketplace, eller søk etter "Kilo Code" i `Settings → Plugins` i en JetBrains IDE. - -
- -
-Cloud Agent - -
- -Kjør Kilo fra nettet, uten lokal maskin, på [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Kodegjennomganger - -
- -Sett opp automatiske AI-kodegjennomganger på pull requestene dine på [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Start din alltid aktive AI-agent på [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Installer CLI fra GitHub Releases (binærfiler) - -Last ned den nyeste binærfilen fra [Releases-siden](https://github.com/Kilo-Org/kilocode/releases). - -| Plattform | Asset | -|---|---| -| Windows (de fleste PC-er) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Merknader: `x64-baseline` er en kompatibilitetsbygg for eldre CPU-er uten AVX. `musl` er den statisk lenkede byggen for Alpine eller minimale Docker-bilder uten glibc. `kilo-vscode-*.vsix` er VS Code-utvidelsespakken, ikke CLI-en. `Source code`-arkiver er for bygging fra kildekode. - -
- -### Agents - -Kilo leveres med spesialiserte agents du kan bytte mellom avhengig av oppgaven. Du kan også bygge dine egne egendefinerte agents. - -- **Code** - Standard. Implementerer og redigerer kode fra naturlig språk. -- **Plan** - Designer arkitektur og skriver implementeringsplaner før kode skrives. -- **Ask** - Svarer på spørsmål om kodebasen uten å endre filer. -- **Debug** - Feilsøker og sporer problemer. -- **Review** - Gjennomgår endringene dine og finner problemer med ytelse, sikkerhet, stil og testdekning. - -Les mer om [agents og egendefinerte agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Hva den gjør - -- **Kodegenerering** fra naturlig språk, på tvers av flere filer. -- **Inline-autofullføring** med ghost-text-forslag og Tab for å godta. -- **Selvsjekking** slik at agenten vurderer og retter sitt eget arbeid. -- **Terminal- og nettleserkontroll** for å kjøre kommandoer og automatisere nettet. -- **MCP-markedsplass** for å finne og koble til MCP-servere som utvider hva agenten kan gjøre. -- **Mer enn 500 modeller** med bytte midt i oppgaven, slik at du kan matche latenstid, kostnad og resonnering til jobben. - -### Autonom modus (CI/CD) - -Kjør `kilo run` med `--auto` for helt autonom drift uten spørsmål, bygget for CI/CD-pipelines: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` deaktiverer alle tillatelsesspørsmål og lar agenten utføre enhver handling uten bekreftelse. Bruk det bare i betrodde miljøer. - -### Dokumentasjon - -For konfigurasjon og alt annet, se [dokumentasjonen](https://kilo.ai/docs). - -### Bidra - -Bidrag er velkomne fra utviklere, skribenter og alle andre. Start med [Contributing Guide](/CONTRIBUTING.md) for miljøoppsett, kodestandarder og hvordan du åpner en pull request. Se [RELEASING.md](RELEASING.md) for releaseprosessen for VS Code-utvidelsen og CLI-en, og [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) for JetBrains-pluginen. - -Les vår [Code of Conduct](/CODE_OF_CONDUCT.md) før du deltar. - -### Lisens - -MIT. Du kan bruke, endre og distribuere denne koden, også kommersielt, så lenge du beholder attribusjons- og lisensmerknadene. Se [License](/LICENSE). - -### FAQ - -
-Hvor kommer Kilo CLI fra? - -Kilo CLI er en fork av [OpenCode](https://github.com/Kilo-Org/kilocode), forbedret for å fungere i Kilo agentic engineering-plattformen. - -
- ---- - -**Bli med i fellesskapet** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.pl.md b/README.pl.md deleted file mode 100644 index 4dff62012f4..00000000000 --- a/README.pl.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

Open source'owy agent kodujący do pracy z AI w VS Code, JetBrains lub CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code to agent kodujący z AI, który działa wszędzie tam, gdzie pracujesz: w [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) i [CLI](https://kilo.ai/cli). Jest open source i ma otwarte ceny. Wybierasz spośród ponad 500 modeli, przełączasz się między nimi w trakcie zadania i płacisz stawkę dostawcy modelu bez narzutów. Do rozpoczęcia nie są wymagane klucze API. - -### Instalacja - -Wybierz, gdzie chcesz uruchomić Kilo. - -
-VS Code - -
- -Zainstaluj bezpośrednio [rozszerzenie Kilo Code](vscode:extension/kilocode.kilo-code) albo pobierz je z [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Utwórz konto, a otrzymasz dostęp do ponad 500 modeli, w tym GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 i Gemini 3.1 Pro Preview, wszystkie w cenach dostawców. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Następnie uruchom `kilo` w dowolnym katalogu projektu. - -
- -
-JetBrains - -
- -Zainstaluj [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) z JetBrains Marketplace albo wyszukaj "Kilo Code" w `Settings → Plugins` w dowolnym IDE JetBrains. - -
- -
-Cloud Agent - -
- -Uruchom Kilo z poziomu przeglądarki, bez lokalnej maszyny, na [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Przeglądy kodu - -
- -Skonfiguruj automatyczne przeglądy kodu AI dla swoich pull requestów na [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Uruchom swojego zawsze aktywnego agenta AI na [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Zainstaluj CLI z GitHub Releases (pliki binarne) - -Pobierz najnowszy plik binarny ze [strony Releases](https://github.com/Kilo-Org/kilocode/releases). - -| Platforma | Zasób | -|---|---| -| Windows (większość PC) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Uwagi: `x64-baseline` to build zgodności dla starszych CPU bez AVX. `musl` to statycznie linkowany build dla Alpine lub minimalnych obrazów Docker bez glibc. `kilo-vscode-*.vsix` to pakiet rozszerzenia VS Code, nie CLI. Archiwa `Source code` służą do budowania ze źródeł. - -
- -### Agents - -Kilo zawiera wyspecjalizowane agents, między którymi możesz przełączać się zależnie od zadania. Możesz też tworzyć własne niestandardowe agents. - -- **Code** - Domyślny. Implementuje i edytuje kod z języka naturalnego. -- **Plan** - Projektuje architekturę i pisze plany implementacji przed napisaniem kodu. -- **Ask** - Odpowiada na pytania o bazę kodu bez modyfikowania plików. -- **Debug** - Diagnozuje i śledzi problemy. -- **Review** - Przegląda zmiany i wykrywa problemy z wydajnością, bezpieczeństwem, stylem i pokryciem testami. - -Dowiedz się więcej o [agents i niestandardowych agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Co robi - -- **Generowanie kodu** z języka naturalnego, w wielu plikach. -- **Autouzupełnianie inline** z sugestiami ghost-text i akceptacją przez Tab. -- **Samokontrola**, dzięki której agent sprawdza i poprawia własną pracę. -- **Sterowanie terminalem i przeglądarką** do uruchamiania poleceń i automatyzacji webu. -- **Marketplace MCP** do znajdowania i podłączania serwerów MCP rozszerzających możliwości agenta. -- **Ponad 500 modeli** z przełączaniem w trakcie zadania, aby dopasować opóźnienie, koszt i rozumowanie do pracy. - -### Tryb autonomiczny (CI/CD) - -Uruchom `kilo run` z `--auto`, aby działać w pełni autonomicznie bez promptów, z myślą o pipeline'ach CI/CD: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` wyłącza wszystkie pytania o uprawnienia i pozwala agentowi wykonywać dowolne działania bez potwierdzenia. Używaj tylko w zaufanych środowiskach. - -### Dokumentacja - -Konfigurację i wszystko inne znajdziesz w [dokumentacji](https://kilo.ai/docs). - -### Wkład - -Zapraszamy do wkładu programistów, autorów i wszystkich innych. Zacznij od [Contributing Guide](/CONTRIBUTING.md), aby skonfigurować środowisko, poznać standardy kodowania i sposób otwierania pull requestów. Zobacz [RELEASING.md](RELEASING.md) dla procesu wydawania rozszerzenia VS Code i CLI oraz [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) dla pluginu JetBrains. - -Przed zaangażowaniem przeczytaj nasz [Code of Conduct](/CODE_OF_CONDUCT.md). - -### Licencja - -MIT. Możesz używać, modyfikować i dystrybuować ten kod, również komercyjnie, o ile zachowasz informacje o autorstwie i licencji. Zobacz [License](/LICENSE). - -### FAQ - -
-Skąd pochodzi Kilo CLI? - -Kilo CLI jest forkiem [OpenCode](https://github.com/Kilo-Org/kilocode), rozszerzonym do działania w platformie agentic engineering Kilo. - -
- ---- - -**Dołącz do społeczności** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.ru.md b/README.ru.md deleted file mode 100644 index 4a7315e10f4..00000000000 --- a/README.ru.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

Open source-агент для разработки с ИИ в VS Code, JetBrains или CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code — это AI-агент для написания кода, который работает там, где работаете вы: в [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) и [CLI](https://kilo.ai/cli). Он имеет открытый исходный код и открытую модель ценообразования. Вы выбираете из более чем 500 моделей, переключаетесь между ними во время задачи и платите по тарифу поставщика модели без наценки. Для начала не нужны API-ключи. - -### Установка - -Выберите, где вы хотите запускать Kilo. - -
-VS Code - -
- -Установите [расширение Kilo Code](vscode:extension/kilocode.kilo-code) напрямую или скачайте его из [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Создайте аккаунт и получите доступ к более чем 500 моделям, включая GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 и Gemini 3.1 Pro Preview, все по ценам поставщиков. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Затем запустите `kilo` в любом каталоге проекта. - -
- -
-JetBrains - -
- -Установите [плагин Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) из JetBrains Marketplace или найдите "Kilo Code" в `Settings → Plugins` в любой IDE JetBrains. - -
- -
-Cloud Agent - -
- -Запускайте Kilo из веба без локальной машины на [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Code Reviews - -
- -Настройте автоматические AI-ревью кода для ваших pull request на [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Запустите своего постоянно активного AI-агента на [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Установить CLI из GitHub Releases (бинарные файлы) - -Скачайте последний бинарный файл со [страницы Releases](https://github.com/Kilo-Org/kilocode/releases). - -| Платформа | Файл | -|---|---| -| Windows (большинство ПК) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Примечания: `x64-baseline` — совместимая сборка для старых CPU без AVX. `musl` — статически связанная сборка для Alpine или минимальных Docker-образов без glibc. `kilo-vscode-*.vsix` — пакет расширения VS Code, а не CLI. Архивы `Source code` предназначены для сборки из исходного кода. - -
- -### Agents - -Kilo поставляется со специализированными agents, между которыми можно переключаться в зависимости от задачи. Вы также можете создавать собственные agents. - -- **Code** - По умолчанию. Реализует и редактирует код по описанию на естественном языке. -- **Plan** - Проектирует архитектуру и пишет планы реализации до написания кода. -- **Ask** - Отвечает на вопросы о кодовой базе, не изменяя файлы. -- **Debug** - Диагностирует и отслеживает проблемы. -- **Review** - Проверяет ваши изменения и выявляет проблемы производительности, безопасности, стиля и покрытия тестами. - -Подробнее об [agents и пользовательских agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Возможности - -- **Генерация кода** из естественного языка в нескольких файлах. -- **Встроенное автодополнение** с ghost-text-подсказками и принятием по Tab. -- **Самопроверка**, чтобы агент проверял и исправлял собственную работу. -- **Управление терминалом и браузером** для запуска команд и автоматизации веба. -- **MCP marketplace** для поиска и подключения MCP-серверов, расширяющих возможности агента. -- **Более 500 моделей** с переключением во время задачи, чтобы подобрать задержку, стоимость и reasoning под работу. - -### Автономный режим (CI/CD) - -Запустите `kilo run` с `--auto` для полностью автономной работы без prompts, предназначенной для CI/CD-пайплайнов: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` отключает все запросы разрешений и позволяет агенту выполнять любые действия без подтверждения. Используйте только в доверенных средах. - -### Документация - -Для настройки и всего остального перейдите к [документации](https://kilo.ai/docs). - -### Участие - -Мы приветствуем вклад разработчиков, авторов и всех желающих. Начните с [Contributing Guide](/CONTRIBUTING.md), чтобы настроить окружение, изучить стандарты кода и узнать, как открыть pull request. См. [RELEASING.md](RELEASING.md) для процесса релиза расширения VS Code и CLI, а также [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) для плагина JetBrains. - -Перед участием ознакомьтесь с нашим [Code of Conduct](/CODE_OF_CONDUCT.md). - -### Лицензия - -MIT. Вы можете использовать, изменять и распространять этот код, в том числе коммерчески, если сохраняете указания авторства и лицензионные уведомления. См. [License](/LICENSE). - -### FAQ - -
-Откуда появился Kilo CLI? - -Kilo CLI — это fork [OpenCode](https://github.com/Kilo-Org/kilocode), расширенный для работы в платформе agentic engineering Kilo. - -
- ---- - -**Присоединяйтесь к сообществу** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.th.md b/README.th.md deleted file mode 100644 index 3fba0f18fa0..00000000000 --- a/README.th.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

เอเจนต์เขียนโค้ดโอเพนซอร์สสำหรับสร้างด้วย AI ใน VS Code, JetBrains หรือ CLI

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code คือเอเจนต์เขียนโค้ดด้วย AI ที่ทำงานได้ทุกที่ที่คุณทำงาน: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) และ [CLI](https://kilo.ai/cli) เป็นโอเพนซอร์สและมีราคาที่โปร่งใส คุณเลือกได้จากโมเดลมากกว่า 500 รายการ สลับโมเดลระหว่างทำงาน และจ่ายตามราคาของผู้ให้บริการโมเดลโดยไม่มีส่วนเพิ่ม ไม่ต้องใช้ API key เพื่อเริ่มต้น - -### การติดตั้ง - -เลือกตำแหน่งที่คุณต้องการใช้งาน Kilo - -
-VS Code - -
- -ติดตั้ง [ส่วนขยาย Kilo Code](vscode:extension/kilocode.kilo-code) โดยตรง หรือดาวน์โหลดจาก [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) สร้างบัญชีแล้วคุณจะเข้าถึงโมเดลมากกว่า 500 รายการ รวมถึง GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 และ Gemini 3.1 Pro Preview ทั้งหมดในราคาผู้ให้บริการ - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -จากนั้นรัน `kilo` ในไดเรกทอรีโปรเจกต์ใดก็ได้เพื่อเริ่มต้น - -
- -
-JetBrains - -
- -ติดตั้ง [ปลั๊กอิน Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) จาก JetBrains Marketplace หรือค้นหา "Kilo Code" ใน `Settings → Plugins` ภายใน JetBrains IDE ใดก็ได้ - -
- -
-Cloud Agent - -
- -รัน Kilo จากเว็บโดยไม่ต้องใช้เครื่องภายในที่ [app.kilo.ai/cloud](https://app.kilo.ai/cloud) - -
- -
-Code Reviews - -
- -ตั้งค่าการรีวิวโค้ดด้วย AI อัตโนมัติบน pull request ของคุณที่ [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) - -
- -
-KiloClaw - -
- -เริ่มเอเจนต์ AI ที่ทำงานตลอดเวลาของคุณที่ [app.kilo.ai/claw](https://app.kilo.ai/claw) - -
- -
-ติดตั้ง CLI จาก GitHub Releases (ไบนารี) - -ดาวน์โหลดไบนารีล่าสุดจาก [หน้า Releases](https://github.com/Kilo-Org/kilocode/releases) - -| แพลตฟอร์ม | Asset | -|---|---| -| Windows (พีซีส่วนใหญ่) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -หมายเหตุ: `x64-baseline` คือ build ที่เข้ากันได้สำหรับ CPU รุ่นเก่าที่ไม่มี AVX ส่วน `musl` คือ build แบบ static link สำหรับ Alpine หรือ Docker image ขั้นต่ำที่ไม่มี glibc `kilo-vscode-*.vsix` คือแพ็กเกจส่วนขยาย VS Code ไม่ใช่ CLI ไฟล์ `Source code` ใช้สำหรับ build จากซอร์ส - -
- -### Agents - -Kilo มาพร้อม agents เฉพาะทางที่คุณสลับได้ตามงาน คุณยังสร้าง agents แบบกำหนดเองได้ด้วย - -- **Code** - ค่าเริ่มต้น ใช้ภาษาธรรมชาติในการเขียนและแก้ไขโค้ด -- **Plan** - ออกแบบสถาปัตยกรรมและเขียนแผนการทำงานก่อนมีการเขียนโค้ด -- **Ask** - ตอบคำถามเกี่ยวกับ codebase โดยไม่แตะไฟล์ -- **Debug** - แก้ไขและติดตามปัญหา -- **Review** - รีวิวการเปลี่ยนแปลงและค้นหาปัญหาด้านประสิทธิภาพ ความปลอดภัย สไตล์ และ test coverage - -เรียนรู้เพิ่มเติมเกี่ยวกับ [agents และ agents แบบกำหนดเอง](https://kilo.ai/docs/code-with-ai/agents/using-agents) - -### ทำอะไรได้บ้าง - -- **สร้างโค้ด** จากภาษาธรรมชาติข้ามหลายไฟล์ -- **เติมโค้ดอัตโนมัติแบบ inline** พร้อมคำแนะนำ ghost-text และกด Tab เพื่อรับ -- **ตรวจสอบตัวเอง** เพื่อให้เอเจนต์รีวิวและแก้งานของตนเอง -- **ควบคุม terminal และ browser** เพื่อรันคำสั่งและทำงานบนเว็บอัตโนมัติ -- **MCP marketplace** เพื่อค้นหาและเชื่อมต่อ MCP server ที่ขยายความสามารถของเอเจนต์ -- **โมเดลมากกว่า 500 รายการ** พร้อมการสลับระหว่างงาน เพื่อให้เหมาะกับ latency, cost และ reasoning ของงาน - -### โหมดอัตโนมัติ (CI/CD) - -รัน `kilo run` พร้อม `--auto` เพื่อทำงานอัตโนมัติเต็มรูปแบบโดยไม่มี prompts เหมาะสำหรับ CI/CD pipelines: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` ปิด prompt สิทธิ์ทั้งหมดและให้เอเจนต์ดำเนินการใดก็ได้โดยไม่ต้องยืนยัน ใช้เฉพาะในสภาพแวดล้อมที่เชื่อถือได้เท่านั้น - -### เอกสาร - -สำหรับการตั้งค่าและเรื่องอื่น ๆ ดูที่ [เอกสาร](https://kilo.ai/docs) - -### การมีส่วนร่วม - -ยินดีรับการมีส่วนร่วมจากนักพัฒนา นักเขียน และทุกคน เริ่มจาก [Contributing Guide](/CONTRIBUTING.md) สำหรับการตั้งค่าสภาพแวดล้อม มาตรฐานโค้ด และวิธีเปิด pull request ดู [RELEASING.md](RELEASING.md) สำหรับกระบวนการ release ของส่วนขยาย VS Code และ CLI และ [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) สำหรับปลั๊กอิน JetBrains - -โปรดอ่าน [Code of Conduct](/CODE_OF_CONDUCT.md) ก่อนเข้าร่วม - -### License - -MIT คุณสามารถใช้ แก้ไข และแจกจ่ายโค้ดนี้ รวมถึงเชิงพาณิชย์ ตราบใดที่ยังเก็บ attribution และประกาศ license ไว้ ดู [License](/LICENSE) - -### FAQ - -
-Kilo CLI มาจากไหน? - -Kilo CLI เป็น fork ของ [OpenCode](https://github.com/Kilo-Org/kilocode) ที่ได้รับการปรับปรุงให้ทำงานในแพลตฟอร์ม Kilo agentic engineering - -
- ---- - -**เข้าร่วมชุมชน** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.tr.md b/README.tr.md deleted file mode 100644 index 444f3595a7d..00000000000 --- a/README.tr.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

VS Code, JetBrains veya CLI'de AI ile geliştirme yapmak için açık kaynak kodlama ajanı.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code, çalıştığınız her yerde size eşlik eden bir AI kodlama ajanıdır: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) ve [CLI](https://kilo.ai/cli). Açık kaynaktır ve açık fiyatlandırma sunar. 500'den fazla model arasından seçim yapabilir, görev sırasında model değiştirebilir ve hiçbir ek ücret olmadan model sağlayıcısının fiyatını ödersiniz. Başlamak için API anahtarı gerekmez. - -### Kurulum - -Kilo'yu nerede çalıştırmak istediğinizi seçin. - -
-VS Code - -
- -[Kilo Code uzantısını](vscode:extension/kilocode.kilo-code) doğrudan kurun veya [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) üzerinden edinin. Bir hesap oluşturduğunuzda GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 ve Gemini 3.1 Pro Preview dahil 500'den fazla modele sağlayıcı fiyatıyla erişebilirsiniz. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Ardından başlamak için herhangi bir proje dizininde `kilo` çalıştırın. - -
- -
-JetBrains - -
- -[Kilo Code eklentisini](https://plugins.jetbrains.com/plugin/28350-kilo-code) JetBrains Marketplace'ten kurun veya herhangi bir JetBrains IDE içinde `Settings → Plugins` bölümünde "Kilo Code" arayın. - -
- -
-Cloud Agent - -
- -Kilo'yu yerel makine gerekmeden web üzerinden [app.kilo.ai/cloud](https://app.kilo.ai/cloud) adresinde çalıştırın. - -
- -
-Kod İncelemeleri - -
- -Pull request'leriniz için otomatik AI kod incelemelerini [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) adresinde ayarlayın. - -
- -
-KiloClaw - -
- -Her zaman açık AI ajanınızı [app.kilo.ai/claw](https://app.kilo.ai/claw) adresinde başlatın. - -
- -
-CLI'yi GitHub Releases üzerinden kurun (ikili dosyalar) - -En son ikili dosyayı [Releases sayfasından](https://github.com/Kilo-Org/kilocode/releases) indirin. - -| Platform | Asset | -|---|---| -| Windows (çoğu PC) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Notlar: `x64-baseline`, AVX olmayan eski CPU'lar için uyumluluk derlemesidir. `musl`, Alpine veya glibc olmayan minimal Docker imajları için statik bağlı derlemedir. `kilo-vscode-*.vsix` CLI değil VS Code uzantı paketidir. `Source code` arşivleri kaynaktan derlemek içindir. - -
- -### Agents - -Kilo, göreve göre aralarında geçiş yapabileceğiniz özelleşmiş agents ile gelir. Kendi özel agents'larınızı da oluşturabilirsiniz. - -- **Code** - Varsayılan. Doğal dilden kod uygular ve düzenler. -- **Plan** - Kod yazılmadan önce mimari tasarlar ve uygulama planları yazar. -- **Ask** - Dosyalara dokunmadan kod tabanınız hakkında soruları yanıtlar. -- **Debug** - Sorunları giderir ve izler. -- **Review** - Değişikliklerinizi inceler ve performans, güvenlik, stil ve test kapsamı sorunlarını ortaya çıkarır. - -[Agents ve özel agents](https://kilo.ai/docs/code-with-ai/agents/using-agents) hakkında daha fazla bilgi edinin. - -### Ne yapar - -- Birden çok dosyada doğal dilden **kod üretimi**. -- Ghost-text önerileri ve kabul etmek için Tab ile **satır içi otomatik tamamlama**. -- Ajanın kendi çalışmasını inceleyip düzeltmesi için **öz denetim**. -- Komut çalıştırmak ve web'i otomatikleştirmek için **terminal ve tarayıcı kontrolü**. -- Ajanın yapabileceklerini genişleten MCP sunucularını bulmak ve bağlamak için **MCP marketplace**. -- Gecikme, maliyet ve akıl yürütmeyi işe uygun seçmek için görev sırasında geçiş destekli **500'den fazla model**. - -### Otonom Mod (CI/CD) - -CI/CD pipeline'ları için prompts olmadan tamamen otonom çalıştırmak üzere `kilo run` komutunu `--auto` ile çalıştırın: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` tüm izin istemlerini devre dışı bırakır ve ajanın herhangi bir işlemi onay olmadan yürütmesine izin verir. Yalnızca güvenilir ortamlarda kullanın. - -### Dokümantasyon - -Yapılandırma ve diğer her şey için [dokümantasyona](https://kilo.ai/docs) bakın. - -### Katkıda bulunma - -Geliştiricilerden, yazarlardan ve herkesten katkı bekliyoruz. Ortam kurulumu, kodlama standartları ve pull request açma hakkında bilgi için [Contributing Guide](/CONTRIBUTING.md) ile başlayın. VS Code uzantısı ve CLI yayın süreci için [RELEASING.md](RELEASING.md), JetBrains eklentisi için [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) dosyasına bakın. - -Katılmadan önce lütfen [Code of Conduct](/CODE_OF_CONDUCT.md) belgemizi okuyun. - -### Lisans - -MIT. Atıf ve lisans bildirimlerini koruduğunuz sürece bu kodu ticari olarak da kullanabilir, değiştirebilir ve dağıtabilirsiniz. Bkz. [License](/LICENSE). - -### FAQ - -
-Kilo CLI nereden geldi? - -Kilo CLI, Kilo agentic engineering platformunda çalışacak şekilde geliştirilmiş bir [OpenCode](https://github.com/Kilo-Org/kilocode) fork'udur. - -
- ---- - -**Topluluğa katılın** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.uk.md b/README.uk.md deleted file mode 100644 index 6cf215bff72..00000000000 --- a/README.uk.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

Open source-агент для програмування з AI у VS Code, JetBrains або CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code — це AI-агент для програмування, який працює там, де працюєте ви: у [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) і [CLI](https://kilo.ai/cli). Він має відкритий код і відкриту модель ціноутворення. Ви обираєте з понад 500 моделей, перемикаєтеся між ними під час завдання і платите тариф постачальника моделі без націнки. Для старту API-ключі не потрібні. - -### Встановлення - -Оберіть, де ви хочете запускати Kilo. - -
-VS Code - -
- -Встановіть [розширення Kilo Code](vscode:extension/kilocode.kilo-code) напряму або завантажте його з [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Створіть обліковий запис і отримайте доступ до понад 500 моделей, зокрема GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 і Gemini 3.1 Pro Preview, усі за цінами постачальників. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Потім запустіть `kilo` у будь-якому каталозі проєкту. - -
- -
-JetBrains - -
- -Встановіть [плагін Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) з JetBrains Marketplace або знайдіть "Kilo Code" у `Settings → Plugins` у будь-якій JetBrains IDE. - -
- -
-Cloud Agent - -
- -Запускайте Kilo з вебу, без локальної машини, на [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Code Reviews - -
- -Налаштуйте автоматичні AI-рев'ю коду для ваших pull request на [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Запустіть свого постійно активного AI-агента на [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Встановити CLI з GitHub Releases (бінарні файли) - -Завантажте найновіший бінарний файл зі [сторінки Releases](https://github.com/Kilo-Org/kilocode/releases). - -| Платформа | Файл | -|---|---| -| Windows (більшість ПК) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Примітки: `x64-baseline` — сумісна збірка для старих CPU без AVX. `musl` — статично зв'язана збірка для Alpine або мінімальних Docker-образів без glibc. `kilo-vscode-*.vsix` — пакет розширення VS Code, а не CLI. Архіви `Source code` призначені для збірки з вихідного коду. - -
- -### Agents - -Kilo постачається зі спеціалізованими agents, між якими можна перемикатися залежно від завдання. Ви також можете створювати власні agents. - -- **Code** - Типовий. Реалізує та редагує код з природної мови. -- **Plan** - Проєктує архітектуру і пише плани реалізації до написання коду. -- **Ask** - Відповідає на запитання про кодову базу, не змінюючи файли. -- **Debug** - Діагностує та відстежує проблеми. -- **Review** - Переглядає ваші зміни та виявляє проблеми продуктивності, безпеки, стилю і покриття тестами. - -Дізнайтеся більше про [agents і власні agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Що він робить - -- **Генерація коду** з природної мови в кількох файлах. -- **Вбудоване автодоповнення** з ghost-text-підказками та прийняттям через Tab. -- **Самоперевірка**, щоб агент перевіряв і виправляв власну роботу. -- **Керування терміналом і браузером** для запуску команд і автоматизації вебу. -- **MCP marketplace** для пошуку й підключення MCP-серверів, які розширюють можливості агента. -- **Понад 500 моделей** з перемиканням під час завдання, щоб узгодити затримку, вартість і reasoning з роботою. - -### Автономний режим (CI/CD) - -Запустіть `kilo run` з `--auto` для повністю автономної роботи без prompts, створеної для CI/CD-пайплайнів: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` вимикає всі запити дозволів і дає агенту змогу виконувати будь-яку дію без підтвердження. Використовуйте лише в довірених середовищах. - -### Документація - -Для налаштування та всього іншого перегляньте [документацію](https://kilo.ai/docs). - -### Участь - -Ми вітаємо внески від розробників, авторів і всіх охочих. Почніть з [Contributing Guide](/CONTRIBUTING.md), щоб налаштувати середовище, ознайомитися зі стандартами коду та дізнатися, як відкрити pull request. Див. [RELEASING.md](RELEASING.md) для процесу релізу розширення VS Code і CLI, а також [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) для плагіна JetBrains. - -Перед участю прочитайте наш [Code of Conduct](/CODE_OF_CONDUCT.md). - -### Ліцензія - -MIT. Ви можете використовувати, змінювати й поширювати цей код, зокрема комерційно, якщо зберігаєте зазначення авторства та ліцензійні повідомлення. Див. [License](/LICENSE). - -### FAQ - -
-Звідки взявся Kilo CLI? - -Kilo CLI — це fork [OpenCode](https://github.com/Kilo-Org/kilocode), розширений для роботи в платформі agentic engineering Kilo. - -
- ---- - -**Долучайтеся до спільноти** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.vi.md b/README.vi.md deleted file mode 100644 index 19f52d5163c..00000000000 --- a/README.vi.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

Tác nhân lập trình mã nguồn mở để xây dựng với AI trong VS Code, JetBrains hoặc CLI.

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code là một tác nhân lập trình AI đồng hành với bạn ở mọi nơi bạn làm việc: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) và [CLI](https://kilo.ai/cli). Dự án là mã nguồn mở với giá minh bạch. Bạn chọn trong hơn 500 mô hình, chuyển đổi giữa chúng giữa chừng một tác vụ và trả theo giá của nhà cung cấp mô hình, không có phụ phí. Không cần API key để bắt đầu. - -### Cài đặt - -Chọn nơi bạn muốn chạy Kilo. - -
-VS Code - -
- -Cài trực tiếp [tiện ích Kilo Code](vscode:extension/kilocode.kilo-code), hoặc tải từ [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Tạo tài khoản và bạn sẽ có quyền truy cập hơn 500 mô hình, bao gồm GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 và Gemini 3.1 Pro Preview, tất cả theo giá của nhà cung cấp. - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -Sau đó chạy `kilo` trong bất kỳ thư mục dự án nào để bắt đầu. - -
- -
-JetBrains - -
- -Cài [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) từ JetBrains Marketplace, hoặc tìm "Kilo Code" trong `Settings → Plugins` bên trong bất kỳ JetBrains IDE nào. - -
- -
-Cloud Agent - -
- -Chạy Kilo từ web, không cần máy cục bộ, tại [app.kilo.ai/cloud](https://app.kilo.ai/cloud). - -
- -
-Code Reviews - -
- -Thiết lập review code tự động bằng AI cho pull request của bạn tại [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). - -
- -
-KiloClaw - -
- -Khởi chạy AI agent luôn hoạt động của bạn tại [app.kilo.ai/claw](https://app.kilo.ai/claw). - -
- -
-Cài CLI từ GitHub Releases (binary) - -Tải binary mới nhất từ [trang Releases](https://github.com/Kilo-Org/kilocode/releases). - -| Nền tảng | Asset | -|---|---| -| Windows (hầu hết PC) | `kilo-windows-x64.zip` | -| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS (Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -Ghi chú: `x64-baseline` là build tương thích cho CPU cũ không có AVX. `musl` là build liên kết tĩnh cho Alpine hoặc image Docker tối giản không có glibc. `kilo-vscode-*.vsix` là gói tiện ích VS Code, không phải CLI. Các archive `Source code` dùng để build từ mã nguồn. - -
- -### Agents - -Kilo đi kèm các agents chuyên biệt để bạn chuyển đổi tùy theo tác vụ. Bạn cũng có thể tạo agents tùy chỉnh của riêng mình. - -- **Code** - Mặc định. Triển khai và chỉnh sửa code từ ngôn ngữ tự nhiên. -- **Plan** - Thiết kế kiến trúc và viết kế hoạch triển khai trước khi viết code. -- **Ask** - Trả lời câu hỏi về codebase mà không chạm vào file. -- **Debug** - Khắc phục và truy vết sự cố. -- **Review** - Review thay đổi của bạn và phát hiện vấn đề về hiệu năng, bảo mật, phong cách và độ phủ test. - -Tìm hiểu thêm về [agents và agents tùy chỉnh](https://kilo.ai/docs/code-with-ai/agents/using-agents). - -### Nó làm gì - -- **Sinh code** từ ngôn ngữ tự nhiên, trên nhiều file. -- **Tự động hoàn thành inline** với gợi ý ghost-text và Tab để chấp nhận. -- **Tự kiểm tra** để agent review và sửa công việc của chính nó. -- **Điều khiển terminal và trình duyệt** để chạy lệnh và tự động hóa web. -- **MCP marketplace** để tìm và kết nối MCP server mở rộng khả năng của agent. -- **Hơn 500 mô hình** với chuyển đổi giữa chừng tác vụ, để bạn khớp độ trễ, chi phí và reasoning với công việc. - -### Chế độ tự động (CI/CD) - -Chạy `kilo run` với `--auto` để hoạt động hoàn toàn tự động không có prompts, dành cho pipeline CI/CD: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` tắt mọi prompt xin quyền và cho phép agent thực hiện bất kỳ hành động nào mà không cần xác nhận. Chỉ dùng trong môi trường đáng tin cậy. - -### Tài liệu - -Về cấu hình và mọi thứ khác, hãy xem [tài liệu](https://kilo.ai/docs). - -### Đóng góp - -Chúng tôi chào đón đóng góp từ developer, writer và tất cả mọi người. Bắt đầu với [Contributing Guide](/CONTRIBUTING.md) để thiết lập môi trường, tiêu chuẩn code và cách mở pull request. Xem [RELEASING.md](RELEASING.md) cho quy trình release tiện ích VS Code và CLI, và [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md) cho plugin JetBrains. - -Vui lòng đọc [Code of Conduct](/CODE_OF_CONDUCT.md) trước khi tham gia. - -### License - -MIT. Bạn có thể sử dụng, chỉnh sửa và phân phối code này, kể cả cho mục đích thương mại, miễn là giữ lại thông tin ghi nhận và thông báo license. Xem [License](/LICENSE). - -### FAQ - -
-Kilo CLI đến từ đâu? - -Kilo CLI là một fork của [OpenCode](https://github.com/Kilo-Org/kilocode), được cải tiến để hoạt động trong nền tảng Kilo agentic engineering. - -
- ---- - -**Tham gia cộng đồng** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.zh.md b/README.zh.md deleted file mode 100644 index 28b02d30864..00000000000 --- a/README.zh.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

用于在 VS Code、JetBrains 或 CLI 中借助 AI 构建的开源编码代理。

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code 是一个 AI 编码代理,可以在你工作的任何地方使用:[VS Code](https://kilo.ai/landing/vs-code)、[JetBrains](https://kilo.ai/features/jetbrains-native) 和 [CLI](https://kilo.ai/cli)。它是开源的,并采用开放定价。你可以从 500 多个模型中选择,在任务中途切换模型,并按模型提供商的价格付费,没有加价。开始使用无需 API 密钥。 - -### 安装 - -选择你想运行 Kilo 的位置。 - -
-VS Code - -
- -直接安装 [Kilo Code 扩展](vscode:extension/kilocode.kilo-code),或从 [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) 获取。创建账户后,你可以按提供商价格访问 500 多个模型,包括 GPT-5.5、Claude Opus 4.7、Claude Sonnet 4.6 和 Gemini 3.1 Pro Preview。 - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -然后在任意项目目录中运行 `kilo` 即可开始。 - -
- -
-JetBrains - -
- -从 JetBrains Marketplace 安装 [Kilo Code 插件](https://plugins.jetbrains.com/plugin/28350-kilo-code),或在任意 JetBrains IDE 的 `Settings → Plugins` 中搜索 "Kilo Code"。 - -
- -
-Cloud Agent - -
- -无需本地机器,在 Web 上通过 [app.kilo.ai/cloud](https://app.kilo.ai/cloud) 运行 Kilo。 - -
- -
-代码审查 - -
- -在 [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) 为你的 Pull Request 设置自动 AI 代码审查。 - -
- -
-KiloClaw - -
- -在 [app.kilo.ai/claw](https://app.kilo.ai/claw) 启动你的常驻 AI 代理。 - -
- -
-从 GitHub Releases 安装 CLI(二进制文件) - -从 [Releases 页面](https://github.com/Kilo-Org/kilocode/releases) 下载最新二进制文件。 - -| 平台 | 资源 | -|---|---| -| Windows(大多数 PC) | `kilo-windows-x64.zip` | -| macOS(Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS(Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -说明:`x64-baseline` 是面向不支持 AVX 的旧 CPU 的兼容构建。`musl` 是面向 Alpine 或无 glibc 的极简 Docker 镜像的静态链接构建。`kilo-vscode-*.vsix` 是 VS Code 扩展包,不是 CLI。`Source code` 压缩包用于从源码构建。 - -
- -### Agents - -Kilo 内置了可按任务切换的专用 Agents。你也可以构建自己的自定义 Agents。 - -- **Code** - 默认模式。根据自然语言实现和编辑代码。 -- **Plan** - 在编写任何代码之前设计架构并编写实现计划。 -- **Ask** - 回答有关代码库的问题,不修改任何文件。 -- **Debug** - 排查并追踪问题。 -- **Review** - 审查你的更改,并从性能、安全、风格和测试覆盖率等方面发现问题。 - -了解更多关于 [agents 和自定义 agents](https://kilo.ai/docs/code-with-ai/agents/using-agents) 的信息。 - -### 功能 - -- **代码生成**:基于自然语言跨多个文件生成代码。 -- **内联自动补全**:提供 ghost-text 建议,按 Tab 接受。 -- **自检**:让代理审查并修正自己的工作。 -- **终端和浏览器控制**:运行命令并自动化网页操作。 -- **MCP 市场**:查找并连接 MCP 服务器,扩展代理能力。 -- **500 多个模型**:支持任务中途切换,让你根据延迟、成本和推理能力匹配任务。 - -### 自主模式(CI/CD) - -使用 `--auto` 运行 `kilo run`,可在 CI/CD 流水线中实现无提示的完全自主操作: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` 会禁用所有权限提示,并允许代理在无需确认的情况下执行任何操作。仅在可信环境中使用。 - -### 文档 - -关于配置和其他内容,请查看[文档](https://kilo.ai/docs)。 - -### 贡献 - -欢迎开发者、写作者以及所有人参与贡献。请先阅读 [Contributing Guide](/CONTRIBUTING.md),了解环境设置、编码标准以及如何创建 Pull Request。VS Code 扩展和 CLI 的发布流程请参阅 [RELEASING.md](RELEASING.md),JetBrains 插件请参阅 [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md)。 - -参与前请阅读我们的 [Code of Conduct](/CODE_OF_CONDUCT.md)。 - -### 许可证 - -MIT。你可以使用、修改和分发此代码,包括商业用途,只要保留署名和许可证声明。参见 [License](/LICENSE)。 - -### FAQ - -
-Kilo CLI 从哪里来? - -Kilo CLI 是 [OpenCode](https://github.com/Kilo-Org/kilocode) 的一个 fork,并增强为可在 Kilo agentic engineering 平台中使用。 - -
- ---- - -**加入社区** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/README.zht.md b/README.zht.md deleted file mode 100644 index 40a975a8362..00000000000 --- a/README.zht.md +++ /dev/null @@ -1,177 +0,0 @@ -

- English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt -

- -

- Kilo Code logo -

- -

用於在 VS Code、JetBrains 或 CLI 中運用 AI 建構的開源編碼代理。

- -

- VS Code Marketplace - npm - X (Twitter) - Blog - Discord - Reddit -

- -![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) - ---- - -Kilo Code 是一個 AI 編碼代理,可在你工作的任何地方使用:[VS Code](https://kilo.ai/landing/vs-code)、[JetBrains](https://kilo.ai/features/jetbrains-native) 和 [CLI](https://kilo.ai/cli)。它是開源專案,並採用開放定價。你可以從 500 多個模型中選擇,在任務中途切換模型,並按模型供應商的價格付費,沒有加價。開始使用不需要 API 金鑰。 - -### 安裝 - -選擇你想執行 Kilo 的位置。 - -
-VS Code - -
- -直接安裝 [Kilo Code 擴充功能](vscode:extension/kilocode.kilo-code),或從 [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) 取得。建立帳戶後,你可以按供應商價格使用 500 多個模型,包括 GPT-5.5、Claude Opus 4.7、Claude Sonnet 4.6 和 Gemini 3.1 Pro Preview。 - -
- -
-CLI - -
- -```bash -# npm -npm install -g @kilocode/cli - -# curl -curl -fsSL https://kilo.ai/cli/install | bash - -# pnpm -pnpm add -g @kilocode/cli - -# bun -bun add -g @kilocode/cli - -# Homebrew (macOS / Linux) -brew install Kilo-Org/tap/kilo - -# Arch Linux (AUR) -paru -S kilo-bin -``` - -然後在任何專案目錄中執行 `kilo` 即可開始。 - -
- -
-JetBrains - -
- -從 JetBrains Marketplace 安裝 [Kilo Code 外掛](https://plugins.jetbrains.com/plugin/28350-kilo-code),或在任何 JetBrains IDE 的 `Settings → Plugins` 中搜尋 "Kilo Code"。 - -
- -
-Cloud Agent - -
- -無需本機電腦,在 Web 上透過 [app.kilo.ai/cloud](https://app.kilo.ai/cloud) 執行 Kilo。 - -
- -
-程式碼審查 - -
- -在 [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) 為你的 Pull Request 設定自動 AI 程式碼審查。 - -
- -
-KiloClaw - -
- -在 [app.kilo.ai/claw](https://app.kilo.ai/claw) 啟動你的常駐 AI 代理。 - -
- -
-從 GitHub Releases 安裝 CLI(二進位檔) - -從 [Releases 頁面](https://github.com/Kilo-Org/kilocode/releases) 下載最新二進位檔。 - -| 平台 | 資源 | -|---|---| -| Windows(大多數 PC) | `kilo-windows-x64.zip` | -| macOS(Apple Silicon) | `kilo-darwin-arm64.zip` | -| macOS(Intel) | `kilo-darwin-x64.zip` | -| Linux x64 | `kilo-linux-x64.tar.gz` | -| Linux ARM | `kilo-linux-arm64.tar.gz` | - -注意:`x64-baseline` 是面向不支援 AVX 的舊 CPU 的相容性建置。`musl` 是面向 Alpine 或沒有 glibc 的極簡 Docker 映像的靜態連結建置。`kilo-vscode-*.vsix` 是 VS Code 擴充功能套件,不是 CLI。`Source code` 封存檔用於從原始碼建置。 - -
- -### Agents - -Kilo 內建可依任務切換的專用 Agents。你也可以建立自己的自訂 Agents。 - -- **Code** - 預設。根據自然語言實作和編輯程式碼。 -- **Plan** - 在撰寫任何程式碼之前設計架構並撰寫實作計畫。 -- **Ask** - 回答關於程式碼庫的問題,不修改任何檔案。 -- **Debug** - 疑難排解並追蹤問題。 -- **Review** - 審查你的變更,並找出效能、安全性、風格和測試覆蓋率方面的問題。 - -深入了解 [agents 和自訂 agents](https://kilo.ai/docs/code-with-ai/agents/using-agents)。 - -### 功能 - -- **程式碼產生**:以自然語言跨多個檔案產生程式碼。 -- **行內自動完成**:提供 ghost-text 建議,按 Tab 接受。 -- **自我檢查**:讓代理審查並修正自己的工作。 -- **終端機和瀏覽器控制**:執行命令並自動化網頁操作。 -- **MCP 市集**:尋找並連接 MCP 伺服器,擴充代理能力。 -- **500 多個模型**:支援任務中途切換,讓你根據延遲、成本和推理能力匹配任務。 - -### 自主模式(CI/CD) - -使用 `--auto` 執行 `kilo run`,可在 CI/CD 管線中進行無提示的完全自主操作: - -```bash -kilo run --auto "run tests and fix any failures" -``` - -`--auto` 會停用所有權限提示,並允許代理在無需確認的情況下執行任何操作。僅在可信任環境中使用。 - -### 文件 - -關於設定和其他內容,請查看[文件](https://kilo.ai/docs)。 - -### 貢獻 - -歡迎開發者、作者以及所有人參與貢獻。請先閱讀 [Contributing Guide](/CONTRIBUTING.md),了解環境設定、程式碼標準以及如何建立 Pull Request。VS Code 擴充功能和 CLI 的發布流程請參閱 [RELEASING.md](RELEASING.md),JetBrains 外掛請參閱 [packages/kilo-jetbrains/RELEASING.md](packages/kilo-jetbrains/RELEASING.md)。 - -參與前請閱讀我們的 [Code of Conduct](/CODE_OF_CONDUCT.md)。 - -### 授權 - -MIT。你可以使用、修改和散布此程式碼,包括商業用途,只要保留署名和授權聲明。請參閱 [License](/LICENSE)。 - -### FAQ - -
-Kilo CLI 從何而來? - -Kilo CLI 是 [OpenCode](https://github.com/Kilo-Org/kilocode) 的 fork,並增強為可在 Kilo agentic engineering 平台中使用。 - -
- ---- - -**加入社群** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) From a0837f9aacb2273625c2f4bf912d8fd035b7c195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20Uruchurtu?= Date: Tue, 23 Jun 2026 18:56:29 -0600 Subject: [PATCH 06/25] docs: add translated readmes in translations directory --- README.md | 4 + translations/README.ar.md | 181 +++++++++++++++++++++++++++++++++++++ translations/README.bn.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.br.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.bs.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.da.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.de.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.es.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.fr.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.gr.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.it.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.ja.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.ko.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.no.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.pl.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.ru.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.th.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.tr.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.uk.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.vi.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.zh.md | 177 ++++++++++++++++++++++++++++++++++++ translations/README.zht.md | 177 ++++++++++++++++++++++++++++++++++++ 22 files changed, 3725 insertions(+) create mode 100644 translations/README.ar.md create mode 100644 translations/README.bn.md create mode 100644 translations/README.br.md create mode 100644 translations/README.bs.md create mode 100644 translations/README.da.md create mode 100644 translations/README.de.md create mode 100644 translations/README.es.md create mode 100644 translations/README.fr.md create mode 100644 translations/README.gr.md create mode 100644 translations/README.it.md create mode 100644 translations/README.ja.md create mode 100644 translations/README.ko.md create mode 100644 translations/README.no.md create mode 100644 translations/README.pl.md create mode 100644 translations/README.ru.md create mode 100644 translations/README.th.md create mode 100644 translations/README.tr.md create mode 100644 translations/README.uk.md create mode 100644 translations/README.vi.md create mode 100644 translations/README.zh.md create mode 100644 translations/README.zht.md diff --git a/README.md b/README.md index 5fa853fb440..e26b90a6bba 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+

Kilo Code logo

diff --git a/translations/README.ar.md b/translations/README.ar.md new file mode 100644 index 00000000000..38030f9ced8 --- /dev/null +++ b/translations/README.ar.md @@ -0,0 +1,181 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +
+ +

+ Kilo Code logo +

+ +

وكيل برمجة مفتوح المصدر للبناء باستخدام الذكاء الاصطناعي في VS Code أو JetBrains أو CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code هو وكيل برمجة بالذكاء الاصطناعي يعمل معك أينما تعمل: [VS Code](https://kilo.ai/landing/vs-code) و[JetBrains](https://kilo.ai/features/jetbrains-native) و[CLI](https://kilo.ai/cli). إنه مفتوح المصدر وبتسعير مفتوح. يمكنك الاختيار من بين أكثر من 500 نموذج، والتبديل بينها أثناء المهمة، ودفع سعر مزود النموذج من دون أي هامش إضافي. لا تحتاج إلى مفاتيح API للبدء. + +### التثبيت + +اختر المكان الذي تريد تشغيل Kilo فيه. + +
+VS Code + +
+ +ثبّت [إضافة Kilo Code](vscode:extension/kilocode.kilo-code) مباشرة، أو احصل عليها من [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). أنشئ حسابًا وستحصل على إمكانية الوصول إلى أكثر من 500 نموذج، بما في ذلك GPT-5.5 وClaude Opus 4.7 وClaude Sonnet 4.6 وGemini 3.1 Pro Preview، كلها بسعر المزود. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +بعد ذلك شغّل `kilo` في أي مجلد مشروع للبدء. + +
+ +
+JetBrains + +
+ +ثبّت [إضافة Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) من JetBrains Marketplace، أو ابحث عن "Kilo Code" في `Settings → Plugins` داخل أي JetBrains IDE. + +
+ +
+Cloud Agent + +
+ +شغّل Kilo من الويب، من دون جهاز محلي، على [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+مراجعات الكود + +
+ +أعدّ مراجعات كود آلية بالذكاء الاصطناعي لطلبات السحب الخاصة بك على [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +شغّل وكيل الذكاء الاصطناعي الدائم لديك على [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+تثبيت CLI من GitHub Releases (ملفات ثنائية) + +نزّل أحدث ملف ثنائي من [صفحة Releases](https://github.com/Kilo-Org/kilocode/releases). + +| المنصة | الملف | +|---|---| +| Windows (معظم أجهزة PC) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +ملاحظات: `x64-baseline` هو بناء توافق للمعالجات القديمة التي لا تدعم AVX. `musl` هو البناء المرتبط ثابتًا لـ Alpine أو صور Docker البسيطة من دون glibc. `kilo-vscode-*.vsix` هو حزمة إضافة VS Code وليس CLI. أرشيفات `Source code` مخصصة للبناء من المصدر. + +
+ +### Agents + +يأتي Kilo مع agents متخصصة يمكنك التبديل بينها حسب المهمة. يمكنك أيضًا إنشاء agents مخصصة خاصة بك. + +- **Code** - الافتراضي. ينفذ الكود ويعدّله من اللغة الطبيعية. +- **Plan** - يصمم البنية ويكتب خطط التنفيذ قبل كتابة أي كود. +- **Ask** - يجيب عن الأسئلة حول قاعدة الكود من دون تعديل الملفات. +- **Debug** - يستكشف المشكلات ويتتبعها. +- **Review** - يراجع تغييراتك ويكشف مشكلات الأداء والأمان والأسلوب وتغطية الاختبارات. + +تعرّف أكثر على [agents وagents المخصصة](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### ما الذي يفعله + +- **توليد الكود** من اللغة الطبيعية عبر ملفات متعددة. +- **إكمال تلقائي داخل السطر** مع اقتراحات ghost-text والضغط على Tab للقبول. +- **فحص ذاتي** لكي يراجع الوكيل عمله ويصححه. +- **تحكم في الطرفية والمتصفح** لتشغيل الأوامر وأتمتة الويب. +- **سوق MCP** للعثور على خوادم MCP وربطها لتوسيع قدرات الوكيل. +- **أكثر من 500 نموذج** مع التبديل أثناء المهمة، لتطابق زمن الاستجابة والتكلفة والاستدلال مع العمل. + +### الوضع المستقل (CI/CD) + +شغّل `kilo run` مع `--auto` للعمل بشكل مستقل بالكامل ومن دون prompts، وهو مصمم لخطوط CI/CD: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +يعطّل `--auto` كل مطالبات الأذونات ويسمح للوكيل بتنفيذ أي إجراء من دون تأكيد. استخدمه فقط في بيئات موثوقة. + +### التوثيق + +لإعدادات التكوين وكل ما عدا ذلك، راجع [التوثيق](https://kilo.ai/docs). + +### المساهمة + +نرحب بمساهمات المطورين والكتّاب والجميع. ابدأ بـ [Contributing Guide](/CONTRIBUTING.md) لإعداد البيئة ومعايير الكود وكيفية فتح pull request. راجع [RELEASING.md](../RELEASING.md) لعملية إصدار إضافة VS Code وCLI، و[packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) لإضافة JetBrains. + +يرجى قراءة [Code of Conduct](/CODE_OF_CONDUCT.md) قبل المشاركة. + +### الترخيص + +MIT. يمكنك استخدام هذا الكود وتعديله وتوزيعه، بما في ذلك تجاريًا، ما دمت تحتفظ بإشعارات النسبة والترخيص. راجع [License](/LICENSE). + +### FAQ + +
+من أين جاء Kilo CLI؟ + +Kilo CLI هو fork من [OpenCode](https://github.com/anomalyco/opencode)، وتم تحسينه للعمل داخل منصة Kilo agentic engineering. + +
+ +--- + +**انضم إلى المجتمع** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) + +
diff --git a/translations/README.bn.md b/translations/README.bn.md new file mode 100644 index 00000000000..3dd13efd518 --- /dev/null +++ b/translations/README.bn.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

VS Code, JetBrains বা CLI-তে AI দিয়ে তৈরি করার জন্য ওপেন সোর্স কোডিং এজেন্ট।

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code হলো একটি AI কোডিং এজেন্ট যা আপনি যেখানে কাজ করেন সেখানেই কাজ করে: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) এবং [CLI](https://kilo.ai/cli)। এটি ওপেন সোর্স এবং খোলা মূল্যনীতির। আপনি 500টির বেশি মডেল থেকে বেছে নিতে পারেন, কাজের মাঝখানে মডেল বদলাতে পারেন এবং কোনো অতিরিক্ত চার্জ ছাড়াই মডেল প্রদানকারীর রেট পরিশোধ করেন। শুরু করতে API key দরকার নেই। + +### ইনস্টলেশন + +আপনি কোথায় Kilo চালাতে চান তা বেছে নিন। + +
+VS Code + +
+ +[Kilo Code extension](vscode:extension/kilocode.kilo-code) সরাসরি ইনস্টল করুন, অথবা [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) থেকে নিন। একটি অ্যাকাউন্ট তৈরি করলে GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 এবং Gemini 3.1 Pro Preview সহ 500টির বেশি মডেলে প্রদানকারীর দামে অ্যাক্সেস পাবেন। + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +তারপর শুরু করতে যেকোনো প্রজেক্ট ডিরেক্টরিতে `kilo` চালান। + +
+ +
+JetBrains + +
+ +JetBrains Marketplace থেকে [Kilo Code plugin](https://plugins.jetbrains.com/plugin/28350-kilo-code) ইনস্টল করুন, অথবা যেকোনো JetBrains IDE-তে `Settings → Plugins`-এ "Kilo Code" খুঁজুন। + +
+ +
+Cloud Agent + +
+ +লোকাল মেশিন ছাড়াই ওয়েব থেকে [app.kilo.ai/cloud](https://app.kilo.ai/cloud)-এ Kilo চালান। + +
+ +
+Code Reviews + +
+ +[app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews)-এ আপনার pull request-এ স্বয়ংক্রিয় AI code review সেট আপ করুন। + +
+ +
+KiloClaw + +
+ +[app.kilo.ai/claw](https://app.kilo.ai/claw)-এ আপনার always-on AI agent চালু করুন। + +
+ +
+GitHub Releases থেকে CLI ইনস্টল করুন (বাইনারি) + +[Releases page](https://github.com/Kilo-Org/kilocode/releases) থেকে সর্বশেষ বাইনারি ডাউনলোড করুন। + +| প্ল্যাটফর্ম | Asset | +|---|---| +| Windows (বেশিরভাগ PC) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +নোট: `x64-baseline` হলো AVX ছাড়া পুরোনো CPU-এর জন্য compatibility build। `musl` হলো Alpine বা glibc ছাড়া minimal Docker image-এর জন্য statically linked build। `kilo-vscode-*.vsix` হলো VS Code extension package, CLI নয়। `Source code` archive source থেকে build করার জন্য। + +
+ +### Agents + +Kilo বিশেষায়িত agents সহ আসে, কাজ অনুযায়ী আপনি এগুলোর মধ্যে বদলাতে পারেন। আপনি নিজের custom agents-ও বানাতে পারেন। + +- **Code** - ডিফল্ট। প্রাকৃতিক ভাষা থেকে কোড implement এবং edit করে। +- **Plan** - কোনো কোড লেখার আগে architecture design করে এবং implementation plan লেখে। +- **Ask** - কোনো ফাইল না ছুঁয়ে আপনার codebase সম্পর্কে প্রশ্নের উত্তর দেয়। +- **Debug** - সমস্যা troubleshoot এবং trace করে। +- **Review** - আপনার পরিবর্তন review করে এবং performance, security, style ও test coverage-এর সমস্যা তুলে ধরে। + +[agents এবং custom agents](https://kilo.ai/docs/code-with-ai/agents/using-agents) সম্পর্কে আরও জানুন। + +### এটি কী করে + +- প্রাকৃতিক ভাষা থেকে একাধিক ফাইলে **code generation**। +- ghost-text suggestion এবং Tab দিয়ে accept করার **inline autocomplete**। +- agent যেন নিজের কাজ review ও correct করে তার জন্য **self-checking**। +- command চালানো এবং web automate করার জন্য **terminal ও browser control**। +- agent-এর ক্ষমতা বাড়ায় এমন MCP server খুঁজে ও যুক্ত করার জন্য **MCP marketplace**। +- latency, cost এবং reasoning কাজের সাথে মেলাতে mid-task switching সহ **500টির বেশি model**। + +### Autonomous Mode (CI/CD) + +CI/CD pipeline-এর জন্য prompts ছাড়া পুরোপুরি autonomous operation পেতে `kilo run`-এর সাথে `--auto` ব্যবহার করুন: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` সব permission prompt বন্ধ করে এবং agent-কে confirmation ছাড়া যেকোনো action execute করতে দেয়। শুধু trusted environment-এ ব্যবহার করুন। + +### ডকুমেন্টেশন + +Configuration এবং বাকি সবকিছুর জন্য [docs](https://kilo.ai/docs) দেখুন। + +### Contributing + +Developer, writer এবং সবাইকে contribution-এর জন্য স্বাগতম। environment setup, coding standard এবং pull request খোলার পদ্ধতির জন্য [Contributing Guide](/CONTRIBUTING.md) দিয়ে শুরু করুন। VS Code extension এবং CLI release process-এর জন্য [RELEASING.md](../RELEASING.md), এবং JetBrains plugin-এর জন্য [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) দেখুন। + +অংশ নেওয়ার আগে আমাদের [Code of Conduct](/CODE_OF_CONDUCT.md) পড়ুন। + +### License + +MIT। attribution এবং license notice রেখে আপনি এই code ব্যবহার, পরিবর্তন এবং distribute করতে পারেন, commercial ব্যবহারসহ। [License](/LICENSE) দেখুন। + +### FAQ + +
+Kilo CLI কোথা থেকে এসেছে? + +Kilo CLI হলো [OpenCode](https://github.com/anomalyco/opencode)-এর একটি fork, Kilo agentic engineering platform-এর মধ্যে কাজ করার জন্য উন্নত করা হয়েছে। + +
+ +--- + +**কমিউনিটিতে যোগ দিন** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.br.md b/translations/README.br.md new file mode 100644 index 00000000000..bd3052385ea --- /dev/null +++ b/translations/README.br.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

O agente de programação open source para criar com IA no VS Code, JetBrains ou CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code é um agente de programação com IA que acompanha você em todos os lugares onde trabalha: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) e [CLI](https://kilo.ai/cli). É open source e tem preços abertos. Você escolhe entre mais de 500 modelos, alterna entre eles no meio da tarefa e paga a tarifa do provedor do modelo sem acréscimo. Não são necessárias chaves de API para começar. + +### Instalação + +Escolha onde você quer executar o Kilo. + +
+VS Code + +
+ +Instale a [extensão Kilo Code](vscode:extension/kilocode.kilo-code) diretamente ou baixe pelo [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Crie uma conta e você terá acesso a mais de 500 modelos, incluindo GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 e Gemini 3.1 Pro Preview, todos com preço do provedor. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Depois execute `kilo` em qualquer diretório de projeto para começar. + +
+ +
+JetBrains + +
+ +Instale o [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) pelo JetBrains Marketplace ou procure por "Kilo Code" em `Settings → Plugins` dentro de qualquer IDE JetBrains. + +
+ +
+Cloud Agent + +
+ +Execute o Kilo pela web, sem máquina local, em [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Revisões de código + +
+ +Configure revisões automáticas de código com IA nos seus pull requests em [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Inicie seu agente de IA sempre ativo em [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Instalar a CLI pelo GitHub Releases (binários) + +Baixe o binário mais recente na [página de Releases](https://github.com/Kilo-Org/kilocode/releases). + +| Plataforma | Asset | +|---|---| +| Windows (a maioria dos PCs) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Notas: `x64-baseline` é uma build de compatibilidade para CPUs antigas sem AVX. `musl` é a build com link estático para Alpine ou imagens Docker mínimas sem glibc. `kilo-vscode-*.vsix` é o pacote da extensão VS Code, não a CLI. Arquivos `Source code` são para compilar a partir do código-fonte. + +
+ +### Agents + +Kilo vem com agents especializados para você alternar dependendo da tarefa. Você também pode criar seus próprios agents personalizados. + +- **Code** - O padrão. Implementa e edita código a partir de linguagem natural. +- **Plan** - Desenha a arquitetura e escreve planos de implementação antes de qualquer código ser escrito. +- **Ask** - Responde perguntas sobre sua base de código sem tocar nos arquivos. +- **Debug** - Soluciona e rastreia problemas. +- **Review** - Revisa suas mudanças e aponta problemas de performance, segurança, estilo e cobertura de testes. + +Saiba mais sobre [agents e agents personalizados](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### O que ele faz + +- **Geração de código** a partir de linguagem natural, em vários arquivos. +- **Autocomplete inline** com sugestões ghost-text e Tab para aceitar. +- **Autoverificação** para que o agente revise e corrija o próprio trabalho. +- **Controle de terminal e navegador** para executar comandos e automatizar a web. +- **Marketplace MCP** para encontrar e conectar servidores MCP que ampliam o que o agente pode fazer. +- **Mais de 500 modelos** com alternância no meio da tarefa, para combinar latência, custo e raciocínio com o trabalho. + +### Modo autônomo (CI/CD) + +Execute `kilo run` com `--auto` para operação totalmente autônoma e sem prompts, criada para pipelines CI/CD: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` desativa todos os prompts de permissão e permite que o agente execute qualquer ação sem confirmação. Use apenas em ambientes confiáveis. + +### Documentação + +Para configuração e todo o resto, consulte a [documentação](https://kilo.ai/docs). + +### Contribuindo + +Contribuições são bem-vindas de desenvolvedores, escritores e qualquer pessoa. Comece pelo [Contributing Guide](/CONTRIBUTING.md) para configurar o ambiente, conhecer os padrões de código e abrir um pull request. Consulte [RELEASING.md](../RELEASING.md) para o processo de release da extensão VS Code e da CLI, e [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) para o plugin JetBrains. + +Leia nosso [Code of Conduct](/CODE_OF_CONDUCT.md) antes de participar. + +### Licença + +MIT. Você pode usar, modificar e distribuir este código, inclusive comercialmente, desde que mantenha os avisos de atribuição e licença. Consulte [License](/LICENSE). + +### FAQ + +
+De onde veio o Kilo CLI? + +Kilo CLI é um fork do [OpenCode](https://github.com/anomalyco/opencode), aprimorado para funcionar dentro da plataforma de engenharia agêntica da Kilo. + +
+ +--- + +**Participe da comunidade** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.bs.md b/translations/README.bs.md new file mode 100644 index 00000000000..22561b09823 --- /dev/null +++ b/translations/README.bs.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

Open source agent za kodiranje s AI-jem u VS Codeu, JetBrainsu ili CLI-ju.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code je AI agent za kodiranje koji vas prati svugdje gdje radite: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) i [CLI](https://kilo.ai/cli). Open source je i ima otvorene cijene. Birate između više od 500 modela, mijenjate ih usred zadatka i plaćate cijenu pružaoca modela bez dodatne marže. API ključevi nisu potrebni za početak. + +### Instalacija + +Odaberite gdje želite pokrenuti Kilo. + +
+VS Code + +
+ +Instalirajte [Kilo Code ekstenziju](vscode:extension/kilocode.kilo-code) direktno ili je preuzmite sa [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Kreirajte račun i imat ćete pristup za više od 500 modela, uključujući GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 i Gemini 3.1 Pro Preview, sve po cijenama pružaoca. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Zatim pokrenite `kilo` u bilo kojem direktoriju projekta. + +
+ +
+JetBrains + +
+ +Instalirajte [Kilo Code plugin](https://plugins.jetbrains.com/plugin/28350-kilo-code) sa JetBrains Marketplacea ili potražite "Kilo Code" u `Settings → Plugins` unutar bilo kojeg JetBrains IDE-a. + +
+ +
+Cloud Agent + +
+ +Pokrenite Kilo s weba, bez lokalne mašine, na [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Pregledi koda + +
+ +Postavite automatske AI preglede koda na svojim pull requestovima na [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Pokrenite svog uvijek aktivnog AI agenta na [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Instalirajte CLI iz GitHub Releases (binarne datoteke) + +Preuzmite najnoviju binarnu datoteku sa [Releases stranice](https://github.com/Kilo-Org/kilocode/releases). + +| Platforma | Asset | +|---|---| +| Windows (većina PC računara) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Napomene: `x64-baseline` je kompatibilna verzija za starije CPU-e bez AVX-a. `musl` je statički linkovana verzija za Alpine ili minimalne Docker slike bez glibc-a. `kilo-vscode-*.vsix` je paket VS Code ekstenzije, ne CLI. `Source code` arhive služe za build iz izvornog koda. + +
+ +### Agents + +Kilo dolazi sa specijaliziranim agents koje mijenjate zavisno od zadatka. Možete napraviti i vlastite prilagođene agents. + +- **Code** - Zadani. Implementira i uređuje kod iz prirodnog jezika. +- **Plan** - Dizajnira arhitekturu i piše implementacijske planove prije pisanja koda. +- **Ask** - Odgovara na pitanja o codebaseu bez mijenjanja datoteka. +- **Debug** - Rješava i prati probleme. +- **Review** - Pregleda vaše promjene i pronalazi probleme u performansama, sigurnosti, stilu i pokrivenosti testovima. + +Saznajte više o [agents i prilagođenim agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Šta radi + +- **Generisanje koda** iz prirodnog jezika, kroz više datoteka. +- **Inline autocomplete** sa ghost-text prijedlozima i Tab za prihvatanje. +- **Samoprovjera** kako bi agent pregledao i ispravio vlastiti rad. +- **Kontrola terminala i browsera** za pokretanje komandi i automatizaciju weba. +- **MCP marketplace** za pronalaženje i povezivanje MCP servera koji proširuju mogućnosti agenta. +- **Više od 500 modela** sa prebacivanjem usred zadatka, da uskladite latenciju, cijenu i rezonovanje s poslom. + +### Autonomni način rada (CI/CD) + +Pokrenite `kilo run` s `--auto` za potpuno autonoman rad bez promptova, napravljen za CI/CD pipelineove: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` isključuje sve upite za dozvole i dopušta agentu da izvrši bilo koju radnju bez potvrde. Koristite samo u pouzdanim okruženjima. + +### Dokumentacija + +Za konfiguraciju i sve ostalo posjetite [dokumentaciju](https://kilo.ai/docs). + +### Doprinos + +Doprinosi su dobrodošli od developera, pisaca i svih ostalih. Počnite sa [Contributing Guide](/CONTRIBUTING.md) za podešavanje okruženja, standarde kodiranja i otvaranje pull requesta. Pogledajte [RELEASING.md](../RELEASING.md) za proces izdavanja VS Code ekstenzije i CLI-ja, te [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) za JetBrains plugin. + +Prije uključivanja pročitajte naš [Code of Conduct](/CODE_OF_CONDUCT.md). + +### Licenca + +MIT. Možete koristiti, mijenjati i distribuirati ovaj kod, uključujući komercijalno, dok god zadržite atribuciju i obavijesti o licenci. Pogledajte [License](/LICENSE). + +### FAQ + +
+Odakle dolazi Kilo CLI? + +Kilo CLI je fork [OpenCode](https://github.com/anomalyco/opencode), poboljšan za rad unutar Kilo agentic engineering platforme. + +
+ +--- + +**Pridružite se zajednici** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.da.md b/translations/README.da.md new file mode 100644 index 00000000000..cedf1fd60bc --- /dev/null +++ b/translations/README.da.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

Den open source-kodeagent til at bygge med AI i VS Code, JetBrains eller CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code er en AI-kodeagent, der møder dig overalt, hvor du arbejder: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) og [CLI](https://kilo.ai/cli). Den er open source med åben prissætning. Du vælger mellem mere end 500 modeller, skifter mellem dem midt i en opgave og betaler modeludbyderens pris uden tillæg. Ingen API-nøgler kræves for at komme i gang. + +### Installation + +Vælg, hvor du vil køre Kilo. + +
+VS Code + +
+ +Installer [Kilo Code-udvidelsen](vscode:extension/kilocode.kilo-code) direkte, eller hent den fra [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Opret en konto, og du får adgang til mere end 500 modeller, herunder GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 og Gemini 3.1 Pro Preview, alle til udbyderpris. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Kør derefter `kilo` i en vilkårlig projektmappe for at starte. + +
+ +
+JetBrains + +
+ +Installer [Kilo Code-pluginet](https://plugins.jetbrains.com/plugin/28350-kilo-code) fra JetBrains Marketplace, eller søg efter "Kilo Code" i `Settings → Plugins` i en JetBrains IDE. + +
+ +
+Cloud Agent + +
+ +Kør Kilo fra webben, uden lokal maskine, på [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Kodegennemgange + +
+ +Opsæt automatiske AI-kodegennemgange på dine pull requests på [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Start din altid aktive AI-agent på [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Installer CLI fra GitHub Releases (binære filer) + +Download den nyeste binære fil fra [Releases-siden](https://github.com/Kilo-Org/kilocode/releases). + +| Platform | Asset | +|---|---| +| Windows (de fleste pc'er) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Bemærk: `x64-baseline` er en kompatibilitetsbuild til ældre CPU'er uden AVX. `musl` er den statisk linkede build til Alpine eller minimale Docker-images uden glibc. `kilo-vscode-*.vsix` er VS Code-udvidelsespakken, ikke CLI'en. `Source code`-arkiver er til at bygge fra kildekode. + +
+ +### Agents + +Kilo leveres med specialiserede agents, som du kan skifte mellem afhængigt af opgaven. Du kan også bygge dine egne brugerdefinerede agents. + +- **Code** - Standard. Implementerer og redigerer kode fra naturligt sprog. +- **Plan** - Designer arkitektur og skriver implementeringsplaner, før der skrives kode. +- **Ask** - Besvarer spørgsmål om din kodebase uden at ændre filer. +- **Debug** - Fejlfinder og sporer problemer. +- **Review** - Gennemgår dine ændringer og finder problemer med ydeevne, sikkerhed, stil og testdækning. + +Læs mere om [agents og brugerdefinerede agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Hvad den gør + +- **Kodegenerering** fra naturligt sprog på tværs af flere filer. +- **Inline-autocomplete** med ghost-text-forslag og Tab for at acceptere. +- **Selvkontrol**, så agenten gennemgår og retter sit eget arbejde. +- **Terminal- og browserkontrol** til at køre kommandoer og automatisere webben. +- **MCP-markedsplads** til at finde og tilslutte MCP-servere, der udvider agentens muligheder. +- **Mere end 500 modeller** med skift midt i opgaven, så du kan matche latenstid, pris og ræsonnement til arbejdet. + +### Autonom tilstand (CI/CD) + +Kør `kilo run` med `--auto` for fuldt autonom drift uden prompts, bygget til CI/CD-pipelines: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` deaktiverer alle tilladelsesprompts og lader agenten udføre enhver handling uden bekræftelse. Brug det kun i betroede miljøer. + +### Dokumentation + +For konfiguration og alt andet, se [dokumentationen](https://kilo.ai/docs). + +### Bidrag + +Bidrag er velkomne fra udviklere, forfattere og alle andre. Start med [Contributing Guide](/CONTRIBUTING.md) for miljøopsætning, kodestandarder og hvordan du åbner en pull request. Se [RELEASING.md](../RELEASING.md) for releaseprocessen for VS Code-udvidelsen og CLI'en, og [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) for JetBrains-pluginet. + +Læs venligst vores [Code of Conduct](/CODE_OF_CONDUCT.md), før du deltager. + +### Licens + +MIT. Du kan bruge, ændre og distribuere denne kode, også kommercielt, så længe du beholder attribution og licensmeddelelser. Se [License](/LICENSE). + +### FAQ + +
+Hvor kommer Kilo CLI fra? + +Kilo CLI er en fork af [OpenCode](https://github.com/anomalyco/opencode), forbedret til at fungere i Kilo agentic engineering-platformen. + +
+ +--- + +**Deltag i fællesskabet** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.de.md b/translations/README.de.md new file mode 100644 index 00000000000..0826d067ae8 --- /dev/null +++ b/translations/README.de.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

Der Open-Source-Coding-Agent zum Entwickeln mit KI in VS Code, JetBrains oder der CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code ist ein KI-Coding-Agent, der überall dort arbeitet, wo du arbeitest: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) und die [CLI](https://kilo.ai/cli). Es ist Open Source mit transparenter Preisgestaltung. Du wählst aus über 500 Modellen, wechselst sie mitten in einer Aufgabe und zahlst den Tarif des Modellanbieters ohne Aufschlag. Zum Start sind keine API-Schlüssel erforderlich. + +### Installation + +Wähle aus, wo du Kilo ausführen möchtest. + +
+VS Code + +
+ +Installiere die [Kilo Code-Erweiterung](vscode:extension/kilocode.kilo-code) direkt oder lade sie aus dem [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Erstelle ein Konto und erhalte Zugriff auf über 500 Modelle, darunter GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 und Gemini 3.1 Pro Preview, alle zu Anbieterpreisen. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Führe anschließend `kilo` in einem beliebigen Projektverzeichnis aus. + +
+ +
+JetBrains + +
+ +Installiere das [Kilo Code-Plugin](https://plugins.jetbrains.com/plugin/28350-kilo-code) aus dem JetBrains Marketplace oder suche in einer JetBrains-IDE unter `Settings → Plugins` nach "Kilo Code". + +
+ +
+Cloud Agent + +
+ +Führe Kilo im Web aus, ohne lokalen Rechner, unter [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Code Reviews + +
+ +Richte automatisierte KI-Code-Reviews für deine Pull Requests unter [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) ein. + +
+ +
+KiloClaw + +
+ +Starte deinen ständig aktiven KI-Agenten unter [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+CLI aus GitHub Releases installieren (Binärdateien) + +Lade die neueste Binärdatei von der [Releases-Seite](https://github.com/Kilo-Org/kilocode/releases) herunter. + +| Plattform | Asset | +|---|---| +| Windows (die meisten PCs) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Hinweise: `x64-baseline` ist ein Kompatibilitäts-Build für ältere CPUs ohne AVX. `musl` ist der statisch gelinkte Build für Alpine oder minimale Docker-Images ohne glibc. `kilo-vscode-*.vsix` ist das VS Code-Erweiterungspaket, nicht die CLI. `Source code`-Archive dienen dem Bauen aus dem Quellcode. + +
+ +### Agents + +Kilo wird mit spezialisierten Agents ausgeliefert, zwischen denen du je nach Aufgabe wechselst. Du kannst auch eigene Agents erstellen. + +- **Code** - Standard. Implementiert und bearbeitet Code aus natürlicher Sprache. +- **Plan** - Entwirft Architektur und schreibt Implementierungspläne, bevor Code geschrieben wird. +- **Ask** - Beantwortet Fragen zu deiner Codebasis, ohne Dateien zu ändern. +- **Debug** - Untersucht und verfolgt Probleme. +- **Review** - Prüft deine Änderungen und findet Probleme bei Performance, Sicherheit, Stil und Testabdeckung. + +Mehr erfahren über [Agents und benutzerdefinierte Agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Funktionen + +- **Codegenerierung** aus natürlicher Sprache über mehrere Dateien hinweg. +- **Inline-Autocomplete** mit Ghost-Text-Vorschlägen und Tab zum Übernehmen. +- **Selbstprüfung**, damit der Agent seine eigene Arbeit prüft und korrigiert. +- **Terminal- und Browsersteuerung**, um Befehle auszuführen und das Web zu automatisieren. +- **MCP-Marktplatz**, um MCP-Server zu finden und einzubinden, die den Agent erweitern. +- **Über 500 Modelle** mit Wechsel während einer Aufgabe, damit du Latenz, Kosten und Reasoning passend zur Aufgabe wählst. + +### Autonomer Modus (CI/CD) + +Führe `kilo run` mit `--auto` für vollständig autonomen Betrieb ohne Prompts aus, geeignet für CI/CD-Pipelines: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` deaktiviert alle Berechtigungsabfragen und erlaubt dem Agent, jede Aktion ohne Bestätigung auszuführen. Verwende es nur in vertrauenswürdigen Umgebungen. + +### Dokumentation + +Für Konfiguration und alles Weitere lies die [Dokumentation](https://kilo.ai/docs). + +### Mitwirken + +Beiträge von Entwicklerinnen, Autoren und allen anderen sind willkommen. Beginne mit dem [Contributing Guide](/CONTRIBUTING.md) für Einrichtung, Coding-Standards und Pull Requests. Siehe [RELEASING.md](../RELEASING.md) für den Release-Prozess der VS Code-Erweiterung und CLI sowie [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) für das JetBrains-Plugin. + +Bitte lies unseren [Code of Conduct](/CODE_OF_CONDUCT.md), bevor du mitwirkst. + +### Lizenz + +MIT. Du darfst diesen Code verwenden, ändern und verbreiten, auch kommerziell, solange du die Attribution und Lizenzhinweise beibehältst. Siehe [License](/LICENSE). + +### FAQ + +
+Woher stammt Kilo CLI? + +Kilo CLI ist ein Fork von [OpenCode](https://github.com/anomalyco/opencode), erweitert für die Kilo-Agentic-Engineering-Plattform. + +
+ +--- + +**Tritt der Community bei** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.es.md b/translations/README.es.md new file mode 100644 index 00000000000..67e5c1f22f2 --- /dev/null +++ b/translations/README.es.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

El agente de programación de código abierto para construir con IA en VS Code, JetBrains o la CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code es un agente de programación con IA que te acompaña en todos los lugares donde trabajas: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) y la [CLI](https://kilo.ai/cli). Es de código abierto y tiene precios abiertos. Puedes elegir entre más de 500 modelos, cambiar entre ellos a mitad de una tarea y pagar la tarifa del proveedor del modelo sin recargos. No necesitas claves de API para empezar. + +### Instalación + +Elige dónde quieres ejecutar Kilo. + +
+VS Code + +
+ +Instala directamente la [extensión Kilo Code](vscode:extension/kilocode.kilo-code), o descárgala desde [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Crea una cuenta y tendrás acceso a más de 500 modelos, incluidos GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 y Gemini 3.1 Pro Preview, todos con precios del proveedor. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Luego ejecuta `kilo` en cualquier directorio de proyecto para empezar. + +
+ +
+JetBrains + +
+ +Instala el [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) desde JetBrains Marketplace, o busca "Kilo Code" en `Settings → Plugins` dentro de cualquier IDE de JetBrains. + +
+ +
+Cloud Agent + +
+ +Ejecuta Kilo desde la web, sin necesitar una máquina local, en [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Revisiones de código + +
+ +Configura revisiones automáticas de código con IA en tus pull requests en [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Activa tu agente de IA siempre disponible en [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Instalar la CLI desde GitHub Releases (binarios) + +Descarga el binario más reciente desde la [página de Releases](https://github.com/Kilo-Org/kilocode/releases). + +| Plataforma | Recurso | +|---|---| +| Windows (la mayoría de PCs) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Notas: `x64-baseline` es una compilación de compatibilidad para CPUs antiguas sin AVX. `musl` es la compilación enlazada estáticamente para Alpine o imágenes Docker mínimas sin glibc. `kilo-vscode-*.vsix` es el paquete de extensión de VS Code, no la CLI. Los archivos `Source code` son para compilar desde el código fuente. + +
+ +### Agents + +Kilo incluye agents especializados entre los que puedes cambiar según la tarea. También puedes crear tus propios agents personalizados. + +- **Code** - El predeterminado. Implementa y edita código a partir de lenguaje natural. +- **Plan** - Diseña la arquitectura y escribe planes de implementación antes de que se escriba código. +- **Ask** - Responde preguntas sobre tu base de código sin tocar archivos. +- **Debug** - Diagnostica y rastrea problemas. +- **Review** - Revisa tus cambios y detecta problemas de rendimiento, seguridad, estilo y cobertura de pruebas. + +Más información sobre [agents y agents personalizados](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Qué hace + +- **Generación de código** desde lenguaje natural, en varios archivos. +- **Autocompletado en línea** con sugerencias ghost-text y Tab para aceptar. +- **Autoverificación** para que el agente revise y corrija su propio trabajo. +- **Control de terminal y navegador** para ejecutar comandos y automatizar la web. +- **Marketplace MCP** para encontrar y conectar servidores MCP que amplían lo que el agente puede hacer. +- **Más de 500 modelos** con cambio a mitad de tarea, para ajustar latencia, costo y razonamiento al trabajo. + +### Modo autónomo (CI/CD) + +Ejecuta `kilo run` con `--auto` para operar de forma totalmente autónoma y sin prompts, pensado para pipelines CI/CD: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` desactiva todos los prompts de permisos y permite que el agente ejecute cualquier acción sin confirmación. Úsalo solo en entornos de confianza. + +### Documentación + +Para configuración y todo lo demás, consulta la [documentación](https://kilo.ai/docs). + +### Contribuir + +Las contribuciones de desarrolladores, escritores y cualquier persona son bienvenidas. Empieza con la [Guía de contribución](/CONTRIBUTING.md) para la configuración del entorno, los estándares de código y cómo abrir un pull request. Consulta [RELEASING.md](../RELEASING.md) para el proceso de lanzamiento de la extensión de VS Code y la CLI, y [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) para el plugin de JetBrains. + +Lee nuestro [Código de conducta](/CODE_OF_CONDUCT.md) antes de participar. + +### Licencia + +MIT. Puedes usar, modificar y distribuir este código, incluso comercialmente, siempre que conserves los avisos de atribución y licencia. Consulta [License](/LICENSE). + +### FAQ + +
+¿De dónde viene Kilo CLI? + +Kilo CLI es un fork de [OpenCode](https://github.com/anomalyco/opencode), mejorado para funcionar dentro de la plataforma de ingeniería agéntica de Kilo. + +
+ +--- + +**Únete a la comunidad** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.fr.md b/translations/README.fr.md new file mode 100644 index 00000000000..6c12ebc5be1 --- /dev/null +++ b/translations/README.fr.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

L'agent de codage open source pour construire avec l'IA dans VS Code, JetBrains ou la CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code est un agent de codage avec IA qui vous accompagne partout où vous travaillez : [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) et la [CLI](https://kilo.ai/cli). Il est open source avec une tarification ouverte. Vous choisissez parmi plus de 500 modèles, vous pouvez en changer en cours de tâche et vous payez le tarif du fournisseur du modèle sans majoration. Aucune clé API n'est nécessaire pour commencer. + +### Installation + +Choisissez où vous voulez exécuter Kilo. + +
+VS Code + +
+ +Installez directement l'[extension Kilo Code](vscode:extension/kilocode.kilo-code), ou récupérez-la sur le [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Créez un compte et vous aurez accès à plus de 500 modèles, dont GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 et Gemini 3.1 Pro Preview, tous au prix fournisseur. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Exécutez ensuite `kilo` dans n'importe quel répertoire de projet pour commencer. + +
+ +
+JetBrains + +
+ +Installez le [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) depuis JetBrains Marketplace, ou recherchez "Kilo Code" dans `Settings → Plugins` dans n'importe quel IDE JetBrains. + +
+ +
+Cloud Agent + +
+ +Exécutez Kilo depuis le web, sans machine locale, sur [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Revues de code + +
+ +Configurez des revues de code IA automatisées sur vos pull requests à l'adresse [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Lancez votre agent IA toujours actif sur [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Installer la CLI depuis GitHub Releases (binaires) + +Téléchargez le dernier binaire depuis la [page des releases](https://github.com/Kilo-Org/kilocode/releases). + +| Plateforme | Fichier | +|---|---| +| Windows (la plupart des PC) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Notes : `x64-baseline` est une build de compatibilité pour les anciens processeurs sans AVX. `musl` est la build liée statiquement pour Alpine ou les images Docker minimales sans glibc. `kilo-vscode-*.vsix` est le paquet de l'extension VS Code, pas la CLI. Les archives `Source code` servent à compiler depuis les sources. + +
+ +### Agents + +Kilo inclut des agents spécialisés entre lesquels vous pouvez basculer selon la tâche. Vous pouvez aussi créer vos propres agents personnalisés. + +- **Code** - Par défaut. Implémente et modifie le code à partir du langage naturel. +- **Plan** - Conçoit l'architecture et rédige des plans d'implémentation avant l'écriture du code. +- **Ask** - Répond aux questions sur votre base de code sans modifier les fichiers. +- **Debug** - Diagnostique et trace les problèmes. +- **Review** - Examine vos changements et signale les problèmes de performance, sécurité, style et couverture de tests. + +En savoir plus sur les [agents et agents personnalisés](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Fonctionnalités + +- **Génération de code** en langage naturel, sur plusieurs fichiers. +- **Autocomplétion en ligne** avec suggestions ghost-text et Tab pour accepter. +- **Auto-vérification** pour que l'agent relise et corrige son propre travail. +- **Contrôle du terminal et du navigateur** pour exécuter des commandes et automatiser le web. +- **Marketplace MCP** pour trouver et connecter des serveurs MCP qui étendent les capacités de l'agent. +- **Plus de 500 modèles** avec changement en cours de tâche, pour adapter latence, coût et raisonnement au travail. + +### Mode autonome (CI/CD) + +Exécutez `kilo run` avec `--auto` pour un fonctionnement entièrement autonome sans prompts, conçu pour les pipelines CI/CD : + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` désactive toutes les demandes d'autorisation et permet à l'agent d'exécuter n'importe quelle action sans confirmation. Utilisez-le uniquement dans des environnements de confiance. + +### Documentation + +Pour la configuration et tout le reste, consultez la [documentation](https://kilo.ai/docs). + +### Contribuer + +Les contributions des développeurs, rédacteurs et de toute personne intéressée sont les bienvenues. Commencez par le [guide de contribution](/CONTRIBUTING.md) pour la configuration de l'environnement, les standards de code et l'ouverture d'une pull request. Consultez [RELEASING.md](../RELEASING.md) pour le processus de release de l'extension VS Code et de la CLI, et [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) pour le plugin JetBrains. + +Veuillez lire notre [Code de conduite](/CODE_OF_CONDUCT.md) avant de participer. + +### Licence + +MIT. Vous pouvez utiliser, modifier et distribuer ce code, y compris commercialement, tant que vous conservez les mentions d'attribution et de licence. Voir [License](/LICENSE). + +### FAQ + +
+D'où vient Kilo CLI ? + +Kilo CLI est un fork d'[OpenCode](https://github.com/anomalyco/opencode), amélioré pour fonctionner au sein de la plateforme d'ingénierie agentique Kilo. + +
+ +--- + +**Rejoindre la communauté** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.gr.md b/translations/README.gr.md new file mode 100644 index 00000000000..a42a67918ce --- /dev/null +++ b/translations/README.gr.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

Ο open source agent προγραμματισμού για δημιουργία με AI σε VS Code, JetBrains ή CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Το Kilo Code είναι ένας AI agent προγραμματισμού που σας συναντά παντού όπου εργάζεστε: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) και [CLI](https://kilo.ai/cli). Είναι open source με ανοιχτή τιμολόγηση. Επιλέγετε από περισσότερα από 500 μοντέλα, αλλάζετε μεταξύ τους στη μέση μιας εργασίας και πληρώνετε την τιμή του παρόχου του μοντέλου χωρίς προσαύξηση. Δεν απαιτούνται API keys για να ξεκινήσετε. + +### Εγκατάσταση + +Επιλέξτε πού θέλετε να εκτελέσετε το Kilo. + +
+VS Code + +
+ +Εγκαταστήστε απευθείας την [επέκταση Kilo Code](vscode:extension/kilocode.kilo-code) ή κατεβάστε τη από το [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Δημιουργήστε λογαριασμό και θα έχετε πρόσβαση σε περισσότερα από 500 μοντέλα, όπως GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 και Gemini 3.1 Pro Preview, όλα στην τιμή του παρόχου. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Στη συνέχεια εκτελέστε `kilo` σε οποιονδήποτε κατάλογο έργου για να ξεκινήσετε. + +
+ +
+JetBrains + +
+ +Εγκαταστήστε το [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) από το JetBrains Marketplace ή αναζητήστε "Kilo Code" στο `Settings → Plugins` σε οποιοδήποτε JetBrains IDE. + +
+ +
+Cloud Agent + +
+ +Εκτελέστε το Kilo από τον ιστό, χωρίς τοπικό μηχάνημα, στο [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Code Reviews + +
+ +Ρυθμίστε αυτοματοποιημένα AI code reviews στα pull requests σας στο [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Εκκινήστε τον πάντα ενεργό AI agent σας στο [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Εγκατάσταση CLI από GitHub Releases (binaries) + +Κατεβάστε το πιο πρόσφατο binary από τη [σελίδα Releases](https://github.com/Kilo-Org/kilocode/releases). + +| Πλατφόρμα | Asset | +|---|---| +| Windows (οι περισσότεροι υπολογιστές) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Σημειώσεις: Το `x64-baseline` είναι build συμβατότητας για παλαιότερους CPU χωρίς AVX. Το `musl` είναι το στατικά συνδεδεμένο build για Alpine ή ελάχιστες Docker images χωρίς glibc. Το `kilo-vscode-*.vsix` είναι το πακέτο επέκτασης VS Code, όχι το CLI. Τα αρχεία `Source code` είναι για build από τον πηγαίο κώδικα. + +
+ +### Agents + +Το Kilo περιλαμβάνει εξειδικευμένους agents ανάμεσα στους οποίους αλλάζετε ανάλογα με την εργασία. Μπορείτε επίσης να δημιουργήσετε τους δικούς σας custom agents. + +- **Code** - Ο προεπιλεγμένος. Υλοποιεί και επεξεργάζεται κώδικα από φυσική γλώσσα. +- **Plan** - Σχεδιάζει αρχιτεκτονική και γράφει πλάνα υλοποίησης πριν γραφτεί κώδικας. +- **Ask** - Απαντά σε ερωτήσεις για το codebase σας χωρίς να πειράζει αρχεία. +- **Debug** - Αντιμετωπίζει και εντοπίζει προβλήματα. +- **Review** - Ελέγχει τις αλλαγές σας και εντοπίζει ζητήματα απόδοσης, ασφάλειας, στυλ και κάλυψης δοκιμών. + +Μάθετε περισσότερα για τους [agents και custom agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Τι κάνει + +- **Παραγωγή κώδικα** από φυσική γλώσσα, σε πολλά αρχεία. +- **Inline autocomplete** με ghost-text προτάσεις και Tab για αποδοχή. +- **Αυτοέλεγχος** ώστε ο agent να ελέγχει και να διορθώνει τη δουλειά του. +- **Έλεγχος terminal και browser** για εκτέλεση εντολών και αυτοματοποίηση του web. +- **MCP marketplace** για εύρεση και σύνδεση MCP servers που επεκτείνουν τις δυνατότητες του agent. +- **Περισσότερα από 500 μοντέλα** με αλλαγή στη μέση της εργασίας, ώστε να ταιριάζετε latency, κόστος και reasoning στη δουλειά. + +### Αυτόνομη λειτουργία (CI/CD) + +Εκτελέστε `kilo run` με `--auto` για πλήρως αυτόνομη λειτουργία χωρίς prompts, σχεδιασμένη για CI/CD pipelines: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +Το `--auto` απενεργοποιεί όλα τα prompts αδειών και επιτρέπει στον agent να εκτελεί οποιαδήποτε ενέργεια χωρίς επιβεβαίωση. Χρησιμοποιήστε το μόνο σε αξιόπιστα περιβάλλοντα. + +### Τεκμηρίωση + +Για ρυθμίσεις και όλα τα υπόλοιπα, δείτε την [τεκμηρίωση](https://kilo.ai/docs). + +### Συνεισφορά + +Οι συνεισφορές είναι ευπρόσδεκτες από developers, writers και όλους. Ξεκινήστε με τον [Contributing Guide](/CONTRIBUTING.md) για ρύθμιση περιβάλλοντος, πρότυπα κώδικα και άνοιγμα pull request. Δείτε το [RELEASING.md](../RELEASING.md) για τη διαδικασία release της επέκτασης VS Code και του CLI, και το [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) για το JetBrains plugin. + +Παρακαλούμε διαβάστε τον [Code of Conduct](/CODE_OF_CONDUCT.md) πριν συμμετάσχετε. + +### Άδεια + +MIT. Μπορείτε να χρησιμοποιήσετε, να τροποποιήσετε και να διανείμετε αυτόν τον κώδικα, ακόμη και εμπορικά, αρκεί να διατηρήσετε τις αναφορές απόδοσης και άδειας. Δείτε [License](/LICENSE). + +### FAQ + +
+Από πού προήλθε το Kilo CLI; + +Το Kilo CLI είναι fork του [OpenCode](https://github.com/anomalyco/opencode), βελτιωμένο για να λειτουργεί μέσα στην Kilo agentic engineering platform. + +
+ +--- + +**Γίνετε μέλος της κοινότητας** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.it.md b/translations/README.it.md new file mode 100644 index 00000000000..8e700a4517d --- /dev/null +++ b/translations/README.it.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

L'agente di coding open source per creare con l'IA in VS Code, JetBrains o nella CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code è un agente di coding con IA che ti segue ovunque lavori: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) e la [CLI](https://kilo.ai/cli). È open source con prezzi trasparenti. Puoi scegliere tra oltre 500 modelli, passare da uno all'altro durante un'attività e pagare la tariffa del provider del modello senza ricarichi. Non servono chiavi API per iniziare. + +### Installazione + +Scegli dove vuoi eseguire Kilo. + +
+VS Code + +
+ +Installa direttamente l'[estensione Kilo Code](vscode:extension/kilocode.kilo-code), oppure scaricala dal [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Crea un account e avrai accesso a oltre 500 modelli, inclusi GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 e Gemini 3.1 Pro Preview, tutti al prezzo del provider. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Poi esegui `kilo` in qualsiasi directory di progetto per iniziare. + +
+ +
+JetBrains + +
+ +Installa il [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) dal JetBrains Marketplace, oppure cerca "Kilo Code" in `Settings → Plugins` dentro qualsiasi IDE JetBrains. + +
+ +
+Cloud Agent + +
+ +Esegui Kilo dal web, senza una macchina locale, su [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Revisioni del codice + +
+ +Configura revisioni automatiche del codice con IA sulle tue pull request su [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Avvia il tuo agente IA sempre attivo su [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Installare la CLI da GitHub Releases (binari) + +Scarica il binario più recente dalla [pagina Releases](https://github.com/Kilo-Org/kilocode/releases). + +| Piattaforma | Asset | +|---|---| +| Windows (la maggior parte dei PC) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Note: `x64-baseline` è una build di compatibilità per CPU più vecchie senza AVX. `musl` è la build collegata staticamente per Alpine o immagini Docker minimali senza glibc. `kilo-vscode-*.vsix` è il pacchetto dell'estensione VS Code, non la CLI. Gli archivi `Source code` servono per compilare dai sorgenti. + +
+ +### Agents + +Kilo include agents specializzati tra cui puoi passare in base all'attività. Puoi anche creare agents personalizzati. + +- **Code** - Predefinito. Implementa e modifica codice da linguaggio naturale. +- **Plan** - Progetta l'architettura e scrive piani di implementazione prima che venga scritto codice. +- **Ask** - Risponde a domande sulla tua codebase senza modificare file. +- **Debug** - Risolve e traccia problemi. +- **Review** - Revisiona le modifiche e segnala problemi di performance, sicurezza, stile e copertura dei test. + +Scopri di più su [agents e agents personalizzati](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Cosa fa + +- **Generazione di codice** da linguaggio naturale, su più file. +- **Autocompletamento inline** con suggerimenti ghost-text e Tab per accettare. +- **Autoverifica** così l'agente rivede e corregge il proprio lavoro. +- **Controllo di terminale e browser** per eseguire comandi e automatizzare il web. +- **Marketplace MCP** per trovare e collegare server MCP che estendono ciò che l'agente può fare. +- **Oltre 500 modelli** con cambio durante l'attività, per adattare latenza, costo e ragionamento al lavoro. + +### Modalità autonoma (CI/CD) + +Esegui `kilo run` con `--auto` per un funzionamento completamente autonomo senza prompt, pensato per pipeline CI/CD: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` disabilita tutti i prompt di autorizzazione e consente all'agente di eseguire qualsiasi azione senza conferma. Usalo solo in ambienti attendibili. + +### Documentazione + +Per configurazione e tutto il resto, consulta la [documentazione](https://kilo.ai/docs). + +### Contribuire + +Sono benvenuti contributi da sviluppatori, autori e chiunque altro. Inizia dalla [Guida al contributo](/CONTRIBUTING.md) per configurazione dell'ambiente, standard di codice e apertura di una pull request. Consulta [RELEASING.md](../RELEASING.md) per il processo di rilascio dell'estensione VS Code e della CLI, e [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) per il plugin JetBrains. + +Leggi il nostro [Codice di condotta](/CODE_OF_CONDUCT.md) prima di partecipare. + +### Licenza + +MIT. Puoi usare, modificare e distribuire questo codice, anche commercialmente, purché mantieni le note di attribuzione e licenza. Vedi [License](/LICENSE). + +### FAQ + +
+Da dove viene Kilo CLI? + +Kilo CLI è un fork di [OpenCode](https://github.com/anomalyco/opencode), migliorato per funzionare nella piattaforma di ingegneria agentica Kilo. + +
+ +--- + +**Unisciti alla community** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.ja.md b/translations/README.ja.md new file mode 100644 index 00000000000..1eb5f7704bc --- /dev/null +++ b/translations/README.ja.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

VS Code、JetBrains、CLI で AI を使って開発するためのオープンソースのコーディングエージェント。

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code は、[VS Code](https://kilo.ai/landing/vs-code)、[JetBrains](https://kilo.ai/features/jetbrains-native)、[CLI](https://kilo.ai/cli) など、あなたが作業する場所で使える AI コーディングエージェントです。オープンソースで、透明な価格体系を採用しています。500 以上のモデルから選択し、タスクの途中で切り替え、追加料金なしでモデルプロバイダーの料金を支払います。開始に API キーは不要です。 + +### インストール + +Kilo を実行する場所を選んでください。 + +
+VS Code + +
+ +[Kilo Code 拡張機能](vscode:extension/kilocode.kilo-code)を直接インストールするか、[VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) から入手してください。アカウントを作成すると、GPT-5.5、Claude Opus 4.7、Claude Sonnet 4.6、Gemini 3.1 Pro Preview を含む 500 以上のモデルを、すべてプロバイダー価格で利用できます。 + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +その後、任意のプロジェクトディレクトリで `kilo` を実行して開始します。 + +
+ +
+JetBrains + +
+ +JetBrains Marketplace から [Kilo Code プラグイン](https://plugins.jetbrains.com/plugin/28350-kilo-code)をインストールするか、任意の JetBrains IDE の `Settings → Plugins` で "Kilo Code" を検索してください。 + +
+ +
+Cloud Agent + +
+ +ローカルマシンなしで、Web から [app.kilo.ai/cloud](https://app.kilo.ai/cloud) で Kilo を実行できます。 + +
+ +
+コードレビュー + +
+ +[app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) で pull request に自動 AI コードレビューを設定できます。 + +
+ +
+KiloClaw + +
+ +[app.kilo.ai/claw](https://app.kilo.ai/claw) で常時稼働する AI エージェントを起動できます。 + +
+ +
+GitHub Releases から CLI をインストールする(バイナリ) + +[Releases ページ](https://github.com/Kilo-Org/kilocode/releases)から最新のバイナリをダウンロードしてください。 + +| プラットフォーム | アセット | +|---|---| +| Windows(ほとんどの PC) | `kilo-windows-x64.zip` | +| macOS(Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS(Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +注: `x64-baseline` は AVX のない古い CPU 向けの互換ビルドです。`musl` は Alpine や glibc のない最小 Docker イメージ向けの静的リンクビルドです。`kilo-vscode-*.vsix` は VS Code 拡張機能パッケージであり、CLI ではありません。`Source code` アーカイブはソースからビルドするためのものです。 + +
+ +### Agents + +Kilo には、タスクに応じて切り替えられる特化型 agents が含まれています。独自のカスタム agents も作成できます。 + +- **Code** - デフォルト。自然言語からコードを実装、編集します。 +- **Plan** - コードを書く前にアーキテクチャを設計し、実装計画を作成します。 +- **Ask** - ファイルを変更せずにコードベースに関する質問に答えます。 +- **Debug** - 問題のトラブルシューティングと追跡を行います。 +- **Review** - 変更をレビューし、パフォーマンス、セキュリティ、スタイル、テストカバレッジの問題を検出します。 + +[agents とカスタム agents](https://kilo.ai/docs/code-with-ai/agents/using-agents) について詳しく学べます。 + +### 機能 + +- 自然言語から複数ファイルにわたる **コード生成**。 +- ghost-text 提案と Tab での受け入れに対応した **インライン補完**。 +- エージェントが自分の作業をレビューして修正する **セルフチェック**。 +- コマンド実行と Web 自動化のための **ターミナルとブラウザ制御**。 +- エージェントの機能を拡張する MCP サーバーを見つけて接続する **MCP マーケットプレイス**。 +- レイテンシ、コスト、推論能力を作業に合わせるため、タスク途中の切り替えに対応した **500 以上のモデル**。 + +### 自律モード(CI/CD) + +CI/CD パイプライン向けに、プロンプトなしで完全自律動作させるには `kilo run` に `--auto` を指定します。 + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` はすべての権限プロンプトを無効にし、エージェントが確認なしで任意の操作を実行できるようにします。信頼できる環境でのみ使用してください。 + +### ドキュメント + +設定やその他の内容については、[ドキュメント](https://kilo.ai/docs)をご覧ください。 + +### コントリビューション + +開発者、ライター、その他すべての方からのコントリビューションを歓迎します。環境設定、コーディング標準、pull request の作成方法については [Contributing Guide](/CONTRIBUTING.md) から始めてください。VS Code 拡張機能と CLI のリリース手順は [RELEASING.md](../RELEASING.md)、JetBrains プラグインについては [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) を参照してください。 + +参加する前に [Code of Conduct](/CODE_OF_CONDUCT.md) を確認してください。 + +### ライセンス + +MIT。帰属表示とライセンス通知を保持する限り、商用利用を含め、このコードを使用、変更、配布できます。[License](/LICENSE) を参照してください。 + +### FAQ + +
+Kilo CLI はどこから来たのですか? + +Kilo CLI は [OpenCode](https://github.com/anomalyco/opencode) の fork であり、Kilo agentic engineering プラットフォーム内で動作するように強化されています。 + +
+ +--- + +**コミュニティに参加** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.ko.md b/translations/README.ko.md new file mode 100644 index 00000000000..4b39240ea07 --- /dev/null +++ b/translations/README.ko.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

VS Code, JetBrains 또는 CLI에서 AI로 개발하기 위한 오픈 소스 코딩 에이전트입니다.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code는 [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native), [CLI](https://kilo.ai/cli) 등 작업하는 모든 곳에서 사용할 수 있는 AI 코딩 에이전트입니다. 오픈 소스이며 투명한 가격 정책을 제공합니다. 500개 이상의 모델 중에서 선택하고, 작업 중간에 모델을 전환하며, 추가 요금 없이 모델 제공업체의 요금만 지불합니다. 시작할 때 API 키가 필요하지 않습니다. + +### 설치 + +Kilo를 실행할 위치를 선택하세요. + +
+VS Code + +
+ +[Kilo Code 확장](vscode:extension/kilocode.kilo-code)을 직접 설치하거나 [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code)에서 설치하세요. 계정을 만들면 GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6, Gemini 3.1 Pro Preview를 포함한 500개 이상의 모델을 제공업체 가격으로 사용할 수 있습니다. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +그런 다음 아무 프로젝트 디렉터리에서 `kilo`를 실행해 시작하세요. + +
+ +
+JetBrains + +
+ +JetBrains Marketplace에서 [Kilo Code 플러그인](https://plugins.jetbrains.com/plugin/28350-kilo-code)을 설치하거나, JetBrains IDE의 `Settings → Plugins`에서 "Kilo Code"를 검색하세요. + +
+ +
+Cloud Agent + +
+ +로컬 머신 없이 웹에서 [app.kilo.ai/cloud](https://app.kilo.ai/cloud)로 Kilo를 실행하세요. + +
+ +
+코드 리뷰 + +
+ +[app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews)에서 pull request에 자동 AI 코드 리뷰를 설정하세요. + +
+ +
+KiloClaw + +
+ +[app.kilo.ai/claw](https://app.kilo.ai/claw)에서 항상 켜져 있는 AI 에이전트를 시작하세요. + +
+ +
+GitHub Releases에서 CLI 설치하기(바이너리) + +[Releases 페이지](https://github.com/Kilo-Org/kilocode/releases)에서 최신 바이너리를 다운로드하세요. + +| 플랫폼 | 에셋 | +|---|---| +| Windows(대부분의 PC) | `kilo-windows-x64.zip` | +| macOS(Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS(Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +참고: `x64-baseline`은 AVX가 없는 구형 CPU용 호환 빌드입니다. `musl`은 Alpine 또는 glibc가 없는 최소 Docker 이미지용 정적 링크 빌드입니다. `kilo-vscode-*.vsix`는 CLI가 아니라 VS Code 확장 패키지입니다. `Source code` 아카이브는 소스에서 빌드할 때 사용합니다. + +
+ +### Agents + +Kilo에는 작업에 따라 전환할 수 있는 특화된 agents가 포함되어 있습니다. 사용자 지정 agents도 만들 수 있습니다. + +- **Code** - 기본값입니다. 자연어로 코드를 구현하고 편집합니다. +- **Plan** - 코드가 작성되기 전에 아키텍처를 설계하고 구현 계획을 작성합니다. +- **Ask** - 파일을 변경하지 않고 코드베이스에 대한 질문에 답합니다. +- **Debug** - 문제를 해결하고 추적합니다. +- **Review** - 변경 사항을 검토하고 성능, 보안, 스타일, 테스트 커버리지 문제를 찾아냅니다. + +[agents와 사용자 지정 agents](https://kilo.ai/docs/code-with-ai/agents/using-agents)에 대해 더 알아보세요. + +### 기능 + +- 여러 파일에 걸친 자연어 기반 **코드 생성**. +- ghost-text 제안과 Tab 수락을 지원하는 **인라인 자동완성**. +- 에이전트가 자신의 작업을 검토하고 수정하는 **자체 점검**. +- 명령 실행과 웹 자동화를 위한 **터미널 및 브라우저 제어**. +- 에이전트 기능을 확장하는 MCP 서버를 찾고 연결하는 **MCP 마켓플레이스**. +- 지연 시간, 비용, 추론 능력을 작업에 맞출 수 있는 작업 중 전환 지원 **500개 이상의 모델**. + +### 자율 모드(CI/CD) + +CI/CD 파이프라인용으로 프롬프트 없이 완전 자율 실행하려면 `kilo run`에 `--auto`를 사용하세요. + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto`는 모든 권한 프롬프트를 비활성화하고 에이전트가 확인 없이 모든 작업을 실행할 수 있게 합니다. 신뢰할 수 있는 환경에서만 사용하세요. + +### 문서 + +설정과 기타 모든 내용은 [문서](https://kilo.ai/docs)를 참조하세요. + +### 기여 + +개발자, 작성자 등 누구나 기여할 수 있습니다. 환경 설정, 코딩 표준, pull request 여는 방법은 [Contributing Guide](/CONTRIBUTING.md)에서 시작하세요. VS Code 확장과 CLI 릴리스 절차는 [RELEASING.md](../RELEASING.md)를, JetBrains 플러그인은 [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md)를 참조하세요. + +참여하기 전에 [Code of Conduct](/CODE_OF_CONDUCT.md)를 읽어 주세요. + +### 라이선스 + +MIT. 저작자 표시와 라이선스 고지를 유지하는 한, 상업적 사용을 포함해 이 코드를 사용, 수정, 배포할 수 있습니다. [License](/LICENSE)를 참조하세요. + +### FAQ + +
+Kilo CLI는 어디에서 왔나요? + +Kilo CLI는 [OpenCode](https://github.com/anomalyco/opencode)의 fork이며, Kilo agentic engineering 플랫폼에서 작동하도록 강화되었습니다. + +
+ +--- + +**커뮤니티 참여** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.no.md b/translations/README.no.md new file mode 100644 index 00000000000..42436dfd11e --- /dev/null +++ b/translations/README.no.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

Den åpne kildekodeagenten for å bygge med AI i VS Code, JetBrains eller CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code er en AI-kodeagent som møter deg overalt du jobber: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) og [CLI](https://kilo.ai/cli). Den er åpen kildekode med åpen prising. Du velger blant mer enn 500 modeller, bytter mellom dem midt i en oppgave og betaler modellleverandørens pris uten påslag. Ingen API-nøkler kreves for å starte. + +### Installasjon + +Velg hvor du vil kjøre Kilo. + +
+VS Code + +
+ +Installer [Kilo Code-utvidelsen](vscode:extension/kilocode.kilo-code) direkte, eller hent den fra [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Opprett en konto, og du får tilgang til mer enn 500 modeller, inkludert GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 og Gemini 3.1 Pro Preview, alle til leverandørpris. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Kjør deretter `kilo` i en prosjektmappe for å starte. + +
+ +
+JetBrains + +
+ +Installer [Kilo Code-pluginen](https://plugins.jetbrains.com/plugin/28350-kilo-code) fra JetBrains Marketplace, eller søk etter "Kilo Code" i `Settings → Plugins` i en JetBrains IDE. + +
+ +
+Cloud Agent + +
+ +Kjør Kilo fra nettet, uten lokal maskin, på [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Kodegjennomganger + +
+ +Sett opp automatiske AI-kodegjennomganger på pull requestene dine på [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Start din alltid aktive AI-agent på [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Installer CLI fra GitHub Releases (binærfiler) + +Last ned den nyeste binærfilen fra [Releases-siden](https://github.com/Kilo-Org/kilocode/releases). + +| Plattform | Asset | +|---|---| +| Windows (de fleste PC-er) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Merknader: `x64-baseline` er en kompatibilitetsbygg for eldre CPU-er uten AVX. `musl` er den statisk lenkede byggen for Alpine eller minimale Docker-bilder uten glibc. `kilo-vscode-*.vsix` er VS Code-utvidelsespakken, ikke CLI-en. `Source code`-arkiver er for bygging fra kildekode. + +
+ +### Agents + +Kilo leveres med spesialiserte agents du kan bytte mellom avhengig av oppgaven. Du kan også bygge dine egne egendefinerte agents. + +- **Code** - Standard. Implementerer og redigerer kode fra naturlig språk. +- **Plan** - Designer arkitektur og skriver implementeringsplaner før kode skrives. +- **Ask** - Svarer på spørsmål om kodebasen uten å endre filer. +- **Debug** - Feilsøker og sporer problemer. +- **Review** - Gjennomgår endringene dine og finner problemer med ytelse, sikkerhet, stil og testdekning. + +Les mer om [agents og egendefinerte agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Hva den gjør + +- **Kodegenerering** fra naturlig språk, på tvers av flere filer. +- **Inline-autofullføring** med ghost-text-forslag og Tab for å godta. +- **Selvsjekking** slik at agenten vurderer og retter sitt eget arbeid. +- **Terminal- og nettleserkontroll** for å kjøre kommandoer og automatisere nettet. +- **MCP-markedsplass** for å finne og koble til MCP-servere som utvider hva agenten kan gjøre. +- **Mer enn 500 modeller** med bytte midt i oppgaven, slik at du kan matche latenstid, kostnad og resonnering til jobben. + +### Autonom modus (CI/CD) + +Kjør `kilo run` med `--auto` for helt autonom drift uten spørsmål, bygget for CI/CD-pipelines: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` deaktiverer alle tillatelsesspørsmål og lar agenten utføre enhver handling uten bekreftelse. Bruk det bare i betrodde miljøer. + +### Dokumentasjon + +For konfigurasjon og alt annet, se [dokumentasjonen](https://kilo.ai/docs). + +### Bidra + +Bidrag er velkomne fra utviklere, skribenter og alle andre. Start med [Contributing Guide](/CONTRIBUTING.md) for miljøoppsett, kodestandarder og hvordan du åpner en pull request. Se [RELEASING.md](../RELEASING.md) for releaseprosessen for VS Code-utvidelsen og CLI-en, og [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) for JetBrains-pluginen. + +Les vår [Code of Conduct](/CODE_OF_CONDUCT.md) før du deltar. + +### Lisens + +MIT. Du kan bruke, endre og distribuere denne koden, også kommersielt, så lenge du beholder attribusjons- og lisensmerknadene. Se [License](/LICENSE). + +### FAQ + +
+Hvor kommer Kilo CLI fra? + +Kilo CLI er en fork av [OpenCode](https://github.com/anomalyco/opencode), forbedret for å fungere i Kilo agentic engineering-plattformen. + +
+ +--- + +**Bli med i fellesskapet** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.pl.md b/translations/README.pl.md new file mode 100644 index 00000000000..800266c0a17 --- /dev/null +++ b/translations/README.pl.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

Open source'owy agent kodujący do pracy z AI w VS Code, JetBrains lub CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code to agent kodujący z AI, który działa wszędzie tam, gdzie pracujesz: w [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) i [CLI](https://kilo.ai/cli). Jest open source i ma otwarte ceny. Wybierasz spośród ponad 500 modeli, przełączasz się między nimi w trakcie zadania i płacisz stawkę dostawcy modelu bez narzutów. Do rozpoczęcia nie są wymagane klucze API. + +### Instalacja + +Wybierz, gdzie chcesz uruchomić Kilo. + +
+VS Code + +
+ +Zainstaluj bezpośrednio [rozszerzenie Kilo Code](vscode:extension/kilocode.kilo-code) albo pobierz je z [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Utwórz konto, a otrzymasz dostęp do ponad 500 modeli, w tym GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 i Gemini 3.1 Pro Preview, wszystkie w cenach dostawców. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Następnie uruchom `kilo` w dowolnym katalogu projektu. + +
+ +
+JetBrains + +
+ +Zainstaluj [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) z JetBrains Marketplace albo wyszukaj "Kilo Code" w `Settings → Plugins` w dowolnym IDE JetBrains. + +
+ +
+Cloud Agent + +
+ +Uruchom Kilo z poziomu przeglądarki, bez lokalnej maszyny, na [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Przeglądy kodu + +
+ +Skonfiguruj automatyczne przeglądy kodu AI dla swoich pull requestów na [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Uruchom swojego zawsze aktywnego agenta AI na [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Zainstaluj CLI z GitHub Releases (pliki binarne) + +Pobierz najnowszy plik binarny ze [strony Releases](https://github.com/Kilo-Org/kilocode/releases). + +| Platforma | Zasób | +|---|---| +| Windows (większość PC) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Uwagi: `x64-baseline` to build zgodności dla starszych CPU bez AVX. `musl` to statycznie linkowany build dla Alpine lub minimalnych obrazów Docker bez glibc. `kilo-vscode-*.vsix` to pakiet rozszerzenia VS Code, nie CLI. Archiwa `Source code` służą do budowania ze źródeł. + +
+ +### Agents + +Kilo zawiera wyspecjalizowane agents, między którymi możesz przełączać się zależnie od zadania. Możesz też tworzyć własne niestandardowe agents. + +- **Code** - Domyślny. Implementuje i edytuje kod z języka naturalnego. +- **Plan** - Projektuje architekturę i pisze plany implementacji przed napisaniem kodu. +- **Ask** - Odpowiada na pytania o bazę kodu bez modyfikowania plików. +- **Debug** - Diagnozuje i śledzi problemy. +- **Review** - Przegląda zmiany i wykrywa problemy z wydajnością, bezpieczeństwem, stylem i pokryciem testami. + +Dowiedz się więcej o [agents i niestandardowych agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Co robi + +- **Generowanie kodu** z języka naturalnego, w wielu plikach. +- **Autouzupełnianie inline** z sugestiami ghost-text i akceptacją przez Tab. +- **Samokontrola**, dzięki której agent sprawdza i poprawia własną pracę. +- **Sterowanie terminalem i przeglądarką** do uruchamiania poleceń i automatyzacji webu. +- **Marketplace MCP** do znajdowania i podłączania serwerów MCP rozszerzających możliwości agenta. +- **Ponad 500 modeli** z przełączaniem w trakcie zadania, aby dopasować opóźnienie, koszt i rozumowanie do pracy. + +### Tryb autonomiczny (CI/CD) + +Uruchom `kilo run` z `--auto`, aby działać w pełni autonomicznie bez promptów, z myślą o pipeline'ach CI/CD: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` wyłącza wszystkie pytania o uprawnienia i pozwala agentowi wykonywać dowolne działania bez potwierdzenia. Używaj tylko w zaufanych środowiskach. + +### Dokumentacja + +Konfigurację i wszystko inne znajdziesz w [dokumentacji](https://kilo.ai/docs). + +### Wkład + +Zapraszamy do wkładu programistów, autorów i wszystkich innych. Zacznij od [Contributing Guide](/CONTRIBUTING.md), aby skonfigurować środowisko, poznać standardy kodowania i sposób otwierania pull requestów. Zobacz [RELEASING.md](../RELEASING.md) dla procesu wydawania rozszerzenia VS Code i CLI oraz [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) dla pluginu JetBrains. + +Przed zaangażowaniem przeczytaj nasz [Code of Conduct](/CODE_OF_CONDUCT.md). + +### Licencja + +MIT. Możesz używać, modyfikować i dystrybuować ten kod, również komercyjnie, o ile zachowasz informacje o autorstwie i licencji. Zobacz [License](/LICENSE). + +### FAQ + +
+Skąd pochodzi Kilo CLI? + +Kilo CLI jest forkiem [OpenCode](https://github.com/anomalyco/opencode), rozszerzonym do działania w platformie agentic engineering Kilo. + +
+ +--- + +**Dołącz do społeczności** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.ru.md b/translations/README.ru.md new file mode 100644 index 00000000000..7e0286ba104 --- /dev/null +++ b/translations/README.ru.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

Open source-агент для разработки с ИИ в VS Code, JetBrains или CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code — это AI-агент для написания кода, который работает там, где работаете вы: в [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) и [CLI](https://kilo.ai/cli). Он имеет открытый исходный код и открытую модель ценообразования. Вы выбираете из более чем 500 моделей, переключаетесь между ними во время задачи и платите по тарифу поставщика модели без наценки. Для начала не нужны API-ключи. + +### Установка + +Выберите, где вы хотите запускать Kilo. + +
+VS Code + +
+ +Установите [расширение Kilo Code](vscode:extension/kilocode.kilo-code) напрямую или скачайте его из [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Создайте аккаунт и получите доступ к более чем 500 моделям, включая GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 и Gemini 3.1 Pro Preview, все по ценам поставщиков. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Затем запустите `kilo` в любом каталоге проекта. + +
+ +
+JetBrains + +
+ +Установите [плагин Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) из JetBrains Marketplace или найдите "Kilo Code" в `Settings → Plugins` в любой IDE JetBrains. + +
+ +
+Cloud Agent + +
+ +Запускайте Kilo из веба без локальной машины на [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Code Reviews + +
+ +Настройте автоматические AI-ревью кода для ваших pull request на [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Запустите своего постоянно активного AI-агента на [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Установить CLI из GitHub Releases (бинарные файлы) + +Скачайте последний бинарный файл со [страницы Releases](https://github.com/Kilo-Org/kilocode/releases). + +| Платформа | Файл | +|---|---| +| Windows (большинство ПК) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Примечания: `x64-baseline` — совместимая сборка для старых CPU без AVX. `musl` — статически связанная сборка для Alpine или минимальных Docker-образов без glibc. `kilo-vscode-*.vsix` — пакет расширения VS Code, а не CLI. Архивы `Source code` предназначены для сборки из исходного кода. + +
+ +### Agents + +Kilo поставляется со специализированными agents, между которыми можно переключаться в зависимости от задачи. Вы также можете создавать собственные agents. + +- **Code** - По умолчанию. Реализует и редактирует код по описанию на естественном языке. +- **Plan** - Проектирует архитектуру и пишет планы реализации до написания кода. +- **Ask** - Отвечает на вопросы о кодовой базе, не изменяя файлы. +- **Debug** - Диагностирует и отслеживает проблемы. +- **Review** - Проверяет ваши изменения и выявляет проблемы производительности, безопасности, стиля и покрытия тестами. + +Подробнее об [agents и пользовательских agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Возможности + +- **Генерация кода** из естественного языка в нескольких файлах. +- **Встроенное автодополнение** с ghost-text-подсказками и принятием по Tab. +- **Самопроверка**, чтобы агент проверял и исправлял собственную работу. +- **Управление терминалом и браузером** для запуска команд и автоматизации веба. +- **MCP marketplace** для поиска и подключения MCP-серверов, расширяющих возможности агента. +- **Более 500 моделей** с переключением во время задачи, чтобы подобрать задержку, стоимость и reasoning под работу. + +### Автономный режим (CI/CD) + +Запустите `kilo run` с `--auto` для полностью автономной работы без prompts, предназначенной для CI/CD-пайплайнов: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` отключает все запросы разрешений и позволяет агенту выполнять любые действия без подтверждения. Используйте только в доверенных средах. + +### Документация + +Для настройки и всего остального перейдите к [документации](https://kilo.ai/docs). + +### Участие + +Мы приветствуем вклад разработчиков, авторов и всех желающих. Начните с [Contributing Guide](/CONTRIBUTING.md), чтобы настроить окружение, изучить стандарты кода и узнать, как открыть pull request. См. [RELEASING.md](../RELEASING.md) для процесса релиза расширения VS Code и CLI, а также [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) для плагина JetBrains. + +Перед участием ознакомьтесь с нашим [Code of Conduct](/CODE_OF_CONDUCT.md). + +### Лицензия + +MIT. Вы можете использовать, изменять и распространять этот код, в том числе коммерчески, если сохраняете указания авторства и лицензионные уведомления. См. [License](/LICENSE). + +### FAQ + +
+Откуда появился Kilo CLI? + +Kilo CLI — это fork [OpenCode](https://github.com/anomalyco/opencode), расширенный для работы в платформе agentic engineering Kilo. + +
+ +--- + +**Присоединяйтесь к сообществу** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.th.md b/translations/README.th.md new file mode 100644 index 00000000000..409acc7fc3f --- /dev/null +++ b/translations/README.th.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

เอเจนต์เขียนโค้ดโอเพนซอร์สสำหรับสร้างด้วย AI ใน VS Code, JetBrains หรือ CLI

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code คือเอเจนต์เขียนโค้ดด้วย AI ที่ทำงานได้ทุกที่ที่คุณทำงาน: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) และ [CLI](https://kilo.ai/cli) เป็นโอเพนซอร์สและมีราคาที่โปร่งใส คุณเลือกได้จากโมเดลมากกว่า 500 รายการ สลับโมเดลระหว่างทำงาน และจ่ายตามราคาของผู้ให้บริการโมเดลโดยไม่มีส่วนเพิ่ม ไม่ต้องใช้ API key เพื่อเริ่มต้น + +### การติดตั้ง + +เลือกตำแหน่งที่คุณต้องการใช้งาน Kilo + +
+VS Code + +
+ +ติดตั้ง [ส่วนขยาย Kilo Code](vscode:extension/kilocode.kilo-code) โดยตรง หรือดาวน์โหลดจาก [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) สร้างบัญชีแล้วคุณจะเข้าถึงโมเดลมากกว่า 500 รายการ รวมถึง GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 และ Gemini 3.1 Pro Preview ทั้งหมดในราคาผู้ให้บริการ + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +จากนั้นรัน `kilo` ในไดเรกทอรีโปรเจกต์ใดก็ได้เพื่อเริ่มต้น + +
+ +
+JetBrains + +
+ +ติดตั้ง [ปลั๊กอิน Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) จาก JetBrains Marketplace หรือค้นหา "Kilo Code" ใน `Settings → Plugins` ภายใน JetBrains IDE ใดก็ได้ + +
+ +
+Cloud Agent + +
+ +รัน Kilo จากเว็บโดยไม่ต้องใช้เครื่องภายในที่ [app.kilo.ai/cloud](https://app.kilo.ai/cloud) + +
+ +
+Code Reviews + +
+ +ตั้งค่าการรีวิวโค้ดด้วย AI อัตโนมัติบน pull request ของคุณที่ [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) + +
+ +
+KiloClaw + +
+ +เริ่มเอเจนต์ AI ที่ทำงานตลอดเวลาของคุณที่ [app.kilo.ai/claw](https://app.kilo.ai/claw) + +
+ +
+ติดตั้ง CLI จาก GitHub Releases (ไบนารี) + +ดาวน์โหลดไบนารีล่าสุดจาก [หน้า Releases](https://github.com/Kilo-Org/kilocode/releases) + +| แพลตฟอร์ม | Asset | +|---|---| +| Windows (พีซีส่วนใหญ่) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +หมายเหตุ: `x64-baseline` คือ build ที่เข้ากันได้สำหรับ CPU รุ่นเก่าที่ไม่มี AVX ส่วน `musl` คือ build แบบ static link สำหรับ Alpine หรือ Docker image ขั้นต่ำที่ไม่มี glibc `kilo-vscode-*.vsix` คือแพ็กเกจส่วนขยาย VS Code ไม่ใช่ CLI ไฟล์ `Source code` ใช้สำหรับ build จากซอร์ส + +
+ +### Agents + +Kilo มาพร้อม agents เฉพาะทางที่คุณสลับได้ตามงาน คุณยังสร้าง agents แบบกำหนดเองได้ด้วย + +- **Code** - ค่าเริ่มต้น ใช้ภาษาธรรมชาติในการเขียนและแก้ไขโค้ด +- **Plan** - ออกแบบสถาปัตยกรรมและเขียนแผนการทำงานก่อนมีการเขียนโค้ด +- **Ask** - ตอบคำถามเกี่ยวกับ codebase โดยไม่แตะไฟล์ +- **Debug** - แก้ไขและติดตามปัญหา +- **Review** - รีวิวการเปลี่ยนแปลงและค้นหาปัญหาด้านประสิทธิภาพ ความปลอดภัย สไตล์ และ test coverage + +เรียนรู้เพิ่มเติมเกี่ยวกับ [agents และ agents แบบกำหนดเอง](https://kilo.ai/docs/code-with-ai/agents/using-agents) + +### ทำอะไรได้บ้าง + +- **สร้างโค้ด** จากภาษาธรรมชาติข้ามหลายไฟล์ +- **เติมโค้ดอัตโนมัติแบบ inline** พร้อมคำแนะนำ ghost-text และกด Tab เพื่อรับ +- **ตรวจสอบตัวเอง** เพื่อให้เอเจนต์รีวิวและแก้งานของตนเอง +- **ควบคุม terminal และ browser** เพื่อรันคำสั่งและทำงานบนเว็บอัตโนมัติ +- **MCP marketplace** เพื่อค้นหาและเชื่อมต่อ MCP server ที่ขยายความสามารถของเอเจนต์ +- **โมเดลมากกว่า 500 รายการ** พร้อมการสลับระหว่างงาน เพื่อให้เหมาะกับ latency, cost และ reasoning ของงาน + +### โหมดอัตโนมัติ (CI/CD) + +รัน `kilo run` พร้อม `--auto` เพื่อทำงานอัตโนมัติเต็มรูปแบบโดยไม่มี prompts เหมาะสำหรับ CI/CD pipelines: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` ปิด prompt สิทธิ์ทั้งหมดและให้เอเจนต์ดำเนินการใดก็ได้โดยไม่ต้องยืนยัน ใช้เฉพาะในสภาพแวดล้อมที่เชื่อถือได้เท่านั้น + +### เอกสาร + +สำหรับการตั้งค่าและเรื่องอื่น ๆ ดูที่ [เอกสาร](https://kilo.ai/docs) + +### การมีส่วนร่วม + +ยินดีรับการมีส่วนร่วมจากนักพัฒนา นักเขียน และทุกคน เริ่มจาก [Contributing Guide](/CONTRIBUTING.md) สำหรับการตั้งค่าสภาพแวดล้อม มาตรฐานโค้ด และวิธีเปิด pull request ดู [RELEASING.md](../RELEASING.md) สำหรับกระบวนการ release ของส่วนขยาย VS Code และ CLI และ [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) สำหรับปลั๊กอิน JetBrains + +โปรดอ่าน [Code of Conduct](/CODE_OF_CONDUCT.md) ก่อนเข้าร่วม + +### License + +MIT คุณสามารถใช้ แก้ไข และแจกจ่ายโค้ดนี้ รวมถึงเชิงพาณิชย์ ตราบใดที่ยังเก็บ attribution และประกาศ license ไว้ ดู [License](/LICENSE) + +### FAQ + +
+Kilo CLI มาจากไหน? + +Kilo CLI เป็น fork ของ [OpenCode](https://github.com/anomalyco/opencode) ที่ได้รับการปรับปรุงให้ทำงานในแพลตฟอร์ม Kilo agentic engineering + +
+ +--- + +**เข้าร่วมชุมชน** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.tr.md b/translations/README.tr.md new file mode 100644 index 00000000000..28688c319a2 --- /dev/null +++ b/translations/README.tr.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

VS Code, JetBrains veya CLI'de AI ile geliştirme yapmak için açık kaynak kodlama ajanı.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code, çalıştığınız her yerde size eşlik eden bir AI kodlama ajanıdır: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) ve [CLI](https://kilo.ai/cli). Açık kaynaktır ve açık fiyatlandırma sunar. 500'den fazla model arasından seçim yapabilir, görev sırasında model değiştirebilir ve hiçbir ek ücret olmadan model sağlayıcısının fiyatını ödersiniz. Başlamak için API anahtarı gerekmez. + +### Kurulum + +Kilo'yu nerede çalıştırmak istediğinizi seçin. + +
+VS Code + +
+ +[Kilo Code uzantısını](vscode:extension/kilocode.kilo-code) doğrudan kurun veya [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) üzerinden edinin. Bir hesap oluşturduğunuzda GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 ve Gemini 3.1 Pro Preview dahil 500'den fazla modele sağlayıcı fiyatıyla erişebilirsiniz. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Ardından başlamak için herhangi bir proje dizininde `kilo` çalıştırın. + +
+ +
+JetBrains + +
+ +[Kilo Code eklentisini](https://plugins.jetbrains.com/plugin/28350-kilo-code) JetBrains Marketplace'ten kurun veya herhangi bir JetBrains IDE içinde `Settings → Plugins` bölümünde "Kilo Code" arayın. + +
+ +
+Cloud Agent + +
+ +Kilo'yu yerel makine gerekmeden web üzerinden [app.kilo.ai/cloud](https://app.kilo.ai/cloud) adresinde çalıştırın. + +
+ +
+Kod İncelemeleri + +
+ +Pull request'leriniz için otomatik AI kod incelemelerini [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) adresinde ayarlayın. + +
+ +
+KiloClaw + +
+ +Her zaman açık AI ajanınızı [app.kilo.ai/claw](https://app.kilo.ai/claw) adresinde başlatın. + +
+ +
+CLI'yi GitHub Releases üzerinden kurun (ikili dosyalar) + +En son ikili dosyayı [Releases sayfasından](https://github.com/Kilo-Org/kilocode/releases) indirin. + +| Platform | Asset | +|---|---| +| Windows (çoğu PC) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Notlar: `x64-baseline`, AVX olmayan eski CPU'lar için uyumluluk derlemesidir. `musl`, Alpine veya glibc olmayan minimal Docker imajları için statik bağlı derlemedir. `kilo-vscode-*.vsix` CLI değil VS Code uzantı paketidir. `Source code` arşivleri kaynaktan derlemek içindir. + +
+ +### Agents + +Kilo, göreve göre aralarında geçiş yapabileceğiniz özelleşmiş agents ile gelir. Kendi özel agents'larınızı da oluşturabilirsiniz. + +- **Code** - Varsayılan. Doğal dilden kod uygular ve düzenler. +- **Plan** - Kod yazılmadan önce mimari tasarlar ve uygulama planları yazar. +- **Ask** - Dosyalara dokunmadan kod tabanınız hakkında soruları yanıtlar. +- **Debug** - Sorunları giderir ve izler. +- **Review** - Değişikliklerinizi inceler ve performans, güvenlik, stil ve test kapsamı sorunlarını ortaya çıkarır. + +[Agents ve özel agents](https://kilo.ai/docs/code-with-ai/agents/using-agents) hakkında daha fazla bilgi edinin. + +### Ne yapar + +- Birden çok dosyada doğal dilden **kod üretimi**. +- Ghost-text önerileri ve kabul etmek için Tab ile **satır içi otomatik tamamlama**. +- Ajanın kendi çalışmasını inceleyip düzeltmesi için **öz denetim**. +- Komut çalıştırmak ve web'i otomatikleştirmek için **terminal ve tarayıcı kontrolü**. +- Ajanın yapabileceklerini genişleten MCP sunucularını bulmak ve bağlamak için **MCP marketplace**. +- Gecikme, maliyet ve akıl yürütmeyi işe uygun seçmek için görev sırasında geçiş destekli **500'den fazla model**. + +### Otonom Mod (CI/CD) + +CI/CD pipeline'ları için prompts olmadan tamamen otonom çalıştırmak üzere `kilo run` komutunu `--auto` ile çalıştırın: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` tüm izin istemlerini devre dışı bırakır ve ajanın herhangi bir işlemi onay olmadan yürütmesine izin verir. Yalnızca güvenilir ortamlarda kullanın. + +### Dokümantasyon + +Yapılandırma ve diğer her şey için [dokümantasyona](https://kilo.ai/docs) bakın. + +### Katkıda bulunma + +Geliştiricilerden, yazarlardan ve herkesten katkı bekliyoruz. Ortam kurulumu, kodlama standartları ve pull request açma hakkında bilgi için [Contributing Guide](/CONTRIBUTING.md) ile başlayın. VS Code uzantısı ve CLI yayın süreci için [RELEASING.md](../RELEASING.md), JetBrains eklentisi için [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) dosyasına bakın. + +Katılmadan önce lütfen [Code of Conduct](/CODE_OF_CONDUCT.md) belgemizi okuyun. + +### Lisans + +MIT. Atıf ve lisans bildirimlerini koruduğunuz sürece bu kodu ticari olarak da kullanabilir, değiştirebilir ve dağıtabilirsiniz. Bkz. [License](/LICENSE). + +### FAQ + +
+Kilo CLI nereden geldi? + +Kilo CLI, Kilo agentic engineering platformunda çalışacak şekilde geliştirilmiş bir [OpenCode](https://github.com/anomalyco/opencode) fork'udur. + +
+ +--- + +**Topluluğa katılın** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.uk.md b/translations/README.uk.md new file mode 100644 index 00000000000..abefa3316c7 --- /dev/null +++ b/translations/README.uk.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

Open source-агент для програмування з AI у VS Code, JetBrains або CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code — це AI-агент для програмування, який працює там, де працюєте ви: у [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) і [CLI](https://kilo.ai/cli). Він має відкритий код і відкриту модель ціноутворення. Ви обираєте з понад 500 моделей, перемикаєтеся між ними під час завдання і платите тариф постачальника моделі без націнки. Для старту API-ключі не потрібні. + +### Встановлення + +Оберіть, де ви хочете запускати Kilo. + +
+VS Code + +
+ +Встановіть [розширення Kilo Code](vscode:extension/kilocode.kilo-code) напряму або завантажте його з [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Створіть обліковий запис і отримайте доступ до понад 500 моделей, зокрема GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 і Gemini 3.1 Pro Preview, усі за цінами постачальників. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Потім запустіть `kilo` у будь-якому каталозі проєкту. + +
+ +
+JetBrains + +
+ +Встановіть [плагін Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) з JetBrains Marketplace або знайдіть "Kilo Code" у `Settings → Plugins` у будь-якій JetBrains IDE. + +
+ +
+Cloud Agent + +
+ +Запускайте Kilo з вебу, без локальної машини, на [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Code Reviews + +
+ +Налаштуйте автоматичні AI-рев'ю коду для ваших pull request на [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Запустіть свого постійно активного AI-агента на [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Встановити CLI з GitHub Releases (бінарні файли) + +Завантажте найновіший бінарний файл зі [сторінки Releases](https://github.com/Kilo-Org/kilocode/releases). + +| Платформа | Файл | +|---|---| +| Windows (більшість ПК) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Примітки: `x64-baseline` — сумісна збірка для старих CPU без AVX. `musl` — статично зв'язана збірка для Alpine або мінімальних Docker-образів без glibc. `kilo-vscode-*.vsix` — пакет розширення VS Code, а не CLI. Архіви `Source code` призначені для збірки з вихідного коду. + +
+ +### Agents + +Kilo постачається зі спеціалізованими agents, між якими можна перемикатися залежно від завдання. Ви також можете створювати власні agents. + +- **Code** - Типовий. Реалізує та редагує код з природної мови. +- **Plan** - Проєктує архітектуру і пише плани реалізації до написання коду. +- **Ask** - Відповідає на запитання про кодову базу, не змінюючи файли. +- **Debug** - Діагностує та відстежує проблеми. +- **Review** - Переглядає ваші зміни та виявляє проблеми продуктивності, безпеки, стилю і покриття тестами. + +Дізнайтеся більше про [agents і власні agents](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Що він робить + +- **Генерація коду** з природної мови в кількох файлах. +- **Вбудоване автодоповнення** з ghost-text-підказками та прийняттям через Tab. +- **Самоперевірка**, щоб агент перевіряв і виправляв власну роботу. +- **Керування терміналом і браузером** для запуску команд і автоматизації вебу. +- **MCP marketplace** для пошуку й підключення MCP-серверів, які розширюють можливості агента. +- **Понад 500 моделей** з перемиканням під час завдання, щоб узгодити затримку, вартість і reasoning з роботою. + +### Автономний режим (CI/CD) + +Запустіть `kilo run` з `--auto` для повністю автономної роботи без prompts, створеної для CI/CD-пайплайнів: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` вимикає всі запити дозволів і дає агенту змогу виконувати будь-яку дію без підтвердження. Використовуйте лише в довірених середовищах. + +### Документація + +Для налаштування та всього іншого перегляньте [документацію](https://kilo.ai/docs). + +### Участь + +Ми вітаємо внески від розробників, авторів і всіх охочих. Почніть з [Contributing Guide](/CONTRIBUTING.md), щоб налаштувати середовище, ознайомитися зі стандартами коду та дізнатися, як відкрити pull request. Див. [RELEASING.md](../RELEASING.md) для процесу релізу розширення VS Code і CLI, а також [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) для плагіна JetBrains. + +Перед участю прочитайте наш [Code of Conduct](/CODE_OF_CONDUCT.md). + +### Ліцензія + +MIT. Ви можете використовувати, змінювати й поширювати цей код, зокрема комерційно, якщо зберігаєте зазначення авторства та ліцензійні повідомлення. Див. [License](/LICENSE). + +### FAQ + +
+Звідки взявся Kilo CLI? + +Kilo CLI — це fork [OpenCode](https://github.com/anomalyco/opencode), розширений для роботи в платформі agentic engineering Kilo. + +
+ +--- + +**Долучайтеся до спільноти** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.vi.md b/translations/README.vi.md new file mode 100644 index 00000000000..eea4a1cc139 --- /dev/null +++ b/translations/README.vi.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

Tác nhân lập trình mã nguồn mở để xây dựng với AI trong VS Code, JetBrains hoặc CLI.

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code là một tác nhân lập trình AI đồng hành với bạn ở mọi nơi bạn làm việc: [VS Code](https://kilo.ai/landing/vs-code), [JetBrains](https://kilo.ai/features/jetbrains-native) và [CLI](https://kilo.ai/cli). Dự án là mã nguồn mở với giá minh bạch. Bạn chọn trong hơn 500 mô hình, chuyển đổi giữa chúng giữa chừng một tác vụ và trả theo giá của nhà cung cấp mô hình, không có phụ phí. Không cần API key để bắt đầu. + +### Cài đặt + +Chọn nơi bạn muốn chạy Kilo. + +
+VS Code + +
+ +Cài trực tiếp [tiện ích Kilo Code](vscode:extension/kilocode.kilo-code), hoặc tải từ [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code). Tạo tài khoản và bạn sẽ có quyền truy cập hơn 500 mô hình, bao gồm GPT-5.5, Claude Opus 4.7, Claude Sonnet 4.6 và Gemini 3.1 Pro Preview, tất cả theo giá của nhà cung cấp. + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +Sau đó chạy `kilo` trong bất kỳ thư mục dự án nào để bắt đầu. + +
+ +
+JetBrains + +
+ +Cài [plugin Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) từ JetBrains Marketplace, hoặc tìm "Kilo Code" trong `Settings → Plugins` bên trong bất kỳ JetBrains IDE nào. + +
+ +
+Cloud Agent + +
+ +Chạy Kilo từ web, không cần máy cục bộ, tại [app.kilo.ai/cloud](https://app.kilo.ai/cloud). + +
+ +
+Code Reviews + +
+ +Thiết lập review code tự động bằng AI cho pull request của bạn tại [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews). + +
+ +
+KiloClaw + +
+ +Khởi chạy AI agent luôn hoạt động của bạn tại [app.kilo.ai/claw](https://app.kilo.ai/claw). + +
+ +
+Cài CLI từ GitHub Releases (binary) + +Tải binary mới nhất từ [trang Releases](https://github.com/Kilo-Org/kilocode/releases). + +| Nền tảng | Asset | +|---|---| +| Windows (hầu hết PC) | `kilo-windows-x64.zip` | +| macOS (Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS (Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +Ghi chú: `x64-baseline` là build tương thích cho CPU cũ không có AVX. `musl` là build liên kết tĩnh cho Alpine hoặc image Docker tối giản không có glibc. `kilo-vscode-*.vsix` là gói tiện ích VS Code, không phải CLI. Các archive `Source code` dùng để build từ mã nguồn. + +
+ +### Agents + +Kilo đi kèm các agents chuyên biệt để bạn chuyển đổi tùy theo tác vụ. Bạn cũng có thể tạo agents tùy chỉnh của riêng mình. + +- **Code** - Mặc định. Triển khai và chỉnh sửa code từ ngôn ngữ tự nhiên. +- **Plan** - Thiết kế kiến trúc và viết kế hoạch triển khai trước khi viết code. +- **Ask** - Trả lời câu hỏi về codebase mà không chạm vào file. +- **Debug** - Khắc phục và truy vết sự cố. +- **Review** - Review thay đổi của bạn và phát hiện vấn đề về hiệu năng, bảo mật, phong cách và độ phủ test. + +Tìm hiểu thêm về [agents và agents tùy chỉnh](https://kilo.ai/docs/code-with-ai/agents/using-agents). + +### Nó làm gì + +- **Sinh code** từ ngôn ngữ tự nhiên, trên nhiều file. +- **Tự động hoàn thành inline** với gợi ý ghost-text và Tab để chấp nhận. +- **Tự kiểm tra** để agent review và sửa công việc của chính nó. +- **Điều khiển terminal và trình duyệt** để chạy lệnh và tự động hóa web. +- **MCP marketplace** để tìm và kết nối MCP server mở rộng khả năng của agent. +- **Hơn 500 mô hình** với chuyển đổi giữa chừng tác vụ, để bạn khớp độ trễ, chi phí và reasoning với công việc. + +### Chế độ tự động (CI/CD) + +Chạy `kilo run` với `--auto` để hoạt động hoàn toàn tự động không có prompts, dành cho pipeline CI/CD: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` tắt mọi prompt xin quyền và cho phép agent thực hiện bất kỳ hành động nào mà không cần xác nhận. Chỉ dùng trong môi trường đáng tin cậy. + +### Tài liệu + +Về cấu hình và mọi thứ khác, hãy xem [tài liệu](https://kilo.ai/docs). + +### Đóng góp + +Chúng tôi chào đón đóng góp từ developer, writer và tất cả mọi người. Bắt đầu với [Contributing Guide](/CONTRIBUTING.md) để thiết lập môi trường, tiêu chuẩn code và cách mở pull request. Xem [RELEASING.md](../RELEASING.md) cho quy trình release tiện ích VS Code và CLI, và [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md) cho plugin JetBrains. + +Vui lòng đọc [Code of Conduct](/CODE_OF_CONDUCT.md) trước khi tham gia. + +### License + +MIT. Bạn có thể sử dụng, chỉnh sửa và phân phối code này, kể cả cho mục đích thương mại, miễn là giữ lại thông tin ghi nhận và thông báo license. Xem [License](/LICENSE). + +### FAQ + +
+Kilo CLI đến từ đâu? + +Kilo CLI là một fork của [OpenCode](https://github.com/anomalyco/opencode), được cải tiến để hoạt động trong nền tảng Kilo agentic engineering. + +
+ +--- + +**Tham gia cộng đồng** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.zh.md b/translations/README.zh.md new file mode 100644 index 00000000000..24f41461e76 --- /dev/null +++ b/translations/README.zh.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

用于在 VS Code、JetBrains 或 CLI 中借助 AI 构建的开源编码代理。

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code 是一个 AI 编码代理,可以在你工作的任何地方使用:[VS Code](https://kilo.ai/landing/vs-code)、[JetBrains](https://kilo.ai/features/jetbrains-native) 和 [CLI](https://kilo.ai/cli)。它是开源的,并采用开放定价。你可以从 500 多个模型中选择,在任务中途切换模型,并按模型提供商的价格付费,没有加价。开始使用无需 API 密钥。 + +### 安装 + +选择你想运行 Kilo 的位置。 + +
+VS Code + +
+ +直接安装 [Kilo Code 扩展](vscode:extension/kilocode.kilo-code),或从 [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) 获取。创建账户后,你可以按提供商价格访问 500 多个模型,包括 GPT-5.5、Claude Opus 4.7、Claude Sonnet 4.6 和 Gemini 3.1 Pro Preview。 + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +然后在任意项目目录中运行 `kilo` 即可开始。 + +
+ +
+JetBrains + +
+ +从 JetBrains Marketplace 安装 [Kilo Code 插件](https://plugins.jetbrains.com/plugin/28350-kilo-code),或在任意 JetBrains IDE 的 `Settings → Plugins` 中搜索 "Kilo Code"。 + +
+ +
+Cloud Agent + +
+ +无需本地机器,在 Web 上通过 [app.kilo.ai/cloud](https://app.kilo.ai/cloud) 运行 Kilo。 + +
+ +
+代码审查 + +
+ +在 [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) 为你的 Pull Request 设置自动 AI 代码审查。 + +
+ +
+KiloClaw + +
+ +在 [app.kilo.ai/claw](https://app.kilo.ai/claw) 启动你的常驻 AI 代理。 + +
+ +
+从 GitHub Releases 安装 CLI(二进制文件) + +从 [Releases 页面](https://github.com/Kilo-Org/kilocode/releases) 下载最新二进制文件。 + +| 平台 | 资源 | +|---|---| +| Windows(大多数 PC) | `kilo-windows-x64.zip` | +| macOS(Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS(Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +说明:`x64-baseline` 是面向不支持 AVX 的旧 CPU 的兼容构建。`musl` 是面向 Alpine 或无 glibc 的极简 Docker 镜像的静态链接构建。`kilo-vscode-*.vsix` 是 VS Code 扩展包,不是 CLI。`Source code` 压缩包用于从源码构建。 + +
+ +### Agents + +Kilo 内置了可按任务切换的专用 Agents。你也可以构建自己的自定义 Agents。 + +- **Code** - 默认模式。根据自然语言实现和编辑代码。 +- **Plan** - 在编写任何代码之前设计架构并编写实现计划。 +- **Ask** - 回答有关代码库的问题,不修改任何文件。 +- **Debug** - 排查并追踪问题。 +- **Review** - 审查你的更改,并从性能、安全、风格和测试覆盖率等方面发现问题。 + +了解更多关于 [agents 和自定义 agents](https://kilo.ai/docs/code-with-ai/agents/using-agents) 的信息。 + +### 功能 + +- **代码生成**:基于自然语言跨多个文件生成代码。 +- **内联自动补全**:提供 ghost-text 建议,按 Tab 接受。 +- **自检**:让代理审查并修正自己的工作。 +- **终端和浏览器控制**:运行命令并自动化网页操作。 +- **MCP 市场**:查找并连接 MCP 服务器,扩展代理能力。 +- **500 多个模型**:支持任务中途切换,让你根据延迟、成本和推理能力匹配任务。 + +### 自主模式(CI/CD) + +使用 `--auto` 运行 `kilo run`,可在 CI/CD 流水线中实现无提示的完全自主操作: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` 会禁用所有权限提示,并允许代理在无需确认的情况下执行任何操作。仅在可信环境中使用。 + +### 文档 + +关于配置和其他内容,请查看[文档](https://kilo.ai/docs)。 + +### 贡献 + +欢迎开发者、写作者以及所有人参与贡献。请先阅读 [Contributing Guide](/CONTRIBUTING.md),了解环境设置、编码标准以及如何创建 Pull Request。VS Code 扩展和 CLI 的发布流程请参阅 [RELEASING.md](../RELEASING.md),JetBrains 插件请参阅 [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md)。 + +参与前请阅读我们的 [Code of Conduct](/CODE_OF_CONDUCT.md)。 + +### 许可证 + +MIT。你可以使用、修改和分发此代码,包括商业用途,只要保留署名和许可证声明。参见 [License](/LICENSE)。 + +### FAQ + +
+Kilo CLI 从哪里来? + +Kilo CLI 是 [OpenCode](https://github.com/anomalyco/opencode) 的一个 fork,并增强为可在 Kilo agentic engineering 平台中使用。 + +
+ +--- + +**加入社区** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) diff --git a/translations/README.zht.md b/translations/README.zht.md new file mode 100644 index 00000000000..7af654b3a50 --- /dev/null +++ b/translations/README.zht.md @@ -0,0 +1,177 @@ +

+ English | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | 日本語 | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | Українська | বাংলা | Ελληνικά | Tiếng Việt +

+ +

+ Kilo Code logo +

+ +

用於在 VS Code、JetBrains 或 CLI 中運用 AI 建構的開源編碼代理。

+ +

+ VS Code Marketplace + npm + X (Twitter) + Blog + Discord + Reddit +

+ +![Kilo-in-VS-Code-and-CLI](https://github.com/user-attachments/assets/0536ca59-ed81-4512-9e05-d186187a1b52) + +--- + +Kilo Code 是一個 AI 編碼代理,可在你工作的任何地方使用:[VS Code](https://kilo.ai/landing/vs-code)、[JetBrains](https://kilo.ai/features/jetbrains-native) 和 [CLI](https://kilo.ai/cli)。它是開源專案,並採用開放定價。你可以從 500 多個模型中選擇,在任務中途切換模型,並按模型供應商的價格付費,沒有加價。開始使用不需要 API 金鑰。 + +### 安裝 + +選擇你想執行 Kilo 的位置。 + +
+VS Code + +
+ +直接安裝 [Kilo Code 擴充功能](vscode:extension/kilocode.kilo-code),或從 [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=kilocode.Kilo-Code) 取得。建立帳戶後,你可以按供應商價格使用 500 多個模型,包括 GPT-5.5、Claude Opus 4.7、Claude Sonnet 4.6 和 Gemini 3.1 Pro Preview。 + +
+ +
+CLI + +
+ +```bash +# npm +npm install -g @kilocode/cli + +# curl +curl -fsSL https://kilo.ai/cli/install | bash + +# pnpm +pnpm add -g @kilocode/cli + +# bun +bun add -g @kilocode/cli + +# Homebrew (macOS / Linux) +brew install Kilo-Org/tap/kilo + +# Arch Linux (AUR) +paru -S kilo-bin +``` + +然後在任何專案目錄中執行 `kilo` 即可開始。 + +
+ +
+JetBrains + +
+ +從 JetBrains Marketplace 安裝 [Kilo Code 外掛](https://plugins.jetbrains.com/plugin/28350-kilo-code),或在任何 JetBrains IDE 的 `Settings → Plugins` 中搜尋 "Kilo Code"。 + +
+ +
+Cloud Agent + +
+ +無需本機電腦,在 Web 上透過 [app.kilo.ai/cloud](https://app.kilo.ai/cloud) 執行 Kilo。 + +
+ +
+程式碼審查 + +
+ +在 [app.kilo.ai/code-reviews](https://app.kilo.ai/code-reviews) 為你的 Pull Request 設定自動 AI 程式碼審查。 + +
+ +
+KiloClaw + +
+ +在 [app.kilo.ai/claw](https://app.kilo.ai/claw) 啟動你的常駐 AI 代理。 + +
+ +
+從 GitHub Releases 安裝 CLI(二進位檔) + +從 [Releases 頁面](https://github.com/Kilo-Org/kilocode/releases) 下載最新二進位檔。 + +| 平台 | 資源 | +|---|---| +| Windows(大多數 PC) | `kilo-windows-x64.zip` | +| macOS(Apple Silicon) | `kilo-darwin-arm64.zip` | +| macOS(Intel) | `kilo-darwin-x64.zip` | +| Linux x64 | `kilo-linux-x64.tar.gz` | +| Linux ARM | `kilo-linux-arm64.tar.gz` | + +注意:`x64-baseline` 是面向不支援 AVX 的舊 CPU 的相容性建置。`musl` 是面向 Alpine 或沒有 glibc 的極簡 Docker 映像的靜態連結建置。`kilo-vscode-*.vsix` 是 VS Code 擴充功能套件,不是 CLI。`Source code` 封存檔用於從原始碼建置。 + +
+ +### Agents + +Kilo 內建可依任務切換的專用 Agents。你也可以建立自己的自訂 Agents。 + +- **Code** - 預設。根據自然語言實作和編輯程式碼。 +- **Plan** - 在撰寫任何程式碼之前設計架構並撰寫實作計畫。 +- **Ask** - 回答關於程式碼庫的問題,不修改任何檔案。 +- **Debug** - 疑難排解並追蹤問題。 +- **Review** - 審查你的變更,並找出效能、安全性、風格和測試覆蓋率方面的問題。 + +深入了解 [agents 和自訂 agents](https://kilo.ai/docs/code-with-ai/agents/using-agents)。 + +### 功能 + +- **程式碼產生**:以自然語言跨多個檔案產生程式碼。 +- **行內自動完成**:提供 ghost-text 建議,按 Tab 接受。 +- **自我檢查**:讓代理審查並修正自己的工作。 +- **終端機和瀏覽器控制**:執行命令並自動化網頁操作。 +- **MCP 市集**:尋找並連接 MCP 伺服器,擴充代理能力。 +- **500 多個模型**:支援任務中途切換,讓你根據延遲、成本和推理能力匹配任務。 + +### 自主模式(CI/CD) + +使用 `--auto` 執行 `kilo run`,可在 CI/CD 管線中進行無提示的完全自主操作: + +```bash +kilo run --auto "run tests and fix any failures" +``` + +`--auto` 會停用所有權限提示,並允許代理在無需確認的情況下執行任何操作。僅在可信任環境中使用。 + +### 文件 + +關於設定和其他內容,請查看[文件](https://kilo.ai/docs)。 + +### 貢獻 + +歡迎開發者、作者以及所有人參與貢獻。請先閱讀 [Contributing Guide](/CONTRIBUTING.md),了解環境設定、程式碼標準以及如何建立 Pull Request。VS Code 擴充功能和 CLI 的發布流程請參閱 [RELEASING.md](../RELEASING.md),JetBrains 外掛請參閱 [packages/kilo-jetbrains/RELEASING.md](../packages/kilo-jetbrains/RELEASING.md)。 + +參與前請閱讀我們的 [Code of Conduct](/CODE_OF_CONDUCT.md)。 + +### 授權 + +MIT。你可以使用、修改和散布此程式碼,包括商業用途,只要保留署名和授權聲明。請參閱 [License](/LICENSE)。 + +### FAQ + +
+Kilo CLI 從何而來? + +Kilo CLI 是 [OpenCode](https://github.com/anomalyco/opencode) 的 fork,並增強為可在 Kilo agentic engineering 平台中使用。 + +
+ +--- + +**加入社群** [Discord](https://kilo.ai/discord) | [X](https://x.com/kilocode) | [Reddit](https://www.reddit.com/r/kilocode/) From 1111d42ee5566c4e8a5ab6be35ddbef572383fbe Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Fri, 26 Jun 2026 10:56:35 +0200 Subject: [PATCH 07/25] chore: show german translation diffs --- .gitattributes | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index a53ef3c352f..4333d8bd396 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10,15 +10,19 @@ packages/kilo-ui/tests/**/*.png filter=lfs diff=lfs merge=lfs -text packages/kilo-vscode/tests/**/*.png filter=lfs diff=lfs merge=lfs -text packages/kilo-docs/public/img/screenshot-tests/**/*.png filter=lfs diff=lfs merge=lfs -text -# Hide non-English localization files by default in GitHub PR diffs. +# Hide localization files except English and German by default in GitHub PR diffs. **/i18n/*.ts linguist-generated=true **/i18n/en.ts linguist-generated=false **/i18n/en*.ts linguist-generated=false +**/i18n/de.ts linguist-generated=false +**/i18n/de*.ts linguist-generated=false **/i18n/package-nls-en.ts linguist-generated=false +**/i18n/package-nls-de.ts linguist-generated=false **/i18n/index.ts linguist-generated=false **/i18n/parity.test.ts linguist-generated=false packages/kilo-i18n/src/*.ts linguist-generated=true packages/kilo-i18n/src/en.ts linguist-generated=false +packages/kilo-i18n/src/de.ts linguist-generated=false # Auto-generated CLI reference docs packages/kilo-docs/markdoc/partials/cli-commands-table.md linguist-generated=true From 61582a843574134b25e4a71aac764aa0fd00c632 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Fri, 26 Jun 2026 11:09:01 +0200 Subject: [PATCH 08/25] chore: clarify german diff visibility --- .gitattributes | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitattributes b/.gitattributes index 4333d8bd396..792c880ab15 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10,7 +10,8 @@ packages/kilo-ui/tests/**/*.png filter=lfs diff=lfs merge=lfs -text packages/kilo-vscode/tests/**/*.png filter=lfs diff=lfs merge=lfs -text packages/kilo-docs/public/img/screenshot-tests/**/*.png filter=lfs diff=lfs merge=lfs -text -# Hide localization files except English and German by default in GitHub PR diffs. +# Hide most localization files by default in GitHub PR diffs. Show English as the source +# language and German so reviewers can catch untranslated copy-pasted English strings. **/i18n/*.ts linguist-generated=true **/i18n/en.ts linguist-generated=false **/i18n/en*.ts linguist-generated=false From 90b6b2e09895d6e8618a63db1e595f4858413ef3 Mon Sep 17 00:00:00 2001 From: markijbema <624143+markijbema@users.noreply.github.com> Date: Fri, 26 Jun 2026 12:04:35 +0000 Subject: [PATCH 09/25] test(jetbrains): stabilize workspace reload lifecycle Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- .../workspace/KiloBackendWorkspaceTest.kt | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/workspace/KiloBackendWorkspaceTest.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/workspace/KiloBackendWorkspaceTest.kt index 44c2330303e..12a93f2b200 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/workspace/KiloBackendWorkspaceTest.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/workspace/KiloBackendWorkspaceTest.kt @@ -12,13 +12,16 @@ import ai.kilocode.backend.testing.MockCliServer import ai.kilocode.backend.testing.TestLog import ai.kilocode.jetbrains.api.client.DefaultApi import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.cancel import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.drop import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -39,11 +42,12 @@ class KiloBackendWorkspaceTest { private val apps = mutableListOf() @AfterTest - fun tearDown() { + fun tearDown() = runBlocking { apps.forEach { it.dispose() } apps.clear() scope.cancel() mock.close() + withTimeout(10_000) { scope.coroutineContext[Job]?.join() } } private fun setup(): KiloBackendAppService = @@ -458,7 +462,7 @@ class KiloBackendWorkspaceTest { mock.skills = SKILLS_JSON val app = setup() - ready(app) + val initial = ready(app) // Change providers response then fire disposed event mock.providers = """{ @@ -474,26 +478,16 @@ class KiloBackendWorkspaceTest { "connected": ["openai"] }""" - mock.awaitSseConnection() - mock.pushEvent("global.disposed", """{"type":"global.disposed"}""") - - // global.disposed triggers full app reload which restarts the - // workspace manager (stop + start), clearing all cached workspaces. - // Wait for app to reach Ready again after reload. - withTimeout(15_000) { - // App may briefly leave Ready during reload - while (true) { - val state = app.appState.value - if (state is KiloAppState.Ready) { - delay(300) - if (app.appState.value is KiloAppState.Ready) break - } - delay(100) - } + assertTrue(mock.awaitSseConnection()) + val reload = async(start = CoroutineStart.UNDISPATCHED) { + app.appState.drop(1).first { it is KiloAppState.Ready } } + mock.pushEvent("global.disposed", """{"type":"global.disposed"}""") + withTimeout(15_000) { reload.await() } // Get a fresh workspace — old one was stopped during reload val ws = app.workspaces.get("/test/project") + assertTrue(ws !== initial) withTimeout(15_000) { ws.state.first { it is KiloWorkspaceState.Ready } } From f6ca368235934f13a5caca7bde9c9ae34d4b3f23 Mon Sep 17 00:00:00 2001 From: markijbema <624143+markijbema@users.noreply.github.com> Date: Fri, 26 Jun 2026 12:11:46 +0000 Subject: [PATCH 10/25] fix(jetbrains): expose void teardown to JUnit Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- .../backend/workspace/KiloBackendWorkspaceTest.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/workspace/KiloBackendWorkspaceTest.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/workspace/KiloBackendWorkspaceTest.kt index 12a93f2b200..1f7a16a0731 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/workspace/KiloBackendWorkspaceTest.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/workspace/KiloBackendWorkspaceTest.kt @@ -42,12 +42,14 @@ class KiloBackendWorkspaceTest { private val apps = mutableListOf() @AfterTest - fun tearDown() = runBlocking { - apps.forEach { it.dispose() } - apps.clear() - scope.cancel() - mock.close() - withTimeout(10_000) { scope.coroutineContext[Job]?.join() } + fun tearDown() { + runBlocking { + apps.forEach { it.dispose() } + apps.clear() + scope.cancel() + mock.close() + withTimeout(10_000) { scope.coroutineContext[Job]?.join() } + } } private fun setup(): KiloBackendAppService = From 4e2fb78a0d6bd11c5445117faeed8c7fb2266f0a Mon Sep 17 00:00:00 2001 From: markijbema <624143+markijbema@users.noreply.github.com> Date: Fri, 26 Jun 2026 12:20:51 +0000 Subject: [PATCH 11/25] test(jetbrains): await mock server shutdown Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- .../src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt index f9380d9c897..9d6a37780e1 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt @@ -221,6 +221,7 @@ class MockCliServer : AutoCloseable { if (!closed.compareAndSet(false, true)) return shutdownServer() executor.shutdownNow() + check(executor.awaitTermination(5, TimeUnit.SECONDS)) { "Mock CLI executor did not terminate" } } private fun shutdownServer() { From 3ae6d2b087cbf8ad4712640d767059dbbebbb318 Mon Sep 17 00:00:00 2001 From: markijbema <624143+markijbema@users.noreply.github.com> Date: Fri, 26 Jun 2026 12:30:38 +0000 Subject: [PATCH 12/25] test(jetbrains): serve mock requests on virtual threads Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- .../test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt index 9d6a37780e1..77e7d766b3d 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt @@ -157,9 +157,7 @@ class MockCliServer : AutoCloseable { /** Reset all request counters. */ fun resetCounts() { counts.clear() } - private val executor = Executors.newCachedThreadPool { r -> - Thread(r, "mock-cli-${Thread.currentThread().id}").apply { isDaemon = true } - } + private val executor = Executors.newVirtualThreadPerTaskExecutor() private val closed = AtomicBoolean(false) private var server: ServerSocket? = null From d2dff8844d1d93430514c0cd9809ddd9af7385d7 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Tue, 23 Jun 2026 17:36:35 -0400 Subject: [PATCH 13/25] fix(vscode): show full external permission paths --- .changeset/show-external-permission-paths.md | 5 ++++ ...al-dir-expanded-pending-chromium-linux.png | 4 ++-- ...ssion-dock-external-dir-chromium-linux.png | 4 ++-- .../tests/permission-dock-dropdown.spec.ts | 15 ++++++++++++ .../src/components/chat/PermissionDock.tsx | 22 +++++++++++++++--- .../src/stories/composite.stories.tsx | 6 ++--- .../webview-ui/src/styles/permission-dock.css | 23 +++++++++++++++++++ 7 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 .changeset/show-external-permission-paths.md diff --git a/.changeset/show-external-permission-paths.md b/.changeset/show-external-permission-paths.md new file mode 100644 index 00000000000..1061c6ce960 --- /dev/null +++ b/.changeset/show-external-permission-paths.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Show full external directory paths in permission auto-approve rules. diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/permission-dock-dropdown/external-dir-expanded-pending-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/permission-dock-dropdown/external-dir-expanded-pending-chromium-linux.png index c007e6d7330..ef51b5f9772 100644 --- a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/permission-dock-dropdown/external-dir-expanded-pending-chromium-linux.png +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/permission-dock-dropdown/external-dir-expanded-pending-chromium-linux.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:af33f5d026513422db6efc37848eec76d9da511432e5933606ae0be73da684f8 -size 16675 +oid sha256:6ee59e48c176043eee3b22441ce1c50e8d17dbafe58e969cfc8e97f404f2608d +size 17429 diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/composite-webview/permission-dock-external-dir-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/composite-webview/permission-dock-external-dir-chromium-linux.png index ddc01144048..8e7f7d1e283 100644 --- a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/composite-webview/permission-dock-external-dir-chromium-linux.png +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/composite-webview/permission-dock-external-dir-chromium-linux.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:61b1d0bc725e3b33a40d1d777d71b70afcec1b6cdcfae15e2023667bc4574f23 -size 17201 +oid sha256:5c4f1492f44da109debc1fc09195eac2a02a20cb211ee45b6651f81478d66b1a +size 71547 diff --git a/packages/kilo-vscode/tests/permission-dock-dropdown.spec.ts b/packages/kilo-vscode/tests/permission-dock-dropdown.spec.ts index 4c02a47eeea..ac94c151cc1 100644 --- a/packages/kilo-vscode/tests/permission-dock-dropdown.spec.ts +++ b/packages/kilo-vscode/tests/permission-dock-dropdown.spec.ts @@ -211,6 +211,21 @@ test.describe("Permission Dock Dropdown — external directory", () => { await page.waitForSelector("#storybook-root *", { state: "attached" }) await openDropdown(page) + const text = "Read External Directory /Users/developer/projects/kilo-bench/dashboard/app/routes/*" + const hint = page.locator('[data-slot="permission-hint"]') + await expect(hint).toHaveText(text) + await expect(hint).toHaveAttribute("title", text) + expect( + await hint.evaluate((node) => node.scrollWidth > node.clientWidth || node.scrollHeight > node.clientHeight), + ).toBe(false) + + const rule = page.locator('[data-slot="permission-rule"]') + await expect(rule).toHaveText(text) + await expect(rule).toHaveAttribute("title", text) + expect( + await rule.evaluate((node) => node.scrollWidth > node.clientWidth || node.scrollHeight > node.clientHeight), + ).toBe(false) + const root = page.locator("#storybook-root") await expect(root).toHaveScreenshot(["permission-dock-dropdown", "external-dir-expanded-pending.png"]) }) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/PermissionDock.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/PermissionDock.tsx index 1ebfa00ccc6..bfb93ffdd84 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/PermissionDock.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/PermissionDock.tsx @@ -48,6 +48,8 @@ export const PermissionDock: Component<{ // Normalize IDN/Unicode hostnames to punycode ASCII to prevent homograph attacks. return normalizeUrls(cmd) } + const text = (rule: string) => (command() ? label(rule) : describeRule(props.request.toolName, rule, language.t)) + const external = () => props.request.toolName === "external_directory" const cmdDescription = () => { const val = props.request.args?.description return typeof val === "string" && val.length > 0 ? val : undefined @@ -248,8 +250,13 @@ export const PermissionDock: Component<{ - - {command() ? label(rule) : describeRule(props.request.toolName, rule, language.t)} + + + + {language.t("ui.permission.toolLabel.externalDirectory")}{" "} + + {rule} + )} @@ -268,7 +275,16 @@ export const PermissionDock: Component<{ const desc = description() if (!desc) return !command() && toolDescription() ?
{toolDescription()}
: null - if (desc.kind === "single") return
{desc.text}
+ if (desc.kind === "single") + return ( +
+ {desc.text} +
+ ) return (
{desc.title} diff --git a/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx b/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx index 6f7a88349ce..7a7bb904032 100644 --- a/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx +++ b/packages/kilo-vscode/webview-ui/src/stories/composite.stories.tsx @@ -958,9 +958,9 @@ const externalDirPermission: PermissionRequest = { id: "perm-extdir-001", sessionID: SESSION_ID, toolName: "external_directory", - patterns: ["/home/user/other-project/*"], - always: ["/home/user/other-project/*"], - args: { filepath: "/home/user/other-project/config.json" }, + patterns: ["/Users/developer/projects/kilo-bench/dashboard/app/routes/*"], + always: ["/Users/developer/projects/kilo-bench/dashboard/app/routes/*"], + args: { filepath: "/Users/developer/projects/kilo-bench/dashboard/app/routes/index.tsx" }, tool: { messageID: ASST_MSG_ID, callID: "call-extdir-001" }, } diff --git a/packages/kilo-vscode/webview-ui/src/styles/permission-dock.css b/packages/kilo-vscode/webview-ui/src/styles/permission-dock.css index 08490df93f4..686a14cacc0 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/permission-dock.css +++ b/packages/kilo-vscode/webview-ui/src/styles/permission-dock.css @@ -109,6 +109,11 @@ [data-slot="permission-hint"] { font-size: var(--kilo-font-size-12); + + &[data-wrap] { + overflow-wrap: anywhere; + word-break: normal; + } } [data-slot="permission-patterns"] { @@ -316,6 +321,24 @@ white-space: nowrap; min-width: 0; flex: 1; + + &[data-wrap] { + display: flex; + flex-direction: column; + align-items: flex-start; + overflow: visible; + text-overflow: clip; + white-space: normal; + word-break: normal; + } + } + + [data-slot="permission-rule-label"] { + color: var(--text-base, var(--vscode-foreground)); + } + + [data-slot="permission-rule-path"] { + overflow-wrap: anywhere; } [data-slot="permission-rule-actions"] { From 88571dca138606f4db4b8cf5b708f0874e6ee2d4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 23 Jun 2026 21:44:04 +0000 Subject: [PATCH 14/25] chore: update kilo-vscode visual regression baselines --- .../permission-dock-external-dir-chromium-linux.png | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/composite-webview/permission-dock-external-dir-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/composite-webview/permission-dock-external-dir-chromium-linux.png index 8e7f7d1e283..72c72e77131 100644 --- a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/composite-webview/permission-dock-external-dir-chromium-linux.png +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/composite-webview/permission-dock-external-dir-chromium-linux.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5c4f1492f44da109debc1fc09195eac2a02a20cb211ee45b6651f81478d66b1a -size 71547 +oid sha256:6f05d9512bbe3309c6d073fd8aca8e0800c7e2827bdefe6115e636e8a6e94070 +size 16239 From b622ed043798154374724f2ad80c57f6e7935820 Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Fri, 26 Jun 2026 15:03:12 -0400 Subject: [PATCH 15/25] test(core): isolate remote normalization fixture --- packages/core/test/project.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/test/project.test.ts b/packages/core/test/project.test.ts index 9980f65e547..db408f52271 100644 --- a/packages/core/test/project.test.ts +++ b/packages/core/test/project.test.ts @@ -119,14 +119,14 @@ describe("ProjectV2.resolve", () => { Effect.promise(() => tmpdir()), (tmp) => Effect.promise(() => tmp[Symbol.asyncDispose]()), ) - yield* Effect.promise(() => initRepo(ssh.path, { commit: true, remote: "git@github.com:owner/repo.git" })) - yield* Effect.promise(() => initRepo(https.path, { commit: true, remote: "https://github.com/owner/repo.git" })) + yield* Effect.promise(() => initRepo(ssh.path, { commit: true, remote: "git@example.com:owner/repo.git" })) + yield* Effect.promise(() => initRepo(https.path, { commit: true, remote: "https://example.com/owner/repo.git" })) const project = yield* Project.Service const a = yield* project.resolve(abs(ssh.path)) const b = yield* project.resolve(abs(https.path)) - expect(a.id).toBe(remoteID("github.com/owner/repo")) + expect(a.id).toBe(remoteID("example.com/owner/repo")) expect(b.id).toBe(a.id) }), ) From ba4b693e9d54582eb2b2b6769feef0e37544003d Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Fri, 26 Jun 2026 16:52:33 -0400 Subject: [PATCH 16/25] fix(vscode): preserve global permission labels --- packages/kilo-vscode/tests/unit/permission-description.test.ts | 1 + .../webview-ui/src/components/chat/PermissionDock.tsx | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/kilo-vscode/tests/unit/permission-description.test.ts b/packages/kilo-vscode/tests/unit/permission-description.test.ts index d67145ed20c..b9cff740003 100644 --- a/packages/kilo-vscode/tests/unit/permission-description.test.ts +++ b/packages/kilo-vscode/tests/unit/permission-description.test.ts @@ -181,6 +181,7 @@ describe("describeRule", () => { test("preserves existing permission rule labels", () => { expect(describeRule("read", "*", t)).toBe("Read") + expect(describeRule("external_directory", "*", t)).toBe("Read External Directory") expect(describeRule("read", "src/app.ts", t)).toBe("Read src/app.ts") }) }) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/PermissionDock.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/PermissionDock.tsx index bfb93ffdd84..8f142249048 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/PermissionDock.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/PermissionDock.tsx @@ -251,7 +251,7 @@ export const PermissionDock: Component<{
- + {language.t("ui.permission.toolLabel.externalDirectory")}{" "} From 6d25c1bb16d6b7669745288f709a46117857c08d Mon Sep 17 00:00:00 2001 From: Josh Lambert Date: Fri, 26 Jun 2026 19:43:06 -0400 Subject: [PATCH 17/25] fix(cli): allow importing cloud-only sessions --- .changeset/import-cloud-session-first.md | 5 ++ packages/opencode/src/cli/cmd/tui/thread.ts | 4 +- .../src/kilocode/cli/cmd/tui/thread.ts | 4 +- .../opencode/src/kilocode/cloud-session.ts | 4 ++ .../test/kilocode/cli/tui/thread.test.ts | 56 ++++++++++++++++++- 5 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 .changeset/import-cloud-session-first.md diff --git a/.changeset/import-cloud-session-first.md b/.changeset/import-cloud-session-first.md new file mode 100644 index 00000000000..b2e0accef86 --- /dev/null +++ b/.changeset/import-cloud-session-first.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Allow the default TUI to import cloud-only sessions without rejecting their IDs as missing locally. diff --git a/packages/opencode/src/cli/cmd/tui/thread.ts b/packages/opencode/src/cli/cmd/tui/thread.ts index 3e51d78e28e..7e6d22721a4 100644 --- a/packages/opencode/src/cli/cmd/tui/thread.ts +++ b/packages/opencode/src/cli/cmd/tui/thread.ts @@ -13,7 +13,7 @@ import { Filesystem } from "@/util/filesystem" import type { GlobalEvent } from "@kilocode/sdk/v2" import type { EventSource } from "./context/sdk" import { win32DisableProcessedInput, win32InstallCtrlCGuard } from "./win32" -import { importCloudSession, validateCloudFork } from "@/kilocode/cloud-session" // kilocode_change +import { importCloudSession, localSessionID, validateCloudFork } from "@/kilocode/cloud-session" // kilocode_change import { createKiloClient } from "@kilocode/sdk/v2" // kilocode_change import { writeHeapSnapshot } from "v8" import { TuiConfig } from "./config/tui" @@ -319,7 +319,7 @@ export const TuiThreadCommand = cmd({ try { await validateSession({ url: transport.url, // kilocode_change - sessionID: args.session, + sessionID: localSessionID(args), // kilocode_change directory: cwd, fetch: transport.fetch, }) diff --git a/packages/opencode/src/kilocode/cli/cmd/tui/thread.ts b/packages/opencode/src/kilocode/cli/cmd/tui/thread.ts index cc0a86285cc..9b18b8315a9 100644 --- a/packages/opencode/src/kilocode/cli/cmd/tui/thread.ts +++ b/packages/opencode/src/kilocode/cli/cmd/tui/thread.ts @@ -3,7 +3,7 @@ import type { NetworkOptions } from "@/cli/network" import { errorMessage } from "@/util/error" import { TuiConfig } from "@/cli/cmd/tui/config/tui" import { validateSession } from "@/cli/cmd/tui/validate-session" -import { importCloudSession } from "@/kilocode/cloud-session" +import { importCloudSession, localSessionID } from "@/kilocode/cloud-session" import { DaemonClient } from "@/kilocode/daemon/client" import { createKiloClient } from "@kilocode/sdk/v2" @@ -55,7 +55,7 @@ export namespace KiloTuiThreadDaemon { try { await validateSession({ url: daemon.url, - sessionID: input.args.session, + sessionID: localSessionID(input.args), directory: input.cwd, headers: daemon.headers, }) diff --git a/packages/opencode/src/kilocode/cloud-session.ts b/packages/opencode/src/kilocode/cloud-session.ts index 3751b7c82a1..28e7899472a 100644 --- a/packages/opencode/src/kilocode/cloud-session.ts +++ b/packages/opencode/src/kilocode/cloud-session.ts @@ -13,6 +13,10 @@ export function validateCloudFork(args: { if (!args.session) return "--cloud-fork requires --session" } +export function localSessionID(args: { cloudFork?: boolean; session?: string }) { + return args.cloudFork ? undefined : args.session +} + /** * Import a cloud session to local storage and return the new local session ID. * Wraps the SDK's `.kilo.cloud.session.import()` which returns `unknown` due to diff --git a/packages/opencode/test/kilocode/cli/tui/thread.test.ts b/packages/opencode/test/kilocode/cli/tui/thread.test.ts index ba692626ca8..d75a75c2b57 100644 --- a/packages/opencode/test/kilocode/cli/tui/thread.test.ts +++ b/packages/opencode/test/kilocode/cli/tui/thread.test.ts @@ -1,8 +1,10 @@ -import { describe, expect, test } from "bun:test" +import { describe, expect, spyOn, test } from "bun:test" import fs from "fs/promises" import path from "path" import { tmpdir } from "../../../fixture/fixture" import { resolveThreadDirectory } from "../../../../src/cli/cmd/tui/thread" +import { KiloTuiThreadDaemon } from "../../../../src/kilocode/cli/cmd/tui/thread" +import { DaemonClient } from "../../../../src/kilocode/daemon/client" describe("kilo tui thread", () => { test("ignores stale PWD after cwd is changed by a process wrapper", async () => { @@ -28,4 +30,56 @@ describe("kilo tui thread", () => { else process.env.KILO_DEV_CWD = prev } }) + + test("skips local validation before importing cloud sessions", async () => { + await using root = await tmpdir() + const cloud = "ses_cloud" + const local = "ses_local" + const calls: string[] = [] + const opened: Array = [] + using server = Bun.serve({ + port: 0, + fetch(request) { + const route = `${request.method} ${new URL(request.url).pathname}` + calls.push(route) + if (route === "POST /kilo/cloud/session/import") return Response.json({ id: local }) + return new Response(null, { status: 404 }) + }, + }) + const url = new URL(server.url) + const daemon = spyOn(DaemonClient, "maybe").mockResolvedValue({ + url: url.origin, + headers: {}, + state: { + pid: process.pid, + hostname: url.hostname, + port: Number(url.port), + url: url.origin, + username: "kilo", + password: "test", + token: "test", + version: "test", + startedAt: new Date().toISOString(), + log: path.join(root.path, "daemon.log"), + }, + }) + const args = { port: 0, hostname: "127.0.0.1", mdns: false, "mdns-domain": "kilo.local", cors: [] } + const start: Parameters[0]["start"] = async (input) => { + opened.push(input.args.sessionID) + } + + try { + await KiloTuiThreadDaemon.attach({ + args: { ...args, session: cloud, cloudFork: true }, + cwd: root.path, + input: async () => undefined, + start, + }) + + expect(calls).toEqual(["POST /kilo/cloud/session/import"]) + expect(opened).toEqual([local]) + } finally { + daemon.mockRestore() + } + }) }) From e7db09ed84b4c2ebee5791fc0aab3034d82f65b1 Mon Sep 17 00:00:00 2001 From: markijbema <624143+markijbema@users.noreply.github.com> Date: Tue, 23 Jun 2026 18:34:21 +0000 Subject: [PATCH 18/25] fix(vscode): improve autocomplete error messages to cover BYOK and credits scenarios Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com> --- .changeset/fix-autocomplete-error-messages.md | 7 +++++++ packages/kilo-vscode/src/services/autocomplete/i18n/en.ts | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .changeset/fix-autocomplete-error-messages.md diff --git a/.changeset/fix-autocomplete-error-messages.md b/.changeset/fix-autocomplete-error-messages.md new file mode 100644 index 00000000000..43edd744812 --- /dev/null +++ b/.changeset/fix-autocomplete-error-messages.md @@ -0,0 +1,7 @@ +--- +"kilo-code": patch +--- + +Improve autocomplete error messages to clarify BYOK and credits issues + +When autocomplete is paused due to a payment or auth error, the messages now explain all possible causes: no Kilo credits, API key (BYOK) quota exhausted, not signed in, or invalid/missing API key. diff --git a/packages/kilo-vscode/src/services/autocomplete/i18n/en.ts b/packages/kilo-vscode/src/services/autocomplete/i18n/en.ts index c9d7fb229c8..e2e2f423dd4 100644 --- a/packages/kilo-vscode/src/services/autocomplete/i18n/en.ts +++ b/packages/kilo-vscode/src/services/autocomplete/i18n/en.ts @@ -42,8 +42,8 @@ export const dict = { "kilocode:autocomplete.incompatibilityExtensionPopup.disableCopilot": "Disable Copilot", "kilocode:autocomplete.incompatibilityExtensionPopup.disableInlineAssist": "Disable Autocomplete", "kilocode:autocomplete.creditsExhausted.message": - "Kilo Code Autocomplete has been paused because your account has no remaining credits. Add credits to resume autocomplete.", + "Kilo Code Autocomplete has been paused. Possible causes: your Kilo account has no remaining credits, or your configured API key (BYOK) has reached its quota limit. Add Kilo credits or check your API key configuration to resume autocomplete.", "kilocode:autocomplete.creditsExhausted.addCredits": "Add Credits", "kilocode:autocomplete.authError.message": - "Kilo Code Autocomplete has been paused due to an authentication error. Please sign in again.", + "Kilo Code Autocomplete has been paused due to an authentication issue. Possible causes: you are not signed in to Kilo, or your API key (BYOK) is invalid or missing. Please sign in again or check your provider API key settings.", } From 60ac2777211d55375ab14f3bda1c6e550e1cc7fa Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Mon, 29 Jun 2026 10:04:53 +0200 Subject: [PATCH 19/25] fix(vscode): stabilize sandbox button across session switches Cache sandbox status per session so switching worktrees or sessions shows the known state immediately instead of flickering, track in-flight toggles per session, and preserve the prompt textarea scroll position when toggling sandbox before the first message. --- .changeset/keep-sandbox-toggle-drafts.md | 2 +- .../tests/unit/prompt-drafts.test.ts | 6 +- .../prompt-input-connection-guard.test.ts | 36 ++++- .../tests/unit/prompt-input-utils.test.ts | 12 ++ .../src/components/chat/PromptInput.tsx | 135 ++++++++++-------- .../src/components/chat/prompt-input-utils.ts | 7 + .../webview-ui/src/utils/prompt-drafts.ts | 9 +- 7 files changed, 138 insertions(+), 69 deletions(-) diff --git a/.changeset/keep-sandbox-toggle-drafts.md b/.changeset/keep-sandbox-toggle-drafts.md index 00b8347bd1b..d1fd585ab57 100644 --- a/.changeset/keep-sandbox-toggle-drafts.md +++ b/.changeset/keep-sandbox-toggle-drafts.md @@ -2,4 +2,4 @@ "kilo-code": patch --- -Preserve new-chat prompts and attachments when toggling sandbox before sending the first message. +Preserve new-chat prompts, attachments, and scroll position when toggling sandbox, and keep sandbox status stable while switching sessions. diff --git a/packages/kilo-vscode/tests/unit/prompt-drafts.test.ts b/packages/kilo-vscode/tests/unit/prompt-drafts.test.ts index 319f88995fc..a10e100ed4c 100644 --- a/packages/kilo-vscode/tests/unit/prompt-drafts.test.ts +++ b/packages/kilo-vscode/tests/unit/prompt-drafts.test.ts @@ -60,17 +60,21 @@ describe("movePromptDraft", () => { const text = new Map([[source, "Keep this prompt"]]) const comments = new Map([[source, [comment]]]) const images = new Map([[source, [image]]]) + const scrolls = new Map([[source, 128]]) - expect(movePromptDraft({ text, comments, images }, source, target)).toEqual({ + expect(movePromptDraft({ text, comments, images, scrolls }, source, target)).toEqual({ text: "Keep this prompt", comments: [comment], images: [image], + scroll: 128, }) expect(text.get(target)).toBe("Keep this prompt") expect(comments.get(target)).toEqual([comment]) expect(images.get(target)).toEqual([image]) + expect(scrolls.get(target)).toBe(128) expect(text.has(source)).toBe(false) expect(comments.has(source)).toBe(false) expect(images.has(source)).toBe(false) + expect(scrolls.has(source)).toBe(false) }) }) diff --git a/packages/kilo-vscode/tests/unit/prompt-input-connection-guard.test.ts b/packages/kilo-vscode/tests/unit/prompt-input-connection-guard.test.ts index 9bcd471faa9..8141a6c54cf 100644 --- a/packages/kilo-vscode/tests/unit/prompt-input-connection-guard.test.ts +++ b/packages/kilo-vscode/tests/unit/prompt-input-connection-guard.test.ts @@ -41,7 +41,8 @@ describe("PromptInput sandbox toggle", () => { expect(toggle).toContain("sessionID,") expect(toggle).toContain("requestID,") expect(toggle).not.toContain("draftID:") - expect(toggle).toContain("setSandboxTarget(sessionID ?? null)") + expect(toggle).toContain('setSandboxRequests((current) => ({ ...current, [sessionID ?? ""]: requestID }))') + expect(toggle).not.toContain("setSandboxTarget") expect(toggle).not.toContain('type: "updateConfig"') }) @@ -58,6 +59,26 @@ describe("PromptInput sandbox toggle", () => { expect(end).toBeGreaterThan(start) expect(save).toBeGreaterThan(-1) expect(move).toBeGreaterThan(save) + expect(created).toContain("{ text: drafts, comments: reviewDrafts, images: imageDrafts, scrolls }") + }) + + it("restores each prompt draft's textarea and highlight scroll positions", () => { + expect(src).toContain("const scrolls = new Map()") + expect(src).toContain("const scroll = scrolls.get(key) ?? 0") + expect(src).toContain("textareaRef.scrollTop = scroll") + expect(src).toContain("if (highlightRef) highlightRef.scrollTop = scroll") + expect(src).toContain("scrolls.set(draftKey(), textareaRef.scrollTop)") + expect(src).toContain("images: imageAttach.images(),\n scroll: textareaRef?.scrollTop") + expect(src).toContain("draft.text, draft.comments, draft.images, draft.scroll") + }) + + it("tracks in-flight toggles per session while switching", () => { + expect(src).toContain("const [sandboxRequests, setSandboxRequests] = createSignal>({})") + expect(src).toContain('const sandboxRequest = (sessionID?: string) => sandboxRequests()[sessionID ?? ""]') + expect(src).toContain("sandboxRequest(sandboxID()) !== undefined") + expect(src).toContain("if (current[key] !== requestID) return current") + expect(src).toContain("clearSandboxRequest(message.sessionID, message.requestID!)") + expect(src).not.toContain("setSandboxTarget") }) it("keeps persisted sandbox state visible independently of the configured default", () => { @@ -70,11 +91,12 @@ describe("PromptInput sandbox toggle", () => { expect(src).toContain('if (!sandboxVisible()) hidden.add("sandbox")') expect(src).toContain("onToggle={toggleSandbox}") expect(src).toContain('message.type === "sandboxStatus"') - expect(src).toContain("message.sessionID !== sandboxID() && !matching") - expect(src).toContain("setSandboxState(state)") - expect(src).toContain("message.requestID === sandboxRequest()") - expect(src).toContain("const target = untrack(sandboxTarget)") - expect(src).toContain("if (target !== undefined && target !== sessionID) clearSandboxRequest()") + expect(src).not.toContain("message.sessionID !== sandboxID() && !matching") + expect(src).toContain("const next = applySandboxStates(current, message)") + expect(src).toContain("if (next !== current) setSandboxes(next)") + expect(src).toContain("message.requestID === sandboxRequest(message.sessionID)") + expect(src).toContain("if (message.sessionID === sandboxID())") + expect(src).toContain("if (message.sessionID === sandboxID()) retrySandbox(message.sessionID)") expect(src).toContain("sandboxID() ? sandbox()?.enabled : sandboxDefault()?.enabled") expect(src).toContain('type: "requestSandboxDefault", agentManagerContext: ctx()') expect(src).toContain(" { expect(src).toContain("!sandboxReady()") expect(button).toContain("aria-pressed={props.enabled}") expect(button).toContain('class={`prompt-status-button ${props.enabled ? "prompt-status-button--active" : ""}`}') - expect(src).toContain("if (sandboxRequest() && target === null) return") + expect(src).toContain("if (sandboxRequest(undefined)) return") expect(src).not.toContain("if (state === current) return true") }) diff --git a/packages/kilo-vscode/tests/unit/prompt-input-utils.test.ts b/packages/kilo-vscode/tests/unit/prompt-input-utils.test.ts index 258e14f4b27..fbbcab51ad8 100644 --- a/packages/kilo-vscode/tests/unit/prompt-input-utils.test.ts +++ b/packages/kilo-vscode/tests/unit/prompt-input-utils.test.ts @@ -11,6 +11,7 @@ import { isQuestioning, isPathMention, applySandboxState, + applySandboxStates, } from "../../webview-ui/src/components/chat/prompt-input-utils" describe("applySandboxState", () => { @@ -43,6 +44,17 @@ describe("applySandboxState", () => { state(false, 6, "ses_1", "/worktree"), ) }) + + it("caches independently ordered statuses for worktree switching", () => { + const first = applySandboxStates({}, state(true, 5, "ses_1")) + const second = applySandboxStates(first, state(false, 1, "ses_2")) + + expect(second).toEqual({ + ses_1: state(true, 5, "ses_1"), + ses_2: state(false, 1, "ses_2"), + }) + expect(applySandboxStates(second, state(false, 4, "ses_1"))).toBe(second) + }) }) describe("fileName", () => { diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/PromptInput.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/PromptInput.tsx index 946afb7ae91..b2b46675a6f 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/PromptInput.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/PromptInput.tsx @@ -44,7 +44,7 @@ import { insertSpacedText, isPromptBusy, isPathMention, - applySandboxState, + applySandboxStates, type SandboxDefaultState, type SandboxState, } from "./prompt-input-utils" @@ -65,6 +65,7 @@ import { isEnterKeyCommitNotIme } from "../../utils/ime-enter" const drafts = new Map() const reviewDrafts = new Map() const imageDrafts = new Map() +const scrolls = new Map() function mergeReviewComments(current: ReviewComment[], incoming: ReviewComment[]): ReviewComment[] { if (incoming.length === 0) return current @@ -125,6 +126,10 @@ export const PromptInput: Component = (props) => { adjustHeight() }) const history = usePromptHistory() + let textareaRef: HTMLTextAreaElement | undefined + let highlightRef: HTMLDivElement | undefined + let dropdownRef: HTMLDivElement | undefined + let slashDropdownRef: HTMLDivElement | undefined const boxKey = () => props.boxId ?? "prompt:default" const rawKey = () => @@ -132,28 +137,36 @@ export const PromptInput: Component = (props) => { pendingDraftKey(props.pendingSessionID ?? session.draftSessionID()) ?? "new" const draftKey = () => scopeDraftKey(boxKey(), rawKey()) - const saveDraft = (key: string, next: string, comments: ReviewComment[], imgs: ImageAttachment[]) => { + const saveDraft = ( + key: string, + next: string, + comments: ReviewComment[], + imgs: ImageAttachment[], + scroll = textareaRef?.scrollTop ?? scrolls.get(key) ?? 0, + ) => { if (next) drafts.set(key, next) else drafts.delete(key) if (comments.length > 0) reviewDrafts.set(key, comments) else reviewDrafts.delete(key) if (imgs.length > 0) imageDrafts.set(key, imgs) else imageDrafts.delete(key) + if (next || comments.length > 0 || imgs.length > 0) scrolls.set(key, scroll) + else scrolls.delete(key) } const readDraft = () => ({ text: text().trim(), comments: reviewComments(), images: imageAttach.images(), + scroll: textareaRef?.scrollTop ?? scrolls.get(draftKey()) ?? 0, }) const [text, setText] = createSignal("") const [reviewComments, setReviewComments] = createSignal([]) const [enhancing, setEnhancing] = createSignal(false) const [autoApprove, setAutoApprove] = createSignal(false) - const [sandboxState, setSandboxState] = createSignal() + const [sandboxes, setSandboxes] = createSignal>({}) const [sandboxDefault, setSandboxDefault] = createSignal() - const [sandboxRequest, setSandboxRequest] = createSignal() - const [sandboxTarget, setSandboxTarget] = createSignal() + const [sandboxRequests, setSandboxRequests] = createSignal>({}) let sandboxRetry: ReturnType | undefined let sandboxAttempts = 0 const sandboxID = () => { @@ -162,16 +175,17 @@ export const PromptInput: Component = (props) => { } const sandboxVisible = () => features().sandboxControls && !session.currentSessionID()?.startsWith("cloud:") const sandbox = () => { - const state = sandboxState() - return state?.sessionID === sandboxID() ? state : undefined + const id = sandboxID() + return id ? sandboxes()[id] : undefined } const sandboxEnabled = () => (sandboxID() ? sandbox()?.enabled : sandboxDefault()?.enabled) ?? false const sandboxAvailable = () => (sandboxID() ? sandbox()?.available : sandboxDefault()?.available) ?? false const sandboxReason = () => (sandboxID() ? sandbox()?.reason : sandboxDefault()?.reason) const sandboxReady = () => (sandboxID() ? sandbox() !== undefined : sandboxDefault() !== undefined) const sandboxNetworkEnabled = () => config().experimental?.sandbox_restrict_network !== false + const sandboxRequest = (sessionID?: string) => sandboxRequests()[sessionID ?? ""] const sandboxDisabled = () => - !server.isConnected() || !sandboxReady() || !sandboxAvailable() || sandboxRequest() !== undefined + !server.isConnected() || !sandboxReady() || !sandboxAvailable() || sandboxRequest(sandboxID()) !== undefined const requestSandbox = () => { if (server.connectionState() !== "connected") return const sessionID = sandboxID() @@ -186,8 +200,7 @@ export const PromptInput: Component = (props) => { if (!sandboxVisible() || sandboxDisabled()) return const requestID = crypto.randomUUID() if (!sessionID) saveDraft(draftKey(), text(), reviewComments(), imageAttach.images()) - setSandboxRequest(requestID) - setSandboxTarget(sessionID ?? null) + setSandboxRequests((current) => ({ ...current, [sessionID ?? ""]: requestID })) if (!sessionID) { vscode.postMessage({ type: "setSandboxDefault", @@ -214,9 +227,14 @@ export const PromptInput: Component = (props) => { return hidden }, ) - const clearSandboxRequest = () => { - setSandboxRequest(undefined) - setSandboxTarget(undefined) + const clearSandboxRequest = (sessionID: string | undefined, requestID: string) => { + setSandboxRequests((current) => { + const key = sessionID ?? "" + if (current[key] !== requestID) return current + const next = { ...current } + delete next[key] + return next + }) } const retrySandbox = (sessionID: string) => { if (sandboxAttempts >= 2) return @@ -233,20 +251,17 @@ export const PromptInput: Component = (props) => { createEffect(() => { const sessionID = sandboxID() const connected = server.connectionState() === "connected" - const target = untrack(sandboxTarget) if (sandboxRetry) clearTimeout(sandboxRetry) sandboxRetry = undefined sandboxAttempts = 0 if (!connected) { - clearSandboxRequest() - setSandboxState(undefined) + setSandboxRequests({}) + setSandboxes({}) setSandboxDefault(undefined) return } - if (target !== undefined && target !== sessionID) clearSandboxRequest() if (!sessionID) { - setSandboxState(undefined) - if (sandboxRequest() && target === null) return + if (sandboxRequest(undefined)) return requestSandbox() return } @@ -271,10 +286,6 @@ export const PromptInput: Component = (props) => { replaceReviewComments(reviewComments().filter((item) => item.id !== id)) } - let textareaRef: HTMLTextAreaElement | undefined - let highlightRef: HTMLDivElement | undefined - let dropdownRef: HTMLDivElement | undefined - let slashDropdownRef: HTMLDivElement | undefined // Save/restore input text when switching sessions. // Uses `on()` to track only draftKey — avoids re-running on every keystroke. createEffect( @@ -284,6 +295,7 @@ export const PromptInput: Component = (props) => { } const draft = drafts.get(key) ?? "" const pending = reviewDrafts.get(key) ?? [] + const scroll = scrolls.get(key) ?? 0 setText(draft) setReviewComments(pending) imageAttach.replace(imageDrafts.get(key) ?? []) @@ -295,6 +307,8 @@ export const PromptInput: Component = (props) => { // Reset height then adjust textareaRef.style.height = "auto" textareaRef.style.height = `${Math.min(textareaRef.scrollHeight, 200)}px` + textareaRef.scrollTop = scroll + if (highlightRef) highlightRef.scrollTop = scroll } window.dispatchEvent(new Event("focusPrompt")) }), @@ -347,10 +361,11 @@ export const PromptInput: Component = (props) => { const draft = text().trim() const comments = reviewComments() const imgs = imageAttach.images() + const scroll = textareaRef?.scrollTop ?? 0 session.clearCurrentSession() // After clearing, draftKey() points to the "new" bucket — save there // so the session-switch effect restores the prompt in the new-task view. - saveDraft(draftKey(), draft, comments, imgs) + saveDraft(draftKey(), draft, comments, imgs, scroll) } window.addEventListener("newTaskRequest", onNewTaskRequest) onCleanup(() => window.removeEventListener("newTaskRequest", onNewTaskRequest)) @@ -372,7 +387,7 @@ export const PromptInput: Component = (props) => { const draft = captured.get(id) captured.delete(id) if (!draft) return - saveDraft(scopeDraftKey(box, sessionDraftKey(sid)), draft.text, draft.comments, draft.images) + saveDraft(scopeDraftKey(box, sessionDraftKey(sid)), draft.text, draft.comments, draft.images, draft.scroll) } window.addEventListener("agentManagerApplyDraft", onAgentManagerApplyDraft) onCleanup(() => window.removeEventListener("agentManagerApplyDraft", onAgentManagerApplyDraft)) @@ -486,10 +501,10 @@ export const PromptInput: Component = (props) => { const handleSandboxMessage = (message: ExtensionMessage) => { if (message.type === "sandboxDefaultStatus") { - const matching = message.requestID !== undefined && message.requestID === sandboxRequest() + const matching = message.requestID !== undefined && message.requestID === sandboxRequest(undefined) if (sandboxID() && !matching) return false if (!server.isConnected()) return true - if (matching) clearSandboxRequest() + if (matching) clearSandboxRequest(undefined, message.requestID!) const current = sandboxDefault() if (!current || current.revision <= message.revision) { setSandboxDefault({ @@ -511,16 +526,18 @@ export const PromptInput: Component = (props) => { } if (message.type === "sandboxStatus") { - const matching = message.requestID !== undefined && message.requestID === sandboxRequest() - if (message.sessionID !== sandboxID() && !matching) return false + const matching = message.requestID !== undefined && message.requestID === sandboxRequest(message.sessionID) if (!server.isConnected()) return true - const current = sandboxState() - if (matching) clearSandboxRequest() - const state = applySandboxState(current, message) - if (state !== current) setSandboxState(state) - sandboxAttempts = 0 - if (sandboxRetry) clearTimeout(sandboxRetry) - sandboxRetry = undefined + const current = sandboxes() + if (matching) clearSandboxRequest(message.sessionID, message.requestID!) + const next = applySandboxStates(current, message) + if (next !== current) setSandboxes(next) + const state = next[message.sessionID] + if (message.sessionID === sandboxID()) { + sandboxAttempts = 0 + if (sandboxRetry) clearTimeout(sandboxRetry) + sandboxRetry = undefined + } if (matching && !state.available) { showToast({ variant: "error", @@ -532,24 +549,26 @@ export const PromptInput: Component = (props) => { } if (message.type === "sandboxStatusError") { - const matching = message.requestID !== undefined && message.requestID === sandboxRequest() - if (message.sessionID !== sandboxID() && !matching) return false + const matching = message.requestID !== undefined && message.requestID === sandboxRequest(message.sessionID) if (!server.isConnected()) return true - const current = sandboxState() - if (matching) clearSandboxRequest() - if ((current?.revision ?? -1) > message.revision) return true + const current = sandboxes() + const state = current[message.sessionID] + if (matching) clearSandboxRequest(message.sessionID, message.requestID!) + if ((state?.revision ?? -1) > message.revision) return true if (!message.requestID) { - const same = current?.sessionID === message.sessionID && current.directory === message.directory - setSandboxState({ - sessionID: message.sessionID, - directory: message.directory, - enabled: same ? current.enabled : false, - available: false, - reason: message.message, - version: same ? current.version : 0, - revision: message.revision, - }) - retrySandbox(message.sessionID) + const same = state?.directory === message.directory + setSandboxes( + applySandboxStates(current, { + sessionID: message.sessionID, + directory: message.directory, + enabled: same ? state.enabled : false, + available: false, + reason: message.message, + version: same ? state.version : 0, + revision: message.revision, + }), + ) + if (message.sessionID === sandboxID()) retrySandbox(message.sessionID) } if (matching) { showToast({ @@ -614,12 +633,12 @@ export const PromptInput: Component = (props) => { } if (message.type === "sessionCreated") { - const raw = createdDraftKey(message.draftID, sandboxRequest() !== undefined && sandboxTarget() === null) + const raw = createdDraftKey(message.draftID, sandboxRequest(undefined) !== undefined) if (raw) { const source = scopeDraftKey(boxKey(), raw) const target = scopeDraftKey(boxKey(), sessionDraftKey(message.session.id)) if (source === draftKey()) saveDraft(source, text(), reviewComments(), imageAttach.images()) - movePromptDraft({ text: drafts, comments: reviewDrafts, images: imageDrafts }, source, target) + movePromptDraft({ text: drafts, comments: reviewDrafts, images: imageDrafts, scrolls }, source, target) } if ( message.draftID && @@ -696,9 +715,9 @@ export const PromptInput: Component = (props) => { } const syncHighlightScroll = () => { - if (highlightRef && textareaRef) { - highlightRef.scrollTop = textareaRef.scrollTop - } + if (!textareaRef) return + scrolls.set(draftKey(), textareaRef.scrollTop) + if (highlightRef) highlightRef.scrollTop = textareaRef.scrollTop } const adjustHeight = () => { @@ -918,6 +937,7 @@ export const PromptInput: Component = (props) => { drafts.delete(draftKey()) reviewDrafts.delete(draftKey()) imageDrafts.delete(draftKey()) + scrolls.delete(draftKey()) if (textareaRef) textareaRef.style.height = "auto" matched.action() return @@ -978,6 +998,7 @@ export const PromptInput: Component = (props) => { drafts.delete(key) reviewDrafts.delete(key) imageDrafts.delete(key) + scrolls.delete(key) if (draftKey() !== key) return history.append(draft) diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/prompt-input-utils.ts b/packages/kilo-vscode/webview-ui/src/components/chat/prompt-input-utils.ts index a7c80455b9c..e97f58ac39d 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/prompt-input-utils.ts +++ b/packages/kilo-vscode/webview-ui/src/components/chat/prompt-input-utils.ts @@ -25,6 +25,13 @@ export function applySandboxState(current: SandboxState | undefined, next: Sandb return next } +export function applySandboxStates(current: Record, next: SandboxState) { + const previous = current[next.sessionID] + const state = applySandboxState(previous, next) + if (state === previous) return current + return { ...current, [next.sessionID]: state } +} + export function fileName(path: string): string { const normalized = path.replaceAll("\\", "/").replace(/\/+$/, "") return normalized.split("/").pop() ?? normalized diff --git a/packages/kilo-vscode/webview-ui/src/utils/prompt-drafts.ts b/packages/kilo-vscode/webview-ui/src/utils/prompt-drafts.ts index 7b10da48362..9d88bdbb7c0 100644 --- a/packages/kilo-vscode/webview-ui/src/utils/prompt-drafts.ts +++ b/packages/kilo-vscode/webview-ui/src/utils/prompt-drafts.ts @@ -18,21 +18,24 @@ export function createdDraftKey(draftID?: string, sandbox = false): string | und return pendingDraftKey(draftID) ?? (sandbox ? "new" : undefined) } -export function movePromptDraft( - stores: { text: Map; comments: Map; images: Map }, +export function movePromptDraft( + stores: { text: Map; comments: Map; images: Map; scrolls: Map }, source: string, target: string, -): { text?: T; comments?: C; images?: I } { +): { text?: T; comments?: C; images?: I; scroll?: S } { const draft = { text: stores.text.get(source), comments: stores.comments.get(source), images: stores.images.get(source), + scroll: stores.scrolls.get(source), } if (draft.text !== undefined) stores.text.set(target, draft.text) if (draft.comments !== undefined) stores.comments.set(target, draft.comments) if (draft.images !== undefined) stores.images.set(target, draft.images) + if (draft.scroll !== undefined) stores.scrolls.set(target, draft.scroll) stores.text.delete(source) stores.comments.delete(source) stores.images.delete(source) + stores.scrolls.delete(source) return draft } From a3b7ce4c96f6bdcaf4e2a24456690a03f3993b11 Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Mon, 29 Jun 2026 10:15:52 +0200 Subject: [PATCH 20/25] test(jetbrains): name mock CLI virtual threads --- .../test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt index 77e7d766b3d..8754e7d110c 100644 --- a/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt +++ b/packages/kilo-jetbrains/backend/src/test/kotlin/ai/kilocode/backend/testing/MockCliServer.kt @@ -157,7 +157,9 @@ class MockCliServer : AutoCloseable { /** Reset all request counters. */ fun resetCounts() { counts.clear() } - private val executor = Executors.newVirtualThreadPerTaskExecutor() + private val executor = Executors.newThreadPerTaskExecutor( + Thread.ofVirtual().name("mock-cli-", 0).factory(), + ) private val closed = AtomicBoolean(false) private var server: ServerSocket? = null From 4549623572d29f2f67979e32ca4e6f587727d5aa Mon Sep 17 00:00:00 2001 From: marius-kilocode Date: Mon, 29 Jun 2026 10:37:25 +0200 Subject: [PATCH 21/25] perf(vscode): open model, mode, and variant selectors instantly Virtualize the model catalog so opening the picker mounts only the visible window instead of the entire model list, and remove artificial open latency from the mode and variant pickers. The model selector built every catalog row up front (~6k DOM elements, ~11k transient nodes for a ~630-model catalog), blocking the main thread on element creation, style recalculation, and layout before first paint. The active-model lookup also re-scanned the list on every reactive read. The mode and variant pickers were cheap to build but felt slow because of the shared popover enter animation and a deferred focus frame. Render the catalog through a virtualizer, memoize the active-model lookup, anchor scroll restoration to virtual item offsets so favorite toggles no longer jump when the anchored row is virtualized out, disable the popover open animation for these selectors, and focus the selected option during initial mount instead of a later frame. --- .changeset/open-model-selector-faster.md | 5 + .../model-selector-accessibility.spec.ts | 47 ++ .../src/components/shared/ModeSwitcher.tsx | 27 +- .../src/components/shared/ModelSelector.tsx | 418 +++++++++--------- .../src/components/shared/PopupSelector.tsx | 2 + .../components/shared/ThinkingSelector.tsx | 6 +- .../webview-ui/src/stories/shared.stories.tsx | 25 ++ .../webview-ui/src/styles/model-selector.css | 7 +- 8 files changed, 320 insertions(+), 217 deletions(-) create mode 100644 .changeset/open-model-selector-faster.md diff --git a/.changeset/open-model-selector-faster.md b/.changeset/open-model-selector-faster.md new file mode 100644 index 00000000000..789dabdc2a2 --- /dev/null +++ b/.changeset/open-model-selector-faster.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Open the model selector instantly, even with large model catalogs. diff --git a/packages/kilo-vscode/tests/model-selector-accessibility.spec.ts b/packages/kilo-vscode/tests/model-selector-accessibility.spec.ts index 527380a8803..45a7a339fdc 100644 --- a/packages/kilo-vscode/tests/model-selector-accessibility.spec.ts +++ b/packages/kilo-vscode/tests/model-selector-accessibility.spec.ts @@ -183,6 +183,24 @@ test("selected favorite remains selected when its duplicate group is collapsed", await expect(combobox).toHaveAttribute("aria-activedescendant", await favorites.getAttribute("id")) }) +test("large catalogs keep the rendered tree bounded and navigate to distant models", async ({ page }) => { + await load(page, "shared--model-selector-large-catalog") + + await page.getByRole("button", { name: "Select model: Provider 0 / Model 300" }).click() + const combobox = page.getByRole("combobox", { name: "Select model: Provider 0 / Model 300. Search models" }) + const tree = page.getByRole("tree", { name: "Select model" }) + + // The window mounts before we measure it, yet stays far smaller than the catalog. + await expect.poll(() => tree.getByRole("treeitem").count()).toBeGreaterThan(0) + await expect.poll(() => tree.getByRole("treeitem").count()).toBeLessThan(50) + + // Reaching a distant model scrolls it into the mounted window and activates it. + await combobox.fill("Model 599") + const last = page.getByRole("treeitem", { name: "Model 599" }) + await expect(last).toBeVisible() + await expect(combobox).toHaveAttribute("aria-activedescendant", await last.getAttribute("id")) +}) + test("Enter selects the active option and Escape restores selector focus", async ({ page }) => { await load(page, "shared--model-selector-accessible") @@ -252,6 +270,35 @@ test("settings and mode editing expose distinct model field purposes", async ({ ) }) +test("mode picker focuses the selected mode as it opens", async ({ page }) => { + await load(page, "prompt-input--default-420") + + await page.getByRole("button", { name: "Code", exact: true }).click() + await expect(page.locator(".mode-switcher-item.selected")).toBeFocused() +}) + +test("variant picker focuses the selected effort as it opens", async ({ page }) => { + await load(page, "prompt-input--with-thinking-420") + + await page.getByRole("button", { name: "Medium", exact: true }).click() + await expect(page.locator(".thinking-selector-item.selected")).toBeFocused() +}) + +test("slash mode picker Escape returns focus to the prompt", async ({ page }) => { + await load(page, "prompt-input--default-420") + + const prompt = page.locator("textarea.prompt-input") + await prompt.evaluate((el) => el.setAttribute("aria-disabled", "false")) + await prompt.fill("/agents") + await prompt.press("Enter") + + const selected = page.locator(".mode-switcher-item.selected") + await expect(selected).toBeFocused() + await selected.press("Escape") + + await expect(prompt).toBeFocused() +}) + test("chat picker Escape returns focus to the prompt", async ({ page }) => { await load(page, "prompt-input--default-420") diff --git a/packages/kilo-vscode/webview-ui/src/components/shared/ModeSwitcher.tsx b/packages/kilo-vscode/webview-ui/src/components/shared/ModeSwitcher.tsx index 6e237dbdda0..d078192110f 100644 --- a/packages/kilo-vscode/webview-ui/src/components/shared/ModeSwitcher.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/shared/ModeSwitcher.tsx @@ -44,9 +44,15 @@ export const ModeSwitcherBase: Component = (props) => { const [focused, setFocused] = createSignal(-1) const language = useLanguage() let listRef: HTMLDivElement | undefined + // True while the picker was opened by the slash command rather than a click, + // so dismissal returns focus to the prompt like the model/variant pickers. + let slash = false // Listen for slash command trigger - const onTrigger = () => setOpen(true) + const onTrigger = () => { + slash = true + openSelected() + } window.addEventListener("openModePicker", onTrigger) onCleanup(() => window.removeEventListener("openModePicker", onTrigger)) @@ -65,11 +71,23 @@ export const ModeSwitcherBase: Component = (props) => { items[clamped]?.focus() } + function openSelected() { + const idx = props.agents.findIndex((a) => a.name === props.value) + setFocused(idx >= 0 ? idx : 0) + setOpen(true) + } + function onOpen(val: boolean) { - setOpen(val) if (val) { - const idx = props.agents.findIndex((a) => a.name === props.value) - requestAnimationFrame(() => focusItem(idx >= 0 ? idx : 0)) + // A click on the trigger opens without the slash flag. + slash = false + openSelected() + return + } + setOpen(false) + if (slash) { + slash = false + requestAnimationFrame(() => window.dispatchEvent(new CustomEvent("focusPrompt", { detail: { restore: true } }))) } } @@ -135,6 +153,7 @@ export const ModeSwitcherBase: Component = (props) => { role="option" aria-selected={agent.name === props.value} tabindex={focused() === i() ? 0 : -1} + data-autofocus={focused() === i() ? "" : undefined} onClick={() => pick(agent.name)} onFocus={() => setFocused(i())} > diff --git a/packages/kilo-vscode/webview-ui/src/components/shared/ModelSelector.tsx b/packages/kilo-vscode/webview-ui/src/components/shared/ModelSelector.tsx index 1e44e6115c6..73e1b684bcd 100644 --- a/packages/kilo-vscode/webview-ui/src/components/shared/ModelSelector.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/shared/ModelSelector.tsx @@ -13,13 +13,13 @@ import { createEffect, createUniqueId, onCleanup, - For, Show, createSelector, useContext, untrack, } from "solid-js" import type { Accessor, Component } from "solid-js" +import { Virtualizer, type VirtualizerHandle } from "virtua/solid" import { PopupSelector } from "./PopupSelector" import { Button } from "@kilocode/kilo-ui/button" import { IconButton } from "@kilocode/kilo-ui/icon-button" @@ -94,7 +94,9 @@ interface ModelNode { interface ScrollAnchor { key: string - top: number | undefined + // Virtual content offset of the anchored row before the list mutates. + // Works even when the row is scrolled out of the mounted window. + offset: number | undefined scroll: number } @@ -144,11 +146,11 @@ export const ModelSelectorBase: Component = (props) => { const previewID = `${uid}-preview` const descriptionID = `${uid}-description` const optionID = (key: string) => `${uid}-option-${encodeURIComponent(key)}` - const activeModel = () => { + const activeModel = createMemo(() => { const items = props.models if (items) return items.find((m) => m.providerID === props.value?.providerID && m.id === props.value?.modelID) return findModel(props.value) - } + }) const [open, setOpen] = createSignal(false) const [expanded, setExpanded] = createSignal(true) @@ -175,10 +177,8 @@ export const ModelSelectorBase: Component = (props) => { let listRef: HTMLDivElement | undefined let bodyRef: HTMLDivElement | undefined let previewTimer: ReturnType | undefined + const [virtualizer, setVirtualizer] = createSignal() const [pointer, setPointer] = createSignal(true) - // Ref map: row key → DOM element. Populated by each row's ref callback, - // avoids DOM queries for scroll anchoring and scrollIntoView. - const refs = new Map() function onSplitterMouseDown(e: MouseEvent) { e.preventDefault() @@ -382,6 +382,13 @@ export const ModelSelectorBase: Component = (props) => { const nodeMap = createMemo(() => new Map(nodes().map((node) => [node.key, node] as const))) const nodeIndex = createMemo(() => new Map(nodes().map((node, i) => [node.key, i] as const))) const rowMap = createMemo(() => new Map(rows().map((row) => [row.key, row] as const))) + const mounted = createMemo(() => { + const map = nodeIndex() + const indexes = [selectedKey(), preActiveKey(), previewKey()] + .map((key) => (key ? map.get(key) : undefined)) + .filter((idx): idx is number => idx !== undefined) + return [...new Set(indexes)] + }) const canonicalKey = (m: EnrichedModel) => rowKey("model", m.providerID, m.id) const favoriteKey = (m: EnrichedModel) => rowKey("favorite", m.providerID, m.id) const defaultKey = () => nodes()[0]?.key ?? CLEAR_KEY @@ -421,18 +428,17 @@ export const ModelSelectorBase: Component = (props) => { createEffect(() => { const saved = anchor() - rows() - if (!saved || !listRef) return + nodes() + if (!saved) return requestAnimationFrame(() => { - if (!listRef) { - setAnchor(null) - return - } - const el = refs.get(saved.key) - if (el && saved.top !== undefined) { - listRef.scrollTop += el.getBoundingClientRect().top - saved.top + const handle = virtualizer() + const idx = nodeIndex().get(saved.key) + if (handle && idx !== undefined && saved.offset !== undefined) { + // Keep the anchored row pinned to the same viewport position after + // rows above it appear or disappear, even while it is virtualized out. + handle.scrollTo(handle.getItemOffset(idx) - (saved.offset - saved.scroll)) } else { - listRef.scrollTop = saved.scroll + handle?.scrollTo(saved.scroll) } setAnchor(null) }) @@ -543,7 +549,11 @@ export const ModelSelectorBase: Component = (props) => { } function scrollRow(key: string | null | undefined, block: ScrollLogicalPosition = "nearest") { - if (key) refs.get(key)?.scrollIntoView({ block }) + if (!key) return + const idx = nodeIndex().get(key) + if (idx === undefined) return + const align = block === "center" || block === "start" || block === "end" ? block : "nearest" + virtualizer()?.scrollToIndex(idx, { align }) } function activate(key: string) { @@ -609,10 +619,10 @@ export const ModelSelectorBase: Component = (props) => { // disappear — anchor to the canonical provider row instead so the // scroll restore finds an element that still exists after rerender. const key = row.kind === "favorite" ? canon : row.key - const el = refs.get(key) + const idx = nodeIndex().get(key) setAnchor({ key, - top: el?.getBoundingClientRect().top, + offset: idx !== undefined ? virtualizer()?.getItemOffset(idx) : undefined, scroll: listRef?.scrollTop ?? 0, }) if (row.kind === "favorite") { @@ -837,198 +847,186 @@ export const ModelSelectorBase: Component = (props) => { - -
{ - refs.set(CLEAR_KEY, el) - onCleanup(() => refs.delete(CLEAR_KEY)) - }} - class={`model-selector-item${isSelected(CLEAR_KEY) && !pointer() ? " keyboard-focused" : ""}${isSelected(CLEAR_KEY) ? " selected" : ""}${!props.value?.providerID ? " active" : ""}`} - role="treeitem" - aria-selected={!props.value?.providerID} - onClick={() => pickClear()} - onMouseMove={() => { - setPointer(true) - }} - onMouseEnter={() => { - if (pointer()) setSelectedKey(CLEAR_KEY) - }} - > - - {props.clearLabel ?? language.t("dialog.model.notSet")} - -
-
- - - {(group) => { - const shown = () => isGroupOpen(group.key) - return ( - diff --git a/packages/kilo-vscode/webview-ui/src/components/shared/PopupSelector.tsx b/packages/kilo-vscode/webview-ui/src/components/shared/PopupSelector.tsx index 541c3f81dba..349a853211e 100644 --- a/packages/kilo-vscode/webview-ui/src/components/shared/PopupSelector.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/shared/PopupSelector.tsx @@ -57,6 +57,7 @@ export function PopupSelector(props: "minWidth", "minHeight", "deferDismiss", + "class", "children", ]) @@ -113,6 +114,7 @@ export function PopupSelector(props: overflowPadding={local.padding ?? 8} deferDismiss={local.deferDismiss} {...(rest as PopoverProps)} + class={`popup-selector${local.class ? ` ${local.class}` : ""}`} style={ popoverW().width !== undefined ? { width: `${popoverW().width}px`, "max-width": `${popoverW().max}px` } diff --git a/packages/kilo-vscode/webview-ui/src/components/shared/ThinkingSelector.tsx b/packages/kilo-vscode/webview-ui/src/components/shared/ThinkingSelector.tsx index a6f05f06915..45f9b827ae8 100644 --- a/packages/kilo-vscode/webview-ui/src/components/shared/ThinkingSelector.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/shared/ThinkingSelector.tsx @@ -64,13 +64,14 @@ export const ThinkingSelectorBase: Component = (props } function onOpen(val: boolean) { - setOpen(val) if (val) { const items = rows() const idx = items.findIndex((v) => v === props.value) - requestAnimationFrame(() => focusItem(idx >= 0 ? idx : 0)) + setFocused(idx >= 0 ? idx : 0) + setOpen(true) return } + setOpen(false) refocus() } @@ -166,6 +167,7 @@ export const ThinkingSelectorBase: Component = (props role="option" aria-selected={props.value === v} tabindex={focused() === i() ? 0 : -1} + data-autofocus={focused() === i() ? "" : undefined} onClick={() => pick(v)} onFocus={() => setFocused(i())} > diff --git a/packages/kilo-vscode/webview-ui/src/stories/shared.stories.tsx b/packages/kilo-vscode/webview-ui/src/stories/shared.stories.tsx index ca1c3abe408..bf3a16f7dc8 100644 --- a/packages/kilo-vscode/webview-ui/src/stories/shared.stories.tsx +++ b/packages/kilo-vscode/webview-ui/src/stories/shared.stories.tsx @@ -108,3 +108,28 @@ export const ModelSelectorSelectedFavorite: Story = { ) }, } + +const LARGE_MODELS: EnrichedModel[] = Array.from({ length: 600 }, (_, i) => { + const id = String(i).padStart(3, "0") + const provider = `provider-${i % 12}` + return { + id: `model-${id}`, + name: `Model ${id}`, + providerID: provider, + providerName: `Provider ${i % 12}`, + } +}) + +export const ModelSelectorLargeCatalog: Story = { + name: "ModelSelector — large catalog", + render: () => ( + + {}} + /> + + ), +} diff --git a/packages/kilo-vscode/webview-ui/src/styles/model-selector.css b/packages/kilo-vscode/webview-ui/src/styles/model-selector.css index e16816425e6..dcd5988b840 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/model-selector.css +++ b/packages/kilo-vscode/webview-ui/src/styles/model-selector.css @@ -2,6 +2,11 @@ Model Selector (uses kilo-ui Popover) ============================================ */ +.popup-selector[data-expanded], +.popup-selector[data-closed] { + animation: none; +} + .model-selector-popover { transition: width 0.2s ease, @@ -383,7 +388,7 @@ outline-offset: -1px; } -.model-selector-group:not(:first-child) > .model-selector-group-label { +.model-selector-group-label--divided { border-top: 1px solid var(--border-weak-base, var(--vscode-panel-border)); margin-top: 4px; padding-top: 8px; From be4f09c8a1e45f918bab161f908dbba15ea28b42 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 29 Jun 2026 08:41:00 +0000 Subject: [PATCH 22/25] chore: update kilo-vscode visual regression baselines --- .../shared/model-selector-large-catalog-chromium-linux.png | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/shared/model-selector-large-catalog-chromium-linux.png diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/shared/model-selector-large-catalog-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/shared/model-selector-large-catalog-chromium-linux.png new file mode 100644 index 00000000000..f6ca0c2ec8d --- /dev/null +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/shared/model-selector-large-catalog-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b197d749f21df8d3061b93d13281a346b52514bec1b6855b474a03cfaeeb117b +size 2500 From 2da40afed4169936074a59fdc315e6042d73bb6b Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Mon, 29 Jun 2026 10:43:28 +0200 Subject: [PATCH 23/25] fix(vscode): translate Anaconda Desktop provider strings in all locales --- .changeset/anaconda-desktop-translations.md | 5 ++ .../kilo-vscode/webview-ui/src/i18n/ar.ts | 55 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/br.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/bs.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/da.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/de.ts | 58 ++++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/es.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/fr.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/it.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/ja.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/ko.ts | 60 +++++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/nl.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/no.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/pl.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/ru.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/th.ts | 55 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/tr.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/uk.ts | 56 +++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/zh.ts | 53 ++++++++++++++-- .../kilo-vscode/webview-ui/src/i18n/zht.ts | 53 ++++++++++++++-- 20 files changed, 975 insertions(+), 92 deletions(-) create mode 100644 .changeset/anaconda-desktop-translations.md diff --git a/.changeset/anaconda-desktop-translations.md b/.changeset/anaconda-desktop-translations.md new file mode 100644 index 00000000000..12d9c6d0ef9 --- /dev/null +++ b/.changeset/anaconda-desktop-translations.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Translate the Anaconda Desktop provider strings into all supported languages instead of falling back to English. diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index d0d94f0e521..bcd1631d144 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -1,12 +1,57 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "تحقق مرة أخرى", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "توصيل Anaconda Desktop", + "provider.anaconda.title.manage": "إدارة Anaconda Desktop", + "provider.anaconda.status.checking": "جارٍ التحقق من Anaconda Desktop...", + "provider.anaconda.status.opening": "جارٍ فتح Anaconda Desktop...", + "provider.anaconda.status.syncing": "جارٍ تحديث نماذج الموفر...", + "provider.anaconda.status.ready": "جاهز للتوصيل", + "provider.anaconda.status.waiting": "في انتظار Desktop", + "provider.anaconda.status.attention": "يحتاج إلى انتباه", + "provider.anaconda.status.unavailable": "غير متوفر", + "provider.anaconda.state.unsupported": "Anaconda Desktop غير مدعوم على {{platform}}.", + "provider.anaconda.state.notInstalled": + "ثبّت Anaconda Desktop على هذا الجهاز، ثم عُد إلى هنا. لا يقوم Kilo بتشغيل المثبّت نيابةً عنك.", + "provider.anaconda.state.notRunning": "افتح Anaconda Desktop، وأكمل الإعداد وسجّل الدخول، ثم اختر تحقق مرة أخرى.", + "provider.anaconda.state.invalidConfig": + "إعداد Anaconda Desktop غير مكتمل. افتح Desktop، وأكمل الإعداد، وأعد تشغيله إذا لزم الأمر.", + "provider.anaconda.state.signedOut": "افتح Anaconda Desktop وسجّل الدخول قبل توصيل Kilo.", + "provider.anaconda.state.unauthorized": + "تعذّر على Kilo الوصول إلى Anaconda Desktop. افتح Desktop، وسجّل الدخول مرة أخرى، وأعد تشغيله إذا لزم الأمر.", + "provider.anaconda.state.unavailable": + "لا يستجيب Anaconda Desktop بعد. افتحه وانتظر حتى ينتهي التطبيق من بدء التشغيل.", + "provider.anaconda.state.noModel": + "في Anaconda Desktop، نزّل نموذجًا لتوليد النصوص. اختر نموذجًا يدعم استدعاء الأدوات إن أمكن، ثم شغّل خادمه.", "provider.anaconda.state.noServer_one": "يتوفر نموذج واحد مُنزّل لتوليد النصوص. في Anaconda Desktop، شغّل خادم نموذج. يوصى بشدة باستخدام نماذج تدعم استدعاء الأدوات.", "provider.anaconda.state.noServer_other": "تتوفر نماذج مُنزّلة لتوليد النصوص، وعددها {{count}}. في Anaconda Desktop، شغّل خادم نموذج. يوصى بشدة باستخدام نماذج تدعم استدعاء الأدوات.", + "provider.anaconda.state.unhealthy": + "خادم الاستدلال النشط ليس في حالة سليمة بعد. تحقق منه في Anaconda Desktop وأعد تشغيل الخادم إذا لزم الأمر.", + "provider.anaconda.state.ready": + "عثر Kilo على خادم محلي سليم لتوليد النصوص ويمكنه استيراد إعدادات الاتصال الحالية الخاصة به.", + "provider.anaconda.server": "خادم الاستدلال النشط", + "provider.anaconda.context": "نافذة السياق", + "provider.anaconda.contextValue": "{{count}} رمز", + "provider.anaconda.tools": "استدعاء الأدوات", + "provider.anaconda.tools.supported": "مدعوم", + "provider.anaconda.tools.unsupported": "غير مُفعّل", + "provider.anaconda.tools.unknown": "غير معروف", + "provider.anaconda.warning.title": "دعم الأدوات محدود", + "provider.anaconda.warning.description": + "لا يؤكد هذا الخادم استدعاء الأدوات. قد تفشل إجراءات وكيل البرمجة أو تكون غير متوفرة. تابع فقط إذا قبلت هذه القيود.", + "provider.anaconda.action.download": "تنزيل Anaconda Desktop", + "provider.anaconda.action.open": "فتح Anaconda Desktop", + "provider.anaconda.action.checkAgain": "تحقق مرة أخرى", + "provider.anaconda.action.continue": "تابع على أي حال", + "provider.anaconda.action.manage": "إدارة / تحديث", + "provider.anaconda.toast.refreshed.title": "تم تحديث Anaconda Desktop", + "provider.anaconda.toast.refreshed.description": "الخادم المحلي النشط والنماذج محدّثة في Kilo.", + "settings.providers.note.anacondaDesktop": "شغّل نموذجًا يُقدّم محليًا بواسطة Anaconda Desktop.", + "settings.providers.tag.local": "محلي", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "مقترح", "command.category.view": "عرض", "command.category.project": "مشروع", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index e7e79d59a09..da20de9ce01 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Verificar novamente", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Conectar Anaconda Desktop", + "provider.anaconda.title.manage": "Gerenciar Anaconda Desktop", + "provider.anaconda.status.checking": "Verificando Anaconda Desktop...", + "provider.anaconda.status.opening": "Abrindo Anaconda Desktop...", + "provider.anaconda.status.syncing": "Atualizando modelos do provedor...", + "provider.anaconda.status.ready": "Pronto para conectar", + "provider.anaconda.status.waiting": "Aguardando o Desktop", + "provider.anaconda.status.attention": "Precisa de atenção", + "provider.anaconda.status.unavailable": "Indisponível", + "provider.anaconda.state.unsupported": "O Anaconda Desktop não é compatível com {{platform}}.", + "provider.anaconda.state.notInstalled": + "Instale o Anaconda Desktop nesta máquina e depois volte aqui. O Kilo não executa o instalador para você.", + "provider.anaconda.state.notRunning": + "Abra o Anaconda Desktop, conclua a configuração e faça login, depois escolha Verificar novamente.", + "provider.anaconda.state.invalidConfig": + "A configuração do Anaconda Desktop está incompleta. Abra o Desktop, conclua a configuração e reinicie-o se necessário.", + "provider.anaconda.state.signedOut": "Abra o Anaconda Desktop e faça login antes de conectar o Kilo.", + "provider.anaconda.state.unauthorized": + "O Kilo não conseguiu acessar o Anaconda Desktop. Abra o Desktop, faça login novamente e reinicie-o se necessário.", + "provider.anaconda.state.unavailable": + "O Anaconda Desktop ainda não está respondendo. Abra-o e aguarde o aplicativo terminar de iniciar.", + "provider.anaconda.state.noModel": + "No Anaconda Desktop, baixe um modelo de geração de texto. Escolha um com chamadas de ferramentas quando possível, depois inicie o servidor dele.", "provider.anaconda.state.noServer_one": "Há 1 modelo de geração de texto baixado disponível. No Anaconda Desktop, inicie um servidor de modelo. Modelos com suporte a chamadas de ferramentas são altamente recomendados.", "provider.anaconda.state.noServer_other": "Há {{count}} modelos de geração de texto baixados disponíveis. No Anaconda Desktop, inicie um servidor de modelo. Modelos com suporte a chamadas de ferramentas são altamente recomendados.", + "provider.anaconda.state.unhealthy": + "O servidor de inferência ativo ainda não está saudável. Verifique-o no Anaconda Desktop e reinicie o servidor se necessário.", + "provider.anaconda.state.ready": + "O Kilo encontrou um servidor local saudável de geração de texto e pode importar suas configurações de conexão atuais.", + "provider.anaconda.server": "Servidor de inferência ativo", + "provider.anaconda.context": "Janela de contexto", + "provider.anaconda.contextValue": "{{count}} tokens", + "provider.anaconda.tools": "Chamadas de ferramentas", + "provider.anaconda.tools.supported": "Compatível", + "provider.anaconda.tools.unsupported": "Não habilitado", + "provider.anaconda.tools.unknown": "Desconhecido", + "provider.anaconda.warning.title": "O suporte a ferramentas é limitado", + "provider.anaconda.warning.description": + "Este servidor não confirma chamadas de ferramentas. Ações do agente de código podem falhar ou ficar indisponíveis. Continue apenas se você aceitar essas limitações.", + "provider.anaconda.action.download": "Baixar Anaconda Desktop", + "provider.anaconda.action.open": "Abrir Anaconda Desktop", + "provider.anaconda.action.checkAgain": "Verificar novamente", + "provider.anaconda.action.continue": "Continuar mesmo assim", + "provider.anaconda.action.manage": "Gerenciar / Atualizar", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop atualizado", + "provider.anaconda.toast.refreshed.description": "O servidor local ativo e os modelos estão atualizados no Kilo.", + "settings.providers.note.anacondaDesktop": "Execute um modelo servido localmente pelo Anaconda Desktop.", + "settings.providers.tag.local": "Local", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Sugerido", "command.category.view": "Visualizar", "command.category.project": "Projeto", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index 310add1f5c5..664458dfd16 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Provjeri ponovo", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Poveži Anaconda Desktop", + "provider.anaconda.title.manage": "Upravljaj Anaconda Desktopom", + "provider.anaconda.status.checking": "Provjeravanje Anaconda Desktopa...", + "provider.anaconda.status.opening": "Otvaranje Anaconda Desktopa...", + "provider.anaconda.status.syncing": "Osvježavanje modela provajdera...", + "provider.anaconda.status.ready": "Spremno za povezivanje", + "provider.anaconda.status.waiting": "Čekanje na Desktop", + "provider.anaconda.status.attention": "Potrebna pažnja", + "provider.anaconda.status.unavailable": "Nedostupno", + "provider.anaconda.state.unsupported": "Anaconda Desktop nije podržan na {{platform}}.", + "provider.anaconda.state.notInstalled": + "Instalirajte Anaconda Desktop na ovom računaru, zatim se vratite ovdje. Kilo ne pokreće instalacijski program umjesto vas.", + "provider.anaconda.state.notRunning": + "Otvorite Anaconda Desktop, dovršite postavljanje i prijavite se, zatim odaberite Provjeri ponovo.", + "provider.anaconda.state.invalidConfig": + "Postavljanje Anaconda Desktopa nije dovršeno. Otvorite Desktop, dovršite postavljanje i ponovo ga pokrenite ako je potrebno.", + "provider.anaconda.state.signedOut": "Otvorite Anaconda Desktop i prijavite se prije povezivanja Kila.", + "provider.anaconda.state.unauthorized": + "Kilo nije mogao pristupiti Anaconda Desktopu. Otvorite Desktop, ponovo se prijavite i ponovo ga pokrenite ako je potrebno.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop još ne odgovara. Otvorite ga i sačekajte da se aplikacija u potpunosti pokrene.", + "provider.anaconda.state.noModel": + "U Anaconda Desktopu preuzmite model za generisanje teksta. Odaberite onaj s pozivanjem alata kad je moguće, zatim pokrenite njegov server.", "provider.anaconda.state.noServer_one": "Dostupan je 1 preuzeti model za generisanje teksta. U Anaconda Desktopu pokrenite server modela. Modeli s podrškom za pozivanje alata se snažno preporučuju.", "provider.anaconda.state.noServer_other": "Preuzeti modeli za generisanje teksta dostupni su (ukupno: {{count}}). U Anaconda Desktopu pokrenite server modela. Modeli s podrškom za pozivanje alata se snažno preporučuju.", + "provider.anaconda.state.unhealthy": + "Aktivni server za zaključivanje još nije ispravan. Provjerite ga u Anaconda Desktopu i ponovo pokrenite server ako je potrebno.", + "provider.anaconda.state.ready": + "Kilo je pronašao ispravan lokalni server za generisanje teksta i može uvesti njegove trenutne postavke veze.", + "provider.anaconda.server": "Aktivni server za zaključivanje", + "provider.anaconda.context": "Kontekstni prozor", + "provider.anaconda.contextValue": "{{count}} tokena", + "provider.anaconda.tools": "Pozivanje alata", + "provider.anaconda.tools.supported": "Podržano", + "provider.anaconda.tools.unsupported": "Nije omogućeno", + "provider.anaconda.tools.unknown": "Nepoznato", + "provider.anaconda.warning.title": "Podrška za alate je ograničena", + "provider.anaconda.warning.description": + "Ovaj server ne potvrđuje pozivanje alata. Radnje agenta za kodiranje mogu biti neuspješne ili nedostupne. Nastavite samo ako prihvatate ova ograničenja.", + "provider.anaconda.action.download": "Preuzmi Anaconda Desktop", + "provider.anaconda.action.open": "Otvori Anaconda Desktop", + "provider.anaconda.action.checkAgain": "Provjeri ponovo", + "provider.anaconda.action.continue": "Ipak nastavi", + "provider.anaconda.action.manage": "Upravljaj / Osvježi", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop osvježen", + "provider.anaconda.toast.refreshed.description": "Aktivni lokalni server i modeli su ažurirani u Kilu.", + "settings.providers.note.anacondaDesktop": "Pokrenite model koji lokalno poslužuje Anaconda Desktop.", + "settings.providers.tag.local": "Lokalno", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Predloženo", "command.category.view": "Prikaz", "command.category.project": "Projekat", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index 5c777244818..172b4a773ec 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Tjek igen", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Forbind Anaconda Desktop", + "provider.anaconda.title.manage": "Administrer Anaconda Desktop", + "provider.anaconda.status.checking": "Tjekker Anaconda Desktop...", + "provider.anaconda.status.opening": "Åbner Anaconda Desktop...", + "provider.anaconda.status.syncing": "Opdaterer udbydermodeller...", + "provider.anaconda.status.ready": "Klar til at forbinde", + "provider.anaconda.status.waiting": "Venter på Desktop", + "provider.anaconda.status.attention": "Kræver opmærksomhed", + "provider.anaconda.status.unavailable": "Utilgængelig", + "provider.anaconda.state.unsupported": "Anaconda Desktop understøttes ikke på {{platform}}.", + "provider.anaconda.state.notInstalled": + "Installer Anaconda Desktop på denne maskine, og vend derefter tilbage hertil. Kilo kører ikke installationsprogrammet for dig.", + "provider.anaconda.state.notRunning": + "Åbn Anaconda Desktop, færdiggør opsætningen og log ind, og vælg derefter Tjek igen.", + "provider.anaconda.state.invalidConfig": + "Opsætningen af Anaconda Desktop er ufuldstændig. Åbn Desktop, færdiggør opsætningen, og genstart den om nødvendigt.", + "provider.anaconda.state.signedOut": "Åbn Anaconda Desktop og log ind, før du forbinder Kilo.", + "provider.anaconda.state.unauthorized": + "Kilo kunne ikke få adgang til Anaconda Desktop. Åbn Desktop, log ind igen, og genstart den om nødvendigt.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop svarer ikke endnu. Åbn den, og vent på, at applikationen er færdig med at starte.", + "provider.anaconda.state.noModel": + "Download en tekstgenereringsmodel i Anaconda Desktop. Vælg en med understøttelse af værktøjskald, når det er muligt, og start derefter dens server.", "provider.anaconda.state.noServer_one": "Der er 1 downloadet tekstgenereringsmodel tilgængelig. Start en modelserver i Anaconda Desktop. Modeller med understøttelse af værktøjskald anbefales kraftigt.", "provider.anaconda.state.noServer_other": "Der er {{count}} downloadede tekstgenereringsmodeller tilgængelige. Start en modelserver i Anaconda Desktop. Modeller med understøttelse af værktøjskald anbefales kraftigt.", + "provider.anaconda.state.unhealthy": + "Den aktive inferensserver er ikke sund endnu. Tjek den i Anaconda Desktop, og genstart serveren om nødvendigt.", + "provider.anaconda.state.ready": + "Kilo fandt en sund lokal tekstgenereringsserver og kan importere dens aktuelle forbindelsesindstillinger.", + "provider.anaconda.server": "Aktiv inferensserver", + "provider.anaconda.context": "Kontekstvindue", + "provider.anaconda.contextValue": "{{count}} tokens", + "provider.anaconda.tools": "Værktøjskald", + "provider.anaconda.tools.supported": "Understøttet", + "provider.anaconda.tools.unsupported": "Ikke aktiveret", + "provider.anaconda.tools.unknown": "Ukendt", + "provider.anaconda.warning.title": "Værktøjsunderstøttelse er begrænset", + "provider.anaconda.warning.description": + "Denne server bekræfter ikke værktøjskald. Handlinger fra kodningsagenten kan mislykkes eller være utilgængelige. Fortsæt kun, hvis du accepterer disse begrænsninger.", + "provider.anaconda.action.download": "Download Anaconda Desktop", + "provider.anaconda.action.open": "Åbn Anaconda Desktop", + "provider.anaconda.action.checkAgain": "Tjek igen", + "provider.anaconda.action.continue": "Fortsæt alligevel", + "provider.anaconda.action.manage": "Administrer / Opdater", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop opdateret", + "provider.anaconda.toast.refreshed.description": "Den aktive lokale server og modeller er opdaterede i Kilo.", + "settings.providers.note.anacondaDesktop": "Kør en model, der serveres lokalt af Anaconda Desktop.", + "settings.providers.tag.local": "Lokal", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Foreslået", "command.category.view": "Vis", "command.category.project": "Projekt", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index f4cadb4b058..59b78bffed2 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -1,14 +1,64 @@ -import { anacondaDesktopDict, dict as en } from "./en" +import { dict as en } from "./en" type Keys = keyof typeof en -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Erneut prüfen", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Anaconda Desktop verbinden", + "provider.anaconda.title.manage": "Anaconda Desktop verwalten", + "provider.anaconda.status.checking": "Anaconda Desktop wird geprüft...", + "provider.anaconda.status.opening": "Anaconda Desktop wird geöffnet...", + "provider.anaconda.status.syncing": "Anbietermodelle werden aktualisiert...", + "provider.anaconda.status.ready": "Bereit zum Verbinden", + "provider.anaconda.status.waiting": "Warten auf Desktop", + "provider.anaconda.status.attention": "Erfordert Aufmerksamkeit", + "provider.anaconda.status.unavailable": "Nicht verfügbar", + "provider.anaconda.state.unsupported": "Anaconda Desktop wird unter {{platform}} nicht unterstützt.", + "provider.anaconda.state.notInstalled": + "Installieren Sie Anaconda Desktop auf diesem Computer und kehren Sie dann hierher zurück. Kilo führt das Installationsprogramm nicht für Sie aus.", + "provider.anaconda.state.notRunning": + "Öffnen Sie Anaconda Desktop, schließen Sie die Einrichtung ab und melden Sie sich an. Wählen Sie dann Erneut prüfen.", + "provider.anaconda.state.invalidConfig": + "Die Einrichtung von Anaconda Desktop ist unvollständig. Öffnen Sie Desktop, schließen Sie die Einrichtung ab und starten Sie es bei Bedarf neu.", + "provider.anaconda.state.signedOut": "Öffnen Sie Anaconda Desktop und melden Sie sich an, bevor Sie Kilo verbinden.", + "provider.anaconda.state.unauthorized": + "Kilo konnte nicht auf Anaconda Desktop zugreifen. Öffnen Sie Desktop, melden Sie sich erneut an und starten Sie es bei Bedarf neu.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop antwortet noch nicht. Öffnen Sie es und warten Sie, bis die Anwendung vollständig gestartet ist.", + "provider.anaconda.state.noModel": + "Laden Sie in Anaconda Desktop ein Textgenerierungsmodell herunter. Wählen Sie nach Möglichkeit eines mit Unterstützung für Tool-Aufrufe und starten Sie dann dessen Server.", "provider.anaconda.state.noServer_one": "1 heruntergeladenes Textgenerierungsmodell ist verfügbar. Starten Sie in Anaconda Desktop einen Modellserver. Modelle mit Unterstützung für Tool-Aufrufe werden dringend empfohlen.", "provider.anaconda.state.noServer_other": "{{count}} heruntergeladene Textgenerierungsmodelle sind verfügbar. Starten Sie in Anaconda Desktop einen Modellserver. Modelle mit Unterstützung für Tool-Aufrufe werden dringend empfohlen.", + "provider.anaconda.state.unhealthy": + "Der aktive Inferenzserver ist noch nicht funktionsfähig. Überprüfen Sie ihn in Anaconda Desktop und starten Sie den Server bei Bedarf neu.", + "provider.anaconda.state.ready": + "Kilo hat einen funktionsfähigen lokalen Textgenerierungsserver gefunden und kann dessen aktuelle Verbindungseinstellungen importieren.", + "provider.anaconda.server": "Aktiver Inferenzserver", + "provider.anaconda.context": "Kontextfenster", + "provider.anaconda.contextValue": "{{count}} Token", + "provider.anaconda.tools": "Tool-Aufrufe", + "provider.anaconda.tools.supported": "Unterstützt", + "provider.anaconda.tools.unsupported": "Nicht aktiviert", + "provider.anaconda.tools.unknown": "Unbekannt", + "provider.anaconda.warning.title": "Tool-Unterstützung ist eingeschränkt", + "provider.anaconda.warning.description": + "Dieser Server bestätigt keine Tool-Aufrufe. Aktionen des Coding-Agenten können fehlschlagen oder nicht verfügbar sein. Fahren Sie nur fort, wenn Sie diese Einschränkungen akzeptieren.", + "provider.anaconda.action.download": "Anaconda Desktop herunterladen", + "provider.anaconda.action.open": "Anaconda Desktop öffnen", + "provider.anaconda.action.checkAgain": "Erneut prüfen", + "provider.anaconda.action.continue": "Trotzdem fortfahren", + "provider.anaconda.action.manage": "Verwalten / Aktualisieren", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop aktualisiert", + "provider.anaconda.toast.refreshed.description": + "Der aktive lokale Server und die Modelle sind in Kilo auf dem neuesten Stand.", + "settings.providers.note.anacondaDesktop": + "Führen Sie ein Modell aus, das lokal von Anaconda Desktop bereitgestellt wird.", + "settings.providers.tag.local": "Lokal", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Vorgeschlagen", "command.category.view": "Ansicht", "command.category.project": "Projekt", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index 99ae82e6df0..b0c1eac1534 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Comprobar de nuevo", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Conectar Anaconda Desktop", + "provider.anaconda.title.manage": "Administrar Anaconda Desktop", + "provider.anaconda.status.checking": "Comprobando Anaconda Desktop...", + "provider.anaconda.status.opening": "Abriendo Anaconda Desktop...", + "provider.anaconda.status.syncing": "Actualizando modelos del proveedor...", + "provider.anaconda.status.ready": "Listo para conectar", + "provider.anaconda.status.waiting": "Esperando a Desktop", + "provider.anaconda.status.attention": "Requiere atención", + "provider.anaconda.status.unavailable": "No disponible", + "provider.anaconda.state.unsupported": "Anaconda Desktop no es compatible con {{platform}}.", + "provider.anaconda.state.notInstalled": + "Instala Anaconda Desktop en este equipo y luego vuelve aquí. Kilo no ejecuta el instalador por ti.", + "provider.anaconda.state.notRunning": + "Abre Anaconda Desktop, completa la configuración e inicia sesión, luego elige Comprobar de nuevo.", + "provider.anaconda.state.invalidConfig": + "La configuración de Anaconda Desktop está incompleta. Abre Desktop, completa la configuración y reinícialo si es necesario.", + "provider.anaconda.state.signedOut": "Abre Anaconda Desktop e inicia sesión antes de conectar Kilo.", + "provider.anaconda.state.unauthorized": + "Kilo no pudo acceder a Anaconda Desktop. Abre Desktop, inicia sesión de nuevo y reinícialo si es necesario.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop aún no responde. Ábrelo y espera a que la aplicación termine de iniciarse.", + "provider.anaconda.state.noModel": + "En Anaconda Desktop, descarga un modelo de generación de texto. Elige uno con llamadas a herramientas cuando sea posible y luego inicia su servidor.", "provider.anaconda.state.noServer_one": "Hay 1 modelo de generación de texto descargado disponible. En Anaconda Desktop, inicia un servidor de modelos. Se recomienda encarecidamente usar modelos compatibles con llamadas a herramientas.", "provider.anaconda.state.noServer_other": "Hay {{count}} modelos de generación de texto descargados disponibles. En Anaconda Desktop, inicia un servidor de modelos. Se recomienda encarecidamente usar modelos compatibles con llamadas a herramientas.", + "provider.anaconda.state.unhealthy": + "El servidor de inferencia activo aún no está en buen estado. Compruébalo en Anaconda Desktop y reinicia el servidor si es necesario.", + "provider.anaconda.state.ready": + "Kilo encontró un servidor local de generación de texto en buen estado y puede importar su configuración de conexión actual.", + "provider.anaconda.server": "Servidor de inferencia activo", + "provider.anaconda.context": "Ventana de contexto", + "provider.anaconda.contextValue": "{{count}} tokens", + "provider.anaconda.tools": "Llamadas a herramientas", + "provider.anaconda.tools.supported": "Compatible", + "provider.anaconda.tools.unsupported": "No habilitado", + "provider.anaconda.tools.unknown": "Desconocido", + "provider.anaconda.warning.title": "La compatibilidad con herramientas es limitada", + "provider.anaconda.warning.description": + "Este servidor no confirma las llamadas a herramientas. Las acciones del agente de programación pueden fallar o no estar disponibles. Continúa solo si aceptas estas limitaciones.", + "provider.anaconda.action.download": "Descargar Anaconda Desktop", + "provider.anaconda.action.open": "Abrir Anaconda Desktop", + "provider.anaconda.action.checkAgain": "Comprobar de nuevo", + "provider.anaconda.action.continue": "Continuar de todos modos", + "provider.anaconda.action.manage": "Administrar / Actualizar", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop actualizado", + "provider.anaconda.toast.refreshed.description": "El servidor local activo y los modelos están actualizados en Kilo.", + "settings.providers.note.anacondaDesktop": "Ejecuta un modelo servido localmente por Anaconda Desktop.", + "settings.providers.tag.local": "Local", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Sugerido", "command.category.view": "Ver", "command.category.project": "Proyecto", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index e39fdefb54d..7af7271d0cb 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Vérifier à nouveau", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Connecter Anaconda Desktop", + "provider.anaconda.title.manage": "Gérer Anaconda Desktop", + "provider.anaconda.status.checking": "Vérification d’Anaconda Desktop...", + "provider.anaconda.status.opening": "Ouverture d’Anaconda Desktop...", + "provider.anaconda.status.syncing": "Actualisation des modèles du fournisseur...", + "provider.anaconda.status.ready": "Prêt à se connecter", + "provider.anaconda.status.waiting": "En attente de Desktop", + "provider.anaconda.status.attention": "Nécessite une attention", + "provider.anaconda.status.unavailable": "Indisponible", + "provider.anaconda.state.unsupported": "Anaconda Desktop n’est pas pris en charge sur {{platform}}.", + "provider.anaconda.state.notInstalled": + "Installez Anaconda Desktop sur cette machine, puis revenez ici. Kilo n’exécute pas l’installateur à votre place.", + "provider.anaconda.state.notRunning": + "Ouvrez Anaconda Desktop, terminez la configuration et connectez-vous, puis choisissez Vérifier à nouveau.", + "provider.anaconda.state.invalidConfig": + "La configuration d’Anaconda Desktop est incomplète. Ouvrez Desktop, terminez la configuration et redémarrez-le si nécessaire.", + "provider.anaconda.state.signedOut": "Ouvrez Anaconda Desktop et connectez-vous avant de connecter Kilo.", + "provider.anaconda.state.unauthorized": + "Kilo n’a pas pu accéder à Anaconda Desktop. Ouvrez Desktop, reconnectez-vous et redémarrez-le si nécessaire.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop ne répond pas encore. Ouvrez-le et attendez que l’application finisse de démarrer.", + "provider.anaconda.state.noModel": + "Dans Anaconda Desktop, téléchargez un modèle de génération de texte. Choisissez-en un prenant en charge l’appel d’outils si possible, puis démarrez son serveur.", "provider.anaconda.state.noServer_one": "1 modèle de génération de texte téléchargé est disponible. Dans Anaconda Desktop, démarrez un serveur de modèle. Les modèles prenant en charge l’appel d’outils sont vivement recommandés.", "provider.anaconda.state.noServer_other": "{{count}} modèles de génération de texte téléchargés sont disponibles. Dans Anaconda Desktop, démarrez un serveur de modèle. Les modèles prenant en charge l’appel d’outils sont vivement recommandés.", + "provider.anaconda.state.unhealthy": + "Le serveur d’inférence actif n’est pas encore sain. Vérifiez-le dans Anaconda Desktop et redémarrez le serveur si nécessaire.", + "provider.anaconda.state.ready": + "Kilo a trouvé un serveur local sain de génération de texte et peut importer ses paramètres de connexion actuels.", + "provider.anaconda.server": "Serveur d’inférence actif", + "provider.anaconda.context": "Fenêtre de contexte", + "provider.anaconda.contextValue": "{{count}} jetons", + "provider.anaconda.tools": "Appel d’outils", + "provider.anaconda.tools.supported": "Pris en charge", + "provider.anaconda.tools.unsupported": "Non activé", + "provider.anaconda.tools.unknown": "Inconnu", + "provider.anaconda.warning.title": "La prise en charge des outils est limitée", + "provider.anaconda.warning.description": + "Ce serveur ne confirme pas l’appel d’outils. Les actions de l’agent de codage peuvent échouer ou être indisponibles. Ne continuez que si vous acceptez ces limitations.", + "provider.anaconda.action.download": "Télécharger Anaconda Desktop", + "provider.anaconda.action.open": "Ouvrir Anaconda Desktop", + "provider.anaconda.action.checkAgain": "Vérifier à nouveau", + "provider.anaconda.action.continue": "Continuer quand même", + "provider.anaconda.action.manage": "Gérer / Actualiser", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop actualisé", + "provider.anaconda.toast.refreshed.description": "Le serveur local actif et les modèles sont à jour dans Kilo.", + "settings.providers.note.anacondaDesktop": "Exécutez un modèle servi localement par Anaconda Desktop.", + "settings.providers.tag.local": "Local", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Suggéré", "command.category.view": "Affichage", "command.category.project": "Projet", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/it.ts b/packages/kilo-vscode/webview-ui/src/i18n/it.ts index fd3f645aefd..10ed5936472 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/it.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/it.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Controlla di nuovo", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Connetti Anaconda Desktop", + "provider.anaconda.title.manage": "Gestisci Anaconda Desktop", + "provider.anaconda.status.checking": "Controllo di Anaconda Desktop in corso...", + "provider.anaconda.status.opening": "Apertura di Anaconda Desktop in corso...", + "provider.anaconda.status.syncing": "Aggiornamento dei modelli del provider in corso...", + "provider.anaconda.status.ready": "Pronto per la connessione", + "provider.anaconda.status.waiting": "In attesa di Desktop", + "provider.anaconda.status.attention": "Richiede attenzione", + "provider.anaconda.status.unavailable": "Non disponibile", + "provider.anaconda.state.unsupported": "Anaconda Desktop non è supportato su {{platform}}.", + "provider.anaconda.state.notInstalled": + "Installa Anaconda Desktop su questo computer, poi torna qui. Kilo non esegue il programma di installazione per te.", + "provider.anaconda.state.notRunning": + "Apri Anaconda Desktop, completa la configurazione e accedi, poi scegli Controlla di nuovo.", + "provider.anaconda.state.invalidConfig": + "La configurazione di Anaconda Desktop è incompleta. Apri Desktop, completa la configurazione e riavvialo se necessario.", + "provider.anaconda.state.signedOut": "Apri Anaconda Desktop e accedi prima di connettere Kilo.", + "provider.anaconda.state.unauthorized": + "Kilo non è riuscito ad accedere ad Anaconda Desktop. Apri Desktop, accedi di nuovo e riavvialo se necessario.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop non risponde ancora. Aprilo e attendi che l'applicazione finisca di avviarsi.", + "provider.anaconda.state.noModel": + "In Anaconda Desktop, scarica un modello di generazione del testo. Quando possibile, scegline uno con il supporto alle chiamate agli strumenti, poi avvia il suo server.", "provider.anaconda.state.noServer_one": "È disponibile 1 modello di generazione del testo scaricato. In Anaconda Desktop, avvia un server di modelli. I modelli che supportano le chiamate agli strumenti sono fortemente consigliati.", "provider.anaconda.state.noServer_other": "Sono disponibili {{count}} modelli di generazione del testo scaricati. In Anaconda Desktop, avvia un server di modelli. I modelli che supportano le chiamate agli strumenti sono fortemente consigliati.", + "provider.anaconda.state.unhealthy": + "Il server di inferenza attivo non è ancora integro. Controllalo in Anaconda Desktop e riavvia il server se necessario.", + "provider.anaconda.state.ready": + "Kilo ha trovato un server locale di generazione del testo integro e può importare le sue attuali impostazioni di connessione.", + "provider.anaconda.server": "Server di inferenza attivo", + "provider.anaconda.context": "Finestra di contesto", + "provider.anaconda.contextValue": "{{count}} token", + "provider.anaconda.tools": "Chiamata agli strumenti", + "provider.anaconda.tools.supported": "Supportata", + "provider.anaconda.tools.unsupported": "Non abilitata", + "provider.anaconda.tools.unknown": "Sconosciuta", + "provider.anaconda.warning.title": "Il supporto agli strumenti è limitato", + "provider.anaconda.warning.description": + "Questo server non conferma la chiamata agli strumenti. Le azioni dell'agente di programmazione potrebbero non riuscire o non essere disponibili. Continua solo se accetti queste limitazioni.", + "provider.anaconda.action.download": "Scarica Anaconda Desktop", + "provider.anaconda.action.open": "Apri Anaconda Desktop", + "provider.anaconda.action.checkAgain": "Controlla di nuovo", + "provider.anaconda.action.continue": "Continua comunque", + "provider.anaconda.action.manage": "Gestisci / Aggiorna", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop aggiornato", + "provider.anaconda.toast.refreshed.description": "Il server locale attivo e i modelli sono aggiornati in Kilo.", + "settings.providers.note.anacondaDesktop": "Esegui un modello servito localmente da Anaconda Desktop.", + "settings.providers.tag.local": "Locale", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Suggeriti", "command.category.view": "Vista", "command.category.project": "Progetto", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index 6cd6423591c..6fefcd57518 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "再確認", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Anaconda Desktop に接続", + "provider.anaconda.title.manage": "Anaconda Desktop を管理", + "provider.anaconda.status.checking": "Anaconda Desktop を確認しています...", + "provider.anaconda.status.opening": "Anaconda Desktop を開いています...", + "provider.anaconda.status.syncing": "プロバイダーのモデルを更新しています...", + "provider.anaconda.status.ready": "接続の準備ができました", + "provider.anaconda.status.waiting": "Desktop を待機しています", + "provider.anaconda.status.attention": "対応が必要です", + "provider.anaconda.status.unavailable": "利用できません", + "provider.anaconda.state.unsupported": "Anaconda Desktop は {{platform}} ではサポートされていません。", + "provider.anaconda.state.notInstalled": + "このマシンに Anaconda Desktop をインストールしてから、ここに戻ってください。Kilo はインストーラーを実行しません。", + "provider.anaconda.state.notRunning": + "Anaconda Desktop を開いてセットアップを完了しサインインしてから、再確認を選択してください。", + "provider.anaconda.state.invalidConfig": + "Anaconda Desktop のセットアップが完了していません。Desktop を開いてセットアップを完了し、必要に応じて再起動してください。", + "provider.anaconda.state.signedOut": "Kilo を接続する前に、Anaconda Desktop を開いてサインインしてください。", + "provider.anaconda.state.unauthorized": + "Kilo は Anaconda Desktop にアクセスできませんでした。Desktop を開いて再度サインインし、必要に応じて再起動してください。", + "provider.anaconda.state.unavailable": + "Anaconda Desktop はまだ応答していません。開いてアプリケーションの起動が完了するまでお待ちください。", + "provider.anaconda.state.noModel": + "Anaconda Desktop で、テキスト生成モデルをダウンロードしてください。可能であればツール呼び出しに対応したモデルを選び、そのサーバーを起動してください。", "provider.anaconda.state.noServer_one": "ダウンロード済みのテキスト生成モデルが1つ利用可能です。Anaconda Desktopでモデルサーバーを起動してください。ツール呼び出しに対応したモデルの使用を強く推奨します。", "provider.anaconda.state.noServer_other": "ダウンロード済みのテキスト生成モデルが{{count}}個利用可能です。Anaconda Desktopでモデルサーバーを起動してください。ツール呼び出しに対応したモデルの使用を強く推奨します。", + "provider.anaconda.state.unhealthy": + "アクティブな推論サーバーはまだ正常ではありません。Anaconda Desktop で確認し、必要に応じてサーバーを再起動してください。", + "provider.anaconda.state.ready": + "Kilo は正常なローカルのテキスト生成サーバーを見つけ、現在の接続設定をインポートできます。", + "provider.anaconda.server": "アクティブな推論サーバー", + "provider.anaconda.context": "コンテキストウィンドウ", + "provider.anaconda.contextValue": "{{count}} トークン", + "provider.anaconda.tools": "ツール呼び出し", + "provider.anaconda.tools.supported": "対応", + "provider.anaconda.tools.unsupported": "無効", + "provider.anaconda.tools.unknown": "不明", + "provider.anaconda.warning.title": "ツールのサポートは限定的です", + "provider.anaconda.warning.description": + "このサーバーはツール呼び出しを確認できません。コーディングエージェントの操作が失敗したり利用できなかったりする場合があります。これらの制限を受け入れる場合のみ続行してください。", + "provider.anaconda.action.download": "Anaconda Desktop をダウンロード", + "provider.anaconda.action.open": "Anaconda Desktop を開く", + "provider.anaconda.action.checkAgain": "再確認", + "provider.anaconda.action.continue": "このまま続行", + "provider.anaconda.action.manage": "管理 / 更新", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop を更新しました", + "provider.anaconda.toast.refreshed.description": "アクティブなローカルサーバーとモデルが Kilo で最新になりました。", + "settings.providers.note.anacondaDesktop": "Anaconda Desktop によってローカルで提供されるモデルを実行します。", + "settings.providers.tag.local": "ローカル", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "おすすめ", "command.category.view": "表示", "command.category.project": "プロジェクト", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index 04c2fc699a6..03ec50dba71 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -1,14 +1,62 @@ -import { anacondaDesktopDict, dict as en } from "./en" +import { dict as en } from "./en" + +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Anaconda Desktop 연결", + "provider.anaconda.title.manage": "Anaconda Desktop 관리", + "provider.anaconda.status.checking": "Anaconda Desktop 확인 중...", + "provider.anaconda.status.opening": "Anaconda Desktop 여는 중...", + "provider.anaconda.status.syncing": "공급자 모델 새로 고치는 중...", + "provider.anaconda.status.ready": "연결할 준비됨", + "provider.anaconda.status.waiting": "Desktop 대기 중", + "provider.anaconda.status.attention": "주의 필요", + "provider.anaconda.status.unavailable": "사용할 수 없음", + "provider.anaconda.state.unsupported": "Anaconda Desktop은 {{platform}}에서 지원되지 않습니다.", + "provider.anaconda.state.notInstalled": + "이 컴퓨터에 Anaconda Desktop을 설치한 후 여기로 돌아오세요. Kilo는 설치 프로그램을 대신 실행하지 않습니다.", + "provider.anaconda.state.notRunning": + "Anaconda Desktop을 열고 설정을 완료한 후 로그인한 다음 다시 확인을 선택하세요.", + "provider.anaconda.state.invalidConfig": + "Anaconda Desktop 설정이 완료되지 않았습니다. Desktop을 열고 설정을 완료한 후 필요하면 다시 시작하세요.", + "provider.anaconda.state.signedOut": "Kilo를 연결하기 전에 Anaconda Desktop을 열고 로그인하세요.", + "provider.anaconda.state.unauthorized": + "Kilo가 Anaconda Desktop에 접근할 수 없습니다. Desktop을 열고 다시 로그인한 후 필요하면 다시 시작하세요.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop이 아직 응답하지 않습니다. 열어서 애플리케이션이 완전히 시작될 때까지 기다리세요.", + "provider.anaconda.state.noModel": + "Anaconda Desktop에서 텍스트 생성 모델을 다운로드하세요. 가능하면 도구 호출을 지원하는 모델을 선택한 후 서버를 시작하세요.", + "provider.anaconda.state.noServer_one": + "다운로드된 텍스트 생성 모델 1개를 사용할 수 있습니다. Anaconda Desktop에서 모델 서버를 시작하세요. 도구 호출을 지원하는 모델을 강력히 권장합니다.", + "provider.anaconda.state.noServer_other": + "다운로드된 텍스트 생성 모델 {{count}}개를 사용할 수 있습니다. Anaconda Desktop에서 모델 서버를 시작하세요. 도구 호출을 지원하는 모델을 강력히 권장합니다.", + "provider.anaconda.state.unhealthy": + "활성 추론 서버가 아직 정상이 아닙니다. Anaconda Desktop에서 확인하고 필요하면 서버를 다시 시작하세요.", + "provider.anaconda.state.ready": + "Kilo가 정상적인 로컬 텍스트 생성 서버를 찾았으며 현재 연결 설정을 가져올 수 있습니다.", + "provider.anaconda.server": "활성 추론 서버", + "provider.anaconda.context": "컨텍스트 창", + "provider.anaconda.contextValue": "{{count}} 토큰", + "provider.anaconda.tools": "도구 호출", + "provider.anaconda.tools.supported": "지원됨", + "provider.anaconda.tools.unsupported": "사용 안 함", + "provider.anaconda.tools.unknown": "알 수 없음", + "provider.anaconda.warning.title": "도구 지원이 제한적입니다", + "provider.anaconda.warning.description": + "이 서버는 도구 호출을 확인하지 않습니다. 코딩 에이전트 작업이 실패하거나 사용할 수 없을 수 있습니다. 이러한 제한을 감수하는 경우에만 계속하세요.", + "provider.anaconda.action.download": "Anaconda Desktop 다운로드", + "provider.anaconda.action.open": "Anaconda Desktop 열기", + "provider.anaconda.action.checkAgain": "다시 확인", + "provider.anaconda.action.continue": "계속하기", + "provider.anaconda.action.manage": "관리 / 새로 고침", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop 새로 고침됨", + "provider.anaconda.toast.refreshed.description": "활성 로컬 서버와 모델이 Kilo에서 최신 상태입니다.", + "settings.providers.note.anacondaDesktop": "Anaconda Desktop이 로컬에서 제공하는 모델을 실행합니다.", + "settings.providers.tag.local": "로컬", +} as const type Keys = keyof typeof en export const dict = { ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "다시 확인", - "provider.anaconda.state.noServer_one": - "다운로드된 텍스트 생성 모델 1개를 사용할 수 있습니다. Anaconda Desktop에서 모델 서버를 시작하세요. 도구 호출을 지원하는 모델을 강력히 권장합니다.", - "provider.anaconda.state.noServer_other": - "다운로드된 텍스트 생성 모델 {{count}}개를 사용할 수 있습니다. Anaconda Desktop에서 모델 서버를 시작하세요. 도구 호출을 지원하는 모델을 강력히 권장합니다.", "command.category.suggested": "추천", "command.category.view": "보기", "command.category.project": "프로젝트", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index 15e07ecddd8..af6719f3d33 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Opnieuw controleren", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Anaconda Desktop verbinden", + "provider.anaconda.title.manage": "Anaconda Desktop beheren", + "provider.anaconda.status.checking": "Anaconda Desktop controleren...", + "provider.anaconda.status.opening": "Anaconda Desktop openen...", + "provider.anaconda.status.syncing": "Providermodellen vernieuwen...", + "provider.anaconda.status.ready": "Klaar om te verbinden", + "provider.anaconda.status.waiting": "Wachten op Desktop", + "provider.anaconda.status.attention": "Vereist aandacht", + "provider.anaconda.status.unavailable": "Niet beschikbaar", + "provider.anaconda.state.unsupported": "Anaconda Desktop wordt niet ondersteund op {{platform}}.", + "provider.anaconda.state.notInstalled": + "Installeer Anaconda Desktop op deze machine en kom hier dan terug. Kilo voert het installatieprogramma niet voor je uit.", + "provider.anaconda.state.notRunning": + "Open Anaconda Desktop, voltooi de installatie en meld je aan, kies daarna Opnieuw controleren.", + "provider.anaconda.state.invalidConfig": + "De installatie van Anaconda Desktop is onvolledig. Open Desktop, voltooi de installatie en herstart het indien nodig.", + "provider.anaconda.state.signedOut": "Open Anaconda Desktop en meld je aan voordat je Kilo verbindt.", + "provider.anaconda.state.unauthorized": + "Kilo kon geen toegang krijgen tot Anaconda Desktop. Open Desktop, meld je opnieuw aan en herstart het indien nodig.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop reageert nog niet. Open het en wacht tot de applicatie volledig is opgestart.", + "provider.anaconda.state.noModel": + "Download in Anaconda Desktop een tekstgeneratiemodel. Kies er indien mogelijk een met ondersteuning voor toolaanroepen en start daarna de server.", "provider.anaconda.state.noServer_one": "Er is 1 gedownload tekstgeneratiemodel beschikbaar. Start een modelserver in Anaconda Desktop. Modellen met ondersteuning voor toolaanroepen worden sterk aanbevolen.", "provider.anaconda.state.noServer_other": "Er zijn {{count}} gedownloade tekstgeneratiemodellen beschikbaar. Start een modelserver in Anaconda Desktop. Modellen met ondersteuning voor toolaanroepen worden sterk aanbevolen.", + "provider.anaconda.state.unhealthy": + "De actieve inferentieserver is nog niet gezond. Controleer deze in Anaconda Desktop en herstart de server indien nodig.", + "provider.anaconda.state.ready": + "Kilo heeft een gezonde lokale tekstgeneratieserver gevonden en kan de huidige verbindingsinstellingen importeren.", + "provider.anaconda.server": "Actieve inferentieserver", + "provider.anaconda.context": "Contextvenster", + "provider.anaconda.contextValue": "{{count}} tokens", + "provider.anaconda.tools": "Toolaanroepen", + "provider.anaconda.tools.supported": "Ondersteund", + "provider.anaconda.tools.unsupported": "Niet ingeschakeld", + "provider.anaconda.tools.unknown": "Onbekend", + "provider.anaconda.warning.title": "Toolondersteuning is beperkt", + "provider.anaconda.warning.description": + "Deze server bevestigt geen toolaanroepen. Acties van de codeeragent kunnen mislukken of niet beschikbaar zijn. Ga alleen verder als je deze beperkingen accepteert.", + "provider.anaconda.action.download": "Anaconda Desktop downloaden", + "provider.anaconda.action.open": "Anaconda Desktop openen", + "provider.anaconda.action.checkAgain": "Opnieuw controleren", + "provider.anaconda.action.continue": "Toch doorgaan", + "provider.anaconda.action.manage": "Beheren / Vernieuwen", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop vernieuwd", + "provider.anaconda.toast.refreshed.description": "De actieve lokale server en modellen zijn up-to-date in Kilo.", + "settings.providers.note.anacondaDesktop": "Voer een model uit dat lokaal door Anaconda Desktop wordt aangeboden.", + "settings.providers.tag.local": "Lokaal", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Voorgesteld", "command.category.view": "Weergave", "command.category.project": "Project", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index 2e1f8aee272..5a1c901b863 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -1,13 +1,61 @@ -import { anacondaDesktopDict, dict as en } from "./en" +import { dict as en } from "./en" type Keys = keyof typeof en -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Sjekk igjen", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Koble til Anaconda Desktop", + "provider.anaconda.title.manage": "Administrer Anaconda Desktop", + "provider.anaconda.status.checking": "Sjekker Anaconda Desktop...", + "provider.anaconda.status.opening": "Åpner Anaconda Desktop...", + "provider.anaconda.status.syncing": "Oppdaterer leverandørmodeller...", + "provider.anaconda.status.ready": "Klar til å koble til", + "provider.anaconda.status.waiting": "Venter på Desktop", + "provider.anaconda.status.attention": "Trenger oppmerksomhet", + "provider.anaconda.status.unavailable": "Utilgjengelig", + "provider.anaconda.state.unsupported": "Anaconda Desktop støttes ikke på {{platform}}.", + "provider.anaconda.state.notInstalled": + "Installer Anaconda Desktop på denne maskinen, og kom deretter tilbake hit. Kilo kjører ikke installasjonsprogrammet for deg.", + "provider.anaconda.state.notRunning": + "Åpne Anaconda Desktop, fullfør oppsettet og logg inn, og velg deretter Sjekk igjen.", + "provider.anaconda.state.invalidConfig": + "Oppsettet av Anaconda Desktop er ufullstendig. Åpne Desktop, fullfør oppsettet, og start det på nytt om nødvendig.", + "provider.anaconda.state.signedOut": "Åpne Anaconda Desktop og logg inn før du kobler til Kilo.", + "provider.anaconda.state.unauthorized": + "Kilo fikk ikke tilgang til Anaconda Desktop. Åpne Desktop, logg inn på nytt, og start det på nytt om nødvendig.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop svarer ikke ennå. Åpne det og vent til applikasjonen er ferdig med å starte.", + "provider.anaconda.state.noModel": + "Last ned en tekstgenereringsmodell i Anaconda Desktop. Velg en med støtte for verktøykall når det er mulig, og start deretter serveren.", "provider.anaconda.state.noServer_one": "1 nedlastet tekstgenereringsmodell er tilgjengelig. Start en modellserver i Anaconda Desktop. Modeller med støtte for verktøykall anbefales på det sterkeste.", "provider.anaconda.state.noServer_other": "{{count}} nedlastede tekstgenereringsmodeller er tilgjengelige. Start en modellserver i Anaconda Desktop. Modeller med støtte for verktøykall anbefales på det sterkeste.", + "provider.anaconda.state.unhealthy": + "Den aktive inferensserveren er ikke sunn ennå. Sjekk den i Anaconda Desktop og start serveren på nytt om nødvendig.", + "provider.anaconda.state.ready": + "Kilo fant en sunn lokal tekstgenereringsserver og kan importere de gjeldende tilkoblingsinnstillingene.", + "provider.anaconda.server": "Aktiv inferensserver", + "provider.anaconda.context": "Kontekstvindu", + "provider.anaconda.contextValue": "{{count}} tokens", + "provider.anaconda.tools": "Verktøykall", + "provider.anaconda.tools.supported": "Støttet", + "provider.anaconda.tools.unsupported": "Ikke aktivert", + "provider.anaconda.tools.unknown": "Ukjent", + "provider.anaconda.warning.title": "Verktøystøtte er begrenset", + "provider.anaconda.warning.description": + "Denne serveren bekrefter ikke verktøykall. Handlinger fra kodeagenten kan mislykkes eller være utilgjengelige. Fortsett bare hvis du godtar disse begrensningene.", + "provider.anaconda.action.download": "Last ned Anaconda Desktop", + "provider.anaconda.action.open": "Åpne Anaconda Desktop", + "provider.anaconda.action.checkAgain": "Sjekk igjen", + "provider.anaconda.action.continue": "Fortsett likevel", + "provider.anaconda.action.manage": "Administrer / Oppdater", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop oppdatert", + "provider.anaconda.toast.refreshed.description": "Den aktive lokale serveren og modellene er oppdatert i Kilo.", + "settings.providers.note.anacondaDesktop": "Kjør en modell som serveres lokalt av Anaconda Desktop.", + "settings.providers.tag.local": "Lokal", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Foreslått", "command.category.view": "Visning", "command.category.project": "Prosjekt", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index 921c0b5793a..88b92450d1f 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Sprawdź ponownie", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Połącz Anaconda Desktop", + "provider.anaconda.title.manage": "Zarządzaj Anaconda Desktop", + "provider.anaconda.status.checking": "Sprawdzanie Anaconda Desktop...", + "provider.anaconda.status.opening": "Otwieranie Anaconda Desktop...", + "provider.anaconda.status.syncing": "Odświeżanie modeli dostawcy...", + "provider.anaconda.status.ready": "Gotowy do połączenia", + "provider.anaconda.status.waiting": "Oczekiwanie na Desktop", + "provider.anaconda.status.attention": "Wymaga uwagi", + "provider.anaconda.status.unavailable": "Niedostępny", + "provider.anaconda.state.unsupported": "Anaconda Desktop nie jest obsługiwana w systemie {{platform}}.", + "provider.anaconda.state.notInstalled": + "Zainstaluj Anaconda Desktop na tym komputerze, a następnie wróć tutaj. Kilo nie uruchamia instalatora za Ciebie.", + "provider.anaconda.state.notRunning": + "Otwórz Anaconda Desktop, dokończ konfigurację i zaloguj się, a następnie wybierz Sprawdź ponownie.", + "provider.anaconda.state.invalidConfig": + "Konfiguracja Anaconda Desktop jest niekompletna. Otwórz Desktop, dokończ konfigurację i w razie potrzeby uruchom ją ponownie.", + "provider.anaconda.state.signedOut": "Otwórz Anaconda Desktop i zaloguj się przed połączeniem Kilo.", + "provider.anaconda.state.unauthorized": + "Kilo nie mógł uzyskać dostępu do Anaconda Desktop. Otwórz Desktop, zaloguj się ponownie i w razie potrzeby uruchom ją ponownie.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop jeszcze nie odpowiada. Otwórz ją i poczekaj, aż aplikacja zakończy uruchamianie.", + "provider.anaconda.state.noModel": + "W Anaconda Desktop pobierz model generowania tekstu. Jeśli to możliwe, wybierz model obsługujący wywoływanie narzędzi, a następnie uruchom jego serwer.", "provider.anaconda.state.noServer_one": "Dostępny jest 1 pobrany model generowania tekstu. W Anaconda Desktop uruchom serwer modelu. Zdecydowanie zalecamy modele obsługujące wywoływanie narzędzi.", "provider.anaconda.state.noServer_other": "Dostępne są pobrane modele generowania tekstu (łącznie: {{count}}). W Anaconda Desktop uruchom serwer modelu. Zdecydowanie zalecamy modele obsługujące wywoływanie narzędzi.", + "provider.anaconda.state.unhealthy": + "Aktywny serwer wnioskowania nie jest jeszcze sprawny. Sprawdź go w Anaconda Desktop i w razie potrzeby uruchom serwer ponownie.", + "provider.anaconda.state.ready": + "Kilo znalazł sprawny lokalny serwer generowania tekstu i może zaimportować jego bieżące ustawienia połączenia.", + "provider.anaconda.server": "Aktywny serwer wnioskowania", + "provider.anaconda.context": "Okno kontekstu", + "provider.anaconda.contextValue": "{{count}} tokenów", + "provider.anaconda.tools": "Wywoływanie narzędzi", + "provider.anaconda.tools.supported": "Obsługiwane", + "provider.anaconda.tools.unsupported": "Nie włączone", + "provider.anaconda.tools.unknown": "Nieznane", + "provider.anaconda.warning.title": "Obsługa narzędzi jest ograniczona", + "provider.anaconda.warning.description": + "Ten serwer nie potwierdza wywoływania narzędzi. Działania agenta kodującego mogą się nie powieść lub być niedostępne. Kontynuuj tylko wtedy, gdy akceptujesz te ograniczenia.", + "provider.anaconda.action.download": "Pobierz Anaconda Desktop", + "provider.anaconda.action.open": "Otwórz Anaconda Desktop", + "provider.anaconda.action.checkAgain": "Sprawdź ponownie", + "provider.anaconda.action.continue": "Kontynuuj mimo to", + "provider.anaconda.action.manage": "Zarządzaj / Odśwież", + "provider.anaconda.toast.refreshed.title": "Odświeżono Anaconda Desktop", + "provider.anaconda.toast.refreshed.description": "Aktywny serwer lokalny i modele są aktualne w Kilo.", + "settings.providers.note.anacondaDesktop": "Uruchom model serwowany lokalnie przez Anaconda Desktop.", + "settings.providers.tag.local": "Lokalny", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Sugerowane", "command.category.view": "Widok", "command.category.project": "Projekt", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index 1fb900ca781..d23a40bbd70 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Проверить снова", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Подключить Anaconda Desktop", + "provider.anaconda.title.manage": "Управление Anaconda Desktop", + "provider.anaconda.status.checking": "Проверка Anaconda Desktop...", + "provider.anaconda.status.opening": "Открытие Anaconda Desktop...", + "provider.anaconda.status.syncing": "Обновление моделей провайдера...", + "provider.anaconda.status.ready": "Готово к подключению", + "provider.anaconda.status.waiting": "Ожидание Desktop", + "provider.anaconda.status.attention": "Требуется внимание", + "provider.anaconda.status.unavailable": "Недоступно", + "provider.anaconda.state.unsupported": "Anaconda Desktop не поддерживается на {{platform}}.", + "provider.anaconda.state.notInstalled": + "Установите Anaconda Desktop на этом компьютере, затем вернитесь сюда. Kilo не запускает установщик за вас.", + "provider.anaconda.state.notRunning": + "Откройте Anaconda Desktop, завершите настройку и войдите в систему, затем выберите «Проверить снова».", + "provider.anaconda.state.invalidConfig": + "Настройка Anaconda Desktop не завершена. Откройте Desktop, завершите настройку и при необходимости перезапустите его.", + "provider.anaconda.state.signedOut": "Откройте Anaconda Desktop и войдите в систему перед подключением Kilo.", + "provider.anaconda.state.unauthorized": + "Kilo не удалось получить доступ к Anaconda Desktop. Откройте Desktop, войдите снова и при необходимости перезапустите его.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop пока не отвечает. Откройте его и дождитесь завершения запуска приложения.", + "provider.anaconda.state.noModel": + "В Anaconda Desktop загрузите модель генерации текста. По возможности выберите модель с поддержкой вызова инструментов, затем запустите её сервер.", "provider.anaconda.state.noServer_one": "Доступна 1 загруженная модель генерации текста. Запустите сервер модели в Anaconda Desktop. Настоятельно рекомендуется использовать модели с поддержкой вызова инструментов.", "provider.anaconda.state.noServer_other": "Доступно загруженных моделей генерации текста: {{count}}. Запустите сервер модели в Anaconda Desktop. Настоятельно рекомендуется использовать модели с поддержкой вызова инструментов.", + "provider.anaconda.state.unhealthy": + "Активный сервер вывода пока не работает исправно. Проверьте его в Anaconda Desktop и при необходимости перезапустите сервер.", + "provider.anaconda.state.ready": + "Kilo обнаружил исправный локальный сервер генерации текста и может импортировать его текущие настройки подключения.", + "provider.anaconda.server": "Активный сервер вывода", + "provider.anaconda.context": "Контекстное окно", + "provider.anaconda.contextValue": "{{count}} токенов", + "provider.anaconda.tools": "Вызов инструментов", + "provider.anaconda.tools.supported": "Поддерживается", + "provider.anaconda.tools.unsupported": "Не включено", + "provider.anaconda.tools.unknown": "Неизвестно", + "provider.anaconda.warning.title": "Поддержка инструментов ограничена", + "provider.anaconda.warning.description": + "Этот сервер не подтверждает вызов инструментов. Действия агента-программиста могут завершаться сбоем или быть недоступными. Продолжайте только если вы принимаете эти ограничения.", + "provider.anaconda.action.download": "Скачать Anaconda Desktop", + "provider.anaconda.action.open": "Открыть Anaconda Desktop", + "provider.anaconda.action.checkAgain": "Проверить снова", + "provider.anaconda.action.continue": "Всё равно продолжить", + "provider.anaconda.action.manage": "Управление / Обновить", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop обновлён", + "provider.anaconda.toast.refreshed.description": "Активный локальный сервер и модели актуальны в Kilo.", + "settings.providers.note.anacondaDesktop": "Запустите модель, обслуживаемую локально через Anaconda Desktop.", + "settings.providers.tag.local": "Локально", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Предложено", "command.category.view": "Просмотр", "command.category.project": "Проект", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 87a88c2a7e6..6c2329f4fb7 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -1,12 +1,57 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "ตรวจสอบอีกครั้ง", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "เชื่อมต่อ Anaconda Desktop", + "provider.anaconda.title.manage": "จัดการ Anaconda Desktop", + "provider.anaconda.status.checking": "กำลังตรวจสอบ Anaconda Desktop...", + "provider.anaconda.status.opening": "กำลังเปิด Anaconda Desktop...", + "provider.anaconda.status.syncing": "กำลังรีเฟรชโมเดลของผู้ให้บริการ...", + "provider.anaconda.status.ready": "พร้อมเชื่อมต่อ", + "provider.anaconda.status.waiting": "กำลังรอ Desktop", + "provider.anaconda.status.attention": "ต้องการการดำเนินการ", + "provider.anaconda.status.unavailable": "ไม่พร้อมใช้งาน", + "provider.anaconda.state.unsupported": "Anaconda Desktop ไม่รองรับบน {{platform}}", + "provider.anaconda.state.notInstalled": + "ติดตั้ง Anaconda Desktop บนเครื่องนี้ แล้วกลับมาที่นี่ Kilo จะไม่เรียกใช้ตัวติดตั้งให้คุณ", + "provider.anaconda.state.notRunning": + "เปิด Anaconda Desktop ตั้งค่าให้เสร็จและลงชื่อเข้าใช้ แล้วเลือกตรวจสอบอีกครั้ง", + "provider.anaconda.state.invalidConfig": + "การตั้งค่า Anaconda Desktop ยังไม่สมบูรณ์ เปิด Desktop ตั้งค่าให้เสร็จ และรีสตาร์ทหากจำเป็น", + "provider.anaconda.state.signedOut": "เปิด Anaconda Desktop และลงชื่อเข้าใช้ก่อนเชื่อมต่อ Kilo", + "provider.anaconda.state.unauthorized": + "Kilo ไม่สามารถเข้าถึง Anaconda Desktop ได้ เปิด Desktop ลงชื่อเข้าใช้อีกครั้ง และรีสตาร์ทหากจำเป็น", + "provider.anaconda.state.unavailable": "Anaconda Desktop ยังไม่ตอบสนอง เปิดและรอให้แอปพลิเคชันเริ่มทำงานเสร็จ", + "provider.anaconda.state.noModel": + "ใน Anaconda Desktop ดาวน์โหลดโมเดลสร้างข้อความ เลือกโมเดลที่รองรับการเรียกใช้เครื่องมือเมื่อเป็นไปได้ แล้วเริ่มเซิร์ฟเวอร์ของโมเดลนั้น", "provider.anaconda.state.noServer_one": "มีโมเดลสร้างข้อความที่ดาวน์โหลดไว้แล้วพร้อมใช้งานอยู่ 1 โมเดล โปรดเริ่มเซิร์ฟเวอร์โมเดลใน Anaconda Desktop ขอแนะนำอย่างยิ่งให้ใช้โมเดลที่รองรับการเรียกใช้เครื่องมือ", "provider.anaconda.state.noServer_other": "มีโมเดลสร้างข้อความที่ดาวน์โหลดไว้แล้วพร้อมใช้งานอยู่ {{count}} โมเดล โปรดเริ่มเซิร์ฟเวอร์โมเดลใน Anaconda Desktop ขอแนะนำอย่างยิ่งให้ใช้โมเดลที่รองรับการเรียกใช้เครื่องมือ", + "provider.anaconda.state.unhealthy": + "เซิร์ฟเวอร์การอนุมานที่ใช้งานอยู่ยังไม่พร้อมใช้งาน ตรวจสอบใน Anaconda Desktop และรีสตาร์ทเซิร์ฟเวอร์หากจำเป็น", + "provider.anaconda.state.ready": + "Kilo พบเซิร์ฟเวอร์สร้างข้อความในเครื่องที่พร้อมใช้งาน และสามารถนำเข้าการตั้งค่าการเชื่อมต่อปัจจุบันได้", + "provider.anaconda.server": "เซิร์ฟเวอร์การอนุมานที่ใช้งานอยู่", + "provider.anaconda.context": "หน้าต่างบริบท", + "provider.anaconda.contextValue": "{{count}} โทเค็น", + "provider.anaconda.tools": "การเรียกใช้เครื่องมือ", + "provider.anaconda.tools.supported": "รองรับ", + "provider.anaconda.tools.unsupported": "ไม่ได้เปิดใช้งาน", + "provider.anaconda.tools.unknown": "ไม่ทราบ", + "provider.anaconda.warning.title": "การรองรับเครื่องมือมีข้อจำกัด", + "provider.anaconda.warning.description": + "เซิร์ฟเวอร์นี้ไม่ยืนยันการเรียกใช้เครื่องมือ การทำงานของเอเจนต์เขียนโค้ดอาจล้มเหลวหรือไม่พร้อมใช้งาน ดำเนินการต่อเฉพาะเมื่อคุณยอมรับข้อจำกัดเหล่านี้", + "provider.anaconda.action.download": "ดาวน์โหลด Anaconda Desktop", + "provider.anaconda.action.open": "เปิด Anaconda Desktop", + "provider.anaconda.action.checkAgain": "ตรวจสอบอีกครั้ง", + "provider.anaconda.action.continue": "ดำเนินการต่อ", + "provider.anaconda.action.manage": "จัดการ / รีเฟรช", + "provider.anaconda.toast.refreshed.title": "รีเฟรช Anaconda Desktop แล้ว", + "provider.anaconda.toast.refreshed.description": "เซิร์ฟเวอร์ในเครื่องและโมเดลที่ใช้งานอยู่เป็นปัจจุบันใน Kilo แล้ว", + "settings.providers.note.anacondaDesktop": "เรียกใช้โมเดลที่ให้บริการในเครื่องโดย Anaconda Desktop", + "settings.providers.tag.local": "ในเครื่อง", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "แนะนำ", "command.category.view": "มุมมอง", "command.category.project": "โปรเจกต์", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts index 6999fa62ee0..143b0d4ce9f 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Tekrar kontrol et", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Anaconda Desktop'a bağlan", + "provider.anaconda.title.manage": "Anaconda Desktop'ı yönet", + "provider.anaconda.status.checking": "Anaconda Desktop kontrol ediliyor...", + "provider.anaconda.status.opening": "Anaconda Desktop açılıyor...", + "provider.anaconda.status.syncing": "Sağlayıcı modelleri yenileniyor...", + "provider.anaconda.status.ready": "Bağlanmaya hazır", + "provider.anaconda.status.waiting": "Desktop bekleniyor", + "provider.anaconda.status.attention": "İlgi gerekiyor", + "provider.anaconda.status.unavailable": "Kullanılamıyor", + "provider.anaconda.state.unsupported": "Anaconda Desktop {{platform}} üzerinde desteklenmiyor.", + "provider.anaconda.state.notInstalled": + "Anaconda Desktop'ı bu makineye kurun, ardından buraya dönün. Kilo kurulumu sizin için çalıştırmaz.", + "provider.anaconda.state.notRunning": + "Anaconda Desktop'ı açın, kurulumu tamamlayıp oturum açın, ardından Tekrar kontrol et'i seçin.", + "provider.anaconda.state.invalidConfig": + "Anaconda Desktop kurulumu eksik. Desktop'ı açın, kurulumu tamamlayın ve gerekirse yeniden başlatın.", + "provider.anaconda.state.signedOut": "Kilo'yu bağlamadan önce Anaconda Desktop'ı açın ve oturum açın.", + "provider.anaconda.state.unauthorized": + "Kilo Anaconda Desktop'a erişemedi. Desktop'ı açın, tekrar oturum açın ve gerekirse yeniden başlatın.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop henüz yanıt vermiyor. Açın ve uygulamanın başlamasını bekleyin.", + "provider.anaconda.state.noModel": + "Anaconda Desktop'ta bir metin üretme modeli indirin. Mümkünse araç çağırma destekli bir model seçin, ardından sunucusunu başlatın.", "provider.anaconda.state.noServer_one": "İndirilmiş 1 metin üretme modeli kullanılabilir. Anaconda Desktop'ta bir model sunucusu başlatın. Araç çağırma desteği olan modeller önemle tavsiye edilir.", "provider.anaconda.state.noServer_other": "İndirilmiş {{count}} metin üretme modeli kullanılabilir. Anaconda Desktop'ta bir model sunucusu başlatın. Araç çağırma desteği olan modeller önemle tavsiye edilir.", + "provider.anaconda.state.unhealthy": + "Etkin çıkarım sunucusu henüz sağlıklı değil. Anaconda Desktop'ta kontrol edin ve gerekirse sunucuyu yeniden başlatın.", + "provider.anaconda.state.ready": + "Kilo sağlıklı bir yerel metin üretme sunucusu buldu ve mevcut bağlantı ayarlarını içe aktarabilir.", + "provider.anaconda.server": "Etkin çıkarım sunucusu", + "provider.anaconda.context": "Bağlam penceresi", + "provider.anaconda.contextValue": "{{count}} token", + "provider.anaconda.tools": "Araç çağırma", + "provider.anaconda.tools.supported": "Destekleniyor", + "provider.anaconda.tools.unsupported": "Etkin değil", + "provider.anaconda.tools.unknown": "Bilinmiyor", + "provider.anaconda.warning.title": "Araç desteği sınırlı", + "provider.anaconda.warning.description": + "Bu sunucu araç çağırmayı doğrulamıyor. Kodlama aracısı eylemleri başarısız olabilir veya kullanılamayabilir. Yalnızca bu sınırlamaları kabul ediyorsanız devam edin.", + "provider.anaconda.action.download": "Anaconda Desktop'ı indir", + "provider.anaconda.action.open": "Anaconda Desktop'ı aç", + "provider.anaconda.action.checkAgain": "Tekrar kontrol et", + "provider.anaconda.action.continue": "Yine de devam et", + "provider.anaconda.action.manage": "Yönet / Yenile", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop yenilendi", + "provider.anaconda.toast.refreshed.description": "Etkin yerel sunucu ve modeller Kilo'da güncel.", + "settings.providers.note.anacondaDesktop": "Anaconda Desktop tarafından yerel olarak sunulan bir model çalıştırın.", + "settings.providers.tag.local": "Yerel", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Önerilen", "command.category.view": "Görünüm", "command.category.project": "Proje", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts index decb26cabb5..a04e1cc6b38 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts @@ -1,12 +1,58 @@ -import { anacondaDesktopDict } from "./en" - -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "Перевірити ще раз", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "Підключити Anaconda Desktop", + "provider.anaconda.title.manage": "Керувати Anaconda Desktop", + "provider.anaconda.status.checking": "Перевірка Anaconda Desktop...", + "provider.anaconda.status.opening": "Відкриття Anaconda Desktop...", + "provider.anaconda.status.syncing": "Оновлення моделей провайдера...", + "provider.anaconda.status.ready": "Готово до підключення", + "provider.anaconda.status.waiting": "Очікування Desktop", + "provider.anaconda.status.attention": "Потребує уваги", + "provider.anaconda.status.unavailable": "Недоступно", + "provider.anaconda.state.unsupported": "Anaconda Desktop не підтримується на {{platform}}.", + "provider.anaconda.state.notInstalled": + "Встановіть Anaconda Desktop на цьому комп'ютері, а потім поверніться сюди. Kilo не запускає інсталятор за вас.", + "provider.anaconda.state.notRunning": + "Відкрийте Anaconda Desktop, завершіть налаштування та увійдіть, потім виберіть «Перевірити ще раз».", + "provider.anaconda.state.invalidConfig": + "Налаштування Anaconda Desktop неповне. Відкрийте Desktop, завершіть налаштування та перезапустіть його за потреби.", + "provider.anaconda.state.signedOut": "Відкрийте Anaconda Desktop та увійдіть перед підключенням Kilo.", + "provider.anaconda.state.unauthorized": + "Kilo не вдалося отримати доступ до Anaconda Desktop. Відкрийте Desktop, увійдіть знову та перезапустіть його за потреби.", + "provider.anaconda.state.unavailable": + "Anaconda Desktop ще не відповідає. Відкрийте його та зачекайте, доки програма завершить запуск.", + "provider.anaconda.state.noModel": + "В Anaconda Desktop завантажте модель генерації тексту. За можливості виберіть модель із підтримкою виклику інструментів, потім запустіть її сервер.", "provider.anaconda.state.noServer_one": "Доступна 1 завантажена модель генерації тексту. Запустіть сервер моделі в Anaconda Desktop. Наполегливо рекомендуємо використовувати моделі з підтримкою виклику інструментів.", "provider.anaconda.state.noServer_other": "Доступно завантажених моделей генерації тексту: {{count}}. Запустіть сервер моделі в Anaconda Desktop. Наполегливо рекомендуємо використовувати моделі з підтримкою виклику інструментів.", + "provider.anaconda.state.unhealthy": + "Активний сервер інференсу ще не справний. Перевірте його в Anaconda Desktop та перезапустіть сервер за потреби.", + "provider.anaconda.state.ready": + "Kilo знайшов справний локальний сервер генерації тексту та може імпортувати його поточні налаштування підключення.", + "provider.anaconda.server": "Активний сервер інференсу", + "provider.anaconda.context": "Вікно контексту", + "provider.anaconda.contextValue": "{{count}} токенів", + "provider.anaconda.tools": "Виклик інструментів", + "provider.anaconda.tools.supported": "Підтримується", + "provider.anaconda.tools.unsupported": "Не увімкнено", + "provider.anaconda.tools.unknown": "Невідомо", + "provider.anaconda.warning.title": "Підтримка інструментів обмежена", + "provider.anaconda.warning.description": + "Цей сервер не підтверджує виклик інструментів. Дії агента кодування можуть не спрацювати або бути недоступними. Продовжуйте, лише якщо приймаєте ці обмеження.", + "provider.anaconda.action.download": "Завантажити Anaconda Desktop", + "provider.anaconda.action.open": "Відкрити Anaconda Desktop", + "provider.anaconda.action.checkAgain": "Перевірити ще раз", + "provider.anaconda.action.continue": "Усе одно продовжити", + "provider.anaconda.action.manage": "Керувати / Оновити", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop оновлено", + "provider.anaconda.toast.refreshed.description": "Активний локальний сервер та моделі актуальні в Kilo.", + "settings.providers.note.anacondaDesktop": "Запустіть модель, що обслуговується локально через Anaconda Desktop.", + "settings.providers.tag.local": "Локальний", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "Запропоновані", "command.category.view": "Вигляд", "command.category.project": "Проєкт", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index 05aff59870a..e17738110c4 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -1,14 +1,59 @@ -import { anacondaDesktopDict, dict as en } from "./en" +import { dict as en } from "./en" type Keys = keyof typeof en -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "再次检查", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "连接 Anaconda Desktop", + "provider.anaconda.title.manage": "管理 Anaconda Desktop", + "provider.anaconda.status.checking": "正在检查 Anaconda Desktop…", + "provider.anaconda.status.opening": "正在打开 Anaconda Desktop…", + "provider.anaconda.status.syncing": "正在刷新提供商模型…", + "provider.anaconda.status.ready": "准备连接", + "provider.anaconda.status.waiting": "正在等待 Desktop", + "provider.anaconda.status.attention": "需要处理", + "provider.anaconda.status.unavailable": "不可用", + "provider.anaconda.state.unsupported": "{{platform}} 不支持 Anaconda Desktop。", + "provider.anaconda.state.notInstalled": + "请在此设备上安装 Anaconda Desktop,然后返回此处。Kilo 不会为你运行安装程序。", + "provider.anaconda.state.notRunning": "请打开 Anaconda Desktop,完成设置并登录,然后选择“再次检查”。", + "provider.anaconda.state.invalidConfig": + "Anaconda Desktop 设置不完整。请打开 Desktop,完成设置,并在需要时重新启动它。", + "provider.anaconda.state.signedOut": "请打开 Anaconda Desktop 并登录,然后再连接 Kilo。", + "provider.anaconda.state.unauthorized": + "Kilo 无法访问 Anaconda Desktop。请打开 Desktop,重新登录,并在需要时重新启动它。", + "provider.anaconda.state.unavailable": "Anaconda Desktop 尚未响应。请打开它并等待应用程序完成启动。", + "provider.anaconda.state.noModel": + "请在 Anaconda Desktop 中下载一个文本生成模型。请尽可能选择支持工具调用的模型,然后启动其服务器。", "provider.anaconda.state.noServer_one": "有 1 个已下载的文本生成模型可用。请在 Anaconda Desktop 中启动一个模型服务器。强烈建议使用支持工具调用的模型。", "provider.anaconda.state.noServer_other": "有 {{count}} 个已下载的文本生成模型可用。请在 Anaconda Desktop 中启动一个模型服务器。强烈建议使用支持工具调用的模型。", + "provider.anaconda.state.unhealthy": + "当前推理服务器尚不健康。请在 Anaconda Desktop 中检查它,并在需要时重新启动服务器。", + "provider.anaconda.state.ready": "Kilo 找到了一个健康的本地文本生成服务器,可以导入其当前的连接设置。", + "provider.anaconda.server": "当前推理服务器", + "provider.anaconda.context": "上下文窗口", + "provider.anaconda.contextValue": "{{count}} 个 token", + "provider.anaconda.tools": "工具调用", + "provider.anaconda.tools.supported": "支持", + "provider.anaconda.tools.unsupported": "未启用", + "provider.anaconda.tools.unknown": "未知", + "provider.anaconda.warning.title": "工具支持有限", + "provider.anaconda.warning.description": + "此服务器未确认支持工具调用。编码智能体的操作可能会失败或不可用。仅在你接受这些限制时才继续。", + "provider.anaconda.action.download": "下载 Anaconda Desktop", + "provider.anaconda.action.open": "打开 Anaconda Desktop", + "provider.anaconda.action.checkAgain": "再次检查", + "provider.anaconda.action.continue": "仍然继续", + "provider.anaconda.action.manage": "管理 / 刷新", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop 已刷新", + "provider.anaconda.toast.refreshed.description": "当前本地服务器和模型在 Kilo 中已是最新。", + "settings.providers.note.anacondaDesktop": "运行由 Anaconda Desktop 在本地提供的模型。", + "settings.providers.tag.local": "本地", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "建议", "command.category.view": "视图", "command.category.project": "项目", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index f5744b078dd..8e574f8f262 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -1,14 +1,59 @@ -import { anacondaDesktopDict, dict as en } from "./en" +import { dict as en } from "./en" type Keys = keyof typeof en -export const dict = { - ...anacondaDesktopDict, - "provider.anaconda.action.checkAgain": "再次檢查", +export const anacondaDesktopDict = { + "provider.anaconda.title.connect": "連接 Anaconda Desktop", + "provider.anaconda.title.manage": "管理 Anaconda Desktop", + "provider.anaconda.status.checking": "正在檢查 Anaconda Desktop...", + "provider.anaconda.status.opening": "正在開啟 Anaconda Desktop...", + "provider.anaconda.status.syncing": "正在重新整理供應商模型...", + "provider.anaconda.status.ready": "已準備好連接", + "provider.anaconda.status.waiting": "正在等待 Desktop", + "provider.anaconda.status.attention": "需要注意", + "provider.anaconda.status.unavailable": "無法使用", + "provider.anaconda.state.unsupported": "Anaconda Desktop 不支援 {{platform}}。", + "provider.anaconda.state.notInstalled": + "請在此機器上安裝 Anaconda Desktop,然後返回此處。Kilo 不會為您執行安裝程式。", + "provider.anaconda.state.notRunning": "請開啟 Anaconda Desktop,完成設定並登入,然後選擇再次檢查。", + "provider.anaconda.state.invalidConfig": + "Anaconda Desktop 設定尚未完成。請開啟 Desktop,完成設定,並在需要時重新啟動它。", + "provider.anaconda.state.signedOut": "請開啟 Anaconda Desktop 並登入,然後再連接 Kilo。", + "provider.anaconda.state.unauthorized": + "Kilo 無法存取 Anaconda Desktop。請開啟 Desktop,重新登入,並在需要時重新啟動它。", + "provider.anaconda.state.unavailable": "Anaconda Desktop 尚未回應。請開啟它並等待應用程式完成啟動。", + "provider.anaconda.state.noModel": + "請在 Anaconda Desktop 中下載一個文字生成模型。可能的話請選擇支援工具呼叫的模型,然後啟動其伺服器。", "provider.anaconda.state.noServer_one": "有 1 個已下載的文字生成模型可用。請在 Anaconda Desktop 中啟動一個模型伺服器。強烈建議使用支援工具呼叫的模型。", "provider.anaconda.state.noServer_other": "有 {{count}} 個已下載的文字生成模型可用。請在 Anaconda Desktop 中啟動一個模型伺服器。強烈建議使用支援工具呼叫的模型。", + "provider.anaconda.state.unhealthy": + "使用中的推論伺服器尚未正常運作。請在 Anaconda Desktop 中檢查它,並在需要時重新啟動伺服器。", + "provider.anaconda.state.ready": "Kilo 找到了一個正常運作的本機文字生成伺服器,並可匯入其目前的連接設定。", + "provider.anaconda.server": "使用中的推論伺服器", + "provider.anaconda.context": "上下文視窗", + "provider.anaconda.contextValue": "{{count}} 個權杖", + "provider.anaconda.tools": "工具呼叫", + "provider.anaconda.tools.supported": "支援", + "provider.anaconda.tools.unsupported": "未啟用", + "provider.anaconda.tools.unknown": "未知", + "provider.anaconda.warning.title": "工具支援有限", + "provider.anaconda.warning.description": + "此伺服器未確認支援工具呼叫。編碼代理程式的動作可能會失敗或無法使用。只有在您接受這些限制的情況下才繼續。", + "provider.anaconda.action.download": "下載 Anaconda Desktop", + "provider.anaconda.action.open": "開啟 Anaconda Desktop", + "provider.anaconda.action.checkAgain": "再次檢查", + "provider.anaconda.action.continue": "仍要繼續", + "provider.anaconda.action.manage": "管理 / 重新整理", + "provider.anaconda.toast.refreshed.title": "Anaconda Desktop 已重新整理", + "provider.anaconda.toast.refreshed.description": "使用中的本機伺服器與模型在 Kilo 中已是最新狀態。", + "settings.providers.note.anacondaDesktop": "執行由 Anaconda Desktop 在本機提供的模型。", + "settings.providers.tag.local": "本機", +} as const + +export const dict = { + ...anacondaDesktopDict, "command.category.suggested": "建議", "command.category.view": "檢視", "command.category.project": "專案", From ff1a0b61e35d16fcf7d5d4af6650a8d8572fee0e Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Mon, 29 Jun 2026 11:06:57 +0200 Subject: [PATCH 24/25] fix: allow upstream attribution in translated readmes --- script/check-forbidden-strings.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/script/check-forbidden-strings.ts b/script/check-forbidden-strings.ts index f3941bab05c..caf69ae5a42 100644 --- a/script/check-forbidden-strings.ts +++ b/script/check-forbidden-strings.ts @@ -27,6 +27,7 @@ const forbidden: { pattern: string; reason: string; allow?: string[] }[] = [ allow: [ "AGENTS.md", "README.md", + "translations/README.", ".opencode/glossary/", "packages/kilo-vscode/AGENTS.md", "packages/kilo-docs/source-links.md", From d89b1b6e16fb935c785f731faa37bdd79556ee7a Mon Sep 17 00:00:00 2001 From: Imanol Maiztegui Date: Mon, 29 Jun 2026 11:55:19 +0200 Subject: [PATCH 25/25] Add Agent requirements (#11762) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(agent-requirements): gate agents on declared requirements * feat(cli): add agent requirements preflight helpers Introduce a Kilo-owned CLI requirements module that preflights agent declarations before session creation. The helper resolves requirement status via the SDK, blocks agents with unmet skills, errored MCPs, or VS Code extension dependencies, and produces grouped actionable guidance for terminal users. Includes planning documents and a focused test suite covering all blocking and allow paths. * chore: update kilo-vscode visual regression baselines * fix(vscode): guard extension subscription and suppress empty invalidations Wrap vscode.extensions.onDidChange in a typeof check so the subscribe callback is undefined in environments where the API is unavailable. Skip posting agentRequirementsInvalidated when the controller cache is already empty to avoid spurious messages to the webview. Update the associated test to seed cache state before asserting on the clear-triggered invalidation flow. * refactor(agent-requirements): replace numeric generations with object-identity tokens Switch the controller's supersession tracking from incrementing counters to ephemeral object references, ensuring stale tokens are cleaned up on both success and failure paths. This eliminates a class of race conditions where cleared counters could alias with fresh requests. Conditionally emit the "Install the required skills..." footer in the CLI formatter only when skills or MCPs are actually present, preventing misleading guidance for extension-only requirement failures. * test(httpapi): add exercise scenario for agent requirements endpoint Cover the GET /kilocode/agent/requirements route in the HTTP API exercise harness, asserting that the response echoes the requested agent, uses the routed workspace directory, and correctly reports the disabled state with empty skills/mcps/extensions arrays. * feat(agent-requirements): enforce guard across all clients and relax ID validation Lift the VS Code–only restriction from the requirements guard so that blocked skills/MCPs fail for CLI and other clients as well. VS Code extension requirements remain client-specific. The evaluate function now accepts pre-decoded requirements as an explicit input rather than decoding internally, and the schema switches from the strict alphanumeric ID pattern to a permissive non-whitespace Name pattern allowing slashes and spaces in skill/MCP identifiers. Update prompt interfaces to surface RequirementBlockedError in the typed error channel and preserve "ready" results in the webview cache alongside blocked/error states. * chore(opencode): fix requirement guard annotations --------- Co-authored-by: github-actions[bot] --- .changeset/agent-requirements.md | 6 + ...w-requirements-checking-chromium-linux.png | 3 + ...-requirements-malformed-chromium-linux.png | 3 + ...ments-missing-extension-chromium-linux.png | 3 + ...uirements-missing-tools-chromium-linux.png | 3 + ...view-requirements-ready-chromium-linux.png | 3 + packages/kilo-vscode/src/KiloProvider.ts | 64 +++- .../agent-requirements-controller.ts | 198 ++++++++++ .../src/kilo-provider/agent-requirements.ts | 103 +++++ .../src/services/marketplace/types.ts | 5 + .../tests/unit/agent-requirements.test.ts | 201 ++++++++++ .../tests/unit/marketplace-installer.test.ts | 44 +++ .../agent-manager/AgentManagerApp.tsx | 17 +- packages/kilo-vscode/webview-ui/src/App.tsx | 13 +- .../src/components/chat/AgentRequirements.tsx | 193 ++++++++++ .../src/components/chat/ChatView.tsx | 37 +- .../src/components/chat/PromptInput.tsx | 13 + .../src/context/agent-requirements-state.ts | 10 + .../src/context/agent-requirements.tsx | 104 +++++ .../kilo-vscode/webview-ui/src/i18n/ar.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/br.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/bs.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/da.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/de.ts | 25 ++ .../kilo-vscode/webview-ui/src/i18n/en.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/es.ts | 25 ++ .../kilo-vscode/webview-ui/src/i18n/fr.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/it.ts | 25 ++ .../kilo-vscode/webview-ui/src/i18n/ja.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/ko.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/nl.ts | 25 ++ .../kilo-vscode/webview-ui/src/i18n/no.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/pl.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/ru.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/th.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/tr.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/uk.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/zh.ts | 24 ++ .../kilo-vscode/webview-ui/src/i18n/zht.ts | 24 ++ .../webview-ui/src/stories/StoryProviders.tsx | 71 ++-- .../webview-ui/src/stories/chat.stories.tsx | 137 ++++++- .../src/styles/agent-requirements.css | 298 +++++++++++++++ .../webview-ui/src/styles/chat.css | 1 + .../webview-ui/src/styles/prompt-input.css | 12 + .../webview-ui/src/types/marketplace.ts | 5 + .../webview-ui/src/types/messages/agents.ts | 46 +++ .../webview-ui/src/types/messages/config.ts | 1 + .../src/types/messages/extension-messages.ts | 13 +- .../src/types/messages/webview-messages.ts | 10 + packages/opencode/src/agent/agent.ts | 40 +- .../cli/cmd/tui/component/prompt/index.tsx | 24 ++ packages/opencode/src/config/agent.ts | 3 + packages/opencode/src/config/config.ts | 3 + .../src/kilocode/agent-requirements.ts | 305 +++++++++++++++ .../src/kilocode/cli/agent-requirements.ts | 116 ++++++ .../server/httpapi/groups/kilocode.ts | 17 + .../server/httpapi/handlers/kilocode.ts | 7 + .../instance/httpapi/handlers/session.ts | 6 +- packages/opencode/src/session/prompt.ts | 38 +- packages/opencode/src/session/session.ts | 5 +- packages/opencode/test/agent/agent.test.ts | 2 + .../agent/plugin-agent-regression.test.ts | 2 + .../kilocode/agent-requirements-cli.test.ts | 176 +++++++++ .../test/kilocode/agent-requirements.test.ts | 307 +++++++++++++++ .../server/httpapi-exercise-scenarios.ts | 13 + packages/sdk/js/src/v2/gen/sdk.gen.ts | 38 ++ packages/sdk/js/src/v2/gen/types.gen.ts | 105 +++++ packages/sdk/openapi.json | 361 ++++++++++++++++++ 68 files changed, 3598 insertions(+), 71 deletions(-) create mode 100644 .changeset/agent-requirements.md create mode 100644 packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-checking-chromium-linux.png create mode 100644 packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-malformed-chromium-linux.png create mode 100644 packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-missing-extension-chromium-linux.png create mode 100644 packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-missing-tools-chromium-linux.png create mode 100644 packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-ready-chromium-linux.png create mode 100644 packages/kilo-vscode/src/kilo-provider/agent-requirements-controller.ts create mode 100644 packages/kilo-vscode/src/kilo-provider/agent-requirements.ts create mode 100644 packages/kilo-vscode/tests/unit/agent-requirements.test.ts create mode 100644 packages/kilo-vscode/webview-ui/src/components/chat/AgentRequirements.tsx create mode 100644 packages/kilo-vscode/webview-ui/src/context/agent-requirements-state.ts create mode 100644 packages/kilo-vscode/webview-ui/src/context/agent-requirements.tsx create mode 100644 packages/kilo-vscode/webview-ui/src/styles/agent-requirements.css create mode 100644 packages/opencode/src/kilocode/agent-requirements.ts create mode 100644 packages/opencode/src/kilocode/cli/agent-requirements.ts create mode 100644 packages/opencode/test/kilocode/agent-requirements-cli.test.ts create mode 100644 packages/opencode/test/kilocode/agent-requirements.test.ts diff --git a/.changeset/agent-requirements.md b/.changeset/agent-requirements.md new file mode 100644 index 00000000000..2065246f1c0 --- /dev/null +++ b/.changeset/agent-requirements.md @@ -0,0 +1,6 @@ +--- +"@kilocode/cli": patch +"kilo-code": patch +--- + +Gate experimental agents on their declared skill, MCP, and VS Code extension requirements. VS Code shows requirement groups with Marketplace shortcuts, and the CLI stops before sending when requirements are unmet. diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-checking-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-checking-chromium-linux.png new file mode 100644 index 00000000000..254906a5329 --- /dev/null +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-checking-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a093b9658cc15d0789da5afebde7163ec51e743af59975e2a031aed3e9144d56 +size 22336 diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-malformed-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-malformed-chromium-linux.png new file mode 100644 index 00000000000..f0ed1261382 --- /dev/null +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-malformed-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b20e8e50b583cc6a884e08648a9f1efcdfc2a9561b97145811ebc9c24d244fd +size 23100 diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-missing-extension-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-missing-extension-chromium-linux.png new file mode 100644 index 00000000000..033e4563cb3 --- /dev/null +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-missing-extension-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3b24b0d2694d2eeec0ea4cd827bd3a61bb47150605b838b43e4f422c9b960f0e +size 29744 diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-missing-tools-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-missing-tools-chromium-linux.png new file mode 100644 index 00000000000..37195aeeea7 --- /dev/null +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-missing-tools-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd27610a2518018c16e4227728221ed9bf67a7d3c8ab207b2835dc60964ec63d +size 33323 diff --git a/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-ready-chromium-linux.png b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-ready-chromium-linux.png new file mode 100644 index 00000000000..01bfcc79738 --- /dev/null +++ b/packages/kilo-docs/public/img/screenshot-tests/kilo-vscode/visual-regression/chat/chat-view-requirements-ready-chromium-linux.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8ad46cc736472c6a2a46bb80e6622333f49960e74dcb6782d35aa72fa32378c +size 23725 diff --git a/packages/kilo-vscode/src/KiloProvider.ts b/packages/kilo-vscode/src/KiloProvider.ts index 4fc32536ffe..bcd8f05d56e 100644 --- a/packages/kilo-vscode/src/KiloProvider.ts +++ b/packages/kilo-vscode/src/KiloProvider.ts @@ -53,6 +53,7 @@ import { GitStatsPoller, type LocalStats } from "./agent-manager/GitStatsPoller" import { diffSummary as localDiffSummary } from "./agent-manager/local-diff" import { getWorkspaceRoot } from "./review-utils" import { createMarketplaceRemover, removeAgent, removeMcp } from "./kilo-provider/remove-config-item" +import { AgentRequirementsController } from "./kilo-provider/agent-requirements-controller" import type { RemoteStatusService } from "./services/RemoteStatusService" import { resolveProjectDirectory } from "./project-directory" import { seedSessionStatuses } from "./session-status" @@ -423,6 +424,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper private diffVirtualProvider: import("./DiffVirtualProvider").DiffVirtualProvider | undefined private remoteService: RemoteStatusService | null = null private unsubscribeRemote: (() => void) | null = null + private readonly requirements: AgentRequirementsController constructor( private readonly extensionUri: vscode.Uri, @@ -435,6 +437,23 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper this.unsubscribeSandboxPreference = this.connectionService.sandboxPreference?.onChange(() => { if (this.connectionState === "connected") void this.fetchAndSendSandboxDefault() }) + this.requirements = new AgentRequirementsController({ + post: (msg) => this.postMessage(msg), + client: () => this.client, + connected: () => this.connectionState === "connected", + generation: () => this.connectionGeneration, + root: () => this.getRootDirectory(), + folders: () => vscode.workspace.workspaceFolders?.map((folder) => folder.uri.fsPath), + project: () => this.projectDirectory, + sessions: () => this.sessionDirectories, + worktrees: this.opts.worktreeDirectories, + extension: (id) => vscode.extensions.getExtension(id), + subscribe: + typeof vscode.extensions.onDidChange === "function" + ? (listener) => vscode.extensions.onDidChange(listener) + : undefined, + error: getErrorMessage, + }) TelemetryProxy.getInstance().setProvider(this) } @@ -497,6 +516,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper if (this.projectDirectory === directory) return this.projectDirectory = directory this.postMessage({ type: "workspaceDirectoryChanged", directory: directory ?? "" }) + this.requirements.clear() } public setDiffVirtualProvider(provider: import("./DiffVirtualProvider").DiffVirtualProvider): void { @@ -537,6 +557,14 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper }) } + private openMarketplacePanel(directory: unknown): void { + if (typeof directory === "string" && directory) { + vscode.commands.executeCommand("kilo-code.new.marketplaceButtonClicked", directory) + return + } + vscode.commands.executeCommand("kilo-code.new.marketplaceButtonClicked", this.projectDirectory) + } + // Strip metadata unused by the webview to keep session switches fast. // Logic in kilo-provider/slim-metadata.ts. private slimInfo(info: T): T { @@ -575,6 +603,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper this.cachedAgentsMessage = null this.cachedConfigMessage = null await Promise.all([this.fetchAndSendAgents(), this.fetchAndSendConfig()]) + this.requirements.clear() }, storage: this.extensionContext?.globalStorageUri, } @@ -743,12 +772,14 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper public setSessionDirectory(sessionId: string, directory: string): void { this.aborts.preserve(sessionId, this.sessionStatusMap.get(sessionId), this.getWorkspaceDirectory(sessionId)) this.sessionDirectories.set(sessionId, directory) + this.requirements.clear() if (this.connectionState === "connected") void this.fetchAndSendSandboxStatus(sessionId) } public clearSessionDirectory(sessionId: string): void { this.aborts.preserve(sessionId, this.sessionStatusMap.get(sessionId), this.getWorkspaceDirectory(sessionId)) this.sessionDirectories.delete(sessionId) + this.requirements.clear() if (this.connectionState === "connected") void this.fetchAndSendSandboxStatus(sessionId) } @@ -1013,7 +1044,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper await openConfig(message.scope, message.labels, this.getProjectDirectory(this.currentSession?.id)) break case "openMarketplacePanel": - vscode.commands.executeCommand("kilo-code.new.marketplaceButtonClicked", this.projectDirectory) + this.openMarketplacePanel(message.directory) break case "forkSession": handleForkSession(this.forkCtx, message.sessionId, message.messageId).catch((e) => @@ -1067,6 +1098,16 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper case "requestSkills": this.fetchAndSendSkills().catch((e) => console.error("[Kilo New] fetchAndSendSkills failed:", e)) break + case "requestAgentRequirements": + this.requirements + .fetch({ + agent: message.agent, + directory: message.directory, + sessionID: message.sessionID, + force: message.force === true, + }) + .catch((e) => console.error("[Kilo New] fetchAndSendAgentRequirements failed:", e)) + break case "requestCommands": this.fetchAndSendCommands().catch((e) => console.error("[Kilo New] fetchAndSendCommands failed:", e)) break @@ -1088,7 +1129,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper const c1 = this.client if (c1) { void McpOAuth.connectMcpServer(c1, message.name, this.getWorkspaceDirectory(), () => - this.fetchAndSendMcpStatus(), + this.refreshMcpStatus(), ).catch((e) => console.error("[Kilo New] connectMcpServer failed:", e)) } break @@ -1097,7 +1138,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper const c2 = this.client if (c2) { void McpOAuth.disconnectMcpServer(c2, message.name, this.getWorkspaceDirectory(), () => - this.fetchAndSendMcpStatus(), + this.refreshMcpStatus(), ).catch((e) => console.error("[Kilo New] disconnectMcpServer failed:", e)) } break @@ -1106,7 +1147,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper const c = this.client if (c) { void McpOAuth.authenticateMcpServer(c, message.name, this.getWorkspaceDirectory(), () => - this.fetchAndSendMcpStatus(), + this.refreshMcpStatus(), ).catch((e) => console.error("[Kilo New] authenticateMcpServer failed:", e)) } break @@ -1645,6 +1686,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper }) .catch((e: unknown) => console.warn("[Kilo New] KiloProvider: getSession failed (non-critical):", e)) this.postMessage({ type: "workspaceDirectoryChanged", directory: this.getWorkspaceDirectory(sessionID) }) + this.requirements.clear() this.client.session .status({ directory: dir }) .then((r) => { @@ -2187,6 +2229,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper this.cachedSkillsMessage = null this.cachedCommandsMessage = null await Promise.all([this.fetchAndSendSkills(), this.fetchAndSendCommands()]) + this.requirements.clear() return true } @@ -2198,6 +2241,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper if (!result.error) { this.cachedAgentsMessage = null await this.fetchAndSendAgents() + this.requirements.clear() return } } catch { @@ -2215,6 +2259,11 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper } } + private async refreshMcpStatus(): Promise { + await this.fetchAndSendMcpStatus() + this.requirements.clear() + } + private async fetchAndSendMcpStatus(): Promise { if (!this.client) { if (this.cachedMcpStatusMessage) { @@ -2759,6 +2808,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper projectConfig: overlay?.project, features: configFeatures(merged), }) + this.requirements.clear() await Promise.all([ refreshProviders ? this.fetchAndSendProviders() : Promise.resolve(), refreshAgents ? this.fetchAndSendAgents() : Promise.resolve(), @@ -2779,6 +2829,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper globalConfig: this.cachedGlobalConfig ?? undefined, features: features ?? configFeatures(optimistic as Config), }) + this.requirements.clear() } finally { this.pending-- } @@ -2958,6 +3009,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper const sid = resolved!.sid const dir = resolved!.dir + await this.requirements.assertAgentRequirements(agent, dir) const editorContext = await this.gatherEditorContext(dir) if (messageID) { @@ -3047,6 +3099,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper const sid = resolved!.sid const dir = resolved!.dir + await this.requirements.assertAgentRequirements(agent, dir) await this.checkpoints.get(sid) await runWithMessageConfirmation(this.confirmations, messageID, "KiloProvider: Command request", () => this.withRetry( @@ -3355,6 +3408,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper /** Re-fetch all server-side state after an auth change. */ private async reloadAfterAuthChange(): Promise { + this.requirements.clear() await this.fetchAndSendConfig() await Promise.all([ this.fetchAndSendProviders(), @@ -3533,6 +3587,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper // Fetch and push the updated config + refresh agents and providers so the // Settings panel and mode/model pickers reflect the change. if (event.type === "global.config.updated") { + this.requirements.clear() void Promise.all([this.fetchAndSendConfigUpdated(), this.fetchAndSendAgents(), this.fetchAndSendProviders()]) return } @@ -3946,6 +4001,7 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper this.anacondaDesktop.dispose() this.aborts.clear() this.sessionStatusMap.clear() + this.requirements.dispose() this.ignoreController?.dispose() this.chatAutocomplete?.dispose() disposeGitChangesTarget() diff --git a/packages/kilo-vscode/src/kilo-provider/agent-requirements-controller.ts b/packages/kilo-vscode/src/kilo-provider/agent-requirements-controller.ts new file mode 100644 index 00000000000..f8277995228 --- /dev/null +++ b/packages/kilo-vscode/src/kilo-provider/agent-requirements-controller.ts @@ -0,0 +1,198 @@ +import type { KiloClient } from "@kilocode/sdk/v2/client" +import { + applyVSCodeExtensionRequirements, + requirementDirectory, + requirementKey, + type BackendAgentRequirementResult, + type HostAgentRequirementResult, +} from "./agent-requirements" + +type AgentRequirementsClient = { + agentRequirements: ( + parameters: { agent: string; directory: string }, + options: { throwOnError: true }, + ) => Promise<{ data: BackendAgentRequirementResult }> +} + +type LoadedMessage = { + type: "agentRequirementsLoaded" + result: HostAgentRequirementResult +} + +type InvalidatedMessage = { + type: "agentRequirementsInvalidated" +} + +type Disposable = { + dispose(): void +} + +export type AgentRequirementsRequest = { + agent: string + directory: string + sessionID?: string + force?: boolean +} + +export type AgentRequirementsControllerOptions = { + post: (message: LoadedMessage | InvalidatedMessage) => void + client: () => KiloClient | null + connected: () => boolean + generation: () => number + root: () => string + folders: () => readonly string[] | undefined + project: () => string | null | undefined + sessions: () => ReadonlyMap + worktrees?: () => readonly string[] + extension: (id: string) => unknown + subscribe?: (listener: () => void) => Disposable + error: (error: unknown) => string +} + +export class AgentRequirementsController { + private readonly cache = new Map() + private readonly generations = new Map() + private readonly subscription: Disposable | undefined + + constructor(private readonly opts: AgentRequirementsControllerOptions) { + this.subscription = opts.subscribe?.(() => this.clear()) + } + + clear(): void { + const active = this.cache.size > 0 || this.generations.size > 0 + this.cache.clear() + this.generations.clear() + if (!active) return + this.opts.post({ type: "agentRequirementsInvalidated" }) + } + + dispose(): void { + this.subscription?.dispose() + this.cache.clear() + this.generations.clear() + } + + fetch(request: AgentRequirementsRequest): Promise { + const dir = this.scope(request.directory, request.sessionID) + if (!dir) { + this.error(request.agent, request.directory, "scope_mismatch", "The agent requirement scope is no longer active") + return Promise.resolve() + } + + return this.load(request.agent, dir, request.force === true).then( + (result) => { + if (!this.scope(dir, request.sessionID)) return + this.opts.post({ type: "agentRequirementsLoaded", result }) + }, + (error) => { + this.error(request.agent, dir, "request_failed", error) + }, + ) + } + + private scope(requested: string, sessionID?: string): string | undefined { + return requirementDirectory({ + requested, + sessionID, + workspaceDirectory: this.opts.root(), + workspaceDirectories: this.opts.folders(), + projectDirectory: this.opts.project(), + sessionDirectories: this.opts.sessions(), + worktreeDirectories: this.opts.worktrees, + }) + } + + private apply(result: BackendAgentRequirementResult, directory: string): HostAgentRequirementResult { + return applyVSCodeExtensionRequirements({ ...result, directory }, (id) => this.opts.extension(id)) + } + + private error(agent: string, directory: string, code: "scope_mismatch" | "request_failed", error: unknown): void { + this.opts.post({ + type: "agentRequirementsLoaded", + result: { + agent, + directory, + enabled: true, + state: "error", + skills: [], + mcps: [], + vscode_extensions: [], + error: { + code, + message: this.opts.error(error) || "Failed to check agent requirements", + }, + }, + }) + } + + async assertAgentRequirements(agent: string | undefined, directory: string): Promise { + if (!agent) return + + const dir = this.scope(directory) + if (!dir) throw new Error("The agent requirement scope is no longer active") + + const result = await this.load(agent, dir) + if (!this.blocked(result)) return + + this.opts.post({ type: "agentRequirementsLoaded", result }) + throw new Error(this.message(result)) + } + + private async load(agent: string, directory: string, force = false): Promise { + const key = requirementKey(agent, directory) + if (!force) { + const cached = this.cache.get(key) + if (cached) return cached + } + + const client = this.opts.client() + if (!client || !this.opts.connected()) throw new Error("Not connected to CLI backend") + + const connection = this.opts.generation() + const token = {} + this.generations.set(key, token) + + const endpoint = client.kilocode as typeof client.kilocode & AgentRequirementsClient + const response = await endpoint.agentRequirements({ agent, directory }, { throwOnError: true }).catch((error) => { + if (this.generations.get(key) === token) this.generations.delete(key) + throw error + }) + + if (this.opts.generation() !== connection || this.opts.client() !== client) { + if (this.generations.get(key) === token) this.generations.delete(key) + throw new Error("Connection changed while checking agent requirements") + } + if (this.generations.get(key) !== token) throw new Error("Agent requirement check was superseded") + + const result = this.apply(response.data, directory) + this.cache.set(key, result) + this.generations.delete(key) + return result + } + + private blocked(result: HostAgentRequirementResult): boolean { + if (!result.enabled || result.state === "disabled") return false + if (result.state === "blocked" || result.state === "error") return true + + return ( + result.skills.some((item) => item.status !== "ready") || + result.mcps.some((item) => item.status !== "ready") || + result.vscode_extensions.some((item) => item.status !== "ready") + ) + } + + private message(result: HostAgentRequirementResult): string { + if (result.error?.message) return result.error.message + + const missing = [ + ...result.skills.filter((item) => item.status !== "ready").map((item) => `skill ${item.name}`), + ...result.mcps.filter((item) => item.status !== "ready").map((item) => `MCP ${item.name}`), + ...result.vscode_extensions + .filter((item) => item.status !== "ready") + .map((item) => `VS Code extension ${item.name}`), + ] + + if (missing.length) return `Agent requirements are not met: ${missing.join(", ")}` + return "Agent requirements are not met" + } +} diff --git a/packages/kilo-vscode/src/kilo-provider/agent-requirements.ts b/packages/kilo-vscode/src/kilo-provider/agent-requirements.ts new file mode 100644 index 00000000000..43e71d4b6aa --- /dev/null +++ b/packages/kilo-vscode/src/kilo-provider/agent-requirements.ts @@ -0,0 +1,103 @@ +import * as path from "path" +import { sameDirectory } from "../kilo-provider-utils" + +export type RequirementStatus = "ready" | "missing" | "error" + +export type RequirementState = "disabled" | "ready" | "blocked" | "error" + +export type RequirementErrorCode = + | "unknown_agent" + | "malformed_declaration" + | "discovery_failed" + | "mcp_status_failed" + | "scope_mismatch" + | "request_failed" + +export type RequirementItem = { + name: string + status: RequirementStatus + message?: string +} + +export type BackendVSCodeExtensionRequirement = { + name: string + id: string + message?: string +} + +export type BackendAgentRequirementResult = { + agent: string + directory: string + enabled: boolean + state: RequirementState + skills: RequirementItem[] + mcps: RequirementItem[] + vscode_extensions: BackendVSCodeExtensionRequirement[] + error?: { + code: RequirementErrorCode + message: string + } +} + +export type HostVSCodeExtensionRequirement = BackendVSCodeExtensionRequirement & { + status: RequirementStatus +} + +export type HostAgentRequirementResult = Omit & { + vscode_extensions: HostVSCodeExtensionRequirement[] +} + +export type RequirementDirectoryInput = { + requested: string + sessionID?: string + workspaceDirectory: string + workspaceDirectories?: readonly string[] + projectDirectory?: string | null + sessionDirectories: ReadonlyMap + worktreeDirectories?: () => readonly string[] +} + +export type VSCodeExtensionLookup = (id: string) => unknown + +function normalize(directory: string): string { + if (!directory) return "" + const resolved = path.resolve(directory) + return process.platform === "win32" ? resolved.toLowerCase() : resolved +} + +export function requirementKey(agent: string, directory: string): string { + return `${normalize(directory)}\0${agent}` +} + +export function requirementDirectory(input: RequirementDirectoryInput): string | undefined { + if (!input.requested) return undefined + + const dirs = [ + input.sessionID ? input.sessionDirectories.get(input.sessionID) : undefined, + input.workspaceDirectory, + ...(input.workspaceDirectories ?? []), + input.projectDirectory ?? undefined, + ...input.sessionDirectories.values(), + ...(input.worktreeDirectories?.() ?? []), + ].filter((dir): dir is string => !!dir) + + return dirs.find((dir) => sameDirectory(dir, input.requested)) +} + +export function applyVSCodeExtensionRequirements( + result: BackendAgentRequirementResult, + lookup: VSCodeExtensionLookup, +): HostAgentRequirementResult { + const extensions = result.vscode_extensions.map((extension) => { + const status: RequirementStatus = lookup(extension.id) ? "ready" : "missing" + return { ...extension, status } + }) + const blocked = + result.enabled && result.state === "ready" && extensions.some((extension) => extension.status !== "ready") + + return { + ...result, + state: blocked ? "blocked" : result.state, + vscode_extensions: extensions, + } +} diff --git a/packages/kilo-vscode/src/services/marketplace/types.ts b/packages/kilo-vscode/src/services/marketplace/types.ts index 3e380e50544..f7bf682ed20 100644 --- a/packages/kilo-vscode/src/services/marketplace/types.ts +++ b/packages/kilo-vscode/src/services/marketplace/types.ts @@ -41,6 +41,11 @@ export interface AgentContent { prompt: string options?: Record permission?: Record + requirements?: { + skills?: string[] + mcps?: string[] + vscode_extensions?: Array<{ name: string; id: string }> + } } export interface AgentMarketplaceItem extends MarketplaceItemBase { diff --git a/packages/kilo-vscode/tests/unit/agent-requirements.test.ts b/packages/kilo-vscode/tests/unit/agent-requirements.test.ts new file mode 100644 index 00000000000..26290cff011 --- /dev/null +++ b/packages/kilo-vscode/tests/unit/agent-requirements.test.ts @@ -0,0 +1,201 @@ +import { describe, expect, it } from "bun:test" +import type { KiloClient } from "@kilocode/sdk/v2/client" +import { + applyVSCodeExtensionRequirements, + requirementDirectory, + requirementKey, + type BackendAgentRequirementResult, + type HostAgentRequirementResult, +} from "../../src/kilo-provider/agent-requirements" +import { AgentRequirementsController } from "../../src/kilo-provider/agent-requirements-controller" +import { keepAgentRequirementsResult } from "../../webview-ui/src/context/agent-requirements-state" + +const root = "/repo" + +function result(input: Partial = {}): BackendAgentRequirementResult { + return { + agent: "demo", + directory: root, + enabled: true, + state: "ready", + skills: [], + mcps: [], + vscode_extensions: [], + ...input, + } +} + +function client(value: BackendAgentRequirementResult | (() => BackendAgentRequirementResult)) { + const calls: Array<{ agent: string; directory: string }> = [] + const api = { + kilocode: { + agentRequirements: async (parameters: { agent: string; directory: string }) => { + calls.push(parameters) + return { data: typeof value === "function" ? value() : value } + }, + }, + } as unknown as KiloClient + return { calls, api } +} + +function controller( + input: { + api?: KiloClient | null + posts?: unknown[] + sessions?: ReadonlyMap + worktrees?: () => readonly string[] + extensions?: ReadonlySet + subscribe?: (listener: () => void) => { dispose(): void } + } = {}, +) { + const posts = input.posts ?? [] + return new AgentRequirementsController({ + post: (message) => posts.push(message), + client: () => input.api ?? null, + connected: () => true, + generation: () => 1, + root: () => root, + folders: () => [root, "/workspace"], + project: () => root, + sessions: () => input.sessions ?? new Map(), + worktrees: input.worktrees, + extension: (id) => input.extensions?.has(id), + subscribe: input.subscribe, + error: (error) => (error instanceof Error ? error.message : String(error)), + }) +} + +describe("agent requirement helpers", () => { + it("builds stable cache keys from normalized directories", () => { + expect(requirementKey("demo", "/repo/./subdir")).toBe(requirementKey("demo", "/repo/subdir")) + expect(requirementKey("other", "/repo/subdir")).not.toBe(requirementKey("demo", "/repo/subdir")) + }) + + it("scopes requests to active workspace, session, and worktree directories", () => { + const sessions = new Map([["session-1", "/repo/.kilo/worktrees/one"]]) + const base = { + workspaceDirectory: root, + workspaceDirectories: ["/workspace"], + projectDirectory: root, + sessionDirectories: sessions, + worktreeDirectories: () => ["/repo/.kilo/worktrees/two"], + } + + expect(requirementDirectory({ ...base, requested: "/repo" })).toBe(root) + expect(requirementDirectory({ ...base, requested: "/repo/.kilo/worktrees/one", sessionID: "session-1" })).toBe( + "/repo/.kilo/worktrees/one", + ) + expect(requirementDirectory({ ...base, requested: "/repo/.kilo/worktrees/two" })).toBe("/repo/.kilo/worktrees/two") + expect(requirementDirectory({ ...base, requested: "/other" })).toBeUndefined() + }) + + it("adds VS Code extension statuses and blocks ready backend results when extensions are missing", () => { + const checked = applyVSCodeExtensionRequirements( + result({ + vscode_extensions: [ + { name: "Ready Extension", id: "publisher.ready" }, + { name: "Missing Extension", id: "publisher.missing" }, + ], + }), + (id) => id === "publisher.ready", + ) + + expect(checked.state).toBe("blocked") + expect(checked.vscode_extensions).toEqual([ + { name: "Ready Extension", id: "publisher.ready", status: "ready" }, + { name: "Missing Extension", id: "publisher.missing", status: "missing" }, + ]) + }) +}) + +describe("agent requirement webview state", () => { + const blocked: HostAgentRequirementResult = { + ...result({ state: "blocked", skills: [{ name: "skill", status: "missing" }] }), + vscode_extensions: [], + } + + it("preserves ready, blocked, and error results only for the same agent and directory", () => { + expect(keepAgentRequirementsResult(blocked, "demo", root)).toBe(true) + expect(keepAgentRequirementsResult({ ...blocked, state: "error" }, "demo", root)).toBe(true) + expect(keepAgentRequirementsResult({ ...blocked, state: "ready" }, "demo", root)).toBe(true) + expect(keepAgentRequirementsResult({ ...blocked, state: "disabled" }, "demo", root)).toBe(false) + expect(keepAgentRequirementsResult(blocked, "other", root)).toBe(false) + expect(keepAgentRequirementsResult(blocked, "demo", "/other")).toBe(false) + }) +}) + +describe("AgentRequirementsController", () => { + it("caches fetched results until invalidated", async () => { + const posts: unknown[] = [] + const backend = client(result()) + const requirements = controller({ api: backend.api, posts }) + + await requirements.fetch({ agent: "demo", directory: root }) + await requirements.fetch({ agent: "demo", directory: root }) + requirements.clear() + await requirements.fetch({ agent: "demo", directory: root }) + + expect(backend.calls).toEqual([ + { agent: "demo", directory: root }, + { agent: "demo", directory: root }, + ]) + expect( + posts.filter((message) => (message as { type?: string }).type === "agentRequirementsInvalidated"), + ).toHaveLength(1) + }) + + it("posts scope mismatch errors for inactive directories", async () => { + const posts: unknown[] = [] + const backend = client(result()) + const requirements = controller({ api: backend.api, posts }) + + await requirements.fetch({ agent: "demo", directory: "/other" }) + + expect(backend.calls).toEqual([]) + expect(posts.at(-1)).toMatchObject({ + type: "agentRequirementsLoaded", + result: { state: "error", error: { code: "scope_mismatch" } }, + }) + }) + + it("clears requirements when the extension subscription fires", async () => { + const posts: unknown[] = [] + let listener: (() => void) | undefined + let disposed = false + const backend = client(result()) + const requirements = controller({ + api: backend.api, + posts, + subscribe: (fn) => { + listener = fn + return { dispose: () => void (disposed = true) } + }, + }) + + await requirements.fetch({ agent: "demo", directory: root }) + posts.length = 0 + listener?.() + requirements.dispose() + + expect(posts).toEqual([{ type: "agentRequirementsInvalidated" }]) + expect(disposed).toBe(true) + }) + + it("asserts and reports blocked requirements before host sends", async () => { + const posts: unknown[] = [] + const backend = client( + result({ + vscode_extensions: [{ name: "Missing Extension", id: "publisher.missing" }], + }), + ) + const requirements = controller({ api: backend.api, posts }) + + await expect(requirements.assertAgentRequirements("demo", root)).rejects.toThrow( + "VS Code extension Missing Extension", + ) + expect(posts.at(-1)).toMatchObject({ + type: "agentRequirementsLoaded", + result: { state: "blocked", vscode_extensions: [{ status: "missing" }] }, + }) + }) +}) diff --git a/packages/kilo-vscode/tests/unit/marketplace-installer.test.ts b/packages/kilo-vscode/tests/unit/marketplace-installer.test.ts index a576f64d95c..37262e11533 100644 --- a/packages/kilo-vscode/tests/unit/marketplace-installer.test.ts +++ b/packages/kilo-vscode/tests/unit/marketplace-installer.test.ts @@ -4,7 +4,9 @@ import * as os from "os" import * as path from "path" import { MarketplaceInstaller } from "../../src/services/marketplace/installer" import { MarketplacePaths } from "../../src/services/marketplace/paths" +import type { AgentMarketplaceItem } from "../../src/services/marketplace/types" import { exec } from "../../src/util/process" +import * as yaml from "yaml" const tmpDir = path.join(os.tmpdir(), `kilo-test-${Date.now()}`) @@ -32,6 +34,24 @@ function skill(content: string, id = "test-skill") { } } +function agent(content: AgentMarketplaceItem["content"], id = "test-agent"): AgentMarketplaceItem { + return { + type: "agent", + id, + name: "Test Agent", + description: "test", + category: "development", + content, + } +} + +async function frontmatter(file: string) { + const content = await fs.readFile(file, "utf-8") + const match = content.match(/^---\n([\s\S]*?)\n---/) + expect(match).not.toBeNull() + return yaml.parse(match?.[1] ?? "") as Record +} + async function archive(): Promise { const root = path.join(tmpDir, "archive") const source = path.join(root, "source") @@ -248,3 +268,27 @@ describe("MarketplaceInstaller skills", () => { } }) }) + +describe("MarketplaceInstaller agents", () => { + it("preserves requirements in installed agent frontmatter", async () => { + const installer = new MarketplaceInstaller(new TestPaths()) + const item = agent({ + mode: "all", + description: "Requires local setup", + prompt: "Use the available project tools.", + requirements: { + skills: ["project-skill"], + mcps: ["project-mcp"], + vscode_extensions: [{ name: "Project Helper", id: "publisher.project-helper" }], + }, + }) + + const result = await installer.installAgent(item, "project", tmpDir) + + expect(result.success).toBe(true) + expect(result.filePath).toBeDefined() + if (!result.filePath) throw new Error("agent install did not return a file path") + const data = await frontmatter(result.filePath) + expect(data.requirements).toEqual(item.content.requirements) + }) +}) diff --git a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx index a092686fcb5..d3539b200c0 100644 --- a/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx +++ b/packages/kilo-vscode/webview-ui/agent-manager/AgentManagerApp.tsx @@ -81,6 +81,7 @@ import { KiloEmbeddingModelsProvider } from "../src/context/kilo-embedding-model import { NotificationsProvider } from "../src/context/notifications" import { FeedbackProvider } from "../src/context/feedback" import { SessionProvider, useSession } from "../src/context/session" +import { AgentRequirementsProvider } from "../src/context/agent-requirements" import { WorktreeModeProvider } from "../src/context/worktree-mode" import { ChatView } from "../src/components/chat" import HistoryView from "../src/components/history/HistoryView" @@ -3136,13 +3137,15 @@ export const AgentManagerApp: Component = () => { - - - - - - - + + + + + + + + + diff --git a/packages/kilo-vscode/webview-ui/src/App.tsx b/packages/kilo-vscode/webview-ui/src/App.tsx index de57030df63..4f0ffa921ef 100644 --- a/packages/kilo-vscode/webview-ui/src/App.tsx +++ b/packages/kilo-vscode/webview-ui/src/App.tsx @@ -19,6 +19,7 @@ import { ConfigProvider } from "./context/config" import { DisplayProvider } from "./context/display" import { WorkStyleProvider } from "./context/work-style" import { IndexingProvider } from "./context/indexing" +import { AgentRequirementsProvider } from "./context/agent-requirements" import { SessionProvider, useSession } from "./context/session" import { LanguageBridge } from "./context/language-bridge" import { ChatView } from "./components/chat" @@ -384,11 +385,13 @@ const App: Component = () => { - - - - - + + + + + + + diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/AgentRequirements.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/AgentRequirements.tsx new file mode 100644 index 00000000000..1238718b4d0 --- /dev/null +++ b/packages/kilo-vscode/webview-ui/src/components/chat/AgentRequirements.tsx @@ -0,0 +1,193 @@ +/** @jsxImportSource solid-js */ + +import { For, Show, type Component } from "solid-js" +import { Button } from "@kilocode/kilo-ui/button" +import { Card } from "@kilocode/kilo-ui/card" +import { Icon } from "@kilocode/kilo-ui/icon" +import { useAgentRequirements } from "../../context/agent-requirements" +import { useLanguage } from "../../context/language" +import { useVSCode } from "../../context/vscode" +import type { AgentRequirementMCP, AgentRequirementSkill, AgentRequirementVSCodeExtension } from "../../types/messages" + +type Status = "ready" | "missing" | "error" + +export const AgentRequirements: Component = () => { + const requirements = useAgentRequirements() + const language = useLanguage() + const vscode = useVSCode() + const result = requirements.result + const skills = () => result()?.skills ?? [] + const mcps = () => result()?.mcps ?? [] + const extensions = () => result()?.vscode_extensions ?? [] + const total = () => skills().length + mcps().length + extensions().length + const marketplace = () => + skills().some((item) => item.status !== "ready") || mcps().some((item) => item.status !== "ready") + const tools = () => { + if (skills().length && mcps().length) { + return `${language.t("agentRequirements.group.skills")} / ${language.t("agentRequirements.group.mcps")}` + } + if (skills().length) return language.t("agentRequirements.group.skills") + return language.t("agentRequirements.group.mcps") + } + const open = () => { + const current = result() + if (!current) return + vscode.postMessage({ type: "openMarketplacePanel", directory: current.directory }) + } + const title = () => + (result()?.agent ?? "") + .split(/[-_]/) + .filter(Boolean) + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(" ") + + const error = () => { + const err = result()?.error + if (!err) return undefined + if (err.code === "unknown_agent") return language.t("agentRequirements.error.unknownAgent") + if (err.code === "malformed_declaration") return language.t("agentRequirements.error.malformedDeclaration") + if (err.code === "discovery_failed") return language.t("agentRequirements.error.discoveryFailed") + if (err.code === "mcp_status_failed") return language.t("agentRequirements.error.mcpStatusFailed") + if (err.code === "scope_mismatch") return language.t("agentRequirements.error.scopeMismatch") + return err.message || language.t("agentRequirements.error.requestFailed") + } + + const skill = (item: AgentRequirementSkill) => { + if (item.message) return item.message + if (item.status === "ready") return language.t("agentRequirements.skill.installed") + if (item.status === "error") return language.t("agentRequirements.skill.checkFailed") + return language.t("agentRequirements.skill.missing") + } + + const mcp = (item: AgentRequirementMCP) => { + if (item.message) return item.message + if (item.status === "ready") return language.t("agentRequirements.mcp.connected") + if (item.status === "error") return language.t("agentRequirements.mcp.checkFailed") + return language.t("agentRequirements.mcp.missing") + } + + const extension = (item: AgentRequirementVSCodeExtension) => { + if (item.message) return item.message + if (item.status === "ready") return language.t("agentRequirements.extension.installed") + if (item.status === "error") return language.t("agentRequirements.extension.checkFailed") + return language.t("agentRequirements.extension.missing") + } + + const StatusIcon = (props: { status: Status }) => ( + + ) + + return ( +
+ +
+

+ {language.t("agentRequirements.blocked.title", { agent: title() })} +

+

{language.t("agentRequirements.blocked.description")}

+
+ + + {(message) =>
{message}
} +
+ + +
+ +
+

{tools()}

+
+ +
+

{language.t("agentRequirements.group.skills")}

+
    + + {(item) => ( +
  • + +
    + {item.name} + {skill(item)} +
    +
  • + )} +
    +
+
+
+ +
+

{language.t("agentRequirements.group.mcps")}

+
    + + {(item) => ( +
  • + +
    + {item.name} + {mcp(item)} +
    +
  • + )} +
    +
+
+
+ +
+ +
+
+
+
+
+ + +
+
+

+ {language.t("agentRequirements.group.extensions")} +

+

+ {language.t("agentRequirements.extension.description")} +

+
+
+
+
    + + {(item) => ( +
  • + +
    + + {item.name} ({item.id}) + + {extension(item)} +
    +
  • + )} +
    +
+
+
+
+
+
+
+
+
+ ) +} diff --git a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx index d9e69e6528d..219556d4713 100644 --- a/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/chat/ChatView.tsx @@ -14,6 +14,7 @@ import { showToast } from "@kilocode/kilo-ui/toast" import { DropdownMenu } from "@kilocode/kilo-ui/dropdown-menu" import { TaskHeader } from "./TaskHeader" import { MessageList } from "./MessageList" +import { AgentRequirements } from "./AgentRequirements" import { PromptInput } from "./PromptInput" import { PermissionDock } from "./PermissionDock" import { StartupErrorBanner } from "./StartupErrorBanner" @@ -22,6 +23,7 @@ import { useVSCode } from "../../context/vscode" import { useLanguage } from "../../context/language" import { useWorktreeMode } from "../../context/worktree-mode" import { useServer } from "../../context/server" +import { useAgentRequirements } from "../../context/agent-requirements" import { isPromptBlocked, isSuggesting, isQuestioning } from "./prompt-input-utils" interface ChatViewProps { @@ -43,6 +45,7 @@ export const ChatView: Component = (props) => { const language = useLanguage() const worktreeMode = useWorktreeMode() const server = useServer() + const requirements = useAgentRequirements() // Show "Show Changes" only in the standalone sidebar, not inside Agent Manager const isSidebar = () => worktreeMode === undefined // Show "Continue in Worktree": only when explicitly enabled via prop @@ -71,9 +74,11 @@ export const ChatView: Component = (props) => { const standaloneQuestions = createMemo(() => familyQuestions().filter((q) => !q.tool)) const standaloneSuggestions = createMemo(() => familySuggestions().filter((s) => !s.tool)) const permissionRequest = () => familyPermissions().find((p) => p.sessionID === id()) ?? familyPermissions()[0] - // Prompt input is decoupled from questions/suggestions — only permissions block. + // Questions and suggestions do not block input; permissions and agent requirements do. // Pending questions and suggestions are auto-dismissed in sendMessage/sendCommand. - const blocked = () => isPromptBlocked(familyPermissions().length) + const blocked = () => isPromptBlocked(familyPermissions().length) || (!props.readonly && requirements.blocked()) + const requirementReason = () => + !props.readonly && requirements.blocked() ? language.t("agentRequirements.prompt.blocked") : undefined // Session is busy only because a suggestion tool call is pending — prompt should behave as idle const suggesting = () => isSuggesting(blocked(), familySuggestions().length) // Session is busy only because a question tool call is pending — prompt should behave as idle @@ -324,16 +329,23 @@ export const ChatView: Component = (props) => {
- + + } + > + +
@@ -357,6 +369,7 @@ export const ChatView: Component = (props) => { boolean + blockedReason?: () => string | undefined /** When true, session is busy only because a suggestion is pending — treat as idle for input */ suggesting?: () => boolean /** When true, session is busy only because a question is pending — treat as idle for input */ @@ -132,6 +133,7 @@ export const PromptInput: Component = (props) => { let slashDropdownRef: HTMLDivElement | undefined const boxKey = () => props.boxId ?? "prompt:default" + const blockedHelpId = () => `${boxKey().replace(/[^a-zA-Z0-9_-]/g, "-")}-blocked-help` const rawKey = () => sessionDraftKey(session.currentSessionID()) ?? pendingDraftKey(props.pendingSessionID ?? session.draftSessionID()) ?? @@ -436,6 +438,8 @@ export const PromptInput: Component = (props) => { !props.blocked?.() && (speech.state() === "recording" || (hasInput() && !speech.active())) const sendLabel = () => { + const reason = props.blockedReason?.() + if (reason) return reason if (props.blocked?.()) return language.t("prompt.action.send.blocked") if (speech.state() === "recording") return language.t("prompt.action.send.recording") return language.t("prompt.action.send") @@ -1212,10 +1216,18 @@ export const PromptInput: Component = (props) => { }} onScroll={syncHighlightScroll} aria-disabled={isDisabled()} + aria-describedby={props.blockedReason?.() ? blockedHelpId() : undefined} rows={1} /> + + {(reason) => ( + + {reason} + + )} +
@@ -1320,6 +1332,7 @@ export const PromptInput: Component = (props) => { size="small" onClick={handleSendClick} aria-disabled={!canSend()} + aria-describedby={props.blockedReason?.() ? blockedHelpId() : undefined} aria-label={sendLabel()} > diff --git a/packages/kilo-vscode/webview-ui/src/context/agent-requirements-state.ts b/packages/kilo-vscode/webview-ui/src/context/agent-requirements-state.ts new file mode 100644 index 00000000000..5bbfc68eeb2 --- /dev/null +++ b/packages/kilo-vscode/webview-ui/src/context/agent-requirements-state.ts @@ -0,0 +1,10 @@ +import type { AgentRequirementResult } from "../types/messages" + +export function keepAgentRequirementsResult( + value: AgentRequirementResult | undefined, + agent: string, + directory: string, +) { + if (!value || value.agent !== agent || value.directory !== directory) return false + return value.state === "ready" || value.state === "blocked" || value.state === "error" +} diff --git a/packages/kilo-vscode/webview-ui/src/context/agent-requirements.tsx b/packages/kilo-vscode/webview-ui/src/context/agent-requirements.tsx new file mode 100644 index 00000000000..d34e8e06d7e --- /dev/null +++ b/packages/kilo-vscode/webview-ui/src/context/agent-requirements.tsx @@ -0,0 +1,104 @@ +/** @jsxImportSource solid-js */ + +import { createContext, createEffect, createMemo, createSignal, onCleanup, useContext } from "solid-js" +import type { Accessor, ParentComponent } from "solid-js" +import { useConfig } from "./config" +import { useServer } from "./server" +import { useSession } from "./session" +import { useVSCode } from "./vscode" +import type { AgentRequirementResult } from "../types/messages" +import { keepAgentRequirementsResult } from "./agent-requirements-state" + +export interface AgentRequirementsContextValue { + result: Accessor + checking: Accessor + blocked: Accessor + visible: Accessor +} + +export const AgentRequirementsContext = createContext() + +export const AgentRequirementsProvider: ParentComponent = (props) => { + const vscode = useVSCode() + const session = useSession() + const server = useServer() + const config = useConfig() + const [result, setResult] = createSignal() + const [revision, setRevision] = createSignal(0) + const [pending, setPending] = createSignal(false) + const [requested, setRequested] = createSignal("") + + const enabled = () => config.config().experimental?.agent_requirements === true + const agent = () => session.selectedAgent() + const directory = () => server.workspaceDirectory() + const key = () => `${directory()}\0${agent()}` + const active = (value: { agent: string; directory: string }) => + value.agent === agent() && value.directory === directory() + + const request = () => { + if (!enabled() || !agent() || !directory()) return + setPending(true) + vscode.postMessage({ + type: "requestAgentRequirements", + agent: agent(), + directory: directory(), + sessionID: session.currentSessionID(), + }) + } + + const unsubscribe = vscode.onMessage((message) => { + if (message.type === "agentRequirementsLoaded") { + if (!active(message.result)) return + setPending(false) + setResult(message.result) + return + } + + if (message.type === "agentRequirementsInvalidated") { + setRequested("") + setRevision((value) => value + 1) + } + }) + + createEffect(() => { + revision() + if (!enabled()) { + setRequested("") + setPending(false) + setResult(undefined) + return + } + + const next = key() + if (!agent() || !directory() || next === requested()) return + setRequested(next) + setPending(true) + if (!keepAgentRequirementsResult(result(), agent(), directory())) setResult(undefined) + request() + }) + + const checking = createMemo(() => enabled() && pending()) + const blocked = createMemo(() => { + if (!enabled()) return false + const current = result() + return !current || current.state === "blocked" || current.state === "error" + }) + const visible = createMemo(() => { + const current = result() + return current?.state === "blocked" || current?.state === "error" + }) + + onCleanup(unsubscribe) + + return ( + + {props.children} + + ) +} + +export function useAgentRequirements(): AgentRequirementsContextValue { + const value = useContext(AgentRequirementsContext) + if (!value) throw new Error("useAgentRequirements must be used within an AgentRequirementsProvider") + return value +} diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts index bcd1631d144..931f0e80a5d 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ar.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ar.ts @@ -147,6 +147,30 @@ export const dict = { "command.session.unshare.description": "إيقاف مشاركة هذه الجلسة", "command.session.export": "تصدير سجل الجلسة", + "agentRequirements.skill.installed": "مثبت", + "agentRequirements.skill.checkFailed": "فشل فحص المهارة", + "agentRequirements.skill.missing": "غير مثبت", + "agentRequirements.mcp.connected": "متصل", + "agentRequirements.mcp.checkFailed": "فشل فحص MCP", + "agentRequirements.mcp.missing": "غير متصل", + "agentRequirements.extension.installed": "مثبت", + "agentRequirements.extension.checkFailed": "فشل فحص إضافة VS Code", + "agentRequirements.extension.missing": "غير مثبت", + "agentRequirements.extension.description": "ثبّت الإضافات الناقصة في VS Code.", + "agentRequirements.group.skills": "المهارات", + "agentRequirements.group.mcps": "MCPs", + "agentRequirements.group.extensions": "إضافات VS Code", + "agentRequirements.blocked.title": "متطلبات وكيل {{agent}}", + "agentRequirements.blocked.description": "يحتاج هذا الوكيل إلى الأدوات التالية قبل أن يتمكن من العمل.", + "agentRequirements.prompt.blocked": "أكمل الفحوصات المطلوبة لاستخدام هذا الوكيل أولاً", + "agentRequirements.action.openMarketplace": "فتح Marketplace", + "agentRequirements.error.unknownAgent": "تعذر العثور على الوكيل المحدد.", + "agentRequirements.error.malformedDeclaration": "لدى هذا الوكيل تعريف متطلبات غير صالح.", + "agentRequirements.error.discoveryFailed": "تعذر على Kilo فحص المهارات المتاحة.", + "agentRequirements.error.mcpStatusFailed": "تعذر على Kilo فحص حالة خادم MCP.", + "agentRequirements.error.scopeMismatch": "لم يعد فحص متطلبات هذا الوكيل نشطًا.", + "agentRequirements.error.requestFailed": "تعذر على Kilo فحص متطلبات الوكيل.", + "palette.search.placeholder": "البحث في الملفات والأوامر والجلسات", "palette.empty": "لا توجد نتائج", "palette.group.commands": "الأوامر", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/br.ts b/packages/kilo-vscode/webview-ui/src/i18n/br.ts index da20de9ce01..6440c6fc54b 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/br.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/br.ts @@ -148,6 +148,30 @@ export const dict = { "command.session.unshare.description": "Parar de compartilhar esta sessão", "command.session.export": "Exportar transcrição da sessão", + "agentRequirements.skill.installed": "Instalado", + "agentRequirements.skill.checkFailed": "A verificação da skill falhou", + "agentRequirements.skill.missing": "Não instalado", + "agentRequirements.mcp.connected": "Conectado", + "agentRequirements.mcp.checkFailed": "A verificação do MCP falhou", + "agentRequirements.mcp.missing": "Não conectado", + "agentRequirements.extension.installed": "Instalada", + "agentRequirements.extension.checkFailed": "A verificação da extensão do VS Code falhou", + "agentRequirements.extension.missing": "Não instalada", + "agentRequirements.extension.description": "Instale as extensões ausentes no VS Code.", + "agentRequirements.group.skills": "Skills", + "agentRequirements.group.mcps": "MCPs", + "agentRequirements.group.extensions": "Extensões do VS Code", + "agentRequirements.blocked.title": "Pré-requisitos do agente {{agent}}", + "agentRequirements.blocked.description": "Este agente precisa das seguintes ferramentas antes de poder executar.", + "agentRequirements.prompt.blocked": "Conclua primeiro as verificações necessárias para usar este agente", + "agentRequirements.action.openMarketplace": "Abrir Marketplace", + "agentRequirements.error.unknownAgent": "O agente selecionado não foi encontrado.", + "agentRequirements.error.malformedDeclaration": "Este agente tem uma declaração de requisitos inválida.", + "agentRequirements.error.discoveryFailed": "O Kilo não conseguiu verificar as skills disponíveis.", + "agentRequirements.error.mcpStatusFailed": "O Kilo não conseguiu verificar o status do servidor MCP.", + "agentRequirements.error.scopeMismatch": "Esta verificação de requisitos do agente não está mais ativa.", + "agentRequirements.error.requestFailed": "O Kilo não conseguiu verificar os requisitos do agente.", + "palette.search.placeholder": "Buscar arquivos, comandos e sessões", "palette.empty": "Nenhum resultado encontrado", "palette.group.commands": "Comandos", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts index 664458dfd16..644d5a61a86 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/bs.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/bs.ts @@ -148,6 +148,30 @@ export const dict = { "command.session.unshare.description": "Zaustavi dijeljenje ove sesije", "command.session.export": "Izvezi transkript sesije", + "agentRequirements.skill.installed": "Instalirano", + "agentRequirements.skill.checkFailed": "Provjera vještine nije uspjela", + "agentRequirements.skill.missing": "Nije instalirano", + "agentRequirements.mcp.connected": "Povezano", + "agentRequirements.mcp.checkFailed": "Provjera MCP-a nije uspjela", + "agentRequirements.mcp.missing": "Nije povezano", + "agentRequirements.extension.installed": "Instalirano", + "agentRequirements.extension.checkFailed": "Provjera VS Code ekstenzije nije uspjela", + "agentRequirements.extension.missing": "Nije instalirano", + "agentRequirements.extension.description": "Instalirajte nedostajuće ekstenzije u VS Code.", + "agentRequirements.group.skills": "Vještine", + "agentRequirements.group.mcps": "MCP-ovi", + "agentRequirements.group.extensions": "VS Code ekstenzije", + "agentRequirements.blocked.title": "Preduslovi za agenta {{agent}}", + "agentRequirements.blocked.description": "Ovom agentu su potrebni sljedeći alati prije pokretanja.", + "agentRequirements.prompt.blocked": "Prvo dovršite potrebne provjere da biste koristili ovog agenta", + "agentRequirements.action.openMarketplace": "Otvori Marketplace", + "agentRequirements.error.unknownAgent": "Odabrani agent nije pronađen.", + "agentRequirements.error.malformedDeclaration": "Ovaj agent ima neispravnu deklaraciju zahtjeva.", + "agentRequirements.error.discoveryFailed": "Kilo nije mogao provjeriti dostupne vještine.", + "agentRequirements.error.mcpStatusFailed": "Kilo nije mogao provjeriti status MCP servera.", + "agentRequirements.error.scopeMismatch": "Ova provjera zahtjeva agenta više nije aktivna.", + "agentRequirements.error.requestFailed": "Kilo nije mogao provjeriti zahtjeve agenta.", + "palette.search.placeholder": "Pretraži datoteke, komande i sesije", "palette.empty": "Nema rezultata", "palette.group.commands": "Komande", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/da.ts b/packages/kilo-vscode/webview-ui/src/i18n/da.ts index 172b4a773ec..8390b92bd05 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/da.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/da.ts @@ -148,6 +148,30 @@ export const dict = { "command.session.unshare.description": "Stop med at dele denne session", "command.session.export": "Eksporter sessionsudskrift", + "agentRequirements.skill.installed": "Installeret", + "agentRequirements.skill.checkFailed": "Skill-kontrollen mislykkedes", + "agentRequirements.skill.missing": "Ikke installeret", + "agentRequirements.mcp.connected": "Forbundet", + "agentRequirements.mcp.checkFailed": "MCP-kontrollen mislykkedes", + "agentRequirements.mcp.missing": "Ikke forbundet", + "agentRequirements.extension.installed": "Installeret", + "agentRequirements.extension.checkFailed": "Kontrollen af VS Code-udvidelsen mislykkedes", + "agentRequirements.extension.missing": "Ikke installeret", + "agentRequirements.extension.description": "Installer de manglende udvidelser i VS Code.", + "agentRequirements.group.skills": "Skills", + "agentRequirements.group.mcps": "MCP’er", + "agentRequirements.group.extensions": "VS Code-udvidelser", + "agentRequirements.blocked.title": "Forudsætninger for {{agent}}-agenten", + "agentRequirements.blocked.description": "Denne agent skal have følgende værktøjer, før den kan køre.", + "agentRequirements.prompt.blocked": "Fuldfør først de krævede kontroller for at bruge denne agent", + "agentRequirements.action.openMarketplace": "Åbn Marketplace", + "agentRequirements.error.unknownAgent": "Den valgte agent blev ikke fundet.", + "agentRequirements.error.malformedDeclaration": "Denne agent har en ugyldig kravdeklaration.", + "agentRequirements.error.discoveryFailed": "Kilo kunne ikke kontrollere de tilgængelige skills.", + "agentRequirements.error.mcpStatusFailed": "Kilo kunne ikke kontrollere MCP-serverstatus.", + "agentRequirements.error.scopeMismatch": "Denne agentkravskontrol er ikke længere aktiv.", + "agentRequirements.error.requestFailed": "Kilo kunne ikke kontrollere agentkravene.", + "palette.search.placeholder": "Søg i filer, kommandoer og sessioner", "palette.empty": "Ingen resultater fundet", "palette.group.commands": "Kommandoer", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/de.ts b/packages/kilo-vscode/webview-ui/src/i18n/de.ts index 59b78bffed2..52e721c6b90 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/de.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/de.ts @@ -154,6 +154,31 @@ export const dict = { "command.session.unshare.description": "Teilen dieser Sitzung beenden", "command.session.export": "Sitzungsprotokoll exportieren", + "agentRequirements.skill.installed": "Installiert", + "agentRequirements.skill.checkFailed": "Die Skill-Prüfung ist fehlgeschlagen", + "agentRequirements.skill.missing": "Nicht installiert", + "agentRequirements.mcp.connected": "Verbunden", + "agentRequirements.mcp.checkFailed": "Die MCP-Prüfung ist fehlgeschlagen", + "agentRequirements.mcp.missing": "Nicht verbunden", + "agentRequirements.extension.installed": "Installiert", + "agentRequirements.extension.checkFailed": "Die Prüfung der VS Code-Erweiterung ist fehlgeschlagen", + "agentRequirements.extension.missing": "Nicht installiert", + "agentRequirements.extension.description": "Installiere die fehlenden Erweiterungen in VS Code.", + "agentRequirements.group.skills": "Skills", + "agentRequirements.group.mcps": "MCPs", + "agentRequirements.group.extensions": "VS Code-Erweiterungen", + "agentRequirements.blocked.title": "Voraussetzungen für den Agenten {{agent}}", + "agentRequirements.blocked.description": + "Dieser Agent benötigt die folgenden Werkzeuge, bevor er ausgeführt werden kann.", + "agentRequirements.prompt.blocked": "Schließe zuerst die erforderlichen Prüfungen ab, um diesen Agenten zu verwenden", + "agentRequirements.action.openMarketplace": "Marketplace öffnen", + "agentRequirements.error.unknownAgent": "Der ausgewählte Agent wurde nicht gefunden.", + "agentRequirements.error.malformedDeclaration": "Dieser Agent hat eine ungültige Anforderungsdeklaration.", + "agentRequirements.error.discoveryFailed": "Kilo konnte die verfügbaren Skills nicht prüfen.", + "agentRequirements.error.mcpStatusFailed": "Kilo konnte den MCP-Serverstatus nicht prüfen.", + "agentRequirements.error.scopeMismatch": "Diese Prüfung der Agentenanforderungen ist nicht mehr aktiv.", + "agentRequirements.error.requestFailed": "Kilo konnte die Agentenanforderungen nicht prüfen.", + "palette.search.placeholder": "Dateien, Befehle und Sitzungen durchsuchen", "palette.empty": "Keine Ergebnisse gefunden", "palette.group.commands": "Befehle", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/en.ts b/packages/kilo-vscode/webview-ui/src/i18n/en.ts index 6742d57bef1..fbca98399d8 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/en.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/en.ts @@ -147,6 +147,30 @@ export const dict = { "command.session.unshare.description": "Stop sharing this session", "command.session.export": "Export session transcript", + "agentRequirements.skill.installed": "Installed", + "agentRequirements.skill.checkFailed": "The skill check failed", + "agentRequirements.skill.missing": "Not installed", + "agentRequirements.mcp.connected": "Connected", + "agentRequirements.mcp.checkFailed": "The MCP check failed", + "agentRequirements.mcp.missing": "Not connected", + "agentRequirements.extension.installed": "Installed", + "agentRequirements.extension.checkFailed": "The VS Code extension check failed", + "agentRequirements.extension.missing": "Not installed", + "agentRequirements.extension.description": "Install the missing extensions in VS Code.", + "agentRequirements.group.skills": "Skills", + "agentRequirements.group.mcps": "MCPs", + "agentRequirements.group.extensions": "VS Code Extensions", + "agentRequirements.blocked.title": "{{agent}} agent prerequisites", + "agentRequirements.blocked.description": "This agent needs the following tools before it can run.", + "agentRequirements.prompt.blocked": "Complete the required checks to use this agent first", + "agentRequirements.action.openMarketplace": "Open Marketplace", + "agentRequirements.error.unknownAgent": "The selected agent could not be found.", + "agentRequirements.error.malformedDeclaration": "This agent has an invalid requirement declaration.", + "agentRequirements.error.discoveryFailed": "Kilo could not check the available skills.", + "agentRequirements.error.mcpStatusFailed": "Kilo could not check MCP server status.", + "agentRequirements.error.scopeMismatch": "This agent requirement check is no longer active.", + "agentRequirements.error.requestFailed": "Kilo could not check the agent requirements.", + "palette.search.placeholder": "Search files, commands, and sessions", "palette.empty": "No results found", "palette.group.commands": "Commands", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/es.ts b/packages/kilo-vscode/webview-ui/src/i18n/es.ts index b0c1eac1534..ea74adbf92f 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/es.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/es.ts @@ -148,6 +148,31 @@ export const dict = { "command.session.unshare.description": "Dejar de compartir esta sesión", "command.session.export": "Exportar transcripción de la sesión", + "agentRequirements.skill.installed": "Instalada", + "agentRequirements.skill.checkFailed": "La comprobación de la habilidad falló", + "agentRequirements.skill.missing": "No instalada", + "agentRequirements.mcp.connected": "Conectado", + "agentRequirements.mcp.checkFailed": "La comprobación de MCP falló", + "agentRequirements.mcp.missing": "No conectado", + "agentRequirements.extension.installed": "Instalada", + "agentRequirements.extension.checkFailed": "La comprobación de la extensión de VS Code falló", + "agentRequirements.extension.missing": "No instalada", + "agentRequirements.extension.description": "Instala las extensiones que faltan en VS Code.", + "agentRequirements.group.skills": "Habilidades", + "agentRequirements.group.mcps": "MCPs", + "agentRequirements.group.extensions": "Extensiones de VS Code", + "agentRequirements.blocked.title": "Requisitos previos del agente {{agent}}", + "agentRequirements.blocked.description": + "Este agente necesita las siguientes herramientas antes de poder ejecutarse.", + "agentRequirements.prompt.blocked": "Completa primero las comprobaciones requeridas para usar este agente", + "agentRequirements.action.openMarketplace": "Abrir Marketplace", + "agentRequirements.error.unknownAgent": "No se pudo encontrar el agente seleccionado.", + "agentRequirements.error.malformedDeclaration": "Este agente tiene una declaración de requisitos no válida.", + "agentRequirements.error.discoveryFailed": "Kilo no pudo comprobar las habilidades disponibles.", + "agentRequirements.error.mcpStatusFailed": "Kilo no pudo comprobar el estado del servidor MCP.", + "agentRequirements.error.scopeMismatch": "Esta comprobación de requisitos del agente ya no está activa.", + "agentRequirements.error.requestFailed": "Kilo no pudo comprobar los requisitos del agente.", + "palette.search.placeholder": "Buscar archivos, comandos y sesiones", "palette.empty": "No se encontraron resultados", "palette.group.commands": "Comandos", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts index 7af7271d0cb..6ce5fe7912c 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/fr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/fr.ts @@ -149,6 +149,30 @@ export const dict = { "command.session.unshare.description": "Arrêter de partager cette session", "command.session.export": "Exporter la transcription de la session", + "agentRequirements.skill.installed": "Installée", + "agentRequirements.skill.checkFailed": "La vérification de la compétence a échoué", + "agentRequirements.skill.missing": "Non installée", + "agentRequirements.mcp.connected": "Connecté", + "agentRequirements.mcp.checkFailed": "La vérification MCP a échoué", + "agentRequirements.mcp.missing": "Non connecté", + "agentRequirements.extension.installed": "Installée", + "agentRequirements.extension.checkFailed": "La vérification de l’extension VS Code a échoué", + "agentRequirements.extension.missing": "Non installée", + "agentRequirements.extension.description": "Installez les extensions manquantes dans VS Code.", + "agentRequirements.group.skills": "Compétences", + "agentRequirements.group.mcps": "MCP", + "agentRequirements.group.extensions": "Extensions VS Code", + "agentRequirements.blocked.title": "Prérequis de l’agent {{agent}}", + "agentRequirements.blocked.description": "Cet agent a besoin des outils suivants avant de pouvoir s’exécuter.", + "agentRequirements.prompt.blocked": "Terminez d’abord les vérifications requises pour utiliser cet agent", + "agentRequirements.action.openMarketplace": "Ouvrir Marketplace", + "agentRequirements.error.unknownAgent": "L’agent sélectionné est introuvable.", + "agentRequirements.error.malformedDeclaration": "Cet agent a une déclaration de prérequis invalide.", + "agentRequirements.error.discoveryFailed": "Kilo n’a pas pu vérifier les compétences disponibles.", + "agentRequirements.error.mcpStatusFailed": "Kilo n’a pas pu vérifier l’état du serveur MCP.", + "agentRequirements.error.scopeMismatch": "Cette vérification des prérequis de l’agent n’est plus active.", + "agentRequirements.error.requestFailed": "Kilo n’a pas pu vérifier les prérequis de l’agent.", + "palette.search.placeholder": "Rechercher des fichiers, des commandes et des sessions", "palette.empty": "Aucun résultat trouvé", "palette.group.commands": "Commandes", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/it.ts b/packages/kilo-vscode/webview-ui/src/i18n/it.ts index 10ed5936472..fb598b99e41 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/it.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/it.ts @@ -1668,6 +1668,31 @@ export const dict = { // Session export "command.session.export": "Esporta trascrizione sessione", + "agentRequirements.skill.installed": "Installata", + "agentRequirements.skill.checkFailed": "Il controllo della skill non è riuscito", + "agentRequirements.skill.missing": "Non installata", + "agentRequirements.mcp.connected": "Connesso", + "agentRequirements.mcp.checkFailed": "Il controllo MCP non è riuscito", + "agentRequirements.mcp.missing": "Non connesso", + "agentRequirements.extension.installed": "Installata", + "agentRequirements.extension.checkFailed": "Il controllo dell’estensione VS Code non è riuscito", + "agentRequirements.extension.missing": "Non installata", + "agentRequirements.extension.description": "Installa le estensioni mancanti in VS Code.", + "agentRequirements.group.skills": "Skill", + "agentRequirements.group.mcps": "MCP", + "agentRequirements.group.extensions": "Estensioni VS Code", + "agentRequirements.blocked.title": "Prerequisiti dell’agente {{agent}}", + "agentRequirements.blocked.description": + "Questo agente richiede i seguenti strumenti prima di poter essere eseguito.", + "agentRequirements.prompt.blocked": "Completa prima i controlli richiesti per usare questo agente", + "agentRequirements.action.openMarketplace": "Apri Marketplace", + "agentRequirements.error.unknownAgent": "Impossibile trovare l’agente selezionato.", + "agentRequirements.error.malformedDeclaration": "Questo agente ha una dichiarazione dei requisiti non valida.", + "agentRequirements.error.discoveryFailed": "Kilo non ha potuto controllare le skill disponibili.", + "agentRequirements.error.mcpStatusFailed": "Kilo non ha potuto controllare lo stato del server MCP.", + "agentRequirements.error.scopeMismatch": "Questo controllo dei requisiti dell’agente non è più attivo.", + "agentRequirements.error.requestFailed": "Kilo non ha potuto controllare i requisiti dell’agente.", + // Model groups "model.group.collapse": "Comprimi {{group}}", "model.group.expand": "Espandi {{group}}", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts index 6fefcd57518..685d4aabcda 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ja.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ja.ts @@ -148,6 +148,30 @@ export const dict = { "command.session.unshare.description": "このセッションの共有を停止", "command.session.export": "セッション記録をエクスポート", + "agentRequirements.skill.installed": "インストール済み", + "agentRequirements.skill.checkFailed": "スキルの確認に失敗しました", + "agentRequirements.skill.missing": "未インストール", + "agentRequirements.mcp.connected": "接続済み", + "agentRequirements.mcp.checkFailed": "MCP の確認に失敗しました", + "agentRequirements.mcp.missing": "未接続", + "agentRequirements.extension.installed": "インストール済み", + "agentRequirements.extension.checkFailed": "VS Code 拡張機能の確認に失敗しました", + "agentRequirements.extension.missing": "未インストール", + "agentRequirements.extension.description": "不足している拡張機能を VS Code にインストールしてください。", + "agentRequirements.group.skills": "スキル", + "agentRequirements.group.mcps": "MCP", + "agentRequirements.group.extensions": "VS Code 拡張機能", + "agentRequirements.blocked.title": "{{agent}} エージェントの前提条件", + "agentRequirements.blocked.description": "このエージェントを実行するには、次のツールが必要です。", + "agentRequirements.prompt.blocked": "このエージェントを使用するには、先に必要な確認を完了してください", + "agentRequirements.action.openMarketplace": "Marketplace を開く", + "agentRequirements.error.unknownAgent": "選択したエージェントが見つかりませんでした。", + "agentRequirements.error.malformedDeclaration": "このエージェントの要件宣言は無効です。", + "agentRequirements.error.discoveryFailed": "Kilo は利用可能なスキルを確認できませんでした。", + "agentRequirements.error.mcpStatusFailed": "Kilo は MCP サーバーの状態を確認できませんでした。", + "agentRequirements.error.scopeMismatch": "このエージェント要件の確認はもう有効ではありません。", + "agentRequirements.error.requestFailed": "Kilo はエージェント要件を確認できませんでした。", + "palette.search.placeholder": "ファイル、コマンド、セッションを検索", "palette.empty": "結果が見つかりません", "palette.group.commands": "コマンド", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts index 03ec50dba71..6bba0816487 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ko.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ko.ts @@ -152,6 +152,30 @@ export const dict = { "command.session.unshare.description": "이 세션 공유 중지", "command.session.export": "세션 기록 내보내기", + "agentRequirements.skill.installed": "설치됨", + "agentRequirements.skill.checkFailed": "스킬 확인에 실패했습니다", + "agentRequirements.skill.missing": "설치되지 않음", + "agentRequirements.mcp.connected": "연결됨", + "agentRequirements.mcp.checkFailed": "MCP 확인에 실패했습니다", + "agentRequirements.mcp.missing": "연결되지 않음", + "agentRequirements.extension.installed": "설치됨", + "agentRequirements.extension.checkFailed": "VS Code 확장 확인에 실패했습니다", + "agentRequirements.extension.missing": "설치되지 않음", + "agentRequirements.extension.description": "VS Code에서 누락된 확장을 설치하세요.", + "agentRequirements.group.skills": "스킬", + "agentRequirements.group.mcps": "MCP", + "agentRequirements.group.extensions": "VS Code 확장", + "agentRequirements.blocked.title": "{{agent}} 에이전트 필수 조건", + "agentRequirements.blocked.description": "이 에이전트를 실행하려면 다음 도구가 필요합니다.", + "agentRequirements.prompt.blocked": "이 에이전트를 사용하려면 먼저 필요한 확인을 완료하세요", + "agentRequirements.action.openMarketplace": "Marketplace 열기", + "agentRequirements.error.unknownAgent": "선택한 에이전트를 찾을 수 없습니다.", + "agentRequirements.error.malformedDeclaration": "이 에이전트의 요구 사항 선언이 올바르지 않습니다.", + "agentRequirements.error.discoveryFailed": "Kilo가 사용 가능한 스킬을 확인하지 못했습니다.", + "agentRequirements.error.mcpStatusFailed": "Kilo가 MCP 서버 상태를 확인하지 못했습니다.", + "agentRequirements.error.scopeMismatch": "이 에이전트 요구 사항 확인은 더 이상 활성 상태가 아닙니다.", + "agentRequirements.error.requestFailed": "Kilo가 에이전트 요구 사항을 확인하지 못했습니다.", + "palette.search.placeholder": "파일, 명령어 및 세션 검색", "palette.empty": "결과 없음", "palette.group.commands": "명령어", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts index af6719f3d33..37f30d327b0 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/nl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/nl.ts @@ -148,6 +148,31 @@ export const dict = { "command.session.unshare.description": "Stop met het delen van deze sessie", "command.session.export": "Sessietranscript exporteren", + "agentRequirements.skill.installed": "Geïnstalleerd", + "agentRequirements.skill.checkFailed": "De skillcontrole is mislukt", + "agentRequirements.skill.missing": "Niet geïnstalleerd", + "agentRequirements.mcp.connected": "Verbonden", + "agentRequirements.mcp.checkFailed": "De MCP-controle is mislukt", + "agentRequirements.mcp.missing": "Niet verbonden", + "agentRequirements.extension.installed": "Geïnstalleerd", + "agentRequirements.extension.checkFailed": "De controle van de VS Code-extensie is mislukt", + "agentRequirements.extension.missing": "Niet geïnstalleerd", + "agentRequirements.extension.description": "Installeer de ontbrekende extensies in VS Code.", + "agentRequirements.group.skills": "Skills", + "agentRequirements.group.mcps": "MCP’s", + "agentRequirements.group.extensions": "VS Code-extensies", + "agentRequirements.blocked.title": "Vereisten voor agent {{agent}}", + "agentRequirements.blocked.description": + "Deze agent heeft de volgende tools nodig voordat deze kan worden uitgevoerd.", + "agentRequirements.prompt.blocked": "Voltooi eerst de vereiste controles om deze agent te gebruiken", + "agentRequirements.action.openMarketplace": "Marketplace openen", + "agentRequirements.error.unknownAgent": "De geselecteerde agent kon niet worden gevonden.", + "agentRequirements.error.malformedDeclaration": "Deze agent heeft een ongeldige vereistenverklaring.", + "agentRequirements.error.discoveryFailed": "Kilo kon de beschikbare skills niet controleren.", + "agentRequirements.error.mcpStatusFailed": "Kilo kon de MCP-serverstatus niet controleren.", + "agentRequirements.error.scopeMismatch": "Deze controle van agentvereisten is niet meer actief.", + "agentRequirements.error.requestFailed": "Kilo kon de agentvereisten niet controleren.", + "palette.search.placeholder": "Zoeken naar bestanden, commando's en sessies", "palette.empty": "Geen resultaten gevonden", "palette.group.commands": "Commando's", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/no.ts b/packages/kilo-vscode/webview-ui/src/i18n/no.ts index 5a1c901b863..ffd34e93d57 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/no.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/no.ts @@ -151,6 +151,30 @@ export const dict = { "command.session.unshare.description": "Slutt å dele denne sesjonen", "command.session.export": "Eksporter sesjonsutskrift", + "agentRequirements.skill.installed": "Installert", + "agentRequirements.skill.checkFailed": "Skill-sjekken mislyktes", + "agentRequirements.skill.missing": "Ikke installert", + "agentRequirements.mcp.connected": "Tilkoblet", + "agentRequirements.mcp.checkFailed": "MCP-sjekken mislyktes", + "agentRequirements.mcp.missing": "Ikke tilkoblet", + "agentRequirements.extension.installed": "Installert", + "agentRequirements.extension.checkFailed": "Sjekken av VS Code-utvidelsen mislyktes", + "agentRequirements.extension.missing": "Ikke installert", + "agentRequirements.extension.description": "Installer de manglende utvidelsene i VS Code.", + "agentRequirements.group.skills": "Skills", + "agentRequirements.group.mcps": "MCP-er", + "agentRequirements.group.extensions": "VS Code-utvidelser", + "agentRequirements.blocked.title": "Forutsetninger for agenten {{agent}}", + "agentRequirements.blocked.description": "Denne agenten trenger følgende verktøy før den kan kjøre.", + "agentRequirements.prompt.blocked": "Fullfør først de nødvendige sjekkene for å bruke denne agenten", + "agentRequirements.action.openMarketplace": "Åpne Marketplace", + "agentRequirements.error.unknownAgent": "Den valgte agenten ble ikke funnet.", + "agentRequirements.error.malformedDeclaration": "Denne agenten har en ugyldig kravdeklarasjon.", + "agentRequirements.error.discoveryFailed": "Kilo kunne ikke sjekke tilgjengelige skills.", + "agentRequirements.error.mcpStatusFailed": "Kilo kunne ikke sjekke MCP-serverstatus.", + "agentRequirements.error.scopeMismatch": "Denne sjekken av agentkrav er ikke lenger aktiv.", + "agentRequirements.error.requestFailed": "Kilo kunne ikke sjekke agentkravene.", + "palette.search.placeholder": "Søk i filer, kommandoer og sesjoner", "palette.empty": "Ingen resultater funnet", "palette.group.commands": "Kommandoer", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts index 88b92450d1f..57755090e7b 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/pl.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/pl.ts @@ -148,6 +148,30 @@ export const dict = { "command.session.unshare.description": "Zatrzymaj udostępnianie tej sesji", "command.session.export": "Eksportuj transkrypcję sesji", + "agentRequirements.skill.installed": "Zainstalowano", + "agentRequirements.skill.checkFailed": "Sprawdzanie umiejętności nie powiodło się", + "agentRequirements.skill.missing": "Nie zainstalowano", + "agentRequirements.mcp.connected": "Połączono", + "agentRequirements.mcp.checkFailed": "Sprawdzanie MCP nie powiodło się", + "agentRequirements.mcp.missing": "Nie połączono", + "agentRequirements.extension.installed": "Zainstalowano", + "agentRequirements.extension.checkFailed": "Sprawdzanie rozszerzenia VS Code nie powiodło się", + "agentRequirements.extension.missing": "Nie zainstalowano", + "agentRequirements.extension.description": "Zainstaluj brakujące rozszerzenia w VS Code.", + "agentRequirements.group.skills": "Umiejętności", + "agentRequirements.group.mcps": "MCP", + "agentRequirements.group.extensions": "Rozszerzenia VS Code", + "agentRequirements.blocked.title": "Wymagania wstępne agenta {{agent}}", + "agentRequirements.blocked.description": "Ten agent potrzebuje następujących narzędzi, zanim będzie mógł działać.", + "agentRequirements.prompt.blocked": "Najpierw ukończ wymagane sprawdzenia, aby użyć tego agenta", + "agentRequirements.action.openMarketplace": "Otwórz Marketplace", + "agentRequirements.error.unknownAgent": "Nie znaleziono wybranego agenta.", + "agentRequirements.error.malformedDeclaration": "Ten agent ma nieprawidłową deklarację wymagań.", + "agentRequirements.error.discoveryFailed": "Kilo nie mógł sprawdzić dostępnych umiejętności.", + "agentRequirements.error.mcpStatusFailed": "Kilo nie mógł sprawdzić stanu serwera MCP.", + "agentRequirements.error.scopeMismatch": "To sprawdzenie wymagań agenta nie jest już aktywne.", + "agentRequirements.error.requestFailed": "Kilo nie mógł sprawdzić wymagań agenta.", + "palette.search.placeholder": "Szukaj plików, poleceń i sesji", "palette.empty": "Brak wyników", "palette.group.commands": "Polecenia", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts index d23a40bbd70..606409f3d85 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/ru.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/ru.ts @@ -148,6 +148,30 @@ export const dict = { "command.session.unshare.description": "Прекратить публикацию сессии", "command.session.export": "Экспортировать запись сеанса", + "agentRequirements.skill.installed": "Установлено", + "agentRequirements.skill.checkFailed": "Не удалось проверить навык", + "agentRequirements.skill.missing": "Не установлено", + "agentRequirements.mcp.connected": "Подключено", + "agentRequirements.mcp.checkFailed": "Не удалось проверить MCP", + "agentRequirements.mcp.missing": "Не подключено", + "agentRequirements.extension.installed": "Установлено", + "agentRequirements.extension.checkFailed": "Не удалось проверить расширение VS Code", + "agentRequirements.extension.missing": "Не установлено", + "agentRequirements.extension.description": "Установите отсутствующие расширения в VS Code.", + "agentRequirements.group.skills": "Навыки", + "agentRequirements.group.mcps": "MCP", + "agentRequirements.group.extensions": "Расширения VS Code", + "agentRequirements.blocked.title": "Требования агента {{agent}}", + "agentRequirements.blocked.description": "Этому агенту нужны следующие инструменты перед запуском.", + "agentRequirements.prompt.blocked": "Сначала выполните необходимые проверки, чтобы использовать этого агента", + "agentRequirements.action.openMarketplace": "Открыть Marketplace", + "agentRequirements.error.unknownAgent": "Выбранный агент не найден.", + "agentRequirements.error.malformedDeclaration": "У этого агента недопустимое объявление требований.", + "agentRequirements.error.discoveryFailed": "Kilo не смог проверить доступные навыки.", + "agentRequirements.error.mcpStatusFailed": "Kilo не смог проверить состояние сервера MCP.", + "agentRequirements.error.scopeMismatch": "Эта проверка требований агента больше не активна.", + "agentRequirements.error.requestFailed": "Kilo не смог проверить требования агента.", + "palette.search.placeholder": "Поиск файлов, команд и сессий", "palette.empty": "Ничего не найдено", "palette.group.commands": "Команды", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/th.ts b/packages/kilo-vscode/webview-ui/src/i18n/th.ts index 6c2329f4fb7..5eff14d5ec8 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/th.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/th.ts @@ -147,6 +147,30 @@ export const dict = { "command.session.unshare.description": "หยุดการแชร์เซสชันนี้", "command.session.export": "ส่งออกบันทึกเซสชัน", + "agentRequirements.skill.installed": "ติดตั้งแล้ว", + "agentRequirements.skill.checkFailed": "การตรวจสอบสกิลล้มเหลว", + "agentRequirements.skill.missing": "ยังไม่ได้ติดตั้ง", + "agentRequirements.mcp.connected": "เชื่อมต่อแล้ว", + "agentRequirements.mcp.checkFailed": "การตรวจสอบ MCP ล้มเหลว", + "agentRequirements.mcp.missing": "ยังไม่ได้เชื่อมต่อ", + "agentRequirements.extension.installed": "ติดตั้งแล้ว", + "agentRequirements.extension.checkFailed": "การตรวจสอบส่วนขยาย VS Code ล้มเหลว", + "agentRequirements.extension.missing": "ยังไม่ได้ติดตั้ง", + "agentRequirements.extension.description": "ติดตั้งส่วนขยายที่ขาดหายใน VS Code", + "agentRequirements.group.skills": "สกิล", + "agentRequirements.group.mcps": "MCP", + "agentRequirements.group.extensions": "ส่วนขยาย VS Code", + "agentRequirements.blocked.title": "ข้อกำหนดเบื้องต้นของเอเจนต์ {{agent}}", + "agentRequirements.blocked.description": "เอเจนต์นี้ต้องใช้เครื่องมือต่อไปนี้ก่อนจึงจะทำงานได้", + "agentRequirements.prompt.blocked": "ทำการตรวจสอบที่จำเป็นให้เสร็จก่อนเพื่อใช้เอเจนต์นี้", + "agentRequirements.action.openMarketplace": "เปิด Marketplace", + "agentRequirements.error.unknownAgent": "ไม่พบเอเจนต์ที่เลือก", + "agentRequirements.error.malformedDeclaration": "เอเจนต์นี้มีการประกาศข้อกำหนดที่ไม่ถูกต้อง", + "agentRequirements.error.discoveryFailed": "Kilo ไม่สามารถตรวจสอบสกิลที่มีอยู่ได้", + "agentRequirements.error.mcpStatusFailed": "Kilo ไม่สามารถตรวจสอบสถานะเซิร์ฟเวอร์ MCP ได้", + "agentRequirements.error.scopeMismatch": "การตรวจสอบข้อกำหนดของเอเจนต์นี้ไม่ทำงานอีกต่อไป", + "agentRequirements.error.requestFailed": "Kilo ไม่สามารถตรวจสอบข้อกำหนดของเอเจนต์ได้", + "palette.search.placeholder": "ค้นหาไฟล์ คำสั่ง และเซสชัน", "palette.empty": "ไม่พบผลลัพธ์", "palette.group.commands": "คำสั่ง", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts index 143b0d4ce9f..9eb9cd4c3fb 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/tr.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/tr.ts @@ -148,6 +148,30 @@ export const dict = { "command.session.unshare.description": "Bu oturumun paylaşımını durdur", "command.session.export": "Oturum dökümünü dışa aktar", + "agentRequirements.skill.installed": "Yüklü", + "agentRequirements.skill.checkFailed": "Yetenek denetimi başarısız oldu", + "agentRequirements.skill.missing": "Yüklü değil", + "agentRequirements.mcp.connected": "Bağlı", + "agentRequirements.mcp.checkFailed": "MCP denetimi başarısız oldu", + "agentRequirements.mcp.missing": "Bağlı değil", + "agentRequirements.extension.installed": "Yüklü", + "agentRequirements.extension.checkFailed": "VS Code uzantısı denetimi başarısız oldu", + "agentRequirements.extension.missing": "Yüklü değil", + "agentRequirements.extension.description": "Eksik uzantıları VS Code içinde yükleyin.", + "agentRequirements.group.skills": "Yetenekler", + "agentRequirements.group.mcps": "MCP’ler", + "agentRequirements.group.extensions": "VS Code Uzantıları", + "agentRequirements.blocked.title": "{{agent}} ajanı ön koşulları", + "agentRequirements.blocked.description": "Bu ajanın çalışmadan önce aşağıdaki araçlara ihtiyacı var.", + "agentRequirements.prompt.blocked": "Bu ajanı kullanmak için önce gerekli denetimleri tamamlayın", + "agentRequirements.action.openMarketplace": "Marketplace’i Aç", + "agentRequirements.error.unknownAgent": "Seçili ajan bulunamadı.", + "agentRequirements.error.malformedDeclaration": "Bu ajanın geçersiz bir gereksinim bildirimi var.", + "agentRequirements.error.discoveryFailed": "Kilo mevcut yetenekleri denetleyemedi.", + "agentRequirements.error.mcpStatusFailed": "Kilo MCP sunucu durumunu denetleyemedi.", + "agentRequirements.error.scopeMismatch": "Bu ajan gereksinimi denetimi artık etkin değil.", + "agentRequirements.error.requestFailed": "Kilo ajan gereksinimlerini denetleyemedi.", + "palette.search.placeholder": "Dosya, komut ve oturum ara", "palette.empty": "Sonuç bulunamadı", "palette.group.commands": "Komutlar", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts index a04e1cc6b38..50646d31d16 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/uk.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/uk.ts @@ -148,6 +148,30 @@ export const dict = { "command.session.unshare.description": "Закрити доступ до цієї сесії", "command.session.export": "Експортувати запис сеансу", + "agentRequirements.skill.installed": "Встановлено", + "agentRequirements.skill.checkFailed": "Не вдалося перевірити навичку", + "agentRequirements.skill.missing": "Не встановлено", + "agentRequirements.mcp.connected": "Підключено", + "agentRequirements.mcp.checkFailed": "Не вдалося перевірити MCP", + "agentRequirements.mcp.missing": "Не підключено", + "agentRequirements.extension.installed": "Встановлено", + "agentRequirements.extension.checkFailed": "Не вдалося перевірити розширення VS Code", + "agentRequirements.extension.missing": "Не встановлено", + "agentRequirements.extension.description": "Встановіть відсутні розширення у VS Code.", + "agentRequirements.group.skills": "Навички", + "agentRequirements.group.mcps": "MCP", + "agentRequirements.group.extensions": "Розширення VS Code", + "agentRequirements.blocked.title": "Передумови агента {{agent}}", + "agentRequirements.blocked.description": "Цьому агенту потрібні такі інструменти, перш ніж він зможе працювати.", + "agentRequirements.prompt.blocked": "Спочатку завершіть необхідні перевірки, щоб використати цього агента", + "agentRequirements.action.openMarketplace": "Відкрити Marketplace", + "agentRequirements.error.unknownAgent": "Вибраного агента не знайдено.", + "agentRequirements.error.malformedDeclaration": "Цей агент має недійсну декларацію вимог.", + "agentRequirements.error.discoveryFailed": "Kilo не зміг перевірити доступні навички.", + "agentRequirements.error.mcpStatusFailed": "Kilo не зміг перевірити стан сервера MCP.", + "agentRequirements.error.scopeMismatch": "Ця перевірка вимог агента більше не активна.", + "agentRequirements.error.requestFailed": "Kilo не зміг перевірити вимоги агента.", + "palette.search.placeholder": "Пошук файлів, команд і сесій", "palette.empty": "Результатів не знайдено", "palette.group.commands": "Команди", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts index e17738110c4..11c132cdaab 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zh.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zh.ts @@ -149,6 +149,30 @@ export const dict = { "command.session.unshare.description": "停止分享此会话", "command.session.export": "导出会话记录", + "agentRequirements.skill.installed": "已安装", + "agentRequirements.skill.checkFailed": "技能检查失败", + "agentRequirements.skill.missing": "未安装", + "agentRequirements.mcp.connected": "已连接", + "agentRequirements.mcp.checkFailed": "MCP 检查失败", + "agentRequirements.mcp.missing": "未连接", + "agentRequirements.extension.installed": "已安装", + "agentRequirements.extension.checkFailed": "VS Code 扩展检查失败", + "agentRequirements.extension.missing": "未安装", + "agentRequirements.extension.description": "在 VS Code 中安装缺少的扩展。", + "agentRequirements.group.skills": "技能", + "agentRequirements.group.mcps": "MCP", + "agentRequirements.group.extensions": "VS Code 扩展", + "agentRequirements.blocked.title": "{{agent}} 代理前置要求", + "agentRequirements.blocked.description": "此代理需要以下工具后才能运行。", + "agentRequirements.prompt.blocked": "请先完成所需检查,然后再使用此代理", + "agentRequirements.action.openMarketplace": "打开 Marketplace", + "agentRequirements.error.unknownAgent": "找不到所选代理。", + "agentRequirements.error.malformedDeclaration": "此代理的要求声明无效。", + "agentRequirements.error.discoveryFailed": "Kilo 无法检查可用技能。", + "agentRequirements.error.mcpStatusFailed": "Kilo 无法检查 MCP 服务器状态。", + "agentRequirements.error.scopeMismatch": "此代理要求检查已不再有效。", + "agentRequirements.error.requestFailed": "Kilo 无法检查代理要求。", + "palette.search.placeholder": "搜索文件、命令和会话", "palette.empty": "未找到结果", "palette.group.commands": "命令", diff --git a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts index 8e574f8f262..629a6f0e01e 100644 --- a/packages/kilo-vscode/webview-ui/src/i18n/zht.ts +++ b/packages/kilo-vscode/webview-ui/src/i18n/zht.ts @@ -149,6 +149,30 @@ export const dict = { "command.session.unshare.description": "停止分享此工作階段", "command.session.export": "匯出會話紀錄", + "agentRequirements.skill.installed": "已安裝", + "agentRequirements.skill.checkFailed": "技能檢查失敗", + "agentRequirements.skill.missing": "未安裝", + "agentRequirements.mcp.connected": "已連線", + "agentRequirements.mcp.checkFailed": "MCP 檢查失敗", + "agentRequirements.mcp.missing": "未連線", + "agentRequirements.extension.installed": "已安裝", + "agentRequirements.extension.checkFailed": "VS Code 擴充功能檢查失敗", + "agentRequirements.extension.missing": "未安裝", + "agentRequirements.extension.description": "在 VS Code 中安裝缺少的擴充功能。", + "agentRequirements.group.skills": "技能", + "agentRequirements.group.mcps": "MCP", + "agentRequirements.group.extensions": "VS Code 擴充功能", + "agentRequirements.blocked.title": "{{agent}} 代理前置需求", + "agentRequirements.blocked.description": "此代理需要以下工具後才能執行。", + "agentRequirements.prompt.blocked": "請先完成必要檢查,才能使用此代理", + "agentRequirements.action.openMarketplace": "開啟 Marketplace", + "agentRequirements.error.unknownAgent": "找不到所選代理。", + "agentRequirements.error.malformedDeclaration": "此代理的需求宣告無效。", + "agentRequirements.error.discoveryFailed": "Kilo 無法檢查可用技能。", + "agentRequirements.error.mcpStatusFailed": "Kilo 無法檢查 MCP 伺服器狀態。", + "agentRequirements.error.scopeMismatch": "此代理需求檢查已不再有效。", + "agentRequirements.error.requestFailed": "Kilo 無法檢查代理需求。", + "palette.search.placeholder": "搜尋檔案、命令和工作階段", "palette.empty": "找不到結果", "palette.group.commands": "命令", diff --git a/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx b/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx index 4e9c67b0057..eab0fd12cca 100644 --- a/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx +++ b/packages/kilo-vscode/webview-ui/src/stories/StoryProviders.tsx @@ -29,6 +29,7 @@ import { Diff } from "@kilocode/kilo-ui/diff" import { Code } from "@kilocode/kilo-ui/code" import { File } from "@kilocode/kilo-ui/file" import { SessionContext } from "../context/session" +import { AgentRequirementsContext, type AgentRequirementsContextValue } from "../context/agent-requirements" import { NotificationsContext } from "../context/notifications" import { LanguageContext } from "../context/language" import { IndexingProvider } from "../context/indexing" @@ -48,6 +49,7 @@ import type { SessionCloseReason, QuestionRequest, SuggestionRequest, + AgentRequirementResult, } from "../types/messages" type PluginSpec = string | [string, Record] @@ -277,6 +279,9 @@ interface StoryProvidersProps { questions?: QuestionRequest[] suggestions?: SuggestionRequest[] notifications?: KilocodeNotification[] + agentRequirements?: AgentRequirementResult + agentRequirementsChecking?: boolean + agentRequirementsBlocked?: boolean status?: string sessionID?: string /** When provided, injects a mock ConfigContext with this config instead of the real ConfigProvider. */ @@ -385,6 +390,22 @@ export const StoryProviders: ParentComponent = (props) => { }) const notifications = mockNotificationsValue(props.notifications) const [locale] = createSignal<"en">("en") + const result = () => props.agentRequirements + const visible = () => { + const value = result() + return value?.state === "blocked" || value?.state === "error" + } + const requirements: AgentRequirementsContextValue = { + result, + checking: () => props.agentRequirementsChecking ?? false, + blocked: () => { + if (props.agentRequirementsBlocked !== undefined) return props.agentRequirementsBlocked + const value = result() + if (!value) return props.agentRequirementsChecking === true + return value.enabled && (value.state === "blocked" || value.state === "error") + }, + visible, + } return ( @@ -413,30 +434,32 @@ export const StoryProviders: ParentComponent = (props) => { "en", t }}> - - - - - - - - {props.noPadding ? ( - props.children - ) : ( -
{props.children}
- )} - - - - - - - + + + + + + + + + {props.noPadding ? ( + props.children + ) : ( +
{props.children}
+ )} +
+
+
+
+
+
+
+
diff --git a/packages/kilo-vscode/webview-ui/src/stories/chat.stories.tsx b/packages/kilo-vscode/webview-ui/src/stories/chat.stories.tsx index cd27ec5dc4b..8d553bc35c6 100644 --- a/packages/kilo-vscode/webview-ui/src/stories/chat.stories.tsx +++ b/packages/kilo-vscode/webview-ui/src/stories/chat.stories.tsx @@ -21,12 +21,82 @@ import { TurnOutcome } from "../components/shared/TurnOutcome" import { SessionContext } from "../context/session" import { ServerContext } from "../context/server" import { WorktreeModeProvider } from "../context/worktree-mode" -import type { Message, Part, QuestionRequest, ReviewComment, SuggestionRequest, TodoItem } from "../types/messages" +import type { + AgentRequirementResult, + Message, + Part, + QuestionRequest, + ReviewComment, + SuggestionRequest, + TodoItem, +} from "../types/messages" import { formatReviewCommentsMarkdown } from "../utils/review-comment-markdown" import { reviewMetadata } from "../../../src/shared/review-comments" const SESSION_ID = "story-session-chat-001" +const missingToolsRequirements: AgentRequirementResult = { + agent: "code-review", + directory: "/project", + enabled: true, + state: "blocked", + skills: [ + { name: "review-checklist", status: "ready" }, + { name: "security-audit", status: "missing" }, + ], + mcps: [ + { name: "github", status: "missing" }, + { name: "filesystem", status: "ready" }, + ], + vscode_extensions: [], +} + +const missingExtensionRequirements: AgentRequirementResult = { + agent: "release-review", + directory: "/project", + enabled: true, + state: "blocked", + skills: [], + mcps: [], + vscode_extensions: [ + { + name: "GitHub Pull Requests", + id: "github.vscode-pull-request-github", + status: "missing", + }, + ], +} + +const malformedRequirements: AgentRequirementResult = { + agent: "malformed-agent", + directory: "/project", + enabled: true, + state: "error", + skills: [], + mcps: [], + vscode_extensions: [], + error: { + code: "malformed_declaration", + message: "Invalid requirements declaration.", + }, +} + +const readyRequirements: AgentRequirementResult = { + agent: "ready-agent", + directory: "/project", + enabled: true, + state: "ready", + skills: [{ name: "review-checklist", status: "ready" }], + mcps: [{ name: "filesystem", status: "ready" }], + vscode_extensions: [ + { + name: "GitHub Pull Requests", + id: "github.vscode-pull-request-github", + status: "ready", + }, + ], +} + // --------------------------------------------------------------------------- // Question fixtures // --------------------------------------------------------------------------- @@ -153,6 +223,71 @@ export const ChatViewWithMessages: Story = { }, } +export const ChatViewRequirementsChecking: Story = { + name: "ChatView — agent requirements checking", + render: () => ( + + +
+ +
+
+
+ ), +} + +export const ChatViewRequirementsMissingTools: Story = { + name: "ChatView — missing skills and MCPs", + render: () => ( + + +
+ +
+
+
+ ), +} + +export const ChatViewRequirementsMissingExtension: Story = { + name: "ChatView — missing VS Code extension", + render: () => ( + + +
+ +
+
+
+ ), +} + +export const ChatViewRequirementsMalformed: Story = { + name: "ChatView — malformed agent requirements", + render: () => ( + + +
+ +
+
+
+ ), +} + +export const ChatViewRequirementsReady: Story = { + name: "ChatView — requirements ready (no card)", + render: () => ( + + +
+ +
+
+
+ ), +} + export const ChatViewAgentManagerCompleted: Story = { name: "ChatView — completed Agent Manager session actions", render: () => { diff --git a/packages/kilo-vscode/webview-ui/src/styles/agent-requirements.css b/packages/kilo-vscode/webview-ui/src/styles/agent-requirements.css new file mode 100644 index 00000000000..336b7947818 --- /dev/null +++ b/packages/kilo-vscode/webview-ui/src/styles/agent-requirements.css @@ -0,0 +1,298 @@ +/* ============================================ + Agent Requirements + ============================================ */ + +.agent-requirements { + height: 100%; + overflow: auto; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + padding: 16px var(--chat-gutter, 16px); + animation: agent-requirements-enter 360ms ease-out 100ms both; +} + +[data-component="card"].agent-requirements-card { + width: 100%; + max-width: 430px; + display: flex; + flex-direction: column; + gap: 20px; + padding: 18px; + border: 1px solid var(--border-weak-base, var(--vscode-panel-border)); + border-radius: 10px; + background: var(--vscode-editorWidget-background); + color: var(--vscode-foreground); + text-align: left; + box-shadow: 0 12px 32px rgb(0 0 0 / 22%); +} + +@keyframes agent-requirements-enter { + from { + opacity: 0; + transform: translateY(10px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +@media (prefers-reduced-motion: reduce) { + .agent-requirements { + animation: none; + } +} + +[data-slot="agent-requirements-copy"] { + display: flex; + flex-direction: column; + gap: 8px; +} + +[data-slot="agent-requirements-title-row"] { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +[data-slot="agent-requirements-title"] { + margin: 0; + color: var(--vscode-foreground); + font-size: var(--kilo-font-size-14); + font-weight: 650; + line-height: 1.35; +} + +[data-slot="agent-requirements-title-row"] > [data-component="icon"] { + --icon-base: var(--icon-success-base); + flex: 0 0 auto; +} + +.agent-requirements-title-spinner { + flex: 0 0 auto; +} + +[data-slot="agent-requirements-description"] { + margin: 0; + color: var(--text-weak-base, var(--vscode-descriptionForeground)); + font-size: var(--kilo-font-size-12); + line-height: 1.45; +} + +.agent-requirements-error { + margin: 0; + padding: 10px; + border: 1px solid var(--border-critical-base); + border-radius: 8px; + background: color-mix(in srgb, var(--surface-critical-base) 34%, var(--vscode-editor-background)); + color: var(--text-on-critical-base); + font-size: var(--kilo-font-size-12); + line-height: 1.45; +} + +[data-slot="agent-requirements-options"] { + display: grid; + grid-template-columns: 1fr; + gap: 16px; + min-width: 0; +} + +.agent-requirements-category { + display: flex; + flex-direction: column; + gap: 10px; + min-width: 0; +} + +[data-slot="agent-requirements-category-copy"] { + display: flex; + flex-direction: column; + gap: 4px; +} + +[data-slot="agent-requirements-category-title"] { + margin: 0; + color: var(--vscode-textLink-foreground); + font-size: var(--kilo-font-size-11); + font-weight: 650; + line-height: 1.25; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +[data-slot="agent-requirements-category-description"] { + margin: 0; + color: var(--text-weak-base, var(--vscode-descriptionForeground)); + font-size: var(--kilo-font-size-12); + line-height: 1.4; +} + +[data-slot="agent-requirements-category-content"] { + display: flex; + flex-direction: column; + gap: 14px; + min-width: 0; +} + +.agent-requirements-group { + display: flex; + flex-direction: column; + gap: 8px; + min-width: 0; + color: var(--vscode-foreground); +} + +[data-slot="agent-requirements-group-title"] { + margin: 0; + color: var(--vscode-foreground); + font-size: var(--kilo-font-size-12); + font-weight: 650; + line-height: 1.35; +} + +[data-slot="agent-requirements-list"] { + display: flex; + flex-direction: column; + gap: 6px; + margin: 0; + padding: 0; + color: var(--vscode-foreground); + list-style: none; + font-size: var(--kilo-font-size-12); + line-height: 1.4; +} + +.agent-requirements-line { + display: flex; + align-items: center; + gap: 10px; + min-width: 0; + padding: 7px 0; + border-bottom: 1px solid color-mix(in srgb, var(--border-weak-base, var(--vscode-panel-border)) 60%, transparent); +} + +.agent-requirements-line:last-child { + border-bottom: 0; +} + +[data-slot="agent-requirements-status"] { + width: 22px; + height: 22px; + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + border-radius: 6px; +} + +[data-slot="agent-requirements-status"][data-status="ready"] { + color: var(--vscode-charts-green, #89d185); + background: color-mix(in srgb, var(--vscode-charts-green, #89d185) 12%, transparent); +} + +[data-slot="agent-requirements-status"][data-status="missing"] { + color: var(--vscode-charts-yellow, #e2c08d); + background: color-mix(in srgb, var(--vscode-charts-yellow, #e2c08d) 13%, transparent); +} + +[data-slot="agent-requirements-status"][data-status="error"] { + color: var(--icon-critical-base); + background: color-mix(in srgb, var(--surface-critical-base) 50%, transparent); +} + +[data-slot="agent-requirements-status"] [data-component="icon"], +[data-slot="agent-requirements-status"] [data-component="spinner"] { + width: 14px; + height: 14px; +} + +[data-slot="agent-requirements-line-row"] { + display: flex; + align-items: baseline; + justify-content: space-between; + flex: 1; + gap: 12px; + min-width: 0; +} + +[data-slot="agent-requirements-line-name"] { + min-width: 0; + overflow-wrap: anywhere; + color: var(--vscode-foreground); +} + +[data-slot="agent-requirements-line-detail"] { + flex: 0 0 auto; + max-width: 48%; + overflow-wrap: anywhere; + color: var(--text-weak-base, var(--vscode-descriptionForeground)); + font-size: var(--kilo-font-size-11); + line-height: 1.35; + text-align: right; +} + +.agent-requirements-line[data-status="ready"] [data-slot="agent-requirements-line-detail"] { + color: var(--vscode-charts-green, #89d185); + font-weight: 600; +} + +.agent-requirements-line[data-status="missing"] [data-slot="agent-requirements-line-detail"] { + color: var(--vscode-charts-yellow, #e2c08d); +} + +.agent-requirements-line[data-status="error"] [data-slot="agent-requirements-line-detail"] { + color: var(--text-on-critical-base, var(--vscode-errorForeground)); +} + +[data-slot="agent-requirements-extension-note"] { + margin: 0; + color: var(--text-weak-base, var(--vscode-descriptionForeground)); + font-size: var(--kilo-font-size-11); + line-height: 1.4; +} + +.agent-requirements-actions { + display: flex; + justify-content: flex-end; + flex-wrap: wrap; + gap: 8px; +} + +@container chat (max-width: 320px) { + .agent-requirements { + align-items: flex-start; + padding: 12px 8px; + } + + [data-component="card"].agent-requirements-card { + gap: 16px; + padding: 12px; + } + + [data-slot="agent-requirements-options"] { + gap: 12px; + } + + .agent-requirements-line { + align-items: flex-start; + } + + [data-slot="agent-requirements-line-row"] { + flex-direction: column; + align-items: flex-start; + gap: 2px; + } + + [data-slot="agent-requirements-line-detail"] { + max-width: 100%; + text-align: left; + } + + .agent-requirements-actions { + flex-direction: column; + } +} diff --git a/packages/kilo-vscode/webview-ui/src/styles/chat.css b/packages/kilo-vscode/webview-ui/src/styles/chat.css index cfc2bd853dc..315a130e5e4 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/chat.css +++ b/packages/kilo-vscode/webview-ui/src/styles/chat.css @@ -12,6 +12,7 @@ @import "./session-actions.css"; @import "./welcome.css"; @import "./prompt-input.css"; +@import "./agent-requirements.css"; @import "./prompt-dropdowns.css"; @import "./model-selector.css"; @import "./permission-dock.css"; diff --git a/packages/kilo-vscode/webview-ui/src/styles/prompt-input.css b/packages/kilo-vscode/webview-ui/src/styles/prompt-input.css index 9866ca33191..77209132756 100644 --- a/packages/kilo-vscode/webview-ui/src/styles/prompt-input.css +++ b/packages/kilo-vscode/webview-ui/src/styles/prompt-input.css @@ -16,6 +16,18 @@ } } +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + .prompt-review-comments { margin: 6px 6px 0; border: 1px solid var(--vscode-panel-border); diff --git a/packages/kilo-vscode/webview-ui/src/types/marketplace.ts b/packages/kilo-vscode/webview-ui/src/types/marketplace.ts index a56afcfd226..f0a8fea7c90 100644 --- a/packages/kilo-vscode/webview-ui/src/types/marketplace.ts +++ b/packages/kilo-vscode/webview-ui/src/types/marketplace.ts @@ -41,6 +41,11 @@ export interface AgentContent { prompt: string options?: Record permission?: Record + requirements?: { + skills?: string[] + mcps?: string[] + vscode_extensions?: Array<{ name: string; id: string }> + } } export interface AgentMarketplaceItem extends MarketplaceItemBase { diff --git a/packages/kilo-vscode/webview-ui/src/types/messages/agents.ts b/packages/kilo-vscode/webview-ui/src/types/messages/agents.ts index 52322888e2d..4079413853d 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages/agents.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages/agents.ts @@ -28,6 +28,51 @@ export interface AgentInfo { permission?: PermissionRuleItem[] } +export interface AgentRequirementSkill { + name: string + status: "ready" | "missing" | "error" + message?: string +} + +export interface AgentRequirementMCP { + name: string + status: "ready" | "missing" | "error" + message?: string +} + +export interface AgentRequirementVSCodeExtension { + name: string + id: string + status: "ready" | "missing" | "error" + message?: string +} + +export interface AgentRequirementResult { + agent: string + directory: string + enabled: boolean + state: "disabled" | "ready" | "blocked" | "error" + skills: AgentRequirementSkill[] + mcps: AgentRequirementMCP[] + vscode_extensions: AgentRequirementVSCodeExtension[] + error?: { + code: + | "unknown_agent" + | "malformed_declaration" + | "discovery_failed" + | "mcp_status_failed" + | "scope_mismatch" + | "request_failed" + message: string + } +} + +export interface AgentRequirements { + skills?: string[] + mcps?: string[] + vscode_extensions?: Array<{ name: string; id: string }> +} + export interface AgentConfig { model?: string | null variant?: string | null @@ -39,5 +84,6 @@ export interface AgentConfig { temperature?: number | null top_p?: number | null steps?: number | null + requirements?: AgentRequirements permission?: PermissionConfig } diff --git a/packages/kilo-vscode/webview-ui/src/types/messages/config.ts b/packages/kilo-vscode/webview-ui/src/types/messages/config.ts index 311bbe32734..8ceed88a130 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages/config.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages/config.ts @@ -40,6 +40,7 @@ export interface WatcherConfig { export interface ExperimentalConfig { batch_tool?: boolean codebase_search?: boolean + agent_requirements?: boolean native_notebook_tools?: boolean speech_to_text_model?: string primary_tools?: string[] diff --git a/packages/kilo-vscode/webview-ui/src/types/messages/extension-messages.ts b/packages/kilo-vscode/webview-ui/src/types/messages/extension-messages.ts index 94795f2101b..5be8f3d9d28 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages/extension-messages.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages/extension-messages.ts @@ -17,7 +17,7 @@ import type { PermissionRequest } from "./permissions" import type { AnacondaDesktopExtensionMessage } from "../../../../src/shared/anaconda-desktop-messages" import type { QuestionRequest, SuggestionRequest, TodoItem } from "./questions" import type { ModelSelection, Provider, ProviderAuthState } from "./providers" -import type { AgentInfo, SkillInfo, SlashCommandInfo } from "./agents" +import type { AgentInfo, AgentRequirementResult, SkillInfo, SlashCommandInfo } from "./agents" import type { BrowserSettings, Config, FeatureFlags, IndexingStatus, KiloEmbeddingModelCatalog } from "./config" import type { WorkStyle, WorkStyleState } from "../../../../src/shared/work-style-presets" import type { KilocodeNotification, ProfileData } from "./profile" @@ -349,6 +349,15 @@ export interface SkillsLoadedMessage { skills: SkillInfo[] } +export interface AgentRequirementsLoadedMessage { + type: "agentRequirementsLoaded" + result: AgentRequirementResult +} + +export interface AgentRequirementsInvalidatedMessage { + type: "agentRequirementsInvalidated" +} + export interface CommandsLoadedMessage { type: "commandsLoaded" commands: SlashCommandInfo[] @@ -1044,6 +1053,8 @@ export type ExtensionMessage = | ProvidersLoadedMessage | AgentsLoadedMessage | SkillsLoadedMessage + | AgentRequirementsLoadedMessage + | AgentRequirementsInvalidatedMessage | CommandsLoadedMessage | AutocompleteSettingsLoadedMessage | ChatCompletionResultMessage diff --git a/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts b/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts index a0325f45cad..3ff71f7835e 100644 --- a/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts +++ b/packages/kilo-vscode/webview-ui/src/types/messages/webview-messages.ts @@ -211,6 +211,7 @@ export interface OpenConfigFileRequest { export interface OpenMarketplacePanelRequest { type: "openMarketplacePanel" + directory?: string } export interface OpenAgentManagerRequest { @@ -229,6 +230,14 @@ export interface RequestSkillsMessage { type: "requestSkills" } +export interface RequestAgentRequirementsMessage { + type: "requestAgentRequirements" + agent: string + directory: string + sessionID?: string + force?: boolean +} + export interface RequestCommandsMessage { type: "requestCommands" } @@ -1166,6 +1175,7 @@ export type WebviewMessage = | CompactRequest | RequestAgentsMessage | RequestSkillsMessage + | RequestAgentRequirementsMessage | RequestCommandsMessage | SendCommandRequest | RemoveSkillMessage diff --git a/packages/opencode/src/agent/agent.ts b/packages/opencode/src/agent/agent.ts index 261f5ca83e6..d7b1dd7e391 100644 --- a/packages/opencode/src/agent/agent.ts +++ b/packages/opencode/src/agent/agent.ts @@ -27,6 +27,10 @@ import * as KiloAgent from "@/kilocode/agent" // kilocode_change import { RuntimeFlags } from "@/effect/runtime-flags" import { Reference } from "@/reference/reference" // kilocode_change import { ConfigReference } from "@/config/reference" // kilocode_change +import * as AgentRequirements from "@/kilocode/agent-requirements" // kilocode_change +import { MCP } from "@/mcp" // kilocode_change + +export type RequirementBlockedError = InstanceType // kilocode_change export const Info = Schema.Struct({ name: Schema.String, @@ -49,6 +53,7 @@ export const Info = Schema.Struct({ variant: Schema.optional(Schema.String), prompt: Schema.optional(Schema.String), options: Schema.Record(Schema.String, Schema.Unknown), + requirements: Schema.optional(AgentRequirements.Requirements), // kilocode_change steps: Schema.optional(Schema.Finite), }).annotate({ identifier: "Agent" }) export type Info = DeepMutable> @@ -64,6 +69,8 @@ export interface Interface { readonly list: () => Effect.Effect readonly defaultInfo: () => Effect.Effect readonly defaultAgent: () => Effect.Effect + readonly requirementStatus: (agent: string) => Effect.Effect // kilocode_change + readonly guardRequirements: (agent: Info) => Effect.Effect // kilocode_change readonly generate: (input: { description: string model?: { providerID: ProviderID; modelID: ModelID } @@ -77,7 +84,7 @@ export interface Interface { > } -type State = Omit & { version: string } // kilocode_change +type State = Omit & { version: string } // kilocode_change export class Service extends Context.Service()("@opencode/Agent") {} @@ -90,6 +97,7 @@ export const layer = Layer.effect( const auth = yield* Auth.Service const plugin = yield* Plugin.Service const skill = yield* Skill.Service + const mcp = yield* MCP.Service // kilocode_change const provider = yield* Provider.Service const flags = yield* RuntimeFlags.Service @@ -326,6 +334,7 @@ export const layer = Layer.effect( item.hidden = value.hidden ?? item.hidden item.name = value.name ?? item.name item.steps = value.steps ?? item.steps + item.requirements = value.requirements ?? item.requirements // kilocode_change item.options = mergeDeep(item.options, value.options ?? {}) item.permission = Permission.merge(item.permission, Permission.fromConfig(value.permission ?? {})) KiloAgent.processConfigItem(item) // kilocode_change - populate displayName from options @@ -480,6 +489,32 @@ export const layer = Layer.effect( }) // kilocode_change end + // kilocode_change start - agent requirement status and guard hooks + const requirementStatus = Effect.fn("Agent.requirementStatus")(function* (name: string) { + const ctx = yield* InstanceState.context + return yield* AgentRequirements.status({ + name, + directory: ctx.directory, + config, + skills: skill, + mcp, + agents: { get: (agent) => current((s) => s.get(agent)) }, + }) + }) + + const guardRequirements = Effect.fn("Agent.guardRequirements")(function* (agent: Info) { + const ctx = yield* InstanceState.context + yield* AgentRequirements.guard({ + agent, + directory: ctx.directory, + config, + skills: skill, + mcp, + agents: { get: (name) => current((s) => s.get(name)) }, + }) + }) + // kilocode_change end + return Service.of({ get: Effect.fn("Agent.get")(function* (agent: string) { return yield* current((s) => s.get(agent)) // kilocode_change @@ -493,6 +528,8 @@ export const layer = Layer.effect( defaultAgent: Effect.fn("Agent.defaultAgent")(function* () { return yield* current((s) => s.defaultAgent()) // kilocode_change }), + requirementStatus, // kilocode_change + guardRequirements, // kilocode_change generate: Effect.fn("Agent.generate")(function* (input: { description: string model?: { providerID: ProviderID; modelID: ModelID } @@ -565,6 +602,7 @@ export const defaultLayer = layer.pipe( Layer.provide(Auth.defaultLayer), Layer.provide(Config.defaultLayer), Layer.provide(Skill.defaultLayer), + Layer.provide(MCP.defaultLayer), // kilocode_change Layer.provide(RuntimeFlags.defaultLayer), ) diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index 325e70a9cc8..1ca0c2c5f16 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -61,6 +61,7 @@ import { useArgs } from "@tui/context/args" // kilocode_change start import { KiloSessionTuiSync } from "@/kilocode/session/tui-sync" import { slashMatches } from "@/kilocode/cli/cmd/command-display" +import * as AgentRequirements from "@/kilocode/cli/agent-requirements" // kilocode_change end import { Flag } from "@opencode-ai/core/flag/flag" import { type WorkspaceStatus } from "../workspace-label" @@ -1087,6 +1088,29 @@ export function Prompt(props: PromptProps) { return false } + // kilocode_change start - gate TUI sends on declared agent requirements + const requirements = await AgentRequirements.check({ + client: sdk.client, + agent: agent.name, + directory: project.instance.directory() || sdk.directory || process.cwd(), + }).catch((error) => { + toast.show({ + message: errorMessage(error), + variant: "error", + }) + return undefined + }) + if (!requirements) return false + if (!requirements.ok) { + toast.show({ + title: "Agent requirements", + message: requirements.error.data.message, + variant: "error", + }) + return false + } + // kilocode_change end + const workspaceSession = props.sessionID ? sync.session.get(props.sessionID) : undefined const workspaceID = workspaceSession?.workspaceID const workspaceStatus = workspaceID ? (project.workspace.status(workspaceID) ?? "error") : undefined diff --git a/packages/opencode/src/config/agent.ts b/packages/opencode/src/config/agent.ts index 20ffa962333..b9ce1ba184b 100644 --- a/packages/opencode/src/config/agent.ts +++ b/packages/opencode/src/config/agent.ts @@ -17,6 +17,7 @@ import { Bus } from "@/bus" import { NamedError } from "@opencode-ai/core/util/error" import { KilocodeConfig } from "@/kilocode/config/config" import type { Warning } from "./config" +import { Requirements } from "@/kilocode/agent-requirements" // kilocode_change end const log = Log.create({ service: "config" }) @@ -61,6 +62,7 @@ const AgentSchema = Schema.StructWithRest( // kilocode_change end maxSteps: Schema.optional(PositiveInt).annotate({ description: "@deprecated Use 'steps' field instead." }), permission: Schema.optional(ConfigPermission.Info), + requirements: Schema.optional(Requirements), // kilocode_change }), [Schema.Record(Schema.String, Schema.Any)], ) @@ -82,6 +84,7 @@ const KNOWN_KEYS = new Set([ "permission", "disable", "tools", + "requirements", // kilocode_change ]) // Post-parse normalisation: diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index d760f0d4d90..1b07116cfe6 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -390,6 +390,9 @@ export const Info = Schema.Struct({ batch_tool: Schema.optional(Schema.Boolean).annotate({ description: "Enable the batch tool" }), // kilocode_change start codebase_search: Schema.optional(Schema.Boolean).annotate({ description: "Enable AI-powered codebase search" }), + agent_requirements: Schema.optional(Schema.Boolean).annotate({ + description: "Require declared agent skills, MCPs, and VS Code extensions before VS Code prompts can run", + }), native_notebook_tools: Schema.optional(Schema.Boolean).annotate({ description: "Enable native tools for reading, editing, and executing VS Code notebooks", }), diff --git a/packages/opencode/src/kilocode/agent-requirements.ts b/packages/opencode/src/kilocode/agent-requirements.ts new file mode 100644 index 00000000000..598495947eb --- /dev/null +++ b/packages/opencode/src/kilocode/agent-requirements.ts @@ -0,0 +1,305 @@ +import type { Agent } from "@/agent/agent" +import type { Config } from "@/config/config" +import type { MCP } from "@/mcp" +import type { Skill } from "@/skill" +import { Flag } from "@opencode-ai/core/flag/flag" +import { NamedError } from "@opencode-ai/core/util/error" +import { Cause, Effect, Exit, Schema } from "effect" + +const ID = Schema.String.check( + Schema.isMinLength(1), + Schema.isMaxLength(128), + Schema.isPattern(/^[A-Za-z0-9][A-Za-z0-9._-]*$/), +) +const Name = Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(128), Schema.isPattern(/\S/)) + +export const VSCodeExtension = Schema.Struct({ + name: Name, + id: ID, +}) +export type VSCodeExtension = Schema.Schema.Type + +const Group = Schema.mutable(Schema.Array(Name)).check(Schema.isMinLength(1), Schema.isMaxLength(20)) +const VSCodeExtensions = Schema.mutable(Schema.Array(VSCodeExtension)).check( + Schema.isMinLength(1), + Schema.isMaxLength(20), +) + +export const Requirements = Schema.Struct({ + skills: Schema.optional(Group), + mcps: Schema.optional(Group), + vscode_extensions: Schema.optional(VSCodeExtensions), +}).check( + Schema.makeFilter((input) => { + const issues: Schema.FilterIssue[] = [] + if (!input.skills && !input.mcps && !input.vscode_extensions) { + issues.push({ path: [], issue: "At least one requirement group is required" }) + } + + for (const group of ["skills", "mcps"] as const) { + const seen = new Set() + for (const [index, value] of (input[group] ?? []).entries()) { + if (seen.has(value)) issues.push({ path: [group, index], issue: `Duplicate ${group} requirement` }) + seen.add(value) + } + } + + const seen = new Set() + for (const [index, extension] of (input.vscode_extensions ?? []).entries()) { + if (seen.has(extension.id)) { + issues.push({ path: ["vscode_extensions", index, "id"], issue: "Duplicate vscode_extensions requirement" }) + } + seen.add(extension.id) + } + + return issues + }), +) +export type Requirements = Schema.Schema.Type + +export const SkillItem = Schema.Struct({ + name: Schema.String, + status: Schema.Literals(["ready", "missing", "error"]), + message: Schema.optional(Schema.String), +}) +export type SkillItem = Schema.Schema.Type + +export const MCPItem = Schema.Struct({ + name: Schema.String, + status: Schema.Literals(["ready", "missing", "error"]), + message: Schema.optional(Schema.String), +}) +export type MCPItem = Schema.Schema.Type + +export const Result = Schema.Struct({ + agent: Schema.String, + directory: Schema.String, + enabled: Schema.Boolean, + state: Schema.Literals(["disabled", "ready", "blocked", "error"]), + skills: Schema.Array(SkillItem), + mcps: Schema.Array(MCPItem), + vscode_extensions: Schema.Array(VSCodeExtension), + error: Schema.optional( + Schema.Struct({ + code: Schema.Literals(["unknown_agent", "malformed_declaration", "discovery_failed", "mcp_status_failed"]), + message: Schema.String, + }), + ), +}).annotate({ identifier: "AgentRequirementResult" }) +export type Result = Schema.Schema.Type + +export const BlockedError = NamedError.create("AgentRequirementError", { + message: Schema.String, + agent: Schema.String, + directory: Schema.String, + state: Schema.Literals(["blocked", "error"]), + skills: Schema.mutable(Schema.Array(SkillItem)), + mcps: Schema.mutable(Schema.Array(MCPItem)), + vscode_extensions: Schema.mutable(Schema.Array(VSCodeExtension)), +}) + +type AgentInfo = Pick & { requirements?: unknown } + +type Services = { + config: Pick + agents: { get: (agent: string) => Effect.Effect } + skills: Pick + mcp: Pick +} + +function enabled(cfg: Config.Info) { + const experimental = cfg.experimental + return experimental !== undefined && "agent_requirements" in experimental && experimental.agent_requirements === true +} + +function ready(input: { agent: string; directory: string; enabled: boolean }): Result { + return { + ...input, + state: input.enabled ? "ready" : "disabled", + skills: [], + mcps: [], + vscode_extensions: [], + } +} + +function malformed(agent: AgentInfo, directory: string, message: string): Result { + return { + agent: agent.name, + directory, + enabled: true, + state: "error", + skills: [], + mcps: [], + vscode_extensions: [], + error: { code: "malformed_declaration", message }, + } +} + +function decode(agent: AgentInfo, directory: string): Requirements | Result { + if (agent.requirements === undefined) return ready({ agent: agent.name, directory, enabled: true }) + + const decoded = Schema.decodeUnknownExit(Requirements)(agent.requirements, { + errors: "all", + propertyOrder: "original", + }) + if (Exit.isFailure(decoded)) return malformed(agent, directory, Cause.pretty(decoded.cause)) + return decoded.value +} + +function item(name: string, status: MCP.Status | undefined): MCPItem { + if (status?.status === "connected") return { name, status: "ready" } + if (status?.status === "failed" || status?.status === "needs_client_registration") { + return { name, status: "error", message: status.error } + } + return { name, status: "missing" } +} + +export function evaluate(input: { + agent: AgentInfo + directory: string + enabled: boolean + requirements: Requirements + discovered?: ReadonlySet + discoveryError?: string + mcp?: Readonly> + mcpError?: string +}): Result { + if (!input.enabled) return ready({ agent: input.agent.name, directory: input.directory, enabled: false }) + + const skills = (input.requirements.skills ?? []).map((skill) => ({ + name: skill, + status: input.discoveryError + ? ("error" as const) + : input.discovered?.has(skill) + ? ("ready" as const) + : ("missing" as const), + ...(input.discoveryError ? { message: input.discoveryError } : {}), + })) + const mcps = (input.requirements.mcps ?? []).map((name) => { + if (input.mcpError) return { name, status: "error" as const, message: input.mcpError } + return item(name, input.mcp?.[name]) + }) + + if (input.discoveryError) { + return { + agent: input.agent.name, + directory: input.directory, + enabled: true, + state: "error", + skills, + mcps, + vscode_extensions: input.requirements.vscode_extensions ?? [], + error: { code: "discovery_failed", message: input.discoveryError }, + } + } + + if (input.mcpError) { + return { + agent: input.agent.name, + directory: input.directory, + enabled: true, + state: "error", + skills, + mcps, + vscode_extensions: input.requirements.vscode_extensions ?? [], + error: { code: "mcp_status_failed", message: input.mcpError }, + } + } + + const valid = skills.every((skill) => skill.status === "ready") && mcps.every((mcp) => mcp.status === "ready") + return { + agent: input.agent.name, + directory: input.directory, + enabled: true, + state: valid ? "ready" : "blocked", + skills, + mcps, + vscode_extensions: input.requirements.vscode_extensions ?? [], + } +} + +export const status = Effect.fn("AgentRequirements.status")(function* ( + input: Services & { name: string; directory: string }, +) { + const cfg = yield* input.config.get() + const active = enabled(cfg) + if (!active) return ready({ agent: input.name, directory: input.directory, enabled: false }) + + const agent = yield* input.agents.get(input.name) + if (!agent) { + return { + agent: input.name, + directory: input.directory, + enabled: true, + state: "error", + skills: [], + mcps: [], + vscode_extensions: [], + error: { code: "unknown_agent", message: `Agent not found: ${input.name}` }, + } satisfies Result + } + + const requirements = decode(agent, input.directory) + if ("state" in requirements) return requirements + + const skillStatus: Effect.Effect = requirements.skills?.length ? input.skills.all() : Effect.succeed([]) + const mcpStatus: Effect.Effect> = requirements.mcps?.length + ? input.mcp.status() + : Effect.succeed({}) + const [discovered, mcp] = yield* Effect.all([skillStatus.pipe(Effect.exit), mcpStatus.pipe(Effect.exit)]) + const discoveredSet: ReadonlySet | undefined = Exit.isSuccess(discovered) + ? new Set(discovered.value.map((skill) => skill.name)) + : undefined + + if (Exit.isFailure(discovered)) { + return evaluate({ + agent, + directory: input.directory, + enabled: active, + requirements, + discoveryError: Cause.pretty(discovered.cause), + mcp: Exit.isSuccess(mcp) ? mcp.value : undefined, + }) + } + + if (Exit.isFailure(mcp)) { + return evaluate({ + agent, + directory: input.directory, + enabled: active, + requirements, + discovered: discoveredSet, + mcpError: Cause.pretty(mcp.cause), + }) + } + + return evaluate({ + agent, + directory: input.directory, + enabled: active, + requirements, + discovered: discoveredSet, + mcp: mcp.value, + }) +}) + +export const guard = Effect.fn("AgentRequirements.guard")(function* ( + input: Services & { agent: AgentInfo; directory: string }, +) { + const result = yield* status({ ...input, name: input.agent.name }) + const unsupported = Flag.KILO_CLIENT !== "vscode" && result.vscode_extensions.length > 0 + if (result.state === "disabled" || (result.state === "ready" && !unsupported)) return + const state = result.state === "error" ? result.state : "blocked" + + return yield* Effect.fail( + new BlockedError({ + message: "Complete the required checks to use this agent first", + agent: result.agent, + directory: result.directory, + state, + skills: [...result.skills], + mcps: [...result.mcps], + vscode_extensions: [...result.vscode_extensions], + }), + ) +}) diff --git a/packages/opencode/src/kilocode/cli/agent-requirements.ts b/packages/opencode/src/kilocode/cli/agent-requirements.ts new file mode 100644 index 00000000000..9f7aafce198 --- /dev/null +++ b/packages/opencode/src/kilocode/cli/agent-requirements.ts @@ -0,0 +1,116 @@ +import type { AgentRequirementResult } from "@kilocode/sdk/v2" +import { isRecord } from "@/util/record" + +type Item = AgentRequirementResult["skills"][number] | AgentRequirementResult["mcps"][number] + +export type Client = { + kilocode: { + agentRequirements: ( + parameters: { agent: string; directory: string }, + options: { throwOnError: true }, + ) => Promise<{ data: AgentRequirementResult }> + } +} + +export type ErrorData = { + message: string + agent: string + directory: string + state: "blocked" | "error" + skills: AgentRequirementResult["skills"] + mcps: AgentRequirementResult["mcps"] + vscode_extensions: AgentRequirementResult["vscode_extensions"] +} + +export type RequirementError = { + name: "AgentRequirementError" + data: ErrorData +} + +export type Check = + | { ok: true; result: AgentRequirementResult } + | { ok: false; result: AgentRequirementResult; error: RequirementError } + +export async function check(input: { client: Client; agent: string; directory: string }): Promise { + const response = await input.client.kilocode.agentRequirements( + { agent: input.agent, directory: input.directory }, + { throwOnError: true }, + ) + if (!blocked(response.data)) return { ok: true, result: response.data } + return { ok: false, result: response.data, error: toError(response.data) } +} + +export function blocked(result: AgentRequirementResult) { + if (!result.enabled || result.state === "disabled") return false + if (result.vscode_extensions.length > 0) return true + return result.state === "blocked" || result.state === "error" +} + +export function toError(result: AgentRequirementResult): RequirementError { + const info = { + message: result.error?.message ?? "Complete the required checks to use this agent first", + agent: result.agent, + directory: result.directory, + state: result.state === "error" ? ("error" as const) : ("blocked" as const), + skills: result.skills, + mcps: result.mcps, + vscode_extensions: result.vscode_extensions, + } + + return { + name: "AgentRequirementError", + data: { + ...info, + message: format(info), + }, + } +} + +export function data(input: unknown): ErrorData | undefined { + if (!isRecord(input)) return undefined + if (input.name !== "AgentRequirementError" || !isRecord(input.data)) return undefined + + const info = input.data + if (typeof info.message !== "string") return undefined + if (typeof info.agent !== "string") return undefined + if (typeof info.directory !== "string") return undefined + if (info.state !== "blocked" && info.state !== "error") return undefined + if (!Array.isArray(info.skills)) return undefined + if (!Array.isArray(info.mcps)) return undefined + if (!Array.isArray(info.vscode_extensions)) return undefined + + return info as ErrorData +} + +export function format(input: ErrorData | RequirementError) { + const info = "data" in input ? input.data : input + const skills = pending(info.skills) + const mcps = pending(info.mcps) + const lines = [`Agent requirements are not met for "${info.agent}".`] + + if (info.vscode_extensions.length) { + lines.push( + "", + "VS Code extensions:", + ...info.vscode_extensions.map((ext) => `- ${ext.name} (${ext.id})`), + "This agent requires VS Code extensions and is not supported in this CLI environment. Use the Kilo VS Code extension instead.", + ) + } + + if (skills.length) lines.push("", "Skills:", ...skills.map((skill) => `- ${item(skill)}`)) + if (mcps.length) lines.push("", "MCP servers:", ...mcps.map((mcp) => `- ${item(mcp)}`)) + + if (skills.length || mcps.length) { + lines.push("", "Install the required skills and configure or connect the required MCP servers, then retry.") + } + return lines.join("\n") +} + +function pending(items: T[]) { + return items.filter((item) => item.status !== "ready") +} + +function item(input: Item) { + const status = input.status === "missing" ? "missing" : "error" + return input.message ? `${input.name} (${status}: ${input.message})` : `${input.name} (${status})` +} diff --git a/packages/opencode/src/kilocode/server/httpapi/groups/kilocode.ts b/packages/opencode/src/kilocode/server/httpapi/groups/kilocode.ts index 070f80e709f..4b2881ce172 100644 --- a/packages/opencode/src/kilocode/server/httpapi/groups/kilocode.ts +++ b/packages/opencode/src/kilocode/server/httpapi/groups/kilocode.ts @@ -5,9 +5,11 @@ import { InstanceContextMiddleware } from "@/server/routes/instance/httpapi/midd import { WorkspaceRoutingMiddleware, WorkspaceRoutingQuery, + WorkspaceRoutingQueryFields, } from "@/server/routes/instance/httpapi/middleware/workspace-routing" import { described } from "@/server/routes/instance/httpapi/groups/metadata" import { AnacondaDesktopApi } from "./anaconda-desktop" +import { Result as AgentRequirementResult } from "@/kilocode/agent-requirements" import { Failure as NotebookFailure, Request as NotebookRequest, @@ -27,11 +29,16 @@ export const RemoveAgentPayload = Schema.Struct({ name: Schema.String, }) +export const AgentRequirementQuery = Schema.Struct({ + ...WorkspaceRoutingQueryFields, + agent: Schema.String, +}) export const NotebookReplyPayload = Schema.Struct({ result: NotebookResult }) export const NotebookRejectPayload = Schema.Struct({ error: NotebookFailure }) export const KilocodePaths = { heapSnapshot: `${root}/heap/snapshot`, + agentRequirements: `${root}/agent/requirements`, removeSkill: `${root}/skill/remove`, removeAgent: `${root}/agent/remove`, notebookList: `${root}/notebook`, @@ -55,6 +62,16 @@ export const KilocodeApi = HttpApi.make("kilocode") description: "Write a heap snapshot for the CLI process to the log directory.", }), ), + HttpApiEndpoint.get("agentRequirements", KilocodePaths.agentRequirements, { + query: AgentRequirementQuery, + success: described(AgentRequirementResult, "Agent requirement status"), + }).annotateMerge( + OpenApi.annotations({ + identifier: "kilocode.agentRequirements", + summary: "Check agent requirements", + description: "Check whether the selected agent's requirements are available in the request directory.", + }), + ), HttpApiEndpoint.post("removeSkill", KilocodePaths.removeSkill, { query: WorkspaceRoutingQuery, payload: RemoveSkillPayload, diff --git a/packages/opencode/src/kilocode/server/httpapi/handlers/kilocode.ts b/packages/opencode/src/kilocode/server/httpapi/handlers/kilocode.ts index d105775b068..45b7fd56a36 100644 --- a/packages/opencode/src/kilocode/server/httpapi/handlers/kilocode.ts +++ b/packages/opencode/src/kilocode/server/httpapi/handlers/kilocode.ts @@ -28,6 +28,12 @@ export const kilocodeHandlers = HttpApiBuilder.group(InstanceHttpApi, "kilocode" return yield* Effect.sync(() => HeapSnapshot.write()) }) + const agentRequirements = Effect.fn("KilocodeHttpApi.agentRequirements")(function* (ctx: { + query: { agent: string } + }) { + return yield* agents.requirementStatus(ctx.query.agent) + }) + const removeSkill = Effect.fn("KilocodeHttpApi.removeSkill")(function* (ctx: { payload: typeof RemoveSkillPayload.Type }) { @@ -89,6 +95,7 @@ export const kilocodeHandlers = HttpApiBuilder.group(InstanceHttpApi, "kilocode" return handlers .handle("heapSnapshot", heapSnapshot) + .handle("agentRequirements", agentRequirements) .handle("removeSkill", removeSkill) .handle("removeAgent", removeAgent) .handle("notebookList", notebookList) diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts index f5735c5a3b9..042bd3737bb 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts @@ -1,5 +1,6 @@ import { Image } from "@/image/image" // kilocode_change - classify user image validation defects import { KiloSessionHttpApi } from "@/kilocode/server/httpapi/session-fork" // kilocode_change +import { BlockedError as AgentRequirementError } from "@/kilocode/agent-requirements" // kilocode_change import { Agent } from "@/agent/agent" import { Bus } from "@/bus" import { Command } from "@/command" @@ -320,9 +321,12 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", yield* Effect.logError("prompt_async failed").pipe( Effect.annotateLogs({ sessionID: ctx.params.sessionID, cause }), ) + const error = Cause.squash(cause) yield* bus.publish(Session.Event.Error, { sessionID: ctx.params.sessionID, - error: new NamedError.Unknown({ message: Cause.pretty(cause) }).toObject(), + error: AgentRequirementError.isInstance(error) + ? error.toObject() + : new NamedError.Unknown({ message: Cause.pretty(cause) }).toObject(), }) }), ), diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 9572ce42abe..ab2d5ab8a91 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -109,10 +109,18 @@ function isOrphanedInterruptedTool(part: MessageV2.ToolPart) { export interface Interface { readonly cancel: (sessionID: SessionID) => Effect.Effect - readonly prompt: (input: PromptInput) => Effect.Effect + // kilocode_change start - prompt can fail on unmet agent requirements + readonly prompt: ( + input: PromptInput, + ) => Effect.Effect + // kilocode_change end readonly loop: (input: LoopInput) => Effect.Effect readonly shell: (input: ShellInput) => Effect.Effect - readonly command: (input: CommandInput) => Effect.Effect + // kilocode_change start - commands can fail on unmet agent requirements + readonly command: ( + input: CommandInput, + ) => Effect.Effect + // kilocode_change end readonly resolvePromptParts: (template: string) => Effect.Effect } @@ -749,14 +757,15 @@ export const layer = Layer.effect( const createUserMessage = Effect.fn("SessionPrompt.createUserMessage")(function* (input: PromptInput) { const agentName = input.agent - const ag = agentName ? yield* agents.get(agentName) : yield* agents.defaultInfo() + const ag = agentName ? yield* agents.get(agentName) : yield* agents.defaultInfo() // kilocode_change if (!ag) { - const available = (yield* agents.list()).filter((a) => !a.hidden).map((a) => a.name) - const hint = available.length ? ` Available agents: ${available.join(", ")}` : "" - const error = new NamedError.Unknown({ message: `Agent not found: "${agentName}".${hint}` }) - yield* bus.publish(Session.Event.Error, { sessionID: input.sessionID, error: error.toObject() }) - throw error + const available = (yield* agents.list()).filter((a) => !a.hidden).map((a) => a.name) // kilocode_change + const hint = available.length ? ` Available agents: ${available.join(", ")}` : "" // kilocode_change + const error = new NamedError.Unknown({ message: `Agent not found: "${agentName}".${hint}` }) // kilocode_change + yield* bus.publish(Session.Event.Error, { sessionID: input.sessionID, error: error.toObject() }) // kilocode_change + throw error // kilocode_change } + yield* agents.guardRequirements(ag) // kilocode_change - enforce requirements before creating a turn const current = Database.use((db) => db @@ -1877,14 +1886,15 @@ export const layer = Layer.effect( yield* getModel(taskModel.providerID, taskModel.modelID, input.sessionID) - const agent = agentName ? yield* agents.get(agentName) : yield* agents.defaultInfo() + const agent = agentName ? yield* agents.get(agentName) : yield* agents.defaultInfo() // kilocode_change if (!agent) { - const available = (yield* agents.list()).filter((a) => !a.hidden).map((a) => a.name) - const hint = available.length ? ` Available agents: ${available.join(", ")}` : "" - const error = new NamedError.Unknown({ message: `Agent not found: "${agentName}".${hint}` }) - yield* bus.publish(Session.Event.Error, { sessionID: input.sessionID, error: error.toObject() }) - throw error + const available = (yield* agents.list()).filter((a) => !a.hidden).map((a) => a.name) // kilocode_change + const hint = available.length ? ` Available agents: ${available.join(", ")}` : "" // kilocode_change + const error = new NamedError.Unknown({ message: `Agent not found: "${agentName}".${hint}` }) // kilocode_change + yield* bus.publish(Session.Event.Error, { sessionID: input.sessionID, error: error.toObject() }) // kilocode_change + throw error // kilocode_change } + yield* agents.guardRequirements(agent) // kilocode_change - command agent overrides must satisfy requirements const templateParts = yield* resolvePromptParts(template) KiloSessionProcessor.markReviewTelemetry(templateParts, input.command) // kilocode_change - mark review commands for completion telemetry diff --git a/packages/opencode/src/session/session.ts b/packages/opencode/src/session/session.ts index 1466d156553..815575ba39d 100644 --- a/packages/opencode/src/session/session.ts +++ b/packages/opencode/src/session/session.ts @@ -35,6 +35,7 @@ import { KiloSession, kiloSessionFork } from "@/kilocode/session" import { SessionExport } from "@/kilocode/session-export" import * as SandboxPolicy from "@/kilocode/sandbox/policy" import { baseKey, cumulativeSessionDiff } from "@/kilocode/session-portability/cumulative-diff" // kilocode_change +import { BlockedError as AgentRequirementError } from "@/kilocode/agent-requirements" // kilocode_change end import { Effect, Layer, Option, Context, Schema, Types } from "effect" import { NonNegativeInt, optionalOmitUndefined } from "@opencode-ai/core/schema" @@ -375,7 +376,9 @@ export const Event = { sessionID: Schema.optional(SessionID), // Reuses MessageV2.Assistant.fields.error (already Schema.optional) so // the derived zod keeps the same discriminated-union shape on the bus. - error: MessageV2.Assistant.fields.error, + // kilocode_change start - carry pre-message requirement failures over session.error + error: Schema.optional(Schema.Union([MessageV2.Assistant.fields.error, AgentRequirementError.EffectSchema])), + // kilocode_change end }), ), // kilocode_change start diff --git a/packages/opencode/test/agent/agent.test.ts b/packages/opencode/test/agent/agent.test.ts index 8253471efb4..6ffedd7e0a9 100644 --- a/packages/opencode/test/agent/agent.test.ts +++ b/packages/opencode/test/agent/agent.test.ts @@ -13,6 +13,7 @@ import { Plugin } from "../../src/plugin" import { Provider } from "../../src/provider/provider" import { Skill } from "../../src/skill" import { Truncate } from "../../src/tool/truncate" +import { MCP } from "../../src/mcp" // kilocode_change const agentLayer = (flags: Partial = {}) => Agent.layer.pipe( @@ -21,6 +22,7 @@ const agentLayer = (flags: Partial = {}) => Layer.provide(Auth.defaultLayer), Layer.provide(Config.defaultLayer), Layer.provide(Skill.defaultLayer), + Layer.provide(Layer.mock(MCP.Service)({})), // kilocode_change Layer.provide(RuntimeFlags.layer(flags)), ) diff --git a/packages/opencode/test/agent/plugin-agent-regression.test.ts b/packages/opencode/test/agent/plugin-agent-regression.test.ts index 5871b9dc246..ad32c52fd80 100644 --- a/packages/opencode/test/agent/plugin-agent-regression.test.ts +++ b/packages/opencode/test/agent/plugin-agent-regression.test.ts @@ -10,6 +10,7 @@ import { Config } from "../../src/config/config" import { Env } from "../../src/env" import { Git } from "../../src/git" // kilocode_change import { RuntimeFlags } from "../../src/effect/runtime-flags" +import { MCP } from "../../src/mcp" // kilocode_change import { Plugin } from "../../src/plugin" import { AccountTest } from "../fake/account" import { AuthTest } from "../fake/auth" @@ -43,6 +44,7 @@ const dependencies = Layer.mergeAll(configLayer, pluginLayer).pipe(Layer.provide const agentLayer = Agent.layer.pipe( Layer.provide(AuthTest.empty), Layer.provide(SkillTest.empty), + Layer.provide(Layer.mock(MCP.Service)({})), // kilocode_change Layer.provide(provider.layer), Layer.provide(RuntimeFlags.layer({ disableDefaultPlugins: true })), ) diff --git a/packages/opencode/test/kilocode/agent-requirements-cli.test.ts b/packages/opencode/test/kilocode/agent-requirements-cli.test.ts new file mode 100644 index 00000000000..533269e5f3d --- /dev/null +++ b/packages/opencode/test/kilocode/agent-requirements-cli.test.ts @@ -0,0 +1,176 @@ +import { describe, expect, test } from "bun:test" +import type { AgentRequirementResult } from "@kilocode/sdk/v2" +import { formatError as formatStreamError } from "@/cli/cmd/run/session-data" +import * as Requirements from "@/kilocode/cli/agent-requirements" + +const dir = "/tmp/agent-requirements-cli" + +function result(input: Partial = {}): AgentRequirementResult { + return { + agent: "demo", + directory: dir, + enabled: true, + state: "ready", + skills: [], + mcps: [], + vscode_extensions: [], + ...input, + } +} + +function client(value: AgentRequirementResult): Requirements.Client { + return { + kilocode: { + agentRequirements: async (parameters, options) => { + expect(parameters).toEqual({ agent: value.agent, directory: value.directory }) + expect(options).toEqual({ throwOnError: true }) + return { data: value } + }, + }, + } +} + +async function check(value: AgentRequirementResult) { + return Requirements.check({ client: client(value), agent: value.agent, directory: value.directory }) +} + +describe("CLI agent requirements", () => { + test("allows disabled requirements", async () => { + const output = await check(result({ enabled: false, state: "disabled" })) + + expect(output.ok).toBe(true) + }) + + test("allows ready requirements", async () => { + const output = await check( + result({ + skills: [{ name: "ready-skill", status: "ready" }], + mcps: [{ name: "ready-mcp", status: "ready" }], + }), + ) + + expect(output.ok).toBe(true) + }) + + test("blocks missing skills", async () => { + const output = await check( + result({ + state: "blocked", + skills: [ + { name: "ready-skill", status: "ready" }, + { name: "missing-skill", status: "missing" }, + ], + }), + ) + + expect(output.ok).toBe(false) + if (output.ok) return + expect(output.error).toMatchObject({ + name: "AgentRequirementError", + data: { agent: "demo", state: "blocked" }, + }) + expect(output.error.data.skills).toContainEqual({ name: "missing-skill", status: "missing" }) + }) + + test("blocks missing and error MCPs", async () => { + const output = await check( + result({ + state: "blocked", + mcps: [ + { name: "missing-mcp", status: "missing" }, + { name: "error-mcp", status: "error", message: "server crashed" }, + ], + }), + ) + + expect(output.ok).toBe(false) + if (output.ok) return + expect(output.error.data.mcps).toEqual([ + { name: "missing-mcp", status: "missing" }, + { name: "error-mcp", status: "error", message: "server crashed" }, + ]) + }) + + test("blocks VS Code extension declarations", async () => { + const output = await check( + result({ + vscode_extensions: [{ name: "Sample Extension", id: "publisher.extension" }], + }), + ) + + expect(output.ok).toBe(false) + if (output.ok) return + expect(output.error.data.state).toBe("blocked") + expect(output.error.data.vscode_extensions).toEqual([{ name: "Sample Extension", id: "publisher.extension" }]) + const text = Requirements.format(output.error) + expect(text).toContain("Use the Kilo VS Code extension instead") + expect(text).not.toContain("Install the required skills and configure or connect the required MCP servers") + }) + + test("formats grouped actionable guidance", () => { + const text = Requirements.format( + Requirements.toError( + result({ + state: "error", + error: { code: "discovery_failed", message: "skill scan failed" }, + skills: [ + { name: "ready-skill", status: "ready" }, + { name: "missing-skill", status: "missing" }, + { name: "error-skill", status: "error", message: "skill scan failed" }, + ], + mcps: [ + { name: "missing-mcp", status: "missing" }, + { name: "error-mcp", status: "error", message: "auth failed" }, + ], + vscode_extensions: [{ name: "Sample Extension", id: "publisher.extension" }], + }), + ), + ) + + expect(text).toContain('Agent requirements are not met for "demo".') + expect(text).toContain("VS Code extensions:") + expect(text).toContain("Sample Extension (publisher.extension)") + expect(text).toContain("Skills:") + expect(text).toContain("missing-skill (missing)") + expect(text).toContain("error-skill (error: skill scan failed)") + expect(text).not.toContain("ready-skill (ready)") + expect(text).toContain("MCP servers:") + expect(text).toContain("missing-mcp (missing)") + expect(text).toContain("error-mcp (error: auth failed)") + expect(text).toContain("Install the required skills and configure or connect the required MCP servers, then retry.") + }) + + test("recognizes AgentRequirementError objects", () => { + const error = Requirements.toError(result({ state: "blocked" })) + + expect(Requirements.data(error)).toEqual(error.data) + expect(Requirements.data({ name: "OtherError", data: error.data })).toBeUndefined() + }) + + test("stores grouped guidance on AgentRequirementError message", () => { + const error = Requirements.toError( + result({ + state: "blocked", + skills: [{ name: "missing-skill", status: "missing" }], + }), + ) + const text = Requirements.format(error) + + expect(text).toContain('Agent requirements are not met for "demo".') + expect(text).toContain("Skills:") + expect(text).toContain("missing-skill (missing)") + expect(error.data.message).toBe(text) + }) + + test("formats AgentRequirementError in interactive session errors", () => { + const error = Requirements.toError( + result({ + state: "blocked", + mcps: [{ name: "missing-mcp", status: "missing" }], + }), + ) + const text = Requirements.format(error) + + expect(formatStreamError(error)).toBe(text) + }) +}) diff --git a/packages/opencode/test/kilocode/agent-requirements.test.ts b/packages/opencode/test/kilocode/agent-requirements.test.ts new file mode 100644 index 00000000000..884b2af9e1e --- /dev/null +++ b/packages/opencode/test/kilocode/agent-requirements.test.ts @@ -0,0 +1,307 @@ +import { describe, expect, test } from "bun:test" +import { Cause, Effect, Exit } from "effect" +import { ConfigAgent } from "@/config/agent" +import { ConfigParse } from "@/config/parse" +import * as AgentRequirements from "@/kilocode/agent-requirements" +import type { MCP } from "@/mcp" +import type { Skill } from "@/skill" + +type Agent = { + name: string + requirements?: unknown +} + +type Input = { + active?: boolean + agents?: Record + skills?: string[] + skillError?: string + mcp?: Record + mcpError?: string +} + +const dir = "/tmp/agent-requirements" + +function services(input: Input = {}) { + return { + config: { + get: () => Effect.succeed({ experimental: input.active ? { agent_requirements: true } : {} }), + }, + agents: { + get: (name: string) => Effect.succeed(input.agents?.[name]), + }, + skills: { + all: () => { + if (input.skillError) return Effect.die(new Error(input.skillError)) + const skills = (input.skills ?? []).map( + (name) => ({ name, location: "test", content: "" }) satisfies Skill.Info, + ) + return Effect.succeed(skills) + }, + }, + mcp: { + status: () => { + if (input.mcpError) return Effect.die(new Error(input.mcpError)) + return Effect.succeed(input.mcp ?? {}) + }, + }, + } +} + +function status(name: string, input: Input) { + return Effect.runPromise(AgentRequirements.status({ ...services(input), name, directory: dir })) +} + +async function client(value: string | undefined, run: () => Promise) { + const prev = process.env.KILO_CLIENT + try { + if (value === undefined) delete process.env.KILO_CLIENT + if (value !== undefined) process.env.KILO_CLIENT = value + await run() + } finally { + if (prev === undefined) delete process.env.KILO_CLIENT + if (prev !== undefined) process.env.KILO_CLIENT = prev + } +} + +describe("agent requirements", () => { + test("returns disabled when the experimental flag is absent", async () => { + const result = await status("missing", {}) + + expect(result).toMatchObject({ + agent: "missing", + directory: dir, + enabled: false, + state: "disabled", + skills: [], + mcps: [], + vscode_extensions: [], + }) + }) + + test("returns ready for agents without requirements", async () => { + const result = await status("demo", { active: true, agents: { demo: { name: "demo" } } }) + + expect(result).toMatchObject({ agent: "demo", directory: dir, enabled: true, state: "ready" }) + }) + + test("reports unknown agents while requirements are enabled", async () => { + const result = await status("missing", { active: true }) + + expect(result.state).toBe("error") + expect(result.error?.code).toBe("unknown_agent") + }) + + test("reports discovered and missing skills", async () => { + const result = await status("demo", { + active: true, + agents: { demo: { name: "demo", requirements: { skills: ["ready", "absent"] } } }, + skills: ["ready"], + }) + + expect(result.state).toBe("blocked") + expect(result.skills).toEqual([ + { name: "ready", status: "ready" }, + { name: "absent", status: "missing" }, + ]) + }) + + test("accepts non-empty marketplace skill and MCP IDs", async () => { + const result = await status("demo", { + active: true, + agents: { + demo: { + name: "demo", + requirements: { skills: ["skill with space"], mcps: ["mcp/with/slash"] }, + }, + }, + skills: ["skill with space"], + mcp: { "mcp/with/slash": { status: "connected" } }, + }) + + expect(result.state).toBe("ready") + expect(result.skills).toEqual([{ name: "skill with space", status: "ready" }]) + expect(result.mcps).toEqual([{ name: "mcp/with/slash", status: "ready" }]) + }) + + test("reports skill discovery failures as errors", async () => { + const result = await status("demo", { + active: true, + agents: { demo: { name: "demo", requirements: { skills: ["needed"] } } }, + skillError: "skill scan failed", + }) + + expect(result.state).toBe("error") + expect(result.error?.code).toBe("discovery_failed") + expect(result.skills[0]?.status).toBe("error") + expect(result.skills[0]?.message).toContain("skill scan failed") + }) + + test("reports malformed and duplicate declarations", async () => { + const empty = await status("empty", { + active: true, + agents: { empty: { name: "empty", requirements: {} } }, + }) + const duplicate = await status("duplicate", { + active: true, + agents: { duplicate: { name: "duplicate", requirements: { skills: ["one", "one"] } } }, + }) + const legacy = await status("legacy", { + active: true, + agents: { legacy: { name: "legacy", requirements: { vscode_extensions: ["publisher.extension"] } } }, + }) + + expect(empty.error?.code).toBe("malformed_declaration") + expect(duplicate.error?.code).toBe("malformed_declaration") + expect(legacy.error?.code).toBe("malformed_declaration") + }) + + test("validates VS Code extension objects", async () => { + const valid = await status("valid", { + active: true, + agents: { + valid: { + name: "valid", + requirements: { vscode_extensions: [{ name: "Sample Extension", id: "publisher.extension" }] }, + }, + }, + }) + const invalid = await status("invalid", { + active: true, + agents: { + invalid: { + name: "invalid", + requirements: { vscode_extensions: [{ name: " ", id: "publisher.extension" }] }, + }, + }, + }) + + expect(valid).toMatchObject({ + state: "ready", + vscode_extensions: [{ name: "Sample Extension", id: "publisher.extension" }], + }) + expect(invalid.state).toBe("error") + expect(invalid.error?.code).toBe("malformed_declaration") + }) + + test("reports MCP connected, missing, and error states", async () => { + const result = await status("demo", { + active: true, + agents: { + demo: { + name: "demo", + requirements: { mcps: ["connected", "disabled", "failed", "registration"] }, + }, + }, + mcp: { + connected: { status: "connected" }, + disabled: { status: "disabled" }, + failed: { status: "failed", error: "server crashed" }, + registration: { status: "needs_client_registration", error: "OAuth required" }, + }, + }) + + expect(result.state).toBe("blocked") + expect(result.mcps).toEqual([ + { name: "connected", status: "ready" }, + { name: "disabled", status: "missing" }, + { name: "failed", status: "error", message: "server crashed" }, + { name: "registration", status: "error", message: "OAuth required" }, + ]) + }) + + test("reports MCP status service failures", async () => { + const result = await status("demo", { + active: true, + agents: { demo: { name: "demo", requirements: { mcps: ["needed"] } } }, + mcpError: "status unavailable", + }) + + expect(result.state).toBe("error") + expect(result.error?.code).toBe("mcp_status_failed") + expect(result.mcps[0]?.status).toBe("error") + expect(result.mcps[0]?.message).toContain("status unavailable") + }) + + test("guards unmet requirements for all clients", async () => { + const missing = { + active: true, + agents: { demo: { name: "demo", requirements: { skills: ["missing"] } } }, + } + + await client("cli", async () => { + const exit = await Effect.runPromiseExit( + AgentRequirements.guard({ ...services(missing), agent: missing.agents.demo, directory: dir }), + ) + expect(Exit.isFailure(exit)).toBe(true) + if (Exit.isSuccess(exit)) return + const error = Cause.squash(exit.cause) + expect(AgentRequirements.BlockedError.isInstance(error)).toBe(true) + }) + + await client("vscode", async () => { + const exit = await Effect.runPromiseExit( + AgentRequirements.guard({ ...services(missing), agent: missing.agents.demo, directory: dir }), + ) + expect(Exit.isFailure(exit)).toBe(true) + if (Exit.isSuccess(exit)) return + const error = Cause.squash(exit.cause) + expect(AgentRequirements.BlockedError.isInstance(error)).toBe(true) + }) + }) + + test("blocks VS Code extension requirements outside VS Code", async () => { + const input = { + active: true, + agents: { + demo: { + name: "demo", + requirements: { vscode_extensions: [{ name: "Jupyter", id: "ms-toolsai.jupyter" }] }, + }, + }, + } + + await client("cli", async () => { + const exit = await Effect.runPromiseExit( + AgentRequirements.guard({ ...services(input), agent: input.agents.demo, directory: dir }), + ) + expect(Exit.isFailure(exit)).toBe(true) + if (Exit.isSuccess(exit)) return + const error = Cause.squash(exit.cause) + expect(AgentRequirements.BlockedError.isInstance(error)).toBe(true) + }) + + await client("vscode", async () => { + await Effect.runPromise(AgentRequirements.guard({ ...services(input), agent: input.agents.demo, directory: dir })) + }) + }) + + test("allows non-VS Code clients when requirements are ready", async () => { + const input = { + active: true, + agents: { demo: { name: "demo", requirements: { skills: ["ready"], mcps: ["connected"] } } }, + skills: ["ready"], + mcp: { connected: { status: "connected" as const } }, + } + + await client("cli", async () => { + await Effect.runPromise(AgentRequirements.guard({ ...services(input), agent: input.agents.demo, directory: dir })) + }) + }) + + test("keeps requirements out of agent options", () => { + const agent = ConfigParse.schema( + ConfigAgent.Info, + { + name: "demo", + requirements: { skills: ["needed"] }, + custom: true, + }, + "agent/demo.md", + ) + + expect(agent.requirements).toEqual({ skills: ["needed"] }) + expect(agent.options).toEqual({ custom: true }) + expect(agent.options).not.toHaveProperty("requirements") + }) +}) diff --git a/packages/opencode/test/kilocode/server/httpapi-exercise-scenarios.ts b/packages/opencode/test/kilocode/server/httpapi-exercise-scenarios.ts index 35ea6faf154..0f631b66c2c 100644 --- a/packages/opencode/test/kilocode/server/httpapi-exercise-scenarios.ts +++ b/packages/opencode/test/kilocode/server/httpapi-exercise-scenarios.ts @@ -283,6 +283,19 @@ export const kiloScenarios: Scenario[] = [ yield* Effect.promise(() => rm(body, { force: true })) }), ), + http.protected + .get("/kilocode/agent/requirements", "kilocode.agentRequirements") + .at((ctx) => ({ path: "/kilocode/agent/requirements?agent=httpapi-agent", headers: ctx.headers() })) + .json(200, (body, ctx) => { + object(body) + check(body.agent === "httpapi-agent", "agent requirements should echo the requested agent") + check(body.directory === ctx.directory, "agent requirements should use the routed workspace directory") + check(body.enabled === false, "agent requirements should report disabled when the experiment is off") + check(body.state === "disabled", "agent requirements should return the disabled state") + array(body.skills) + array(body.mcps) + array(body.vscode_extensions) + }), http.protected .post("/kilocode/skill/remove", "kilocode.removeSkill") .mutating() diff --git a/packages/sdk/js/src/v2/gen/sdk.gen.ts b/packages/sdk/js/src/v2/gen/sdk.gen.ts index 96cb8fa793d..f209d5ed960 100644 --- a/packages/sdk/js/src/v2/gen/sdk.gen.ts +++ b/packages/sdk/js/src/v2/gen/sdk.gen.ts @@ -146,6 +146,8 @@ import type { KiloCloudSessionImportResponses, KiloCloudSessionsErrors, KiloCloudSessionsResponses, + KilocodeAgentRequirementsErrors, + KilocodeAgentRequirementsResponses, KilocodeHeapSnapshotErrors, KilocodeHeapSnapshotResponses, KilocodeNotebookListErrors, @@ -7488,6 +7490,42 @@ export class SessionImport extends HeyApiClient { } export class Kilocode extends HeyApiClient { + /** + * Check agent requirements + * + * Check whether the selected agent's requirements are available in the request directory. + */ + public agentRequirements( + parameters: { + directory?: string + workspace?: string + agent: string + }, + options?: Options, + ) { + const params = buildClientParams( + [parameters], + [ + { + args: [ + { in: "query", key: "directory" }, + { in: "query", key: "workspace" }, + { in: "query", key: "agent" }, + ], + }, + ], + ) + return (options?.client ?? this.client).get< + KilocodeAgentRequirementsResponses, + KilocodeAgentRequirementsErrors, + ThrowOnError + >({ + url: "/kilocode/agent/requirements", + ...options, + ...params, + }) + } + /** * Remove a skill * diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index 3278fef3015..52c672e3bb2 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -448,6 +448,30 @@ export type ApiError = { } } +export type AgentRequirementError = { + name: "AgentRequirementError" + data: { + message: string + agent: string + directory: string + state: "blocked" | "error" + skills: Array<{ + name: string + status: "ready" | "missing" | "error" + message?: string + }> + mcps: Array<{ + name: string + status: "ready" | "missing" | "error" + message?: string + }> + vscode_extensions: Array<{ + name: string + id: string + }> + } +} + export type Todo = { /** * Brief description of the task @@ -1277,6 +1301,14 @@ export type AgentConfig = { steps?: number maxSteps?: number permission?: PermissionConfig + requirements?: { + skills?: Array + mcps?: Array + vscode_extensions?: Array<{ + name: string + id: string + }> + } [key: string]: | unknown | string @@ -1301,6 +1333,14 @@ export type AgentConfig = { | "info" | number | PermissionConfig + | { + skills?: Array + mcps?: Array + vscode_extensions?: Array<{ + name: string + id: string + }> + } | undefined } @@ -1610,6 +1650,7 @@ export type Config = { disable_paste_summary?: boolean batch_tool?: boolean codebase_search?: boolean + agent_requirements?: boolean native_notebook_tools?: boolean speech_to_text_model?: string openTelemetry?: boolean @@ -1996,6 +2037,14 @@ export type Agent = { options: { [key: string]: unknown } + requirements?: { + skills?: Array + mcps?: Array + vscode_extensions?: Array<{ + name: string + id: string + }> + } steps?: number } @@ -2494,6 +2543,31 @@ export type EffectHttpApiErrorServiceUnavailable = { _tag: "ServiceUnavailable" } +export type AgentRequirementResult = { + agent: string + directory: string + enabled: boolean + state: "disabled" | "ready" | "blocked" | "error" + skills: Array<{ + name: string + status: "ready" | "missing" | "error" + message?: string + }> + mcps: Array<{ + name: string + status: "ready" | "missing" | "error" + message?: string + }> + vscode_extensions: Array<{ + name: string + id: string + }> + error?: { + code: "unknown_agent" | "malformed_declaration" | "discovery_failed" | "mcp_status_failed" + message: string + } +} + export type NotebookOutput = { mime: string text?: string @@ -3478,6 +3552,7 @@ export type EventSessionError = { | StructuredOutputError | ContextOverflowError | ApiError + | AgentRequirementError } } @@ -10740,6 +10815,36 @@ export type KilocodeHeapSnapshotResponses = { export type KilocodeHeapSnapshotResponse = KilocodeHeapSnapshotResponses[keyof KilocodeHeapSnapshotResponses] +export type KilocodeAgentRequirementsData = { + body?: never + path?: never + query: { + directory?: string + workspace?: string + agent: string + } + url: "/kilocode/agent/requirements" +} + +export type KilocodeAgentRequirementsErrors = { + /** + * Bad request + */ + 400: BadRequestError +} + +export type KilocodeAgentRequirementsError = KilocodeAgentRequirementsErrors[keyof KilocodeAgentRequirementsErrors] + +export type KilocodeAgentRequirementsResponses = { + /** + * Agent requirement status + */ + 200: AgentRequirementResult +} + +export type KilocodeAgentRequirementsResponse = + KilocodeAgentRequirementsResponses[keyof KilocodeAgentRequirementsResponses] + export type KilocodeRemoveSkillData = { body?: { location: string diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 5b0aef6ffe5..b44240f913c 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -14654,6 +14654,68 @@ ] } }, + "/kilocode/agent/requirements": { + "get": { + "tags": ["kilocode"], + "operationId": "kilocode.agentRequirements", + "parameters": [ + { + "name": "directory", + "in": "query", + "schema": { + "type": "string" + }, + "required": false + }, + { + "name": "workspace", + "in": "query", + "schema": { + "type": "string" + }, + "required": false + }, + { + "name": "agent", + "in": "query", + "schema": { + "type": "string" + }, + "required": true + } + ], + "responses": { + "200": { + "description": "Agent requirement status", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AgentRequirementResult" + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestError" + } + } + } + } + }, + "description": "Check whether the selected agent's requirements are available in the request directory.", + "summary": "Check agent requirements", + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createKiloClient } from \"@kilocode/sdk\"\n\nconst client = createKiloClient()\nawait client.kilocode.agentRequirements({\n ...\n})" + } + ] + } + }, "/kilocode/skill/remove": { "post": { "tags": ["kilocode"], @@ -18797,6 +18859,99 @@ "required": ["name", "data"], "additionalProperties": false }, + "AgentRequirementError": { + "type": "object", + "properties": { + "name": { + "type": "string", + "enum": ["AgentRequirementError"] + }, + "data": { + "type": "object", + "properties": { + "message": { + "type": "string" + }, + "agent": { + "type": "string" + }, + "directory": { + "type": "string" + }, + "state": { + "type": "string", + "enum": ["blocked", "error"] + }, + "skills": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["ready", "missing", "error"] + }, + "message": { + "type": "string" + } + }, + "required": ["name", "status"], + "additionalProperties": false + } + }, + "mcps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["ready", "missing", "error"] + }, + "message": { + "type": "string" + } + }, + "required": ["name", "status"], + "additionalProperties": false + } + }, + "vscode_extensions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "\\S" + }, + "id": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" + } + }, + "required": ["name", "id"], + "additionalProperties": false + } + } + }, + "required": ["message", "agent", "directory", "state", "skills", "mcps", "vscode_extensions"], + "additionalProperties": false + } + }, + "required": ["name", "data"], + "additionalProperties": false + }, "Todo": { "type": "object", "properties": { @@ -21342,6 +21497,58 @@ }, "permission": { "$ref": "#/components/schemas/PermissionConfig" + }, + "requirements": { + "type": "object", + "properties": { + "skills": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "\\S" + }, + "minItems": 1, + "maxItems": 20 + }, + "mcps": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "\\S" + }, + "minItems": 1, + "maxItems": 20 + }, + "vscode_extensions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "\\S" + }, + "id": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" + } + }, + "required": ["name", "id"], + "additionalProperties": false + }, + "minItems": 1, + "maxItems": 20 + } + }, + "additionalProperties": false } }, "additionalProperties": {} @@ -22241,6 +22448,9 @@ "codebase_search": { "type": "boolean" }, + "agent_requirements": { + "type": "boolean" + }, "native_notebook_tools": { "type": "boolean" }, @@ -23396,6 +23606,58 @@ "options": { "type": "object" }, + "requirements": { + "type": "object", + "properties": { + "skills": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "\\S" + }, + "minItems": 1, + "maxItems": 20 + }, + "mcps": { + "type": "array", + "items": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "\\S" + }, + "minItems": 1, + "maxItems": 20 + }, + "vscode_extensions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "\\S" + }, + "id": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" + } + }, + "required": ["name", "id"], + "additionalProperties": false + }, + "minItems": 1, + "maxItems": 20 + } + }, + "additionalProperties": false + }, "steps": { "type": "number" } @@ -24939,6 +25201,102 @@ "required": ["_tag"], "additionalProperties": false }, + "AgentRequirementResult": { + "type": "object", + "properties": { + "agent": { + "type": "string" + }, + "directory": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "state": { + "type": "string", + "enum": ["disabled", "ready", "blocked", "error"] + }, + "skills": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["ready", "missing", "error"] + }, + "message": { + "type": "string" + } + }, + "required": ["name", "status"], + "additionalProperties": false + } + }, + "mcps": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["ready", "missing", "error"] + }, + "message": { + "type": "string" + } + }, + "required": ["name", "status"], + "additionalProperties": false + } + }, + "vscode_extensions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "\\S" + }, + "id": { + "type": "string", + "minLength": 1, + "maxLength": 128, + "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]*$" + } + }, + "required": ["name", "id"], + "additionalProperties": false + } + }, + "error": { + "type": "object", + "properties": { + "code": { + "type": "string", + "enum": ["unknown_agent", "malformed_declaration", "discovery_failed", "mcp_status_failed"] + }, + "message": { + "type": "string" + } + }, + "required": ["code", "message"], + "additionalProperties": false + } + }, + "required": ["agent", "directory", "enabled", "state", "skills", "mcps", "vscode_extensions"], + "additionalProperties": false + }, "NotebookOutput": { "type": "object", "properties": { @@ -28146,6 +28504,9 @@ }, { "$ref": "#/components/schemas/APIError" + }, + { + "$ref": "#/components/schemas/AgentRequirementError" } ] }