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 <url>", - 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 <number>", - 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<Service, never, HttpClient.HttpClient | AppProcess.Serv for (const check of checks) { const output = yield* check.command() const installedName = - check.name === "brew" || check.name === "choco" || check.name === "scoop" ? "opencode" : "opencode-ai" + "codev-code" // fork: our npm package; brew/choco/scoop ship no codev-code, so those probes never match if (output.includes(installedName)) { return check.name } @@ -227,7 +227,7 @@ const layer: Layer.Layer<Service, never, HttpClient.HttpClient | AppProcess.Serv if (detectedMethod === "npm" || detectedMethod === "bun" || detectedMethod === "pnpm") { const response = yield* httpOk.execute( HttpClientRequest.get( - `${yield* NpmConfig.registry(process.cwd())}/opencode-ai/${InstallationChannel}`, + `${yield* NpmConfig.registry(process.cwd())}/codev-code/${InstallationChannel}`, ).pipe(HttpClientRequest.acceptJson), ) const data = yield* HttpClientResponse.schemaBodyJson(NpmPackage)(response) @@ -255,7 +255,7 @@ const layer: Layer.Layer<Service, never, HttpClient.HttpClient | AppProcess.Serv } const response = yield* httpOk.execute( - HttpClientRequest.get("https://api.github.com/repos/anomalyco/opencode/releases/latest").pipe( + HttpClientRequest.get("https://api.github.com/repos/quickbeard/codev-code/releases/latest").pipe( HttpClientRequest.acceptJson, ), ) @@ -269,13 +269,13 @@ const layer: Layer.Layer<Service, never, HttpClient.HttpClient | AppProcess.Serv upgradeResult = yield* upgradeCurl(target) break case "npm": - upgradeResult = yield* run(["npm", "install", "-g", `opencode-ai@${target}`]) + upgradeResult = yield* run(["npm", "install", "-g", `codev-code@${target}`]) break case "pnpm": - upgradeResult = yield* run(["pnpm", "install", "-g", `opencode-ai@${target}`]) + upgradeResult = yield* run(["pnpm", "install", "-g", `codev-code@${target}`]) break case "bun": - upgradeResult = yield* run(["bun", "install", "-g", `opencode-ai@${target}`]) + upgradeResult = yield* run(["bun", "install", "-g", `codev-code@${target}`]) break case "brew": { const formula = yield* getBrewFormula() diff --git a/packages/opencode/test/installation/installation.test.ts b/packages/opencode/test/installation/installation.test.ts index 3d4b4cba31..dc7bc6376b 100644 --- a/packages/opencode/test/installation/installation.test.ts +++ b/packages/opencode/test/installation/installation.test.ts @@ -96,7 +96,7 @@ describe("installation", () => { 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<string[]>; 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."} </text> - <text fg={colors.muted}>opencode {InstallationVersion}</text> + <text fg={colors.muted}>codev-code {InstallationVersion}</text> </box> </Show> </box> 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? </Match> <Match when={true}> <box paddingLeft={1} gap={1}> - <text fg={theme.textMuted}>This will allow the following patterns until OpenCode is restarted</text> + <text fg={theme.textMuted}>This will allow the following patterns until CoDev Code is restarted</text> <box> <For each={props.request.always}> {(pattern) => ( @@ -483,7 +483,7 @@ function RejectPrompt(props: { onConfirm: (message: string) => void; onCancel: ( <text fg={theme.text}>Reject permission</text> </box> <box paddingLeft={1}> - <text fg={theme.textMuted}>Tell OpenCode what to do differently</text> + <text fg={theme.textMuted}>Tell CoDev Code what to do differently</text> </box> </box> <box