diff --git a/DIVERGENCES.md b/DIVERGENCES.md
index 53ebda0cc6..90c734ca50 100644
--- a/DIVERGENCES.md
+++ b/DIVERGENCES.md
@@ -25,6 +25,12 @@ future `packages/codev-*`) never conflict and are not tracked here.
| `packages/tui/src/theme/assets/opencode.json` | `darkSecondary` → `#00cdcd` (banner cyan); `lightSecondary` → `#009999` (darker for light-bg contrast) | Brand accent: first agent ("Build") label + prompt border derive from `secondary`. | Keep our two color values; take upstream's other theme changes. |
| `packages/opencode/src/cli/ui.ts` | `wordmark`/`logo()` render the hub-style CODEV banner (bold bright cyan on TTY) | Help banner matches the hub CLI banner. | Keep our wordmark + logo(); take upstream's surrounding changes. |
| `packages/tui/src/util/presentation.ts` | Local logo copy replaced by the shared CODEV `banner` (cyan) | Presentation-mode wordmark was still upstream-branded. | Keep our wordmark(); take upstream's surrounding changes. |
+| `packages/opencode/src/cli/cmd/*.ts` (tui, run, serve, attach, pr, upgrade, uninstall, web) | Help `describe` strings "opencode" → "codev" | `--help` is the first thing users read. | Keep our strings. |
+| `packages/tui/src/app.tsx` | Terminal title "OpenCode"/"OC \|" → "CoDev Code"/"CC \|" | Tab title branding. | Keep our strings. |
+| `packages/tui/src/routes/session/permission.tsx`, `packages/opencode/src/cli/cmd/run/permission.shared.ts`, `packages/tui/src/component/error-component.tsx`, `packages/opencode/src/cli/cmd/run/splash.ts` | Visible sentences/badges "OpenCode"/"opencode" → "CoDev Code"/"codev-code" | User-facing copy. | Keep our strings. |
+| `packages/opencode/src/installation/index.ts` | Updater detects/queries/installs `codev-code` (npm-family); GitHub fallback → quickbeard/codev-code | `codev-code upgrade` and the update notification target OUR npm package, never stock opencode. brew/choco/scoop probes never match (no such packages). | Keep our package names. |
+| `packages/opencode/src/config/config.ts` | `share` defaults to `"disabled"` when unset | Sharing publishes sessions to upstream's share service; internal users must opt in via config. | Keep our default block. |
+| `packages/tui/src/component/dialog-provider.tsx`, `packages/opencode/src/cli/cmd/providers.ts` | Filter `opencode`/`opencode-go` out of provider pickers | Upstream's hosted offerings (Zen/Go) are detours for gateway users. | Keep our filters. |
| `packages/app/index.html` | `
` → "CoDev Code" | Web UI tab title. | Keep our title. |
| `packages/app/src/desktop-menu.ts`, `packages/app/src/components/windows-app-menu.tsx` | App-menu label "OpenCode" → "CoDev Code" | Visible menu branding. | Keep our labels. |
| `packages/desktop/src/main/index.ts`, `packages/desktop/src/main/windows.ts` | APP_NAMES + window title → "CoDev Code" (Dev/Beta variants too) | Desktop app display name. | Keep our names. |
diff --git a/packages/opencode/script/publish.ts b/packages/opencode/script/publish.ts
index 50d2399296..d6f75ab35d 100755
--- a/packages/opencode/script/publish.ts
+++ b/packages/opencode/script/publish.ts
@@ -44,6 +44,28 @@ await $`mkdir -p ./dist/${pkg.name}`
await $`mkdir -p ./dist/${pkg.name}/bin`
await $`cp ./script/postinstall.mjs ./dist/${pkg.name}/postinstall.mjs`
await Bun.file(`./dist/${pkg.name}/LICENSE`).write(await Bun.file("../../LICENSE").text())
+await Bun.file(`./dist/${pkg.name}/README.md`).write(
+ [
+ "# CoDev Code",
+ "",
+ "The AI coding agent of the CoDev ecosystem — a fork of [opencode](https://github.com/anomalyco/opencode).",
+ "",
+ "The recommended install path is the CoDev hub, which also wires up the AI gateway:",
+ "",
+ "```sh",
+ "npm install -g codev-ai",
+ "codev install",
+ "```",
+ "",
+ "Direct install:",
+ "",
+ "```sh",
+ "npm install -g codev-code",
+ "codev-code",
+ "```",
+ "",
+ ].join("\n"),
+)
await Bun.file(`./dist/${pkg.name}/bin/${pkg.name}.exe`).write(
[
`echo "Error: ${PUBLISH_NAME}'s postinstall script was not run." >&2`,
@@ -64,6 +86,11 @@ await Bun.file(`./dist/${pkg.name}/package.json`).write(
JSON.stringify(
{
name: PUBLISH_NAME,
+ description: "CoDev Code — the AI coding agent of the CoDev ecosystem (a fork of opencode)",
+ repository: {
+ type: "git",
+ url: "git+https://github.com/quickbeard/codev-code.git",
+ },
bin: {
"codev-code": `./bin/${pkg.name}.exe`,
},
diff --git a/packages/opencode/src/cli/cmd/attach.ts b/packages/opencode/src/cli/cmd/attach.ts
index 6f5aea6a12..d0219acf88 100644
--- a/packages/opencode/src/cli/cmd/attach.ts
+++ b/packages/opencode/src/cli/cmd/attach.ts
@@ -6,7 +6,7 @@ import { ServerAuth } from "@/server/auth"
export const AttachCommand = cmd({
command: "attach ",
- describe: "attach to a running opencode server",
+ describe: "attach to a running codev server",
builder: (yargs) =>
yargs
.positional("url", {
diff --git a/packages/opencode/src/cli/cmd/pr.ts b/packages/opencode/src/cli/cmd/pr.ts
index 4209722357..fe08aca595 100644
--- a/packages/opencode/src/cli/cmd/pr.ts
+++ b/packages/opencode/src/cli/cmd/pr.ts
@@ -7,7 +7,7 @@ import { Process } from "@/util/process"
export const PrCommand = effectCmd({
command: "pr ",
- describe: "fetch and checkout a GitHub PR branch, then run opencode",
+ describe: "fetch and checkout a GitHub PR branch, then run codev",
builder: (yargs) =>
yargs.positional("number", {
type: "number",
diff --git a/packages/opencode/src/cli/cmd/providers.ts b/packages/opencode/src/cli/cmd/providers.ts
index 3775123d83..57ae2c3a8f 100644
--- a/packages/opencode/src/cli/cmd/providers.ts
+++ b/packages/opencode/src/cli/cmd/providers.ts
@@ -6,7 +6,7 @@ import { UI } from "../ui"
import * as Prompt from "../effect/prompt"
import { ModelsDev } from "@opencode-ai/core/models-dev"
-import { map, pipe, sortBy, values } from "remeda"
+import { filter, map, pipe, sortBy, values } from "remeda"
import path from "path"
import os from "os"
import { Config } from "@/config/config"
@@ -388,6 +388,9 @@ export const ProvidersLoginCommand = effectCmd({
...pipe(
providers,
values(),
+ // Fork: hide upstream's hosted offering — internal users are on the
+ // CoDev gateway, configured by the codev hub.
+ filter((x) => x.id !== "opencode" && x.id !== "opencode-go"),
sortBy(
(x) => priority[x.id] ?? 99,
(x) => x.name ?? x.id,
diff --git a/packages/opencode/src/cli/cmd/run.ts b/packages/opencode/src/cli/cmd/run.ts
index 3927f615a0..06903b3fe5 100644
--- a/packages/opencode/src/cli/cmd/run.ts
+++ b/packages/opencode/src/cli/cmd/run.ts
@@ -125,7 +125,7 @@ async function toolError(part: ToolPart) {
export const RunCommand = effectCmd({
command: "run [message..]",
- describe: "run opencode with a message",
+ describe: "run codev with a message",
// --attach connects to a remote server (no local instance needed); the
// default path runs an in-process server and needs the project instance.
instance: (args) => !args.attach,
@@ -189,7 +189,7 @@ export const RunCommand = effectCmd({
})
.option("attach", {
type: "string",
- describe: "attach to a running opencode server (e.g., http://localhost:4096)",
+ describe: "attach to a running codev server (e.g., http://localhost:4096)",
})
.option("password", {
alias: ["p"],
diff --git a/packages/opencode/src/cli/cmd/run/permission.shared.ts b/packages/opencode/src/cli/cmd/run/permission.shared.ts
index 6ebdbd090c..6bba4b1bd7 100644
--- a/packages/opencode/src/cli/cmd/run/permission.shared.ts
+++ b/packages/opencode/src/cli/cmd/run/permission.shared.ts
@@ -129,7 +129,7 @@ export function permissionAlwaysLines(request: PermissionRequest): string[] {
}
return [
- "This will allow the following patterns until OpenCode is restarted.",
+ "This will allow the following patterns until CoDev Code is restarted.",
...request.always.map((item) => `- ${item}`),
]
}
diff --git a/packages/opencode/src/cli/cmd/run/splash.ts b/packages/opencode/src/cli/cmd/run/splash.ts
index 141ff6fc55..17cdc1976c 100644
--- a/packages/opencode/src/cli/cmd/run/splash.ts
+++ b/packages/opencode/src/cli/cmd/run/splash.ts
@@ -194,7 +194,7 @@ function build(input: SplashWriterInput, kind: "entry" | "exit", ctx: Scrollback
})
}
- push(lines, body_left, top, "OpenCode", right, undefined, TextAttributes.BOLD)
+ push(lines, body_left, top, "CoDev Code", right, undefined, TextAttributes.BOLD)
if (input.detail) {
push(
lines,
diff --git a/packages/opencode/src/cli/cmd/serve.ts b/packages/opencode/src/cli/cmd/serve.ts
index c0f62b3ca0..3058485c7a 100644
--- a/packages/opencode/src/cli/cmd/serve.ts
+++ b/packages/opencode/src/cli/cmd/serve.ts
@@ -6,7 +6,7 @@ import { Flag } from "@opencode-ai/core/flag/flag"
export const ServeCommand = effectCmd({
command: "serve",
builder: (yargs) => withNetworkOptions(yargs),
- describe: "starts a headless opencode server",
+ describe: "starts a headless codev server",
// Server loads instances per-request via x-opencode-directory header — no
// need for an ambient project InstanceContext at startup.
instance: false,
diff --git a/packages/opencode/src/cli/cmd/tui.ts b/packages/opencode/src/cli/cmd/tui.ts
index 6a9af10040..3194c6e712 100644
--- a/packages/opencode/src/cli/cmd/tui.ts
+++ b/packages/opencode/src/cli/cmd/tui.ts
@@ -71,12 +71,12 @@ export function resolveThreadDirectory(project?: string, envPWD = process.env.PW
export const TuiThreadCommand = cmd({
command: "$0 [project]",
- describe: "start opencode tui",
+ describe: "start codev tui",
builder: (yargs) =>
withNetworkOptions(yargs)
.positional("project", {
type: "string",
- describe: "path to start opencode in",
+ describe: "path to start codev in",
})
.option("model", {
type: "string",
diff --git a/packages/opencode/src/cli/cmd/uninstall.ts b/packages/opencode/src/cli/cmd/uninstall.ts
index 0afdc51854..0a004d53cd 100644
--- a/packages/opencode/src/cli/cmd/uninstall.ts
+++ b/packages/opencode/src/cli/cmd/uninstall.ts
@@ -24,7 +24,7 @@ interface RemovalTargets {
export const UninstallCommand = {
command: "uninstall",
- describe: "uninstall opencode and remove all related files",
+ describe: "uninstall codev and remove all related files",
builder: (yargs: Argv) =>
yargs
.option("keep-config", {
diff --git a/packages/opencode/src/cli/cmd/upgrade.ts b/packages/opencode/src/cli/cmd/upgrade.ts
index 3c1604a0b8..7de0339de3 100644
--- a/packages/opencode/src/cli/cmd/upgrade.ts
+++ b/packages/opencode/src/cli/cmd/upgrade.ts
@@ -6,7 +6,7 @@ import { InstallationVersion } from "@opencode-ai/core/installation/version"
export const UpgradeCommand = {
command: "upgrade [target]",
- describe: "upgrade opencode to the latest or a specific version",
+ describe: "upgrade codev to the latest or a specific version",
builder: (yargs: Argv) => {
return yargs
.positional("target", {
diff --git a/packages/opencode/src/cli/cmd/web.ts b/packages/opencode/src/cli/cmd/web.ts
index 69a981aada..4483aa9942 100644
--- a/packages/opencode/src/cli/cmd/web.ts
+++ b/packages/opencode/src/cli/cmd/web.ts
@@ -31,7 +31,7 @@ function getNetworkIPs() {
export const WebCommand = effectCmd({
command: "web",
builder: (yargs) => withNetworkOptions(yargs),
- describe: "start opencode server and open web interface",
+ describe: "start codev server and open web interface",
// Server loads instances per-request via x-opencode-directory header — no
// ambient project InstanceContext needed at startup.
instance: false,
diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts
index 86238f1a84..6e8037ec08 100644
--- a/packages/opencode/src/config/config.ts
+++ b/packages/opencode/src/config/config.ts
@@ -576,6 +576,12 @@ const layer = Layer.effect(
result.share = "auto"
}
+ // Fork: sharing publishes sessions to upstream's share service. Default
+ // it OFF; set share: "manual" or "auto" in config to opt back in.
+ if (!result.share) {
+ result.share = "disabled"
+ }
+
if (Flag.OPENCODE_DISABLE_AUTOCOMPACT) {
result.compaction = { ...result.compaction, auto: false }
}
diff --git a/packages/opencode/src/installation/index.ts b/packages/opencode/src/installation/index.ts
index 4300220255..f6d0787269 100644
--- a/packages/opencode/src/installation/index.ts
+++ b/packages/opencode/src/installation/index.ts
@@ -197,7 +197,7 @@ const layer: Layer.Layer {
Effect.gen(function* () {
const result = yield* Installation.use.latest("npm")
expect(result).toBe("1.5.0")
- expect(npmCalls).toContain(`https://registry.npmjs.org/opencode-ai/${InstallationChannel}`)
+ expect(npmCalls).toContain(`https://registry.npmjs.org/codev-code/${InstallationChannel}`)
}),
)
@@ -110,7 +110,7 @@ describe("installation", () => {
Effect.gen(function* () {
const result = yield* Installation.use.latest("bun")
expect(result).toBe("1.6.0")
- expect(bunCalls).toContain(`https://registry.npmjs.org/opencode-ai/${InstallationChannel}`)
+ expect(bunCalls).toContain(`https://registry.npmjs.org/codev-code/${InstallationChannel}`)
}),
)
@@ -124,7 +124,7 @@ describe("installation", () => {
Effect.gen(function* () {
const result = yield* Installation.use.latest("pnpm")
expect(result).toBe("1.7.0")
- expect(pnpmCalls).toContain(`https://registry.npmjs.org/opencode-ai/${InstallationChannel}`)
+ expect(pnpmCalls).toContain(`https://registry.npmjs.org/codev-code/${InstallationChannel}`)
}),
)
diff --git a/packages/tui/src/app.tsx b/packages/tui/src/app.tsx
index 57f372ef70..515e046c6a 100644
--- a/packages/tui/src/app.tsx
+++ b/packages/tui/src/app.tsx
@@ -454,24 +454,24 @@ function App(props: { onSnapshot?: () => Promise; pluginHost: TuiPlugi
if (!terminalTitleEnabled() || Flag.OPENCODE_DISABLE_TERMINAL_TITLE) return
if (route.data.type === "home") {
- renderer.setTerminalTitle("OpenCode")
+ renderer.setTerminalTitle("CoDev Code")
return
}
if (route.data.type === "session") {
const session = sync.session.get(route.data.sessionID)
if (!session || isDefaultTitle(session.title)) {
- renderer.setTerminalTitle("OpenCode")
+ renderer.setTerminalTitle("CoDev Code")
return
}
const title = session.title.length > 40 ? session.title.slice(0, 37) + "..." : session.title
- renderer.setTerminalTitle(`OC | ${title}`)
+ renderer.setTerminalTitle(`CC | ${title}`)
return
}
if (route.data.type === "plugin") {
- renderer.setTerminalTitle(`OC | ${route.data.id}`)
+ renderer.setTerminalTitle(`CC | ${route.data.id}`)
}
})
diff --git a/packages/tui/src/component/dialog-provider.tsx b/packages/tui/src/component/dialog-provider.tsx
index 0fd51e3c1c..791fd873d4 100644
--- a/packages/tui/src/component/dialog-provider.tsx
+++ b/packages/tui/src/component/dialog-provider.tsx
@@ -47,7 +47,9 @@ type ProviderOption =
export function providerOptions(list: { id: string; name: string }[]): ProviderOption[] {
return [
...pipe(
- list,
+ // Fork: hide upstream's hosted offerings (Zen / Go) — internal users are
+ // on the CoDev gateway, configured by the codev hub.
+ list.filter((x) => x.id !== "opencode" && x.id !== "opencode-go"),
sortBy(
(x) => PROVIDER_PRIORITY[x.id] ?? 99,
(x) => x.name.toLowerCase(),
diff --git a/packages/tui/src/component/error-component.tsx b/packages/tui/src/component/error-component.tsx
index 1141da8382..5fa9262d71 100644
--- a/packages/tui/src/component/error-component.tsx
+++ b/packages/tui/src/component/error-component.tsx
@@ -192,7 +192,7 @@ export function ErrorComponent(props: { error: Error; reset: () => void; mode?:
? "Report copied — paste it into a new GitHub issue."
: "Copy the report and open a GitHub issue to help us fix this."}
- opencode {InstallationVersion}
+ codev-code {InstallationVersion}
diff --git a/packages/tui/src/routes/session/permission.tsx b/packages/tui/src/routes/session/permission.tsx
index 766ed3c116..fc36cfb000 100644
--- a/packages/tui/src/routes/session/permission.tsx
+++ b/packages/tui/src/routes/session/permission.tsx
@@ -145,7 +145,7 @@ export function PermissionPrompt(props: { request: PermissionRequest; directory?
- This will allow the following patterns until OpenCode is restarted
+ This will allow the following patterns until CoDev Code is restarted
{(pattern) => (
@@ -483,7 +483,7 @@ function RejectPrompt(props: { onConfirm: (message: string) => void; onCancel: (
Reject permission
- Tell OpenCode what to do differently
+ Tell CoDev Code what to do differently