diff --git a/DIVERGENCES.md b/DIVERGENCES.md index 3b2f5c2781..53ebda0cc6 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -20,6 +20,16 @@ future `packages/codev-*`) never conflict and are not tracked here. | `packages/opencode/script/publish.ts` | `PUBLISH_NAME = "codev-code"` const; published-name→dir map; main pkg name + bin key; env-guarded exit before the Docker/AUR/Homebrew section | npm-only publishing under the fork's names (unscoped, public on npmjs); upstream's other channels target anomalyco infra. | Keep our names + early exit; take upstream's npm-section changes above the exit. | | `packages/opencode/bin/opencode` | `base` prefix `opencode-` → `codev-code-` | Runtime platform-binary lookup must match the published names. | Keep our prefix. | | `packages/opencode/script/postinstall.mjs` | `base` prefix `opencode-` → `codev-code-` | Install-time platform-binary fetch must match the published names. | Keep our prefix. | +| `packages/tui/src/logo.ts` | Pixel glyphs "open"+"code" → "co"+"dev"; added hub-style `banner` (ANSI-Shadow CODEV) | Branded wordmark art; `banner` feeds the TUI home banner, CLI help, and presentation mode. | Keep our glyphs and banner. | +| `packages/tui/src/component/logo.tsx` | Renders the hub-style CODEV `banner` in uniform bold cyan (#00cdcd) | Matches the codev hub CLI banner art and color. | Keep our version wholesale. | +| `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/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. | +| `packages/desktop/electron-builder.config.ts` | `productName` ×3 → "CoDev Code…"; artifactName → `codev-code-desktop-…`; protocol display name | Installer/product branding. appId (`ai.opencode.desktop`) and the `opencode://` deep-link scheme stay upstream — identity plumbing wired into main/index.ts and app deep-links; do not rename casually. | Keep our names; take upstream's other config. | +| `packages/ui/src/assets/favicon/` (favicon-v3.svg, site.webmanifest, favicon-96x96-v3.png, apple-touch-icon-v3.png, web-app-manifest-192/512.png) | New codev mark: blocky "C" in #00cdcd (banner cyan) on dark; manifest name "CoDev Code"/"codev" | Web/desktop favicon + PWA branding (served via packages/app/public symlinks). | Keep our assets (binary: take ours wholesale). | | `README.md` | Replaced with fork README | Fork identity, sync + divergence policy. | Keep ours entirely. | | `README.*.md` (21 translations) | Deleted | Upstream marketing translations, irrelevant to the fork. | Keep deleted (`git rm` the upstream side of modify/delete conflicts). | | `screenshot-uk.png` | Deleted | Orphaned README-translation asset; referenced by nothing. | Keep deleted. | @@ -38,9 +48,13 @@ future `packages/codev-*`) never conflict and are not tracked here. the upstream version the fork was built from; suffix like `-codev.1` for fork-only re-releases). Docker/AUR/Homebrew/GitHub-release channels are upstream-only and disabled. The binary inside platform packages is still named `opencode` (cosmetic). -- **UI branding**: TUI logo (`UI.logo()`), desktop/web app names and assets — all still - upstream-branded. Cosmetic; not worth the merge-conflict surface until the product ships - beyond the team. +- **UI branding**: TUI banner, default-theme accent, desktop/web app names, and favicon/PWA + assets are rebranded (see table). Still upstream-branded, deliberately: in-app i18n strings + mentioning "OpenCode" (~33 × 19 locale files — a merge-conflict farm; revisit with a + runtime display-name shim if it matters), `favicon-v3.ico` + `social-share.png` (binary + formats we can't author well — need design assets), desktop app ICONS (resources/icons — + need design assets), and the `ai.opencode.desktop` appId / `opencode://` scheme (identity + plumbing, like the OPENCODE_* env vars). - **Internal names**: `@opencode-ai/*` package names, `OPENCODE_*` env vars, `~/.local/share/codev-code` internals keep upstream naming on purpose. Renaming them would be a permanent merge-conflict machine for names users never see. Do not "clean these up". diff --git a/packages/app/index.html b/packages/app/index.html index d71535182c..2709791e9f 100644 --- a/packages/app/index.html +++ b/packages/app/index.html @@ -6,7 +6,7 @@ name="viewport" content="width=device-width, initial-scale=1, interactive-widget=resizes-content, viewport-fit=cover" /> - <title>OpenCode + CoDev Code diff --git a/packages/app/src/components/windows-app-menu.tsx b/packages/app/src/components/windows-app-menu.tsx index 017ac4cf8d..3ad2930954 100644 --- a/packages/app/src/components/windows-app-menu.tsx +++ b/packages/app/src/components/windows-app-menu.tsx @@ -77,7 +77,7 @@ export function WindowsAppMenu(props: { - OpenCode + CoDev Code {DESKTOP_MENU.filter((menu) => desktopMenuVisible(menu, "windows")).map((menu) => ( {menu.items diff --git a/packages/app/src/desktop-menu.ts b/packages/app/src/desktop-menu.ts index d3902cd2b2..b96fe57e0d 100644 --- a/packages/app/src/desktop-menu.ts +++ b/packages/app/src/desktop-menu.ts @@ -72,7 +72,7 @@ export type DesktopMenu = { export const DESKTOP_MENU: DesktopMenu[] = [ { id: "app", - label: "OpenCode", + label: "CoDev Code", platforms: ["macos"], items: [ { type: "item", role: "about" }, diff --git a/packages/desktop/electron-builder.config.ts b/packages/desktop/electron-builder.config.ts index 23afe811c2..3ef10ba206 100644 --- a/packages/desktop/electron-builder.config.ts +++ b/packages/desktop/electron-builder.config.ts @@ -39,7 +39,7 @@ const APP_IDS = { } as const const getBase = (appId: string): Configuration => ({ - artifactName: "opencode-desktop-${os}-${arch}.${ext}", + artifactName: "codev-code-desktop-${os}-${arch}.${ext}", directories: { output: "dist", buildResources: "resources", @@ -74,7 +74,7 @@ const getBase = (appId: string): Configuration => ({ sign: true, }, protocols: { - name: "OpenCode", + name: "CoDev Code", schemes: ["opencode"], }, win: { @@ -115,7 +115,7 @@ function getConfig() { return { ...base, appId, - productName: "OpenCode Dev", + productName: "CoDev Code Dev", rpm: { packageName: "opencode-dev" }, } } @@ -123,7 +123,7 @@ function getConfig() { return { ...base, appId, - productName: "OpenCode Beta", + productName: "CoDev Code Beta", protocols: { name: "OpenCode Beta", schemes: ["opencode"] }, publish: { provider: "github", owner: "anomalyco", repo: "opencode-beta", channel: "latest" }, rpm: { packageName: "opencode-beta" }, @@ -133,7 +133,7 @@ function getConfig() { return { ...base, appId, - productName: "OpenCode", + productName: "CoDev Code", protocols: { name: "OpenCode", schemes: ["opencode"] }, publish: { provider: "github", owner: "anomalyco", repo: "opencode", channel: "latest" }, deb: { fpm: [legacyDesktopEntryFpm] }, diff --git a/packages/desktop/src/main/index.ts b/packages/desktop/src/main/index.ts index acceabfef0..f378bc043f 100644 --- a/packages/desktop/src/main/index.ts +++ b/packages/desktop/src/main/index.ts @@ -44,9 +44,9 @@ import { migrate } from "./migrate" import { cleanupStoreFiles } from "./store-cleanup" const APP_NAMES: Record = { - dev: "OpenCode Dev", - beta: "OpenCode Beta", - prod: "OpenCode", + dev: "CoDev Code Dev", + beta: "CoDev Code Beta", + prod: "CoDev Code", } const APP_IDS: Record = { dev: "ai.opencode.desktop.dev", diff --git a/packages/desktop/src/main/windows.ts b/packages/desktop/src/main/windows.ts index a2c7ca617b..00c5850e6f 100644 --- a/packages/desktop/src/main/windows.ts +++ b/packages/desktop/src/main/windows.ts @@ -166,7 +166,7 @@ export function createMainWindow(id: string = randomUUID()) { height: state.height, show: false, autoHideMenuBar: true, - title: "OpenCode", + title: "CoDev Code", icon: iconPath(), backgroundColor: backgroundColor ?? defaultBackgroundColor(), ...(process.platform === "darwin" diff --git a/packages/opencode/src/cli/ui.ts b/packages/opencode/src/cli/ui.ts index 6ad6495cf1..0eb6be187e 100644 --- a/packages/opencode/src/cli/ui.ts +++ b/packages/opencode/src/cli/ui.ts @@ -1,13 +1,9 @@ import { EOL } from "os" import { Schema } from "effect" -import { logo as glyphs } from "./logo" +import { banner } from "./logo" -const wordmark = [ - `⠀ ▄ `, - `█▀▀█ █▀▀█ █▀▀█ █▀▀▄ █▀▀▀ █▀▀█ █▀▀█ █▀▀█`, - `█ █ █ █ █▀▀▀ █ █ █ █ █ █ █ █▀▀▀`, - `▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀ ▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀`, -] +// Fork: hub-style CODEV banner (see @opencode-ai/tui/logo). +const wordmark = banner export class CancelledError extends Schema.TaggedErrorClass()("UICancelledError", {}) {} @@ -47,60 +43,10 @@ export function empty() { export function logo(pad?: string) { if (!process.stdout.isTTY && !process.stderr.isTTY) { - const result = [] - for (const row of wordmark) { - if (pad) result.push(pad) - result.push(row) - result.push(EOL) - } - return result.join("").trimEnd() + return wordmark.map((row) => (pad ?? "") + row).join(EOL) } - - const result: string[] = [] - const reset = "\x1b[0m" - const left = { - fg: "\x1b[90m", - shadow: "\x1b[38;5;235m", - bg: "\x1b[48;5;235m", - } - const right = { - fg: reset, - shadow: "\x1b[38;5;238m", - bg: "\x1b[48;5;238m", - } - const gap = " " - const draw = (line: string, fg: string, shadow: string, bg: string) => { - const parts: string[] = [] - for (const char of line) { - if (char === "_") { - parts.push(bg, " ", reset) - continue - } - if (char === "^") { - parts.push(fg, bg, "▀", reset) - continue - } - if (char === "~") { - parts.push(shadow, "▀", reset) - continue - } - if (char === " ") { - parts.push(" ") - continue - } - parts.push(fg, char, reset) - } - return parts.join("") - } - glyphs.left.forEach((row, index) => { - if (pad) result.push(pad) - result.push(draw(row, left.fg, left.shadow, left.bg)) - result.push(gap) - const other = glyphs.right[index] ?? "" - result.push(draw(other, right.fg, right.shadow, right.bg)) - result.push(EOL) - }) - return result.join("").trimEnd() + // Bold bright cyan, matching the codev hub CLI banner. + return wordmark.map((row) => (pad ?? "") + "\x1b[1m\x1b[96m" + row + "\x1b[0m").join(EOL) } export async function input(prompt: string): Promise { diff --git a/packages/tui/src/component/logo.tsx b/packages/tui/src/component/logo.tsx index db8e8dc716..13cbe3b8c6 100644 --- a/packages/tui/src/component/logo.tsx +++ b/packages/tui/src/component/logo.tsx @@ -1,59 +1,19 @@ import { RGBA, TextAttributes } from "@opentui/core" -import { For, type JSX } from "solid-js" -import { tint, useTheme } from "../context/theme" -import { logo } from "../logo" +import { For } from "solid-js" +import { banner } from "../logo" -export function Logo() { - const { theme } = useTheme() - - const renderLine = (line: string, fg: RGBA, bold: boolean): JSX.Element[] => { - const shadow = tint(theme.background, fg, 0.25) - const attrs = bold ? TextAttributes.BOLD : undefined - return Array.from(line).map((char) => { - if (char === "_") { - return ( - - {" "} - - ) - } - if (char === "^") { - return ( - - ▀ - - ) - } - if (char === "~") { - return ( - - ▀ - - ) - } - if (char === ",") { - return ( - - ▄ - - ) - } - return ( - - {char} - - ) - }) - } +// Fork: hub-style CODEV banner in uniform bold cyan, matching the codev +// hub's CLI banner (codev repo, src/components/Banner.tsx, ink "cyan"). +const BRAND = RGBA.fromHex("#00cdcd") +export function Logo() { return ( - - {(line, index) => ( - - {renderLine(line, theme.textMuted, false)} - {renderLine(logo.right[index()], theme.text, true)} - + + {(line) => ( + + {line} + )} diff --git a/packages/tui/src/logo.ts b/packages/tui/src/logo.ts index a58a8cf995..6b76e302c8 100644 --- a/packages/tui/src/logo.ts +++ b/packages/tui/src/logo.ts @@ -1,8 +1,21 @@ +// Fork: "codev" wordmark ("co" + "dev"), same pixel font and shadow marks as +// upstream's "open" + "code". export const logo = { - left: [" ", "█▀▀█ █▀▀█ █▀▀█ █▀▀▄", "█__█ █__█ █^^^ █__█", "▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀~~▀"], - right: [" ▄ ", "█▀▀▀ █▀▀█ █▀▀█ █▀▀█", "█___ █__█ █__█ █^^^", "▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀"], + left: [" ", "█▀▀▀ █▀▀█", "█___ █__█", "▀▀▀▀ ▀▀▀▀"], + right: [" ▄ ", "█▀▀█ █▀▀█ █__█", "█__█ █^^^ █__█", "▀▀▀▀ ▀▀▀▀ ▀▀ "], } +// Fork: hub-style CODEV banner (same ANSI-Shadow art as the codev hub's +// src/components/Banner.tsx). Used by the TUI home banner and CLI help. +export const banner = [ + " ██████╗ ██████╗ ██████╗ ███████╗██╗ ██╗", + "██╔════╝██╔═══██╗██╔══██╗██╔════╝██║ ██║", + "██║ ██║ ██║██║ ██║█████╗ ██║ ██║", + "██║ ██║ ██║██║ ██║██╔══╝ ╚██╗ ██╔╝", + "╚██████╗╚██████╔╝██████╔╝███████╗ ╚████╔╝ ", + " ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═══╝ ", +] + export const go = { left: [" ", "█▀▀▀", "█_^█", "▀▀▀▀"], right: [" ", "█▀▀█", "█__█", "▀▀▀▀"], diff --git a/packages/tui/src/theme/assets/opencode.json b/packages/tui/src/theme/assets/opencode.json index e92dca8c2f..979e929788 100644 --- a/packages/tui/src/theme/assets/opencode.json +++ b/packages/tui/src/theme/assets/opencode.json @@ -13,7 +13,7 @@ "darkStep10": "#ffc09f", "darkStep11": "#808080", "darkStep12": "#eeeeee", - "darkSecondary": "#5c9cf5", + "darkSecondary": "#00cdcd", "darkAccent": "#9d7cd8", "darkRed": "#e06c75", "darkOrange": "#f5a742", @@ -32,7 +32,7 @@ "lightStep10": "#2968c3", "lightStep11": "#8a8a8a", "lightStep12": "#1a1a1a", - "lightSecondary": "#7b5bb6", + "lightSecondary": "#009999", "lightAccent": "#d68c27", "lightRed": "#d1383d", "lightOrange": "#d68c27", diff --git a/packages/tui/src/util/presentation.ts b/packages/tui/src/util/presentation.ts index cf432bf967..de885eac40 100644 --- a/packages/tui/src/util/presentation.ts +++ b/packages/tui/src/util/presentation.ts @@ -1,29 +1,12 @@ -const logo = { - left: [" ", "█▀▀█ █▀▀█ █▀▀█ █▀▀▄", "█__█ █__█ █^^^ █__█", "▀▀▀▀ █▀▀▀ ▀▀▀▀ ▀~~▀"], - right: [" ▄ ", "█▀▀▀ █▀▀█ █▀▀█ █▀▀█", "█___ █__█ █__█ █^^^", "▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀▀▀▀"], -} +import { banner } from "../logo" const reset = "\x1b[0m" const bold = "\x1b[1m" const dim = "\x1b[90m" function wordmark(pad = "") { - const draw = (line: string, fg: string, shadow: string, bg: string) => - [...line] - .map((char) => { - if (char === "_") return `${bg} ${reset}` - if (char === "^") return `${fg}${bg}▀${reset}` - if (char === "~") return `${shadow}▀${reset}` - if (char === " ") return " " - return `${fg}${char}${reset}` - }) - .join("") - - return logo.left.map((line, index) => { - const left = draw(line, dim, "\x1b[38;5;235m", "\x1b[48;5;235m") - const right = draw(logo.right[index] ?? "", reset, "\x1b[38;5;238m", "\x1b[48;5;238m") - return `${pad}${left} ${right}` - }) + // Fork: hub-style CODEV banner in bold bright cyan. + return banner.map((line) => `${pad}${bold}\x1b[96m${line}${reset}`) } export function sessionEpilogue(input: { title: string; sessionID?: string }) { diff --git a/packages/ui/src/assets/favicon/apple-touch-icon-v3.png b/packages/ui/src/assets/favicon/apple-touch-icon-v3.png index 70fd01b0ea..0d398245ac 100644 Binary files a/packages/ui/src/assets/favicon/apple-touch-icon-v3.png and b/packages/ui/src/assets/favicon/apple-touch-icon-v3.png differ diff --git a/packages/ui/src/assets/favicon/favicon-96x96-v3.png b/packages/ui/src/assets/favicon/favicon-96x96-v3.png index 15266d28f1..2af0e7f87f 100644 Binary files a/packages/ui/src/assets/favicon/favicon-96x96-v3.png and b/packages/ui/src/assets/favicon/favicon-96x96-v3.png differ diff --git a/packages/ui/src/assets/favicon/favicon-v3.svg b/packages/ui/src/assets/favicon/favicon-v3.svg index 157edc4d75..aba6d7787e 100644 --- a/packages/ui/src/assets/favicon/favicon-v3.svg +++ b/packages/ui/src/assets/favicon/favicon-v3.svg @@ -1,7 +1,6 @@ - - - - - \ No newline at end of file + + + + + + diff --git a/packages/ui/src/assets/favicon/site.webmanifest b/packages/ui/src/assets/favicon/site.webmanifest index 427c3adf42..6c83900477 100644 --- a/packages/ui/src/assets/favicon/site.webmanifest +++ b/packages/ui/src/assets/favicon/site.webmanifest @@ -1,6 +1,6 @@ { - "name": "OpenCode", - "short_name": "OpenCode", + "name": "CoDev Code", + "short_name": "codev", "id": "/", "start_url": "/", "scope": "/", diff --git a/packages/ui/src/assets/favicon/web-app-manifest-192x192.png b/packages/ui/src/assets/favicon/web-app-manifest-192x192.png index e637755490..d88c83f86f 100644 Binary files a/packages/ui/src/assets/favicon/web-app-manifest-192x192.png and b/packages/ui/src/assets/favicon/web-app-manifest-192x192.png differ diff --git a/packages/ui/src/assets/favicon/web-app-manifest-512x512.png b/packages/ui/src/assets/favicon/web-app-manifest-512x512.png index f6f0cf514e..20559c8604 100644 Binary files a/packages/ui/src/assets/favicon/web-app-manifest-512x512.png and b/packages/ui/src/assets/favicon/web-app-manifest-512x512.png differ