diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml new file mode 100644 index 0000000000..d92133ea6a --- /dev/null +++ b/.github/workflows/beta.yml @@ -0,0 +1,34 @@ +name: beta + +on: + push: + branches: [dev] + pull_request: + types: [opened, synchronize, labeled, unlabeled] + +jobs: + sync: + if: | + github.event_name == 'push' || + (github.event_name == 'pull_request' && + contains(github.event.pull_request.labels.*.name, 'contributor')) + runs-on: blacksmith-4vcpu-ubuntu-2404 + permissions: + contents: write + pull-requests: read + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Bun + uses: ./.github/actions/setup-bun + + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Sync beta branch + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: bun script/beta.ts diff --git a/.github/workflows/daily-issues-recap.yml b/.github/workflows/daily-issues-recap.yml index 2ecd8729a6..43583ddd6f 100644 --- a/.github/workflows/daily-issues-recap.yml +++ b/.github/workflows/daily-issues-recap.yml @@ -1,4 +1,4 @@ -name: Daily Issues Recap +name: daily-issues-recap on: schedule: diff --git a/.github/workflows/daily-pr-recap.yml b/.github/workflows/daily-pr-recap.yml index afa2045415..5a9acdcb57 100644 --- a/.github/workflows/daily-pr-recap.yml +++ b/.github/workflows/daily-pr-recap.yml @@ -1,4 +1,4 @@ -name: Daily PR Recap +name: daily-pr-recap on: schedule: diff --git a/.github/workflows/docs-update.yml b/.github/workflows/docs-update.yml index e4f541142a..c931552b64 100644 --- a/.github/workflows/docs-update.yml +++ b/.github/workflows/docs-update.yml @@ -1,4 +1,4 @@ -name: Docs Update +name: docs-update on: schedule: diff --git a/.github/workflows/duplicate-issues.yml b/.github/workflows/duplicate-issues.yml index e60795146c..c093dd9f5b 100644 --- a/.github/workflows/duplicate-issues.yml +++ b/.github/workflows/duplicate-issues.yml @@ -1,4 +1,4 @@ -name: Duplicate Issue Detection +name: duplicate-issues on: issues: diff --git a/.github/workflows/generate.yml b/.github/workflows/generate.yml index ec83c559a1..3474c12344 100644 --- a/.github/workflows/generate.yml +++ b/.github/workflows/generate.yml @@ -4,6 +4,7 @@ on: push: branches: - dev + pull_request: workflow_dispatch: jobs: diff --git a/.github/workflows/nix-desktop.yml b/.github/workflows/nix-desktop.yml.disabled similarity index 96% rename from .github/workflows/nix-desktop.yml rename to .github/workflows/nix-desktop.yml.disabled index 5c0c433b29..df8dc856e5 100644 --- a/.github/workflows/nix-desktop.yml +++ b/.github/workflows/nix-desktop.yml.disabled @@ -1,4 +1,4 @@ -name: nix desktop +name: nix-desktop on: push: @@ -21,7 +21,7 @@ on: workflow_dispatch: jobs: - build-desktop: + nix-desktop: strategy: fail-fast: false matrix: diff --git a/.github/workflows/update-nix-hashes.yml b/.github/workflows/nix-hashes.yml similarity index 96% rename from .github/workflows/update-nix-hashes.yml rename to .github/workflows/nix-hashes.yml index a724300ec1..7635700635 100644 --- a/.github/workflows/update-nix-hashes.yml +++ b/.github/workflows/nix-hashes.yml @@ -1,4 +1,4 @@ -name: Update Nix Hashes +name: nix-hashes permissions: contents: write @@ -11,17 +11,17 @@ on: - "package.json" - "packages/*/package.json" - "flake.lock" - - ".github/workflows/update-nix-hashes.yml" + - ".github/workflows/nix-hashes.yml" pull_request: paths: - "bun.lock" - "package.json" - "packages/*/package.json" - "flake.lock" - - ".github/workflows/update-nix-hashes.yml" + - ".github/workflows/nix-hashes.yml" jobs: - update-node-modules-hashes: + nix-hashes: if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository runs-on: depot-ubuntu-24.04-4 env: diff --git a/.github/workflows/notify-discord.yml b/.github/workflows/notify-discord.yml index 44a18534a8..6bd1ab6715 100644 --- a/.github/workflows/notify-discord.yml +++ b/.github/workflows/notify-discord.yml @@ -1,4 +1,4 @@ -name: discord +name: notify-discord on: release: diff --git a/.github/workflows/duplicate-prs.yml b/.github/workflows/pr-management.yml similarity index 73% rename from .github/workflows/duplicate-prs.yml rename to .github/workflows/pr-management.yml index db60b88e1d..ecc9d4bba4 100644 --- a/.github/workflows/duplicate-prs.yml +++ b/.github/workflows/pr-management.yml @@ -1,4 +1,4 @@ -name: Duplicate PR Check +name: pr-management on: pull_request_target: @@ -67,3 +67,26 @@ jobs: gh pr comment "$PR_NUMBER" --body "_The following comment was made by an LLM, it may be inaccurate:_ $COMMENT" + + add-contributor-label: + runs-on: ubuntu-latest + permissions: + pull-requests: write + issues: write + steps: + - name: Add Contributor Label + uses: actions/github-script@v8 + with: + script: | + const isPR = !!context.payload.pull_request; + const issueNumber = isPR ? context.payload.pull_request.number : context.payload.issue.number; + const authorAssociation = isPR ? context.payload.pull_request.author_association : context.payload.issue.author_association; + + if (authorAssociation === 'CONTRIBUTOR') { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issueNumber, + labels: ['contributor'] + }); + } diff --git a/.github/workflows/pr-standards.yml b/.github/workflows/pr-standards.yml index e35ce8689d..123013eea6 100644 --- a/.github/workflows/pr-standards.yml +++ b/.github/workflows/pr-standards.yml @@ -1,4 +1,4 @@ -name: PR Standards +name: pr-standards on: pull_request_target: diff --git a/.github/workflows/review.yml b/.github/workflows/review.yml index a5971b24b4..b86828c0b7 100644 --- a/.github/workflows/review.yml +++ b/.github/workflows/review.yml @@ -1,4 +1,4 @@ -name: Guidelines Check +name: review on: issue_comment: diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml index 81f0d42884..ba3f1bc7a9 100644 --- a/.github/workflows/stale-issues.yml +++ b/.github/workflows/stale-issues.yml @@ -1,4 +1,4 @@ -name: "Auto-close stale issues" +name: stale-issues on: schedule: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3d0d580f69..4018ece3a8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,9 +1,6 @@ name: test on: - push: - branches: - - dev pull_request: workflow_dispatch: jobs: @@ -20,7 +17,6 @@ jobs: command: | git config --global user.email "bot@opencode.ai" git config --global user.name "opencode" - bun turbo typecheck bun turbo test - name: windows host: depot-windows-2025-4 diff --git a/.github/workflows/triage.yml b/.github/workflows/triage.yml index c41a7e5376..4b8a5a153d 100644 --- a/.github/workflows/triage.yml +++ b/.github/workflows/triage.yml @@ -1,4 +1,4 @@ -name: Issue Triage +name: triage on: issues: diff --git a/github/index.ts b/github/index.ts index f6b37b54a9..0803eba289 100644 --- a/github/index.ts +++ b/github/index.ts @@ -6,7 +6,7 @@ import * as core from "@actions/core" import * as github from "@actions/github" import type { Context as GitHubContext } from "@actions/github/lib/context" import type { IssueCommentEvent, PullRequestReviewCommentEvent } from "@octokit/webhooks-types" -import { createOpencodeClient } from "@kilocode/sdk" // kilocode_change +import { createOpencodeClient } from "@kilocode/sdk" import { spawn } from "node:child_process" type GitHubAuthor = { @@ -362,7 +362,7 @@ function useIssueId() { } function useShareUrl() { - return isMock() ? "https://dev.opencode.ai" : "https://opencode.ai" + return isMock() ? "https://dev.kilo.ai" : "https://kilo.ai" } async function getAccessToken() { @@ -373,7 +373,7 @@ async function getAccessToken() { let response if (isMock()) { - response = await fetch("https://api.opencode.ai/exchange_github_app_token_with_pat", { + response = await fetch("https://api.kilo.ai/exchange_github_app_token_with_pat", { method: "POST", headers: { Authorization: `Bearer ${useEnvMock().mockToken}`, @@ -382,7 +382,7 @@ async function getAccessToken() { }) } else { const oidcToken = await core.getIDToken("opencode-github-action") - response = await fetch("https://api.opencode.ai/exchange_github_app_token", { + response = await fetch("https://api.kilo.ai/exchange_github_app_token", { method: "POST", headers: { Authorization: `Bearer ${oidcToken}`, diff --git a/github/package.json b/github/package.json index 91e70747fe..46588b9b4c 100644 --- a/github/package.json +++ b/github/package.json @@ -16,5 +16,6 @@ "@octokit/graphql": "9.0.1", "@octokit/rest": "catalog:", "@kilocode/sdk": "workspace:*" - } + }, + "version": "1.0.13" } diff --git a/package.json b/package.json index ee4b43b00e..e11eff3f98 100644 --- a/package.json +++ b/package.json @@ -101,5 +101,6 @@ }, "patchedDependencies": { "ghostty-web@0.3.0": "patches/ghostty-web@0.3.0.patch" - } + }, + "version": "1.0.13" } diff --git a/packages/app/e2e/file-tree.spec.ts b/packages/app/e2e/file-tree.spec.ts index c22a810f4f..0b04eb2468 100644 --- a/packages/app/e2e/file-tree.spec.ts +++ b/packages/app/e2e/file-tree.spec.ts @@ -1,6 +1,6 @@ import { test, expect } from "./fixtures" -test("file tree can expand folders and open a file", async ({ page, gotoSession }) => { +test.skip("file tree can expand folders and open a file", async ({ page, gotoSession }) => { await gotoSession() const toggle = page.getByRole("button", { name: "Toggle file tree" }) diff --git a/packages/app/e2e/utils.ts b/packages/app/e2e/utils.ts index 99a5b7139f..7657003539 100644 --- a/packages/app/e2e/utils.ts +++ b/packages/app/e2e/utils.ts @@ -1,4 +1,4 @@ -import { createOpencodeClient } from "@kilocode/sdk/v2/client" // kilocode_change +import { createOpencodeClient } from "@kilocode/sdk/v2/client" import { base64Encode } from "@opencode-ai/util/encode" export const serverHost = process.env.PLAYWRIGHT_SERVER_HOST ?? "localhost" diff --git a/packages/app/src/addons/serialize.test.ts b/packages/app/src/addons/serialize.test.ts index 7f6780557d..7fb1a61f35 100644 --- a/packages/app/src/addons/serialize.test.ts +++ b/packages/app/src/addons/serialize.test.ts @@ -36,7 +36,7 @@ function writeAndWait(term: Terminal, data: string): Promise { }) } -describe("SerializeAddon", () => { +describe.skip("SerializeAddon", () => { describe("ANSI color preservation", () => { test("should preserve text attributes (bold, italic, underline)", async () => { const { term, addon } = createTerminal() diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index ba0d1e7aa4..11fdb57432 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -43,7 +43,7 @@ function UiI18nBridge(props: ParentProps) { declare global { interface Window { - __OPENCODE__?: { updaterEnabled?: boolean; serverPassword?: string } + __OPENCODE__?: { updaterEnabled?: boolean; serverPassword?: string; deepLinks?: string[] } } } diff --git a/packages/app/src/components/dialog-connect-provider.tsx b/packages/app/src/components/dialog-connect-provider.tsx index e629505915..5affb12464 100644 --- a/packages/app/src/components/dialog-connect-provider.tsx +++ b/packages/app/src/components/dialog-connect-provider.tsx @@ -1,4 +1,4 @@ -import type { ProviderAuthAuthorization } from "@kilocode/sdk/v2/client" // kilocode_change +import type { ProviderAuthAuthorization } from "@kilocode/sdk/v2/client" import { Button } from "@opencode-ai/ui/button" import { useDialog } from "@opencode-ai/ui/context/dialog" import { Dialog } from "@opencode-ai/ui/dialog" diff --git a/packages/app/src/components/dialog-custom-provider.tsx b/packages/app/src/components/dialog-custom-provider.tsx index 28a947f3b3..bfa8224904 100644 --- a/packages/app/src/components/dialog-custom-provider.tsx +++ b/packages/app/src/components/dialog-custom-provider.tsx @@ -284,7 +284,7 @@ export function DialogCustomProvider(props: Props) {

Configure an OpenAI-compatible provider. See the{" "} - + provider config docs . diff --git a/packages/app/src/components/dialog-fork.tsx b/packages/app/src/components/dialog-fork.tsx index da1126e8e0..b9200a1aa1 100644 --- a/packages/app/src/components/dialog-fork.tsx +++ b/packages/app/src/components/dialog-fork.tsx @@ -7,7 +7,7 @@ import { useDialog } from "@opencode-ai/ui/context/dialog" import { Dialog } from "@opencode-ai/ui/dialog" import { List } from "@opencode-ai/ui/list" import { extractPromptFromParts } from "@/utils/prompt" -import type { TextPart as SDKTextPart } from "@kilocode/sdk/v2/client" // kilocode_change +import type { TextPart as SDKTextPart } from "@kilocode/sdk/v2/client" import { base64Encode } from "@opencode-ai/util/encode" import { useLanguage } from "@/context/language" diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx index e8a36f1380..2c0654444d 100644 --- a/packages/app/src/components/dialog-select-server.tsx +++ b/packages/app/src/components/dialog-select-server.tsx @@ -8,7 +8,7 @@ import { IconButton } from "@opencode-ai/ui/icon-button" import { TextField } from "@opencode-ai/ui/text-field" import { normalizeServerUrl, serverDisplayName, useServer } from "@/context/server" import { usePlatform } from "@/context/platform" -import { createOpencodeClient } from "@kilocode/sdk/v2/client" // kilocode_change +import { createOpencodeClient } from "@kilocode/sdk/v2/client" import { useNavigate } from "@solidjs/router" import { useLanguage } from "@/context/language" import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" diff --git a/packages/app/src/components/file-tree.tsx b/packages/app/src/components/file-tree.tsx index 97c1541de0..e858065b31 100644 --- a/packages/app/src/components/file-tree.tsx +++ b/packages/app/src/components/file-tree.tsx @@ -16,7 +16,7 @@ import { type ParentProps, } from "solid-js" import { Dynamic } from "solid-js/web" -import type { FileNode } from "@kilocode/sdk/v2" // kilocode_change +import type { FileNode } from "@kilocode/sdk/v2" type Kind = "add" | "del" | "mix" diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 633d749996..15bc514019 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -54,7 +54,7 @@ import { usePermission } from "@/context/permission" import { useLanguage } from "@/context/language" import { useGlobalSync } from "@/context/global-sync" import { usePlatform } from "@/context/platform" -import { createOpencodeClient, type Message, type Part } from "@kilocode/sdk/v2/client" // kilocode_change +import { createOpencodeClient, type Message, type Part } from "@kilocode/sdk/v2/client" import { Binary } from "@opencode-ai/util/binary" import { showToast } from "@opencode-ai/ui/toast" import { base64Encode } from "@opencode-ai/util/encode" diff --git a/packages/app/src/components/session-context-usage.tsx b/packages/app/src/components/session-context-usage.tsx index 20fa5740cf..eb46483318 100644 --- a/packages/app/src/components/session-context-usage.tsx +++ b/packages/app/src/components/session-context-usage.tsx @@ -3,7 +3,7 @@ import { Tooltip } from "@opencode-ai/ui/tooltip" import { ProgressCircle } from "@opencode-ai/ui/progress-circle" import { Button } from "@opencode-ai/ui/button" import { useParams } from "@solidjs/router" -import { AssistantMessage } from "@kilocode/sdk/v2/client" // kilocode_change +import { AssistantMessage } from "@kilocode/sdk/v2/client" import { findLast } from "@opencode-ai/util/array" import { useLayout } from "@/context/layout" diff --git a/packages/app/src/components/session/session-context-tab.tsx b/packages/app/src/components/session/session-context-tab.tsx index 0e891d022f..800b41ce60 100644 --- a/packages/app/src/components/session/session-context-tab.tsx +++ b/packages/app/src/components/session/session-context-tab.tsx @@ -11,7 +11,7 @@ import { Accordion } from "@opencode-ai/ui/accordion" import { StickyAccordionHeader } from "@opencode-ai/ui/sticky-accordion-header" import { Code } from "@opencode-ai/ui/code" import { Markdown } from "@opencode-ai/ui/markdown" -import type { AssistantMessage, Message, Part, UserMessage } from "@kilocode/sdk/v2/client" // kilocode_change +import type { AssistantMessage, Message, Part, UserMessage } from "@kilocode/sdk/v2/client" import { useLanguage } from "@/context/language" interface SessionContextTabProps { diff --git a/packages/app/src/components/session/session-header.tsx b/packages/app/src/components/session/session-header.tsx index 349b4897f3..449f2091bd 100644 --- a/packages/app/src/components/session/session-header.tsx +++ b/packages/app/src/components/session/session-header.tsx @@ -130,7 +130,7 @@ export function SessionHeader() {