diff --git a/DIVERGENCES.md b/DIVERGENCES.md index e2a3654d2e..e78e9f3b9d 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -153,8 +153,8 @@ from the squash message first, or use a plain merge. | `packages/opencode/test/cli/run/run-process.test.ts`, `packages/opencode/test/cli/acp/lifecycle.test.ts`, `packages/opencode/test/server/httpapi-file.test.ts`, `packages/opencode/test/server/httpapi-sdk.test.ts`, `packages/opencode/test/effect/runner.test.ts`, `packages/opencode/test/session/prompt.test.ts`, `packages/opencode/test/project/instance-bootstrap.test.ts` | Slow-runner headroom: unknown-model test `timeoutMs`/bound 15s → 30s (test timeout 60s); the two unknown-stream-finish `codev run` subprocess tests ("unknown stream finish preserves partial output…", "--format json records partial output for an unknown stream finish") `timeoutMs` 30s → 60s and test timeout 60s → 120s (pure-upstream spawn tests that pay `codev run` cold-start; neither asserts on duration, so headroom only); the three tool-executing `codev run` subprocess tests ("prints each completed text part in order around a tool continuation", "--format json preserves reasoning, tool, and continuation ordering", "rejects requested permissions by default and allows them with the dangerous flag") `timeoutMs` 30s (harness default) → 60s explicitly, test timeout 60s → 120s — 240s for the permissions test, which pays three sequential `codev run` spawns; these pay cold-start *plus* a real `bash` tool spawn and a continuation turn, and were timing out at exactly the 30s harness default on loaded runners; none asserts on duration, so headroom only; ACP stdin-EOF exit timeout 5s → 30s; file-search-index poll 5s → 120s with a 150s test timeout (the search-endpoints test pays ripgrep's first-use download on Windows runners, like ripgrep.test.ts); Runner fiber-coordination `Effect.timeout` guards 250ms/1s → 10s (pure hang-detectors on already-unblocked awaits; Windows runners starve the event loop past 250ms); prompt.test.ts's two `sleep`-based loop/shell tests ("loop waits while shell runs…", "shell completion resumes queued loop callers") moved from `it.instance` to the file's own `unix` helper so they skip on Windows like their `unixNoLLMServer` siblings (`sleep` isn't on Windows, so the shell fiber hangs to the budget — a genuine hang, not slowness); instance-bootstrap's first test 30s → 60s (pays instance cold-start) | Loaded GitHub-hosted runners spawn processes, fetch ripgrep, and build the lazy file index slower than upstream's Blacksmith runners; 250ms–30s budgets flake or fail outright, and Unix-shell tests can't run on Windows at all. Hang regressions are still caught (a hang exceeds the bound; polls return as soon as ready). | Keep our numbers and the `unix` gating; take upstream's test changes. | | `packages/opencode/test/tool/external-directory.test.ts`, `packages/opencode/test/tool/read.test.ts` | Windows path-variant tests keep the drive letter in the `alt` form (drop the `.replace(/^[A-Za-z]:/, "")` step) | A drive-less path is drive-relative: it resolves against the CWD's drive (D: on GitHub-hosted Windows) while the temp dir lives on C:, so the file genuinely isn't there. Slash + case variants still exercise normalization. | Keep our `alt` construction; take upstream's test changes. | | `packages/opencode/test/server/httpapi-exercise/environment.ts` | Exercise config/data dirs `config/opencode`,`data/opencode` → `…/codev`; seeds `codev.json` with `{"share":"manual"}` | Follows the `global.ts` app-dir rename (row above); the fork's `share: "disabled"` default (config.ts row) would 500 the share/unshare scenarios, so the isolated environment opts back in (network stays stubbed by `CODEV_DISABLE_SHARE`). Seed file follows the config-file rename row (global `config.json` is no longer read). | Keep our dir names + seeded config; take upstream's surrounding changes. | -| `sdks/vscode/package.json`, `sdks/vscode/src/extension.ts`, `sdks/vscode/README.md` | `name` `opencode` → `codev-code` (the extension ID is `publisher.name`); `displayName` "opencode" → "CoDev Code"; `publisher` `sst-dev` → `codev` (PLACEHOLDER — no such Marketplace publisher is registered; replace with the real fork-owned publisher id before any `vsce publish`, and keep it in sync with the CLI auto-install target); `description` "opencode for VS Code" → "CoDev Code for VS Code"; `repository.url` → `github.com/quickbeard/codev-code`; command IDs `opencode.*` → `codev.*` across `contributes.commands`/`menus`/`keybindings` and the `registerCommand` calls; command/keybinding titles "Open opencode…"/"Run opencode"/"opencode: Insert At-Mentioned" → "Open CoDev Code…"/"Run CoDev Code"/"CoDev Code: Insert At-Mentioned" (keys unchanged); `TERMINAL_NAME` `opencode` → `codev` and the terminal launches `codev --port `; scripts gain `"vsix"` (`vsce package --no-dependencies --skip-license -o dist/`) with `@vscode/vsce` added as a pinned devDependency; README body rebranded (CoDev Code intro linking the fork repo, `npm install -g codev-code` prerequisite, feature prose) | The fork ships this extension as an installable `.vsix`, so every user-visible surface — palette titles, command IDs, terminal name, launched binary, details-panel README — must say codev, and the launched binary must be the fork's `codev` CLI. Distinct `codev.*` IDs also avoid clashing with upstream's extension if both are installed. `--no-dependencies` because the bundle is self-contained (no runtime deps, bun-managed lockfile); `--skip-license` because `sdks/vscode` has no LICENSE file and vsce aborts without it. | Keep our name + displayName + publisher + repository + description, command IDs + titles, `TERMINAL_NAME`, the `codev --port` launch line, the `vsix` script + `@vscode/vsce` devDependency, and README branding; take upstream's extension-logic and manifest-structure changes. | -| `packages/opencode/src/ide/index.ts` | IDE auto-install target `sst-dev.opencode` → `codev.codev-code` | The CLI must install the fork's extension ID (`publisher.name` from `sdks/vscode/package.json`), not upstream's Marketplace listing. `Ide.install` currently has no runtime caller (only its test imports the module), and the install only resolves once the extension is actually published — until then the local `.vsix` is the supported install path. | Keep our extension ID (and re-sync it if the registered publisher id changes); take upstream's install/detection logic changes. | +| `sdks/vscode/package.json`, `sdks/vscode/src/extension.ts`, `sdks/vscode/README.md` | `name` `opencode` → `codev-code` (the extension ID is `publisher.name`); `displayName` "opencode" → "CoDev Code"; `publisher` `sst-dev` → `CoDev` (PLACEHOLDER — no such Marketplace publisher is registered; the mixed-case `CoDev` also isn't a valid Marketplace publisher id, which must be lowercase — fine for the sideloaded `.vsix` the fork ships, but replace with the real fork-owned lowercase publisher id before any `vsce publish`, and keep it in sync with the CLI auto-install target); `description` "opencode for VS Code" → "CoDev Code for VS Code"; `icon` `images/icon.png` is a fork-local generated PNG of the CoDev "c" badge (brand teal `#0891B2` on `#0a0a0a`, matching the `codev --mini` splash), with `images/icon.svg` as its source of record — replacing the earlier symlink to the shared `packages/identity` bracket mark; the two per-theme command `icon` objects (`{light,dark}` → `images/button-{dark,light}.svg`) collapse to a single `"images/button.svg"` string and `extension.ts`'s terminal `iconPath` object collapses to a single `Uri`, both pointing at a fork-local transparent teal `#0891B2` "c" glyph that reads on light+dark themes (replacing the two `packages/identity` bracket-mark symlinks, now deleted); `repository.url` → `github.com/quickbeard/codev-code`; command IDs `opencode.*` → `codev.*` across `contributes.commands`/`menus`/`keybindings` and the `registerCommand` calls; command/keybinding titles "Open opencode…"/"Run opencode"/"opencode: Insert At-Mentioned" → "Open CoDev Code…"/"Run CoDev Code"/"CoDev Code: Insert At-Mentioned" (keys unchanged); `TERMINAL_NAME` `opencode` → `codev` and the terminal launches `codev --port `; scripts gain `"vsix"` (`vsce package --no-dependencies --skip-license -o dist/`) with `@vscode/vsce` added as a pinned devDependency; README body rebranded and trimmed to the details-panel essentials — CoDev Code intro linking the fork repo, `npm install -g codev-code` prerequisite, and feature prose only; upstream's Support and Development/Making-Changes sections are dropped (they're contributor-facing, not end-user extension description) | The fork ships this extension as an installable `.vsix`, so every user-visible surface — palette titles, command IDs, terminal name, launched binary, details-panel README — must say codev, and the launched binary must be the fork's `codev` CLI. Distinct `codev.*` IDs also avoid clashing with upstream's extension if both are installed. `--no-dependencies` because the bundle is self-contained (no runtime deps, bun-managed lockfile); `--skip-license` because `sdks/vscode` has no LICENSE file and vsce aborts without it. | Keep our name + displayName + publisher + repository + description, command IDs + titles, `TERMINAL_NAME`, the `codev --port` launch line, the `vsix` script + `@vscode/vsce` devDependency, and the trimmed README (branding + dropped Support/Development sections); take upstream's extension-logic and manifest-structure changes. | +| `packages/opencode/src/ide/index.ts` | IDE auto-install target `sst-dev.opencode` → `CoDev.codev-code` (`publisher.name` from `sdks/vscode/package.json`) | The CLI must install the fork's extension ID (`publisher.name` from `sdks/vscode/package.json`), not upstream's Marketplace listing. `Ide.install` currently has no runtime caller (only its test imports the module), and the install only resolves once the extension is actually published — until then the local `.vsix` is the supported install path. | Keep our extension ID (and re-sync it if the registered publisher id changes); take upstream's install/detection logic changes. | | Env-var rename, repo-wide (~230 files): both flag registries (`packages/core/src/flag/flag.ts`, `packages/opencode/src/effect/runtime-flags.ts`), every `process.env`/`Bun.env` read+set site across `packages/*`, `sdks/vscode`, `infra/enterprise.ts`, `nix/opencode.nix`, `turbo.json`, `.github/workflows/test.yml`, test preloads/fixtures/snapshots, docs (en + es), `SECURITY.md`, specs | `OPENCODE_*` env vars → `CODEV_*` (hard cutover, no legacy fallback), including the bundler define identifiers (`CODEV_VERSION`, `CODEV_CHANNEL`, `CODEV_MODELS_DEV`, `CODEV_LIBC`, `CODEV_CLI_NAME`, `CODEV_WORKER_PATH`), `VITE_OPENCODE_*` → `VITE_CODEV_*`, `import.meta.env.OPENCODE_CHANNEL` → `CODEV_CHANNEL`, the VSCode extension's `OPENCODE_CALLER`/`_EXTENSION_OPENCODE_PORT`, and the bare `OPENCODE=1` marker → `CODEV=1` | The fork's env surface uses the fork's name (reverses the earlier "internal names stay upstream" decision for env vars). NOT renamed: `__OPENCODE_PHOTON_WASM_PATH` and `__OPENCODE__` globals (not env vars; the photon name is baked into `patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch`), `patches/install-korean-ime-fix.sh` script-local shell vars, upstream secret names in workflow-deletion notes, lowercase identifiers (`@opencode-ai/*`, URLs, provider id) | Keep our names; rename any new upstream `OPENCODE_*` env var (or define/`VITE_` name) to `CODEV_*` when syncing. | | Locale dicts in `packages/{ui,app}/src/i18n/`, `packages/desktop/src/renderer/i18n/`, `packages/console/app/src/i18n/`, `packages/stats/app/src/i18n/`, `packages/web/src/content/i18n/`; translated docs dirs in `packages/web/src/content/docs/` | Deleted every locale except `en`/`es` (incl. `packages/app/src/i18n/parity.test.ts`) | Fork ships English + Spanish only. | Keep deleted (`git rm` the upstream side of modify/delete conflicts); also delete any locale files upstream adds. | | `packages/app/src/context/language.tsx`, `packages/app/src/entry.tsx`, `packages/desktop/src/renderer/i18n/index.ts`, `packages/console/app/src/i18n/index.ts`, `packages/console/app/src/lib/language.ts`, `packages/console/app/src/component/footer.tsx`, `packages/stats/app/src/i18n.ts`, `packages/web/src/i18n/locales.ts`, `packages/web/astro.config.mjs`, `packages/enterprise/src/app.tsx`, `packages/app/e2e/regression/session-timeline-locale-projection.spec.ts` | Locale registries trimmed to `en` + `es`: `Locale` types, LOCALES/LABEL/TAG/DOCS maps, dict loaders, accept-language matchers, starlight `locales` config; enterprise/entry `zh` special cases now use `es`; console footer always links Discord (Feishu was zh-only); e2e locale-projection spec tests `es` ("Explorado") instead of de/ar | Fork ships English + Spanish only. | Keep our trimmed lists; take upstream's structural changes and re-trim any new locale entries. | @@ -199,12 +199,17 @@ from the squash message first, or use a plain merge. - **VS Code extension**: ships as a locally built `.vsix` (`cd sdks/vscode && bun run vsix`), not a Marketplace listing. Fully rebranded for that path: `codev.*` command IDs + CoDev Code titles, `codev` terminal launching `codev --port`, rebranded README body, and the CLI's IDE - auto-install target points at `codev.codev-code` (see the `sdks/vscode` and `ide/index.ts` - table rows). Before any actual Marketplace/OpenVSX publish, revisit: `publisher: codev` is - still a PLACEHOLDER, not a registered account — register the real fork-owned publisher and - re-sync the manifest **and** the `ide/index.ts` install target if the registered id isn't - `codev`; `sdks/vscode/script/publish` is still upstream-flavored (tag-driven, outputs - `dist/opencode.vsix`, publishes via `vsce`/`ovsx`) and left untouched deliberately; and - marketplace icon assets are still the identity pixel-mark (design-assets gap in UI branding - above). Until published, auto-install fails against real marketplaces — the local `.vsix` + auto-install target points at `CoDev.codev-code` (see the `sdks/vscode` and `ide/index.ts` + table rows). Before any actual Marketplace/OpenVSX publish, revisit: `publisher: CoDev` is + still a PLACEHOLDER, not a registered account — and its mixed case is itself invalid for a + real Marketplace publisher id (must be lowercase), so register the real fork-owned lowercase + publisher and re-sync the manifest **and** the `ide/index.ts` install target + (`CoDev.codev-code`) to the registered id; `sdks/vscode/script/publish` is still + upstream-flavored (tag-driven, outputs `dist/opencode.vsix`, publishes via `vsce`/`ovsx`) + and left untouched deliberately. The marketplace icon (`images/icon.png`) is now a + fork-local generated PNG of the CoDev "c" badge (teal `#0891B2` on `#0a0a0a`, matching + `codev --mini`; source in `images/icon.svg`). The editor-title/terminal button glyph is a + single fork-local `images/button.svg` — a transparent-background teal "c" that reads on both + light and dark themes (replacing the two `packages/identity` bracket-mark symlinks). + Until published, auto-install fails against real marketplaces — the local `.vsix` is the supported install. diff --git a/packages/opencode/src/ide/index.ts b/packages/opencode/src/ide/index.ts index 309c92aa61..346dc25324 100644 --- a/packages/opencode/src/ide/index.ts +++ b/packages/opencode/src/ide/index.ts @@ -37,7 +37,7 @@ export async function install(ide: (typeof SUPPORTED_IDES)[number]["name"]) { const cmd = SUPPORTED_IDES.find((i) => i.name === ide)?.cmd if (!cmd) throw new Error(`Unknown IDE: ${ide}`) - const p = await Process.run([cmd, "--install-extension", "codev.codev-code"], { + const p = await Process.run([cmd, "--install-extension", "CoDev.codev-code"], { nothrow: true, }) const stdout = p.stdout.toString() diff --git a/sdks/vscode/README.md b/sdks/vscode/README.md index 18c80b930b..ed7a300eb0 100644 --- a/sdks/vscode/README.md +++ b/sdks/vscode/README.md @@ -12,23 +12,3 @@ This extension requires the `codev` CLI to be installed on your system: `npm ins - **New Session**: Use `Cmd+Shift+Esc` (Mac) or `Ctrl+Shift+Esc` (Windows/Linux) to start a new CoDev Code terminal session, even if one is already open. You can also click the CoDev Code button in the UI. - **Context Awareness**: Automatically share your current selection or tab with CoDev Code. - **File Reference Shortcuts**: Use `Cmd+Option+K` (Mac) or `Alt+Ctrl+K` (Linux/Windows) to insert file references. For example, `@File#L37-42`. - -## Support - -This is an early release. If you encounter issues or have feedback, please create an issue at https://github.com/quickbeard/codev-code/issues. - -## Development - -1. `code sdks/vscode` - Open the `sdks/vscode` directory in VS Code. **Do not open from repo root.** -2. `bun install` - Run inside the `sdks/vscode` directory. -3. Press `F5` to start debugging - This launches a new VS Code window with the extension loaded. - -#### Making Changes - -`tsc` and `esbuild` watchers run automatically during debugging (visible in the Terminal tab). Changes to the extension are automatically rebuilt in the background. - -To test your changes: - -1. In the debug VS Code window, press `Cmd+Shift+P` -2. Search for `Developer: Reload Window` -3. Reload to see your changes without restarting the debug session diff --git a/sdks/vscode/images/button-dark.svg b/sdks/vscode/images/button-dark.svg deleted file mode 120000 index c0e444a520..0000000000 --- a/sdks/vscode/images/button-dark.svg +++ /dev/null @@ -1 +0,0 @@ -../../../packages/identity/mark.svg \ No newline at end of file diff --git a/sdks/vscode/images/button-light.svg b/sdks/vscode/images/button-light.svg deleted file mode 120000 index 4120d51f62..0000000000 --- a/sdks/vscode/images/button-light.svg +++ /dev/null @@ -1 +0,0 @@ -../../../packages/identity/mark-light.svg \ No newline at end of file diff --git a/sdks/vscode/images/button.svg b/sdks/vscode/images/button.svg new file mode 100644 index 0000000000..53488eacaf --- /dev/null +++ b/sdks/vscode/images/button.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/sdks/vscode/images/icon.png b/sdks/vscode/images/icon.png deleted file mode 120000 index d6bfa6e7ca..0000000000 --- a/sdks/vscode/images/icon.png +++ /dev/null @@ -1 +0,0 @@ -../../../packages/identity/mark-512x512.png \ No newline at end of file diff --git a/sdks/vscode/images/icon.png b/sdks/vscode/images/icon.png new file mode 100644 index 0000000000..d6ccd60c6e Binary files /dev/null and b/sdks/vscode/images/icon.png differ diff --git a/sdks/vscode/images/icon.svg b/sdks/vscode/images/icon.svg new file mode 100644 index 0000000000..046bb1f7be --- /dev/null +++ b/sdks/vscode/images/icon.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json index c101f6d84b..3e50470190 100644 --- a/sdks/vscode/package.json +++ b/sdks/vscode/package.json @@ -3,7 +3,7 @@ "displayName": "CoDev Code", "description": "CoDev Code for VS Code", "version": "1.18.2", - "publisher": "codev", + "publisher": "CoDev", "repository": { "type": "git", "url": "https://github.com/quickbeard/codev-code" @@ -27,18 +27,12 @@ { "command": "codev.openTerminal", "title": "Open CoDev Code", - "icon": { - "light": "images/button-dark.svg", - "dark": "images/button-light.svg" - } + "icon": "images/button.svg" }, { "command": "codev.openNewTerminal", "title": "Open CoDev Code in new tab", - "icon": { - "light": "images/button-dark.svg", - "dark": "images/button-light.svg" - } + "icon": "images/button.svg" }, { "command": "codev.addFilepathToTerminal", diff --git a/sdks/vscode/src/extension.ts b/sdks/vscode/src/extension.ts index 3783b957b7..f8bce019ba 100644 --- a/sdks/vscode/src/extension.ts +++ b/sdks/vscode/src/extension.ts @@ -47,10 +47,7 @@ export function activate(context: vscode.ExtensionContext) { const port = Math.floor(Math.random() * (65535 - 16384 + 1)) + 16384 const terminal = vscode.window.createTerminal({ name: TERMINAL_NAME, - iconPath: { - light: vscode.Uri.file(context.asAbsolutePath("images/button-dark.svg")), - dark: vscode.Uri.file(context.asAbsolutePath("images/button-light.svg")), - }, + iconPath: vscode.Uri.file(context.asAbsolutePath("images/button.svg")), location: { viewColumn: vscode.ViewColumn.Beside, preserveFocus: false,